diff --git a/app/student/fff/page.tsx b/app/student/fff/page.tsx index 92f73e00..f0364a5b 100644 --- a/app/student/fff/page.tsx +++ b/app/student/fff/page.tsx @@ -3,6 +3,7 @@ import { type ChangeEvent, type FormEvent, + useEffect, useMemo, useRef, useState, @@ -98,9 +99,36 @@ export default function FFFPage() { const [submitModalOpen, setSubmitModalOpen] = useState(false); const [token, setToken] = useState(""); const [tokenFail, setTokenFail] = useState(false); + const [isAtTop, setIsAtTop] = useState(true); + const scrollContainerRef = useRef(null); + const topSentinelRef = useRef(null); const challengeRef = useRef(null); + useEffect(() => { + const sentinel = topSentinelRef.current; + const root = scrollContainerRef.current; + if (!sentinel || !root) return; + + setIsAtTop(root.scrollTop <= 1); + + const observer = new IntersectionObserver( + ([entry]) => { + setIsAtTop(entry.isIntersecting); + }, + { + root, + threshold: 1, + }, + ); + + observer.observe(sentinel); + + return () => { + observer.disconnect(); + }; + }, []); + const endpoint = useMemo(() => { const base = process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, ""); if (!base) return "/api/super-listings/fff-submission"; @@ -166,7 +194,7 @@ export default function FFFPage() { return (
- -
-
- - BetterInternship - - - x - - - - Founders For Founders +
+
+ +
+
+ + BetterInternship + + + x - -
-
- -
-
-
- -

- Scout. - Network. - Scale. -

-
- - Startup Accelerator Intern + + + Founders For Founders -
-
-

- - s16vc - - {" "} - x{" "} - - Ellipsis Ventures - - {" "} - is building a new startup accelerator designed to outbuild - legacy programs. Backed by founders from Miro, Pitch, Supercell, - and WeTransfer. -

-

- The hard part is not building the accelerator. It is finding the - right founders. -

-
-

- In this role, you will drive developer evangelism by SCOUT, - NETWORK, SCALE. + +

+
+ +
+
+
+ +

+ Scout. + Network. + Scale. +

+
+ + Startup Accelerator Intern + +
+
+

+ + s16vc + + {" "} + x{" "} + + Ellipsis Ventures + + {" "} + is building a new startup accelerator designed to outbuild + legacy programs. Backed by founders from Miro, Pitch, + Supercell, and WeTransfer.

+

+ The hard part is not building the accelerator. It is finding + the right founders. +

+
+

+ In this role, you will drive developer evangelism by SCOUT, + NETWORK, SCALE. +

+
-
-
- {RESPONSIBILITIES.map((item, index) => ( -
-
-
-

- {String(index + 1).padStart(2, "0")} -

-

- {item.title} -

-

- {item.body} -

+
+ {RESPONSIBILITIES.map((item, index) => ( +
+
+
+

+ {String(index + 1).padStart(2, "0")} +

+

+ {item.title} +

+

+ {item.body} +

+
-
- ))} -
-
- -
-
-
- + ))} +
-
-
-
-
- -
- -
-
-
-
-

- What You Need To Ship -

+
+
+
+
+
+
-
-
- {CHALLENGE_ITEMS.map((item) => ( -
-
-
-

- {item.title} -

-

- {item.body} -

-
-
- ))} +
+
+ +
+ +
+
+
+
+

+ What You Need To Ship +

-
-
-
-

- Submission Requirements -

-
    - {SUBMISSION_REQUIREMENTS.map((item) => ( -
  • - {item}
  • - ))} -
+
+
+ {CHALLENGE_ITEMS.map((item) => ( +
+
+
+

+ {item.title} +

+

+ {item.body} +

+
+
+ ))}
-
-
-
+
- +
+

+ Submission Requirements +

+
    + {SUBMISSION_REQUIREMENTS.map((item) => ( +
  • - {item}
  • + ))} +
+
+
+ +
+
+
+ +
-
-
+ +
(null); + const topSentinelRef = useRef(null); const challengeRef = useRef(null); + useEffect(() => { + const sentinel = topSentinelRef.current; + const root = scrollContainerRef.current; + if (!sentinel || !root) return; + + setIsAtTop(root.scrollTop <= 1); + + const observer = new IntersectionObserver( + ([entry]) => { + setIsAtTop(entry.isIntersecting); + }, + { + root, + threshold: 1, + }, + ); + + observer.observe(sentinel); + + return () => { + observer.disconnect(); + }; + }, []); + const endpoint = useMemo(() => { const base = process.env.NEXT_PUBLIC_API_URL?.replace(/\/$/, ""); if (!base) return "/api/super-listings/paraluman-submission"; @@ -166,7 +194,7 @@ export default function ParalumanPage() { return (
+
+
+ +
+
+ + BetterInternship + + + × + + + Paraluman News + +
+
+ +
+
+
+ + +

+ Build the + + Future of + + Journalism +

-
-
- - BetterInternship - - - × - - - Paraluman News - -
-
- -
-
-
- +
+ + Multilingual Publishing Challenge + +
-

- Build the - - Future of - - Journalism -

- -
- - Multilingual Publishing Challenge - +
+

+ Make{" "} + + journalism accessible across languages + + . Build a real system that publishes articles in English and + Filipino simultaneously, with human review at every step. +

+

+ Build something real. Ship it. +

+
-
-

- Make{" "} - - journalism accessible across languages - - . Build a real system that publishes articles in English and - Filipino simultaneously, with human review at every step. -

-

- Build something real. Ship it. -

+
+
+
+ +
+
-
-
-
- -
+
+
+
-
-
-
-
- -
- -
-
-
-
-

- What You Build -

-

- A system that publishes a news article in English and Filipino - at the same time. -

-
+
+
+
+
+

+ What You Build +

+

+ A system that publishes a news article in English and Filipino + at the same time. +

+
-
-
- {CHALLENGE_WORKFLOW.map((item) => ( -
+
+
+ {CHALLENGE_WORKFLOW.map((item) => ( +
+
+
+

+ {item.title} +

+

+ {item.body} +

+
+
+ ))} +
+ +
+
-
-

- {item.title} -

-

- {item.body} +

+

+ Deliverables

+
    + {DELIVERABLES.map((item) => ( +
  • - {item}
  • + ))} +
- ))} -
-
-
-
-
-

- Deliverables -

-
    - {DELIVERABLES.map((item) => ( -
  • - {item}
  • - ))} -
+
+
+
+

+ Prototype Must Allow +

+
    + {REQUIRED_FEATURES.map((item) => ( +
  • - {item}
  • + ))} +
+
-
-
-
-
-

- Prototype Must Allow -

-
    - {REQUIRED_FEATURES.map((item) => ( -
  • - {item}
  • - ))} -
+
+
+
+

+ Evaluation Criteria +

+

+ {EVALUATION_CRITERIA.join(" • ")} +

+
-
-
-
-
-

- Evaluation Criteria -

-

- {EVALUATION_CRITERIA.join(" • ")} -

+
+
+
+

+ Constraint +

+

+ Small team. Limited budget. Keep it simple. +

+
-
-
-
-

- Constraint -

-

- Small team. Limited budget. Keep it simple. -

-
+
+

+ + The Challenge: + {" "} + How do you make reliable journalism accessible across + languages—without slowing it down? +

-
-
-

- - The Challenge: - {" "} - How do you make reliable journalism accessible across - languages—without slowing it down? -

-
- -
-
-
- +
+
+
+ +
-
-
+ +