react-os-shell 0.2.48 → 0.2.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{Browser-LSJORULM.js → Browser-2TIJIWLC.js} +3 -3
  2. package/dist/{Browser-LSJORULM.js.map → Browser-2TIJIWLC.js.map} +1 -1
  3. package/dist/{Calculator-ZKEH53OV.js → Calculator-F5V74AUF.js} +4 -4
  4. package/dist/{Calculator-ZKEH53OV.js.map → Calculator-F5V74AUF.js.map} +1 -1
  5. package/dist/{Calendar-PKRZ5MBU.js → Calendar-KIPFDLRZ.js} +3 -3
  6. package/dist/{Calendar-PKRZ5MBU.js.map → Calendar-KIPFDLRZ.js.map} +1 -1
  7. package/dist/{CurrencyConverter-5N44NZ6Z.js → CurrencyConverter-BEYNE72I.js} +4 -4
  8. package/dist/{CurrencyConverter-5N44NZ6Z.js.map → CurrencyConverter-BEYNE72I.js.map} +1 -1
  9. package/dist/{Documents-CQVIIFZV.js → Documents-3BIQRSXA.js} +3 -3
  10. package/dist/{Documents-CQVIIFZV.js.map → Documents-3BIQRSXA.js.map} +1 -1
  11. package/dist/{Email-CR6XS2AD.js → Email-RM5N27GG.js} +3 -3
  12. package/dist/{Email-CR6XS2AD.js.map → Email-RM5N27GG.js.map} +1 -1
  13. package/dist/Files-GALCVW6G.js +8 -0
  14. package/dist/{Files-QMEAFYY4.js.map → Files-GALCVW6G.js.map} +1 -1
  15. package/dist/{Minesweeper-QGUPDVRS.js → Minesweeper-F7HUV7HZ.js} +3 -3
  16. package/dist/{Minesweeper-QGUPDVRS.js.map → Minesweeper-F7HUV7HZ.js.map} +1 -1
  17. package/dist/{Notepad-74CQPZCV.js → Notepad-3S24OLEP.js} +3 -3
  18. package/dist/{Notepad-74CQPZCV.js.map → Notepad-3S24OLEP.js.map} +1 -1
  19. package/dist/{PomodoroTimer-FHSOLF3O.js → PomodoroTimer-WEFU2TRQ.js} +4 -4
  20. package/dist/{PomodoroTimer-FHSOLF3O.js.map → PomodoroTimer-WEFU2TRQ.js.map} +1 -1
  21. package/dist/Preview-UA3GCLDI.js +7 -0
  22. package/dist/{Preview-KX753OG4.js.map → Preview-UA3GCLDI.js.map} +1 -1
  23. package/dist/{Spreadsheet-MKXPPSKV.js → Spreadsheet-2JEK7VD7.js} +3 -3
  24. package/dist/{Spreadsheet-MKXPPSKV.js.map → Spreadsheet-2JEK7VD7.js.map} +1 -1
  25. package/dist/{Weather-YXSCSPQT.js → Weather-PETTCLBX.js} +4 -4
  26. package/dist/{Weather-YXSCSPQT.js.map → Weather-PETTCLBX.js.map} +1 -1
  27. package/dist/{WorldClock-XHM7WAUV.js → WorldClock-QTZM4U5N.js} +4 -4
  28. package/dist/{WorldClock-XHM7WAUV.js.map → WorldClock-QTZM4U5N.js.map} +1 -1
  29. package/dist/apps/index.js +17 -17
  30. package/dist/{chunk-FWOHEXUL.js → chunk-5H2XVDEI.js} +4 -4
  31. package/dist/{chunk-FWOHEXUL.js.map → chunk-5H2XVDEI.js.map} +1 -1
  32. package/dist/{chunk-G6WVMTJU.js → chunk-BV54NLUT.js} +3 -3
  33. package/dist/{chunk-G6WVMTJU.js.map → chunk-BV54NLUT.js.map} +1 -1
  34. package/dist/{chunk-UK2AA3J6.js → chunk-P5YKRJIW.js} +3 -3
  35. package/dist/{chunk-UK2AA3J6.js.map → chunk-P5YKRJIW.js.map} +1 -1
  36. package/dist/{chunk-7M3BBAHQ.js → chunk-VVXXHR5V.js} +13 -3
  37. package/dist/chunk-VVXXHR5V.js.map +1 -0
  38. package/dist/index.d.ts +8 -1
  39. package/dist/index.js +4 -4
  40. package/package.json +1 -1
  41. package/dist/Files-QMEAFYY4.js +0 -8
  42. package/dist/Preview-KX753OG4.js +0 -7
  43. package/dist/chunk-7M3BBAHQ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/PomodoroTimer.tsx"],"names":[],"mappings":"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","file":"PomodoroTimer-FHSOLF3O.js","sourcesContent":["import { useEffect, useState, useCallback, useSyncExternalStore, useRef, useMemo } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport {\n ALARM_OPTIONS, FOCUS_SOUND_OPTIONS,\n getPomoSnapshot, subscribePomo,\n setPomoDurations, setPomoAlarm, setPomoAlarmConfig, setPomoBehaviour, setPomoFocusSound,\n pomoStart, pomoPause, pomoSwitchMode,\n playAlarm, previewFocusSound,\n type AlarmSound, type FocusSound, type Mode,\n} from '../shell/pomodoroStore';\nimport { useTodoTasks, migratePomodoroTasksOnce } from './_todoStore';\nimport type { TodoTask } from './_todoTypes';\n\nconst POMO_SETTINGS_KEY = 'pomodoro_appearance';\nconst ACTIVE_TASK_KEY = 'pomodoro_active_task_id';\n\nconst MODE_LABELS: Record<Mode, string> = { focus: 'Pomodoro', short: 'Short Break', long: 'Long Break' };\n/**\n * Per-mode background colour. The break modes keep their own colours so\n * a glance at the panel tells you what state you're in. Focus mode is\n * special — its panel uses `--taskbar-bg-rgb` so the widget matches the\n * taskbar (and the rest of the dashboard widgets) across light and dark\n * themes. The hex below is only used for the START / Save accent colour\n * in focus mode.\n */\nconst MODE_COLORS: Record<Mode, string> = {\n focus: '#0f172a', // unused for the panel; only for focus-mode accents\n short: '#508a52', // muted green\n long: '#5b7898', // slate blue\n};\n\n/** Convert `#rrggbb` to an `rgba(r, g, b, alpha)` string so the break\n * panels pick up the user's translucency setting via the alpha channel\n * (instead of an `opacity` on the whole element, which would also fade\n * the text and the START button). */\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\ninterface PomoPrefs {\n focusMinutes: number;\n shortBreakMinutes: number;\n longBreakMinutes: number;\n autoStartBreaks: boolean;\n autoStartPomodoros: boolean;\n longBreakInterval: number;\n autoCheckTasks: boolean;\n checkToBottom: boolean;\n alarmSound: AlarmSound;\n alarmVolume: number;\n alarmRepeat: number;\n focusSound: FocusSound;\n focusVolume: number;\n}\nconst DEFAULT_PREFS: PomoPrefs = {\n focusMinutes: 25, shortBreakMinutes: 5, longBreakMinutes: 15,\n autoStartBreaks: false, autoStartPomodoros: false, longBreakInterval: 4,\n autoCheckTasks: true, checkToBottom: true,\n alarmSound: 'bell', alarmVolume: 100, alarmRepeat: 1,\n focusSound: 'none', focusVolume: 50,\n};\n\nconst intInRange = (v: unknown, min: number, max: number, fallback: number) =>\n typeof v === 'number' && isFinite(v) ? Math.max(min, Math.min(max, Math.round(v))) : fallback;\n\nfunction readPrefs(raw: unknown): PomoPrefs {\n const p = (raw && typeof raw === 'object') ? raw as Partial<PomoPrefs> : {};\n return {\n focusMinutes: intInRange(p.focusMinutes, 1, 120, DEFAULT_PREFS.focusMinutes),\n shortBreakMinutes: intInRange(p.shortBreakMinutes, 1, 120, DEFAULT_PREFS.shortBreakMinutes),\n longBreakMinutes: intInRange(p.longBreakMinutes, 1, 120, DEFAULT_PREFS.longBreakMinutes),\n autoStartBreaks: typeof p.autoStartBreaks === 'boolean' ? p.autoStartBreaks : DEFAULT_PREFS.autoStartBreaks,\n autoStartPomodoros: typeof p.autoStartPomodoros === 'boolean' ? p.autoStartPomodoros : DEFAULT_PREFS.autoStartPomodoros,\n longBreakInterval: intInRange(p.longBreakInterval, 1, 20, DEFAULT_PREFS.longBreakInterval),\n autoCheckTasks: typeof p.autoCheckTasks === 'boolean' ? p.autoCheckTasks : DEFAULT_PREFS.autoCheckTasks,\n checkToBottom: typeof p.checkToBottom === 'boolean' ? p.checkToBottom : DEFAULT_PREFS.checkToBottom,\n alarmSound: ALARM_OPTIONS.some(o => o.id === p.alarmSound) ? p.alarmSound as AlarmSound : DEFAULT_PREFS.alarmSound,\n alarmVolume: intInRange(p.alarmVolume, 0, 100, DEFAULT_PREFS.alarmVolume),\n alarmRepeat: intInRange(p.alarmRepeat, 1, 5, DEFAULT_PREFS.alarmRepeat),\n focusSound: FOCUS_SOUND_OPTIONS.some(o => o.id === p.focusSound) ? p.focusSound as FocusSound : DEFAULT_PREFS.focusSound,\n focusVolume: intInRange(p.focusVolume, 0, 100, DEFAULT_PREFS.focusVolume),\n };\n}\n\n// The Pomodoro widget treats each TodoTask as if it has the four\n// fields it cares about (name / estimated / completed / done). Tasks\n// without `estimated` show as `?` slots; tasks without `completed`\n// start at 0 and increment when their pomos finish.\nconst sortDoneToBottom = (arr: TodoTask[]): TodoTask[] => {\n const undone: TodoTask[] = [];\n const done: TodoTask[] = [];\n for (const t of arr) (t.done ? done : undone).push(t);\n return [...undone, ...done];\n};\n\nfunction useMemoSortedTasks(rawTasks: TodoTask[], checkToBottom: boolean): TodoTask[] {\n return useMemo(\n () => checkToBottom ? sortDoneToBottom(rawTasks) : rawTasks,\n [rawTasks, checkToBottom],\n );\n}\n\nexport default function PomodoroTimer() {\n const snap = useSyncExternalStore(subscribePomo, getPomoSnapshot, getPomoSnapshot);\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const userPrefs = readPrefs(shellPrefs.pomodoro_settings);\n\n // Sync prefs → store. Split into focused effects so each setting only\n // resets the bit it owns (e.g. flipping the alarm volume doesn't tear\n // down the focus-sound playback).\n useEffect(() => {\n setPomoDurations({\n focus: userPrefs.focusMinutes * 60,\n short: userPrefs.shortBreakMinutes * 60,\n long: userPrefs.longBreakMinutes * 60,\n });\n }, [userPrefs.focusMinutes, userPrefs.shortBreakMinutes, userPrefs.longBreakMinutes]);\n\n useEffect(() => {\n setPomoAlarm(userPrefs.alarmSound);\n setPomoAlarmConfig(userPrefs.alarmVolume, userPrefs.alarmRepeat);\n }, [userPrefs.alarmSound, userPrefs.alarmVolume, userPrefs.alarmRepeat]);\n\n useEffect(() => {\n setPomoBehaviour({\n autoStartBreaks: userPrefs.autoStartBreaks,\n autoStartPomodoros: userPrefs.autoStartPomodoros,\n longBreakInterval: userPrefs.longBreakInterval,\n });\n }, [userPrefs.autoStartBreaks, userPrefs.autoStartPomodoros, userPrefs.longBreakInterval]);\n\n useEffect(() => {\n setPomoFocusSound(userPrefs.focusSound, userPrefs.focusVolume);\n }, [userPrefs.focusSound, userPrefs.focusVolume]);\n\n // Ask once for desktop-notification permission.\n useEffect(() => {\n if (typeof Notification !== 'undefined' && Notification.permission === 'default') {\n try { Notification.requestPermission(); } catch {}\n }\n }, []);\n\n // ── Tasks (shared store) ──\n // Tasks now live in `shellPrefs.todo_tasks` so the Todo List app and\n // Calendar app see the same data. The Pomodoro widget keeps a\n // per-instance `activeTaskId` in localStorage so the user's selection\n // doesn't leak across windows.\n //\n // The Pomodoro list is intentionally narrow — it only shows tasks\n // that are *actionable today*: anything due today (pending or just-\n // completed) plus anything overdue and still pending. Far-future\n // tasks live in the Todo List app; completed tasks from earlier days\n // roll off automatically. Tasks added via the Pomodoro's `+ Add Task`\n // button default to today's `dueDate` so they appear immediately in\n // this filtered view.\n const todo = useTodoTasks();\n const rawTasks = todo.tasks;\n const todayStr = useMemo(() => new Date().toISOString().slice(0, 10), []);\n const visibleRawTasks = useMemo(\n () => rawTasks.filter(t => {\n if (!t.dueDate) return false;\n if (t.dueDate === todayStr) return true; // due today — show even when done\n if (t.dueDate < todayStr && !t.done) return true; // overdue and still pending\n return false;\n }),\n [rawTasks, todayStr],\n );\n const tasks = useMemoSortedTasks(visibleRawTasks, userPrefs.checkToBottom);\n\n const [activeTaskId, setActiveTaskId] = useState<string | null>(() => localStorage.getItem(ACTIVE_TASK_KEY));\n const [adding, setAdding] = useState(false);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n\n // One-shot migration from the legacy localStorage `pomodoro_tasks` key.\n const migratedRef = useRef(false);\n useEffect(() => {\n if (migratedRef.current) return;\n migratedRef.current = true;\n migratePomodoroTasksOnce(rawTasks, todo.setAllTasks);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n try {\n if (activeTaskId) localStorage.setItem(ACTIVE_TASK_KEY, activeTaskId);\n else localStorage.removeItem(ACTIVE_TASK_KEY);\n } catch {}\n }, [activeTaskId]);\n\n // Close the row menu on any outside click.\n useEffect(() => {\n if (!menuOpenId) return;\n const handler = () => setMenuOpenId(null);\n const t = setTimeout(() => document.addEventListener('click', handler), 0);\n return () => { clearTimeout(t); document.removeEventListener('click', handler); };\n }, [menuOpenId]);\n\n // When a focus block completes (`streak` increments), bump the active\n // task's completed count. If `autoCheckTasks` is on and it hits the\n // estimate, mark it done. (`checkToBottom` is honoured by the\n // sortedTasks view; the underlying store doesn't reorder.)\n const lastStreakRef = useRef(snap.streak);\n useEffect(() => {\n if (snap.streak > lastStreakRef.current && activeTaskId) {\n const t = rawTasks.find(x => x.id === activeTaskId);\n if (t) {\n const completed = (t.completed ?? 0) + 1;\n const estimated = t.estimated ?? 0;\n const shouldAutoCheck = userPrefs.autoCheckTasks && estimated > 0 && completed >= estimated;\n todo.updateTask(activeTaskId, { completed, done: t.done || shouldAutoCheck });\n }\n }\n lastStreakRef.current = snap.streak;\n }, [snap.streak, activeTaskId, userPrefs.autoCheckTasks, rawTasks, todo]);\n\n const addTask = (name: string, estimated: number) => {\n const trimmed = name.trim();\n if (!trimmed) return;\n // Default the deadline to today so the new task immediately appears\n // in the Pomodoro's today/overdue list. The user can change the\n // due date later from the Todo List app's edit drawer.\n const id = todo.addTask({ name: trimmed, estimated, completed: 0, dueDate: todayStr });\n if (!activeTaskId) setActiveTaskId(id);\n setAdding(false);\n };\n const removeTask = (id: string) => {\n todo.removeTask(id);\n if (activeTaskId === id) setActiveTaskId(null);\n setMenuOpenId(null);\n };\n const toggleDone = (id: string) => {\n todo.toggleDone(id);\n };\n\n // ── Stats ──\n const totalCompleted = tasks.reduce((acc, t) => acc + (t.completed ?? 0), 0);\n const totalEstimated = tasks.reduce((acc, t) => acc + Math.max(t.estimated ?? 0, t.completed ?? 0), 0);\n const remainingPomos = tasks.reduce((acc, t) => t.done ? acc : acc + Math.max(0, (t.estimated ?? 0) - (t.completed ?? 0)), 0);\n const remainingSecsFromTimer = (snap.running && snap.mode === 'focus') ? snap.remaining : 0;\n const remainingSecs = remainingPomos * userPrefs.focusMinutes * 60 + remainingSecsFromTimer;\n const finishAt = new Date(Date.now() + remainingSecs * 1000);\n const finishAtStr = finishAt.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n const totalHours = (remainingSecs / 3600).toFixed(1);\n\n // Look the active task up in the *full* `rawTasks` list, not the\n // filtered `tasks`. That way the indicator above the list still shows\n // the active task name even if the user moved its due date out of\n // today/overdue range from the Todo List app.\n const activeTask = activeTaskId ? rawTasks.find(t => t.id === activeTaskId) ?? null : null;\n\n const mm = String(Math.floor(snap.remaining / 60)).padStart(2, '0');\n const ss = String(snap.remaining % 60).padStart(2, '0');\n\n // ── Settings modal ──\n const [appearance, setAppearance] = useState(() => loadAppearance(POMO_SETTINGS_KEY));\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [configPrefs, setConfigPrefs] = useState<PomoPrefs>(userPrefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...userPrefs });\n setSettingsOpen(true);\n }, [appearance, userPrefs]));\n\n const onSave = () => {\n setAppearance(configAppearance);\n localStorage.setItem(POMO_SETTINGS_KEY, JSON.stringify(configAppearance));\n saveShellPrefs({ pomodoro_settings: configPrefs });\n setSettingsOpen(false);\n };\n\n // Focus mode: panel takes the taskbar's colour (light or dark per\n // theme), text inherits the system theme via Tailwind gray-* classes.\n // Break modes: keep their hex-based colored panels with white text.\n const isColored = snap.mode !== 'focus';\n const bg = MODE_COLORS[snap.mode];\n const panelBg = isColored\n ? hexToRgba(bg, appearance.activeOpacity / 100)\n : `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`;\n\n // Class helpers — switch text colours based on whether the panel is a\n // bright break colour or the (theme-aware) focus panel.\n const tx = {\n primary: isColored ? 'text-white' : 'text-gray-900',\n secondary: isColored ? 'text-white/85' : 'text-gray-700',\n muted: isColored ? 'text-white/65' : 'text-gray-500',\n faded: isColored ? 'text-white/55' : 'text-gray-400',\n tabActive: isColored ? 'bg-white/15 text-white' : 'bg-gray-200 text-gray-900',\n tabInactive: isColored ? 'text-white/75 hover:bg-white/10' : 'text-gray-500 hover:bg-gray-200',\n divider: isColored ? 'border-white/30' : 'border-gray-200',\n softDivider: isColored ? 'border-white/20' : 'border-gray-200',\n iconBtn: isColored ? 'bg-black/15 hover:bg-black/25 text-white/85' : 'bg-gray-200 hover:bg-gray-300 text-gray-600',\n addTaskBtn: isColored ? 'border-white/45 text-white/90 hover:bg-white/[0.06]' : 'border-gray-300 text-gray-500 hover:bg-gray-200/50',\n };\n // START / Save accent colour: in colored modes use the mode hex; in\n // focus mode use a fixed dark slate so the white pill stays high-\n // contrast on both light and dark themes.\n const accentColor = isColored ? bg : '#0f172a';\n\n return (\n <>\n <div className={`flex flex-col h-full select-none transition-colors duration-300 ${tx.primary}`}\n style={{\n backgroundColor: panelBg,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n\n {/* Mode tabs */}\n <div className=\"px-3 pt-3 flex justify-center gap-1.5\">\n {(['focus', 'short', 'long'] as Mode[]).map(m => (\n <button key={m} onClick={() => pomoSwitchMode(m)}\n className={`px-2.5 py-1 text-[13px] font-bold rounded transition-colors ${snap.mode === m ? tx.tabActive : tx.tabInactive}`}>\n {MODE_LABELS[m]}\n </button>\n ))}\n </div>\n\n {/* Big timer */}\n <div className=\"text-center font-bold tabular-nums leading-none tracking-tight mt-3\" style={{ fontSize: '4.5rem' }}>\n {mm}:{ss}\n </div>\n\n {/* START / PAUSE button */}\n <div className=\"flex justify-center mt-3 mb-2\">\n <button onClick={() => snap.running ? pomoPause() : pomoStart()}\n className=\"bg-white px-12 py-2.5 rounded-md font-bold text-base shadow-[0_4px_0_rgba(0,0,0,0.12)] hover:shadow-[0_3px_0_rgba(0,0,0,0.12)] active:translate-y-1 active:shadow-none transition-all\"\n style={{ color: accentColor, letterSpacing: '0.08em' }}>\n {snap.running ? 'PAUSE' : 'START'}\n </button>\n </div>\n\n {/* Active task indicator */}\n <div className=\"px-3 py-3 text-center\">\n {activeTask ? (\n <>\n <div className={`text-xs leading-tight ${tx.muted}`}>#{(activeTask.completed ?? 0) + 1}</div>\n <div className={`text-[15px] font-medium leading-tight truncate mt-0.5 ${tx.primary}`}>{activeTask.name}</div>\n </>\n ) : (\n <div className={`text-xs italic ${tx.muted}`}>No task selected</div>\n )}\n </div>\n\n {/* Tasks header */}\n <div className=\"px-3 mt-1 flex items-center justify-between\">\n <h3 className={`text-base font-bold tracking-tight ${tx.primary}`}>Tasks</h3>\n <button className={`rounded p-1 transition-colors ${tx.iconBtn}`} aria-label=\"Tasks menu\" tabIndex={-1}>\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" /><circle cx=\"12\" cy=\"12\" r=\"1.4\" /><circle cx=\"12\" cy=\"19\" r=\"1.4\" />\n </svg>\n </button>\n </div>\n <div className={`border-t mx-3 mt-2 ${tx.divider}`} />\n\n {/* Tasks list */}\n <div className=\"flex-1 px-3 py-3 space-y-2 overflow-y-auto\">\n {tasks.map(task => {\n const isActive = task.id === activeTaskId;\n return (\n <div key={task.id}\n onClick={() => setActiveTaskId(task.id)}\n className={`bg-white text-gray-800 rounded-md flex items-center pr-2 py-2.5 shadow-sm cursor-pointer transition-shadow hover:shadow-md ${isActive ? 'border-l-4 border-gray-700 pl-2' : 'pl-3 border-l-4 border-transparent'}`}>\n <button onClick={(e) => { e.stopPropagation(); toggleDone(task.id); }}\n className=\"shrink-0\">\n {task.done ? (\n <svg className=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" style={{ color: accentColor }}>\n <path d=\"M10 0a10 10 0 100 20 10 10 0 000-20zm-1 14.5l-4.5-4.5 1.4-1.4 3.1 3.1 6.1-6.1 1.4 1.4z\" />\n </svg>\n ) : (\n <svg className=\"h-5 w-5 text-gray-300\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n )}\n </button>\n <span className={`ml-3 flex-1 font-semibold truncate ${task.done ? 'line-through text-gray-400' : 'text-gray-800'}`}>\n {task.name}\n </span>\n <span className=\"text-sm tabular-nums mr-1.5 shrink-0\">\n <span className=\"font-bold text-gray-500\">{task.completed ?? 0}</span>\n <span className=\"text-gray-400\"> / </span>\n <span className=\"text-gray-400\">{task.estimated ?? '–'}</span>\n </span>\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setMenuOpenId(menuOpenId === task.id ? null : task.id); }}\n className=\"rounded p-1 bg-gray-100 hover:bg-gray-200\">\n <svg className=\"h-4 w-4 text-gray-500\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" /><circle cx=\"12\" cy=\"12\" r=\"1.4\" /><circle cx=\"12\" cy=\"19\" r=\"1.4\" />\n </svg>\n </button>\n {menuOpenId === task.id && (\n <div className=\"absolute right-0 top-full mt-1 bg-white text-gray-800 rounded shadow-lg border border-gray-200 z-10 min-w-[110px] overflow-hidden\"\n onClick={(e) => e.stopPropagation()}>\n <button onClick={(e) => { e.stopPropagation(); removeTask(task.id); }}\n className=\"block w-full px-3 py-1.5 text-sm text-left hover:bg-red-50 text-red-600\">Delete</button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n\n {/* + Add Task */}\n {!adding ? (\n <button onClick={() => setAdding(true)}\n className={`w-full border-2 border-dashed rounded-md py-3 font-semibold flex items-center justify-center gap-2 transition-colors ${tx.addTaskBtn}`}>\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M8 12h8M12 8v8\" />\n </svg>\n Add Task\n </button>\n ) : (\n <AddTaskForm onSubmit={addTask} onCancel={() => setAdding(false)} accentColor={accentColor} />\n )}\n </div>\n\n {/* Footer stats */}\n <div className={`border-t px-3 py-2.5 flex items-center justify-center gap-5 text-sm ${tx.softDivider}`}>\n <span className={tx.secondary}>\n Pomos: <span className={`font-bold ${tx.primary}`}>{totalCompleted}</span>\n <span className={tx.muted}> / </span>\n <span className={`font-bold ${tx.primary}`}>{totalEstimated}</span>\n </span>\n {remainingSecs > 0 && (\n <span className={tx.secondary}>\n Finish At: <span className={`font-bold ${tx.primary}`}>{finishAtStr}</span>\n <span className={tx.muted}> ({totalHours}h)</span>\n </span>\n )}\n </div>\n </div>\n\n <PomodoroSettings\n open={settingsOpen} onClose={() => setSettingsOpen(false)} onSave={onSave}\n configAppearance={configAppearance} setConfigAppearance={setConfigAppearance}\n configPrefs={configPrefs} setConfigPrefs={setConfigPrefs} />\n </>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Settings UI — three sectioned cards (TIMER / TASK / SOUND) matching the\n// reference design. Renders into the standard `WidgetSettingsModal` so we\n// inherit its appearance sliders and the modal chrome.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction PomodoroSettings({\n open, onClose, onSave, configAppearance, setConfigAppearance, configPrefs, setConfigPrefs,\n}: {\n open: boolean;\n onClose: () => void;\n onSave: () => void;\n configAppearance: WidgetAppearance;\n setConfigAppearance: (a: WidgetAppearance) => void;\n configPrefs: PomoPrefs;\n setConfigPrefs: React.Dispatch<React.SetStateAction<PomoPrefs>>;\n}) {\n const set = <K extends keyof PomoPrefs>(k: K, v: PomoPrefs[K]) => setConfigPrefs(p => ({ ...p, [k]: v }));\n\n return (\n <WidgetSettingsModal open={open} onClose={onClose} title=\"Pomodoro Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={onSave}>\n\n {/* ── TIMER ── */}\n <Section icon={<ClockIcon />} label=\"TIMER\">\n <div>\n <p className=\"text-sm font-bold text-gray-800 mb-2\">Time (minutes)</p>\n <div className=\"grid grid-cols-3 gap-3\">\n <NumberField label=\"Pomodoro\" value={configPrefs.focusMinutes} onChange={v => set('focusMinutes', v)} max={120} />\n <NumberField label=\"Short Break\" value={configPrefs.shortBreakMinutes} onChange={v => set('shortBreakMinutes', v)} max={120} />\n <NumberField label=\"Long Break\" value={configPrefs.longBreakMinutes} onChange={v => set('longBreakMinutes', v)} max={120} />\n </div>\n </div>\n\n <Row label=\"Auto Start Breaks\">\n <Toggle checked={configPrefs.autoStartBreaks} onChange={v => set('autoStartBreaks', v)} />\n </Row>\n\n <Row label=\"Auto Start Pomodoros\">\n <Toggle checked={configPrefs.autoStartPomodoros} onChange={v => set('autoStartPomodoros', v)} />\n </Row>\n\n <Row label=\"Long Break interval\">\n <NumberInput value={configPrefs.longBreakInterval} onChange={v => set('longBreakInterval', v)} min={1} max={20} className=\"w-14 text-center\" />\n </Row>\n </Section>\n\n {/* ── TASK ── */}\n <Section icon={<TaskIcon />} label=\"TASK\">\n <Row\n label=\"Auto Check Tasks\"\n info={'If you enable \"Auto Check Tasks\", the active task will be automatically checked when the actual pomodoro count reaches the estimated count.'}>\n <Toggle checked={configPrefs.autoCheckTasks} onChange={v => set('autoCheckTasks', v)} />\n </Row>\n <Row\n label=\"Check to Bottom\"\n info={'If you enable \"Check to Bottom\", the checked task will be automatically moved to the bottom of the task list.'}>\n <Toggle checked={configPrefs.checkToBottom} onChange={v => set('checkToBottom', v)} />\n </Row>\n </Section>\n\n {/* ── SOUND ── */}\n <Section icon={<SpeakerIcon />} label=\"SOUND\">\n <Row label=\"Alarm Sound\">\n <div className=\"flex items-center gap-2\">\n <Dropdown value={configPrefs.alarmSound} onChange={v => set('alarmSound', v as AlarmSound)}\n options={ALARM_OPTIONS.map(o => ({ id: o.id, label: o.label }))} />\n {configPrefs.alarmSound !== 'off' && (\n <button type=\"button\" onClick={() => playAlarm(configPrefs.alarmSound, { volume: configPrefs.alarmVolume, repeat: 1 })}\n className=\"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">\n Play\n </button>\n )}\n </div>\n </Row>\n <SliderRow value={configPrefs.alarmVolume} onChange={v => set('alarmVolume', v)} />\n <Row label=\"repeat\">\n <NumberInput value={configPrefs.alarmRepeat} onChange={v => set('alarmRepeat', v)} min={1} max={5} className=\"w-14 text-center\" />\n </Row>\n\n <Row label=\"Focus Sound\">\n <div className=\"flex items-center gap-2\">\n <Dropdown value={configPrefs.focusSound} onChange={v => set('focusSound', v as FocusSound)}\n options={FOCUS_SOUND_OPTIONS} />\n {configPrefs.focusSound !== 'none' && (\n <button type=\"button\" onClick={() => previewFocusSound(configPrefs.focusSound, configPrefs.focusVolume)}\n className=\"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">\n Play\n </button>\n )}\n </div>\n </Row>\n <SliderRow value={configPrefs.focusVolume} onChange={v => set('focusVolume', v)} />\n </Section>\n </WidgetSettingsModal>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Tiny presentational helpers — kept here (not exported) so the settings\n// markup above reads top-to-bottom without any noise.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction Section({ icon, label, children }: { icon: React.ReactNode; label: string; children: React.ReactNode }) {\n return (\n <div className=\"border-t border-gray-200 pt-3 first:border-0 first:pt-0\">\n <div className=\"flex items-center gap-1.5 mb-3 text-gray-400\">\n {icon}\n <span className=\"text-xs font-bold tracking-[0.15em]\">{label}</span>\n </div>\n <div className=\"space-y-3\">{children}</div>\n </div>\n );\n}\n\nfunction Row({ label, info, children }: { label: string; info?: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-sm font-semibold text-gray-800\">{label}</span>\n {info && <InfoIcon title={info} />}\n </div>\n <div className=\"shrink-0\">{children}</div>\n </div>\n );\n}\n\nfunction SliderRow({ value, onChange }: { value: number; onChange: (v: number) => void }) {\n return (\n <div className=\"flex items-center justify-end gap-3\">\n <span className=\"text-xs text-gray-400 w-7 text-right tabular-nums\">{value}</span>\n <input type=\"range\" min={0} max={100} value={value}\n onChange={e => onChange(parseInt(e.target.value, 10))}\n className=\"w-40 accent-blue-500\" />\n </div>\n );\n}\n\nfunction NumberField({ label, value, onChange, min = 1, max = 99 }: { label: string; value: number; onChange: (v: number) => void; min?: number; max?: number }) {\n return (\n <label className=\"flex flex-col\">\n <span className=\"text-xs font-semibold text-gray-500 mb-1\">{label}</span>\n <NumberInput value={value} onChange={onChange} min={min} max={max} />\n </label>\n );\n}\n\nfunction NumberInput({ value, onChange, min = 1, max = 99, className = '' }: { value: number; onChange: (v: number) => void; min?: number; max?: number; className?: string }) {\n return (\n <input type=\"number\" min={min} max={max} value={value}\n onChange={e => onChange(Math.max(min, Math.min(max, parseInt(e.target.value, 10) || min)))}\n className={`bg-gray-100 border-0 rounded-md px-2 py-1.5 text-sm font-medium text-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 w-full ${className}`} />\n );\n}\n\nfunction Dropdown<T extends string>({ value, onChange, options }: { value: T; onChange: (v: T) => void; options: { id: T; label: string }[] }) {\n return (\n <div className=\"relative\">\n <select value={value} onChange={e => onChange(e.target.value as T)}\n className=\"appearance-none bg-gray-100 border-0 rounded-md pl-3 pr-8 py-1.5 text-sm font-medium text-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 cursor-pointer\">\n {options.map(o => <option key={o.id} value={o.id}>{o.label}</option>)}\n </select>\n <svg className=\"absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-gray-400 pointer-events-none\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n );\n}\n\nfunction Toggle({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) {\n return (\n <button type=\"button\" role=\"switch\" aria-checked={checked} onClick={() => onChange(!checked)}\n className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${checked ? 'bg-emerald-500' : 'bg-gray-300'}`}>\n <span className={`absolute h-5 w-5 rounded-full bg-white shadow transition-transform ${checked ? 'translate-x-[22px]' : 'translate-x-0.5'}`} />\n </button>\n );\n}\n\nfunction InfoIcon({ title }: { title: string }) {\n return (\n <span title={title} className=\"inline-flex items-center justify-center w-4 h-4 rounded-full bg-gray-300 text-white text-[10px] font-bold cursor-help\">i</span>\n );\n}\n\nfunction ClockIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\nfunction TaskIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12l2 2 4-4\" />\n </svg>\n );\n}\n\nfunction SpeakerIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5L6 9H2v6h4l5 4V5z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.5 8.5a5 5 0 010 7M19 5a9 9 0 010 14\" />\n </svg>\n );\n}\n\nfunction AddTaskForm({ onSubmit, onCancel, accentColor }: { onSubmit: (name: string, estimated: number) => void; onCancel: () => void; accentColor: string }) {\n const [name, setName] = useState('');\n const [est, setEst] = useState(1);\n const submit = () => onSubmit(name, est);\n return (\n <div className=\"bg-white text-gray-800 rounded-md p-3 shadow-md\">\n <input autoFocus value={name} onChange={e => setName(e.target.value)} placeholder=\"What are you working on?\"\n onKeyDown={e => { if (e.key === 'Enter') submit(); if (e.key === 'Escape') onCancel(); }}\n className=\"w-full text-base font-medium bg-transparent border-0 outline-none placeholder-gray-400\" />\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs font-semibold text-gray-500\">Est Pomodoros</span>\n <input type=\"number\" min={1} max={20} value={est}\n onChange={e => setEst(Math.max(1, Math.min(20, parseInt(e.target.value, 10) || 1)))}\n className=\"w-16 bg-gray-100 rounded px-2 py-1 text-sm text-right border-0 focus:outline-none focus:ring-2 focus:ring-blue-500\" />\n </div>\n <div className=\"flex gap-2 mt-3 justify-end\">\n <button onClick={onCancel} className=\"px-3 py-1 text-sm text-gray-500 hover:bg-gray-100 rounded\">Cancel</button>\n <button onClick={submit}\n className=\"px-4 py-1 text-sm font-semibold text-white rounded shadow-sm\"\n style={{ backgroundColor: accentColor }}>Save</button>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/PomodoroTimer.tsx"],"names":[],"mappings":"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","file":"PomodoroTimer-WEFU2TRQ.js","sourcesContent":["import { useEffect, useState, useCallback, useSyncExternalStore, useRef, useMemo } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport {\n ALARM_OPTIONS, FOCUS_SOUND_OPTIONS,\n getPomoSnapshot, subscribePomo,\n setPomoDurations, setPomoAlarm, setPomoAlarmConfig, setPomoBehaviour, setPomoFocusSound,\n pomoStart, pomoPause, pomoSwitchMode,\n playAlarm, previewFocusSound,\n type AlarmSound, type FocusSound, type Mode,\n} from '../shell/pomodoroStore';\nimport { useTodoTasks, migratePomodoroTasksOnce } from './_todoStore';\nimport type { TodoTask } from './_todoTypes';\n\nconst POMO_SETTINGS_KEY = 'pomodoro_appearance';\nconst ACTIVE_TASK_KEY = 'pomodoro_active_task_id';\n\nconst MODE_LABELS: Record<Mode, string> = { focus: 'Pomodoro', short: 'Short Break', long: 'Long Break' };\n/**\n * Per-mode background colour. The break modes keep their own colours so\n * a glance at the panel tells you what state you're in. Focus mode is\n * special — its panel uses `--taskbar-bg-rgb` so the widget matches the\n * taskbar (and the rest of the dashboard widgets) across light and dark\n * themes. The hex below is only used for the START / Save accent colour\n * in focus mode.\n */\nconst MODE_COLORS: Record<Mode, string> = {\n focus: '#0f172a', // unused for the panel; only for focus-mode accents\n short: '#508a52', // muted green\n long: '#5b7898', // slate blue\n};\n\n/** Convert `#rrggbb` to an `rgba(r, g, b, alpha)` string so the break\n * panels pick up the user's translucency setting via the alpha channel\n * (instead of an `opacity` on the whole element, which would also fade\n * the text and the START button). */\nfunction hexToRgba(hex: string, alpha: number): string {\n const r = parseInt(hex.slice(1, 3), 16);\n const g = parseInt(hex.slice(3, 5), 16);\n const b = parseInt(hex.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\ninterface PomoPrefs {\n focusMinutes: number;\n shortBreakMinutes: number;\n longBreakMinutes: number;\n autoStartBreaks: boolean;\n autoStartPomodoros: boolean;\n longBreakInterval: number;\n autoCheckTasks: boolean;\n checkToBottom: boolean;\n alarmSound: AlarmSound;\n alarmVolume: number;\n alarmRepeat: number;\n focusSound: FocusSound;\n focusVolume: number;\n}\nconst DEFAULT_PREFS: PomoPrefs = {\n focusMinutes: 25, shortBreakMinutes: 5, longBreakMinutes: 15,\n autoStartBreaks: false, autoStartPomodoros: false, longBreakInterval: 4,\n autoCheckTasks: true, checkToBottom: true,\n alarmSound: 'bell', alarmVolume: 100, alarmRepeat: 1,\n focusSound: 'none', focusVolume: 50,\n};\n\nconst intInRange = (v: unknown, min: number, max: number, fallback: number) =>\n typeof v === 'number' && isFinite(v) ? Math.max(min, Math.min(max, Math.round(v))) : fallback;\n\nfunction readPrefs(raw: unknown): PomoPrefs {\n const p = (raw && typeof raw === 'object') ? raw as Partial<PomoPrefs> : {};\n return {\n focusMinutes: intInRange(p.focusMinutes, 1, 120, DEFAULT_PREFS.focusMinutes),\n shortBreakMinutes: intInRange(p.shortBreakMinutes, 1, 120, DEFAULT_PREFS.shortBreakMinutes),\n longBreakMinutes: intInRange(p.longBreakMinutes, 1, 120, DEFAULT_PREFS.longBreakMinutes),\n autoStartBreaks: typeof p.autoStartBreaks === 'boolean' ? p.autoStartBreaks : DEFAULT_PREFS.autoStartBreaks,\n autoStartPomodoros: typeof p.autoStartPomodoros === 'boolean' ? p.autoStartPomodoros : DEFAULT_PREFS.autoStartPomodoros,\n longBreakInterval: intInRange(p.longBreakInterval, 1, 20, DEFAULT_PREFS.longBreakInterval),\n autoCheckTasks: typeof p.autoCheckTasks === 'boolean' ? p.autoCheckTasks : DEFAULT_PREFS.autoCheckTasks,\n checkToBottom: typeof p.checkToBottom === 'boolean' ? p.checkToBottom : DEFAULT_PREFS.checkToBottom,\n alarmSound: ALARM_OPTIONS.some(o => o.id === p.alarmSound) ? p.alarmSound as AlarmSound : DEFAULT_PREFS.alarmSound,\n alarmVolume: intInRange(p.alarmVolume, 0, 100, DEFAULT_PREFS.alarmVolume),\n alarmRepeat: intInRange(p.alarmRepeat, 1, 5, DEFAULT_PREFS.alarmRepeat),\n focusSound: FOCUS_SOUND_OPTIONS.some(o => o.id === p.focusSound) ? p.focusSound as FocusSound : DEFAULT_PREFS.focusSound,\n focusVolume: intInRange(p.focusVolume, 0, 100, DEFAULT_PREFS.focusVolume),\n };\n}\n\n// The Pomodoro widget treats each TodoTask as if it has the four\n// fields it cares about (name / estimated / completed / done). Tasks\n// without `estimated` show as `?` slots; tasks without `completed`\n// start at 0 and increment when their pomos finish.\nconst sortDoneToBottom = (arr: TodoTask[]): TodoTask[] => {\n const undone: TodoTask[] = [];\n const done: TodoTask[] = [];\n for (const t of arr) (t.done ? done : undone).push(t);\n return [...undone, ...done];\n};\n\nfunction useMemoSortedTasks(rawTasks: TodoTask[], checkToBottom: boolean): TodoTask[] {\n return useMemo(\n () => checkToBottom ? sortDoneToBottom(rawTasks) : rawTasks,\n [rawTasks, checkToBottom],\n );\n}\n\nexport default function PomodoroTimer() {\n const snap = useSyncExternalStore(subscribePomo, getPomoSnapshot, getPomoSnapshot);\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const userPrefs = readPrefs(shellPrefs.pomodoro_settings);\n\n // Sync prefs → store. Split into focused effects so each setting only\n // resets the bit it owns (e.g. flipping the alarm volume doesn't tear\n // down the focus-sound playback).\n useEffect(() => {\n setPomoDurations({\n focus: userPrefs.focusMinutes * 60,\n short: userPrefs.shortBreakMinutes * 60,\n long: userPrefs.longBreakMinutes * 60,\n });\n }, [userPrefs.focusMinutes, userPrefs.shortBreakMinutes, userPrefs.longBreakMinutes]);\n\n useEffect(() => {\n setPomoAlarm(userPrefs.alarmSound);\n setPomoAlarmConfig(userPrefs.alarmVolume, userPrefs.alarmRepeat);\n }, [userPrefs.alarmSound, userPrefs.alarmVolume, userPrefs.alarmRepeat]);\n\n useEffect(() => {\n setPomoBehaviour({\n autoStartBreaks: userPrefs.autoStartBreaks,\n autoStartPomodoros: userPrefs.autoStartPomodoros,\n longBreakInterval: userPrefs.longBreakInterval,\n });\n }, [userPrefs.autoStartBreaks, userPrefs.autoStartPomodoros, userPrefs.longBreakInterval]);\n\n useEffect(() => {\n setPomoFocusSound(userPrefs.focusSound, userPrefs.focusVolume);\n }, [userPrefs.focusSound, userPrefs.focusVolume]);\n\n // Ask once for desktop-notification permission.\n useEffect(() => {\n if (typeof Notification !== 'undefined' && Notification.permission === 'default') {\n try { Notification.requestPermission(); } catch {}\n }\n }, []);\n\n // ── Tasks (shared store) ──\n // Tasks now live in `shellPrefs.todo_tasks` so the Todo List app and\n // Calendar app see the same data. The Pomodoro widget keeps a\n // per-instance `activeTaskId` in localStorage so the user's selection\n // doesn't leak across windows.\n //\n // The Pomodoro list is intentionally narrow — it only shows tasks\n // that are *actionable today*: anything due today (pending or just-\n // completed) plus anything overdue and still pending. Far-future\n // tasks live in the Todo List app; completed tasks from earlier days\n // roll off automatically. Tasks added via the Pomodoro's `+ Add Task`\n // button default to today's `dueDate` so they appear immediately in\n // this filtered view.\n const todo = useTodoTasks();\n const rawTasks = todo.tasks;\n const todayStr = useMemo(() => new Date().toISOString().slice(0, 10), []);\n const visibleRawTasks = useMemo(\n () => rawTasks.filter(t => {\n if (!t.dueDate) return false;\n if (t.dueDate === todayStr) return true; // due today — show even when done\n if (t.dueDate < todayStr && !t.done) return true; // overdue and still pending\n return false;\n }),\n [rawTasks, todayStr],\n );\n const tasks = useMemoSortedTasks(visibleRawTasks, userPrefs.checkToBottom);\n\n const [activeTaskId, setActiveTaskId] = useState<string | null>(() => localStorage.getItem(ACTIVE_TASK_KEY));\n const [adding, setAdding] = useState(false);\n const [menuOpenId, setMenuOpenId] = useState<string | null>(null);\n\n // One-shot migration from the legacy localStorage `pomodoro_tasks` key.\n const migratedRef = useRef(false);\n useEffect(() => {\n if (migratedRef.current) return;\n migratedRef.current = true;\n migratePomodoroTasksOnce(rawTasks, todo.setAllTasks);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n try {\n if (activeTaskId) localStorage.setItem(ACTIVE_TASK_KEY, activeTaskId);\n else localStorage.removeItem(ACTIVE_TASK_KEY);\n } catch {}\n }, [activeTaskId]);\n\n // Close the row menu on any outside click.\n useEffect(() => {\n if (!menuOpenId) return;\n const handler = () => setMenuOpenId(null);\n const t = setTimeout(() => document.addEventListener('click', handler), 0);\n return () => { clearTimeout(t); document.removeEventListener('click', handler); };\n }, [menuOpenId]);\n\n // When a focus block completes (`streak` increments), bump the active\n // task's completed count. If `autoCheckTasks` is on and it hits the\n // estimate, mark it done. (`checkToBottom` is honoured by the\n // sortedTasks view; the underlying store doesn't reorder.)\n const lastStreakRef = useRef(snap.streak);\n useEffect(() => {\n if (snap.streak > lastStreakRef.current && activeTaskId) {\n const t = rawTasks.find(x => x.id === activeTaskId);\n if (t) {\n const completed = (t.completed ?? 0) + 1;\n const estimated = t.estimated ?? 0;\n const shouldAutoCheck = userPrefs.autoCheckTasks && estimated > 0 && completed >= estimated;\n todo.updateTask(activeTaskId, { completed, done: t.done || shouldAutoCheck });\n }\n }\n lastStreakRef.current = snap.streak;\n }, [snap.streak, activeTaskId, userPrefs.autoCheckTasks, rawTasks, todo]);\n\n const addTask = (name: string, estimated: number) => {\n const trimmed = name.trim();\n if (!trimmed) return;\n // Default the deadline to today so the new task immediately appears\n // in the Pomodoro's today/overdue list. The user can change the\n // due date later from the Todo List app's edit drawer.\n const id = todo.addTask({ name: trimmed, estimated, completed: 0, dueDate: todayStr });\n if (!activeTaskId) setActiveTaskId(id);\n setAdding(false);\n };\n const removeTask = (id: string) => {\n todo.removeTask(id);\n if (activeTaskId === id) setActiveTaskId(null);\n setMenuOpenId(null);\n };\n const toggleDone = (id: string) => {\n todo.toggleDone(id);\n };\n\n // ── Stats ──\n const totalCompleted = tasks.reduce((acc, t) => acc + (t.completed ?? 0), 0);\n const totalEstimated = tasks.reduce((acc, t) => acc + Math.max(t.estimated ?? 0, t.completed ?? 0), 0);\n const remainingPomos = tasks.reduce((acc, t) => t.done ? acc : acc + Math.max(0, (t.estimated ?? 0) - (t.completed ?? 0)), 0);\n const remainingSecsFromTimer = (snap.running && snap.mode === 'focus') ? snap.remaining : 0;\n const remainingSecs = remainingPomos * userPrefs.focusMinutes * 60 + remainingSecsFromTimer;\n const finishAt = new Date(Date.now() + remainingSecs * 1000);\n const finishAtStr = finishAt.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: false });\n const totalHours = (remainingSecs / 3600).toFixed(1);\n\n // Look the active task up in the *full* `rawTasks` list, not the\n // filtered `tasks`. That way the indicator above the list still shows\n // the active task name even if the user moved its due date out of\n // today/overdue range from the Todo List app.\n const activeTask = activeTaskId ? rawTasks.find(t => t.id === activeTaskId) ?? null : null;\n\n const mm = String(Math.floor(snap.remaining / 60)).padStart(2, '0');\n const ss = String(snap.remaining % 60).padStart(2, '0');\n\n // ── Settings modal ──\n const [appearance, setAppearance] = useState(() => loadAppearance(POMO_SETTINGS_KEY));\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [configPrefs, setConfigPrefs] = useState<PomoPrefs>(userPrefs);\n\n useWidgetSettings(useCallback(() => {\n setConfigAppearance({ ...appearance });\n setConfigPrefs({ ...userPrefs });\n setSettingsOpen(true);\n }, [appearance, userPrefs]));\n\n const onSave = () => {\n setAppearance(configAppearance);\n localStorage.setItem(POMO_SETTINGS_KEY, JSON.stringify(configAppearance));\n saveShellPrefs({ pomodoro_settings: configPrefs });\n setSettingsOpen(false);\n };\n\n // Focus mode: panel takes the taskbar's colour (light or dark per\n // theme), text inherits the system theme via Tailwind gray-* classes.\n // Break modes: keep their hex-based colored panels with white text.\n const isColored = snap.mode !== 'focus';\n const bg = MODE_COLORS[snap.mode];\n const panelBg = isColored\n ? hexToRgba(bg, appearance.activeOpacity / 100)\n : `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`;\n\n // Class helpers — switch text colours based on whether the panel is a\n // bright break colour or the (theme-aware) focus panel.\n const tx = {\n primary: isColored ? 'text-white' : 'text-gray-900',\n secondary: isColored ? 'text-white/85' : 'text-gray-700',\n muted: isColored ? 'text-white/65' : 'text-gray-500',\n faded: isColored ? 'text-white/55' : 'text-gray-400',\n tabActive: isColored ? 'bg-white/15 text-white' : 'bg-gray-200 text-gray-900',\n tabInactive: isColored ? 'text-white/75 hover:bg-white/10' : 'text-gray-500 hover:bg-gray-200',\n divider: isColored ? 'border-white/30' : 'border-gray-200',\n softDivider: isColored ? 'border-white/20' : 'border-gray-200',\n iconBtn: isColored ? 'bg-black/15 hover:bg-black/25 text-white/85' : 'bg-gray-200 hover:bg-gray-300 text-gray-600',\n addTaskBtn: isColored ? 'border-white/45 text-white/90 hover:bg-white/[0.06]' : 'border-gray-300 text-gray-500 hover:bg-gray-200/50',\n };\n // START / Save accent colour: in colored modes use the mode hex; in\n // focus mode use a fixed dark slate so the white pill stays high-\n // contrast on both light and dark themes.\n const accentColor = isColored ? bg : '#0f172a';\n\n return (\n <>\n <div className={`flex flex-col h-full select-none transition-colors duration-300 ${tx.primary}`}\n style={{\n backgroundColor: panelBg,\n backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined,\n }}>\n\n {/* Mode tabs */}\n <div className=\"px-3 pt-3 flex justify-center gap-1.5\">\n {(['focus', 'short', 'long'] as Mode[]).map(m => (\n <button key={m} onClick={() => pomoSwitchMode(m)}\n className={`px-2.5 py-1 text-[13px] font-bold rounded transition-colors ${snap.mode === m ? tx.tabActive : tx.tabInactive}`}>\n {MODE_LABELS[m]}\n </button>\n ))}\n </div>\n\n {/* Big timer */}\n <div className=\"text-center font-bold tabular-nums leading-none tracking-tight mt-3\" style={{ fontSize: '4.5rem' }}>\n {mm}:{ss}\n </div>\n\n {/* START / PAUSE button */}\n <div className=\"flex justify-center mt-3 mb-2\">\n <button onClick={() => snap.running ? pomoPause() : pomoStart()}\n className=\"bg-white px-12 py-2.5 rounded-md font-bold text-base shadow-[0_4px_0_rgba(0,0,0,0.12)] hover:shadow-[0_3px_0_rgba(0,0,0,0.12)] active:translate-y-1 active:shadow-none transition-all\"\n style={{ color: accentColor, letterSpacing: '0.08em' }}>\n {snap.running ? 'PAUSE' : 'START'}\n </button>\n </div>\n\n {/* Active task indicator */}\n <div className=\"px-3 py-3 text-center\">\n {activeTask ? (\n <>\n <div className={`text-xs leading-tight ${tx.muted}`}>#{(activeTask.completed ?? 0) + 1}</div>\n <div className={`text-[15px] font-medium leading-tight truncate mt-0.5 ${tx.primary}`}>{activeTask.name}</div>\n </>\n ) : (\n <div className={`text-xs italic ${tx.muted}`}>No task selected</div>\n )}\n </div>\n\n {/* Tasks header */}\n <div className=\"px-3 mt-1 flex items-center justify-between\">\n <h3 className={`text-base font-bold tracking-tight ${tx.primary}`}>Tasks</h3>\n <button className={`rounded p-1 transition-colors ${tx.iconBtn}`} aria-label=\"Tasks menu\" tabIndex={-1}>\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" /><circle cx=\"12\" cy=\"12\" r=\"1.4\" /><circle cx=\"12\" cy=\"19\" r=\"1.4\" />\n </svg>\n </button>\n </div>\n <div className={`border-t mx-3 mt-2 ${tx.divider}`} />\n\n {/* Tasks list */}\n <div className=\"flex-1 px-3 py-3 space-y-2 overflow-y-auto\">\n {tasks.map(task => {\n const isActive = task.id === activeTaskId;\n return (\n <div key={task.id}\n onClick={() => setActiveTaskId(task.id)}\n className={`bg-white text-gray-800 rounded-md flex items-center pr-2 py-2.5 shadow-sm cursor-pointer transition-shadow hover:shadow-md ${isActive ? 'border-l-4 border-gray-700 pl-2' : 'pl-3 border-l-4 border-transparent'}`}>\n <button onClick={(e) => { e.stopPropagation(); toggleDone(task.id); }}\n className=\"shrink-0\">\n {task.done ? (\n <svg className=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" style={{ color: accentColor }}>\n <path d=\"M10 0a10 10 0 100 20 10 10 0 000-20zm-1 14.5l-4.5-4.5 1.4-1.4 3.1 3.1 6.1-6.1 1.4 1.4z\" />\n </svg>\n ) : (\n <svg className=\"h-5 w-5 text-gray-300\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n )}\n </button>\n <span className={`ml-3 flex-1 font-semibold truncate ${task.done ? 'line-through text-gray-400' : 'text-gray-800'}`}>\n {task.name}\n </span>\n <span className=\"text-sm tabular-nums mr-1.5 shrink-0\">\n <span className=\"font-bold text-gray-500\">{task.completed ?? 0}</span>\n <span className=\"text-gray-400\"> / </span>\n <span className=\"text-gray-400\">{task.estimated ?? '–'}</span>\n </span>\n <div className=\"relative\">\n <button onClick={(e) => { e.stopPropagation(); setMenuOpenId(menuOpenId === task.id ? null : task.id); }}\n className=\"rounded p-1 bg-gray-100 hover:bg-gray-200\">\n <svg className=\"h-4 w-4 text-gray-500\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" /><circle cx=\"12\" cy=\"12\" r=\"1.4\" /><circle cx=\"12\" cy=\"19\" r=\"1.4\" />\n </svg>\n </button>\n {menuOpenId === task.id && (\n <div className=\"absolute right-0 top-full mt-1 bg-white text-gray-800 rounded shadow-lg border border-gray-200 z-10 min-w-[110px] overflow-hidden\"\n onClick={(e) => e.stopPropagation()}>\n <button onClick={(e) => { e.stopPropagation(); removeTask(task.id); }}\n className=\"block w-full px-3 py-1.5 text-sm text-left hover:bg-red-50 text-red-600\">Delete</button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n\n {/* + Add Task */}\n {!adding ? (\n <button onClick={() => setAdding(true)}\n className={`w-full border-2 border-dashed rounded-md py-3 font-semibold flex items-center justify-center gap-2 transition-colors ${tx.addTaskBtn}`}>\n <svg className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path strokeLinecap=\"round\" d=\"M8 12h8M12 8v8\" />\n </svg>\n Add Task\n </button>\n ) : (\n <AddTaskForm onSubmit={addTask} onCancel={() => setAdding(false)} accentColor={accentColor} />\n )}\n </div>\n\n {/* Footer stats */}\n <div className={`border-t px-3 py-2.5 flex items-center justify-center gap-5 text-sm ${tx.softDivider}`}>\n <span className={tx.secondary}>\n Pomos: <span className={`font-bold ${tx.primary}`}>{totalCompleted}</span>\n <span className={tx.muted}> / </span>\n <span className={`font-bold ${tx.primary}`}>{totalEstimated}</span>\n </span>\n {remainingSecs > 0 && (\n <span className={tx.secondary}>\n Finish At: <span className={`font-bold ${tx.primary}`}>{finishAtStr}</span>\n <span className={tx.muted}> ({totalHours}h)</span>\n </span>\n )}\n </div>\n </div>\n\n <PomodoroSettings\n open={settingsOpen} onClose={() => setSettingsOpen(false)} onSave={onSave}\n configAppearance={configAppearance} setConfigAppearance={setConfigAppearance}\n configPrefs={configPrefs} setConfigPrefs={setConfigPrefs} />\n </>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Settings UI — three sectioned cards (TIMER / TASK / SOUND) matching the\n// reference design. Renders into the standard `WidgetSettingsModal` so we\n// inherit its appearance sliders and the modal chrome.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction PomodoroSettings({\n open, onClose, onSave, configAppearance, setConfigAppearance, configPrefs, setConfigPrefs,\n}: {\n open: boolean;\n onClose: () => void;\n onSave: () => void;\n configAppearance: WidgetAppearance;\n setConfigAppearance: (a: WidgetAppearance) => void;\n configPrefs: PomoPrefs;\n setConfigPrefs: React.Dispatch<React.SetStateAction<PomoPrefs>>;\n}) {\n const set = <K extends keyof PomoPrefs>(k: K, v: PomoPrefs[K]) => setConfigPrefs(p => ({ ...p, [k]: v }));\n\n return (\n <WidgetSettingsModal open={open} onClose={onClose} title=\"Pomodoro Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={onSave}>\n\n {/* ── TIMER ── */}\n <Section icon={<ClockIcon />} label=\"TIMER\">\n <div>\n <p className=\"text-sm font-bold text-gray-800 mb-2\">Time (minutes)</p>\n <div className=\"grid grid-cols-3 gap-3\">\n <NumberField label=\"Pomodoro\" value={configPrefs.focusMinutes} onChange={v => set('focusMinutes', v)} max={120} />\n <NumberField label=\"Short Break\" value={configPrefs.shortBreakMinutes} onChange={v => set('shortBreakMinutes', v)} max={120} />\n <NumberField label=\"Long Break\" value={configPrefs.longBreakMinutes} onChange={v => set('longBreakMinutes', v)} max={120} />\n </div>\n </div>\n\n <Row label=\"Auto Start Breaks\">\n <Toggle checked={configPrefs.autoStartBreaks} onChange={v => set('autoStartBreaks', v)} />\n </Row>\n\n <Row label=\"Auto Start Pomodoros\">\n <Toggle checked={configPrefs.autoStartPomodoros} onChange={v => set('autoStartPomodoros', v)} />\n </Row>\n\n <Row label=\"Long Break interval\">\n <NumberInput value={configPrefs.longBreakInterval} onChange={v => set('longBreakInterval', v)} min={1} max={20} className=\"w-14 text-center\" />\n </Row>\n </Section>\n\n {/* ── TASK ── */}\n <Section icon={<TaskIcon />} label=\"TASK\">\n <Row\n label=\"Auto Check Tasks\"\n info={'If you enable \"Auto Check Tasks\", the active task will be automatically checked when the actual pomodoro count reaches the estimated count.'}>\n <Toggle checked={configPrefs.autoCheckTasks} onChange={v => set('autoCheckTasks', v)} />\n </Row>\n <Row\n label=\"Check to Bottom\"\n info={'If you enable \"Check to Bottom\", the checked task will be automatically moved to the bottom of the task list.'}>\n <Toggle checked={configPrefs.checkToBottom} onChange={v => set('checkToBottom', v)} />\n </Row>\n </Section>\n\n {/* ── SOUND ── */}\n <Section icon={<SpeakerIcon />} label=\"SOUND\">\n <Row label=\"Alarm Sound\">\n <div className=\"flex items-center gap-2\">\n <Dropdown value={configPrefs.alarmSound} onChange={v => set('alarmSound', v as AlarmSound)}\n options={ALARM_OPTIONS.map(o => ({ id: o.id, label: o.label }))} />\n {configPrefs.alarmSound !== 'off' && (\n <button type=\"button\" onClick={() => playAlarm(configPrefs.alarmSound, { volume: configPrefs.alarmVolume, repeat: 1 })}\n className=\"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">\n Play\n </button>\n )}\n </div>\n </Row>\n <SliderRow value={configPrefs.alarmVolume} onChange={v => set('alarmVolume', v)} />\n <Row label=\"repeat\">\n <NumberInput value={configPrefs.alarmRepeat} onChange={v => set('alarmRepeat', v)} min={1} max={5} className=\"w-14 text-center\" />\n </Row>\n\n <Row label=\"Focus Sound\">\n <div className=\"flex items-center gap-2\">\n <Dropdown value={configPrefs.focusSound} onChange={v => set('focusSound', v as FocusSound)}\n options={FOCUS_SOUND_OPTIONS} />\n {configPrefs.focusSound !== 'none' && (\n <button type=\"button\" onClick={() => previewFocusSound(configPrefs.focusSound, configPrefs.focusVolume)}\n className=\"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100\">\n Play\n </button>\n )}\n </div>\n </Row>\n <SliderRow value={configPrefs.focusVolume} onChange={v => set('focusVolume', v)} />\n </Section>\n </WidgetSettingsModal>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Tiny presentational helpers — kept here (not exported) so the settings\n// markup above reads top-to-bottom without any noise.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction Section({ icon, label, children }: { icon: React.ReactNode; label: string; children: React.ReactNode }) {\n return (\n <div className=\"border-t border-gray-200 pt-3 first:border-0 first:pt-0\">\n <div className=\"flex items-center gap-1.5 mb-3 text-gray-400\">\n {icon}\n <span className=\"text-xs font-bold tracking-[0.15em]\">{label}</span>\n </div>\n <div className=\"space-y-3\">{children}</div>\n </div>\n );\n}\n\nfunction Row({ label, info, children }: { label: string; info?: string; children: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className=\"text-sm font-semibold text-gray-800\">{label}</span>\n {info && <InfoIcon title={info} />}\n </div>\n <div className=\"shrink-0\">{children}</div>\n </div>\n );\n}\n\nfunction SliderRow({ value, onChange }: { value: number; onChange: (v: number) => void }) {\n return (\n <div className=\"flex items-center justify-end gap-3\">\n <span className=\"text-xs text-gray-400 w-7 text-right tabular-nums\">{value}</span>\n <input type=\"range\" min={0} max={100} value={value}\n onChange={e => onChange(parseInt(e.target.value, 10))}\n className=\"w-40 accent-blue-500\" />\n </div>\n );\n}\n\nfunction NumberField({ label, value, onChange, min = 1, max = 99 }: { label: string; value: number; onChange: (v: number) => void; min?: number; max?: number }) {\n return (\n <label className=\"flex flex-col\">\n <span className=\"text-xs font-semibold text-gray-500 mb-1\">{label}</span>\n <NumberInput value={value} onChange={onChange} min={min} max={max} />\n </label>\n );\n}\n\nfunction NumberInput({ value, onChange, min = 1, max = 99, className = '' }: { value: number; onChange: (v: number) => void; min?: number; max?: number; className?: string }) {\n return (\n <input type=\"number\" min={min} max={max} value={value}\n onChange={e => onChange(Math.max(min, Math.min(max, parseInt(e.target.value, 10) || min)))}\n className={`bg-gray-100 border-0 rounded-md px-2 py-1.5 text-sm font-medium text-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 w-full ${className}`} />\n );\n}\n\nfunction Dropdown<T extends string>({ value, onChange, options }: { value: T; onChange: (v: T) => void; options: { id: T; label: string }[] }) {\n return (\n <div className=\"relative\">\n <select value={value} onChange={e => onChange(e.target.value as T)}\n className=\"appearance-none bg-gray-100 border-0 rounded-md pl-3 pr-8 py-1.5 text-sm font-medium text-gray-800 focus:outline-none focus:ring-2 focus:ring-blue-500 cursor-pointer\">\n {options.map(o => <option key={o.id} value={o.id}>{o.label}</option>)}\n </select>\n <svg className=\"absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-gray-400 pointer-events-none\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 9l6 6 6-6\" />\n </svg>\n </div>\n );\n}\n\nfunction Toggle({ checked, onChange }: { checked: boolean; onChange: (v: boolean) => void }) {\n return (\n <button type=\"button\" role=\"switch\" aria-checked={checked} onClick={() => onChange(!checked)}\n className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors ${checked ? 'bg-emerald-500' : 'bg-gray-300'}`}>\n <span className={`absolute h-5 w-5 rounded-full bg-white shadow transition-transform ${checked ? 'translate-x-[22px]' : 'translate-x-0.5'}`} />\n </button>\n );\n}\n\nfunction InfoIcon({ title }: { title: string }) {\n return (\n <span title={title} className=\"inline-flex items-center justify-center w-4 h-4 rounded-full bg-gray-300 text-white text-[10px] font-bold cursor-help\">i</span>\n );\n}\n\nfunction ClockIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\nfunction TaskIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12l2 2 4-4\" />\n </svg>\n );\n}\n\nfunction SpeakerIcon() {\n return (\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5L6 9H2v6h4l5 4V5z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.5 8.5a5 5 0 010 7M19 5a9 9 0 010 14\" />\n </svg>\n );\n}\n\nfunction AddTaskForm({ onSubmit, onCancel, accentColor }: { onSubmit: (name: string, estimated: number) => void; onCancel: () => void; accentColor: string }) {\n const [name, setName] = useState('');\n const [est, setEst] = useState(1);\n const submit = () => onSubmit(name, est);\n return (\n <div className=\"bg-white text-gray-800 rounded-md p-3 shadow-md\">\n <input autoFocus value={name} onChange={e => setName(e.target.value)} placeholder=\"What are you working on?\"\n onKeyDown={e => { if (e.key === 'Enter') submit(); if (e.key === 'Escape') onCancel(); }}\n className=\"w-full text-base font-medium bg-transparent border-0 outline-none placeholder-gray-400\" />\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"text-xs font-semibold text-gray-500\">Est Pomodoros</span>\n <input type=\"number\" min={1} max={20} value={est}\n onChange={e => setEst(Math.max(1, Math.min(20, parseInt(e.target.value, 10) || 1)))}\n className=\"w-16 bg-gray-100 rounded px-2 py-1 text-sm text-right border-0 focus:outline-none focus:ring-2 focus:ring-blue-500\" />\n </div>\n <div className=\"flex gap-2 mt-3 justify-end\">\n <button onClick={onCancel} className=\"px-3 py-1 text-sm text-gray-500 hover:bg-gray-100 rounded\">Cancel</button>\n <button onClick={submit}\n className=\"px-4 py-1 text-sm font-semibold text-white rounded shadow-sm\"\n style={{ backgroundColor: accentColor }}>Save</button>\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export { Preview as default, setPdfPreview } from './chunk-BV54NLUT.js';
2
+ import './chunk-KUIPWCTJ.js';
3
+ import './chunk-WIJ45SYD.js';
4
+ import './chunk-VVXXHR5V.js';
5
+ import './chunk-PLGHQ7QW.js';
6
+ //# sourceMappingURL=Preview-UA3GCLDI.js.map
7
+ //# sourceMappingURL=Preview-UA3GCLDI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-KX753OG4.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-UA3GCLDI.js"}
@@ -1,5 +1,5 @@
1
1
  import { EditableGrid } from './chunk-GP4Y3VCB.js';
2
- import { WindowTitle } from './chunk-7M3BBAHQ.js';
2
+ import { WindowTitle } from './chunk-VVXXHR5V.js';
3
3
  import './chunk-PLGHQ7QW.js';
4
4
  import { useRef, useState, useEffect, useCallback } from 'react';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -442,5 +442,5 @@ function Spreadsheet() {
442
442
  }
443
443
 
444
444
  export { Spreadsheet as default };
445
- //# sourceMappingURL=Spreadsheet-MKXPPSKV.js.map
446
- //# sourceMappingURL=Spreadsheet-MKXPPSKV.js.map
445
+ //# sourceMappingURL=Spreadsheet-2JEK7VD7.js.map
446
+ //# sourceMappingURL=Spreadsheet-2JEK7VD7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/Spreadsheet.tsx"],"names":[],"mappings":"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","file":"Spreadsheet-MKXPPSKV.js","sourcesContent":["import { useState, useCallback, useEffect, useRef } from 'react';\nimport EditableGrid from '../shell/EditableGrid';\nimport type { GridColumn, CellStyle } from '../shell/EditableGrid';\nimport { WindowTitle } from '../shell/Modal';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\nconst ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst DEFAULT_COLS = 10;\nconst DEFAULT_ROWS = 30;\n\nfunction colLabel(i: number): string {\n if (i < 26) return ALPHA[i];\n return ALPHA[Math.floor(i / 26) - 1] + ALPHA[i % 26];\n}\n\nfunction makeColumns(count: number): GridColumn[] {\n return Array.from({ length: count }, (_, i) => ({\n key: `col_${i}`,\n title: colLabel(i),\n width: 100,\n }));\n}\n\nfunction makeEmptyData(rows: number, cols: number): string[][] {\n return Array.from({ length: rows }, () => Array(cols).fill(''));\n}\n\ninterface Sheet {\n id: string;\n name: string;\n columns: GridColumn[];\n data: string[][];\n /** Per-cell text styling. Key: `${row}:${col}`. */\n cellStyles?: Record<string, CellStyle>;\n}\n\nfunction newSheet(name: string): Sheet {\n return {\n id: crypto.randomUUID(),\n name,\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n cellStyles: {},\n };\n}\n\nfunction parseCSV(text: string): string[][] {\n return text.split('\\n').map(line => {\n if (line.includes('\\t')) return line.split('\\t').map(s => s.trim());\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n for (const ch of line) {\n if (ch === '\"') { inQuotes = !inQuotes; continue; }\n if (ch === ',' && !inQuotes) { parts.push(current.trim()); current = ''; continue; }\n current += ch;\n }\n parts.push(current.trim());\n return parts;\n }).filter(r => r.some(c => c.trim()));\n}\n\nexport default function Spreadsheet() {\n const containerRef = useRef<HTMLDivElement>(null);\n const [sheets, setSheets] = useState<Sheet[]>([newSheet('Sheet 1')]);\n const [activeIdx, setActiveIdx] = useState(0);\n\n // Undo history — push a snapshot whenever sheets change, except when the\n // change came from undo itself.\n const undoStackRef = useRef<Sheet[][]>([]);\n const lastCommittedRef = useRef<Sheet[]>(sheets);\n const skipRecordRef = useRef(false);\n useEffect(() => {\n if (skipRecordRef.current) {\n skipRecordRef.current = false;\n } else if (lastCommittedRef.current !== sheets) {\n undoStackRef.current.push(lastCommittedRef.current);\n if (undoStackRef.current.length > 50) undoStackRef.current.shift();\n }\n lastCommittedRef.current = sheets;\n }, [sheets]);\n const undo = useCallback(() => {\n const prev = undoStackRef.current.pop();\n if (!prev) return;\n skipRecordRef.current = true;\n setSheets(prev);\n }, []);\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement) && !containerRef.current?.matches(':focus-within')) return;\n const isUndo = (e.ctrlKey || e.metaKey) && !e.shiftKey && (e.key === 'z' || e.key === 'Z');\n if (isUndo) {\n e.preventDefault();\n undo();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [undo]);\n const [title, setTitle] = useState('Untitled');\n const [editingTitle, setEditingTitle] = useState(false);\n const [editingTab, setEditingTab] = useState<number | null>(null);\n const [tabName, setTabName] = useState('');\n const fileRef = useRef<HTMLInputElement>(null);\n const [addColCount, setAddColCount] = useState('1');\n const [addRowCount, setAddRowCount] = useState('10');\n\n const active = sheets[activeIdx] || sheets[0];\n const data = active.data;\n const columns = active.columns;\n const cellStyles = active.cellStyles ?? {};\n const [focusedCell, setFocusedCell] = useState<{ row: number; col: number } | null>(null);\n const [selection, setSelection] = useState<{ anchor: { row: number; col: number }; end: { row: number; col: number } } | null>(null);\n\n // Cells affected by toolbar actions: full selection rectangle if non-empty,\n // otherwise the single focused cell.\n const targetCells = useCallback((): { row: number; col: number }[] => {\n if (selection) {\n const r1 = Math.min(selection.anchor.row, selection.end.row);\n const r2 = Math.max(selection.anchor.row, selection.end.row);\n const c1 = Math.min(selection.anchor.col, selection.end.col);\n const c2 = Math.max(selection.anchor.col, selection.end.col);\n const cells: { row: number; col: number }[] = [];\n for (let r = r1; r <= r2; r++) for (let c = c1; c <= c2; c++) cells.push({ row: r, col: c });\n return cells;\n }\n return focusedCell ? [focusedCell] : [];\n }, [selection, focusedCell]);\n\n const toggleCellStyle = useCallback((key: keyof CellStyle, value?: any) => {\n const cells = targetCells();\n if (cells.length === 0) return;\n setSheets(prev => prev.map((s, i) => {\n if (i !== activeIdx) return s;\n const styles = { ...(s.cellStyles ?? {}) };\n // For toggles, derive the new state from the FIRST cell so the whole\n // selection ends up consistent (rather than each cell flipping\n // independently).\n const firstKey = `${cells[0].row}:${cells[0].col}`;\n const desired = value !== undefined ? value : !((styles[firstKey] ?? {})[key] as any);\n for (const { row, col } of cells) {\n const k = `${row}:${col}`;\n styles[k] = { ...(styles[k] ?? {}), [key]: desired };\n }\n return { ...s, cellStyles: styles };\n }));\n }, [targetCells, activeIdx]);\n\n const headCell = selection ? { row: selection.anchor.row, col: selection.anchor.col } : focusedCell;\n const focusedStyle: CellStyle = headCell ? (cellStyles[`${headCell.row}:${headCell.col}`] ?? {}) : {};\n const hasTarget = !!headCell;\n\n const updateActiveSheet = useCallback((update: Partial<Sheet>) => {\n setSheets(prev => prev.map((s, i) => i === activeIdx ? { ...s, ...update } : s));\n }, [activeIdx]);\n\n const handleChange = useCallback((newData: string[][]) => {\n // Sync column count if rows were inserted/deleted with different column counts\n const maxCols = newData.reduce((m, r) => Math.max(m, r.length), 0);\n if (maxCols !== columns.length) {\n updateActiveSheet({ data: newData, columns: makeColumns(maxCols) });\n } else {\n updateActiveSheet({ data: newData });\n }\n }, [updateActiveSheet, columns.length]);\n\n // Tab management\n const addSheet = () => {\n const name = `Sheet ${sheets.length + 1}`;\n setSheets(prev => [...prev, newSheet(name)]);\n setActiveIdx(sheets.length);\n };\n\n const removeSheet = (idx: number) => {\n if (sheets.length <= 1) return;\n setSheets(prev => prev.filter((_, i) => i !== idx));\n if (activeIdx >= idx && activeIdx > 0) setActiveIdx(activeIdx - 1);\n };\n\n const renameSheet = (idx: number, name: string) => {\n setSheets(prev => prev.map((s, i) => i === idx ? { ...s, name } : s));\n setEditingTab(null);\n };\n\n // Add columns to active sheet\n const addColumns = (count: number) => {\n const newColCount = columns.length + count;\n updateActiveSheet({\n columns: makeColumns(newColCount),\n data: data.map(row => [...row, ...Array(count).fill('')]),\n });\n };\n\n // Add rows to active sheet\n const addRows = (count: number) => {\n updateActiveSheet({\n data: [...data, ...Array.from({ length: count }, () => Array(columns.length).fill(''))],\n });\n };\n\n // Clear active sheet\n const handleClear = () => {\n updateActiveSheet({\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n });\n };\n\n // Export as CSV\n const exportCSV = () => {\n const csv = data\n .filter(row => row.some(c => c.trim()))\n .map(row => row.map(cell => {\n if (cell.includes(',') || cell.includes('\"') || cell.includes('\\n'))\n return `\"${cell.replace(/\"/g, '\"\"')}\"`;\n return cell;\n }).join(','))\n .join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${title || 'spreadsheet'}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n // Import CSV / XLSX\n const importFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const name = file.name.replace(/\\.(csv|tsv|txt|xlsx|xls|ods)$/i, '');\n\n if (/\\.(xlsx|xls|ods)$/i.test(file.name)) {\n // XLSX — dynamic import\n const byteArr = new Uint8Array(await file.arrayBuffer());\n const XLSX = await import('xlsx');\n const wb = XLSX.read(byteArr, { type: 'array' });\n const newSheets: Sheet[] = wb.SheetNames.map(sn => {\n const rows: string[][] = XLSX.utils.sheet_to_json(wb.Sheets[sn], { header: 1, defval: '' });\n const maxCols = Math.max(DEFAULT_COLS, rows.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = rows.map(r => { const nr = r.map(c => String(c ?? '')); while (nr.length < maxCols) nr.push(''); return nr; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n return { id: crypto.randomUUID(), name: sn, columns: makeColumns(maxCols), data: padded };\n });\n setSheets(newSheets);\n setActiveIdx(0);\n setTitle(name);\n } else {\n // CSV/TSV\n const text = await file.text();\n const parsed = parseCSV(text);\n if (parsed.length === 0) return;\n const maxCols = Math.max(DEFAULT_COLS, parsed.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = parsed.map(r => { while (r.length < maxCols) r.push(''); return r; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n updateActiveSheet({ columns: makeColumns(maxCols), data: padded });\n setTitle(name);\n }\n\n if (fileRef.current) fileRef.current.value = '';\n };\n\n // Stats\n const allNums: number[] = [];\n data.forEach(row => row.forEach(cell => {\n const v = parseFloat(cell);\n if (!isNaN(v) && cell.trim()) allNums.push(v);\n }));\n const filledCount = data.reduce((c, row) => c + row.filter(cell => cell.trim()).length, 0);\n\n return (\n <div ref={containerRef} className=\"flex flex-col h-full\">\n <WindowTitle title={`${truncateForTitle(title || 'Untitled')} - Spreadsheets`} />\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n {editingTitle ? (\n <input type=\"text\" value={title} onChange={e => setTitle(e.target.value)}\n onBlur={() => setEditingTitle(false)}\n onKeyDown={e => { if (e.key === 'Enter') setEditingTitle(false); }}\n autoFocus\n className=\"text-sm font-medium text-gray-900 border border-gray-300 rounded px-2 py-0.5 w-40 focus:border-blue-500 focus:ring-blue-500\" />\n ) : (\n <button onClick={() => setEditingTitle(true)} className=\"text-sm font-medium text-gray-900 hover:text-blue-600 truncate max-w-[200px]\" title=\"Click to rename\">\n {title || 'Untitled'}\n </button>\n )}\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <input ref={fileRef} type=\"file\" accept=\".csv,.tsv,.txt,.xlsx,.xls,.ods\" onChange={importFile} className=\"hidden\" />\n <button onClick={() => fileRef.current?.click()}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Open\n </button>\n <button onClick={exportCSV}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Save CSV\n </button>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"50\" value={addColCount} onChange={e => setAddColCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addColumns(parseInt(addColCount) || 1)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Col\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"500\" value={addRowCount} onChange={e => setAddRowCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addRows(parseInt(addRowCount) || 10)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Row\n </button>\n </div>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <button onClick={handleClear}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Clear\n </button>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n {/* Font style panel — applies to the focused cell. */}\n <div className=\"flex items-center gap-0.5\" title={hasTarget ? '' : 'Click a cell first'}>\n <button onClick={() => toggleCellStyle('bold')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors font-bold ${focusedStyle.bold ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n B\n </button>\n <button onClick={() => toggleCellStyle('italic')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors italic ${focusedStyle.italic ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n I\n </button>\n <button onClick={() => toggleCellStyle('underline')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors underline ${focusedStyle.underline ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n U\n </button>\n <select\n value={focusedStyle.fontSize ?? 'base'}\n onChange={e => toggleCellStyle('fontSize', e.target.value)}\n disabled={!hasTarget}\n className=\"ml-1 text-xs border border-gray-300 rounded px-1 py-0.5 bg-white disabled:opacity-40 disabled:cursor-not-allowed\">\n <option value=\"sm\">XS</option>\n <option value=\"base\">S</option>\n <option value=\"lg\">M</option>\n <option value=\"xl\">L</option>\n </select>\n </div>\n </div>\n\n {/* Grid */}\n <div className=\"flex-1 min-h-0\">\n <EditableGrid\n columns={columns}\n data={data}\n onChange={handleChange}\n onColumnsChange={(newCols) => updateActiveSheet({ columns: newCols })}\n cellStyles={cellStyles}\n onFocusChange={setFocusedCell}\n onSelectionChange={setSelection}\n minRows={DEFAULT_ROWS}\n maxHeight=\"100%\"\n />\n </div>\n\n {/* Sheet tabs + status bar */}\n <div className=\"flex items-center border-t border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"flex items-center gap-0.5 px-1 py-1 overflow-x-auto flex-1 min-w-0\">\n {sheets.map((sheet, idx) => (\n <button key={sheet.id}\n onClick={() => setActiveIdx(idx)}\n onDoubleClick={() => { setEditingTab(idx); setTabName(sheet.name); }}\n onContextMenu={e => { e.preventDefault(); if (sheets.length > 1) removeSheet(idx); }}\n className={`px-3 py-1 text-xs font-medium rounded-b whitespace-nowrap transition-colors ${\n idx === activeIdx\n ? 'bg-white text-blue-700 border border-t-0 border-gray-300 -mt-px relative z-10'\n : 'text-gray-500 hover:text-gray-700 hover:bg-gray-100'\n }`}>\n {editingTab === idx ? (\n <input type=\"text\" value={tabName} onChange={e => setTabName(e.target.value)}\n onBlur={() => renameSheet(idx, tabName || sheet.name)}\n onKeyDown={e => { if (e.key === 'Enter') renameSheet(idx, tabName || sheet.name); if (e.key === 'Escape') setEditingTab(null); }}\n onClick={e => e.stopPropagation()}\n autoFocus\n className=\"w-20 text-xs border border-blue-400 rounded px-1 py-0 focus:ring-0 focus:outline-none\" />\n ) : sheet.name}\n </button>\n ))}\n <button onClick={addSheet} className=\"px-2 py-1 text-xs text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded\" title=\"Add sheet\">+</button>\n </div>\n\n <div className=\"flex items-center gap-4 px-3 py-1 text-xs text-gray-500 shrink-0 border-l border-gray-200\">\n <span>{filledCount} cells</span>\n {allNums.length > 0 && (\n <>\n <span>Sum: {allNums.reduce((s, v) => s + v, 0).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n <span>Avg: {(allNums.reduce((s, v) => s + v, 0) / allNums.length).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n </>\n )}\n <span>{data.length} × {columns.length}</span>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/Spreadsheet.tsx"],"names":[],"mappings":";;;;;;AAKA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAEA,IAAM,KAAA,GAAQ,4BAAA;AACd,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,YAAA,GAAe,EAAA;AAErB,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,IAAI,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AACrD;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,MAAO;AAAA,IAC9C,GAAA,EAAK,OAAO,CAAC,CAAA,CAAA;AAAA,IACb,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT,CAAE,CAAA;AACJ;AAEA,SAAS,aAAA,CAAc,MAAc,IAAA,EAA0B;AAC7D,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,MAAM,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAChE;AAWA,SAAS,SAAS,IAAA,EAAqB;AACrC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,IACtB,IAAA;AAAA,IACA,OAAA,EAAS,YAAY,YAAY,CAAA;AAAA,IACjC,IAAA,EAAM,aAAA,CAAc,YAAA,EAAc,YAAY,CAAA;AAAA,IAC9C,YAAY;AAAC,GACf;AACF;AAEA,SAAS,SAAS,IAAA,EAA0B;AAC1C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ;AAClC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAI,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA,CAAM,GAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAClE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,MAAA,IAAI,OAAO,GAAA,EAAK;AAAE,QAAA,QAAA,GAAW,CAAC,QAAA;AAAU,QAAA;AAAA,MAAU;AAClD,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,QAAA,EAAU;AAAE,QAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAG,QAAA,OAAA,GAAU,EAAA;AAAI,QAAA;AAAA,MAAU;AACnF,MAAA,OAAA,IAAW,EAAA;AAAA,IACb;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACtC;AAEe,SAAR,WAAA,GAA+B;AACpC,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAI,SAAkB,CAAC,QAAA,CAAS,SAAS,CAAC,CAAC,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,CAAC,CAAA;AAI5C,EAAA,MAAM,YAAA,GAAe,MAAA,CAAkB,EAAE,CAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,OAAgB,MAAM,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAClC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,gBAAA,CAAiB,OAAA,KAAY,MAAA,EAAQ;AAC9C,MAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAClD,MAAA,IAAI,aAAa,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,YAAA,CAAa,QAAQ,KAAA,EAAM;AAAA,IACnE;AACA,IAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAI;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,IAAK,CAAC,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChH,MAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAC,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,GAAA,CAAA;AACtF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,UAAU,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,GAAG,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,IAAI,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAS,CAAA,IAAK,OAAO,CAAC,CAAA;AAC5C,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA8C,IAAI,CAAA;AACxF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6F,IAAI,CAAA;AAInI,EAAA,MAAM,WAAA,GAAc,YAAY,MAAsC;AACpE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,SAAA,CAAU,OAAO,GAAA,EAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AAC3D,MAAA,MAAM,QAAwC,EAAC;AAC/C,MAAA,KAAA,IAAS,IAAI,EAAA,EAAI,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK,KAAA,IAAS,IAAI,EAAA,EAAI,CAAA,IAAK,EAAA,EAAI,CAAA,EAAA,QAAW,IAAA,CAAK,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAC3F,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,WAAA,GAAc,CAAC,WAAW,CAAA,GAAI,EAAC;AAAA,EACxC,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,GAAA,EAAsB,KAAA,KAAgB;AACzE,IAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACnC,MAAA,IAAI,CAAA,KAAM,WAAW,OAAO,CAAA;AAC5B,MAAA,MAAM,SAAS,EAAE,GAAI,CAAA,CAAE,UAAA,IAAc,EAAC,EAAG;AAIzC,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAA,CAAE,GAAG,CAAA,CAAA;AAChD,MAAA,MAAM,OAAA,GAAU,KAAA,KAAU,MAAA,GAAY,KAAA,GAAQ,CAAA,CAAG,OAAO,QAAQ,CAAA,IAAK,EAAC,EAAG,GAAG,CAAA;AAC5E,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,GAAA,EAAI,IAAK,KAAA,EAAO;AAChC,QAAA,MAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACvB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,EAAE,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,EAAC,EAAI,CAAC,GAAG,GAAG,OAAA,EAAQ;AAAA,MACrD;AACA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,UAAA,EAAY,MAAA,EAAO;AAAA,IACpC,CAAC,CAAC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,EAAE,GAAA,EAAK,SAAA,CAAU,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,SAAA,CAAU,MAAA,CAAO,GAAA,EAAI,GAAI,WAAA;AACxF,EAAA,MAAM,YAAA,GAA0B,QAAA,GAAY,UAAA,CAAW,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,QAAA,CAAS,GAAG,CAAA,CAAE,CAAA,IAAK,KAAM,EAAC;AACpG,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,QAAA;AAEpB,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,MAAA,KAA2B;AAChE,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,GAAG,MAAA,EAAO,GAAI,CAAC,CAAC,CAAA;AAAA,EACjF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,OAAA,KAAwB;AAExD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAA;AACjE,IAAA,IAAI,OAAA,KAAY,QAAQ,MAAA,EAAQ;AAC9B,MAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAGtC,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAA;AACvC,IAAA,SAAA,CAAU,UAAQ,CAAC,GAAG,MAAM,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AAC3C,IAAA,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAgB;AACnC,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,GAAG,CAAC,CAAA;AAClD,IAAA,IAAI,aAAa,GAAA,IAAO,SAAA,GAAY,CAAA,EAAG,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,EACnE,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,EAAa,IAAA,KAAiB;AACjD,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,GAAA,GAAM,EAAE,GAAG,CAAA,EAAG,IAAA,EAAK,GAAI,CAAC,CAAC,CAAA;AACpE,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AACpC,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,GAAS,KAAA;AACrC,IAAA,iBAAA,CAAkB;AAAA,MAChB,OAAA,EAAS,YAAY,WAAW,CAAA;AAAA,MAChC,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,GAAG,GAAA,EAAK,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAC;AAAA,KACzD,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAkB;AACjC,IAAA,iBAAA,CAAkB;AAAA,MAChB,MAAM,CAAC,GAAG,MAAM,GAAG,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,MAAM,MAAM,OAAA,CAAQ,MAAM,EAAE,IAAA,CAAK,EAAE,CAAC,CAAC;AAAA,KACvF,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,iBAAA,CAAkB;AAAA,MAChB,OAAA,EAAS,YAAY,YAAY,CAAA;AAAA,MACjC,IAAA,EAAM,aAAA,CAAc,YAAA,EAAc,YAAY;AAAA,KAC/C,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,MAAM,IAAA,CACT,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,CAAI,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,CACrC,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAA,IAAA,KAAQ;AAC1B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAChE,QAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AACrC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CACX,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,KAAA,IAAS,aAAa,CAAA,IAAA,CAAA;AACtC,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAA2C;AACnE,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,kCAAkC,EAAE,CAAA;AAEnE,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAExC,MAAA,MAAM,UAAU,IAAI,UAAA,CAAW,MAAM,IAAA,CAAK,aAAa,CAAA;AACvD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,MAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,SAAS,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAqB,EAAA,CAAG,UAAA,CAAW,GAAA,CAAI,CAAA,EAAA,KAAM;AACjD,QAAA,MAAM,IAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA;AAC1F,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACtF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAAE,UAAA,MAAM,KAAK,CAAA,CAAE,GAAA,CAAI,OAAK,MAAA,CAAO,CAAA,IAAK,EAAE,CAAC,CAAA;AAAG,UAAA,OAAO,EAAA,CAAG,MAAA,GAAS,OAAA,EAAS,EAAA,CAAG,KAAK,EAAE,CAAA;AAAG,UAAA,OAAO,EAAA;AAAA,QAAI,CAAC,CAAA;AAC5H,QAAA,OAAO,MAAA,CAAO,MAAA,GAAS,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,QAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,UAAA,EAAW,EAAG,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAO;AAAA,MAC1F,CAAC,CAAA;AACD,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACxF,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK;AAAE,QAAA,OAAO,CAAA,CAAE,MAAA,GAAS,OAAA,EAAS,CAAA,CAAE,KAAK,EAAE,CAAA;AAAG,QAAA,OAAO,CAAA;AAAA,MAAG,CAAC,CAAA;AACnF,MAAA,OAAO,MAAA,CAAO,MAAA,GAAS,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,MAAA,iBAAA,CAAkB,EAAE,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAG,IAAA,EAAM,QAAQ,CAAA;AACjE,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,KAAO,GAAA,CAAI,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACtC,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,MAAM,CAAC,CAAA,IAAK,KAAK,IAAA,EAAK,EAAG,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,EAC9C,CAAC,CAAC,CAAA;AACF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,CAAC,GAAG,GAAA,KAAQ,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,UAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAEzF,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,WAAU,sBAAA,EAChC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,KAAA,EAAO,CAAA,EAAG,iBAAiB,KAAA,IAAS,UAAU,CAAC,CAAA,eAAA,CAAA,EAAmB,CAAA;AAAA,oBAE/E,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACZ,QAAA,EAAA;AAAA,MAAA,YAAA,mBACC,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UAAM,IAAA,EAAK,MAAA;AAAA,UAAO,KAAA,EAAO,KAAA;AAAA,UAAO,QAAA,EAAU,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACrE,MAAA,EAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,UACnC,WAAW,CAAA,CAAA,KAAK;AAAE,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,eAAA,CAAgB,KAAK,CAAA;AAAA,UAAG,CAAA;AAAA,UACjE,SAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAU;AAAA;AAAA,OAA8H,mBAE1I,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG,SAAA,EAAU,8EAAA,EAA+E,KAAA,EAAM,iBAAA,EAC1I,mBAAS,UAAA,EACZ,CAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,GAAA,CAAC,OAAA,EAAA,EAAM,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,gCAAA,EAAiC,QAAA,EAAU,UAAA,EAAY,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAClH,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAAA,UAC5C,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,SAAA;AAAA,UACf,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAAM,IAAA,EAAK,QAAA;AAAA,YAAS,GAAA,EAAI,GAAA;AAAA,YAAI,GAAA,EAAI,IAAA;AAAA,YAAK,KAAA,EAAO,WAAA;AAAA,YAAa,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACpG,SAAA,EAAU;AAAA;AAAA,SAAgH;AAAA,wBAC5H,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,SAAS,MAAM,UAAA,CAAW,QAAA,CAAS,WAAW,KAAK,CAAC,CAAA;AAAA,YAC1D,SAAA,EAAU,iGAAA;AAAA,YAAkG,QAAA,EAAA;AAAA;AAAA;AAE9G,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAAM,IAAA,EAAK,QAAA;AAAA,YAAS,GAAA,EAAI,GAAA;AAAA,YAAI,GAAA,EAAI,KAAA;AAAA,YAAM,KAAA,EAAO,WAAA;AAAA,YAAa,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACrG,SAAA,EAAU;AAAA;AAAA,SAAgH;AAAA,wBAC5H,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,SAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,KAAK,EAAE,CAAA;AAAA,YACxD,SAAA,EAAU,iGAAA;AAAA,YAAkG,QAAA,EAAA;AAAA;AAAA;AAE9G,OAAA,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,sBAEtC,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAAO,OAAA,EAAS,WAAA;AAAA,UACf,SAAA,EAAU,iGAAA;AAAA,UAAkG,QAAA,EAAA;AAAA;AAAA,OAE9G;AAAA,sBAEA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,2BAGrC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA4B,KAAA,EAAO,SAAA,GAAY,KAAK,oBAAA,EACjE,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YACzD,SAAA,EAAW,CAAA,sDAAA,EAAyD,YAAA,CAAa,IAAA,GAAO,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAE7M;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YAC3D,SAAA,EAAW,CAAA,mDAAA,EAAsD,YAAA,CAAa,MAAA,GAAS,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAE5M;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAAO,OAAA,EAAS,MAAM,eAAA,CAAgB,WAAW,CAAA;AAAA,YAAG,UAAU,CAAC,SAAA;AAAA,YAC9D,SAAA,EAAW,CAAA,sDAAA,EAAyD,YAAA,CAAa,SAAA,GAAY,8BAA8B,iCAAiC,CAAA,gDAAA,CAAA;AAAA,YAAoD,QAAA,EAAA;AAAA;AAAA,SAElN;AAAA,wBACA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,aAAa,QAAA,IAAY,MAAA;AAAA,YAChC,UAAU,CAAA,CAAA,KAAK,eAAA,CAAgB,UAAA,EAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzD,UAAU,CAAC,SAAA;AAAA,YACX,SAAA,EAAU,kHAAA;AAAA,YACV,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BACrB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,8BACtB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,8BACpB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA;AAAA;AACtB,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,iBAAiB,CAAC,OAAA,KAAY,kBAAkB,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,QACpE,UAAA;AAAA,QACA,aAAA,EAAe,cAAA;AAAA,QACf,iBAAA,EAAmB,YAAA;AAAA,QACnB,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAU;AAAA;AAAA,KACZ,EACF,CAAA;AAAA,oBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oEAAA,EACZ,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,GAAA,qBAClB,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,YAC/B,eAAe,MAAM;AAAE,cAAA,aAAA,CAAc,GAAG,CAAA;AAAG,cAAA,UAAA,CAAW,MAAM,IAAI,CAAA;AAAA,YAAG,CAAA;AAAA,YACnE,eAAe,CAAA,CAAA,KAAK;AAAE,cAAA,CAAA,CAAE,cAAA,EAAe;AAAG,cAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,GAAG,CAAA;AAAA,YAAG,CAAA;AAAA,YACnF,SAAA,EAAW,CAAA,4EAAA,EACT,GAAA,KAAQ,SAAA,GACJ,kFACA,qDACN,CAAA,CAAA;AAAA,YACC,yBAAe,GAAA,mBACd,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBAAM,IAAA,EAAK,MAAA;AAAA,gBAAO,KAAA,EAAO,OAAA;AAAA,gBAAS,QAAA,EAAU,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACzE,QAAQ,MAAM,WAAA,CAAY,GAAA,EAAK,OAAA,IAAW,MAAM,IAAI,CAAA;AAAA,gBACpD,WAAW,CAAA,CAAA,KAAK;AAAE,kBAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,cAAqB,GAAA,EAAK,OAAA,IAAW,MAAM,IAAI,CAAA;AAAG,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,aAAA,CAAc,IAAI,CAAA;AAAA,gBAAG,CAAA;AAAA,gBAC/H,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB;AAAA,gBAChC,SAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAU;AAAA;AAAA,gBACV,KAAA,CAAM;AAAA,WAAA;AAAA,UAhBC,KAAA,CAAM;AAAA,SAkBpB,CAAA;AAAA,wBACD,GAAA,CAAC,YAAO,OAAA,EAAS,QAAA,EAAU,WAAU,+EAAA,EAAgF,KAAA,EAAM,aAAY,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAC1I,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAY;AAAA,SAAA,EAAM,CAAA;AAAA,QACxB,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAChB,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,CAAE,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG;AAAA,WAAA,EAAE,CAAA;AAAA,+BACtG,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAA,CAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAA,EAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,QAAQ,cAAA,CAAe,MAAA,EAAW,EAAE,qBAAA,EAAuB,GAAG;AAAA,WAAA,EAAE;AAAA,SAAA,EAC5H,CAAA;AAAA,6BAED,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,MAAA;AAAA,UAAO,QAAA;AAAA,UAAI,OAAA,CAAQ;AAAA,SAAA,EAAO;AAAA,OAAA,EACxC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"Spreadsheet-2JEK7VD7.js","sourcesContent":["import { useState, useCallback, useEffect, useRef } from 'react';\nimport EditableGrid from '../shell/EditableGrid';\nimport type { GridColumn, CellStyle } from '../shell/EditableGrid';\nimport { WindowTitle } from '../shell/Modal';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\nconst ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst DEFAULT_COLS = 10;\nconst DEFAULT_ROWS = 30;\n\nfunction colLabel(i: number): string {\n if (i < 26) return ALPHA[i];\n return ALPHA[Math.floor(i / 26) - 1] + ALPHA[i % 26];\n}\n\nfunction makeColumns(count: number): GridColumn[] {\n return Array.from({ length: count }, (_, i) => ({\n key: `col_${i}`,\n title: colLabel(i),\n width: 100,\n }));\n}\n\nfunction makeEmptyData(rows: number, cols: number): string[][] {\n return Array.from({ length: rows }, () => Array(cols).fill(''));\n}\n\ninterface Sheet {\n id: string;\n name: string;\n columns: GridColumn[];\n data: string[][];\n /** Per-cell text styling. Key: `${row}:${col}`. */\n cellStyles?: Record<string, CellStyle>;\n}\n\nfunction newSheet(name: string): Sheet {\n return {\n id: crypto.randomUUID(),\n name,\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n cellStyles: {},\n };\n}\n\nfunction parseCSV(text: string): string[][] {\n return text.split('\\n').map(line => {\n if (line.includes('\\t')) return line.split('\\t').map(s => s.trim());\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n for (const ch of line) {\n if (ch === '\"') { inQuotes = !inQuotes; continue; }\n if (ch === ',' && !inQuotes) { parts.push(current.trim()); current = ''; continue; }\n current += ch;\n }\n parts.push(current.trim());\n return parts;\n }).filter(r => r.some(c => c.trim()));\n}\n\nexport default function Spreadsheet() {\n const containerRef = useRef<HTMLDivElement>(null);\n const [sheets, setSheets] = useState<Sheet[]>([newSheet('Sheet 1')]);\n const [activeIdx, setActiveIdx] = useState(0);\n\n // Undo history — push a snapshot whenever sheets change, except when the\n // change came from undo itself.\n const undoStackRef = useRef<Sheet[][]>([]);\n const lastCommittedRef = useRef<Sheet[]>(sheets);\n const skipRecordRef = useRef(false);\n useEffect(() => {\n if (skipRecordRef.current) {\n skipRecordRef.current = false;\n } else if (lastCommittedRef.current !== sheets) {\n undoStackRef.current.push(lastCommittedRef.current);\n if (undoStackRef.current.length > 50) undoStackRef.current.shift();\n }\n lastCommittedRef.current = sheets;\n }, [sheets]);\n const undo = useCallback(() => {\n const prev = undoStackRef.current.pop();\n if (!prev) return;\n skipRecordRef.current = true;\n setSheets(prev);\n }, []);\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (!containerRef.current?.contains(document.activeElement) && !containerRef.current?.matches(':focus-within')) return;\n const isUndo = (e.ctrlKey || e.metaKey) && !e.shiftKey && (e.key === 'z' || e.key === 'Z');\n if (isUndo) {\n e.preventDefault();\n undo();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [undo]);\n const [title, setTitle] = useState('Untitled');\n const [editingTitle, setEditingTitle] = useState(false);\n const [editingTab, setEditingTab] = useState<number | null>(null);\n const [tabName, setTabName] = useState('');\n const fileRef = useRef<HTMLInputElement>(null);\n const [addColCount, setAddColCount] = useState('1');\n const [addRowCount, setAddRowCount] = useState('10');\n\n const active = sheets[activeIdx] || sheets[0];\n const data = active.data;\n const columns = active.columns;\n const cellStyles = active.cellStyles ?? {};\n const [focusedCell, setFocusedCell] = useState<{ row: number; col: number } | null>(null);\n const [selection, setSelection] = useState<{ anchor: { row: number; col: number }; end: { row: number; col: number } } | null>(null);\n\n // Cells affected by toolbar actions: full selection rectangle if non-empty,\n // otherwise the single focused cell.\n const targetCells = useCallback((): { row: number; col: number }[] => {\n if (selection) {\n const r1 = Math.min(selection.anchor.row, selection.end.row);\n const r2 = Math.max(selection.anchor.row, selection.end.row);\n const c1 = Math.min(selection.anchor.col, selection.end.col);\n const c2 = Math.max(selection.anchor.col, selection.end.col);\n const cells: { row: number; col: number }[] = [];\n for (let r = r1; r <= r2; r++) for (let c = c1; c <= c2; c++) cells.push({ row: r, col: c });\n return cells;\n }\n return focusedCell ? [focusedCell] : [];\n }, [selection, focusedCell]);\n\n const toggleCellStyle = useCallback((key: keyof CellStyle, value?: any) => {\n const cells = targetCells();\n if (cells.length === 0) return;\n setSheets(prev => prev.map((s, i) => {\n if (i !== activeIdx) return s;\n const styles = { ...(s.cellStyles ?? {}) };\n // For toggles, derive the new state from the FIRST cell so the whole\n // selection ends up consistent (rather than each cell flipping\n // independently).\n const firstKey = `${cells[0].row}:${cells[0].col}`;\n const desired = value !== undefined ? value : !((styles[firstKey] ?? {})[key] as any);\n for (const { row, col } of cells) {\n const k = `${row}:${col}`;\n styles[k] = { ...(styles[k] ?? {}), [key]: desired };\n }\n return { ...s, cellStyles: styles };\n }));\n }, [targetCells, activeIdx]);\n\n const headCell = selection ? { row: selection.anchor.row, col: selection.anchor.col } : focusedCell;\n const focusedStyle: CellStyle = headCell ? (cellStyles[`${headCell.row}:${headCell.col}`] ?? {}) : {};\n const hasTarget = !!headCell;\n\n const updateActiveSheet = useCallback((update: Partial<Sheet>) => {\n setSheets(prev => prev.map((s, i) => i === activeIdx ? { ...s, ...update } : s));\n }, [activeIdx]);\n\n const handleChange = useCallback((newData: string[][]) => {\n // Sync column count if rows were inserted/deleted with different column counts\n const maxCols = newData.reduce((m, r) => Math.max(m, r.length), 0);\n if (maxCols !== columns.length) {\n updateActiveSheet({ data: newData, columns: makeColumns(maxCols) });\n } else {\n updateActiveSheet({ data: newData });\n }\n }, [updateActiveSheet, columns.length]);\n\n // Tab management\n const addSheet = () => {\n const name = `Sheet ${sheets.length + 1}`;\n setSheets(prev => [...prev, newSheet(name)]);\n setActiveIdx(sheets.length);\n };\n\n const removeSheet = (idx: number) => {\n if (sheets.length <= 1) return;\n setSheets(prev => prev.filter((_, i) => i !== idx));\n if (activeIdx >= idx && activeIdx > 0) setActiveIdx(activeIdx - 1);\n };\n\n const renameSheet = (idx: number, name: string) => {\n setSheets(prev => prev.map((s, i) => i === idx ? { ...s, name } : s));\n setEditingTab(null);\n };\n\n // Add columns to active sheet\n const addColumns = (count: number) => {\n const newColCount = columns.length + count;\n updateActiveSheet({\n columns: makeColumns(newColCount),\n data: data.map(row => [...row, ...Array(count).fill('')]),\n });\n };\n\n // Add rows to active sheet\n const addRows = (count: number) => {\n updateActiveSheet({\n data: [...data, ...Array.from({ length: count }, () => Array(columns.length).fill(''))],\n });\n };\n\n // Clear active sheet\n const handleClear = () => {\n updateActiveSheet({\n columns: makeColumns(DEFAULT_COLS),\n data: makeEmptyData(DEFAULT_ROWS, DEFAULT_COLS),\n });\n };\n\n // Export as CSV\n const exportCSV = () => {\n const csv = data\n .filter(row => row.some(c => c.trim()))\n .map(row => row.map(cell => {\n if (cell.includes(',') || cell.includes('\"') || cell.includes('\\n'))\n return `\"${cell.replace(/\"/g, '\"\"')}\"`;\n return cell;\n }).join(','))\n .join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${title || 'spreadsheet'}.csv`;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n // Import CSV / XLSX\n const importFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const name = file.name.replace(/\\.(csv|tsv|txt|xlsx|xls|ods)$/i, '');\n\n if (/\\.(xlsx|xls|ods)$/i.test(file.name)) {\n // XLSX — dynamic import\n const byteArr = new Uint8Array(await file.arrayBuffer());\n const XLSX = await import('xlsx');\n const wb = XLSX.read(byteArr, { type: 'array' });\n const newSheets: Sheet[] = wb.SheetNames.map(sn => {\n const rows: string[][] = XLSX.utils.sheet_to_json(wb.Sheets[sn], { header: 1, defval: '' });\n const maxCols = Math.max(DEFAULT_COLS, rows.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = rows.map(r => { const nr = r.map(c => String(c ?? '')); while (nr.length < maxCols) nr.push(''); return nr; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n return { id: crypto.randomUUID(), name: sn, columns: makeColumns(maxCols), data: padded };\n });\n setSheets(newSheets);\n setActiveIdx(0);\n setTitle(name);\n } else {\n // CSV/TSV\n const text = await file.text();\n const parsed = parseCSV(text);\n if (parsed.length === 0) return;\n const maxCols = Math.max(DEFAULT_COLS, parsed.reduce((m, r) => Math.max(m, r.length), 0));\n const padded = parsed.map(r => { while (r.length < maxCols) r.push(''); return r; });\n while (padded.length < DEFAULT_ROWS) padded.push(Array(maxCols).fill(''));\n updateActiveSheet({ columns: makeColumns(maxCols), data: padded });\n setTitle(name);\n }\n\n if (fileRef.current) fileRef.current.value = '';\n };\n\n // Stats\n const allNums: number[] = [];\n data.forEach(row => row.forEach(cell => {\n const v = parseFloat(cell);\n if (!isNaN(v) && cell.trim()) allNums.push(v);\n }));\n const filledCount = data.reduce((c, row) => c + row.filter(cell => cell.trim()).length, 0);\n\n return (\n <div ref={containerRef} className=\"flex flex-col h-full\">\n <WindowTitle title={`${truncateForTitle(title || 'Untitled')} - Spreadsheets`} />\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n {editingTitle ? (\n <input type=\"text\" value={title} onChange={e => setTitle(e.target.value)}\n onBlur={() => setEditingTitle(false)}\n onKeyDown={e => { if (e.key === 'Enter') setEditingTitle(false); }}\n autoFocus\n className=\"text-sm font-medium text-gray-900 border border-gray-300 rounded px-2 py-0.5 w-40 focus:border-blue-500 focus:ring-blue-500\" />\n ) : (\n <button onClick={() => setEditingTitle(true)} className=\"text-sm font-medium text-gray-900 hover:text-blue-600 truncate max-w-[200px]\" title=\"Click to rename\">\n {title || 'Untitled'}\n </button>\n )}\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <input ref={fileRef} type=\"file\" accept=\".csv,.tsv,.txt,.xlsx,.xls,.ods\" onChange={importFile} className=\"hidden\" />\n <button onClick={() => fileRef.current?.click()}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Open\n </button>\n <button onClick={exportCSV}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Save CSV\n </button>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"50\" value={addColCount} onChange={e => setAddColCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addColumns(parseInt(addColCount) || 1)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Col\n </button>\n </div>\n <div className=\"flex items-center gap-1\">\n <input type=\"number\" min=\"1\" max=\"500\" value={addRowCount} onChange={e => setAddRowCount(e.target.value)}\n className=\"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500\" />\n <button onClick={() => addRows(parseInt(addRowCount) || 10)}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n + Row\n </button>\n </div>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n <button onClick={handleClear}\n className=\"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Clear\n </button>\n\n <div className=\"h-4 w-px bg-gray-300\" />\n\n {/* Font style panel — applies to the focused cell. */}\n <div className=\"flex items-center gap-0.5\" title={hasTarget ? '' : 'Click a cell first'}>\n <button onClick={() => toggleCellStyle('bold')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors font-bold ${focusedStyle.bold ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n B\n </button>\n <button onClick={() => toggleCellStyle('italic')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors italic ${focusedStyle.italic ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n I\n </button>\n <button onClick={() => toggleCellStyle('underline')} disabled={!hasTarget}\n className={`px-2 py-1 text-xs rounded transition-colors underline ${focusedStyle.underline ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-200'} disabled:opacity-40 disabled:cursor-not-allowed`}>\n U\n </button>\n <select\n value={focusedStyle.fontSize ?? 'base'}\n onChange={e => toggleCellStyle('fontSize', e.target.value)}\n disabled={!hasTarget}\n className=\"ml-1 text-xs border border-gray-300 rounded px-1 py-0.5 bg-white disabled:opacity-40 disabled:cursor-not-allowed\">\n <option value=\"sm\">XS</option>\n <option value=\"base\">S</option>\n <option value=\"lg\">M</option>\n <option value=\"xl\">L</option>\n </select>\n </div>\n </div>\n\n {/* Grid */}\n <div className=\"flex-1 min-h-0\">\n <EditableGrid\n columns={columns}\n data={data}\n onChange={handleChange}\n onColumnsChange={(newCols) => updateActiveSheet({ columns: newCols })}\n cellStyles={cellStyles}\n onFocusChange={setFocusedCell}\n onSelectionChange={setSelection}\n minRows={DEFAULT_ROWS}\n maxHeight=\"100%\"\n />\n </div>\n\n {/* Sheet tabs + status bar */}\n <div className=\"flex items-center border-t border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"flex items-center gap-0.5 px-1 py-1 overflow-x-auto flex-1 min-w-0\">\n {sheets.map((sheet, idx) => (\n <button key={sheet.id}\n onClick={() => setActiveIdx(idx)}\n onDoubleClick={() => { setEditingTab(idx); setTabName(sheet.name); }}\n onContextMenu={e => { e.preventDefault(); if (sheets.length > 1) removeSheet(idx); }}\n className={`px-3 py-1 text-xs font-medium rounded-b whitespace-nowrap transition-colors ${\n idx === activeIdx\n ? 'bg-white text-blue-700 border border-t-0 border-gray-300 -mt-px relative z-10'\n : 'text-gray-500 hover:text-gray-700 hover:bg-gray-100'\n }`}>\n {editingTab === idx ? (\n <input type=\"text\" value={tabName} onChange={e => setTabName(e.target.value)}\n onBlur={() => renameSheet(idx, tabName || sheet.name)}\n onKeyDown={e => { if (e.key === 'Enter') renameSheet(idx, tabName || sheet.name); if (e.key === 'Escape') setEditingTab(null); }}\n onClick={e => e.stopPropagation()}\n autoFocus\n className=\"w-20 text-xs border border-blue-400 rounded px-1 py-0 focus:ring-0 focus:outline-none\" />\n ) : sheet.name}\n </button>\n ))}\n <button onClick={addSheet} className=\"px-2 py-1 text-xs text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded\" title=\"Add sheet\">+</button>\n </div>\n\n <div className=\"flex items-center gap-4 px-3 py-1 text-xs text-gray-500 shrink-0 border-l border-gray-200\">\n <span>{filledCount} cells</span>\n {allNums.length > 0 && (\n <>\n <span>Sum: {allNums.reduce((s, v) => s + v, 0).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n <span>Avg: {(allNums.reduce((s, v) => s + v, 0) / allNums.length).toLocaleString(undefined, { maximumFractionDigits: 2 })}</span>\n </>\n )}\n <span>{data.length} × {columns.length}</span>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { fetchCityWeather, getCondition, AVAILABLE_CITIES, toFahrenheit } from './chunk-7CCHEEYC.js';
2
2
  import { useShellPrefs } from './chunk-36VM54SC.js';
3
- import { loadAppearance, WidgetSettingsModal } from './chunk-UK2AA3J6.js';
4
- import { useWidgetSettings } from './chunk-7M3BBAHQ.js';
3
+ import { loadAppearance, WidgetSettingsModal } from './chunk-P5YKRJIW.js';
4
+ import { useWidgetSettings } from './chunk-VVXXHR5V.js';
5
5
  import './chunk-PLGHQ7QW.js';
6
6
  import { useState, useEffect, useCallback } from 'react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -420,5 +420,5 @@ function Weather() {
420
420
  }
421
421
 
422
422
  export { Weather as default };
423
- //# sourceMappingURL=Weather-YXSCSPQT.js.map
424
- //# sourceMappingURL=Weather-YXSCSPQT.js.map
423
+ //# sourceMappingURL=Weather-PETTCLBX.js.map
424
+ //# sourceMappingURL=Weather-PETTCLBX.js.map