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.
+
+
+
+ ) : (
+
+
+
+ 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 */}