// app.jsx — Root: router, layout, tweaks const { useState: useStateApp, useEffect: useEffectApp } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "role": "manager", "persona": "jihye", "phase": "1", "density": "regular" }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [route, setRoute] = useStateApp("intake"); const [aboutOpen, setAboutOpen] = useStateApp(false); const persona = PERSONAS[t.persona] || PERSONAS.jihye; const role = t.role || "manager"; // Reset route if role doesn't include current screen useEffectApp(() => { const allowedGroup = window.NAV_GROUPS.filter(g => g.role.includes(role)); const allowed = allowedGroup.flatMap(g => g.items.map(i => i.id)); if (!allowed.includes(route)) setRoute(allowed[0] || "intake"); }, [role]); // Esc to close modal useEffectApp(() => { if (!aboutOpen) return; const onKey = (e) => { if (e.key === "Escape") setAboutOpen(false); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, [aboutOpen]); const Screen = ({}) => { switch (route) { case "intake": return ; case "capture": return ; case "analysis": return ; case "report": return ; case "recommend": return ; case "ba": return ; case "chart": return ; case "revisit": return ; case "devices": return ; case "bi": return ; default: return ; } }; const phaseLabel = (window.PHASES.find(p => p.v === t.phase) || {}).l || "Prototype"; return (
setAboutOpen(true)} />
setTweak("role", v)} route={route} persona={persona} phase={t.phase} /> {t.phase === "1" && (
Phase 1 · Clickable Prototype 샘플 데이터 시연 화면입니다. 실제 AI 연산은 발생하지 않으며 환자 진단·치료 결정에 사용해서는 안 됩니다. 진척도 20% · Vibe coding setAboutOpen(true)}>자세히 →
)}
setAboutOpen(false)} /> setTweak("role", v)} /> setTweak("persona", v)} /> setTweak("phase", v)} /> setTweak("density", v)} />
); } ReactDOM.createRoot(document.getElementById("root")).render();