From 19e414bf6fd9cea0f9101521da9ac0e165702a8c Mon Sep 17 00:00:00 2001 From: tincho Date: Tue, 28 Apr 2026 23:55:08 +0200 Subject: [PATCH] Add popup for QF round campaign (#14) Adding a popup in landing on first load: image Also adding the same card but as a regular card (not popup) in the `/supporters` page image Not sure if I should do the PR against `develop` or `main`. It's targetting `develop` now - but we can change. --- .gitignore | 1 + src/app/components/GivethSupportCard.tsx | 121 ++++++++++++++++++ src/app/components/MainContent.tsx | 7 +- .../components/SupportersCollaborators.tsx | 3 + src/app/page.tsx | 28 ++-- src/app/supporters/page.tsx | 1 - 6 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 src/app/components/GivethSupportCard.tsx diff --git a/.gitignore b/.gitignore index 5ef6a52..e8030ae 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts +.codex diff --git a/src/app/components/GivethSupportCard.tsx b/src/app/components/GivethSupportCard.tsx new file mode 100644 index 0000000..3e6ae0b --- /dev/null +++ b/src/app/components/GivethSupportCard.tsx @@ -0,0 +1,121 @@ +const GIVETH_URL = 'https://qf.giveth.io/project/the-red-guild'; +const ARTICLE_URL = 'https://blog.theredguild.org/support-the-red-guild-in-the-ethereum-security-funding-round/'; + +interface GivethSupportCardProps { + variant?: 'banner' | 'supporters'; + className?: string; + onClose?: () => void; +} + +const GivethSupportCard = ({ + variant = 'supporters', + className = '', + onClose, +}: GivethSupportCardProps) => { + const isPopup = variant === 'banner'; + + return ( +
+
+ {onClose ? ( + + ) : null} + {isPopup ? ( +
+

+ Fund public good security +

+

+ Support The Red Guild in the Ethereum Security QF Round +

+

+ We do security research, education, and advocacy for Ethereum as a public good. + Your support helps keep this work open and accessible to the whole ecosystem. +

+
+ + Support on Giveth + + + Read why + +
+
+ ) : ( +
+
+

+ Fund public good security +

+

+ Support The Red Guild in the Ethereum Security QF Round +

+

+ We do security research, education, and advocacy for Ethereum as a public good. + Your support helps keep this work open and accessible to the whole ecosystem. +

+
+ +
+ +
+
+ )} +
+ ); +}; + +export default GivethSupportCard; diff --git a/src/app/components/MainContent.tsx b/src/app/components/MainContent.tsx index dc52581..0d7970e 100644 --- a/src/app/components/MainContent.tsx +++ b/src/app/components/MainContent.tsx @@ -18,7 +18,10 @@ function lerpColor( }; } -const MainContent = ({ onSectionEnd, transitioning: parentTransitioning }: { onSectionEnd: () => void; transitioning?: boolean }) => { +const MainContent = ({ + onSectionEnd, + transitioning: parentTransitioning, +}: { onSectionEnd: () => void; transitioning?: boolean }) => { const [progress, setProgress] = useState(0); const [transitioning, setTransitioning] = useState(false); const [blockScroll, setBlockScroll] = useState(false); @@ -82,7 +85,7 @@ const MainContent = ({ onSectionEnd, transitioning: parentTransitioning }: { onS pointerEvents: (transitioning || parentTransitioning) ? 'none' : 'auto', }} > -
+
{ return ( @@ -36,6 +37,8 @@ const SupportersCollaborators: React.FC = () => {
+ +
{ setTransitioning(true); setBlockScroll(true); @@ -26,12 +27,11 @@ export default function Home() { setShowSection2(true); setTransitioning(false); setBlockScroll(false); - setUnmountScene(false); // Ensures Scene is mounted + setUnmountScene(false); window.scrollTo({ top: 0, behavior: 'auto' }); - }, 500); // Match fade duration + }, 500); }; - // Return from Scene (Section2) to MainContent (Section1) - Fade back const handleBackToSection1 = () => { setTransitioning(true); setBlockScroll(true); @@ -40,34 +40,42 @@ export default function Home() { setShowSection1(true); setTransitioning(false); setBlockScroll(false); - setUnmountScene(true); // Unmounts Scene after fade-out + setUnmountScene(true); window.scrollTo({ top: 0, behavior: 'auto' }); - }, 500); // Match fade duration + }, 500); }; React.useEffect(() => { - document.body.style.overflow = transitioning || blockScroll ? 'hidden' : ''; + document.body.style.overflow = transitioning || blockScroll || (showSection1 && showSupportPopup) ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; - }, [transitioning, blockScroll]); + }, [transitioning, blockScroll, showSection1, showSupportPopup]); return (
- {/* Global particles that persist across all sections */} -
+
setShowLoading(false)} /> {showSection1 && } {(showSection2 || (!unmountScene && transitioning)) && ( )}
+ {showSection1 && showSupportPopup ? ( +
+ setShowSupportPopup(false)} + className="max-w-[44rem] max-h-[calc(100dvh-1.5rem)] overflow-y-auto sm:max-h-[calc(100dvh-3rem)]" + /> +
+ ) : null}
); } diff --git a/src/app/supporters/page.tsx b/src/app/supporters/page.tsx index a161047..6b00ad6 100644 --- a/src/app/supporters/page.tsx +++ b/src/app/supporters/page.tsx @@ -12,7 +12,6 @@ export default function SupportersPage() {
- {/* Supporters & Collaborators Section */}