/* 아리 — 하루 마감 브리핑 (이브닝 다크 톤) */ const { useState, useEffect } = React; const W = window.AriWrap; /* ---------- 아이콘 ---------- */ const WP = { spark: "M12 3l1.9 5.2L19 10l-5.1 1.8L12 17l-1.9-5.2L5 10l5.1-1.8z|M19 4v3|M5 17v3", moon: "M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z", back: "M19 12H5|M12 19l-7-7 7-7", tick: "M20 6 9 17l-5-5", cal: "M8 2v4M16 2v4M3 10h18M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z", arrow: "M5 12h14|M13 6l6 6-6 6", swap: "M16 3h5v5|M21 3l-7 7|M8 21H3v-5|M3 21l7-7", rain: "M16 13v6M8 13v6M12 15v6|M20 16.6A5 5 0 0 0 18 7h-1.3A8 8 0 1 0 4 14.9", pen: "M12 20h9|M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z", bell: "M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9|M10.3 21a1.94 1.94 0 0 0 3.4 0", sun: "M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10z|M12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4", }; function I({ d, w }) { return ( {WP[d].split("|").map((s, i) => )} ); } function load(key, fallback) { try { const v = localStorage.getItem("ari.wrap." + key); return v === null ? fallback : JSON.parse(v); } catch (e) { return fallback; } } function save(key, val) { try { localStorage.setItem("ari.wrap." + key, JSON.stringify(val)); } catch (e) {} } function App() { const [sleep, setSleep] = useState(() => load("sleep", false)); const [note, setNote] = useState(() => load("note", "")); const [undone, setUndone] = useState({}); // rollover id → true(되돌림) useEffect(() => save("sleep", sleep), [sleep]); useEffect(() => save("note", note), [note]); const toggleRoll = (id) => setUndone((u) => ({ ...u, [id]: !u[id] })); return (
{/* ---- 상단 ---- */}
대시보드
{W.date} · {W.now}
{/* ---- 인사 ---- */}
하루 마감 브리핑

오늘 하루, 수고했어요 {W.user.name}님

{/* ---- 오늘 숫자 ---- */}
{W.stats.map((s, i) => (
{s.n}{s.unit}
{s.label}{s.sub && · {s.sub}}
))}
{/* ============ 왼쪽 — 오늘 정리 ============ */}

오늘 해낸 일

{W.highlights.map((h, i) => (
{h.title}
{h.meta}
))}
{/* 한 줄 회고 */}

오늘 한 줄

내일 아침 브리핑에 함께 보여드려요
setNote(e.target.value)} placeholder="오늘은 어떤 하루였나요? 한 줄이면 충분해요…" /> {note.trim() && 저장됨}
{/* ============ 오른쪽 — 내일 준비 ============ */}

남은 일은 내일로 옮겨뒀어요

{W.rollover.map((r) => { const off = undone[r.id]; return (
{r.title}{r.project}
{off ? "이월 취소됨 — 오늘 할 일로 남겨둘게요" : r.to}
{!off &&
{r.reason}
}
); })}

내일 미리보기

{W.weatherTomorrow}
{W.tomorrow.map((t, i) => (
{t.time} {t.title} {t.note && {t.note}}
))}
아리가 미리 끝내둔 준비
{W.prep.map((p, i) => (
{p.text}
))}
{/* ---- 수면 모드 CTA ---- */}
{sleep ? "수면 모드가 켜져 있어요" : "오늘은 여기까지"}
{sleep ? W.sleepNote : "수면 모드를 켜면 알림을 음소거하고, 내일 아침 브리핑을 예약해둘게요."}
); } ReactDOM.createRoot(document.getElementById("root")).render();