diff --git a/app/member-journey/page.tsx b/app/member-journey/page.tsx index e874430..4ae42af 100644 --- a/app/member-journey/page.tsx +++ b/app/member-journey/page.tsx @@ -246,6 +246,7 @@ const memberStories: MemberStory[] = [ export default function MemberJourneyPage() { const [loading, setLoading] = useState(true) + const [activeDeptId, setActiveDeptId] = useState(departments[0].id) const [eventImageIndex, setEventImageIndex] = useState(0) const [currentEventIndex, setCurrentEventIndex] = useState(0) const timelineSliderRef = useRef(null) @@ -406,7 +407,7 @@ export default function MemberJourneyPage() { JOURNEY } - description="Become a member and spend two active semesters contributing to the community" + description="Become a member and spend at least two active semesters contributing to the community" >
@@ -512,30 +513,153 @@ export default function MemberJourneyPage() {

-
- {departments.map((dept) => ( -
-
-
-
- {dept.icon} -
-

{dept.name}

-

{dept.description}

-
-
-

Responsibilities

- {dept.responsibilities.map((resp, i) => ( -
-
- {resp} + {/* Desktop: arc layout */} + {(() => { + // Left-side half-circle "(" : center=(300,300), r=300 + // Arc from (300,0) at top, curving LEFT through (0,300), to (300,600) at bottom + const cx = 300, cy = 300, r = 300 + const toRad = (deg: number) => (deg * Math.PI) / 180 + // Standard-math angles (CCW from +x): 108°→top-left … 252°→bottom-left + const angles = [108, 144, 180, 216, 252] + // Per-dot label vertical nudge (positive = lower, negative = higher) + const labelYOffsets = [18, 6, 6, 6, -8] + const dots = departments.map((dept, i) => { + const a = toRad(angles[i]) + return { + dept, + x: cx + r * Math.cos(a), + y: cy - r * Math.sin(a), + labelYOffset: labelYOffsets[i], + } + }) + const activeDept = departments.find(d => d.id === activeDeptId) + + return ( + <> + {/* Desktop */} +
+ {/* Detail panel — left */} +
+ {activeDept && ( +
+
+ {activeDept.icon} +
+

{activeDept.name.toUpperCase()}

+

{activeDept.description}

+
+

Responsibilities

+
+ {activeDept.responsibilities.map((resp, i) => ( +
+
+ {resp} +
+ ))} +
+
+ )} +
+ + {/* Arc — right */} +
+ + {/* Always-pink arc: (300,0) CCW through (0,300) to (300,600) */} + + + {/* Dots + labels */} + {dots.map(({ dept, x, y, labelYOffset }) => { + const isActive = activeDeptId === dept.id + return ( + setActiveDeptId(dept.id)} + className="cursor-pointer" + style={{ transition: 'all 0.3s' }} + > + {isActive && ( + + )} + + {isActive && } + {/* Label — to the right of dot, toward the opening */} + + {dept.name.toUpperCase()} + + + ) + })} + +
+
+ + {/* Mobile: icon strip + card */} +
+
+ {departments.map((dept) => ( + ))}
+ {activeDept && ( +
+

{activeDept.name.toUpperCase()}

+

{activeDept.description}

+
+

Responsibilities

+ {activeDept.responsibilities.map((resp, i) => ( +
+
+ {resp} +
+ ))} +
+
+ )}
-
- ))} -
+ + ) + })()} {/* ═══ INTERNAL EVENTS ═══ */} @@ -817,6 +941,11 @@ export default function MemberJourneyPage() { } .tabular-nums { font-variant-numeric: tabular-nums; } + + @keyframes fadeInPanel { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } + } `} )