react-os-shell 0.7.2 → 0.7.3

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.
@@ -1,6 +1,6 @@
1
1
  import { setEmailUnreadCount } from './chunk-PDFQNHW7.js';
2
- import { formatDate, formatDateTime } from './chunk-NSU7OHPC.js';
3
2
  import { useMailAuth, getMailClient } from './chunk-VBFB3ZIN.js';
3
+ import { formatDate, formatDateTime } from './chunk-NSU7OHPC.js';
4
4
  import { toast_default } from './chunk-WIJ45SYD.js';
5
5
  import { Modal, ModalActions } from './chunk-3T6SQ4UO.js';
6
6
  import './chunk-UBN4IUDE.js';
@@ -471,5 +471,5 @@ function extractError(err) {
471
471
  }
472
472
 
473
473
  export { Email as default };
474
- //# sourceMappingURL=Email-GTGL7CW5.js.map
475
- //# sourceMappingURL=Email-GTGL7CW5.js.map
474
+ //# sourceMappingURL=Email-ZUDCRZKB.js.map
475
+ //# sourceMappingURL=Email-ZUDCRZKB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/Email.tsx"],"names":[],"mappings":"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","file":"Email-GTGL7CW5.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useMailAuth from '../hooks/useMailAuth';\nimport { setEmailUnreadCount } from '../hooks/useEmailUnread';\nimport { getMailClient } from '../api/mailClient';\nimport toast from '../shell/toast';\nimport Modal, { ModalActions } from '../shell/Modal';\nimport { formatDate, formatDateTime } from '../utils/date';\n\ninterface Folder {\n path: string;\n name: string;\n delimiter: string;\n specialUse: 'inbox' | 'sent' | 'drafts' | 'trash' | 'junk' | 'archive' | 'flagged' | null;\n subscribed: boolean;\n unreadCount: number;\n totalCount: number;\n}\n\ninterface Address { name: string; address: string }\n\ninterface MessageListItem {\n uid: number;\n threadId: string;\n from: Address;\n to: Address[];\n subject: string;\n snippet: string;\n date: string;\n flags: string[];\n hasAttachments: boolean;\n inReplyTo: string | null;\n references: string[];\n}\n\ninterface AttachmentInfo {\n partId: string;\n filename: string;\n contentType: string;\n size: number;\n contentId: string | null;\n}\n\ninterface MessageDetail extends Omit<MessageListItem, 'snippet' | 'hasAttachments'> {\n cc: Address[];\n text: string | null;\n html: string | null;\n attachments: AttachmentInfo[];\n}\n\nconst SMART_VIEWS: Array<{ key: string; label: string; icon: string }> = [\n { key: '__inbox__', label: 'Inbox', icon: '📥' },\n { key: '__starred__', label: 'Starred', icon: '⭐' },\n { key: '__unread__', label: 'Unread', icon: '●' },\n { key: '__drafts__', label: 'Drafts', icon: '📝' },\n { key: '__sent__', label: 'Sent', icon: '📤' },\n { key: '__trash__', label: 'Trash', icon: '🗑' },\n { key: '__junk__', label: 'Spam', icon: '⚠' },\n];\n\nfunction resolveSmartView(key: string, folders: Folder[]): string {\n if (key === '__inbox__') return folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n if (key === '__sent__') return folders.find(f => f.specialUse === 'sent')?.path || 'Sent';\n if (key === '__drafts__') return folders.find(f => f.specialUse === 'drafts')?.path || 'Drafts';\n if (key === '__trash__') return folders.find(f => f.specialUse === 'trash')?.path || 'Trash';\n if (key === '__junk__') return folders.find(f => f.specialUse === 'junk')?.path || 'Junk';\n return key; // __starred__, __unread__ → handled server-side\n}\n\nexport default function Email() {\n const { isConnected, serverReachable } = useMailAuth();\n\n const [folders, setFolders] = useState<Folder[]>([]);\n const [selectedKey, setSelectedKey] = useState<string>('__inbox__');\n const [messages, setMessages] = useState<MessageListItem[]>([]);\n const [selectedUid, setSelectedUid] = useState<number | null>(null);\n const [detail, setDetail] = useState<MessageDetail | null>(null);\n const [loadingFolders, setLoadingFolders] = useState(false);\n const [loadingList, setLoadingList] = useState(false);\n const [loadingDetail, setLoadingDetail] = useState(false);\n const [composeOpen, setComposeOpen] = useState(false);\n const [composeDraft, setComposeDraft] = useState<DraftState | null>(null);\n const [serverError, setServerError] = useState<string | null>(null);\n\n const selectedFolderPath = useMemo(() => resolveSmartView(selectedKey, folders), [selectedKey, folders]);\n\n const refreshFolders = useCallback(async () => {\n if (!isConnected) return;\n setLoadingFolders(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ folders: Folder[] }>('/api/mail/folders');\n setFolders(res.data.folders);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingFolders(false);\n }\n }, [isConnected]);\n\n const refreshList = useCallback(async () => {\n if (!isConnected) return;\n setLoadingList(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ messages: MessageListItem[] }>('/api/mail/messages', {\n params: { folder: selectedFolderPath, page: 0, pageSize: 50 },\n });\n setMessages(res.data.messages);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingList(false);\n }\n }, [isConnected, selectedFolderPath]);\n\n useEffect(() => {\n refreshFolders();\n }, [refreshFolders]);\n\n useEffect(() => {\n refreshList();\n setDetail(null);\n setSelectedUid(null);\n }, [refreshList]);\n\n // Poll unread counts every 30s and push to the badge.\n const unreadPollRef = useRef<number | null>(null);\n useEffect(() => {\n if (!isConnected) return;\n async function tick() {\n try {\n const res = await getMailClient().get<{ counts: Record<string, number> }>('/api/mail/unread-counts');\n const inboxFolder = folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n setEmailUnreadCount(res.data.counts[inboxFolder] || 0);\n setFolders(prev =>\n prev.map(f => ({ ...f, unreadCount: res.data.counts[f.path] ?? f.unreadCount }))\n );\n } catch {\n /* ignore polling errors */\n }\n }\n tick();\n unreadPollRef.current = window.setInterval(tick, 30_000) as unknown as number;\n return () => {\n if (unreadPollRef.current) window.clearInterval(unreadPollRef.current);\n };\n }, [isConnected, folders]);\n\n const openMessage = useCallback(async (item: MessageListItem) => {\n setSelectedUid(item.uid);\n setLoadingDetail(true);\n try {\n const res = await getMailClient().get<MessageDetail>(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}`\n );\n setDetail(res.data);\n if (!item.flags.includes('\\\\Seen')) {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n { add: ['\\\\Seen'] }\n );\n setMessages(prev =>\n prev.map(m => (m.uid === item.uid ? { ...m, flags: [...m.flags, '\\\\Seen'] } : m))\n );\n }\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setLoadingDetail(false);\n }\n }, [selectedFolderPath]);\n\n const toggleStar = useCallback(async (item: MessageListItem) => {\n const isFlagged = item.flags.includes('\\\\Flagged');\n try {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n isFlagged ? { remove: ['\\\\Flagged'] } : { add: ['\\\\Flagged'] }\n );\n setMessages(prev =>\n prev.map(m =>\n m.uid === item.uid\n ? {\n ...m,\n flags: isFlagged ? m.flags.filter(f => f !== '\\\\Flagged') : [...m.flags, '\\\\Flagged'],\n }\n : m\n )\n );\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath]);\n\n const trashMessage = useCallback(async (uid: number) => {\n try {\n await getMailClient().delete(`/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${uid}`);\n setMessages(prev => prev.filter(m => m.uid !== uid));\n if (selectedUid === uid) {\n setDetail(null);\n setSelectedUid(null);\n }\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath, selectedUid]);\n\n function openCompose(initial?: DraftState) {\n setComposeDraft(initial ?? { to: '', cc: '', subject: '', body: '' });\n setComposeOpen(true);\n }\n\n if (serverReachable === false) {\n return (\n <EmptyState\n title=\"Mail server unreachable\"\n body=\"The bridge server is not responding. Start it with `npm run server:dev`, then retry.\"\n action={<button onClick={() => window.location.reload()} className=\"px-4 py-2 bg-gray-900 text-white rounded text-sm\">Retry</button>}\n />\n );\n }\n\n if (!isConnected) {\n return (\n <EmptyState\n title=\"Connect your mail account\"\n body=\"Open the Mail & Calendar button in the taskbar to connect via IMAP/SMTP/CalDAV.\"\n />\n );\n }\n\n return (\n <div className=\"flex h-full text-sm\">\n {/* Sidebar */}\n <aside className=\"w-56 shrink-0 border-r border-gray-200 overflow-y-auto bg-gray-50/60\">\n <div className=\"p-3\">\n <button\n onClick={() => openCompose()}\n className=\"w-full bg-gray-900 text-white rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-800\"\n >\n Compose\n </button>\n </div>\n <div className=\"px-2\">\n {SMART_VIEWS.map(view => {\n const folder = view.key === '__inbox__'\n ? folders.find(f => f.specialUse === 'inbox')\n : view.key === '__sent__'\n ? folders.find(f => f.specialUse === 'sent')\n : view.key === '__drafts__'\n ? folders.find(f => f.specialUse === 'drafts')\n : view.key === '__trash__'\n ? folders.find(f => f.specialUse === 'trash')\n : view.key === '__junk__'\n ? folders.find(f => f.specialUse === 'junk')\n : null;\n const unread = folder?.unreadCount ?? 0;\n const active = selectedKey === view.key;\n return (\n <button\n key={view.key}\n onClick={() => setSelectedKey(view.key)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n >\n <span className=\"w-5 text-center text-base leading-none\">{view.icon}</span>\n <span className=\"flex-1 truncate\">{view.label}</span>\n {unread > 0 && <span className=\"text-[10px] bg-blue-500 text-white rounded-full px-1.5\">{unread}</span>}\n </button>\n );\n })}\n </div>\n <div className=\"px-3 mt-4 mb-1 text-[10px] uppercase tracking-wider text-gray-500\">Folders</div>\n <div className=\"px-2 pb-3\">\n {folders\n .filter(f => !f.specialUse || f.specialUse === 'archive' || f.specialUse === 'flagged')\n .filter(f => f.path.toUpperCase() !== 'INBOX')\n .map(f => {\n const active = selectedKey === f.path;\n return (\n <button\n key={f.path}\n onClick={() => setSelectedKey(f.path)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n title={f.path}\n >\n <span className=\"w-5 text-center text-base leading-none\">📁</span>\n <span className=\"flex-1 truncate\">{f.name}</span>\n {f.unreadCount > 0 && <span className=\"text-[10px] bg-gray-300 text-gray-800 rounded-full px-1.5\">{f.unreadCount}</span>}\n </button>\n );\n })}\n </div>\n </aside>\n\n {/* Message list */}\n <section className=\"w-80 shrink-0 border-r border-gray-200 flex flex-col\">\n <header className=\"px-3 py-2 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold\">\n {SMART_VIEWS.find(v => v.key === selectedKey)?.label || selectedKey}\n </h2>\n <button\n onClick={() => { refreshList(); refreshFolders(); }}\n className=\"text-xs text-gray-600 hover:text-gray-900\"\n disabled={loadingList || loadingFolders}\n >\n {loadingList || loadingFolders ? '…' : 'Refresh'}\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {loadingList && messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">Loading…</div>\n ) : messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">No messages</div>\n ) : (\n messages.map(msg => (\n <MessageRow\n key={msg.uid}\n msg={msg}\n active={selectedUid === msg.uid}\n onOpen={() => openMessage(msg)}\n onStar={() => toggleStar(msg)}\n />\n ))\n )}\n </div>\n </section>\n\n {/* Detail */}\n <section className=\"flex-1 overflow-y-auto\">\n {detail ? (\n <MessageDetailView\n detail={detail}\n folderPath={selectedFolderPath}\n loading={loadingDetail}\n onReply={() => openCompose({\n to: detail.from.address,\n cc: '',\n subject: detail.subject.startsWith('Re:') ? detail.subject : `Re: ${detail.subject}`,\n body: '',\n inReplyTo: detail.threadId,\n references: detail.references,\n })}\n onTrash={() => trashMessage(detail.uid)}\n />\n ) : (\n <div className=\"h-full grid place-items-center text-xs text-gray-400\">\n Select a message\n </div>\n )}\n </section>\n\n {composeOpen && composeDraft && (\n <ComposeModal\n open={composeOpen}\n initial={composeDraft}\n onClose={() => setComposeOpen(false)}\n onSent={() => {\n setComposeOpen(false);\n toast.success('Message sent');\n refreshList();\n }}\n />\n )}\n\n {serverError && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-red-50 border border-red-200 text-red-800 px-3 py-1 text-xs rounded\">\n {serverError}\n </div>\n )}\n </div>\n );\n}\n\nfunction MessageRow({ msg, active, onOpen, onStar }: {\n msg: MessageListItem;\n active: boolean;\n onOpen: () => void;\n onStar: () => void;\n}) {\n const unread = !msg.flags.includes('\\\\Seen');\n const starred = msg.flags.includes('\\\\Flagged');\n return (\n <div\n onClick={onOpen}\n className={`px-3 py-2 border-b border-gray-100 cursor-pointer ${active ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <button\n onClick={(e) => { e.stopPropagation(); onStar(); }}\n className={`text-xs ${starred ? 'text-yellow-500' : 'text-gray-300 hover:text-gray-500'}`}\n title={starred ? 'Unstar' : 'Star'}\n >\n ★\n </button>\n <p className={`text-xs flex-1 truncate ${unread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>\n {msg.from.name || msg.from.address}\n </p>\n <span className=\"text-[10px] text-gray-400 shrink-0\">{formatDate(msg.date)}</span>\n </div>\n <p className={`text-xs truncate ${unread ? 'font-medium text-gray-900' : 'text-gray-600'}`}>\n {msg.subject || '(no subject)'}\n </p>\n {msg.hasAttachments && <span className=\"text-[10px] text-gray-400\">📎 attachment</span>}\n </div>\n );\n}\n\nfunction MessageDetailView({\n detail,\n folderPath,\n loading,\n onReply,\n onTrash,\n}: {\n detail: MessageDetail;\n folderPath: string;\n loading: boolean;\n onReply: () => void;\n onTrash: () => void;\n}) {\n const baseUrl = `/api/mail/messages/${encodeURIComponent(folderPath)}/${detail.uid}/attachments`;\n return (\n <div>\n <header className=\"px-6 py-4 border-b border-gray-200\">\n <h1 className=\"text-lg font-semibold mb-2\">{detail.subject || '(no subject)'}</h1>\n <div className=\"flex items-center justify-between text-xs text-gray-600\">\n <div>\n <div><strong>{detail.from.name || detail.from.address}</strong> &lt;{detail.from.address}&gt;</div>\n <div>to {detail.to.map(t => t.address).join(', ')}</div>\n {detail.cc.length > 0 && <div>cc {detail.cc.map(t => t.address).join(', ')}</div>}\n <div className=\"text-gray-400 mt-1\">{formatDateTime(detail.date)}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={onReply} className=\"px-3 py-1 text-xs border border-gray-300 rounded hover:bg-gray-50\">Reply</button>\n <button onClick={onTrash} className=\"px-3 py-1 text-xs border border-red-200 text-red-700 rounded hover:bg-red-50\">Trash</button>\n </div>\n </div>\n </header>\n <article className=\"px-6 py-4\">\n {loading ? (\n <div className=\"text-xs text-gray-500\">Loading…</div>\n ) : detail.html ? (\n <div className=\"prose prose-sm max-w-none\" dangerouslySetInnerHTML={{ __html: detail.html }} />\n ) : (\n <pre className=\"whitespace-pre-wrap text-sm font-sans\">{detail.text || '(empty)'}</pre>\n )}\n </article>\n {detail.attachments.length > 0 && (\n <section className=\"px-6 pb-6\">\n <h3 className=\"text-xs font-semibold text-gray-700 mb-2\">Attachments</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {detail.attachments.map(att => (\n <a\n key={att.partId}\n href={`${getMailClient().defaults.baseURL}${baseUrl}/${encodeURIComponent(att.partId)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-2 border border-gray-200 rounded px-3 py-2 text-xs hover:bg-gray-50\"\n >\n <span>📎</span>\n <span className=\"flex-1 truncate\">{att.filename}</span>\n <span className=\"text-gray-400\">{(att.size / 1024).toFixed(1)}KB</span>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n );\n}\n\ninterface DraftState {\n to: string;\n cc: string;\n subject: string;\n body: string;\n inReplyTo?: string;\n references?: string[];\n}\n\nfunction ComposeModal({\n open,\n initial,\n onClose,\n onSent,\n}: {\n open: boolean;\n initial: DraftState;\n onClose: () => void;\n onSent: () => void;\n}) {\n const [draft, setDraft] = useState<DraftState>(initial);\n const [sending, setSending] = useState(false);\n\n async function send() {\n setSending(true);\n try {\n const toList = draft.to.split(',').map(s => s.trim()).filter(Boolean);\n const ccList = draft.cc.split(',').map(s => s.trim()).filter(Boolean);\n if (toList.length === 0) {\n toast.error('At least one recipient required');\n return;\n }\n await getMailClient().post('/api/mail/send', {\n to: toList,\n cc: ccList.length ? ccList : undefined,\n subject: draft.subject,\n text: draft.body,\n inReplyTo: draft.inReplyTo,\n references: draft.references,\n saveToSent: true,\n });\n onSent();\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setSending(false);\n }\n }\n\n return (\n <Modal open={open} onClose={onClose} title=\"New message\" size=\"lg\">\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n placeholder=\"To\"\n value={draft.to}\n onChange={e => setDraft({ ...draft, to: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Cc (optional)\"\n value={draft.cc}\n onChange={e => setDraft({ ...draft, cc: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Subject\"\n value={draft.subject}\n onChange={e => setDraft({ ...draft, subject: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <textarea\n rows={12}\n placeholder=\"Write your message…\"\n value={draft.body}\n onChange={e => setDraft({ ...draft, body: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm font-mono\"\n />\n </div>\n <ModalActions>\n <button\n onClick={send}\n disabled={sending}\n className=\"bg-gray-900 text-white rounded-lg px-5 py-2 text-sm font-medium hover:bg-gray-800 disabled:opacity-50\"\n >\n {sending ? 'Sending…' : 'Send'}\n </button>\n </ModalActions>\n </Modal>\n );\n}\n\nfunction EmptyState({ title, body, action }: { title: string; body: string; action?: React.ReactNode }) {\n return (\n <div className=\"h-full grid place-items-center p-8 text-center\">\n <div className=\"max-w-sm\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">{title}</h2>\n <p className=\"text-sm text-gray-600\">{body}</p>\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n </div>\n );\n}\n\nfunction extractError(err: unknown): string {\n const response = (err as { response?: { data?: { error?: string } } }).response;\n if (response?.data?.error) return response.data.error;\n if (err instanceof Error) return err.message;\n return 'Unknown error';\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/Email.tsx"],"names":[],"mappings":"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","file":"Email-ZUDCRZKB.js","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useMailAuth from '../hooks/useMailAuth';\nimport { setEmailUnreadCount } from '../hooks/useEmailUnread';\nimport { getMailClient } from '../api/mailClient';\nimport toast from '../shell/toast';\nimport Modal, { ModalActions } from '../shell/Modal';\nimport { formatDate, formatDateTime } from '../utils/date';\n\ninterface Folder {\n path: string;\n name: string;\n delimiter: string;\n specialUse: 'inbox' | 'sent' | 'drafts' | 'trash' | 'junk' | 'archive' | 'flagged' | null;\n subscribed: boolean;\n unreadCount: number;\n totalCount: number;\n}\n\ninterface Address { name: string; address: string }\n\ninterface MessageListItem {\n uid: number;\n threadId: string;\n from: Address;\n to: Address[];\n subject: string;\n snippet: string;\n date: string;\n flags: string[];\n hasAttachments: boolean;\n inReplyTo: string | null;\n references: string[];\n}\n\ninterface AttachmentInfo {\n partId: string;\n filename: string;\n contentType: string;\n size: number;\n contentId: string | null;\n}\n\ninterface MessageDetail extends Omit<MessageListItem, 'snippet' | 'hasAttachments'> {\n cc: Address[];\n text: string | null;\n html: string | null;\n attachments: AttachmentInfo[];\n}\n\nconst SMART_VIEWS: Array<{ key: string; label: string; icon: string }> = [\n { key: '__inbox__', label: 'Inbox', icon: '📥' },\n { key: '__starred__', label: 'Starred', icon: '⭐' },\n { key: '__unread__', label: 'Unread', icon: '●' },\n { key: '__drafts__', label: 'Drafts', icon: '📝' },\n { key: '__sent__', label: 'Sent', icon: '📤' },\n { key: '__trash__', label: 'Trash', icon: '🗑' },\n { key: '__junk__', label: 'Spam', icon: '⚠' },\n];\n\nfunction resolveSmartView(key: string, folders: Folder[]): string {\n if (key === '__inbox__') return folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n if (key === '__sent__') return folders.find(f => f.specialUse === 'sent')?.path || 'Sent';\n if (key === '__drafts__') return folders.find(f => f.specialUse === 'drafts')?.path || 'Drafts';\n if (key === '__trash__') return folders.find(f => f.specialUse === 'trash')?.path || 'Trash';\n if (key === '__junk__') return folders.find(f => f.specialUse === 'junk')?.path || 'Junk';\n return key; // __starred__, __unread__ → handled server-side\n}\n\nexport default function Email() {\n const { isConnected, serverReachable } = useMailAuth();\n\n const [folders, setFolders] = useState<Folder[]>([]);\n const [selectedKey, setSelectedKey] = useState<string>('__inbox__');\n const [messages, setMessages] = useState<MessageListItem[]>([]);\n const [selectedUid, setSelectedUid] = useState<number | null>(null);\n const [detail, setDetail] = useState<MessageDetail | null>(null);\n const [loadingFolders, setLoadingFolders] = useState(false);\n const [loadingList, setLoadingList] = useState(false);\n const [loadingDetail, setLoadingDetail] = useState(false);\n const [composeOpen, setComposeOpen] = useState(false);\n const [composeDraft, setComposeDraft] = useState<DraftState | null>(null);\n const [serverError, setServerError] = useState<string | null>(null);\n\n const selectedFolderPath = useMemo(() => resolveSmartView(selectedKey, folders), [selectedKey, folders]);\n\n const refreshFolders = useCallback(async () => {\n if (!isConnected) return;\n setLoadingFolders(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ folders: Folder[] }>('/api/mail/folders');\n setFolders(res.data.folders);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingFolders(false);\n }\n }, [isConnected]);\n\n const refreshList = useCallback(async () => {\n if (!isConnected) return;\n setLoadingList(true);\n setServerError(null);\n try {\n const res = await getMailClient().get<{ messages: MessageListItem[] }>('/api/mail/messages', {\n params: { folder: selectedFolderPath, page: 0, pageSize: 50 },\n });\n setMessages(res.data.messages);\n } catch (err) {\n setServerError(extractError(err));\n } finally {\n setLoadingList(false);\n }\n }, [isConnected, selectedFolderPath]);\n\n useEffect(() => {\n refreshFolders();\n }, [refreshFolders]);\n\n useEffect(() => {\n refreshList();\n setDetail(null);\n setSelectedUid(null);\n }, [refreshList]);\n\n // Poll unread counts every 30s and push to the badge.\n const unreadPollRef = useRef<number | null>(null);\n useEffect(() => {\n if (!isConnected) return;\n async function tick() {\n try {\n const res = await getMailClient().get<{ counts: Record<string, number> }>('/api/mail/unread-counts');\n const inboxFolder = folders.find(f => f.specialUse === 'inbox')?.path || 'INBOX';\n setEmailUnreadCount(res.data.counts[inboxFolder] || 0);\n setFolders(prev =>\n prev.map(f => ({ ...f, unreadCount: res.data.counts[f.path] ?? f.unreadCount }))\n );\n } catch {\n /* ignore polling errors */\n }\n }\n tick();\n unreadPollRef.current = window.setInterval(tick, 30_000) as unknown as number;\n return () => {\n if (unreadPollRef.current) window.clearInterval(unreadPollRef.current);\n };\n }, [isConnected, folders]);\n\n const openMessage = useCallback(async (item: MessageListItem) => {\n setSelectedUid(item.uid);\n setLoadingDetail(true);\n try {\n const res = await getMailClient().get<MessageDetail>(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}`\n );\n setDetail(res.data);\n if (!item.flags.includes('\\\\Seen')) {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n { add: ['\\\\Seen'] }\n );\n setMessages(prev =>\n prev.map(m => (m.uid === item.uid ? { ...m, flags: [...m.flags, '\\\\Seen'] } : m))\n );\n }\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setLoadingDetail(false);\n }\n }, [selectedFolderPath]);\n\n const toggleStar = useCallback(async (item: MessageListItem) => {\n const isFlagged = item.flags.includes('\\\\Flagged');\n try {\n await getMailClient().post(\n `/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${item.uid}/flags`,\n isFlagged ? { remove: ['\\\\Flagged'] } : { add: ['\\\\Flagged'] }\n );\n setMessages(prev =>\n prev.map(m =>\n m.uid === item.uid\n ? {\n ...m,\n flags: isFlagged ? m.flags.filter(f => f !== '\\\\Flagged') : [...m.flags, '\\\\Flagged'],\n }\n : m\n )\n );\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath]);\n\n const trashMessage = useCallback(async (uid: number) => {\n try {\n await getMailClient().delete(`/api/mail/messages/${encodeURIComponent(selectedFolderPath)}/${uid}`);\n setMessages(prev => prev.filter(m => m.uid !== uid));\n if (selectedUid === uid) {\n setDetail(null);\n setSelectedUid(null);\n }\n } catch (err) {\n toast.error(extractError(err));\n }\n }, [selectedFolderPath, selectedUid]);\n\n function openCompose(initial?: DraftState) {\n setComposeDraft(initial ?? { to: '', cc: '', subject: '', body: '' });\n setComposeOpen(true);\n }\n\n if (serverReachable === false) {\n return (\n <EmptyState\n title=\"Mail server unreachable\"\n body=\"The bridge server is not responding. Start it with `npm run server:dev`, then retry.\"\n action={<button onClick={() => window.location.reload()} className=\"px-4 py-2 bg-gray-900 text-white rounded text-sm\">Retry</button>}\n />\n );\n }\n\n if (!isConnected) {\n return (\n <EmptyState\n title=\"Connect your mail account\"\n body=\"Open the Mail & Calendar button in the taskbar to connect via IMAP/SMTP/CalDAV.\"\n />\n );\n }\n\n return (\n <div className=\"flex h-full text-sm\">\n {/* Sidebar */}\n <aside className=\"w-56 shrink-0 border-r border-gray-200 overflow-y-auto bg-gray-50/60\">\n <div className=\"p-3\">\n <button\n onClick={() => openCompose()}\n className=\"w-full bg-gray-900 text-white rounded-lg px-3 py-2 text-sm font-medium hover:bg-gray-800\"\n >\n Compose\n </button>\n </div>\n <div className=\"px-2\">\n {SMART_VIEWS.map(view => {\n const folder = view.key === '__inbox__'\n ? folders.find(f => f.specialUse === 'inbox')\n : view.key === '__sent__'\n ? folders.find(f => f.specialUse === 'sent')\n : view.key === '__drafts__'\n ? folders.find(f => f.specialUse === 'drafts')\n : view.key === '__trash__'\n ? folders.find(f => f.specialUse === 'trash')\n : view.key === '__junk__'\n ? folders.find(f => f.specialUse === 'junk')\n : null;\n const unread = folder?.unreadCount ?? 0;\n const active = selectedKey === view.key;\n return (\n <button\n key={view.key}\n onClick={() => setSelectedKey(view.key)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n >\n <span className=\"w-5 text-center text-base leading-none\">{view.icon}</span>\n <span className=\"flex-1 truncate\">{view.label}</span>\n {unread > 0 && <span className=\"text-[10px] bg-blue-500 text-white rounded-full px-1.5\">{unread}</span>}\n </button>\n );\n })}\n </div>\n <div className=\"px-3 mt-4 mb-1 text-[10px] uppercase tracking-wider text-gray-500\">Folders</div>\n <div className=\"px-2 pb-3\">\n {folders\n .filter(f => !f.specialUse || f.specialUse === 'archive' || f.specialUse === 'flagged')\n .filter(f => f.path.toUpperCase() !== 'INBOX')\n .map(f => {\n const active = selectedKey === f.path;\n return (\n <button\n key={f.path}\n onClick={() => setSelectedKey(f.path)}\n className={`w-full flex items-center gap-2 px-2 py-1.5 rounded text-left text-sm ${active ? 'bg-gray-200 font-medium' : 'hover:bg-gray-100'}`}\n title={f.path}\n >\n <span className=\"w-5 text-center text-base leading-none\">📁</span>\n <span className=\"flex-1 truncate\">{f.name}</span>\n {f.unreadCount > 0 && <span className=\"text-[10px] bg-gray-300 text-gray-800 rounded-full px-1.5\">{f.unreadCount}</span>}\n </button>\n );\n })}\n </div>\n </aside>\n\n {/* Message list */}\n <section className=\"w-80 shrink-0 border-r border-gray-200 flex flex-col\">\n <header className=\"px-3 py-2 border-b border-gray-200 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold\">\n {SMART_VIEWS.find(v => v.key === selectedKey)?.label || selectedKey}\n </h2>\n <button\n onClick={() => { refreshList(); refreshFolders(); }}\n className=\"text-xs text-gray-600 hover:text-gray-900\"\n disabled={loadingList || loadingFolders}\n >\n {loadingList || loadingFolders ? '…' : 'Refresh'}\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {loadingList && messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">Loading…</div>\n ) : messages.length === 0 ? (\n <div className=\"p-4 text-center text-xs text-gray-500\">No messages</div>\n ) : (\n messages.map(msg => (\n <MessageRow\n key={msg.uid}\n msg={msg}\n active={selectedUid === msg.uid}\n onOpen={() => openMessage(msg)}\n onStar={() => toggleStar(msg)}\n />\n ))\n )}\n </div>\n </section>\n\n {/* Detail */}\n <section className=\"flex-1 overflow-y-auto\">\n {detail ? (\n <MessageDetailView\n detail={detail}\n folderPath={selectedFolderPath}\n loading={loadingDetail}\n onReply={() => openCompose({\n to: detail.from.address,\n cc: '',\n subject: detail.subject.startsWith('Re:') ? detail.subject : `Re: ${detail.subject}`,\n body: '',\n inReplyTo: detail.threadId,\n references: detail.references,\n })}\n onTrash={() => trashMessage(detail.uid)}\n />\n ) : (\n <div className=\"h-full grid place-items-center text-xs text-gray-400\">\n Select a message\n </div>\n )}\n </section>\n\n {composeOpen && composeDraft && (\n <ComposeModal\n open={composeOpen}\n initial={composeDraft}\n onClose={() => setComposeOpen(false)}\n onSent={() => {\n setComposeOpen(false);\n toast.success('Message sent');\n refreshList();\n }}\n />\n )}\n\n {serverError && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 bg-red-50 border border-red-200 text-red-800 px-3 py-1 text-xs rounded\">\n {serverError}\n </div>\n )}\n </div>\n );\n}\n\nfunction MessageRow({ msg, active, onOpen, onStar }: {\n msg: MessageListItem;\n active: boolean;\n onOpen: () => void;\n onStar: () => void;\n}) {\n const unread = !msg.flags.includes('\\\\Seen');\n const starred = msg.flags.includes('\\\\Flagged');\n return (\n <div\n onClick={onOpen}\n className={`px-3 py-2 border-b border-gray-100 cursor-pointer ${active ? 'bg-blue-50' : 'hover:bg-gray-50'}`}\n >\n <div className=\"flex items-center gap-2 mb-0.5\">\n <button\n onClick={(e) => { e.stopPropagation(); onStar(); }}\n className={`text-xs ${starred ? 'text-yellow-500' : 'text-gray-300 hover:text-gray-500'}`}\n title={starred ? 'Unstar' : 'Star'}\n >\n ★\n </button>\n <p className={`text-xs flex-1 truncate ${unread ? 'font-semibold text-gray-900' : 'text-gray-700'}`}>\n {msg.from.name || msg.from.address}\n </p>\n <span className=\"text-[10px] text-gray-400 shrink-0\">{formatDate(msg.date)}</span>\n </div>\n <p className={`text-xs truncate ${unread ? 'font-medium text-gray-900' : 'text-gray-600'}`}>\n {msg.subject || '(no subject)'}\n </p>\n {msg.hasAttachments && <span className=\"text-[10px] text-gray-400\">📎 attachment</span>}\n </div>\n );\n}\n\nfunction MessageDetailView({\n detail,\n folderPath,\n loading,\n onReply,\n onTrash,\n}: {\n detail: MessageDetail;\n folderPath: string;\n loading: boolean;\n onReply: () => void;\n onTrash: () => void;\n}) {\n const baseUrl = `/api/mail/messages/${encodeURIComponent(folderPath)}/${detail.uid}/attachments`;\n return (\n <div>\n <header className=\"px-6 py-4 border-b border-gray-200\">\n <h1 className=\"text-lg font-semibold mb-2\">{detail.subject || '(no subject)'}</h1>\n <div className=\"flex items-center justify-between text-xs text-gray-600\">\n <div>\n <div><strong>{detail.from.name || detail.from.address}</strong> &lt;{detail.from.address}&gt;</div>\n <div>to {detail.to.map(t => t.address).join(', ')}</div>\n {detail.cc.length > 0 && <div>cc {detail.cc.map(t => t.address).join(', ')}</div>}\n <div className=\"text-gray-400 mt-1\">{formatDateTime(detail.date)}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={onReply} className=\"px-3 py-1 text-xs border border-gray-300 rounded hover:bg-gray-50\">Reply</button>\n <button onClick={onTrash} className=\"px-3 py-1 text-xs border border-red-200 text-red-700 rounded hover:bg-red-50\">Trash</button>\n </div>\n </div>\n </header>\n <article className=\"px-6 py-4\">\n {loading ? (\n <div className=\"text-xs text-gray-500\">Loading…</div>\n ) : detail.html ? (\n <div className=\"prose prose-sm max-w-none\" dangerouslySetInnerHTML={{ __html: detail.html }} />\n ) : (\n <pre className=\"whitespace-pre-wrap text-sm font-sans\">{detail.text || '(empty)'}</pre>\n )}\n </article>\n {detail.attachments.length > 0 && (\n <section className=\"px-6 pb-6\">\n <h3 className=\"text-xs font-semibold text-gray-700 mb-2\">Attachments</h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {detail.attachments.map(att => (\n <a\n key={att.partId}\n href={`${getMailClient().defaults.baseURL}${baseUrl}/${encodeURIComponent(att.partId)}`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"flex items-center gap-2 border border-gray-200 rounded px-3 py-2 text-xs hover:bg-gray-50\"\n >\n <span>📎</span>\n <span className=\"flex-1 truncate\">{att.filename}</span>\n <span className=\"text-gray-400\">{(att.size / 1024).toFixed(1)}KB</span>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n );\n}\n\ninterface DraftState {\n to: string;\n cc: string;\n subject: string;\n body: string;\n inReplyTo?: string;\n references?: string[];\n}\n\nfunction ComposeModal({\n open,\n initial,\n onClose,\n onSent,\n}: {\n open: boolean;\n initial: DraftState;\n onClose: () => void;\n onSent: () => void;\n}) {\n const [draft, setDraft] = useState<DraftState>(initial);\n const [sending, setSending] = useState(false);\n\n async function send() {\n setSending(true);\n try {\n const toList = draft.to.split(',').map(s => s.trim()).filter(Boolean);\n const ccList = draft.cc.split(',').map(s => s.trim()).filter(Boolean);\n if (toList.length === 0) {\n toast.error('At least one recipient required');\n return;\n }\n await getMailClient().post('/api/mail/send', {\n to: toList,\n cc: ccList.length ? ccList : undefined,\n subject: draft.subject,\n text: draft.body,\n inReplyTo: draft.inReplyTo,\n references: draft.references,\n saveToSent: true,\n });\n onSent();\n } catch (err) {\n toast.error(extractError(err));\n } finally {\n setSending(false);\n }\n }\n\n return (\n <Modal open={open} onClose={onClose} title=\"New message\" size=\"lg\">\n <div className=\"space-y-3\">\n <input\n type=\"text\"\n placeholder=\"To\"\n value={draft.to}\n onChange={e => setDraft({ ...draft, to: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Cc (optional)\"\n value={draft.cc}\n onChange={e => setDraft({ ...draft, cc: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <input\n type=\"text\"\n placeholder=\"Subject\"\n value={draft.subject}\n onChange={e => setDraft({ ...draft, subject: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm\"\n />\n <textarea\n rows={12}\n placeholder=\"Write your message…\"\n value={draft.body}\n onChange={e => setDraft({ ...draft, body: e.target.value })}\n className=\"w-full border border-gray-300 rounded px-3 py-2 text-sm font-mono\"\n />\n </div>\n <ModalActions>\n <button\n onClick={send}\n disabled={sending}\n className=\"bg-gray-900 text-white rounded-lg px-5 py-2 text-sm font-medium hover:bg-gray-800 disabled:opacity-50\"\n >\n {sending ? 'Sending…' : 'Send'}\n </button>\n </ModalActions>\n </Modal>\n );\n}\n\nfunction EmptyState({ title, body, action }: { title: string; body: string; action?: React.ReactNode }) {\n return (\n <div className=\"h-full grid place-items-center p-8 text-center\">\n <div className=\"max-w-sm\">\n <h2 className=\"text-lg font-semibold text-gray-900 mb-1\">{title}</h2>\n <p className=\"text-sm text-gray-600\">{body}</p>\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n </div>\n );\n}\n\nfunction extractError(err: unknown): string {\n const response = (err as { response?: { data?: { error?: string } } }).response;\n if (response?.data?.error) return response.data.error;\n if (err instanceof Error) return err.message;\n return 'Unknown error';\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { loadAppearance, WidgetSettingsModal } from './chunk-LWVRQWGV.js';
2
1
  import { useTodoTasks, migratePomodoroTasksOnce } from './chunk-25L4DIKH.js';
2
+ import { loadAppearance, WidgetSettingsModal } from './chunk-LWVRQWGV.js';
3
3
  import { subscribePomo, getPomoSnapshot, setPomoDurations, setPomoAlarm, setPomoAlarmConfig, setPomoBehaviour, setPomoFocusSound, pomoSwitchMode, pomoPause, pomoStart, ALARM_OPTIONS, playAlarm, FOCUS_SOUND_OPTIONS, previewFocusSound } from './chunk-MK3HLUO4.js';
4
4
  import { useShellPrefs } from './chunk-36VM54SC.js';
5
5
  import './chunk-WIJ45SYD.js';
@@ -624,5 +624,5 @@ function AddTaskForm({ onSubmit, onCancel, accentColor }) {
624
624
  }
625
625
 
626
626
  export { PomodoroTimer as default };
627
- //# sourceMappingURL=PomodoroTimer-VEYXRZWZ.js.map
628
- //# sourceMappingURL=PomodoroTimer-VEYXRZWZ.js.map
627
+ //# sourceMappingURL=PomodoroTimer-YTV5Z6AC.js.map
628
+ //# sourceMappingURL=PomodoroTimer-YTV5Z6AC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/PomodoroTimer.tsx"],"names":[],"mappings":"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","file":"PomodoroTimer-VEYXRZWZ.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-YTV5Z6AC.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,234 @@
1
+ import { loadAppearance, WidgetSettingsModal } from './chunk-LWVRQWGV.js';
2
+ import { useWidgetSettings } from './chunk-3T6SQ4UO.js';
3
+ import './chunk-UBN4IUDE.js';
4
+ import './chunk-ZF6AYO4G.js';
5
+ import { useState, useCallback, useEffect } from 'react';
6
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
7
+
8
+ var MAX_SYMBOLS = 8;
9
+ var DEFAULT_SYMBOLS = ["AAPL", "MSFT", "GOOGL", "TSLA"];
10
+ var SYMBOLS_KEY = "stock_symbols";
11
+ var APIKEY_KEY = "stock_api_key";
12
+ var SETTINGS_KEY = "stock_appearance";
13
+ var CACHE_KEY = "stock_quotes_cache";
14
+ var CACHE_TTL = 6e4;
15
+ var REFRESH_MS = 6e4;
16
+ function readCache() {
17
+ try {
18
+ return JSON.parse(localStorage.getItem(CACHE_KEY) || "{}");
19
+ } catch {
20
+ return {};
21
+ }
22
+ }
23
+ function writeCache(c) {
24
+ try {
25
+ localStorage.setItem(CACHE_KEY, JSON.stringify(c));
26
+ } catch {
27
+ }
28
+ }
29
+ function loadSymbols() {
30
+ try {
31
+ const s = JSON.parse(localStorage.getItem(SYMBOLS_KEY) || "");
32
+ if (Array.isArray(s) && s.length) return s.slice(0, MAX_SYMBOLS);
33
+ } catch {
34
+ }
35
+ return DEFAULT_SYMBOLS;
36
+ }
37
+ var fmtPrice = (n) => `$${n.toLocaleString(void 0, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
38
+ var fmtSigned = (n) => `${n >= 0 ? "+" : ""}${n.toFixed(2)}`;
39
+ function Stock() {
40
+ const [symbols, setSymbols] = useState(loadSymbols);
41
+ const [apiKey, setApiKey] = useState(() => {
42
+ try {
43
+ return localStorage.getItem(APIKEY_KEY) || "";
44
+ } catch {
45
+ return "";
46
+ }
47
+ });
48
+ const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));
49
+ const [quotes, setQuotes] = useState({});
50
+ const [loading, setLoading] = useState(false);
51
+ const [tick, setTick] = useState(0);
52
+ const [settingsOpen, setSettingsOpen] = useState(false);
53
+ const [configSymbols, setConfigSymbols] = useState([]);
54
+ const [configApiKey, setConfigApiKey] = useState("");
55
+ const [configAppearance, setConfigAppearance] = useState(appearance);
56
+ const [newSymbol, setNewSymbol] = useState("");
57
+ const openSettings = useCallback(() => {
58
+ setConfigSymbols([...symbols]);
59
+ setConfigApiKey(apiKey);
60
+ setConfigAppearance({ ...appearance });
61
+ setNewSymbol("");
62
+ setSettingsOpen(true);
63
+ }, [symbols, apiKey, appearance]);
64
+ useWidgetSettings(openSettings);
65
+ useEffect(() => {
66
+ const t = setInterval(() => setTick((n) => n + 1), REFRESH_MS);
67
+ return () => clearInterval(t);
68
+ }, []);
69
+ useEffect(() => {
70
+ if (!apiKey || symbols.length === 0) {
71
+ setQuotes({});
72
+ return;
73
+ }
74
+ let mounted = true;
75
+ (async () => {
76
+ setLoading(true);
77
+ const cache = readCache();
78
+ const next = {};
79
+ await Promise.all(symbols.map(async (sym) => {
80
+ const hit = cache[sym];
81
+ if (hit && Date.now() - hit.ts < CACHE_TTL) {
82
+ next[sym] = hit.q;
83
+ return;
84
+ }
85
+ try {
86
+ const res = await fetch(`https://finnhub.io/api/v1/quote?symbol=${encodeURIComponent(sym)}&token=${encodeURIComponent(apiKey)}`);
87
+ const d = await res.json();
88
+ if (typeof d.c === "number" && d.c > 0) {
89
+ const q = { price: d.c, change: d.d ?? 0, changePct: d.dp ?? 0 };
90
+ next[sym] = q;
91
+ cache[sym] = { q, ts: Date.now() };
92
+ } else if (hit) {
93
+ next[sym] = hit.q;
94
+ }
95
+ } catch {
96
+ if (hit) next[sym] = hit.q;
97
+ }
98
+ }));
99
+ writeCache(cache);
100
+ if (mounted) {
101
+ setQuotes(next);
102
+ setLoading(false);
103
+ }
104
+ })();
105
+ return () => {
106
+ mounted = false;
107
+ };
108
+ }, [symbols.join(","), apiKey, tick]);
109
+ const addSymbol = () => {
110
+ const s = newSymbol.trim().toUpperCase();
111
+ if (!s || configSymbols.includes(s) || configSymbols.length >= MAX_SYMBOLS) return;
112
+ setConfigSymbols((p) => [...p, s]);
113
+ setNewSymbol("");
114
+ };
115
+ const saveSettings = () => {
116
+ const cleaned = configSymbols.map((s) => s.toUpperCase()).slice(0, MAX_SYMBOLS);
117
+ const key = configApiKey.trim();
118
+ setSymbols(cleaned);
119
+ setApiKey(key);
120
+ setAppearance(configAppearance);
121
+ localStorage.setItem(SYMBOLS_KEY, JSON.stringify(cleaned));
122
+ localStorage.setItem(APIKEY_KEY, key);
123
+ localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));
124
+ setSettingsOpen(false);
125
+ };
126
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
127
+ /* @__PURE__ */ jsx(
128
+ "div",
129
+ {
130
+ className: "flex flex-col h-full",
131
+ style: { backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : void 0 },
132
+ children: /* @__PURE__ */ jsx("div", { className: "px-4 py-3 flex-1", children: !apiKey ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center text-center gap-2 py-6", children: [
133
+ /* @__PURE__ */ jsx("svg", { className: "h-8 w-8 text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.25 18L9 11.25l4.306 4.306a11.95 11.95 0 015.814-5.518l2.74-1.22m0 0l-5.94-2.281m5.94 2.28l-2.28 5.941" }) }),
134
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-gray-700", children: "Track live stock prices" }),
135
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500 max-w-[15rem]", children: "Add a free API key to get started." }),
136
+ /* @__PURE__ */ jsx("button", { onClick: openSettings, className: "mt-1 text-xs font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg px-3 py-1.5 transition-colors", children: "Set up" })
137
+ ] }) : symbols.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-xs text-gray-500 text-center py-6", children: "No symbols yet \u2014 add some in settings." }) : /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
138
+ loading && Object.keys(quotes).length === 0 && /* @__PURE__ */ jsx("div", { className: "text-xs text-gray-400 text-center py-4", children: "Loading quotes\u2026" }),
139
+ symbols.map((sym) => {
140
+ const q = quotes[sym];
141
+ const up = (q?.change ?? 0) >= 0;
142
+ const color = !q ? "text-gray-400" : q.change > 0 ? "text-green-600" : q.change < 0 ? "text-red-600" : "text-gray-500";
143
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0", children: [
144
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-gray-800 tracking-tight", children: sym }),
145
+ q ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end leading-tight", children: [
146
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-mono font-semibold text-gray-900 tabular-nums", children: fmtPrice(q.price) }),
147
+ /* @__PURE__ */ jsxs("span", { className: `text-[11px] font-medium tabular-nums ${color}`, children: [
148
+ up ? "\u25B2" : "\u25BC",
149
+ " ",
150
+ fmtSigned(q.change),
151
+ " (",
152
+ fmtSigned(q.changePct),
153
+ "%)"
154
+ ] })
155
+ ] }) : /* @__PURE__ */ jsx("span", { className: "text-sm font-mono text-gray-400 tabular-nums", children: "\u2014" })
156
+ ] }, sym);
157
+ })
158
+ ] }) })
159
+ }
160
+ ),
161
+ /* @__PURE__ */ jsxs(
162
+ WidgetSettingsModal,
163
+ {
164
+ open: settingsOpen,
165
+ onClose: () => setSettingsOpen(false),
166
+ title: "Stock Settings",
167
+ appearance: configAppearance,
168
+ onAppearanceChange: setConfigAppearance,
169
+ onSave: saveSettings,
170
+ children: [
171
+ /* @__PURE__ */ jsxs("div", { children: [
172
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: "API Key" }),
173
+ /* @__PURE__ */ jsx(
174
+ "input",
175
+ {
176
+ value: configApiKey,
177
+ onChange: (e) => setConfigApiKey(e.target.value),
178
+ placeholder: "Finnhub API key",
179
+ className: "w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-blue-500"
180
+ }
181
+ ),
182
+ /* @__PURE__ */ jsxs("p", { className: "text-[11px] text-gray-400 mt-1", children: [
183
+ "Free key from ",
184
+ /* @__PURE__ */ jsx("a", { href: "https://finnhub.io/register", target: "_blank", rel: "noreferrer", className: "text-blue-600 hover:underline", children: "finnhub.io" }),
185
+ " \u2014 quotes update every minute."
186
+ ] })
187
+ ] }),
188
+ /* @__PURE__ */ jsxs("div", { children: [
189
+ /* @__PURE__ */ jsxs("h3", { className: "text-sm font-semibold text-gray-700 mb-2", children: [
190
+ "Symbols ",
191
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] font-normal text-gray-400", children: [
192
+ "(",
193
+ configSymbols.length,
194
+ "/",
195
+ MAX_SYMBOLS,
196
+ ")"
197
+ ] })
198
+ ] }),
199
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1 mb-2", children: [
200
+ configSymbols.map((s, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-1 px-2 bg-gray-50 rounded", children: [
201
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold text-gray-700", children: s }),
202
+ /* @__PURE__ */ jsx("button", { onClick: () => setConfigSymbols((p) => p.filter((_, idx) => idx !== i)), className: "text-red-400 hover:text-red-600", children: "\xD7" })
203
+ ] }, i)),
204
+ configSymbols.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-[11px] text-gray-400 italic", children: "No symbols \u2014 add a ticker below." })
205
+ ] }),
206
+ configSymbols.length < MAX_SYMBOLS ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
207
+ /* @__PURE__ */ jsx(
208
+ "input",
209
+ {
210
+ value: newSymbol,
211
+ onChange: (e) => setNewSymbol(e.target.value),
212
+ onKeyDown: (e) => {
213
+ if (e.key === "Enter") addSymbol();
214
+ },
215
+ placeholder: "e.g. NVDA",
216
+ className: "flex-1 bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm uppercase focus:outline-none focus:ring-1 focus:ring-blue-500"
217
+ }
218
+ ),
219
+ /* @__PURE__ */ jsx("button", { onClick: addSymbol, className: "text-sm font-medium text-blue-600 hover:text-blue-800 px-2", children: "+ Add" })
220
+ ] }) : /* @__PURE__ */ jsxs("p", { className: "text-[11px] text-gray-400 italic", children: [
221
+ "Max ",
222
+ MAX_SYMBOLS,
223
+ " symbols \u2014 remove one to add another."
224
+ ] })
225
+ ] })
226
+ ]
227
+ }
228
+ )
229
+ ] });
230
+ }
231
+
232
+ export { Stock as default };
233
+ //# sourceMappingURL=Stock-ZXZOCSJD.js.map
234
+ //# sourceMappingURL=Stock-ZXZOCSJD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/Stock.tsx"],"names":[],"mappings":"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","file":"Stock-ZXZOCSJD.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react';\nimport { useWidgetSettings } from '../shell/Modal';\nimport WidgetSettingsModal, { loadAppearance, type WidgetAppearance } from '../shell/WidgetSettingsModal';\n\n/**\n * Stock ticker widget — track a watchlist of equities with live prices.\n *\n * Quotes come from Finnhub's keyless-from-the-browser /quote endpoint, which\n * needs a (free) API key the user pastes in settings — there's no reliable\n * keyless + CORS stock feed, so \"setup\" means entering a key + picking\n * symbols. Until a key is set the widget shows a friendly call-to-action.\n */\n\n/** Cap the watchlist — keeps the widget compact and stays well within\n * Finnhub's free tier (one /quote call per symbol, polled each minute). */\nconst MAX_SYMBOLS = 8;\nconst DEFAULT_SYMBOLS = ['AAPL', 'MSFT', 'GOOGL', 'TSLA'];\n\nconst SYMBOLS_KEY = 'stock_symbols';\nconst APIKEY_KEY = 'stock_api_key';\nconst SETTINGS_KEY = 'stock_appearance';\nconst CACHE_KEY = 'stock_quotes_cache';\nconst CACHE_TTL = 60_000; // 1 min — fresh enough for a desktop ticker\nconst REFRESH_MS = 60_000;\n\ninterface Quote { price: number; change: number; changePct: number }\ntype CacheEntry = { q: Quote; ts: number };\ntype Cache = Record<string, CacheEntry>;\n\nfunction readCache(): Cache { try { return JSON.parse(localStorage.getItem(CACHE_KEY) || '{}'); } catch { return {}; } }\nfunction writeCache(c: Cache) { try { localStorage.setItem(CACHE_KEY, JSON.stringify(c)); } catch {} }\n\nfunction loadSymbols(): string[] {\n try { const s = JSON.parse(localStorage.getItem(SYMBOLS_KEY) || ''); if (Array.isArray(s) && s.length) return s.slice(0, MAX_SYMBOLS); } catch {}\n return DEFAULT_SYMBOLS;\n}\n\nconst fmtPrice = (n: number) => `$${n.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\nconst fmtSigned = (n: number) => `${n >= 0 ? '+' : ''}${n.toFixed(2)}`;\n\nexport default function Stock() {\n const [symbols, setSymbols] = useState(loadSymbols);\n const [apiKey, setApiKey] = useState(() => { try { return localStorage.getItem(APIKEY_KEY) || ''; } catch { return ''; } });\n const [appearance, setAppearance] = useState(() => loadAppearance(SETTINGS_KEY));\n const [quotes, setQuotes] = useState<Record<string, Quote>>({});\n const [loading, setLoading] = useState(false);\n const [tick, setTick] = useState(0);\n\n const [settingsOpen, setSettingsOpen] = useState(false);\n const [configSymbols, setConfigSymbols] = useState<string[]>([]);\n const [configApiKey, setConfigApiKey] = useState('');\n const [configAppearance, setConfigAppearance] = useState<WidgetAppearance>(appearance);\n const [newSymbol, setNewSymbol] = useState('');\n\n const openSettings = useCallback(() => {\n setConfigSymbols([...symbols]);\n setConfigApiKey(apiKey);\n setConfigAppearance({ ...appearance });\n setNewSymbol('');\n setSettingsOpen(true);\n }, [symbols, apiKey, appearance]);\n\n useWidgetSettings(openSettings);\n\n // Poll on a timer so prices stay current while the widget sits on the desktop.\n useEffect(() => {\n const t = setInterval(() => setTick(n => n + 1), REFRESH_MS);\n return () => clearInterval(t);\n }, []);\n\n useEffect(() => {\n if (!apiKey || symbols.length === 0) { setQuotes({}); return; }\n let mounted = true;\n (async () => {\n setLoading(true);\n const cache = readCache();\n const next: Record<string, Quote> = {};\n await Promise.all(symbols.map(async sym => {\n const hit = cache[sym];\n if (hit && Date.now() - hit.ts < CACHE_TTL) { next[sym] = hit.q; return; }\n try {\n const res = await fetch(`https://finnhub.io/api/v1/quote?symbol=${encodeURIComponent(sym)}&token=${encodeURIComponent(apiKey)}`);\n const d = await res.json();\n if (typeof d.c === 'number' && d.c > 0) {\n const q: Quote = { price: d.c, change: d.d ?? 0, changePct: d.dp ?? 0 };\n next[sym] = q; cache[sym] = { q, ts: Date.now() };\n } else if (hit) { next[sym] = hit.q; } // unknown symbol / rate-limited → keep last good\n } catch { if (hit) next[sym] = hit.q; }\n }));\n writeCache(cache);\n if (mounted) { setQuotes(next); setLoading(false); }\n })();\n return () => { mounted = false; };\n }, [symbols.join(','), apiKey, tick]);\n\n const addSymbol = () => {\n const s = newSymbol.trim().toUpperCase();\n if (!s || configSymbols.includes(s) || configSymbols.length >= MAX_SYMBOLS) return;\n setConfigSymbols(p => [...p, s]);\n setNewSymbol('');\n };\n\n const saveSettings = () => {\n const cleaned = configSymbols.map(s => s.toUpperCase()).slice(0, MAX_SYMBOLS);\n const key = configApiKey.trim();\n setSymbols(cleaned); setApiKey(key); setAppearance(configAppearance);\n localStorage.setItem(SYMBOLS_KEY, JSON.stringify(cleaned));\n localStorage.setItem(APIKEY_KEY, key);\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(configAppearance));\n setSettingsOpen(false);\n };\n\n return (\n <>\n {/* Theme-aware panel — mirrors the taskbar's `--taskbar-bg-rgb` so the\n * widget matches it across themes; gray-* classes auto-invert in dark. */}\n <div className=\"flex flex-col h-full\"\n style={{ backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${appearance.activeOpacity / 100})`, backdropFilter: appearance.activeBlur > 0 ? `blur(${appearance.activeBlur}px)` : undefined }}>\n <div className=\"px-4 py-3 flex-1\">\n {!apiKey ? (\n <div className=\"flex flex-col items-center justify-center text-center gap-2 py-6\">\n <svg className=\"h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 18L9 11.25l4.306 4.306a11.95 11.95 0 015.814-5.518l2.74-1.22m0 0l-5.94-2.281m5.94 2.28l-2.28 5.941\" /></svg>\n <p className=\"text-sm font-semibold text-gray-700\">Track live stock prices</p>\n <p className=\"text-xs text-gray-500 max-w-[15rem]\">Add a free API key to get started.</p>\n <button onClick={openSettings} className=\"mt-1 text-xs font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-lg px-3 py-1.5 transition-colors\">Set up</button>\n </div>\n ) : symbols.length === 0 ? (\n <div className=\"text-xs text-gray-500 text-center py-6\">No symbols yet — add some in settings.</div>\n ) : (\n <div className=\"space-y-0.5\">\n {loading && Object.keys(quotes).length === 0 && <div className=\"text-xs text-gray-400 text-center py-4\">Loading quotes…</div>}\n {symbols.map(sym => {\n const q = quotes[sym];\n const up = (q?.change ?? 0) >= 0;\n const color = !q ? 'text-gray-400' : q.change > 0 ? 'text-green-600' : q.change < 0 ? 'text-red-600' : 'text-gray-500';\n return (\n <div key={sym} className=\"flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0\">\n <span className=\"text-sm font-bold text-gray-800 tracking-tight\">{sym}</span>\n {q ? (\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-sm font-mono font-semibold text-gray-900 tabular-nums\">{fmtPrice(q.price)}</span>\n <span className={`text-[11px] font-medium tabular-nums ${color}`}>{up ? '▲' : '▼'} {fmtSigned(q.change)} ({fmtSigned(q.changePct)}%)</span>\n </div>\n ) : (\n <span className=\"text-sm font-mono text-gray-400 tabular-nums\">—</span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n <WidgetSettingsModal open={settingsOpen} onClose={() => setSettingsOpen(false)} title=\"Stock Settings\"\n appearance={configAppearance} onAppearanceChange={setConfigAppearance} onSave={saveSettings}>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">API Key</h3>\n <input value={configApiKey} onChange={e => setConfigApiKey(e.target.value)} placeholder=\"Finnhub API key\"\n className=\"w-full bg-gray-50 border border-gray-200 rounded px-2 py-1.5 text-sm font-mono focus:outline-none focus:ring-1 focus:ring-blue-500\" />\n <p className=\"text-[11px] text-gray-400 mt-1\">Free key from <a href=\"https://finnhub.io/register\" target=\"_blank\" rel=\"noreferrer\" className=\"text-blue-600 hover:underline\">finnhub.io</a> — quotes update every minute.</p>\n </div>\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-2\">Symbols <span className=\"text-[11px] font-normal text-gray-400\">({configSymbols.length}/{MAX_SYMBOLS})</span></h3>\n <div className=\"space-y-1 mb-2\">\n {configSymbols.map((s, i) => (\n <div key={i} className=\"flex items-center justify-between py-1 px-2 bg-gray-50 rounded\">\n <span className=\"text-sm font-semibold text-gray-700\">{s}</span>\n <button onClick={() => setConfigSymbols(p => p.filter((_, idx) => idx !== i))} className=\"text-red-400 hover:text-red-600\">&times;</button>\n </div>\n ))}\n {configSymbols.length === 0 && <p className=\"text-[11px] text-gray-400 italic\">No symbols — add a ticker below.</p>}\n </div>\n {configSymbols.length < MAX_SYMBOLS ? (\n <div className=\"flex items-center gap-2\">\n <input value={newSymbol} onChange={e => setNewSymbol(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') addSymbol(); }}\n placeholder=\"e.g. NVDA\" className=\"flex-1 bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm uppercase focus:outline-none focus:ring-1 focus:ring-blue-500\" />\n <button onClick={addSymbol} className=\"text-sm font-medium text-blue-600 hover:text-blue-800 px-2\">+ Add</button>\n </div>\n ) : (\n <p className=\"text-[11px] text-gray-400 italic\">Max {MAX_SYMBOLS} symbols — remove one to add another.</p>\n )}\n </div>\n </WidgetSettingsModal>\n </>\n );\n}\n"]}
@@ -63,6 +63,8 @@ declare function Chess$1(): react_jsx_runtime.JSX.Element;
63
63
 
64
64
  declare function TodoList$1(): react_jsx_runtime.JSX.Element;
65
65
 
66
+ declare function Stock$1(): react_jsx_runtime.JSX.Element;
67
+
66
68
  /**
67
69
  * World Clock widget — multi-city list. Each row pairs a tiny analogue
68
70
  * clock (minimal-style: ring, four cardinal dots, two hands) with the
@@ -109,6 +111,7 @@ declare const CurrencyConverter: react.LazyExoticComponent<typeof CurrencyConver
109
111
  declare const PomodoroTimer: react.LazyExoticComponent<typeof PomodoroTimer$1>;
110
112
  declare const Notepad: react.LazyExoticComponent<typeof Notepad$1>;
111
113
  declare const WorldClock: react.LazyExoticComponent<typeof WorldClock$1>;
114
+ declare const Stock: react.LazyExoticComponent<typeof Stock$1>;
112
115
  declare const TodoList: react.LazyExoticComponent<typeof TodoList$1>;
113
116
  declare const Chess: react.LazyExoticComponent<typeof Chess$1>;
114
117
  declare const Checkers: react.LazyExoticComponent<typeof Checkers$1>;
@@ -129,4 +132,4 @@ declare const documentApps: WindowRegistry;
129
132
  declare const webApps: WindowRegistry;
130
133
  declare const bundledApps: WindowRegistry;
131
134
 
132
- export { Browser, Calculator, Calendar, Checkers, Chess, CurrencyConverter, Documents, Email, Files, Game2048, Minesweeper, Notepad, type PdfPreviewData, type PdfPreviewHandle, PomodoroTimer, Preview, Spreadsheet, type SpreadsheetPreviewData, type SpreadsheetPreviewHandle, Sudoku, Tetris, TodoList, Weather, WorldClock, bundledApps, documentApps, gameApps, mailApps, openFilesInTrashMode, setPdfPreview, setSpreadsheetPreview, utilityApps, webApps };
135
+ export { Browser, Calculator, Calendar, Checkers, Chess, CurrencyConverter, Documents, Email, Files, Game2048, Minesweeper, Notepad, type PdfPreviewData, type PdfPreviewHandle, PomodoroTimer, Preview, Spreadsheet, type SpreadsheetPreviewData, type SpreadsheetPreviewHandle, Stock, Sudoku, Tetris, TodoList, Weather, WorldClock, bundledApps, documentApps, gameApps, mailApps, openFilesInTrashMode, setPdfPreview, setSpreadsheetPreview, utilityApps, webApps };
@@ -13,9 +13,10 @@ var Calculator = lazy(() => import('../Calculator-37EIFRDU.js'));
13
13
  var Spreadsheet = lazy(() => import('../Spreadsheet-UZMNMLZH.js'));
14
14
  var Weather = lazy(() => import('../Weather-R6ULA547.js'));
15
15
  var CurrencyConverter = lazy(() => import('../CurrencyConverter-PWX3FKRK.js'));
16
- var PomodoroTimer = lazy(() => import('../PomodoroTimer-VEYXRZWZ.js'));
16
+ var PomodoroTimer = lazy(() => import('../PomodoroTimer-YTV5Z6AC.js'));
17
17
  var Notepad = lazy(() => import('../Notepad-MXEQCIC7.js'));
18
18
  var WorldClock = lazy(() => import('../WorldClock-HHIBQXUR.js'));
19
+ var Stock = lazy(() => import('../Stock-ZXZOCSJD.js'));
19
20
  var TodoList = lazy(() => import('../TodoList-PI4SGVGI.js'));
20
21
  var Chess = lazy(() => import('../Chess-C5BY45NA.js'));
21
22
  var Checkers = lazy(() => import('../Checkers-MIAHIKJH.js'));
@@ -23,7 +24,7 @@ var Sudoku = lazy(() => import('../Sudoku-XHLYCEVT.js'));
23
24
  var Tetris = lazy(() => import('../Tetris-ZHCZYL24.js'));
24
25
  var Game2048 = lazy(() => import('../Game2048-3RH3ELRD.js'));
25
26
  var Minesweeper = lazy(() => import('../Minesweeper-N73MSPJV.js'));
26
- var Email = lazy(() => import('../Email-GTGL7CW5.js'));
27
+ var Email = lazy(() => import('../Email-ZUDCRZKB.js'));
27
28
  var Calendar = lazy(() => import('../Calendar-KCZQJ5CY.js'));
28
29
  var Preview = lazy(() => import('../Preview-VMKMY6SY.js'));
29
30
  var Documents = lazy(() => import('../Documents-W2DABIOW.js'));
@@ -37,6 +38,7 @@ var utilityApps = {
37
38
  "/currency": { component: CurrencyConverter, label: "Currency Converter", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },
38
39
  "/pomodoro": { component: PomodoroTimer, label: "Pomodoro Timer", size: "sm", utility: true, widget: true, dimensions: [320, 600] },
39
40
  "/world-clock": { component: WorldClock, label: "World Clock", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },
41
+ "/stock": { component: Stock, label: "Stocks", size: "sm", utility: true, widget: true, autoHeight: true, dimensions: [320, 360] },
40
42
  "/todo": { component: TodoList, label: "Todo List", size: "md", dimensions: [560, 640] }
41
43
  };
42
44
  var gameApps = {
@@ -67,6 +69,6 @@ var bundledApps = {
67
69
  ...webApps
68
70
  };
69
71
 
70
- export { Browser, Calculator, Calendar, Checkers, Chess, CurrencyConverter, Documents, Email, Files, Game2048, Minesweeper, Notepad, PomodoroTimer, Preview, Spreadsheet, Sudoku, Tetris, TodoList, Weather, WorldClock, bundledApps, documentApps, gameApps, mailApps, utilityApps, webApps };
72
+ export { Browser, Calculator, Calendar, Checkers, Chess, CurrencyConverter, Documents, Email, Files, Game2048, Minesweeper, Notepad, PomodoroTimer, Preview, Spreadsheet, Stock, Sudoku, Tetris, TodoList, Weather, WorldClock, bundledApps, documentApps, gameApps, mailApps, utilityApps, webApps };
71
73
  //# sourceMappingURL=index.js.map
72
74
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/apps/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Bundled apps — pre-built window registry entries for the 16 apps that ship\n * with `react-os-shell`. Consumers compose them into their own registry via\n * `createWindowRegistry`:\n *\n * import { createWindowRegistry } from 'react-os-shell';\n * import { bundledApps } from 'react-os-shell/apps';\n * import { erpEntities } from './shell-config';\n *\n * const windows = createWindowRegistry(bundledApps, erpEntities);\n *\n * Subsets are also exported (`utilityApps`, `gameApps`, `mailApps`) so a\n * consumer can pick-and-choose without importing every component.\n *\n * NOTE: 3 apps require consumer-supplied persistence (Calendar / Notepad for\n * stored content, Minesweeper for leaderboard). They're exported individually\n * but absent from `bundledApps` — wire the prefs provider to opt them in.\n * WorldClock uses `useShellPrefs()` so it lives in `bundledApps`; without a\n * consumer-supplied prefs adapter the city list won't survive a reload.\n */\nimport { lazy } from 'react';\nimport type { WindowRegistry } from '../windowRegistry/types';\n\n// ── Utility apps ──\nconst Calculator = lazy(() => import('./Calculator'));\nconst Spreadsheet = lazy(() => import('./Spreadsheet'));\nconst Weather = lazy(() => import('./Weather'));\nconst CurrencyConverter = lazy(() => import('./CurrencyConverter'));\nconst PomodoroTimer = lazy(() => import('./PomodoroTimer'));\nconst Notepad = lazy(() => import('./Notepad'));\nconst WorldClock = lazy(() => import('./WorldClock'));\nconst TodoList = lazy(() => import('./TodoList'));\n\n// ── Games ──\nconst Chess = lazy(() => import('./Chess'));\nconst Checkers = lazy(() => import('./Checkers'));\nconst Sudoku = lazy(() => import('./Sudoku'));\nconst Tetris = lazy(() => import('./Tetris'));\nconst Game2048 = lazy(() => import('./Game2048'));\nconst Minesweeper = lazy(() => import('./Minesweeper'));\n\n// ── Mail / Calendar (talk to the IMAP/SMTP/CalDAV bridge server) ──\nconst Email = lazy(() => import('./Email'));\nconst Calendar = lazy(() => import('./Calendar'));\n\n// ── Document apps ──\nconst Preview = lazy(() => import('./Preview'));\nconst Documents = lazy(() => import('./Documents'));\nconst Files = lazy(() => import('./Files'));\n\n// ── Web ──\nconst Browser = lazy(() => import('./Browser'));\n\nexport const utilityApps: WindowRegistry = {\n '/calculator': { component: Calculator, label: 'Calculator', size: 'sm', allowPinOnTop: true, utility: true, widget: true, dimensions: [280, 420] },\n '/spreadsheet': { component: Spreadsheet, label: 'Spreadsheets', size: '2xl', appStyle: true, multiInstance: true },\n '/notepad': { component: Notepad, label: 'Notepad', size: 'lg', allowPinOnTop: true },\n '/weather': { component: Weather, label: 'Weather', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },\n '/currency': { component: CurrencyConverter, label: 'Currency Converter', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/pomodoro': { component: PomodoroTimer, label: 'Pomodoro Timer', size: 'sm', utility: true, widget: true, dimensions: [320, 600] },\n '/world-clock': { component: WorldClock, label: 'World Clock', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/todo': { component: TodoList, label: 'Todo List', size: 'md', dimensions: [560, 640] },\n};\n\nexport const gameApps: WindowRegistry = {\n '/chess': { component: Chess, label: 'Chess', size: 'lg', compact: true },\n '/checkers': { component: Checkers, label: 'Checkers', size: 'lg', compact: true },\n '/sudoku': { component: Sudoku, label: 'Sudoku', size: 'sm', compact: true, dimensions: [360, 535] },\n '/tetris': { component: Tetris, label: 'Tetris', size: 'md', compact: true, dimensions: [452, 618] },\n '/2048': { component: Game2048, label: '2048', size: 'sm', compact: true },\n '/minesweeper': { component: Minesweeper, label: 'Minesweeper', size: 'sm', compact: true },\n};\n\nexport const mailApps: WindowRegistry = {\n '/email': { component: Email, label: 'Email', size: '2xl', appStyle: true },\n '/calendar': { component: Calendar, label: 'Calendar', size: 'xl' },\n};\n\nexport const documentApps: WindowRegistry = {\n '/preview': { component: Preview, label: 'Preview', size: '2xl', appStyle: true, multiInstance: true },\n '/documents': { component: Documents, label: 'Documents', size: 'xl', appStyle: true, multiInstance: true },\n '/files': { component: Files, label: 'Files', size: 'xl', appStyle: true },\n};\n\nexport const webApps: WindowRegistry = {\n '/browser': { component: Browser, label: 'Browser', size: '2xl', appStyle: true, multiInstance: true },\n};\n\nexport const bundledApps: WindowRegistry = {\n ...utilityApps,\n ...gameApps,\n ...mailApps,\n ...documentApps,\n ...webApps,\n};\n\nexport {\n Calculator,\n Spreadsheet,\n Notepad,\n Weather,\n CurrencyConverter,\n PomodoroTimer,\n WorldClock,\n TodoList,\n Chess,\n Checkers,\n Sudoku,\n Tetris,\n Game2048,\n Minesweeper,\n Email,\n Calendar,\n Preview,\n Documents,\n Files,\n Browser,\n};\n\nexport { setPdfPreview } from './Preview';\nexport { setSpreadsheetPreview } from './Spreadsheet';\nexport { openFilesInTrashMode } from './Files';\nexport type { PdfPreviewData, PdfPreviewHandle } from './Preview';\nexport type { SpreadsheetPreviewData, SpreadsheetPreviewHandle } from './Spreadsheet';\n"]}
1
+ {"version":3,"sources":["../../src/apps/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAwBA,IAAM,UAAA,GAAa,IAAA,CAAK,MAAM,OAAO,2BAAc,CAAC;AACpD,IAAM,WAAA,GAAc,IAAA,CAAK,MAAM,OAAO,4BAAe,CAAC;AACtD,IAAM,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,wBAAW,CAAC;AAC9C,IAAM,iBAAA,GAAoB,IAAA,CAAK,MAAM,OAAO,kCAAqB,CAAC;AAClE,IAAM,aAAA,GAAgB,IAAA,CAAK,MAAM,OAAO,8BAAiB,CAAC;AAC1D,IAAM,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,wBAAW,CAAC;AAC9C,IAAM,UAAA,GAAa,IAAA,CAAK,MAAM,OAAO,2BAAc,CAAC;AACpD,IAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,sBAAS,CAAC;AAC1C,IAAM,QAAA,GAAW,IAAA,CAAK,MAAM,OAAO,yBAAY,CAAC;AAGhD,IAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,sBAAS,CAAC;AAC1C,IAAM,QAAA,GAAW,IAAA,CAAK,MAAM,OAAO,yBAAY,CAAC;AAChD,IAAM,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,uBAAU,CAAC;AAC5C,IAAM,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,uBAAU,CAAC;AAC5C,IAAM,QAAA,GAAW,IAAA,CAAK,MAAM,OAAO,yBAAY,CAAC;AAChD,IAAM,WAAA,GAAc,IAAA,CAAK,MAAM,OAAO,4BAAe,CAAC;AAGtD,IAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,sBAAS,CAAC;AAC1C,IAAM,QAAA,GAAW,IAAA,CAAK,MAAM,OAAO,yBAAY,CAAC;AAGhD,IAAM,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,wBAAW,CAAC;AAC9C,IAAM,SAAA,GAAY,IAAA,CAAK,MAAM,OAAO,0BAAa,CAAC;AAClD,IAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAO,sBAAS,CAAC;AAG1C,IAAM,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,wBAAW,CAAC;AAEvC,IAAM,WAAA,GAA8B;AAAA,EACzC,eAAe,EAAE,SAAA,EAAW,YAAY,KAAA,EAAO,YAAA,EAAc,MAAM,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,OAAA,EAAS,MAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EAClJ,cAAA,EAAgB,EAAE,SAAA,EAAW,WAAA,EAAa,KAAA,EAAO,cAAA,EAAgB,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,IAAA,EAAK;AAAA,EAClH,UAAA,EAAY,EAAE,SAAA,EAAW,OAAA,EAAS,OAAO,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,aAAA,EAAe,IAAA,EAAK;AAAA,EACpF,YAAY,EAAE,SAAA,EAAW,SAAS,KAAA,EAAO,SAAA,EAAW,MAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,YAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACtI,aAAa,EAAE,SAAA,EAAW,mBAAmB,KAAA,EAAO,oBAAA,EAAsB,MAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,YAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EAC5J,aAAa,EAAE,SAAA,EAAW,aAAA,EAAe,KAAA,EAAO,kBAAkB,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAQ,IAAA,EAAM,UAAA,EAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EAClI,gBAAgB,EAAE,SAAA,EAAW,YAAY,KAAA,EAAO,aAAA,EAAe,MAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,YAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACjJ,UAAU,EAAE,SAAA,EAAW,OAAO,KAAA,EAAO,QAAA,EAAU,MAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,YAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACjI,OAAA,EAAS,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,CAAC,GAAA,EAAK,GAAG,CAAA;AACvF;AAEO,IAAM,QAAA,GAA2B;AAAA,EACtC,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACxE,WAAA,EAAa,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACjF,SAAA,EAAW,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACnG,SAAA,EAAW,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAO,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,CAAC,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACnG,OAAA,EAAS,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAK;AAAA,EACzE,cAAA,EAAgB,EAAE,SAAA,EAAW,WAAA,EAAa,OAAO,aAAA,EAAe,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA;AACvF;AAEO,IAAM,QAAA,GAA2B;AAAA,EACtC,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAK;AAAA,EAC1E,aAAa,EAAE,SAAA,EAAW,UAAU,KAAA,EAAO,UAAA,EAAY,MAAM,IAAA;AAC/D;AAEO,IAAM,YAAA,GAA+B;AAAA,EAC1C,UAAA,EAAY,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,IAAA,EAAK;AAAA,EACrG,YAAA,EAAc,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,IAAA,EAAK;AAAA,EAC1G,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA,EAAO,OAAO,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA;AACtE;AAEO,IAAM,OAAA,GAA0B;AAAA,EACrC,UAAA,EAAY,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,aAAA,EAAe,IAAA;AAClG;AAEO,IAAM,WAAA,GAA8B;AAAA,EACzC,GAAG,WAAA;AAAA,EACH,GAAG,QAAA;AAAA,EACH,GAAG,QAAA;AAAA,EACH,GAAG,YAAA;AAAA,EACH,GAAG;AACL","file":"index.js","sourcesContent":["/**\n * Bundled apps — pre-built window registry entries for the 16 apps that ship\n * with `react-os-shell`. Consumers compose them into their own registry via\n * `createWindowRegistry`:\n *\n * import { createWindowRegistry } from 'react-os-shell';\n * import { bundledApps } from 'react-os-shell/apps';\n * import { erpEntities } from './shell-config';\n *\n * const windows = createWindowRegistry(bundledApps, erpEntities);\n *\n * Subsets are also exported (`utilityApps`, `gameApps`, `mailApps`) so a\n * consumer can pick-and-choose without importing every component.\n *\n * NOTE: 3 apps require consumer-supplied persistence (Calendar / Notepad for\n * stored content, Minesweeper for leaderboard). They're exported individually\n * but absent from `bundledApps` — wire the prefs provider to opt them in.\n * WorldClock uses `useShellPrefs()` so it lives in `bundledApps`; without a\n * consumer-supplied prefs adapter the city list won't survive a reload.\n */\nimport { lazy } from 'react';\nimport type { WindowRegistry } from '../windowRegistry/types';\n\n// ── Utility apps ──\nconst Calculator = lazy(() => import('./Calculator'));\nconst Spreadsheet = lazy(() => import('./Spreadsheet'));\nconst Weather = lazy(() => import('./Weather'));\nconst CurrencyConverter = lazy(() => import('./CurrencyConverter'));\nconst PomodoroTimer = lazy(() => import('./PomodoroTimer'));\nconst Notepad = lazy(() => import('./Notepad'));\nconst WorldClock = lazy(() => import('./WorldClock'));\nconst Stock = lazy(() => import('./Stock'));\nconst TodoList = lazy(() => import('./TodoList'));\n\n// ── Games ──\nconst Chess = lazy(() => import('./Chess'));\nconst Checkers = lazy(() => import('./Checkers'));\nconst Sudoku = lazy(() => import('./Sudoku'));\nconst Tetris = lazy(() => import('./Tetris'));\nconst Game2048 = lazy(() => import('./Game2048'));\nconst Minesweeper = lazy(() => import('./Minesweeper'));\n\n// ── Mail / Calendar (talk to the IMAP/SMTP/CalDAV bridge server) ──\nconst Email = lazy(() => import('./Email'));\nconst Calendar = lazy(() => import('./Calendar'));\n\n// ── Document apps ──\nconst Preview = lazy(() => import('./Preview'));\nconst Documents = lazy(() => import('./Documents'));\nconst Files = lazy(() => import('./Files'));\n\n// ── Web ──\nconst Browser = lazy(() => import('./Browser'));\n\nexport const utilityApps: WindowRegistry = {\n '/calculator': { component: Calculator, label: 'Calculator', size: 'sm', allowPinOnTop: true, utility: true, widget: true, dimensions: [280, 420] },\n '/spreadsheet': { component: Spreadsheet, label: 'Spreadsheets', size: '2xl', appStyle: true, multiInstance: true },\n '/notepad': { component: Notepad, label: 'Notepad', size: 'lg', allowPinOnTop: true },\n '/weather': { component: Weather, label: 'Weather', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 400] },\n '/currency': { component: CurrencyConverter, label: 'Currency Converter', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/pomodoro': { component: PomodoroTimer, label: 'Pomodoro Timer', size: 'sm', utility: true, widget: true, dimensions: [320, 600] },\n '/world-clock': { component: WorldClock, label: 'World Clock', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 480] },\n '/stock': { component: Stock, label: 'Stocks', size: 'sm', utility: true, widget: true, autoHeight: true, dimensions: [320, 360] },\n '/todo': { component: TodoList, label: 'Todo List', size: 'md', dimensions: [560, 640] },\n};\n\nexport const gameApps: WindowRegistry = {\n '/chess': { component: Chess, label: 'Chess', size: 'lg', compact: true },\n '/checkers': { component: Checkers, label: 'Checkers', size: 'lg', compact: true },\n '/sudoku': { component: Sudoku, label: 'Sudoku', size: 'sm', compact: true, dimensions: [360, 535] },\n '/tetris': { component: Tetris, label: 'Tetris', size: 'md', compact: true, dimensions: [452, 618] },\n '/2048': { component: Game2048, label: '2048', size: 'sm', compact: true },\n '/minesweeper': { component: Minesweeper, label: 'Minesweeper', size: 'sm', compact: true },\n};\n\nexport const mailApps: WindowRegistry = {\n '/email': { component: Email, label: 'Email', size: '2xl', appStyle: true },\n '/calendar': { component: Calendar, label: 'Calendar', size: 'xl' },\n};\n\nexport const documentApps: WindowRegistry = {\n '/preview': { component: Preview, label: 'Preview', size: '2xl', appStyle: true, multiInstance: true },\n '/documents': { component: Documents, label: 'Documents', size: 'xl', appStyle: true, multiInstance: true },\n '/files': { component: Files, label: 'Files', size: 'xl', appStyle: true },\n};\n\nexport const webApps: WindowRegistry = {\n '/browser': { component: Browser, label: 'Browser', size: '2xl', appStyle: true, multiInstance: true },\n};\n\nexport const bundledApps: WindowRegistry = {\n ...utilityApps,\n ...gameApps,\n ...mailApps,\n ...documentApps,\n ...webApps,\n};\n\nexport {\n Calculator,\n Spreadsheet,\n Notepad,\n Weather,\n CurrencyConverter,\n PomodoroTimer,\n WorldClock,\n Stock,\n TodoList,\n Chess,\n Checkers,\n Sudoku,\n Tetris,\n Game2048,\n Minesweeper,\n Email,\n Calendar,\n Preview,\n Documents,\n Files,\n Browser,\n};\n\nexport { setPdfPreview } from './Preview';\nexport { setSpreadsheetPreview } from './Spreadsheet';\nexport { openFilesInTrashMode } from './Files';\nexport type { PdfPreviewData, PdfPreviewHandle } from './Preview';\nexport type { SpreadsheetPreviewData, SpreadsheetPreviewHandle } from './Spreadsheet';\n"]}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { useEmailUnreadCount } from './chunk-PDFQNHW7.js';
2
- import { formatDate } from './chunk-NSU7OHPC.js';
3
- export { formatDate } from './chunk-NSU7OHPC.js';
4
2
  import { useMailAuth } from './chunk-VBFB3ZIN.js';
5
3
  export { setShellMailServer, useMailAuth } from './chunk-VBFB3ZIN.js';
4
+ import { formatDate } from './chunk-NSU7OHPC.js';
5
+ export { formatDate } from './chunk-NSU7OHPC.js';
6
6
  import { subscribePomo, getPomoSnapshot } from './chunk-MK3HLUO4.js';
7
7
  import { useShellPrefs } from './chunk-36VM54SC.js';
8
8
  export { ShellPrefsProvider, useLocalStoragePrefs, useShellPrefs } from './chunk-36VM54SC.js';
@@ -1402,7 +1402,7 @@ function WidgetManager({ open, onClose }) {
1402
1402
  }
1403
1403
 
1404
1404
  // src/version.ts
1405
- var VERSION = "0.7.2" ;
1405
+ var VERSION = "0.7.3" ;
1406
1406
  var APP_VERSION = VERSION;
1407
1407
 
1408
1408
  // src/changelog.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-os-shell",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Desktop-style React UI shell — windows, taskbar, start menu, sticky notes, frosted glass theming, and bundled apps. Email + Calendar talk to your own IMAP/SMTP/CalDAV provider via a colocated Node bridge server.",
5
5
  "license": "MIT",
6
6
  "author": "Victor Y. Mau",