// frontend/components/journey/JourneyClient.tsx — 여정 페이지 오케스트레이터 (Topbar 는 셸) "use client"; import { useEffect, useRef } from "react"; import { useJourney } from "@/lib/hooks/useJourney"; import { Icon } from "@/components/Icon"; import { JourneyBoard } from "./JourneyBoard"; import { PeopleStack } from "./PeopleStack"; import { JourneyTable } from "./JourneyTable"; import { Gauge } from "./Gauge"; export function JourneyClient() { const { data, isLoading, error, retry } = useJourney(); const rootRef = useRef(null); // 진입 애니메이션 (원본 entered) useEffect(() => { const el = rootRef.current; const id = requestAnimationFrame(() => el && el.classList.add("entered")); return () => cancelAnimationFrame(id); }, [data]); if (error && !data) { return (
여정을 불러오지 못했어요
); } if (isLoading || !data) { return (
); } const { header, meta, people, stages, cards, links, rows, table, gauges, gaugeFoot } = data; return (
{/* ===== 페이지 헤더 ===== */}
{header.dateLabel} {header.weather}

오늘의 여정

{/* ===== 흐름 패널 ===== */}
오늘의 흐름{" "} · {meta.stageCount}단계 · {meta.itemCount}개 항목 · {meta.collabCount}명 협업
{stages.map((s) => (
{s.title} {s.time}
))}
카드에 마우스를 올리면 연결된 작업 · 사람 · 미팅 흐름이 강조돼요
{/* ===== 하단 2열 ===== */}
오늘의 작업
{table.subtitle}
오늘의 지표
집중 · 활동
{gauges.map((g, i) => ( ))}
{gaugeFoot}
); }