react-os-shell 0.11.0 → 0.12.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/windowRegistry/createWindowRegistry.ts","../src/shell/GlobalSearch.tsx","../src/shell/Kbd.tsx","../src/shell/ShortcutHelp.tsx","../src/shell/Markdown.tsx","../src/shell/HelpCenter.tsx","../src/shell/SidebarLayout.tsx","../src/shell/NotificationBell.tsx","../src/shell/BugReportDialog.tsx","../src/shell/BugReportDetail.tsx","../src/shell/StatusBadge.tsx","../src/utils/env.ts","../src/shell/DevIndicator.tsx","../src/shell/WidgetManager.tsx","../src/version.ts","../src/changelog.ts","../src/utils/reportBug.ts","../src/shell/Desktop.tsx","../src/hooks/useTheme.ts","../src/hooks/useClickOutside.ts","../src/shell/StartupAnimation.tsx","../src/shell/LogoutAnimation.tsx","../src/shell/StartMenu.tsx","../src/shell/mobileShellStore.ts","../src/shell/MobileHome.tsx","../src/shell/MobileSwitcher.tsx","../src/shell/MobileNotificationSheet.tsx","../src/shell/MobileProfileSheet.tsx","../src/shell/MobileShell.tsx","../src/shell/Layout.tsx","../src/settings/Customization.tsx","../src/settings/BehaviorPanel.tsx","../src/settings/SoundsPanel.tsx","../src/settings/SystemPreferences.tsx","../src/data/useTableNav.ts","../src/data/useColumnConfig.ts","../src/data/ResizableTable.tsx","../src/data/ListFooter.tsx","../src/data/EntityList.tsx","../src/data/Kanban.tsx","../src/data/useInfiniteScroll.ts","../src/data/useSort.ts","../src/shell/ShellEntityFetcher.tsx","../src/hooks/useNewHotkey.ts","../src/hooks/useEditHotkey.ts"],"names":["useState","useEffect","jsxs","jsx","useRef","useCallback","Fragment","Dialog","DialogBackdrop","DialogPanel","useQueryClient","createContext","useContext","useMemo","previewColor","isValidElement","cloneElement","e","entries","dx","dy","move","navSections","navIcons","sectionIcons","useLayoutEffect","Suspense","timeAgo","useQuery","useSyncExternalStore","lazy","isCustom","sections","useMutation"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * createWindowRegistry — composes a window registry from one or more partial\n * registry maps. Used at the consumer's App layer to merge package-bundled\n * apps with the consumer's own entity windows.\n *\n * const windows = createWindowRegistry(\n * bundledApps, // utility apps + games + Google apps from the package\n * entityWindows, // consumer-defined entity windows (e.g. Sales Order, Invoice)\n * );\n *\n * Later partials override earlier ones on the same key — handy when a\n * consumer wants to swap a built-in app for their own variant.\n */\nimport type { WindowRegistry } from './types';\n\nexport function createWindowRegistry(...partials: WindowRegistry[]): WindowRegistry {\n return Object.assign({}, ...partials);\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useWindowManager } from './WindowManager';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\n\nexport interface SearchResult {\n /** Category label, e.g. \"Sales Order\". */\n type: string;\n /** Primary text shown in the result row. */\n label: string;\n /** Optional secondary line. */\n sub?: string;\n /** Window-registry key passed to openEntity. */\n entity_type: string;\n entity_id: string;\n}\n\n/** A search provider — given a query, returns matching results. The shell\n * calls every provider in parallel and concatenates the responses. */\nexport type SearchProvider = (query: string) => Promise<SearchResult[]>;\n\n/** Bundle of search-related consumer config. */\nexport interface SearchConfig {\n providers: SearchProvider[];\n /** Per-result-type icon (SVG path `d` attribute). Unmatched types fall\n * back to a generic magnifier glyph. */\n typeIcons?: Record<string, string>;\n placeholder?: string;\n}\n\ninterface GlobalSearchProps extends Partial<SearchConfig> {}\n\nconst DEFAULT_MAGNIFIER = 'M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z';\n\nexport default function GlobalSearch({ providers, typeIcons, placeholder = 'Search...' }: GlobalSearchProps = {}) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [activeIdx, setActiveIdx] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const { openEntity } = useWindowManager();\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n\n // Hotkey: Cmd+K / Ctrl+K\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault();\n setOpen(prev => !prev);\n }\n if (e.key === 'Escape' && open) {\n setOpen(false);\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [open]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 50);\n } else {\n setQuery('');\n setResults([]);\n }\n }, [open]);\n\n // Debounced search across all providers\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (query.length < 2) { setResults([]); return; }\n if (!providers || providers.length === 0) { setResults([]); return; }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const responses = await Promise.all(providers.map(p => p(query).catch(() => [] as SearchResult[])));\n setResults(responses.flat());\n setActiveIdx(0);\n } catch { setResults([]); }\n setLoading(false);\n }, 250);\n return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n }, [query, providers]);\n\n const handleSelect = useCallback((result: SearchResult) => {\n setOpen(false);\n openEntity(result.entity_type, result.entity_id, null, result.label);\n }, [openEntity]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); setActiveIdx(i => Math.min(i + 1, results.length - 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActiveIdx(i => Math.max(i - 1, 0)); }\n else if (e.key === 'Enter' && results[activeIdx]) { handleSelect(results[activeIdx]); }\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-[200] flex items-start justify-center pt-[15vh]\" onClick={() => setOpen(false)}>\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" />\n <div className=\"relative z-10 w-full max-w-xl rounded-2xl overflow-hidden\" onClick={e => e.stopPropagation()} style={getGlassStyle()}>\n {/* Search input */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-gray-200\">\n <svg className=\"h-5 w-5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={DEFAULT_MAGNIFIER} />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex-1 text-sm bg-transparent border-0 outline-none placeholder-gray-400\"\n />\n <kbd className=\"hidden sm:inline-flex items-center rounded border border-gray-300 px-1.5 py-0.5 text-[10px] font-medium text-gray-400\">ESC</kbd>\n </div>\n\n {/* Results */}\n <div className=\"max-h-[50vh] overflow-y-auto\">\n {loading && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">Searching...</div>\n )}\n {!loading && query.length >= 2 && results.length === 0 && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">No results found.</div>\n )}\n {!loading && results.length > 0 && (\n <ul className=\"py-2\">\n {results.map((r, i) => (\n <li key={`${r.type}-${r.label}-${i}`}>\n <button\n className={`flex items-center gap-3 w-full px-4 py-2.5 text-left transition-colors ${\n i === activeIdx ? 'bg-blue-50' : 'hover:bg-gray-50'\n }`}\n onClick={() => handleSelect(r)}\n onMouseEnter={() => setActiveIdx(i)}\n >\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={typeIcons?.[r.type] || DEFAULT_MAGNIFIER} />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">{r.label}</p>\n {r.sub && <p className=\"text-xs text-gray-400 truncate\">{r.sub}</p>}\n </div>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-500\">{r.type}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {!loading && query.length < 2 && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">Type at least 2 characters to search...</div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-gray-100 bg-gray-50 text-[11px] text-gray-400\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">&uarr;</kbd><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">&darr;</kbd> navigate</span>\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">Enter</kbd> open</span>\n </div>\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">Esc</kbd> close</span>\n </div>\n </div>\n </div>\n );\n}\n","export const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\n/** Platform-aware modifier symbols */\nexport const MOD = isMac ? '\\u2318' : 'Ctrl';\nexport const ALT = isMac ? '\\u2325' : 'Alt';\nexport const SHIFT = '\\u21E7';\nexport const ENTER = '\\u23CE';\n\n/** Common shortcut labels */\nexport const CMD_ENTER = isMac ? '\\u2318\\u23CE' : 'Ctrl\\u23CE';\nexport const CMD_S = isMac ? '\\u2318S' : 'Ctrl+S';\nexport const CMD_K = isMac ? '\\u2318K' : 'Ctrl+K';\nexport const CMD_DOT = isMac ? '\\u2318.' : 'Ctrl+.';\nexport const CMD_A = isMac ? '\\u2318A' : 'Ctrl+A';\nexport const ALT_SHIFT_D = isMac ? '\\u2325\\u21E7D' : 'Alt+Shift+D';\nexport const ALT_SHIFT_E = isMac ? '\\u2325\\u21E7E' : 'Alt+Shift+E';\nexport const ALT_SHIFT_N = isMac ? '\\u2325\\u21E7N' : 'Alt+Shift+N';\n","import { useState, useEffect } from 'react';\nimport { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react';\nimport { CMD_ENTER, CMD_S, CMD_K, CMD_DOT, CMD_A, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N } from './Kbd';\n\nconst sections = [\n {\n title: 'Global',\n shortcuts: [\n { keys: CMD_K, description: 'Search' },\n { keys: CMD_DOT, description: 'Toggle sidebar' },\n { keys: 'Ctrl F11', description: 'Toggle fullscreen' },\n { keys: 'ESC', description: 'Exit fullscreen (when no windows open)' },\n { keys: '?', description: 'Show keyboard shortcuts' },\n ],\n },\n {\n title: 'Lists',\n shortcuts: [\n { keys: 'J / \\u2193', description: 'Next row' },\n { keys: 'K / \\u2191', description: 'Previous row' },\n { keys: '\\u23CE', description: 'Open selected row' },\n { keys: '\\u21E7J / \\u21E7K', description: 'Move and select' },\n { keys: '\\u21E7 Click', description: 'Range select' },\n { keys: 'Space', description: 'Toggle row checkbox' },\n { keys: CMD_A, description: 'Select / deselect all' },\n { keys: ALT_SHIFT_N, description: 'Create new item' },\n { keys: ALT_SHIFT_E, description: 'Edit selected item' },\n ],\n },\n {\n title: 'Modals / Forms',\n shortcuts: [\n { keys: CMD_ENTER, description: 'Submit' },\n { keys: CMD_S, description: 'Save' },\n { keys: ALT_SHIFT_D, description: 'Save as new (duplicate)' },\n { keys: 'ESC', description: 'Close modal' },\n ],\n },\n];\n\nexport default function ShortcutHelp() {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n const toggle = () => setOpen(prev => !prev);\n document.addEventListener('toggle-shortcut-help', toggle);\n return () => document.removeEventListener('toggle-shortcut-help', toggle);\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === '?' && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.target as HTMLElement)?.isContentEditable) return;\n e.preventDefault();\n setOpen(prev => !prev);\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, []);\n\n return (\n <Dialog open={open} onClose={() => setOpen(false)} className=\"relative z-[9999]\">\n <DialogBackdrop className=\"fixed inset-0 bg-black/30 transition-opacity\" />\n <div className=\"fixed inset-0 flex items-center justify-center p-6\">\n <DialogPanel className=\"w-full max-w-md rounded-lg bg-white shadow-xl\">\n <div className=\"flex items-center justify-between px-5 pt-5 pb-3 border-b border-gray-200\">\n <h2 className=\"text-base font-semibold text-gray-900\">Keyboard Shortcuts</h2>\n <button onClick={() => setOpen(false)} className=\"text-gray-400 hover:text-gray-500 text-sm\">\n ESC\n </button>\n </div>\n <div className=\"px-5 py-4 space-y-5 max-h-[60vh] overflow-y-auto\">\n {sections.map(section => (\n <div key={section.title}>\n <h3 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2\">{section.title}</h3>\n <div className=\"space-y-1.5\">\n {section.shortcuts.map(s => (\n <div key={s.keys + s.description} className=\"flex items-center justify-between\">\n <span className=\"text-sm text-gray-700\">{s.description}</span>\n <kbd className=\"inline-flex items-center rounded border border-gray-300 bg-gray-50 px-2 py-0.5 text-xs font-medium text-gray-600 font-mono\">\n {s.keys}\n </kbd>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n <div className=\"px-5 py-3 border-t border-gray-100 text-center\">\n <span className=\"text-xs text-gray-400\">Press <kbd className=\"rounded border border-gray-300 bg-gray-50 px-1.5 py-0.5 text-[10px] font-medium text-gray-500\">?</kbd> to toggle</span>\n </div>\n </DialogPanel>\n </div>\n </Dialog>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Dependency-free Markdown renderer for help / documentation bodies.\n *\n * Supports the subset used by in-app articles: ATX headings (`##`–`####`),\n * **bold**, *italic*, `inline code`, [links](url), bullet and numbered lists\n * (with wrapped continuation lines), GitHub-style pipe **tables**, `>`\n * blockquote **callouts**, `---` rules, paragraphs, and image syntax\n * `![alt](src)` — which renders as a labelled *screenshot placeholder* box\n * (manual images may not exist yet). Unrecognised syntax degrades to plain\n * text, so author-written articles never break the page. No raw HTML is\n * interpreted.\n */\n\nconst INLINE_RE =\n /!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\*([^*]+)\\*/g;\n\nfunction renderInline(text: string): ReactNode[] {\n const out: ReactNode[] = [];\n let last = 0;\n let key = 0;\n let m: RegExpExecArray | null;\n INLINE_RE.lastIndex = 0;\n while ((m = INLINE_RE.exec(text)) !== null) {\n if (m.index > last) out.push(text.slice(last, m.index));\n if (m[1] !== undefined) {\n out.push(\n <span key={key++} className=\"text-gray-400\">\n [{m[1]}]\n </span>,\n );\n } else if (m[3] !== undefined) {\n out.push(\n <a\n key={key++}\n href={m[4]}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-blue-600 hover:underline\"\n >\n {m[3]}\n </a>,\n );\n } else if (m[5] !== undefined) {\n out.push(\n <strong key={key++} className=\"font-semibold text-gray-900\">\n {m[5]}\n </strong>,\n );\n } else if (m[6] !== undefined) {\n out.push(\n <code\n key={key++}\n className=\"rounded bg-gray-100 px-1 py-0.5 font-mono text-[0.85em] text-gray-800\"\n >\n {m[6]}\n </code>,\n );\n } else if (m[7] !== undefined) {\n out.push(<em key={key++}>{m[7]}</em>);\n }\n last = INLINE_RE.lastIndex;\n }\n if (last < text.length) out.push(text.slice(last));\n return out;\n}\n\nfunction ScreenshotPlaceholder({ alt }: { alt: string }) {\n const label = alt.replace(/^screenshot:\\s*/i, '');\n return (\n <div className=\"my-1 flex items-start gap-2 rounded-lg border border-dashed border-gray-300 bg-gray-50 px-3 py-2.5\">\n <svg\n className=\"mt-0.5 h-4 w-4 shrink-0 text-gray-400\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 6a1.5 1.5 0 0 1 1.5-1.5h1.1l.4-.9a1 1 0 0 1 .9-.6h6.2a1 1 0 0 1 .9.6l.4.9h1.1A1.5 1.5 0 0 1 18 6v8.5A1.5 1.5 0 0 1 16.5 16h-13A1.5 1.5 0 0 1 2 14.5V6Zm7.5 1.5a3.25 3.25 0 1 0 0 6.5 3.25 3.25 0 0 0 0-6.5Z\" />\n </svg>\n <span className=\"text-xs text-gray-500\">\n <span className=\"font-medium text-gray-600\">Screenshot — </span>\n {label}\n </span>\n </div>\n );\n}\n\n/** Collect list items, merging wrapped continuation lines into their item. */\nfunction collectItems(lines: string[], itemRe: RegExp): string[] {\n const items: string[] = [];\n for (const line of lines) {\n const m = itemRe.exec(line);\n if (m) {\n items.push(m[1]);\n } else if (items.length) {\n items[items.length - 1] += ' ' + line.trim();\n }\n }\n return items;\n}\n\nconst splitCells = (line: string): string[] =>\n line\n .replace(/^\\s*\\|/, '')\n .replace(/\\|\\s*$/, '')\n .split('|')\n .map(c => c.trim());\n\n/** A pipe table: header row, a `---|---` separator, then body rows. */\nfunction isTable(lines: string[]): boolean {\n return (\n lines.length >= 2 &&\n lines[0].includes('|') &&\n /^\\s*\\|?[\\s:|-]*-[\\s:|-]*\\|?\\s*$/.test(lines[1]) &&\n lines[1].includes('-')\n );\n}\n\nfunction renderTable(lines: string[], key: number): ReactNode {\n const header = splitCells(lines[0]);\n const rows = lines.slice(2).map(splitCells);\n return (\n <div key={key} className=\"my-1 overflow-x-auto rounded-lg border border-gray-200\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-gray-50\">\n {header.map((h, i) => (\n <th\n key={i}\n className=\"border-b border-gray-200 px-3 py-1.5 text-left font-semibold text-gray-700\"\n >\n {renderInline(h)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={r} className=\"even:bg-gray-50/50\">\n {row.map((c, i) => (\n <td key={i} className=\"border-t border-gray-100 px-3 py-1.5 align-top text-gray-700\">\n {renderInline(c)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction renderBlock(block: string, key: number): ReactNode {\n const lines = block.split('\\n');\n const first = lines[0];\n\n const heading = /^(#{2,4})\\s+(.*)$/.exec(first);\n if (heading && lines.length === 1) {\n const level = heading[1].length;\n const Tag = (`h${level}` as 'h2');\n const cls =\n level === 2\n ? 'mt-2 text-[13px] font-semibold uppercase tracking-wide text-gray-500'\n : level === 3\n ? 'mt-1 text-base font-semibold text-gray-900'\n : 'mt-1 text-sm font-semibold text-gray-900';\n return (\n <Tag key={key} className={cls}>\n {renderInline(heading[2])}\n </Tag>\n );\n }\n\n if (lines.length === 1 && /^---+$/.test(first)) {\n return <hr key={key} className=\"border-gray-200\" />;\n }\n\n if (isTable(lines)) {\n return renderTable(lines, key);\n }\n\n if (/^>\\s?/.test(first)) {\n const text = lines.map(l => l.replace(/^>\\s?/, '')).join(' ');\n return (\n <div\n key={key}\n className=\"my-1 rounded-r-lg border-l-4 border-blue-300 bg-blue-50/60 px-3 py-2 text-gray-700\"\n >\n {renderInline(text)}\n </div>\n );\n }\n\n const img = /^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/.exec(first);\n if (img && lines.length === 1) {\n return <ScreenshotPlaceholder key={key} alt={img[1]} />;\n }\n\n if (/^[-*]\\s+/.test(first)) {\n const items = collectItems(lines, /^[-*]\\s+(.*)$/);\n return (\n <ul key={key} className=\"list-disc space-y-1 pl-5 marker:text-gray-400\">\n {items.map((it, j) => (\n <li key={j}>{renderInline(it)}</li>\n ))}\n </ul>\n );\n }\n\n const ordered = /^(\\d+)\\.\\s+/.exec(first);\n if (ordered) {\n const items = collectItems(lines, /^\\d+\\.\\s+(.*)$/);\n return (\n <ol\n key={key}\n start={Number(ordered[1])}\n className=\"list-decimal space-y-1 pl-5 marker:text-gray-400\"\n >\n {items.map((it, j) => (\n <li key={j} className=\"pl-1\">\n {renderInline(it)}\n </li>\n ))}\n </ol>\n );\n }\n\n return <p key={key}>{renderInline(lines.join(' '))}</p>;\n}\n\nexport interface MarkdownProps {\n children: string;\n className?: string;\n}\n\nexport default function Markdown({ children, className }: MarkdownProps) {\n const blocks = (children ?? '')\n .replace(/\\r\\n/g, '\\n')\n .split(/\\n{2,}/)\n .map(b => b.replace(/\\s+$/, ''))\n .filter(b => b.trim() !== '');\n\n return (\n <div className={`space-y-3 text-sm leading-relaxed text-gray-700 ${className ?? ''}`.trim()}>\n {blocks.map((block, i) => renderBlock(block, i))}\n </div>\n );\n}\n","import { useMemo, useState, type ReactNode } from 'react';\nimport Markdown from './Markdown';\n\n/**\n * One help article. Generic shape — the consuming portal maps its own\n * help-doc records onto this before passing them in.\n */\nexport interface HelpCenterDoc {\n id: string;\n slug: string;\n title: string;\n body: string;\n /** Grouping key (e.g. `'getting_started'`). */\n category: string;\n /** Group header text (e.g. \"Getting Started\"). */\n category_label: string;\n /** When `false`, a \"Draft\" badge is shown. Omit for always-published docs. */\n is_published?: boolean;\n}\n\nexport interface HelpCenterProps {\n docs: HelpCenterDoc[];\n loading?: boolean;\n /**\n * Category keys in display order. Categories not listed fall to the end in\n * first-seen order. Without it, groups follow first-seen order.\n */\n categoryOrder?: string[];\n /** Show the New/Edit affordances (consumer gates this on write permission). */\n canEdit?: boolean;\n onNew?: () => void;\n onEdit?: (doc: HelpCenterDoc) => void;\n /** Custom body renderer; defaults to preformatted text. */\n renderBody?: (doc: HelpCenterDoc) => ReactNode;\n emptyMessage?: string;\n}\n\ninterface Group {\n key: string;\n label: string;\n docs: HelpCenterDoc[];\n}\n\nconst Chevron = ({ open }: { open: boolean }) => (\n <svg\n className={`h-3.5 w-3.5 shrink-0 text-gray-400 transition-transform ${open ? 'rotate-90' : ''}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 0 1 .02-1.06L11.168 10 7.23 6.29a.75.75 0 1 1 1.04-1.08l4.5 4.25a.75.75 0 0 1 0 1.08l-4.5 4.25a.75.75 0 0 1-1.06-.02Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * In-app help / documentation viewer. Two panes: a searchable, collapsible\n * category tree on the left, the selected article's body on the right.\n *\n * Presentational only — it holds no API or permission knowledge. The consumer\n * fetches its own help docs, maps them to `HelpCenterDoc`, and (for editors)\n * wires `canEdit` + `onNew`/`onEdit` to its own create/edit UI.\n *\n * Search is client-side: a case-insensitive substring match over title, body\n * and category label. While searching, matching groups auto-expand.\n */\nexport default function HelpCenter({\n docs,\n loading = false,\n categoryOrder,\n canEdit = false,\n onNew,\n onEdit,\n renderBody,\n emptyMessage = 'No help articles yet.',\n}: HelpCenterProps) {\n const [query, setQuery] = useState('');\n const [selectedSlug, setSelectedSlug] = useState<string | null>(null);\n // Per-category open/closed override. A category absent from the map uses its\n // default (only the selected article's group starts open).\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const q = query.trim().toLowerCase();\n\n // Group docs by category, preserving categoryOrder then first-seen order.\n const groups = useMemo<Group[]>(() => {\n const map = new Map<string, Group>();\n for (const doc of docs) {\n let g = map.get(doc.category);\n if (!g) {\n g = { key: doc.category, label: doc.category_label || doc.category, docs: [] };\n map.set(doc.category, g);\n }\n g.docs.push(doc);\n }\n if (!categoryOrder?.length) return [...map.values()];\n const rank = new Map(categoryOrder.map((k, i) => [k, i]));\n return [...map.values()].sort(\n (a, b) => (rank.get(a.key) ?? Infinity) - (rank.get(b.key) ?? Infinity),\n );\n }, [docs, categoryOrder]);\n\n const matches = (doc: HelpCenterDoc) =>\n !q ||\n doc.title.toLowerCase().includes(q) ||\n doc.body.toLowerCase().includes(q) ||\n doc.category_label.toLowerCase().includes(q);\n\n // Groups with their docs filtered by the search query; empty groups drop out.\n const visibleGroups = useMemo<Group[]>(\n () =>\n groups\n .map(g => ({ ...g, docs: g.docs.filter(matches) }))\n .filter(g => g.docs.length > 0),\n [groups, q],\n );\n\n const visibleDocs = useMemo(() => visibleGroups.flatMap(g => g.docs), [visibleGroups]);\n\n // Keep the chosen article if it's still visible, else fall back to the first\n // visible one (so typing a query jumps to the first match).\n const selected =\n (selectedSlug ? visibleDocs.find(d => d.slug === selectedSlug) : undefined) ??\n visibleDocs[0] ??\n null;\n\n const isGroupOpen = (key: string) =>\n q ? true : (expanded[key] ?? key === selected?.category);\n\n const toggleGroup = (key: string) =>\n setExpanded(prev => ({ ...prev, [key]: !isGroupOpen(key) }));\n\n return (\n <div className=\"flex h-full gap-4 px-4 py-3 min-h-0\">\n <aside className=\"w-64 shrink-0 flex flex-col bg-white rounded-lg shadow overflow-hidden\">\n <div className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <h2 className=\"text-sm font-semibold text-gray-900\">Help</h2>\n {canEdit && onNew && (\n <button type=\"button\" onClick={onNew} className=\"text-xs text-blue-600 hover:underline\">\n + New\n </button>\n )}\n </div>\n\n <div className=\"px-2.5 py-2 border-b border-gray-100 shrink-0\">\n <div className=\"relative\">\n <svg\n className=\"pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M9 3.5a5.5 5.5 0 1 0 3.36 9.85l3.14 3.15a.75.75 0 1 0 1.06-1.06l-3.15-3.14A5.5 5.5 0 0 0 9 3.5ZM5 9a4 4 0 1 1 8 0 4 4 0 0 1-8 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <input\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n placeholder=\"Search help…\"\n className=\"w-full rounded-md border border-gray-300 bg-white py-1.5 pl-8 pr-2 text-sm shadow-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto py-1\">\n {loading ? (\n <p className=\"px-3 py-6 text-center text-xs text-gray-400\">Loading…</p>\n ) : visibleGroups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-xs text-gray-500\">\n {q ? 'No articles match your search.' : emptyMessage}\n </p>\n ) : (\n visibleGroups.map(group => {\n const open = isGroupOpen(group.key);\n return (\n <div key={group.key} className=\"py-0.5\">\n <button\n type=\"button\"\n onClick={() => toggleGroup(group.key)}\n className=\"w-full flex items-center gap-1.5 px-3 py-1.5 text-left text-[10px] font-semibold uppercase tracking-wide text-gray-400 hover:text-gray-600\"\n >\n <Chevron open={open} />\n <span className=\"truncate\">{group.label}</span>\n </button>\n {open &&\n group.docs.map(doc => {\n const active = selected?.slug === doc.slug;\n return (\n <button\n key={doc.slug}\n type=\"button\"\n onClick={() => setSelectedSlug(doc.slug)}\n className={`w-full text-left pl-8 pr-3 py-1.5 text-sm flex items-center gap-1.5 transition-colors ${\n active\n ? 'bg-blue-50 text-blue-700 font-medium'\n : 'text-gray-700 hover:bg-gray-50'\n }`}\n >\n <span className=\"truncate\">{doc.title}</span>\n {doc.is_published === false && (\n <span className=\"ml-auto shrink-0 text-[10px] text-amber-600\">Draft</span>\n )}\n </button>\n );\n })}\n </div>\n );\n })\n )}\n </div>\n </aside>\n\n <main className=\"flex-1 min-w-0 bg-white rounded-lg shadow overflow-hidden flex flex-col\">\n {selected ? (\n <>\n <div className=\"flex items-start justify-between gap-4 px-5 py-3 border-b border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold text-gray-900 truncate\">{selected.title}</h1>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {selected.category_label}\n {selected.is_published === false && (\n <span className=\"ml-2 text-amber-600\">· Draft</span>\n )}\n </p>\n </div>\n {canEdit && onEdit && (\n <button\n type=\"button\"\n onClick={() => onEdit(selected)}\n className=\"shrink-0 text-sm text-blue-600 hover:underline\"\n >\n Edit\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-auto px-5 py-4\">\n {renderBody ? (\n renderBody(selected)\n ) : selected.body ? (\n <Markdown>{selected.body}</Markdown>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">This article has no body yet.</p>\n )}\n </div>\n </>\n ) : (\n <div className=\"flex-1 flex items-center justify-center px-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n {loading ? 'Loading…' : 'Pick a help article from the left.'}\n </p>\n </div>\n )}\n </main>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent } from 'react';\n\n/**\n * Two-pane layout with a drag-to-resize left sidebar.\n *\n * Renders flush (`h-full w-full`) — pair it with a `flushBody` window so the\n * sidebar runs from just under the title bar to the very bottom with no\n * surrounding padding. The user can drag the right edge of the sidebar to\n * resize it; pass `storageKey` to persist that width across reopens, or\n * double-click the handle to reset to `defaultWidth`.\n *\n * @example\n * <SidebarLayout sidebar={<MyNav />} storageKey=\"todo.sidebarWidth\">\n * <MyContent />\n * </SidebarLayout>\n */\nexport interface SidebarLayoutProps {\n /** Content of the left sidebar pane. */\n sidebar: ReactNode;\n /** Content of the main pane (right of the sidebar). */\n children: ReactNode;\n /** localStorage key to persist the sidebar width across reopens. When set,\n * the last dragged width is restored on mount. Omit for session-only width. */\n storageKey?: string;\n /** Initial sidebar width in px (used when nothing is persisted). Default 256. */\n defaultWidth?: number;\n /** Minimum sidebar width in px. Default 180. */\n minWidth?: number;\n /** Maximum sidebar width in px. Default 480. */\n maxWidth?: number;\n /** Extra classes for the outer flex row. */\n className?: string;\n /** Classes for the sidebar pane (background, border, …). The pane is a flex\n * column that scrolls its own overflow. Defaults to a light-grey,\n * right-bordered sidebar. */\n sidebarClassName?: string;\n /** Classes for the main content pane. Defaults to a white background. */\n contentClassName?: string;\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi);\n\nexport default function SidebarLayout({\n sidebar,\n children,\n storageKey,\n defaultWidth = 256,\n minWidth = 180,\n maxWidth = 480,\n className = '',\n sidebarClassName = 'border-r border-gray-200 bg-gray-50',\n contentClassName = 'bg-white',\n}: SidebarLayoutProps) {\n const [width, setWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = window.localStorage.getItem(storageKey);\n const n = saved ? parseInt(saved, 10) : NaN;\n if (!Number.isNaN(n)) return clamp(n, minWidth, maxWidth);\n }\n return clamp(defaultWidth, minWidth, maxWidth);\n });\n\n const dragRef = useRef<{ startX: number; startWidth: number } | null>(null);\n\n const onMove = useCallback((e: PointerEvent) => {\n const d = dragRef.current;\n if (!d) return;\n setWidth(clamp(d.startWidth + (e.clientX - d.startX), minWidth, maxWidth));\n }, [minWidth, maxWidth]);\n\n const onUp = useCallback(() => {\n dragRef.current = null;\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.removeProperty('cursor');\n document.body.style.removeProperty('user-select');\n }, [onMove]);\n\n const startDrag = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n dragRef.current = { startX: e.clientX, startWidth: width };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [width, onMove, onUp]);\n\n // Persist (debounced) once the width settles.\n useEffect(() => {\n if (!storageKey) return;\n const id = window.setTimeout(() => {\n try { window.localStorage.setItem(storageKey, String(Math.round(width))); } catch { /* ignore quota / privacy mode */ }\n }, 200);\n return () => window.clearTimeout(id);\n }, [width, storageKey]);\n\n // Drop listeners if we unmount mid-drag.\n useEffect(() => () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n }, [onMove, onUp]);\n\n return (\n <div className={`flex h-full w-full overflow-hidden ${className}`}>\n <div className=\"relative flex h-full shrink-0 flex-col\" style={{ width }}>\n <div className={`flex h-full flex-col overflow-y-auto ${sidebarClassName}`}>\n {sidebar}\n </div>\n {/* Resize handle — pinned to the right edge, fixed while the pane scrolls. */}\n <div\n onPointerDown={startDrag}\n onDoubleClick={() => setWidth(clamp(defaultWidth, minWidth, maxWidth))}\n title=\"Drag to resize · double-click to reset\"\n className=\"group absolute inset-y-0 right-0 z-10 w-2 cursor-col-resize\"\n >\n <div className=\"absolute inset-y-0 right-0 w-px bg-transparent transition-colors group-hover:bg-blue-400\" />\n </div>\n </div>\n <div className={`flex min-w-0 flex-1 flex-col ${contentClassName}`}>\n {children}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { formatDate } from '../utils/date';\nimport { playNotification } from '../utils/sounds';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider, PopupMenuLabel } from './PopupMenu';\n\n/** Generic notification shape consumed by the shell. Consumer-specific\n * fields live on `extra` (or just on additional properties — TS structural\n * typing is permissive). */\nexport interface ShellNotification {\n id: string;\n title: string;\n message?: string;\n entity_type?: string;\n entity_id?: string;\n entity_label?: string;\n is_read: boolean;\n actor_name?: string;\n created_at: string;\n}\n\n/** Config bundle for the notification system. Supplied by the consumer;\n * the shell never calls a hardcoded URL. */\nexport interface NotificationsConfig {\n /** Hook called inside <NotificationBell> on every render. Return the\n * current unread count for the signed-in user. */\n useUnreadCount: () => number;\n /** Fetcher for the dropdown list (most recent first). */\n list: (params?: { page_size?: number }) => Promise<{ results: ShellNotification[] }>;\n /** Mark a single notification as read. */\n markRead: (id: string) => Promise<unknown>;\n /** Mark every unread notification as read. */\n markAllRead: () => Promise<unknown>;\n /** Click handler for a notification item. */\n onItemClick: (notif: ShellNotification) => void;\n /** Click handler for \"View all notifications\". When omitted, the link is hidden. */\n onViewAll?: () => void;\n}\n\nfunction timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return formatDate(dateStr);\n}\n\ninterface NotificationBellProps extends NotificationsConfig {\n popDirection?: 'left' | 'right';\n}\n\nexport default function NotificationBell({\n useUnreadCount, list, markRead, markAllRead, onItemClick, onViewAll, popDirection,\n}: NotificationBellProps) {\n const [open, setOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const queryClient = useQueryClient();\n\n const unreadCount = useUnreadCount();\n\n useEffect(() => {\n if ('Notification' in window && Notification.permission === 'default') Notification.requestPermission();\n }, []);\n\n // Extracted click flow shared by the bell popup, the toast, and the\n // browser-Notification fallback. Optimistic mark-read + invoke consumer\n // `onItemClick` to open the entity.\n const handleClick = useCallback((notif: ShellNotification) => {\n if (!notif.is_read) {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: Math.max(0, (old.count || 0) - 1) } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => n.id === notif.id ? { ...n, is_read: true } : n) };\n });\n markRead(notif.id).catch(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n }\n setOpen(false);\n onItemClick(notif);\n }, [queryClient, markRead, onItemClick]);\n\n // The actionable in-page notification — top-right, click anywhere on the\n // card to open the entity (same behavior as clicking the same item in the\n // bell popup), X to dismiss only. Lives as React state (not via toast.info)\n // so the click target is a first-class part of the notification system.\n const [inlineNotif, setInlineNotif] = useState<ShellNotification | null>(null);\n const inlineTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dismissInline = useCallback(() => {\n if (inlineTimerRef.current) { clearTimeout(inlineTimerRef.current); inlineTimerRef.current = null; }\n setInlineNotif(null);\n }, []);\n const showInlineNotif = useCallback((notif: ShellNotification, durationMs = 5000) => {\n setInlineNotif(notif);\n playNotification();\n if (inlineTimerRef.current) clearTimeout(inlineTimerRef.current);\n inlineTimerRef.current = setTimeout(() => setInlineNotif(null), durationMs);\n }, []);\n useEffect(() => () => { if (inlineTimerRef.current) clearTimeout(inlineTimerRef.current); }, []);\n\n const prevCountRef = useRef<number | null>(null);\n useEffect(() => {\n if (prevCountRef.current === null) { prevCountRef.current = unreadCount; return; }\n if (unreadCount > prevCountRef.current) {\n list({ page_size: 1 }).then(data => {\n const latest = data?.results?.[0];\n if (!latest) return;\n const title = latest.title || 'New Notification';\n const body = latest.message || latest.entity_label || '';\n if (document.hidden) {\n if ('Notification' in window && Notification.permission === 'granted') {\n const n = new Notification(title, { body, icon: '/favicon.svg', tag: `notif-${latest.id}` });\n n.onclick = () => { window.focus(); handleClick(latest); n.close(); };\n }\n } else {\n showInlineNotif(latest);\n }\n }).catch(() => {});\n }\n prevCountRef.current = unreadCount;\n }, [unreadCount, list, showInlineNotif]);\n\n // Always run on mount + every 30s so the dropdown is always populated\n // with cached data before the first click — no loading-state flash.\n const { data: notifData } = useQuery({\n queryKey: ['notifications-dropdown'],\n queryFn: () => list({ page_size: 30 }),\n staleTime: 30_000,\n refetchInterval: 30_000,\n });\n const notifications: ShellNotification[] = notifData?.results ?? [];\n\n // Outside-click is handled by PopupMenu's own onClose listener. Since the\n // popup is portaled into document.body it doesn't sit inside dropdownRef,\n // so any handler scoped to dropdownRef would fire pointerdown on items\n // inside the popup and close it before their onClick runs — see #issue.\n\n const handleMarkAllRead = () => {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: 0 } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => ({ ...n, is_read: true })) };\n });\n markAllRead().then(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n };\n\n const [dropdownPos, setDropdownPos] = useState<Record<string, number | string>>({});\n const calcPos = useCallback(() => {\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 56;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const verticalReserve = (taskbarPos === 'top' || taskbarPos === 'bottom') ? taskbarH + 16 : 16;\n const maxHeight = `calc(100vh - ${verticalReserve}px)`;\n if (popDirection === 'right') setDropdownPos({ left: taskbarW + 8, bottom: 8, maxHeight });\n else if (popDirection === 'left') setDropdownPos({ right: taskbarW + 8, bottom: 8, maxHeight });\n else if (taskbarPos === 'top') setDropdownPos({ right: 8, top: taskbarH + 8, maxHeight });\n else setDropdownPos({ right: 8, bottom: taskbarH + 8, maxHeight });\n }, [popDirection]);\n // Run synchronously before paint so the dropdown renders at the right\n // position on first open (otherwise it briefly flashes at viewport origin).\n useLayoutEffect(() => {\n if (!open) return;\n calcPos();\n }, [open, calcPos]);\n useEffect(() => {\n if (!open) return;\n window.addEventListener('resize', calcPos);\n return () => window.removeEventListener('resize', calcPos);\n }, [open, calcPos]);\n\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button ref={buttonRef} data-menu-toggle\n onMouseEnter={() => queryClient.prefetchQuery({ queryKey: ['notifications-dropdown'], queryFn: () => list({ page_size: 30 }) })}\n onClick={() => setOpen(prev => !prev)}\n title=\"Notifications\"\n className=\"relative shrink-0 rounded-md p-2 text-gray-900 hover:text-black hover:bg-white/20 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"absolute top-0.5 right-0.5 flex h-4 min-w-[16px] items-center justify-center rounded-full bg-red-500 px-1 text-[10px] font-bold text-white\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </button>\n\n {open && createPortal(\n <PopupMenu minWidth={320} className=\"w-80 flex flex-col overflow-hidden\" style={{ ...dropdownPos }} onClose={() => setOpen(false)}>\n <PopupMenuLabel>\n <span className=\"flex items-center justify-between w-full\">\n <span>Notifications</span>\n {unreadCount > 0 && (\n <button onClick={handleMarkAllRead} className=\"text-[10px] text-blue-600 hover:text-blue-700 font-medium normal-case tracking-normal\">\n Mark all read\n </button>\n )}\n </span>\n </PopupMenuLabel>\n <PopupMenuDivider />\n <div className=\"overflow-y-auto\" style={{ flex: '1 1 auto', minHeight: 0 }}>\n {notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\n <svg className=\"h-8 w-8 text-gray-300 mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n <p className=\"text-sm text-gray-600 font-medium\">All caught up</p>\n <p className=\"text-xs text-gray-400 mt-0.5\">No notifications yet</p>\n </div>\n ) : (\n notifications.map(notif => (\n <PopupMenuItem key={notif.id} onClick={() => handleClick(notif)}>\n <div className=\"pt-0.5 shrink-0\">\n {!notif.is_read ? <div className=\"h-2 w-2 rounded-full bg-blue-500\" /> : <div className=\"h-2 w-2\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className={`text-sm leading-tight ${!notif.is_read ? 'font-medium' : ''}`}>{notif.title}</p>\n {notif.message && <p className=\"text-xs text-gray-500 mt-0.5 truncate\">{notif.message}</p>}\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-[10px] text-gray-400\">{timeAgo(notif.created_at)}</span>\n {notif.actor_name && <span className=\"text-[10px] text-gray-400\">by {notif.actor_name}</span>}\n </div>\n </div>\n </PopupMenuItem>\n ))\n )}\n </div>\n {onViewAll && (\n <>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setOpen(false); onViewAll(); }}>\n <span className=\"w-full text-center text-xs text-blue-600 font-medium\">View all notifications</span>\n </PopupMenuItem>\n </>\n )}\n </PopupMenu>,\n document.body\n )}\n\n {inlineNotif && createPortal(\n <>\n <style>{`@keyframes notif-in { from { opacity: 0; transform: translateX(30px) scale(0.95); } to { opacity: 1; transform: translateX(0) scale(1); } }`}</style>\n <div\n onClick={() => { handleClick(inlineNotif); dismissInline(); }}\n className=\"fixed top-4 right-4 z-[9999] w-[320px] max-w-[calc(100vw-2rem)] cursor-pointer rounded-2xl bg-white/85 backdrop-blur-md border border-white/40 shadow-2xl flex items-start gap-3 px-4 py-3\"\n style={{ animation: 'notif-in 300ms cubic-bezier(0.4,0,0.2,1)' }}\n >\n <div className=\"h-9 w-9 shrink-0 rounded-lg bg-blue-500/15 flex items-center justify-center\">\n <svg className=\"h-5 w-5 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-blue-600 mb-0.5\">Notification</div>\n <div className=\"text-sm font-medium text-gray-800 leading-snug truncate\">{inlineNotif.title}</div>\n {inlineNotif.message && (\n <div className=\"text-xs text-gray-500 leading-snug truncate mt-0.5\">{inlineNotif.message}</div>\n )}\n </div>\n <button\n onClick={(e) => { e.stopPropagation(); dismissInline(); }}\n className=\"shrink-0 p-1 -mr-1 -mt-1 text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Dismiss notification\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </>,\n document.body\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback, createContext, useContext, lazy, Suspense, type ReactNode } from 'react';\nimport { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';\n\n/**\n * Feedback dialog — shows the captured screenshot and lets the user pick\n * Bug or Suggestion and add a quick description before sending.\n *\n * Triggered imperatively from utils/reportBug.ts via openBugReportDialog().\n * The Provider is mounted once at the App root.\n */\n\nexport type ReportType = 'bug' | 'suggestion';\n\n/** Extra select-style field the consumer can inject into the bug-report\n * dialog (e.g. a \"module\" picker that the consumer's submit callback\n * forwards to its API). Rendered above the description textarea so\n * reporters confirm or override before submitting. The shell stays\n * generic — it knows nothing about what the field actually means. */\nexport interface BugReportExtraSelectField {\n /** Stable key — used as the form-field name and as the lookup key\n * in the submission payload's `extras` map. */\n key: string;\n /** Visible label above the select. */\n label: string;\n type: 'select';\n /** Choices rendered in the dropdown, in order. */\n options: { value: string; label: string }[];\n /** Initial value. Either a literal or a function called with the\n * open-dialog context (current URL, the pending report type) so the\n * consumer can auto-detect from where the user is when the dialog\n * opens. */\n defaultValue?: string | ((ctx: { url: string; reportType: ReportType }) => string);\n /** Optional helper text shown beneath the select. */\n hint?: string;\n}\nexport type BugReportExtraField = BugReportExtraSelectField;\n\nexport interface BugReportSubmission {\n description: string;\n reportType: ReportType;\n /** The screenshot the user actually wants to send. Reflects any in-dialog\n * annotation: callers should upload THIS blob, not the original capture\n * they passed into `openBugReportDialog`. May be null if the original\n * capture failed and the user submitted without uploading a fallback. */\n screenshot: Blob | null;\n /** Map of consumer-supplied extra-field values keyed by field.key. Empty\n * object when no extras were declared. */\n extras: Record<string, string>;\n}\n\n/** Generic bug-report record shape consumed by the shell's list/detail UI. */\nexport interface BugReport {\n id: string;\n report_code?: string;\n reporter_name?: string | null;\n screenshot_url?: string | null;\n url?: string;\n user_agent?: string;\n viewport?: string;\n description?: string;\n report_type?: ReportType;\n is_resolved: boolean;\n resolution_note?: string;\n created_at: string;\n // Allow consumer-specific fields without blocking compilation\n [k: string]: unknown;\n}\n\n/** Payload that <reportBug> sends to the consumer's `submit` callback. */\nexport interface BugReportSubmitPayload {\n description?: string;\n screenshot?: Blob;\n url: string;\n userAgent: string;\n viewport: string;\n reportType: ReportType;\n /** Values for any consumer-declared `extraFields` (keyed by field.key).\n * Always present; empty object when no extras were declared. */\n extras: Record<string, string>;\n}\n\n/** Config bundle for the bug-report subsystem. Consumer-supplied; the shell\n * never calls a hardcoded URL. */\nexport interface BugReportConfig {\n submit: (p: BugReportSubmitPayload) => Promise<unknown>;\n /** Extra fields to render inside the bug-report dialog above the\n * description textarea. Keeps the consumer's domain-specific\n * metadata (e.g. \"which module is this report about?\") in the same\n * one-step submit flow without forking the shell dialog. */\n extraFields?: BugReportExtraField[];\n /** Fetcher for the admin Bug Reports list. Receives query-string-shaped\n * params (e.g. `is_resolved=false`); paginated response. When omitted the\n * Bug Reports list page is unavailable. */\n list?: (params?: Record<string, string>) => Promise<{ results: BugReport[]; count?: number; next?: string | null; previous?: string | null }>;\n /** Mark a report resolved or reopened, with an optional admin note. */\n resolve?: (id: string, is_resolved: boolean, resolution_note?: string) => Promise<BugReport>;\n /** Permanently delete a report. When omitted the Delete button in\n * `<BugReportDetail>` is hidden — the consumer's permission system\n * decides whether to expose the capability at all. */\n delete?: (id: string) => Promise<void>;\n}\n\nconst BugReportContext = createContext<BugReportConfig | null>(null);\n\nexport function BugReportConfigProvider({ value, children }: { value: BugReportConfig; children: ReactNode }) {\n return <BugReportContext.Provider value={value}>{children}</BugReportContext.Provider>;\n}\n\n/** Returns the consumer-supplied bug-report config, or null when no provider\n * is mounted. Click handlers should hide their menu item if this is null. */\nexport function useBugReport(): BugReportConfig | null {\n return useContext(BugReportContext);\n}\n\ntype OpenFn = (screenshot: Blob | null) => Promise<BugReportSubmission | null>;\n\nlet globalOpen: OpenFn = () => Promise.resolve(null);\nexport const openBugReportDialog: OpenFn = (screenshot) => globalOpen(screenshot);\n\nexport function BugReportProvider({ children }: { children: React.ReactNode }) {\n const [open, setOpen] = useState(false);\n const [screenshot, setScreenshot] = useState<Blob | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [description, setDescription] = useState('');\n const [reportType, setReportType] = useState<ReportType>('bug');\n // Values for consumer-declared extra fields, keyed by field.key. Re-\n // initialised every time the dialog opens so a fresh report doesn't\n // inherit the previous session's selection.\n const [extras, setExtras] = useState<Record<string, string>>({});\n // Annotator overlay state — opens on top of the dialog. Lazy-loaded so\n // the annotator (and its SVG/canvas weight) only enters the bundle when\n // the user actually opens it.\n const [annotating, setAnnotating] = useState(false);\n const resolveRef = useRef<(value: BugReportSubmission | null) => void>();\n // Pull the consumer-supplied extra-field config — dialog renders one\n // labelled select per entry above the description textarea.\n const config = useContext(BugReportContext);\n const extraFields = config?.extraFields ?? [];\n\n const openFn: OpenFn = useCallback((s) => {\n setScreenshot(s);\n setDescription('');\n setReportType('bug');\n // Seed extra-field values from each field's defaultValue. The\n // function form receives { url, reportType } so a consumer can\n // auto-detect from the page the user was on (e.g. derive\n // module=clients from /orders/...). Plain string defaults pass\n // through verbatim. New report defaults to `reportType: 'bug'`,\n // matching setReportType above.\n const seeded: Record<string, string> = {};\n const ctx = { url: window.location.href, reportType: 'bug' as ReportType };\n for (const f of extraFields) {\n if (typeof f.defaultValue === 'function') {\n try { seeded[f.key] = f.defaultValue(ctx) ?? ''; }\n catch { seeded[f.key] = f.options[0]?.value ?? ''; }\n } else if (typeof f.defaultValue === 'string') {\n seeded[f.key] = f.defaultValue;\n } else {\n seeded[f.key] = f.options[0]?.value ?? '';\n }\n }\n setExtras(seeded);\n // Defensive: ensure we never re-open straight into the annotator if a\n // previous session somehow exited with `annotating` left at true.\n setAnnotating(false);\n setOpen(true);\n return new Promise<BugReportSubmission | null>(resolve => {\n resolveRef.current = resolve;\n });\n }, [extraFields]);\n\n useEffect(() => { globalOpen = openFn; }, [openFn]);\n\n // Manage object URL lifetime for the preview\n useEffect(() => {\n if (!screenshot) { setPreviewUrl(null); return; }\n const url = URL.createObjectURL(screenshot);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [screenshot]);\n\n // Paste-to-attach: while the dialog is open, pasting an image from the\n // clipboard replaces the screenshot. Lets a user grab a system screenshot\n // (Cmd+Shift+4 / Win+Shift+S) and drop it in without leaving the dialog.\n // Listens at the document level so it works regardless of focus —\n // including from the description textarea, where the image side of the\n // clipboard would otherwise be silently dropped (textareas don't accept\n // image paste). We deliberately DON'T preventDefault: if the clipboard\n // also has text, the textarea's normal text paste still runs.\n useEffect(() => {\n if (!open) return;\n const onPaste = (e: ClipboardEvent) => {\n const items = Array.from(e.clipboardData?.items ?? []);\n const imageItem = items.find((it) => it.kind === 'file' && it.type.startsWith('image/'));\n if (!imageItem) return;\n const blob = imageItem.getAsFile();\n if (!blob) return;\n setScreenshot(blob);\n };\n document.addEventListener('paste', onPaste);\n return () => document.removeEventListener('paste', onPaste);\n }, [open]);\n\n const handleSubmit = () => {\n setAnnotating(false);\n setOpen(false);\n // Pass the current screenshot (which may be the annotated blob if the\n // user marked it up before sending) rather than relying on the caller\n // to remember what they captured.\n resolveRef.current?.({ description: description.trim(), reportType, screenshot, extras });\n };\n\n const handleCancel = () => {\n setAnnotating(false);\n setOpen(false);\n resolveRef.current?.(null);\n };\n\n const isBug = reportType === 'bug';\n\n return (\n <>\n {children}\n <Dialog\n open={open}\n // Suppress onClose while the annotator is up. The annotator is nested\n // inside <Dialog> (so it isn't inert and receives pointer events), but\n // it's a sibling of <DialogPanel> — and HeadlessUI treats anything\n // outside the panel as an outside-click. Without this, every click on\n // the annotator's toolbar/canvas would dismiss the bug-report dialog.\n // The annotator's own Apply / Cancel buttons drive setAnnotating(false).\n onClose={annotating ? () => {} : handleCancel}\n className=\"relative z-[9999]\"\n >\n <DialogBackdrop className=\"fixed inset-0 bg-black/40\" />\n <div className=\"fixed inset-0 flex items-center justify-center p-4\">\n <DialogPanel className=\"w-full max-w-2xl rounded-lg bg-white p-6 shadow-xl\">\n <DialogTitle className=\"text-base font-semibold text-gray-900\">Suggestion or Bug</DialogTitle>\n <p className=\"mt-1 text-xs text-gray-500\">A screenshot of your current view will be sent to the admin team.</p>\n\n <div className=\"mt-4 inline-flex rounded-lg border border-gray-300 bg-gray-50 p-0.5\">\n <button type=\"button\" onClick={() => setReportType('bug')}\n className={`px-3 py-1 text-sm font-medium rounded-md transition-colors ${isBug ? 'bg-white text-gray-900 shadow-sm' : 'text-gray-600 hover:text-gray-900'}`}>\n Bug\n </button>\n <button type=\"button\" onClick={() => setReportType('suggestion')}\n className={`px-3 py-1 text-sm font-medium rounded-md transition-colors ${!isBug ? 'bg-white text-gray-900 shadow-sm' : 'text-gray-600 hover:text-gray-900'}`}>\n Suggestion\n </button>\n </div>\n\n {previewUrl && (\n <div className=\"mt-4\">\n <div className=\"relative rounded-md border border-gray-200 overflow-hidden bg-gray-50 max-h-64\">\n <img src={previewUrl} alt=\"Screenshot preview\" className=\"w-full h-auto max-h-64 object-contain\" />\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n className=\"absolute top-2 right-2 inline-flex items-center gap-1 px-2.5 py-1 rounded-md bg-white/95 backdrop-blur border border-gray-200 shadow-sm text-xs font-medium text-gray-700 hover:bg-white\"\n title=\"Mark up the screenshot — circle, arrow, mosaic, text…\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\" />\n </svg>\n Annotate\n </button>\n </div>\n <p className=\"mt-1 text-[11px] text-gray-400\">Click Annotate to mark up the screenshot before sending. Or paste a different image from the clipboard to replace it.</p>\n </div>\n )}\n {!previewUrl && (\n <UploadDropZone onSelect={(blob) => setScreenshot(blob)} />\n )}\n\n {/* Consumer-declared extra fields — rendered as labelled\n selects between the screenshot and the description so\n they're hard to miss but don't dominate the dialog.\n Stack vertically; one row per field for readability. */}\n {extraFields.length > 0 && (\n <div className=\"mt-4 space-y-3\">\n {extraFields.map((f) => (\n <div key={f.key}>\n <label htmlFor={`bug-report-extra-${f.key}`} className=\"block text-sm font-medium text-gray-700\">\n {f.label}\n </label>\n <select\n id={`bug-report-extra-${f.key}`}\n value={extras[f.key] ?? ''}\n onChange={(e) => setExtras((prev) => ({ ...prev, [f.key]: e.target.value }))}\n className=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none\"\n >\n {f.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n {f.hint && <p className=\"mt-1 text-[11px] text-gray-500\">{f.hint}</p>}\n </div>\n ))}\n </div>\n )}\n\n <label className=\"mt-4 block text-sm font-medium text-gray-700\">\n {isBug ? 'What went wrong?' : \"What's your suggestion?\"}\n <span className=\"font-normal text-gray-400 ml-1\">(optional)</span>\n </label>\n <textarea\n autoFocus\n value={description}\n onChange={e => setDescription(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) handleSubmit();\n }}\n placeholder={isBug\n ? 'Briefly describe the issue, what you were doing, what you expected to happen…'\n : 'Briefly describe what would make this better…'}\n rows={3}\n className=\"mt-1 w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none resize-none\"\n />\n\n <div className=\"mt-6 flex justify-end gap-3\">\n <button type=\"button\" onClick={handleCancel}\n className=\"bg-white text-gray-700 border border-gray-300 px-4 py-2 text-sm font-medium rounded-lg hover:bg-gray-50\">\n Cancel\n </button>\n <button type=\"button\" onClick={handleSubmit}\n className=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 text-sm font-medium rounded-lg\">\n Send\n </button>\n </div>\n </DialogPanel>\n </div>\n\n {/* Annotator lives inside the Dialog tree on purpose: HeadlessUI marks\n DOM outside the open Dialog as inert (so pointer events don't fire\n there) AND treats clicks outside the Dialog as outside-clicks (which\n would call onClose). Nesting the annotator here sidesteps both. */}\n {annotating && previewUrl && (\n <BugReportAnnotator\n src={previewUrl}\n onApply={(blob) => { setScreenshot(blob); setAnnotating(false); }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n </Dialog>\n </>\n );\n}\n\n// Lazy-import the annotator so its SVG / canvas weight only enters the bundle\n// when the user actually opens the markup overlay. Wrapped in our own Suspense\n// boundary with a lightweight loader so it doesn't fall through to the app's.\nconst LazyImageAnnotator = lazy(() => import('../apps/ImageAnnotator'));\n\n/** Fallback when automatic screenshot capture fails (user denies the\n * Screen Capture permission, or it's unsupported). The user can drop or\n * pick an image file — the bytes are passed to the parent as a Blob via\n * `onSelect`, which behaves identically to a captured screenshot\n * downstream (annotate / send). */\nfunction UploadDropZone({ onSelect }: { onSelect: (blob: Blob) => void }) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [hover, setHover] = useState(false);\n\n const accept = (file: File | undefined) => {\n if (!file) return;\n if (!file.type.startsWith('image/')) return;\n onSelect(file);\n };\n\n return (\n <div\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setHover(true); }}\n onDragLeave={() => setHover(false)}\n onDrop={(e) => {\n e.preventDefault();\n setHover(false);\n accept(e.dataTransfer.files?.[0]);\n }}\n className={`mt-4 rounded-md border border-dashed px-4 py-6 text-center text-sm cursor-pointer transition-colors ${\n hover ? 'border-blue-400 bg-blue-50 text-blue-700' : 'border-gray-300 text-gray-500 hover:border-gray-400 hover:bg-gray-50'\n }`}\n >\n <p className=\"text-gray-700 font-medium\">Screenshot capture failed</p>\n <p className=\"mt-1 text-xs text-gray-500\">\n Drop an image here, paste one from the clipboard, or <span className=\"text-blue-600 underline\">click to upload</span>. Your description will be sent either way.\n </p>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => accept(e.target.files?.[0])}\n className=\"hidden\"\n />\n </div>\n );\n}\n\nfunction BugReportAnnotator({\n src, onApply, onCancel,\n}: { src: string; onApply: (blob: Blob) => void; onCancel: () => void }) {\n return (\n <div className=\"fixed inset-0 z-[10000] bg-black/60 backdrop-blur-sm flex flex-col\">\n <Suspense fallback={<div className=\"flex-1 flex items-center justify-center text-sm text-white/80\">Loading editor…</div>}>\n <div className=\"flex-1 m-4 rounded-lg overflow-hidden bg-white shadow-2xl\">\n <LazyImageAnnotator src={src} filename=\"screenshot.png\" onApply={onApply} onCancel={onCancel} />\n </div>\n </Suspense>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBugReport, type BugReport } from './BugReportDialog';\nimport { formatDate } from '../utils/date';\nimport Modal from './Modal';\nimport { confirm } from './ConfirmDialog';\nimport { useWindowManager } from './WindowManager';\nimport { setPdfPreview } from '../apps/Preview';\n\nfunction StatePill({ resolved }: { resolved: boolean }) {\n return (\n <span className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${resolved ? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800'}`}>\n {resolved ? 'Resolved' : 'Open'}\n </span>\n );\n}\n\ninterface Props {\n report: BugReport;\n /** Called after a successful delete so the parent window can close itself. */\n onClose?: () => void;\n}\n\nexport default function BugReportDetail({ report, onClose }: Props) {\n const qc = useQueryClient();\n const config = useBugReport();\n const { openPage } = useWindowManager();\n const [resolveOpen, setResolveOpen] = useState(false);\n const [note, setNote] = useState('');\n\n // Neutral noun across the dialog — a record may be a Bug or a Suggestion.\n const kind = report.report_type === 'suggestion' ? 'suggestion' : 'bug';\n const Kind = kind === 'suggestion' ? 'Suggestion' : 'Bug';\n\n const openScreenshot = () => {\n if (!report.screenshot_url) return;\n const filename = `${kind}-${report.id}-screenshot.png`;\n setPdfPreview({ url: report.screenshot_url, filename, kind: 'image' });\n openPage('/preview');\n };\n\n const resolve = useMutation({\n mutationFn: ({ is_resolved, resolution_note }: { is_resolved: boolean; resolution_note?: string }) => {\n if (!config?.resolve) {\n return Promise.reject(new Error('Resolve is not configured.'));\n }\n return config.resolve(report.id, is_resolved, resolution_note);\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['bug-reports'] });\n qc.invalidateQueries({ queryKey: ['entity', 'bug_report', report.id] });\n setResolveOpen(false);\n setNote('');\n },\n meta: { success: (d: BugReport) => d.is_resolved ? `${Kind} marked resolved.` : `${Kind} reopened.` },\n });\n\n const del = useMutation({\n mutationFn: () => {\n if (!config?.delete) return Promise.reject(new Error('Delete is not configured.'));\n return config.delete(report.id);\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['bug-reports'] });\n qc.removeQueries({ queryKey: ['entity', 'bug_report', report.id] });\n onClose?.();\n },\n meta: { success: () => `${Kind} deleted.` },\n });\n\n const handleDelete = async () => {\n const ok = await confirm({\n title: `Delete this ${kind}?`,\n message: 'This is permanent and cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Keep',\n variant: 'danger',\n });\n if (!ok) return;\n del.mutate();\n };\n\n const handleAction = () => {\n if (report.is_resolved) {\n // Reopen — no note prompt; clear any prior resolution note\n resolve.mutate({ is_resolved: false, resolution_note: '' });\n } else {\n setNote('');\n setResolveOpen(true);\n }\n };\n\n const submitResolve = () => {\n resolve.mutate({ is_resolved: true, resolution_note: note.trim() });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3 text-sm\">\n <span className=\"font-semibold text-gray-900\">{report.reporter_name || 'Unknown'}</span>\n <StatePill resolved={report.is_resolved} />\n <span className=\"text-gray-500 ml-auto\">{formatDate(report.created_at)}</span>\n </div>\n\n {report.description && (\n <div className=\"rounded-lg bg-gray-50 border border-gray-200 p-3 text-sm text-gray-800 whitespace-pre-wrap\">\n {report.description}\n </div>\n )}\n\n {report.is_resolved && report.resolution_note && (\n <div className=\"rounded-lg bg-green-50 border border-green-200 p-3 text-sm text-green-900 whitespace-pre-wrap\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-green-700 mb-1\">Resolution note</div>\n {report.resolution_note}\n </div>\n )}\n\n <dl className=\"text-xs text-gray-600 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1.5\">\n <dt className=\"font-medium text-gray-700\">Page</dt>\n <dd className=\"break-all\"><a href={report.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:underline\">{report.url}</a></dd>\n <dt className=\"font-medium text-gray-700\">Viewport</dt>\n <dd>{report.viewport}</dd>\n <dt className=\"font-medium text-gray-700\">Browser</dt>\n <dd className=\"break-all\">{report.user_agent}</dd>\n </dl>\n\n {report.screenshot_url ? (\n <button type=\"button\" onClick={openScreenshot} className=\"block w-full text-left p-0 bg-transparent border-0 cursor-pointer\">\n <img src={report.screenshot_url} alt=\"Screenshot at time of report\"\n className=\"w-full rounded-lg border border-gray-200 hover:border-blue-400 transition-colors\" />\n </button>\n ) : (\n <div className=\"rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-400\">\n No screenshot was captured for this report.\n </div>\n )}\n\n {(config?.resolve || config?.delete) && (\n <div className=\"flex justify-end items-center gap-2 pt-2 border-t border-gray-200\">\n {config?.delete && (\n <button onClick={handleDelete} disabled={del.isPending || resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium transition-colors bg-white border border-red-300 text-red-700 hover:bg-red-50 disabled:opacity-50 mr-auto\">\n {del.isPending ? 'Deleting…' : 'Delete'}\n </button>\n )}\n {config?.resolve && (\n <button onClick={handleAction} disabled={resolve.isPending || del.isPending}\n className={`px-3 py-1.5 text-sm rounded-lg font-medium transition-colors ${report.is_resolved ? 'bg-white border border-gray-300 text-gray-700 hover:bg-gray-50' : 'bg-blue-600 text-white hover:bg-blue-700'}`}>\n {resolve.isPending ? '...' : report.is_resolved ? 'Reopen' : 'Mark Resolved'}\n </button>\n )}\n </div>\n )}\n\n <Modal open={resolveOpen} onClose={() => !resolve.isPending && setResolveOpen(false)} title={`Resolve ${report.report_code ?? Kind}`} size=\"md\" compact>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-gray-600\">\n Add a short note for {report.reporter_name || 'the reporter'} (optional).\n </p>\n <textarea\n value={note}\n onChange={e => setNote(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) submitResolve(); }}\n rows={3}\n autoFocus\n placeholder=\"e.g. Fixed in v1256 — let me know if you still see it.\"\n className=\"w-full rounded-lg border border-gray-300 px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none\"\n />\n <div className=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <button onClick={() => setResolveOpen(false)} disabled={resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 transition-colors\">\n Cancel\n </button>\n <button onClick={submitResolve} disabled={resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium bg-blue-600 text-white hover:bg-blue-700 transition-colors\">\n {resolve.isPending ? 'Resolving...' : 'Resolve'}\n </button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n","/**\n * StatusBadge — unified status pill across the system.\n *\n * The shell defines 8 semantic groups so the same concept always looks the\n * same color, regardless of which entity the status came from. The mapping\n * from raw status strings → groups is consumer-supplied via\n * <StatusBadgeProvider groups={...}>; when no provider is present (or a\n * status isn't mapped), the badge falls back to the \"neutral\" group.\n *\n * Dark-mode tone-down lives in index.css under [data-theme=\"dark\"].\n */\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport type SemanticGroup =\n | 'success' // finished, done, paid, approved, confirmed, received, active, production_ready, shipped\n | 'active' // in-progress, in production, in transit, posted, development\n | 'queued' // sent, arranged, loaded, submitted, pending_production\n | 'info' // initialized, delivered\n | 'pending' // pending, at_port (waiting / hold)\n | 'warning' // customs, partially_paid (needs attention)\n | 'danger' // overdue\n | 'draft' // draft (slightly more visible than neutral)\n | 'neutral'; // cancelled, inactive, rejected\n\nconst GROUP_COLORS: Record<SemanticGroup, string> = {\n success: 'bg-green-100 text-green-800',\n active: 'bg-blue-100 text-blue-800',\n queued: 'bg-indigo-100 text-indigo-800',\n info: 'bg-sky-100 text-sky-800',\n pending: 'bg-yellow-100 text-yellow-800',\n warning: 'bg-orange-100 text-orange-800',\n danger: 'bg-red-100 text-red-800',\n draft: 'bg-gray-300 text-gray-800',\n neutral: 'bg-gray-100 text-gray-800',\n};\n\nconst StatusGroupsContext = createContext<Record<string, SemanticGroup>>({});\n\nexport function StatusBadgeProvider({\n groups,\n children,\n}: { groups: Record<string, SemanticGroup>; children: ReactNode }) {\n return <StatusGroupsContext.Provider value={groups}>{children}</StatusGroupsContext.Provider>;\n}\n\ninterface StatusBadgeProps {\n status: string;\n}\n\nexport default function StatusBadge({ status }: StatusBadgeProps) {\n const groups = useContext(StatusGroupsContext);\n const group = groups[status] ?? 'neutral';\n const color = GROUP_COLORS[group];\n const label = status.replace(/_/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\n\n return (\n <span className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${color}`}>\n {label}\n </span>\n );\n}\n","/**\n * Dev-environment detection + browser chrome.\n *\n * A deployed bundle is byte-identical across hosts (CI builds once and promotes\n * the same image between environments), so build-time signals like\n * `import.meta.env.MODE` can't tell a developer's machine from a deployed site —\n * only the runtime hostname can. `isDevEnv()` is therefore gated on\n * `localhost`/`127.0.0.1`, and everything dev-only (the <DevIndicator/> tray\n * badge, the `[DEV]` tab-title prefix) keys off it so it never leaks onto a\n * deployed host.\n */\n\n/** Tooltip/banner copy for the dev indicator. */\nexport const DEV_BANNER_TEXT =\n 'LOCAL DEV ENVIRONMENT — running against your local backend; not connected to the live system';\n\n/**\n * True only when served from a developer's own machine.\n *\n * Gated on `localhost`/`127.0.0.1` only (not `*.local` mDNS names), so a\n * teammate reaching a dev server over the LAN doesn't get the dev chrome.\n */\nexport function isDevEnv(): boolean {\n const host = window.location.hostname;\n return host === 'localhost' || host === '127.0.0.1';\n}\n\n/**\n * Apply local-dev browser chrome: prefix the tab title with `[DEV]` and,\n * optionally, swap the favicon. No-op outside localhost. Idempotent — safe to\n * call at startup and again whenever a route overwrites `document.title`.\n *\n * Call before React mounts (e.g. in `main.tsx`) so the title is correct on the\n * first paint. Pass `faviconHref` only if the host actually ships that asset.\n */\nexport function applyDevTitle(opts?: { faviconHref?: string }): void {\n if (!isDevEnv()) return;\n\n if (!document.title.startsWith('[DEV]')) {\n document.title = `[DEV] ${document.title}`;\n }\n\n if (opts?.faviconHref) {\n const icon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (icon) icon.href = opts.faviconHref;\n }\n}\n","import { isDevEnv, DEV_BANNER_TEXT } from '../utils/env';\n\n/**\n * System-tray badge shown only when the app is served from a developer's own\n * machine (localhost / 127.0.0.1). Drop it into the host's `taskbarTrayLeft`\n * slot — it renders nothing off-localhost, so it's safe to leave wired on every\n * build. Visibility is gated on the runtime hostname; see utils/env.ts.\n */\nexport default function DevIndicator() {\n if (!isDevEnv()) return null;\n\n return (\n <div\n className=\"shrink-0 inline-flex items-center gap-1 rounded-md bg-blue-600 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-blue-50 select-none\"\n title={DEV_BANNER_TEXT}\n >\n <svg className=\"h-3 w-3 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n <span>Dev</span>\n </div>\n );\n}\n","import { useMemo, isValidElement, cloneElement, type ReactElement } from 'react';\nimport Modal, { setWindowPosition } from './Modal';\nimport { useWindowManager } from './WindowManager';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport { navIcons } from '../shell-config/nav';\n\ninterface AvailableWidget {\n route: string;\n label: string;\n entry: PageRegistryEntry;\n}\n\n/** Generic fallback glyph for widgets the consumer hasn't given a navIcon. */\nfunction FallbackIcon() {\n return (\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n </svg>\n );\n}\n\nfunction widgetIcon(entry: PageRegistryEntry, route: string) {\n const icon = navIcons[entry.icon ?? route];\n if (icon && isValidElement(icon)) {\n return cloneElement(icon as ReactElement, { className: 'h-5 w-5' });\n }\n return <FallbackIcon />;\n}\n\n/**\n * Widget gallery — the \"manage widgets on the desktop\" surface.\n *\n * Enumerates every widget-flagged page in the live window registry (so it\n * automatically lists whatever the consumer registered, not just the bundled\n * five) and cross-references the window manager's `openWindows` to know which\n * are currently sitting on the desktop. Adding a widget calls `openPage`\n * (which drops the chrome-less panel onto the desktop and persists it via the\n * normal open-windows session store); removing one calls `closeEntity` on the\n * live window. No new persistence layer — it drives the same plumbing the\n * Start Menu already uses.\n *\n * Surfaced from the desktop right-click menu (\"Manage Widgets…\") and exported\n * so a consumer can also register it as a window or wire it to a tray button.\n */\nexport default function WidgetManager({ open, onClose }: { open: boolean; onClose: () => void }) {\n const { openWindows, openPage, closeEntity } = useWindowManager();\n\n // Widget-flagged page entries from the live registry, alphabetised.\n const widgets = useMemo<AvailableWidget[]>(() => {\n if (!open) return [];\n return Object.entries(WINDOW_REGISTRY)\n .filter(([, e]) => isPageEntry(e) && (e as PageRegistryEntry).widget)\n .map(([route, e]) => ({ route, label: (e as PageRegistryEntry).label, entry: e as PageRegistryEntry }))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [open]);\n\n if (!open) return null;\n\n // route → the live open-window item (widgets aren't multi-instance, so at\n // most one per route).\n const activeByRoute = new Map(openWindows.filter(w => w.route).map(w => [w.route!, w]));\n const isActive = (route: string) => activeByRoute.has(route);\n\n // ── Placement ────────────────────────────────────────────────────────────\n // Newly-added widgets drop into the top-left corner and stack downward so\n // they never cover an existing widget. We read the live on-screen rects of\n // any widgets already on the desktop and place the new one below the lowest\n // one in the left column, wrapping to a new column when the column fills.\n const PAD = 20, GAP = 16;\n type Rect = { x: number; y: number; w: number; h: number };\n\n const workArea = () => {\n const cs = getComputedStyle(document.documentElement);\n const tbH = parseInt(cs.getPropertyValue('--taskbar-height')) || 0;\n const tbW = parseInt(cs.getPropertyValue('--taskbar-width')) || 0;\n const tbPos = cs.getPropertyValue('--taskbar-position').trim() || 'bottom';\n const sidebarW = parseInt(cs.getPropertyValue('--sidebar-width')) || 0;\n return {\n leftOffset: (tbPos === 'left' ? tbW : 0) + sidebarW + PAD,\n topOffset: (tbPos === 'top' ? tbH : 0) + PAD,\n maxBottom: window.innerHeight - (tbPos === 'bottom' ? tbH : 0) - PAD,\n };\n };\n\n const liveWidgetRects = (): Rect[] =>\n [...document.querySelectorAll<HTMLElement>('[data-modal-panel][data-widget]')]\n .map(el => { const r = el.getBoundingClientRect(); return { x: r.left, y: r.top, w: r.width, h: r.height }; })\n .filter(r => r.w > 0 && r.h > 0);\n\n const computeSlot = (occupied: Rect[], w: number, h: number) => {\n const { leftOffset, topOffset, maxBottom } = workArea();\n const rightLimit = window.innerWidth - PAD;\n const lowestInColumn = (colX: number) => {\n const ov = occupied.filter(r => r.x < colX + w && r.x + r.w > colX);\n return ov.length ? Math.max(...ov.map(r => r.y + r.h)) + GAP : topOffset;\n };\n let x = leftOffset, y = lowestInColumn(x), guard = 0;\n // Move to a fresh column when this one is full — but never push a widget\n // off the right edge: only wrap if the next column still fits on-screen.\n while (y + h > maxBottom && x + (w + GAP) + w <= rightLimit && guard < 12) {\n x += w + GAP; y = lowestInColumn(x); guard++;\n }\n return { x, y };\n };\n\n const dimsFor = (route: string) => {\n const e = WINDOW_REGISTRY[route] as PageRegistryEntry;\n return { w: e?.dimensions?.[0] ?? 320, h: e?.dimensions?.[1] ?? 240, auto: !!e?.autoHeight };\n };\n\n // Place a widget into a free top-left slot, then open it. We choose the slot\n // from the *live* rects of widgets already on the desktop, so the new one\n // stacks below their real (content-aware) heights. `autoHeight` widgets\n // shrink to their content, so we only reserve a small slice of height for\n // them when picking a column — otherwise their full dimension height would\n // push later widgets into needless extra columns. The seeded `h` is just a\n // first-paint placeholder; autoHeight widgets re-measure on open.\n const placeAndOpen = (route: string) => {\n const { w, h, auto } = dimsFor(route);\n const selfH = auto ? Math.min(h, 160) : h;\n const { x, y } = computeSlot(liveWidgetRects(), w, selfH);\n setWindowPosition(`page:${route}`, { x, y, w, h });\n openPage(route);\n };\n\n // Resolve once the just-opened widget has rendered with a real height, so the\n // next placement in a batch can read its actual rect (capped so a slow lazy\n // chunk never hangs the loop).\n const waitForWidget = (route: string) => new Promise<void>(resolve => {\n const sel = `[data-modal-panel][data-window-key=\"page:${route}\"]`;\n let n = 0;\n const tick = () => {\n const el = document.querySelector(sel) as HTMLElement | null;\n if ((el && el.getBoundingClientRect().height > 40) || n++ > 30) resolve();\n else setTimeout(tick, 30);\n };\n setTimeout(tick, 30);\n });\n\n const add = (route: string) => { if (!isActive(route)) placeAndOpen(route); };\n const remove = (route: string) => { const w = activeByRoute.get(route); if (w) closeEntity(w.id); };\n const toggle = (route: string) => { isActive(route) ? remove(route) : add(route); };\n\n const activeCount = widgets.reduce((n, w) => n + (isActive(w.route) ? 1 : 0), 0);\n const allActive = widgets.length > 0 && activeCount === widgets.length;\n const addAll = async () => {\n for (const w of widgets) {\n if (isActive(w.route)) continue;\n placeAndOpen(w.route);\n await waitForWidget(w.route);\n }\n };\n const removeAll = () => widgets.forEach(w => remove(w.route));\n\n const widgetGlyph = (\n <svg className=\"h-5 w-5 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n </svg>\n );\n\n return (\n <Modal open={open} onClose={onClose} title=\"Widgets\" icon={widgetGlyph} size=\"md\" compact dimensions={[480, 560]}>\n <div className=\"flex flex-col h-full\">\n {/* Summary + bulk actions */}\n <div className=\"flex items-center justify-between gap-2 px-1 pb-3\">\n <p className=\"text-xs text-gray-500\">\n {widgets.length === 0\n ? 'No widgets available'\n : <><span className=\"font-semibold text-gray-700\">{activeCount}</span> of {widgets.length} on your desktop</>}\n </p>\n {widgets.length > 0 && (\n <button\n onClick={allActive ? removeAll : addAll}\n className=\"text-xs font-medium text-blue-600 hover:text-blue-700 hover:underline\">\n {allActive ? 'Remove all' : 'Add all'}\n </button>\n )}\n </div>\n\n {/* Gallery */}\n <div className=\"flex-1 overflow-y-auto -mx-1 px-1\">\n {widgets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center text-center py-12 text-gray-400\">\n <div className=\"opacity-60 mb-2\">{widgetGlyph}</div>\n <p className=\"text-sm\">No widgets are registered.</p>\n <p className=\"text-xs mt-1\">Widgets like Weather, Currency, and the Pomodoro timer appear here once available.</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {widgets.map(({ route, label, entry }) => {\n const active = isActive(route);\n return (\n <button\n key={route}\n onClick={() => toggle(route)}\n title={active ? `Remove ${label} from desktop` : `Add ${label} to desktop`}\n className={`group relative flex items-center gap-3 rounded-xl border p-3 text-left transition-colors ${\n active\n ? 'border-blue-300 bg-blue-50/70 hover:bg-blue-50'\n : 'border-gray-200 bg-white/60 hover:border-gray-300 hover:bg-gray-50'\n }`}>\n <span className={`shrink-0 flex items-center justify-center h-10 w-10 rounded-lg ${\n active ? 'bg-blue-100 text-blue-600' : 'bg-gray-100 text-gray-500'\n }`}>\n {widgetIcon(entry, route)}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium text-gray-900 truncate\">{label}</span>\n <span className={`block text-[11px] ${active ? 'text-blue-600' : 'text-gray-400'}`}>\n {active ? 'On desktop' : 'Available'}\n </span>\n </span>\n {/* Toggle affordance */}\n <span className={`shrink-0 inline-flex items-center justify-center h-6 w-6 rounded-full border transition-colors ${\n active\n ? 'border-blue-500 bg-blue-500 text-white group-hover:border-red-400 group-hover:bg-red-400'\n : 'border-gray-300 text-gray-400 group-hover:border-blue-400 group-hover:text-blue-500'\n }`}>\n {active ? (\n <>\n {/* check by default, swap to × on hover to signal removal */}\n <svg className=\"h-3.5 w-3.5 group-hover:hidden\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n <svg className=\"h-3.5 w-3.5 hidden group-hover:block\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n )}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Hint */}\n <p className=\"shrink-0 pt-3 mt-1 border-t border-gray-100 text-[11px] text-gray-400 leading-relaxed\">\n Drag a widget anywhere on the desktop to reposition it. Right-click a widget for its appearance settings.\n </p>\n </div>\n </Modal>\n );\n}\n","declare const __PKG_VERSION__: string | undefined;\n\n/** Package version, injected by tsup at build time. Stays as an empty\n * string when the source is consumed without a build (e.g. tests). */\nexport const VERSION: string = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '';\n\n/** Legacy alias kept so existing consumers do not break. */\nexport const APP_VERSION = VERSION;\n","/**\n * INTERNAL stub — Desktop's About modal references the consumer-side\n * changelog. The package ships no built-in changelog; consumer wires their\n * own through the eventual `branding` prop (TODO). Default = empty array\n * keeps the import compiling.\n */\nexport interface ChangelogEntry {\n version: string;\n date: string;\n changes: string[];\n}\nconst changelog: ChangelogEntry[] = [];\nexport default changelog;\n","/**\n * Suggestion or Bug — screenshot the current tab, let the user pick whether\n * it's a Bug or a Suggestion and describe it, then hand the payload to the\n * consumer-supplied `submit` callback. Triggered from the wallpaper / taskbar\n * right-click menus.\n *\n * The shell does NOT call any HTTP endpoint here; the caller passes a\n * `BugReportConfig['submit']` (typically resolved via `useBugReport()`).\n */\nimport toast from '../shell/toast';\nimport { openBugReportDialog, type BugReportConfig } from '../shell/BugReportDialog';\n\n/** Capture the current tab via the Screen Capture API. OS-level screenshot —\n * immune to the CSS quirks (Tailwind v4, oklch(), backdrop-filter, custom\n * properties) that break DOM-based renderers like html2canvas / html-to-image.\n * preferCurrentTab pre-selects the current tab so the user just clicks Share. */\nasync function captureViewport(): Promise<Blob | null> {\n try {\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: { displaySurface: 'browser' } as MediaTrackConstraints,\n audio: false,\n // Chromium-only hints — ignored by other engines, no harm done.\n preferCurrentTab: true,\n selfBrowserSurface: 'include',\n surfaceSwitching: 'exclude',\n } as any);\n\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n await video.play();\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d')!.drawImage(video, 0, 0);\n\n stream.getTracks().forEach(t => t.stop());\n\n return await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((b) => resolve(b), 'image/jpeg', 0.9);\n });\n } catch (err) {\n console.error('Bug report screenshot failed:', err);\n return null;\n }\n}\n\nexport async function reportBug(submit: BugReportConfig['submit']): Promise<void> {\n const screenshot = await captureViewport();\n\n // Show review dialog with preview + description box\n const submission = await openBugReportDialog(screenshot);\n if (submission === null) return; // user cancelled\n\n // Use the screenshot the dialog returns — that's the annotated version\n // when the user marked up the capture before sending. Falls back to the\n // original capture for safety.\n const finalScreenshot = submission.screenshot ?? screenshot;\n\n try {\n await submit({\n description: submission.description || undefined,\n screenshot: finalScreenshot ?? undefined,\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n reportType: submission.reportType,\n extras: submission.extras ?? {},\n });\n toast.success(submission.reportType === 'bug' ? 'Bug sent to admins.' : 'Suggestion sent to admins.');\n } catch (err: any) {\n toast.error(err?.response?.data?.detail || 'Failed to send.');\n }\n}\n","import { useState, useRef, useEffect, useCallback, isValidElement, cloneElement, createContext, useContext, type ReactNode, type ReactElement } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useWindowManager } from './WindowManager';\nimport { navIcons } from '../shell-config/nav';\nimport { useShellPrefs } from './ShellPrefs';\nimport Modal from './Modal';\nimport WidgetManager from './WidgetManager';\nimport { APP_VERSION } from '../version';\nimport changelog, { type ChangelogEntry } from '../changelog';\nimport toast from './toast';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider } from './PopupMenu';\nimport { reportBug } from '../utils/reportBug';\nimport { useBugReport } from './BugReportDialog';\nimport { formatDate } from '../utils/date';\nimport {\n openPreviewFile,\n PREVIEW_OPENED_EVENT,\n type PreviewFileKind,\n type PreviewOpenedDetail,\n} from '../utils/openPreviewFile';\n\n// ── Entity icon config ──\nconst ENTITY_ICON_COLORS: Record<string, string> = {\n order: 'text-blue-600', purchase_order: 'text-purple-600', invoice: 'text-green-600',\n client: 'text-indigo-600', manufacturer: 'text-orange-600', shipment: 'text-teal-600',\n part_number: 'text-gray-600', project: 'text-pink-600', mould: 'text-red-600',\n design: 'text-cyan-600', brand: 'text-amber-600', price_sheet: 'text-emerald-600',\n folder: 'text-yellow-600', page: 'text-blue-500',\n};\nconst ENTITY_ICONS: Record<string, string> = {\n order: 'SO', purchase_order: 'PO', invoice: 'INV', client: 'CLI',\n manufacturer: 'MFR', shipment: 'DN', part_number: 'PN', project: 'PRJ',\n mould: 'MLD', design: 'DSN', brand: 'BRD', price_sheet: 'PS',\n vendor_invoice: 'VI', vendor_payment: 'VP', warranty_claim: 'WC',\n qc_report: 'QC', vendor_shipment: 'GRN', bank_account: 'BA',\n wheel_finish: 'WF', weight_log: 'WL', production_progress: 'PP',\n vendor_price_sheet: 'VPS', proposal: 'PR', folder: 'FLD',\n};\n\n// Glyphs and colors for the auto-tracked preview shortcuts that live in the\n// Documents folder. Keyed by `fileKind`, not `entityType`.\nconst PREVIEW_FILE_CODES: Record<PreviewFileKind, string> = {\n pdf: 'PDF', dxf: 'DXF', '3d': 'STP', image: 'IMG', csv: 'CSV',\n};\nconst PREVIEW_FILE_COLORS: Record<PreviewFileKind, string> = {\n pdf: 'text-red-600', dxf: 'text-blue-600', '3d': 'text-purple-600',\n image: 'text-emerald-600', csv: 'text-green-600',\n};\nconst DOCUMENTS_FOLDER_ID = 'documents';\nconst DOCUMENTS_FOLDER_NAME = 'Documents';\n\ninterface DesktopItem {\n entityType: string;\n entityId: string;\n label: string;\n x?: number;\n y?: number;\n folderId?: string; // if inside a folder\n // When the item lives inside a folder, these hold its free-form position\n // (in pixels, relative to the folder body's top-left). Undefined → fall\n // back to the default grid layout for that folder.\n folderX?: number;\n folderY?: number;\n // Set for `entityType: 'preview-file'` shortcuts auto-recorded when the\n // user previews a file. `filePath` is the server-relative path passed\n // back into `openPreviewFile` on shortcut click.\n filePath?: string;\n fileKind?: PreviewFileKind;\n}\n\n// Shared 48×48 tile used by both the desktop and folder-window icon\n// renderers, so the two surfaces never visually diverge.\nfunction FileIconTile({ entityType, isSelected, entityId, label, fileKind }: {\n entityType: string;\n isSelected: boolean;\n entityId?: string;\n label?: string;\n fileKind?: PreviewFileKind;\n}) {\n const isPreviewFile = entityType === 'preview-file' && fileKind;\n const previewColor = isPreviewFile ? PREVIEW_FILE_COLORS[fileKind!] : null;\n const previewCode = isPreviewFile ? PREVIEW_FILE_CODES[fileKind!] : null;\n if (entityType === 'folder') {\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]\" viewBox=\"0 0 48 48\">\n <path d=\"M6 12a4 4 0 014-4h10l4 4h14a4 4 0 014 4v20a4 4 0 01-4 4H10a4 4 0 01-4-4V12z\" fill=\"white\" stroke=\"#eab308\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M6 18h36\" stroke=\"#eab308\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n );\n }\n if (entityType === 'page') {\n const icon = (label && navIcons[label]) || (entityId ? navIcons[entityId] : undefined);\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-10 w-10 text-white drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]' })\n : <svg className=\"h-10 w-10 text-white drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6z\" /></svg>}\n </div>\n );\n }\n return (\n <div className={`w-12 h-12 relative flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <svg className={`w-10 h-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)] ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-500'}`} viewBox=\"0 0 40 48\" fill=\"none\">\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" fill=\"white\" fillOpacity=\"0.92\" />\n <path d=\"M26 0l10 10H30a4 4 0 01-4-4V0z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeOpacity=\"0.5\" />\n </svg>\n <span className={`absolute inset-0 flex items-center justify-center text-[9px] font-bold pt-2 ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-600'}`}>\n {previewCode ?? ENTITY_ICONS[entityType] ?? entityType.slice(0, 3).toUpperCase()}\n </span>\n </div>\n );\n}\n\ninterface DesktopFolder {\n id: string;\n name: string;\n x?: number;\n y?: number;\n}\n\nconst GRID = 90; // snap grid size\n\nfunction snapToGrid(x: number, y: number) {\n return { x: Math.round(x / GRID) * GRID, y: Math.round(y / GRID) * GRID };\n}\n\n// ── Consumer-supplied desktop config ────────────────────────────────────────\n//\n// Desktop talks to two consumer-specific things:\n// 1. A sticky-note ref resolver — turns `PREFIX#NUMBER` into an entity\n// window-registry key + id. Implementations look up numbering configs\n// and search the consumer's REST API.\n// 2. Persistence callbacks — where to save the user's reordered shortcuts,\n// created folders, snap toggle, etc. The shell hands the new array; the\n// consumer commits it (server profile, localStorage, whatever).\n//\n// Both default to no-ops, so the desktop renders as a static surface when no\n// provider is mounted.\n\nexport interface StickyEntityRef {\n /** Window-registry key used by `openEntity`. */\n entityType: string;\n entityId: string;\n /** Optional human-readable label (defaults to `${prefix}#${number}`). */\n label?: string;\n /** Optional pre-fetched entity payload passed to openEntity as snapshot. */\n snapshot?: unknown;\n}\n\nexport type StickyResolver = (prefix: string, number: string) => Promise<StickyEntityRef | null>;\n\nexport interface DesktopHostConfig {\n /** Product name shown in the About dialog and desktop context menu. */\n productName?: string;\n /** Tagline shown under the product name in the About dialog. */\n productTagline?: string;\n /** Icon URL shown in the About dialog. Defaults to `/favicon.svg`. */\n productIcon?: string;\n /** Version string shown on the desktop watermark and About dialog. Falls\n * back to the react-os-shell package version if omitted. */\n productVersion?: string;\n /** Changelog rendered in the \"What's New\" dialog. Hidden when omitted. */\n productChangelog?: ChangelogEntry[];\n /** Copyright line in the About dialog footer. Hidden when omitted. */\n productCopyright?: string;\n /** Website URL in the About dialog footer. Hidden when omitted. */\n productWebsite?: string;\n /** Wallpaper picker options for the Customization settings page. */\n wallpapers?: { src: string; label: string }[];\n /** Resolves sticky-note refs (e.g. \"SO#27150\") to window-registry coords. */\n stickyResolver?: StickyResolver;\n /** Persists the user's desktop shortcut list. */\n saveShortcuts?: (items: DesktopItem[]) => void | Promise<void>;\n /** Persists the user's folder list. */\n saveFolders?: (folders: DesktopFolder[]) => void | Promise<void>;\n /** Persists the snap-to-grid preference. */\n saveSnap?: (snap: boolean) => void | Promise<void>;\n /** Persists the user's notepad / sticky-note content. */\n saveNotes?: (notes: unknown[]) => void | Promise<void>;\n}\n\nconst DesktopHostContext = createContext<DesktopHostConfig>({});\n\nexport function DesktopHostProvider({ value, children }: { value: DesktopHostConfig; children: ReactNode }) {\n return <DesktopHostContext.Provider value={value}>{children}</DesktopHostContext.Provider>;\n}\n\nexport function useDesktopHost(): DesktopHostConfig {\n return useContext(DesktopHostContext);\n}\n\nconst FOLDER_GRID = 90;\nconst FOLDER_ITEM_W = 80;\nconst FOLDER_ITEM_H = 80;\nconst FOLDER_PAD = 12;\n\n/** Folder content window — visually distinct from regular windows\n * (manilla-paper background, folder glyph in title) and supports\n * rubber-band selection, shift / cmd / ctrl multi-select, free\n * positioning of items, and drag-to-desktop to move items out. */\nfunction FolderWindow({ folder, items, onClose, onOpen, onMoveOut, onSetFolderPosition, onDragOutToDesktop }: {\n folder: { id: string; name: string };\n items: DesktopItem[];\n onClose: () => void;\n onOpen: (item: DesktopItem) => void;\n onMoveOut: (items: DesktopItem[]) => void;\n onSetFolderPosition: (updates: { item: DesktopItem; x: number; y: number }[]) => void;\n onDragOutToDesktop: (drops: { item: DesktopItem; clientX: number; clientY: number }[]) => void;\n}) {\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [rubber, setRubber] = useState<{ x1: number; y1: number; x2: number; y2: number } | null>(null);\n const didDragRubber = useRef(false);\n const bodyRef = useRef<HTMLDivElement>(null);\n const [bodyWidth, setBodyWidth] = useState(800);\n // Drag-out indicator is updated via direct DOM manipulation rather than\n // React state — otherwise the re-render at the boundary crossing would\n // clobber the inline `style.left`/`top` overrides we apply to the\n // dragged items, making them flicker back to their saved positions.\n const setDragOutsideClass = (on: boolean) => {\n const el = bodyRef.current;\n if (!el) return;\n el.style.outline = on ? '2px dashed rgb(96 165 250 / 0.6)' : '';\n el.style.outlineOffset = on ? '-2px' : '';\n };\n\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n const update = () => setBodyWidth(el.clientWidth);\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const cols = Math.max(1, Math.floor((bodyWidth - FOLDER_PAD) / FOLDER_GRID));\n const getItemFolderPos = (item: DesktopItem, idx: number) => {\n if (item.folderX != null && item.folderY != null) return { x: item.folderX, y: item.folderY };\n return { x: FOLDER_PAD + (idx % cols) * FOLDER_GRID, y: FOLDER_PAD + Math.floor(idx / cols) * FOLDER_GRID };\n };\n\n const toggleSelect = (i: number, e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(i) ? next.delete(i) : next.add(i); return next; });\n } else if (!selected.has(i)) {\n setSelected(new Set([i]));\n }\n };\n\n // ── Rubber band on body ─────────────────────────────────────────────────\n // Coordinates are in the body's *scrolled content* space so the rectangle\n // and the items it intersects stay in sync when the body is scrolled.\n const startRubber = (e: React.PointerEvent) => {\n if (e.button !== 0 || e.target !== bodyRef.current) return;\n const el = bodyRef.current!;\n const r = el.getBoundingClientRect();\n const x = e.clientX - r.left + el.scrollLeft;\n const y = e.clientY - r.top + el.scrollTop;\n setRubber({ x1: x, y1: y, x2: x, y2: y });\n didDragRubber.current = false;\n setSelected(new Set());\n };\n\n useEffect(() => {\n if (!rubber) return;\n const computeSelection = (minX: number, maxX: number, minY: number, maxY: number) => {\n const next = new Set<number>();\n const r = bodyRef.current;\n if (!r) return next;\n const tiles = r.querySelectorAll<HTMLElement>('[data-folder-item]');\n const containerRect = r.getBoundingClientRect();\n tiles.forEach(t => {\n const tr = t.getBoundingClientRect();\n const tx = tr.left - containerRect.left + r.scrollLeft;\n const ty = tr.top - containerRect.top + r.scrollTop;\n if (tx + tr.width > minX && tx < maxX && ty + tr.height > minY && ty < maxY) {\n const i = parseInt(t.getAttribute('data-folder-item') || '-1', 10);\n if (i >= 0) next.add(i);\n }\n });\n return next;\n };\n const move = (e: PointerEvent) => {\n const el = bodyRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const x = e.clientX - r.left + el.scrollLeft;\n const y = e.clientY - r.top + el.scrollTop;\n const dx = x - rubber.x1, dy = y - rubber.y1;\n if (dx * dx + dy * dy > 16) didDragRubber.current = true;\n setRubber(prev => prev ? { ...prev, x2: x, y2: y } : null);\n if (didDragRubber.current) {\n const minX = Math.min(rubber.x1, x);\n const maxX = Math.max(rubber.x1, x);\n const minY = Math.min(rubber.y1, y);\n const maxY = Math.max(rubber.y1, y);\n setSelected(computeSelection(minX, maxX, minY, maxY));\n }\n };\n const up = () => setRubber(null);\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [rubber]);\n\n // ── Item drag (move within folder OR drop out to desktop) ──────────────\n // Mirrors Desktop's drag: if the grabbed icon is part of a multi-selection\n // they all move together; otherwise it's a single-icon drag.\n type FDragEntry = { idx: number; item: DesktopItem; origX: number; origY: number; el: HTMLElement | null };\n const dragEntriesRef = useRef<FDragEntry[]>([]);\n const dragStartRef = useRef<{ clientX: number; clientY: number } | null>(null);\n\n const startItemDrag = (i: number, e: React.PointerEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n // Multi-drag if the grabbed item is already in a multi-selection.\n const useMulti = selected.has(i) && selected.size > 1;\n const idxs = useMulti ? Array.from(selected) : [i];\n if (!useMulti) setSelected(new Set([i]));\n const entries: FDragEntry[] = idxs.map(idx => {\n const item = items[idx];\n const pos = getItemFolderPos(item, idx);\n const el = bodyRef.current?.querySelector<HTMLElement>(`[data-folder-item=\"${idx}\"]`) ?? null;\n return { idx, item, origX: pos.x, origY: pos.y, el };\n }).filter(e => e.item);\n dragEntriesRef.current = entries;\n dragStartRef.current = { clientX: e.clientX, clientY: e.clientY };\n setDragOutsideClass(false);\n\n let moved = false;\n const move = (ev: PointerEvent) => {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = ev.clientX - start.clientX;\n const dy = ev.clientY - start.clientY;\n if (!moved && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) moved = true;\n if (!moved) return;\n for (const entry of dragEntriesRef.current) {\n if (!entry.el) continue;\n entry.el.style.left = `${entry.origX + dx}px`;\n entry.el.style.top = `${entry.origY + dy}px`;\n entry.el.style.zIndex = '100';\n entry.el.style.opacity = '0.85';\n }\n // Outside-folder hit-test for the \"drop on desktop\" affordance.\n const r = bodyRef.current?.getBoundingClientRect();\n const inside = !!r && ev.clientX >= r.left && ev.clientX <= r.right && ev.clientY >= r.top && ev.clientY <= r.bottom;\n setDragOutsideClass(!inside);\n };\n const up = (ev: PointerEvent) => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n const entries = dragEntriesRef.current;\n dragEntriesRef.current = [];\n dragStartRef.current = null;\n // Reset transient visual overrides. zIndex / opacity aren't React-\n // managed so they'd otherwise stick after the re-render.\n for (const entry of entries) {\n if (!entry.el) continue;\n entry.el.style.zIndex = '';\n entry.el.style.opacity = '';\n }\n setDragOutsideClass(false);\n if (!moved) return;\n const r = bodyRef.current?.getBoundingClientRect();\n const inside = !!r && ev.clientX >= r.left && ev.clientX <= r.right && ev.clientY >= r.top && ev.clientY <= r.bottom;\n if (!inside) {\n const drops = entries.map(e => ({ item: e.item, clientX: ev.clientX, clientY: ev.clientY }));\n // The items are about to leave this folder; clear the now-stale\n // index-based selection so it doesn't carry over to a different row.\n setSelected(new Set());\n onDragOutToDesktop(drops);\n } else {\n // The new in-folder position is whatever we already wrote to\n // `style.left`/`top` during the last move — read it back so React\n // can persist it.\n const updates = entries.map(e => {\n const leftStr = e.el?.style.left || `${e.origX}px`;\n const topStr = e.el?.style.top || `${e.origY}px`;\n const x = Math.max(0, parseFloat(leftStr));\n const y = Math.max(0, parseFloat(topStr));\n return { item: e.item, x, y };\n });\n onSetFolderPosition(updates);\n }\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n };\n\n const moveSelectedOut = () => {\n if (selected.size === 0) return;\n onMoveOut(Array.from(selected).map(i => items[i]).filter(Boolean));\n setSelected(new Set());\n };\n\n // Header icon = folder glyph\n const folderIcon = (\n <svg className=\"h-5 w-5 text-amber-500\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z\" />\n </svg>\n );\n\n // Body height: enough to hold the lowest item, with breathing room. So\n // free-positioned items can sit anywhere and the body still scrolls when\n // they're dragged below the visible region.\n const contentHeight = items.reduce((max, item, i) => {\n const pos = getItemFolderPos(item, i);\n return Math.max(max, pos.y + FOLDER_ITEM_H + FOLDER_PAD);\n }, 300);\n\n return (\n <Modal open onClose={onClose} title={folder.name} icon={folderIcon} size=\"lg\">\n <div\n ref={bodyRef}\n onPointerDown={startRubber}\n onClick={() => {\n if (didDragRubber.current) { didDragRubber.current = false; return; }\n setSelected(new Set());\n }}\n className=\"relative h-full min-h-[300px] p-3 overflow-auto\"\n style={{\n background: 'linear-gradient(135deg, rgba(254, 243, 199, 0.55) 0%, rgba(253, 230, 138, 0.4) 50%, rgba(252, 211, 77, 0.3) 100%)',\n }}\n >\n {selected.size > 0 && (\n <div className=\"sticky top-0 z-20 mb-2 flex items-center gap-2 px-2 py-1 rounded-md bg-white/80 backdrop-blur-sm shadow border border-gray-200 text-xs text-gray-700 w-fit\">\n <span>{selected.size} selected</span>\n <button onClick={moveSelectedOut} className=\"px-2 py-0.5 rounded text-blue-600 hover:bg-blue-50\">Move to desktop</button>\n <button onClick={() => setSelected(new Set())} className=\"px-2 py-0.5 rounded text-gray-500 hover:bg-gray-100\">Clear</button>\n </div>\n )}\n\n {items.length === 0 ? (\n <p className=\"text-sm text-gray-500 text-center py-8 italic\">Folder is empty. Drag documents here.</p>\n ) : (\n <div className=\"relative\" style={{ height: contentHeight }}>\n {items.map((item, i) => {\n const isSelected = selected.has(i);\n const pos = getItemFolderPos(item, i);\n return (\n <div\n key={`${item.entityType}-${item.entityId}-${i}`}\n data-folder-item={i}\n onPointerDown={(e) => startItemDrag(i, e)}\n onClick={(e) => toggleSelect(i, e)}\n onDoubleClick={() => onOpen(item)}\n style={{ position: 'absolute', left: pos.x, top: pos.y }}\n className=\"cursor-default select-none\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <FileIconTile entityType={item.entityType} isSelected={isSelected} entityId={item.entityId} label={item.label} fileKind={item.fileKind} />\n <span className={`text-[10px] font-medium text-center leading-tight truncate w-full ${isSelected ? 'text-blue-900 bg-blue-200/60 rounded px-1' : 'text-gray-700'}`}>\n {item.label}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {rubber && (\n <div\n className=\"absolute border border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(rubber.x1, rubber.x2),\n top: Math.min(rubber.y1, rubber.y2),\n width: Math.abs(rubber.x2 - rubber.x1),\n height: Math.abs(rubber.y2 - rubber.y1),\n }}\n />\n )}\n </div>\n </Modal>\n );\n}\n\nexport default function Desktop({ profile }: { profile: any }) {\n const queryClient = useQueryClient();\n const { openEntity, openPage } = useWindowManager();\n const bugReport = useBugReport();\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Read desktop preferences from the consumer prefs adapter so they stay\n // in sync with what apps like Notepad write. Some legacy code paths\n // also expect them under profile.preferences — fall back to that for\n // consumers who haven't migrated.\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs = { ...(profile?.preferences || {}), ...shellPrefs };\n const favDocs: DesktopItem[] = prefs.favorite_documents || [];\n const folders: DesktopFolder[] = prefs.desktop_folders || [];\n const snapEnabled: boolean = prefs.desktop_snap ?? false;\n\n // Sticky notes from notepad\n interface StickyNote { id: string; title: string; content: string; color: string; sticky: boolean; sticky_x?: number; sticky_y?: number; sticky_w?: number; sticky_h?: number; sticky_on_top?: boolean; sticky_anchor?: 'left' | 'right'; updated_at: string; }\n const allNotes: StickyNote[] = prefs.notepad_notes || [];\n const stickyNotes = allNotes.filter(n => n.sticky);\n\n // ── Entity reference support for sticky notes ──\n // The PREFIX#NUMBER → entity lookup is consumer-supplied; the shell only\n // calls the resolver and hands the result to openEntity().\n const host = useDesktopHost();\n const openStickyRef = async (prefix: string, number: string) => {\n const refNum = `${prefix}#${number}`;\n if (!host.stickyResolver) { toast.error(`Unknown reference: ${refNum}`); return; }\n try {\n const result = await host.stickyResolver(prefix, number);\n if (result) openEntity(result.entityType, result.entityId, result.snapshot, result.label ?? refNum);\n else toast.error(`${refNum} not found`);\n } catch {\n toast.error(`Failed to open ${refNum}`);\n }\n };\n\n const toggleStickyCheckbox = (noteId: string, charIndex: number) => {\n const note = allNotes.find(n => n.id === noteId);\n if (!note) return;\n const content = note.content;\n const match = content.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const updated = content.slice(0, charIndex) + replacement + content.slice(charIndex + match[0].length);\n saveNotes(allNotes.map(n => n.id === noteId ? { ...n, content: updated, updated_at: new Date().toISOString() } : n));\n };\n\n const renderStickyContent = (noteId: string, text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n let charOffset = 0;\n return lines.map((line, li) => {\n const lineStart = charOffset;\n charOffset += line.length + 1;\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — rendered as clickable when a resolver is configured;\n // if the resolver returns null at click-time the user sees a \"not found\" toast.\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n if (host.stickyResolver) {\n const prefix = m[1], num = m[2], startIdx = m.index, matchText = m[0];\n tokens.push({ idx: startIdx, len: matchText.length, render: () => (\n <button key={`r-${li}-${startIdx}`} onClick={e => { e.stopPropagation(); openStickyRef(prefix, num); }}\n className=\"text-blue-700 hover:underline font-medium cursor-pointer\">{matchText}</button>\n )});\n }\n }\n\n // Checkboxes\n const cbRegex = /\\[([ xX]?)\\]/g;\n while ((m = cbRegex.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStart + startIdx;\n tokens.push({ idx: startIdx, len: m[0].length, render: () => (\n <button key={`c-${li}-${startIdx}`} onClick={e => { e.stopPropagation(); toggleStickyCheckbox(noteId, contentCharIdx); }}\n className={`inline-flex items-center justify-center w-3.5 h-3.5 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-500 bg-white/50 hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-2.5 h-2.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n )});\n }\n\n tokens.sort((a, b) => a.idx - b.idx);\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n for (const t of tokens) {\n if (t.idx > lastIdx) parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, t.idx)}</span>);\n parts.push(t.render());\n lastIdx = t.idx + t.len;\n }\n if (lastIdx < line.length) parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n if (parts.length === 0) parts.push(<span key={`e-${li}`}>{'\\u200B'}</span>);\n\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return <div key={li} className={lineHasChecked ? 'line-through opacity-50' : ''}>{parts}</div>;\n });\n };\n\n // State\n const [dragging, setDragging] = useState<{ type: 'item' | 'folder'; idx: number; startX: number; startY: number; origX: number; origY: number } | null>(null);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; itemIdx?: number; folderIdx?: number } | null>(null);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [rubberBand, setRubberBand] = useState<{ startX: number; startY: number; endX: number; endY: number } | null>(null);\n const [openFolder, setOpenFolder] = useState<string | null>(null);\n const [aboutOpen, setAboutOpen] = useState(false);\n const [whatsNewOpen, setWhatsNewOpen] = useState(false);\n const [widgetsOpen, setWidgetsOpen] = useState(false);\n const [renamingFolder, setRenamingFolder] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n const [editingStickyId, setEditingStickyId] = useState<string | null>(null);\n const [stickyDrag, setStickyDrag] = useState<{ id: string; startX: number; startY: number; origX: number; origY: number } | null>(null);\n const [stickyResize, setStickyResize] = useState<{ id: string; startX: number; startY: number; origW: number; origH: number } | null>(null);\n // Index of the folder the user is currently hovering while dragging an\n // icon — drives the lift / glow animation and the on-drop fold-in.\n const [hoverFolderIdx, setHoverFolderIdx] = useState<number | null>(null);\n const hoverFolderIdxRef = useRef<number | null>(null);\n\n // Save helpers — delegate persistence to the consumer-supplied callbacks\n // when wired, otherwise write through the prefs adapter so backend-less\n // demos still survive a reload.\n const saveDocs = useCallback((docs: DesktopItem[]) => {\n if (host.saveShortcuts) host.saveShortcuts(docs);\n else saveShellPrefs({ favorite_documents: docs });\n }, [host, saveShellPrefs]);\n\n const saveFolders = useCallback((f: DesktopFolder[]) => {\n if (host.saveFolders) host.saveFolders(f);\n else saveShellPrefs({ desktop_folders: f });\n }, [host, saveShellPrefs]);\n\n const saveSnap = useCallback((v: boolean) => {\n if (host.saveSnap) host.saveSnap(v);\n else saveShellPrefs({ desktop_snap: v });\n }, [host, saveShellPrefs]);\n\n // Latest-state refs so the preview-opened event handler (registered once)\n // always reads the current folders / favDocs instead of stale closure\n // values from initial mount.\n const previewStateRef = useRef({ folders, favDocs, saveFolders, saveDocs });\n previewStateRef.current = { folders, favDocs, saveFolders, saveDocs };\n\n // When the user previews a file (via Files app or a Documents-folder\n // shortcut), drop a dedup'd shortcut into the auto-created \"Documents\"\n // folder. The folder is created on first preview and recreated if the\n // user has deleted it since.\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PreviewOpenedDetail>).detail;\n if (!detail?.filePath) return;\n const { folders: fs, favDocs: docs, saveFolders: sf, saveDocs: sd } = previewStateRef.current;\n if (!fs.some(f => f.id === DOCUMENTS_FOLDER_ID)) {\n sf([...fs, { id: DOCUMENTS_FOLDER_ID, name: DOCUMENTS_FOLDER_NAME }]);\n }\n const deduped = docs.filter(d =>\n !(d.entityType === 'preview-file' && d.filePath === detail.filePath),\n );\n const next: DesktopItem = {\n entityType: 'preview-file',\n entityId: detail.filePath,\n label: detail.filename,\n filePath: detail.filePath,\n fileKind: detail.kind,\n folderId: DOCUMENTS_FOLDER_ID,\n };\n sd([next, ...deduped]);\n };\n window.addEventListener(PREVIEW_OPENED_EVENT, handler);\n return () => window.removeEventListener(PREVIEW_OPENED_EVENT, handler);\n }, []);\n\n // Positions stored as { right, top } — distance from right/top edges\n // This keeps icons anchored to the top-right regardless of window size\n const getDefaultPos = (idx: number) => {\n const col = Math.floor(idx / 8);\n const row = idx % 8;\n return { right: 20 + col * GRID, top: 20 + row * GRID };\n };\n\n const getItemPos = (item: DesktopItem, idx: number) => {\n if (item.x != null && item.y != null) return { right: item.x, top: item.y };\n return getDefaultPos(idx);\n };\n\n const getFolderPos = (folder: DesktopFolder, idx: number) => {\n if (folder.x != null && folder.y != null) return { right: folder.x, top: folder.y };\n return getDefaultPos(favDocs.filter(d => !d.folderId).length + idx);\n };\n\n // Items not in any folder\n const desktopItems = favDocs.filter(d => !d.folderId);\n const folderItems = (folderId: string) => favDocs.filter(d => d.folderId === folderId);\n\n // ── Drag logic ──\n // Local position overrides — applied immediately on drop, before API responds\n const [localPositions, setLocalPositions] = useState<Record<string, { right: number; top: number }>>({});\n // When the drag starts on a selected icon, all selected icons move together.\n // dragEntriesRef holds one entry per moving icon: its element, type, index,\n // and origin position (relative to the desktop).\n type DragEntry = { key: string; type: 'item' | 'folder'; idx: number; origX: number; origY: number; el: HTMLElement | null };\n const dragEntriesRef = useRef<DragEntry[]>([]);\n\n const startDrag = (type: 'item' | 'folder', idx: number, e: React.PointerEvent) => {\n if (e.button !== 0) return;\n const primaryKey = `${type}-${idx}`;\n // If the icon being grabbed is in the current selection, every selected\n // icon comes along. Otherwise it's a single-icon drag and we replace\n // the selection with just this one.\n const draggingMulti = selected.has(primaryKey) && selected.size > 1;\n const keys = draggingMulti ? Array.from(selected) : [primaryKey];\n\n const entries: DragEntry[] = [];\n for (const key of keys) {\n if (key.startsWith('item-')) {\n const i = parseInt(key.slice(5), 10);\n const itm = desktopItems[i];\n if (!itm) continue;\n const pos = getItemPos(itm, i);\n const el = document.querySelector(`[data-desktop-icon=\"${key}\"]`) as HTMLElement | null;\n entries.push({ key, type: 'item', idx: i, origX: pos.right, origY: pos.top, el });\n } else if (key.startsWith('folder-')) {\n const i = parseInt(key.slice(7), 10);\n const f = folders[i];\n if (!f) continue;\n const pos = getFolderPos(f, i);\n const el = document.querySelector(`[data-desktop-icon=\"${key}\"]`) as HTMLElement | null;\n entries.push({ key, type: 'folder', idx: i, origX: pos.right, origY: pos.top, el });\n }\n }\n dragEntriesRef.current = entries;\n const primaryEntry = entries.find(e => e.key === primaryKey) ?? entries[0];\n if (!primaryEntry) return;\n setDragging({ type, idx, startX: e.clientX, startY: e.clientY, origX: primaryEntry.origX, origY: primaryEntry.origY });\n e.preventDefault();\n };\n\n useEffect(() => {\n if (!dragging) return;\n const entries = dragEntriesRef.current;\n // Single-icon drags can fold into a folder; track which folder the\n // cursor is currently hovering over so the folder element can react\n // (scale + glow) and so we can short-circuit the right-overlap test\n // on drop.\n const isSingleItemDrag = entries.length === 1 && entries[0].type === 'item';\n const move = (e: PointerEvent) => {\n const dx = e.clientX - dragging.startX;\n const dy = e.clientY - dragging.startY;\n // Apply delta to every dragged icon.\n for (const entry of entries) {\n if (!entry.el) continue;\n // Moving right → decrease right offset; moving down → increase top offset\n entry.el.style.right = `${entry.origX - dx}px`;\n entry.el.style.top = `${entry.origY + dy}px`;\n entry.el.style.left = 'auto';\n entry.el.style.zIndex = '100';\n entry.el.style.opacity = '0.7';\n }\n // Detect hover-over-folder for drop-into-folder UX.\n if (isSingleItemDrag) {\n const elsBelow = document.elementsFromPoint(e.clientX, e.clientY);\n let nextHover: number | null = null;\n for (const el of elsBelow) {\n const fk = (el as HTMLElement).closest?.('[data-desktop-icon^=\"folder-\"]');\n if (fk) {\n const key = (fk as HTMLElement).getAttribute('data-desktop-icon');\n if (key) nextHover = parseInt(key.slice(7), 10);\n break;\n }\n }\n hoverFolderIdxRef.current = nextHover;\n setHoverFolderIdx(prev => (prev === nextHover ? prev : nextHover));\n }\n };\n const up = (e: PointerEvent) => {\n const dx = e.clientX - dragging.startX;\n const dy = e.clientY - dragging.startY;\n // Reset visual transform overrides on every dragged icon.\n for (const entry of entries) {\n if (!entry.el) continue;\n entry.el.style.zIndex = '';\n entry.el.style.opacity = '';\n }\n const liveHoverIdx = hoverFolderIdxRef.current;\n const hoveredFolder = liveHoverIdx != null ? folders[liveHoverIdx] : null;\n hoverFolderIdxRef.current = null;\n setHoverFolderIdx(null);\n\n // Compute final positions for each dragged entry.\n const computedPositions = entries.map(entry => {\n let finalRight = entry.origX - dx;\n let finalTop = Math.max(0, entry.origY + dy);\n if (snapEnabled) { const s = snapToGrid(finalRight, finalTop); finalRight = s.x; finalTop = s.y; }\n finalRight = Math.max(0, finalRight);\n return { entry, finalRight, finalTop };\n });\n\n // Persist items.\n const itemMoves = computedPositions.filter(p => p.entry.type === 'item');\n if (itemMoves.length > 0) {\n const updated = [...favDocs];\n const positionsPatch: Record<string, { right: number; top: number }> = {};\n // Single-item drag onto a folder still folds in (multi-drag never folds).\n const singleItem = itemMoves.length === 1 && entries.length === 1 ? itemMoves[0] : null;\n // Prefer the actively-hovered folder (live cursor hit-test) and fall\n // back to a position-overlap check for snap-to-grid edge cases.\n const droppedOnFolder = singleItem\n ? (hoveredFolder ?? folders.find((f, fi) => {\n const fp = getFolderPos(f, fi);\n return Math.abs(singleItem.finalRight - fp.right) < 40 && Math.abs(singleItem.finalTop - fp.top) < 40;\n }))\n : undefined;\n // Visual feedback: shrink the dragged icon into the folder before the\n // saved state actually removes it from the desktop.\n if (droppedOnFolder && singleItem?.entry.el) {\n const itemEl = singleItem.entry.el;\n const folderIdx = folders.indexOf(droppedOnFolder);\n const folderEl = document.querySelector(`[data-desktop-icon=\"folder-${folderIdx}\"]`) as HTMLElement | null;\n if (folderEl) {\n const ir = itemEl.getBoundingClientRect();\n const fr = folderEl.getBoundingClientRect();\n const dx = (fr.left + fr.width / 2) - (ir.left + ir.width / 2);\n const dy = (fr.top + fr.height / 2) - (ir.top + ir.height / 2);\n itemEl.style.transition = 'transform 220ms ease-out, opacity 220ms ease-out';\n itemEl.style.transform = `translate(${dx}px, ${dy}px) scale(0.2)`;\n itemEl.style.opacity = '0';\n }\n folderEl?.animate(\n [{ transform: 'scale(1)' }, { transform: 'scale(1.15)' }, { transform: 'scale(1)' }],\n { duration: 280, easing: 'ease-out' },\n );\n }\n for (const move of itemMoves) {\n const desktopIdx = favDocs.indexOf(desktopItems[move.entry.idx]);\n if (desktopIdx === -1) continue;\n if (droppedOnFolder) {\n updated[desktopIdx] = { ...updated[desktopIdx], folderId: droppedOnFolder.id, x: undefined, y: undefined, folderX: undefined, folderY: undefined };\n } else {\n updated[desktopIdx] = { ...updated[desktopIdx], x: move.finalRight, y: move.finalTop, folderId: undefined };\n positionsPatch[`item-${desktopIdx}`] = { right: move.finalRight, top: move.finalTop };\n }\n }\n // Defer the state update so the fold-in animation has time to play.\n const commit = () => {\n saveDocs(updated);\n if (Object.keys(positionsPatch).length > 0) {\n setLocalPositions(prev => ({ ...prev, ...positionsPatch }));\n }\n };\n if (droppedOnFolder) setTimeout(commit, 220);\n else commit();\n }\n\n // Persist folders.\n const folderMoves = computedPositions.filter(p => p.entry.type === 'folder');\n if (folderMoves.length > 0) {\n const updated = [...folders];\n const positionsPatch: Record<string, { right: number; top: number }> = {};\n for (const move of folderMoves) {\n updated[move.entry.idx] = { ...updated[move.entry.idx], x: move.finalRight, y: move.finalTop };\n positionsPatch[`folder-${move.entry.idx}`] = { right: move.finalRight, top: move.finalTop };\n }\n saveFolders(updated);\n setLocalPositions(prev => ({ ...prev, ...positionsPatch }));\n }\n\n setDragging(null);\n dragEntriesRef.current = [];\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [dragging, snapEnabled, favDocs, folders, desktopItems]);\n\n // Clear local position overrides when profile data updates\n // Cache key has to include positions too — otherwise \"Snap to Grid\"\n // updates favDocs.x/y but the entityId list is unchanged, so the\n // localPositions overlay keeps the pre-snap values pinned in place.\n const favDocsKey = JSON.stringify(favDocs.map(d => `${d.entityId}:${d.x ?? ''}:${d.y ?? ''}:${d.folderId ?? ''}`));\n const foldersKey = JSON.stringify(folders.map(f => `${f.id}:${f.x ?? ''}:${f.y ?? ''}`));\n useEffect(() => { setLocalPositions({}); }, [favDocsKey, foldersKey]);\n\n // ── Rubber band selection ──\n const didRubberBandDragRef = useRef(false);\n const startRubberBand = (e: React.PointerEvent) => {\n if (e.button !== 0 || e.target !== containerRef.current) return;\n const rect = containerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setRubberBand({ startX: x, startY: y, endX: x, endY: y });\n didRubberBandDragRef.current = false;\n setSelected(new Set());\n };\n\n useEffect(() => {\n if (!rubberBand) return;\n const computeSelection = (minX: number, maxX: number, minY: number, maxY: number) => {\n const sel = new Set<string>();\n const cw = containerRef.current?.clientWidth || 800;\n desktopItems.forEach((item, i) => {\n const pos = getItemPos(item, i);\n const leftX = cw - pos.right - 80;\n if (leftX + 40 > minX && leftX < maxX && pos.top + 40 > minY && pos.top < maxY) {\n sel.add(`item-${i}`);\n }\n });\n folders.forEach((f, i) => {\n const pos = getFolderPos(f, i);\n const leftX = cw - pos.right - 80;\n if (leftX + 40 > minX && leftX < maxX && pos.top + 40 > minY && pos.top < maxY) {\n sel.add(`folder-${i}`);\n }\n });\n return sel;\n };\n const move = (e: PointerEvent) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n // Mark as a real drag once the cursor has moved more than a tap.\n const dx = x - rubberBand.startX;\n const dy = y - rubberBand.startY;\n if (dx * dx + dy * dy > 16) didRubberBandDragRef.current = true;\n setRubberBand(prev => prev ? { ...prev, endX: x, endY: y } : null);\n if (didRubberBandDragRef.current) {\n const minX = Math.min(rubberBand.startX, x);\n const maxX = Math.max(rubberBand.startX, x);\n const minY = Math.min(rubberBand.startY, y);\n const maxY = Math.max(rubberBand.startY, y);\n setSelected(computeSelection(minX, maxX, minY, maxY));\n }\n };\n const up = () => {\n setRubberBand(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [rubberBand]);\n\n // ── Context menu ──\n const handleDesktopContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenu({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemContextMenu = (e: React.MouseEvent, itemIdx: number) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenu({ x: e.clientX, y: e.clientY, itemIdx });\n };\n\n const handleFolderContextMenu = (e: React.MouseEvent, folderIdx: number) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenu({ x: e.clientX, y: e.clientY, folderIdx });\n };\n\n useEffect(() => {\n if (!contextMenu) return;\n const handler = () => setContextMenu(null);\n window.addEventListener('click', handler);\n return () => window.removeEventListener('click', handler);\n }, [contextMenu]);\n\n const createFolder = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n // Icons render right-anchored (style.right = pos.right). Convert the\n // cursor's left-from-container into a right-from-container so the new\n // folder lands under the click instead of mirroring across the desktop.\n const containerW = rect?.width ?? 0;\n const cursorLeft = contextMenu ? contextMenu.x - (rect?.left ?? 0) : containerW - 100;\n const cursorTop = contextMenu ? contextMenu.y - (rect?.top ?? 0) : 100;\n const x = Math.max(0, containerW - cursorLeft - 40);\n const y = Math.max(0, cursorTop - 20);\n const id = `folder-${Date.now()}`;\n saveFolders([...folders, { id, name: 'New Folder', x, y }]);\n setContextMenu(null);\n setRenamingFolder(id);\n setRenameValue('New Folder');\n };\n\n const doSnapAll = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n const h = rect?.height || 600;\n const colCount = Math.max(1, Math.floor(h / GRID));\n let slot = 0;\n const getSlotPos = () => {\n const col = Math.floor(slot / colCount);\n const row = slot % colCount;\n slot++;\n return { right: 20 + col * GRID, top: 10 + row * GRID };\n };\n // Arrange folders first, then items\n const updatedF = folders.map(f => {\n const pos = getSlotPos();\n return { ...f, x: pos.right, y: pos.top };\n });\n saveFolders(updatedF);\n const updated = favDocs.map(d => {\n if (d.folderId) return d;\n const pos = getSlotPos();\n return { ...d, x: pos.right, y: pos.top };\n });\n saveDocs(updated);\n setContextMenu(null);\n };\n\n const removeItem = (idx: number) => {\n const desktopIdx = favDocs.indexOf(desktopItems[idx]);\n saveDocs(favDocs.filter((_, i) => i !== desktopIdx));\n setContextMenu(null);\n };\n\n const removeFolder = (idx: number) => {\n const folder = folders[idx];\n // Move folder items back to desktop\n const updated = favDocs.map(d => d.folderId === folder.id ? { ...d, folderId: undefined } : d);\n saveDocs(updated);\n saveFolders(folders.filter((_, i) => i !== idx));\n setContextMenu(null);\n };\n\n const renameFolder = (id: string, name: string) => {\n saveFolders(folders.map(f => f.id === id ? { ...f, name } : f));\n setRenamingFolder(null);\n };\n\n // ── Sticky notes ──\n // Persist through the consumer-supplied callback when one is wired,\n // otherwise fall back to the prefs adapter under `notepad_notes` so\n // Desktop drags survive a refresh and stay in sync with what Notepad\n // wrote.\n const saveNotes = useCallback((updated: StickyNote[]) => {\n if (host.saveNotes) host.saveNotes(updated);\n else saveShellPrefs({ notepad_notes: updated });\n }, [host, saveShellPrefs]);\n\n const createStickyNote = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n const x = contextMenu ? contextMenu.x - (rect?.left || 0) : 100;\n const y = contextMenu ? contextMenu.y - (rect?.top || 0) : 100;\n const n: StickyNote = {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '', content: '', color: 'yellow', sticky: true,\n sticky_x: x, sticky_y: y, updated_at: new Date().toISOString(),\n };\n saveNotes([n, ...allNotes]);\n setEditingStickyId(n.id);\n setContextMenu(null);\n };\n\n const updateStickyContent = (id: string, content: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, content, updated_at: new Date().toISOString() } : n));\n };\n\n const removeStickyFromDesktop = (id: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, sticky: false } : n));\n };\n\n const deleteStickyNote = (id: string) => {\n saveNotes(allNotes.filter(n => n.id !== id));\n };\n\n const cycleStickyColor = (id: string) => {\n const STICKY_COLORS = ['yellow', 'blue', 'green', 'pink', 'purple', 'orange'];\n const note = allNotes.find(n => n.id === id);\n if (!note) return;\n const idx = STICKY_COLORS.indexOf(note.color);\n const next = STICKY_COLORS[(idx + 1) % STICKY_COLORS.length];\n saveNotes(allNotes.map(n => n.id === id ? { ...n, color: next } : n));\n };\n\n const toggleStickyOnTop = (id: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, sticky_on_top: !n.sticky_on_top } : n));\n };\n\n // Sticky drag\n useEffect(() => {\n if (!stickyDrag) return;\n const move = (e: PointerEvent) => {\n const el = document.querySelector(`[data-sticky-id=\"${stickyDrag.id}\"]`) as HTMLElement;\n if (el) {\n el.style.left = `${stickyDrag.origX + e.clientX - stickyDrag.startX}px`;\n el.style.right = 'auto';\n el.style.top = `${stickyDrag.origY + e.clientY - stickyDrag.startY}px`;\n }\n };\n const up = (e: PointerEvent) => {\n const finalX = stickyDrag.origX + e.clientX - stickyDrag.startX;\n const finalY = Math.max(0, stickyDrag.origY + e.clientY - stickyDrag.startY);\n const el = document.querySelector(`[data-sticky-id=\"${stickyDrag.id}\"]`) as HTMLElement;\n const noteW = el?.offsetWidth ?? 192;\n const centerX = finalX + noteW / 2;\n const anchor: 'left' | 'right' = centerX > window.innerWidth / 2 ? 'right' : 'left';\n // Store x as left offset for left-anchored, or right offset for right-anchored\n const xVal = anchor === 'right' ? window.innerWidth - finalX - noteW : finalX;\n saveNotes(allNotes.map(n => n.id === stickyDrag.id ? { ...n, sticky_x: xVal, sticky_y: finalY, sticky_anchor: anchor } : n));\n // Clear inline styles so React takes over\n if (el) { el.style.left = ''; el.style.right = ''; }\n setStickyDrag(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [stickyDrag, allNotes]);\n\n // Sticky resize\n useEffect(() => {\n if (!stickyResize) return;\n const move = (e: PointerEvent) => {\n const el = document.querySelector(`[data-sticky-id=\"${stickyResize.id}\"]`) as HTMLElement;\n if (el) {\n el.style.width = `${Math.max(140, stickyResize.origW + e.clientX - stickyResize.startX)}px`;\n el.style.height = `${Math.max(100, stickyResize.origH + e.clientY - stickyResize.startY)}px`;\n }\n };\n const up = (e: PointerEvent) => {\n const finalW = Math.max(140, stickyResize.origW + e.clientX - stickyResize.startX);\n const finalH = Math.max(100, stickyResize.origH + e.clientY - stickyResize.startY);\n saveNotes(allNotes.map(n => n.id === stickyResize.id ? { ...n, sticky_w: finalW, sticky_h: finalH } : n));\n setStickyResize(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [stickyResize, allNotes]);\n\n const STICKY_BG: Record<string, string> = {\n yellow: 'bg-yellow-100 border-yellow-300', blue: 'bg-blue-100 border-blue-300',\n green: 'bg-green-100 border-green-300', pink: 'bg-pink-100 border-pink-300',\n purple: 'bg-purple-100 border-purple-300', orange: 'bg-orange-100 border-orange-300',\n };\n\n // ── Render icon ──\n const renderIcon = (entityType: string, label: string, isSelected: boolean, entityId?: string, fileKind?: PreviewFileKind) => (\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <FileIconTile entityType={entityType} isSelected={isSelected} entityId={entityId} label={label} fileKind={fileKind} />\n <span className={`text-[10px] font-medium text-center leading-tight w-full drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)] ${isSelected ? 'text-blue-200 bg-blue-600/60 rounded px-1' : 'text-white'}`}>\n {label}\n </span>\n </div>\n );\n\n const menuStyle = (x: number, y: number): React.CSSProperties => ({\n ...(x + 180 > window.innerWidth ? { right: window.innerWidth - x } : { left: x }),\n ...(y + 250 > window.innerHeight ? { bottom: window.innerHeight - y } : { top: y }),\n });\n\n return (\n <div ref={containerRef} className=\"flex-1 relative overflow-hidden\"\n onPointerDown={startRubberBand}\n onContextMenu={handleDesktopContextMenu}\n onClick={() => {\n // Don't clear selection if the user just finished a rubber-band drag.\n if (didRubberBandDragRef.current) { didRubberBandDragRef.current = false; return; }\n setSelected(new Set());\n setContextMenu(null);\n }}\n >\n {/* Built-in Trash icon. Lives outside favDocs so it can't be\n deleted, renamed, or dropped into a folder, but the user can\n drag it around — its position persists to\n `prefs.desktop_trash_position`. Default position is the\n bottom-right corner, shifted in to clear the taskbar (the\n taskbar is `position: fixed` and overlays this container, so\n a naive `bottom: 20` would hide the icon under it). Double-\n click opens the Files app in trash view via the side-channel\n defined in Files.tsx. */}\n {(() => {\n const cs = typeof document !== 'undefined' ? getComputedStyle(document.documentElement) : null;\n const tbH = parseInt(cs?.getPropertyValue('--taskbar-height') || '0') || 0;\n const tbW = parseInt(cs?.getPropertyValue('--taskbar-width') || '0') || 0;\n const tbPos = (cs?.getPropertyValue('--taskbar-position') || 'bottom').trim();\n const defaultRight = 20 + (tbPos === 'right' ? tbW : 0);\n const defaultBottom = 20 + (tbPos === 'bottom' ? tbH : 0);\n const trashPos = (prefs as any).desktop_trash_position as { right: number; bottom: number } | undefined;\n const right = trashPos?.right ?? defaultRight;\n const bottom = trashPos?.bottom ?? defaultBottom;\n\n const startTrashDrag = (e: React.PointerEvent) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n const el = e.currentTarget as HTMLElement;\n const startX = e.clientX, startY = e.clientY;\n let moved = false;\n const move = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n if (!moved && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) moved = true;\n if (!moved) return;\n // Drag is from-bottom-right, so cursor moving right shrinks the\n // right offset, and moving down shrinks the bottom offset.\n el.style.right = `${right - dx}px`;\n el.style.bottom = `${bottom - dy}px`;\n el.style.opacity = '0.7';\n el.style.zIndex = '100';\n };\n const up = (ev: PointerEvent) => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n el.style.opacity = '';\n el.style.zIndex = '';\n if (!moved) return;\n const newRight = Math.max(0, right - (ev.clientX - startX));\n const newBottom = Math.max(0, bottom - (ev.clientY - startY));\n saveShellPrefs({ desktop_trash_position: { right: newRight, bottom: newBottom } } as any);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n };\n\n return (\n <div\n data-desktop-icon=\"trash\"\n style={{ position: 'absolute', right, bottom, zIndex: 1 }}\n onPointerDown={startTrashDrag}\n onClick={e => e.stopPropagation()}\n onContextMenu={e => e.preventDefault()}\n onDoubleClick={e => {\n e.stopPropagation();\n // Side-channel contract owned by src/apps/Files.tsx:\n // - global flag is read on mount when Files isn't open yet\n // - event tells an already-open Files instance to flip view\n (window as any).__REACT_OS_SHELL_FILES_VIEW__ = 'trash';\n window.dispatchEvent(new CustomEvent('react-os-shell:files-show-trash'));\n openPage('/files');\n }}\n className=\"cursor-default select-none\"\n title=\"Trash — double-click to open, drag to move\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <div className=\"w-12 h-12 flex items-center justify-center\">\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]\" viewBox=\"0 0 24 24\">\n {/* Solid heroicons trash, filled with silver. Subtle darker\n stroke gives it a metallic edge against light wallpapers. */}\n <path\n fill=\"#c0c4cc\"\n stroke=\"#5f6677\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M16.5 4.478v.227a48.816 48.816 0 013.878.512.75.75 0 11-.256 1.478l-.209-.035-1.005 13.07a3 3 0 01-2.991 2.77H8.084a3 3 0 01-2.991-2.77L4.087 6.66l-.209.035a.75.75 0 01-.256-1.478A48.567 48.567 0 017.5 4.705v-.227c0-1.564 1.213-2.9 2.816-2.951a52.662 52.662 0 014.368 0c1.603.051 2.816 1.387 2.816 2.951zm-6.136-1.452a51.196 51.196 0 013.273 0C14.39 3.05 15 3.684 15 4.478v.113a49.488 49.488 0 00-6 0v-.113c0-.794.609-1.428 1.364-1.452zm-.355 5.945a.75.75 0 10-1.5.058l.347 9a.75.75 0 101.499-.058l-.346-9zm5.48.058a.75.75 0 10-1.498-.058l-.347 9a.75.75 0 001.5.058l.346-9z\"\n />\n </svg>\n </div>\n <span className=\"text-[10px] font-medium text-center leading-tight text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]\">\n Trash\n </span>\n </div>\n </div>\n );\n })()}\n\n {/* Desktop items */}\n {desktopItems.map((doc, i) => {\n const docIdx = favDocs.indexOf(doc);\n const pos = localPositions[`item-${docIdx}`] || getItemPos(doc, i);\n const isSelected = selected.has(`item-${i}`);\n return (\n <div key={`item-${doc.entityType}-${doc.entityId}-${i}`} data-desktop-icon={`item-${i}`}\n style={{ position: 'absolute', right: pos.right, top: pos.top, zIndex: 1 }}\n onPointerDown={e => { e.stopPropagation(); startDrag('item', i, e); }}\n onClick={e => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(`item-${i}`) ? next.delete(`item-${i}`) : next.add(`item-${i}`); return next; });\n } else if (!selected.has(`item-${i}`)) {\n setSelected(new Set([`item-${i}`]));\n }\n }}\n onContextMenu={e => handleItemContextMenu(e, i)}\n onDoubleClick={e => {\n e.stopPropagation();\n if (doc.entityType === 'preview-file' && doc.filePath && doc.fileKind) {\n openPreviewFile({\n filePath: doc.filePath,\n filename: doc.label,\n kind: doc.fileKind,\n onStaged: route => openPage(route),\n });\n } else if (doc.entityType === 'page') {\n openPage(doc.entityId);\n } else {\n openEntity(doc.entityType, doc.entityId, null, doc.label);\n }\n }}\n className=\"cursor-default select-none\"\n >\n {renderIcon(doc.entityType, doc.label, isSelected, doc.entityId, doc.fileKind)}\n </div>\n );\n })}\n\n {/* Folders */}\n {folders.map((folder, i) => {\n const pos = localPositions[`folder-${i}`] || getFolderPos(folder, i);\n const isSelected = selected.has(`folder-${i}`);\n const isHovered = hoverFolderIdx === i;\n const itemCount = folderItems(folder.id).length;\n return (\n <div key={`folder-${folder.id}`} data-desktop-icon={`folder-${i}`}\n style={{\n position: 'absolute', right: pos.right, top: pos.top, zIndex: 1,\n transform: isHovered ? 'scale(1.15)' : 'scale(1)',\n transition: 'transform 180ms ease-out',\n }}\n onPointerDown={e => { e.stopPropagation(); startDrag('folder', i, e); }}\n onClick={e => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(`folder-${i}`) ? next.delete(`folder-${i}`) : next.add(`folder-${i}`); return next; });\n } else if (!selected.has(`folder-${i}`)) {\n setSelected(new Set([`folder-${i}`]));\n }\n }}\n onContextMenu={e => handleFolderContextMenu(e, i)}\n onDoubleClick={e => { e.stopPropagation(); setOpenFolder(folder.id); }}\n className=\"cursor-default select-none\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''} ${isHovered ? 'rounded-lg ring-4 ring-amber-400 shadow-[0_0_20px_rgba(245,158,11,0.6)]' : ''}`}>\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]\" viewBox=\"0 0 48 48\">\n <path d=\"M6 12a4 4 0 014-4h10l4 4h14a4 4 0 014 4v20a4 4 0 01-4 4H10a4 4 0 01-4-4V12z\" fill=\"white\" stroke=\"#eab308\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M6 18h36\" stroke=\"#eab308\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n {renamingFolder === folder.id ? (\n <input autoFocus value={renameValue} onChange={e => setRenameValue(e.target.value)}\n onBlur={() => renameFolder(folder.id, renameValue)}\n onKeyDown={e => { if (e.key === 'Enter') renameFolder(folder.id, renameValue); if (e.key === 'Escape') setRenamingFolder(null); }}\n className=\"text-[10px] w-full text-center bg-white/80 rounded px-1 outline-none\"\n onClick={e => e.stopPropagation()}\n />\n ) : (\n <span className={`text-[10px] font-medium text-center leading-tight w-full drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)] ${isSelected ? 'text-blue-200 bg-blue-600/60 rounded px-1' : 'text-white'}`}>\n {folder.name}{itemCount > 0 ? ` (${itemCount})` : ''}\n </span>\n )}\n </div>\n </div>\n );\n })}\n\n {/* Sticky notes */}\n {stickyNotes.map(note => {\n const xVal = note.sticky_x ?? 100;\n const y = note.sticky_y ?? 100;\n const w = note.sticky_w ?? 192;\n const h = note.sticky_h ?? 148;\n const anchor = note.sticky_anchor || 'left';\n const bg = STICKY_BG[note.color] || STICKY_BG.yellow;\n const isEditing = editingStickyId === note.id;\n return (\n <div key={`sticky-${note.id}`} data-sticky-id={note.id}\n style={{ position: 'absolute', ...(anchor === 'right' ? { right: xVal } : { left: xVal }), top: y, width: w, height: h, zIndex: note.sticky_on_top ? 200 : isEditing ? 50 : 10 }}\n onClick={e => e.stopPropagation()}\n className={`rounded-lg shadow-lg border ${bg} select-none flex flex-col`}\n >\n {/* Header — drag handle */}\n <div className=\"flex items-center justify-between px-2 py-1 cursor-move border-b border-black/5\"\n onPointerDown={e => {\n if (e.button !== 0) return;\n e.preventDefault(); e.stopPropagation();\n // Always drag using left position; convert right-anchored to left\n const el = (e.target as HTMLElement).closest('[data-sticky-id]') as HTMLElement;\n const actualLeft = el ? el.getBoundingClientRect().left - (containerRef.current?.getBoundingClientRect().left ?? 0) : (anchor === 'right' ? window.innerWidth - xVal - w : xVal);\n setStickyDrag({ id: note.id, startX: e.clientX, startY: e.clientY, origX: actualLeft, origY: y });\n }}>\n <div className=\"flex items-center gap-1\">\n <button\n onPointerDown={e => e.stopPropagation()}\n onClick={e => { e.stopPropagation(); cycleStickyColor(note.id); }}\n title=\"Change color\"\n className=\"w-3 h-3 rounded-full bg-black/10 hover:bg-black/20 transition-colors\" />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); toggleStickyOnTop(note.id); }} title={note.sticky_on_top ? 'Remove from top' : 'Always on top'}\n className={`p-0.5 rounded transition-colors ${note.sticky_on_top ? 'text-blue-500' : 'text-black/20 hover:text-black/50'}`}>\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 4.5h14.25M3 9h9.75M3 13.5h5.25m5.914 5.046a5.25 5.25 0 01-1.414 0M15.75 9v6\" /><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12.75 12l3 3 3-3\" /></svg>\n </button>\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); removeStickyFromDesktop(note.id); }} title=\"Unpin from desktop\"\n className=\"p-0.5 rounded text-black/20 hover:text-black/50 transition-colors\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 12h-15\" /></svg>\n </button>\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); deleteStickyNote(note.id); }} title=\"Delete note\"\n className=\"p-0.5 rounded text-black/20 hover:text-red-500 transition-colors\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\n </div>\n {/* Content */}\n {isEditing ? (\n <textarea\n autoFocus\n defaultValue={note.content}\n onBlur={e => { updateStickyContent(note.id, e.target.value); setEditingStickyId(null); }}\n onKeyDown={e => { if (e.key === 'Escape') { updateStickyContent(note.id, (e.target as HTMLTextAreaElement).value); setEditingStickyId(null); } }}\n className=\"flex-1 w-full p-2 text-xs leading-relaxed bg-transparent outline-none resize-none placeholder:text-black/30\"\n placeholder=\"Write something...\"\n />\n ) : (\n <div className=\"flex-1 p-2 cursor-text overflow-hidden\" onDoubleClick={e => { e.stopPropagation(); setEditingStickyId(note.id); }}>\n <div className=\"text-xs leading-relaxed text-black/70\">\n {note.content ? renderStickyContent(note.id, note.content) : <span className=\"text-black/30 italic\">Double-click to edit...</span>}\n </div>\n </div>\n )}\n {/* Resize handle */}\n <div className=\"absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize\"\n onPointerDown={e => {\n if (e.button !== 0) return;\n e.preventDefault(); e.stopPropagation();\n const el = (e.target as HTMLElement).closest('[data-sticky-id]') as HTMLElement;\n setStickyResize({ id: note.id, startX: e.clientX, startY: e.clientY, origW: el?.offsetWidth ?? w, origH: el?.offsetHeight ?? h });\n }}>\n <svg className=\"w-3 h-3 text-black/15 absolute bottom-0.5 right-0.5\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <circle cx=\"10\" cy=\"10\" r=\"1.5\" /><circle cx=\"6\" cy=\"10\" r=\"1.5\" /><circle cx=\"10\" cy=\"6\" r=\"1.5\" />\n </svg>\n </div>\n </div>\n );\n })}\n\n {/* Rubber band selection */}\n {rubberBand && (\n <div className=\"absolute border border-blue-400 bg-blue-400/10 pointer-events-none\" style={{\n left: Math.min(rubberBand.startX, rubberBand.endX),\n top: Math.min(rubberBand.startY, rubberBand.endY),\n width: Math.abs(rubberBand.endX - rubberBand.startX),\n height: Math.abs(rubberBand.endY - rubberBand.startY),\n }} />\n )}\n\n {/* Context menu — desktop */}\n {contextMenu && contextMenu.itemIdx == null && contextMenu.folderIdx == null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)}>\n <PopupMenuItem onClick={createStickyNote}>\n <svg className=\"h-4 w-4 text-yellow-500\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M4 4a2 2 0 012-2h8a2 2 0 012 2v8a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\" opacity=\"0.8\" /><path d=\"M14 14v4a2 2 0 01-2 2H6a2 2 0 01-2-2v-6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" /></svg>\n New Sticky Note\n </PopupMenuItem>\n <PopupMenuItem onClick={createFolder}>\n <svg className=\"h-4 w-4 text-yellow-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z\" /></svg>\n Create Folder\n </PopupMenuItem>\n <PopupMenuItem onClick={doSnapAll}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" /></svg>\n Snap to Grid\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); setWidgetsOpen(true); }}>\n <svg className=\"h-4 w-4 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" /></svg>\n Manage Widgets…\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setContextMenu(null); openPage('/settings/customization'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42\" /></svg>\n Customization\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); openPage('/settings/favorites'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" /></svg>\n Favorites\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); setAboutOpen(true); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" /></svg>\n About {host.productName ?? 'this app'}\n </PopupMenuItem>\n {bugReport && <>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setContextMenu(null); reportBug(bugReport.submit); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" /></svg>\n Suggestion or Bug\n </PopupMenuItem>\n </>}\n </PopupMenu>\n )}\n\n {/* Context menu — item */}\n {contextMenu && contextMenu.itemIdx != null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)} minWidth={160}>\n <PopupMenuItem onClick={() => { const d = desktopItems[contextMenu.itemIdx!]; d.entityType === 'page' ? openPage(d.entityId) : openEntity(d.entityType, d.entityId, null, d.label); setContextMenu(null); }}>\n Open\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={() => removeItem(contextMenu.itemIdx!)}>\n Remove Shortcut\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n {/* Context menu — folder */}\n {contextMenu && contextMenu.folderIdx != null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)} minWidth={160}>\n <PopupMenuItem onClick={() => { setOpenFolder(folders[contextMenu.folderIdx!].id); setContextMenu(null); }}>\n Open\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setRenamingFolder(folders[contextMenu.folderIdx!].id); setRenameValue(folders[contextMenu.folderIdx!].name); setContextMenu(null); }}>\n Rename\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={() => removeFolder(contextMenu.folderIdx!)}>\n Delete Folder\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n {/* Folder window */}\n {openFolder && (() => {\n const folder = folders.find(f => f.id === openFolder);\n if (!folder) return null;\n return (\n <FolderWindow\n folder={folder}\n items={folderItems(openFolder)}\n onClose={() => setOpenFolder(null)}\n onOpen={(item) => {\n if (item.entityType === 'preview-file' && item.filePath && item.fileKind) {\n openPreviewFile({\n filePath: item.filePath,\n filename: item.label,\n kind: item.fileKind,\n onStaged: route => openPage(route),\n });\n } else {\n openEntity(item.entityType, item.entityId, null, item.label);\n }\n }}\n onMoveOut={(toMove) => {\n const ids = new Set(toMove.map(t => `${t.entityType}|${t.entityId}`));\n const updated = favDocs.map(d =>\n d.folderId === openFolder && ids.has(`${d.entityType}|${d.entityId}`)\n ? { ...d, folderId: undefined, folderX: undefined, folderY: undefined }\n : d,\n );\n saveDocs(updated);\n }}\n onSetFolderPosition={(updates) => {\n // Patch folderX/folderY on each affected item. Items are\n // matched by entityType+entityId so the patch survives any\n // concurrent reordering.\n const patch = new Map(updates.map(u => [`${u.item.entityType}|${u.item.entityId}`, u]));\n const updated = favDocs.map(d => {\n const u = patch.get(`${d.entityType}|${d.entityId}`);\n return u ? { ...d, folderX: u.x, folderY: u.y } : d;\n });\n saveDocs(updated);\n }}\n onDragOutToDesktop={(drops) => {\n // Convert cursor coords to desktop right/top (icons are\n // right-anchored on the desktop, same convention used for\n // desktop→folder drops). Container ref gives us the offset.\n const containerRect = containerRef.current?.getBoundingClientRect();\n const cw = containerRef.current?.clientWidth ?? window.innerWidth;\n const patch = new Map<string, { right: number; top: number }>();\n for (const d of drops) {\n const offX = containerRect ? d.clientX - containerRect.left : d.clientX;\n const offY = containerRect ? d.clientY - containerRect.top : d.clientY;\n // Center the 80×80 icon on the cursor.\n let right = cw - offX - 40;\n let top = Math.max(0, offY - 40);\n if (snapEnabled) { const s = snapToGrid(right, top); right = s.x; top = s.y; }\n right = Math.max(0, right);\n patch.set(`${d.item.entityType}|${d.item.entityId}`, { right, top });\n }\n const updated = favDocs.map(d => {\n const p = patch.get(`${d.entityType}|${d.entityId}`);\n return p\n ? { ...d, folderId: undefined, folderX: undefined, folderY: undefined, x: p.right, y: p.top }\n : d;\n });\n saveDocs(updated);\n }}\n />\n );\n })()}\n\n {/* Widget manager — add / remove desktop widgets */}\n <WidgetManager open={widgetsOpen} onClose={() => setWidgetsOpen(false)} />\n\n {/* About dialog */}\n {aboutOpen && (() => {\n const version = host.productVersion ?? APP_VERSION;\n const showVersion: boolean = prefs.show_desktop_version ?? true;\n return (\n <Modal open={true} onClose={() => setAboutOpen(false)} title={`About ${host.productName ?? 'this app'}`} size=\"sm\" bodyScroll={false} compact dimensions={[340, 420]}>\n <div className=\"flex flex-col items-center\">\n {/* Logo & Title */}\n <div className=\"flex flex-col items-center gap-2 pt-4 pb-3 w-full\">\n <img src={host.productIcon ?? '/favicon.svg'} alt=\"\" className=\"h-16 w-16\" />\n <div className=\"text-center\">\n <h2 className=\"text-lg font-bold text-gray-900 tracking-wide\">{host.productName ?? 'react-os-shell'}</h2>\n {host.productTagline && <p className=\"text-xs text-gray-500\">{host.productTagline}</p>}\n <p className=\"text-[11px] text-gray-400 mt-1 font-mono\">{version}</p>\n </div>\n </div>\n\n {/* Open Source Licenses */}\n <div className=\"py-3 border-t border-gray-200 w-full px-4\">\n <h3 className=\"text-[10px] font-semibold text-gray-400 uppercase tracking-wide mb-2 text-center\">Open Source Licenses</h3>\n <div className=\"max-h-40 overflow-y-auto\">\n <table className=\"w-full text-[11px]\">\n <thead><tr className=\"text-gray-500 border-b border-gray-100\"><th className=\"text-left py-1 font-medium\">Package</th><th className=\"text-left py-1 font-medium\">License</th></tr></thead>\n <tbody className=\"divide-y divide-gray-50\">\n {[\n ['React', 'MIT', 'facebook/react'],\n ['React DOM', 'MIT', 'facebook/react'],\n ['React Router', 'MIT', 'remix-run/react-router'],\n ['TanStack Query', 'MIT', 'TanStack/query'],\n ['TanStack Table', 'MIT', 'TanStack/table'],\n ['React Hook Form', 'MIT', 'react-hook-form'],\n ['Axios', 'MIT', 'axios/axios'],\n ['Tailwind CSS', 'MIT', 'tailwindlabs/tailwindcss'],\n ['Headless UI', 'MIT', 'tailwindlabs/headlessui'],\n ['Heroicons', 'MIT', 'tailwindlabs/heroicons'],\n ['Recharts', 'MIT', 'recharts/recharts'],\n ['Zod', 'MIT', 'colinhacks/zod'],\n ['Vite', 'MIT', 'vitejs/vite'],\n ['TypeScript', 'Apache-2.0', 'microsoft/TypeScript'],\n ['jSpreadsheet CE', 'MIT', 'jspreadsheet/ce'],\n ['Django', 'BSD-3', 'django/django'],\n ['Django REST Framework', 'BSD-3', 'encode/django-rest-framework'],\n ['PostgreSQL', 'PostgreSQL', 'postgres/postgres'],\n ['Gunicorn', 'MIT', 'benoitc/gunicorn'],\n ].map(([name, license, repo]) => (\n <tr key={name} className=\"text-gray-600\">\n <td className=\"py-1\"><a href={`https://github.com/${repo}`} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:underline\">{name}</a></td>\n <td className=\"py-1 text-gray-400\">{license}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Copyright — bottom (consumer-configurable; hidden when neither field is supplied) */}\n {(host.productCopyright || host.productWebsite) && (\n <div className=\"pt-3 pb-2 border-t border-gray-200 w-full text-center\">\n {host.productCopyright && <p className=\"text-[10px] text-gray-400\">{host.productCopyright}</p>}\n {host.productWebsite && (\n <a href={host.productWebsite} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[10px] text-blue-500 hover:underline\">\n {host.productWebsite.replace(/^https?:\\/\\//, '')}\n </a>\n )}\n </div>\n )}\n </div>\n </Modal>\n );\n })()}\n\n {/* Version watermark on desktop — opt-in only. Hidden by default so\n consumer apps don't end up with two version labels (the bundled\n one and their own). Set prefs.show_desktop_version = true and\n provide host.productVersion to surface it. */}\n {prefs.show_desktop_version === true && (host.productVersion ?? APP_VERSION) && (\n <button\n onClick={(e) => { e.stopPropagation(); setWhatsNewOpen(true); }}\n className={`absolute bottom-3 text-[10px] text-white/50 font-mono select-none drop-shadow-[0_1px_1px_rgba(0,0,0,0.5)] hover:text-white/80 transition-colors cursor-pointer ${\n prefs.taskbar_position === 'top' ? 'right-3' :\n prefs.taskbar_position === 'left' ? 'right-3' :\n prefs.taskbar_position === 'right' ? 'left-3' :\n 'right-3 !bottom-16'\n }`}\n >\n {host.productVersion ?? APP_VERSION}\n </button>\n )}\n\n {/* What's New dialog */}\n {whatsNewOpen && (() => {\n const entries = host.productChangelog ?? changelog;\n return (\n <Modal open={true} onClose={() => setWhatsNewOpen(false)} title=\"What's New\" size=\"md\" bodyScroll={false}>\n <div className=\"space-y-5 max-h-[60vh] overflow-y-auto px-1\">\n {entries.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-6\">No changelog available.</p>\n ) : entries.map((entry, i) => (\n <div key={entry.version}>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm font-bold text-gray-900 font-mono\">{entry.version}</span>\n <span className=\"text-xs text-gray-400\">{formatDate(entry.date)}</span>\n </div>\n <ul className=\"space-y-1.5 ml-1\">\n {entry.changes.map((change, j) => (\n <li key={j} className=\"flex items-start gap-2 text-sm text-gray-600\">\n <span className=\"text-blue-500 mt-1 shrink-0\">&#8226;</span>\n {change}\n </li>\n ))}\n </ul>\n {i < entries.length - 1 && <div className=\"border-b border-gray-200 mt-4\" />}\n </div>\n ))}\n </div>\n </Modal>\n );\n })()}\n </div>\n );\n}\n","import { useEffect, useSyncExternalStore } from 'react';\nimport { useShellPrefs } from '../shell/ShellPrefs';\n\nexport type Theme = 'system' | 'light' | 'dark' | 'pink' | 'green' | 'grey' | 'blue';\n\n/** Subscribe to OS dark-mode changes */\nfunction subscribeMediaQuery(cb: () => void) {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n mq.addEventListener('change', cb);\n return () => mq.removeEventListener('change', cb);\n}\nfunction getSystemIsDark() {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/** Derive lighter / darker shades from a hex color via HSL */\nfunction hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h = 0, s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n }\n return [h * 360, s * 100, l * 100];\n}\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100; l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => { const k = (n + h / 30) % 12; return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); };\n const toHex = (x: number) => Math.round(x * 255).toString(16).padStart(2, '0');\n return `#${toHex(f(0))}${toHex(f(8))}${toHex(f(4))}`;\n}\n\nexport function useTheme() {\n const { prefs } = useShellPrefs();\n const systemDark = useSyncExternalStore(subscribeMediaQuery, getSystemIsDark);\n const saved: Theme = (prefs.theme as Theme) || 'system';\n const accentColor: string | null = prefs.accent_color || null;\n const customBgColor: string | null = prefs.custom_bg_color || null;\n const customTitleColor: string | null = prefs.custom_title_color || null;\n const customWindowColor: string | null = prefs.custom_window_color || null;\n const customButtonColor: string | null = prefs.custom_button_color || null;\n\n // Resolve \"system\" to actual theme\n const resolved = saved === 'system' ? (systemDark ? 'dark' : 'light') : saved;\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolved);\n return () => document.documentElement.removeAttribute('data-theme');\n }, [resolved]);\n\n // Custom accent color\n useEffect(() => {\n const root = document.documentElement;\n if (accentColor && /^#[0-9a-fA-F]{6}$/.test(accentColor)) {\n const [h, s, l] = hexToHsl(accentColor);\n root.setAttribute('data-custom-accent', 'true');\n root.style.setProperty('--accent-600', accentColor);\n root.style.setProperty('--accent-700', hslToHex(h, s, Math.max(l - 10, 5)));\n root.style.setProperty('--accent-500', hslToHex(h, s, Math.min(l + 10, 95)));\n root.style.setProperty('--accent-400', hslToHex(h, s, Math.min(l + 20, 95)));\n root.style.setProperty('--accent-300', hslToHex(h, Math.min(s + 10, 100), Math.min(l + 30, 92)));\n root.style.setProperty('--accent-200', hslToHex(h, Math.min(s + 15, 100), Math.min(l + 38, 94)));\n root.style.setProperty('--accent-100', hslToHex(h, Math.min(s + 20, 100), Math.min(l + 42, 96)));\n root.style.setProperty('--accent-50', hslToHex(h, Math.min(s + 20, 100), Math.min(l + 46, 98)));\n } else {\n root.removeAttribute('data-custom-accent');\n ['--accent-600', '--accent-700', '--accent-500', '--accent-400', '--accent-300', '--accent-200', '--accent-100', '--accent-50'].forEach(p => root.style.removeProperty(p));\n }\n }, [accentColor]);\n\n // Custom theme colors (bg, title, window, button)\n useEffect(() => {\n const root = document.documentElement;\n if (accentColor) {\n // Helper to convert hex to \"r g b\" for rgba usage\n const hexToRgb = (hex: 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 `${r} ${g} ${b}`;\n };\n if (customBgColor) root.style.setProperty('--custom-bg-color', customBgColor);\n if (customTitleColor) {\n root.style.setProperty('--window-header-rgb', hexToRgb(customTitleColor));\n root.style.setProperty('--window-footer-rgb', hexToRgb(customTitleColor));\n }\n if (customWindowColor) root.style.setProperty('--window-content-rgb', hexToRgb(customWindowColor));\n if (customButtonColor) {\n root.style.setProperty('--custom-button-color', customButtonColor);\n const [h, s, l] = hexToHsl(customButtonColor);\n root.style.setProperty('--custom-button-hover', hslToHex(h, s, Math.max(l - 10, 5)));\n }\n } else {\n ['--custom-bg-color', '--custom-button-color', '--custom-button-hover'].forEach(p => root.style.removeProperty(p));\n }\n }, [accentColor, customBgColor, customTitleColor, customWindowColor, customButtonColor]);\n\n return { theme: saved, resolved };\n}\n","import { useEffect, type RefObject } from 'react';\n\nexport default function useClickOutside(ref: RefObject<HTMLElement | null>, onClose: () => void) {\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [ref, onClose]);\n}\n","import { useState, useEffect, useRef } from 'react';\n\n/**\n * Startup splash animation — shown once when the app first loads after login.\n * Fades out after the animation completes, then unmounts.\n */\nexport default function StartupAnimation({ onComplete, ready = false, productName = 'react-os-shell', subtitle }: { onComplete: () => void; ready?: boolean; productName?: string; subtitle?: string }) {\n const [phase, setPhase] = useState<'logo' | 'text' | 'fade'>('logo');\n const [minTimePassed, setMinTimePassed] = useState(false);\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n const fadingRef = useRef(false);\n\n useEffect(() => {\n const t1 = setTimeout(() => setPhase('text'), 600);\n const t2 = setTimeout(() => setMinTimePassed(true), 2000);\n // Safety: force complete after 5s even if ready never fires\n const t3 = setTimeout(() => {\n if (!fadingRef.current) { fadingRef.current = true; setPhase('fade'); setTimeout(() => onCompleteRef.current(), 500); }\n }, 5000);\n return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); };\n }, []);\n\n // Fade out when both ready AND minimum time passed\n useEffect(() => {\n if (!ready || !minTimePassed || fadingRef.current) return;\n fadingRef.current = true;\n setPhase('fade');\n const t = setTimeout(() => onCompleteRef.current(), 500);\n return () => clearTimeout(t);\n }, [ready, minTimePassed]);\n\n return (\n <div\n className={`fixed inset-0 z-[9999] flex flex-col items-center justify-center transition-opacity duration-500 ${phase === 'fade' ? 'opacity-0 pointer-events-none' : 'opacity-100'}`}\n style={{ background: 'linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)' }}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full opacity-20\"\n style={{ background: 'radial-gradient(circle, rgba(124,58,237,0.4) 0%, transparent 70%)', animation: 'pulse-glow 2s ease-in-out infinite' }} />\n </div>\n\n {/* Logo */}\n <div className={`relative transition-all duration-700 ease-out ${phase === 'logo' ? 'scale-75 opacity-0' : 'scale-100 opacity-100'}`}>\n <img src=\"/favicon.svg\" alt=\"\" className=\"h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]\"\n style={{ animation: 'spin-in 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards' }} />\n </div>\n\n {/* Title */}\n <div className={`mt-6 text-center transition-all duration-500 ${phase !== 'logo' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`}>\n <h1 className=\"text-2xl font-bold tracking-[0.3em] text-white/90 uppercase\">{productName}</h1>\n <div className=\"mt-2 flex items-center justify-center gap-1.5\">\n {[0, 1, 2].map(i => (\n <div key={i} className=\"w-1.5 h-1.5 rounded-full bg-purple-400\"\n style={{ animation: `dot-bounce 1s ease-in-out ${i * 0.15}s infinite` }} />\n ))}\n </div>\n </div>\n\n {/* Subtitle (consumer-supplied — typically the company / product name) */}\n {subtitle && (\n <div className={`absolute bottom-8 transition-all duration-500 ${phase !== 'logo' ? 'opacity-40' : 'opacity-0'}`}>\n <p className=\"text-[10px] text-white/40 font-mono tracking-wider\">{subtitle}</p>\n </div>\n )}\n\n <style>{`\n @keyframes spin-in {\n 0% { transform: scale(0) rotate(-180deg); opacity: 0; }\n 100% { transform: scale(1) rotate(0deg); opacity: 1; }\n }\n @keyframes dot-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes pulse-glow {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.15; }\n 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.25; }\n }\n `}</style>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { playLogout } from '../utils/sounds';\n\nexport default function LogoutAnimation({ onComplete, subtitle }: { onComplete: () => void; subtitle?: string }) {\n // 'show' → greeting visible; 'out' → logo/title spin and fade away. The\n // full-screen cover itself stays opaque the whole time — it never fades to\n // transparent — so the desktop underneath is never revealed. onComplete\n // fires while the cover is still solid, so the consumer's login screen\n // swaps in behind it and the user goes straight from \"Goodbye\" to login\n // (no flash of the desktop in between).\n const [phase, setPhase] = useState<'show' | 'out'>('show');\n\n useEffect(() => {\n playLogout();\n const t1 = setTimeout(() => setPhase('out'), 800);\n const t2 = setTimeout(onComplete, 2300);\n return () => { clearTimeout(t1); clearTimeout(t2); };\n }, [onComplete]);\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex flex-col items-center justify-center\"\n style={{ background: 'linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)' }}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full\"\n style={{\n background: 'radial-gradient(circle, rgba(124,58,237,0.4) 0%, transparent 70%)',\n animation: 'logout-glow 2s ease-in-out infinite',\n opacity: phase === 'show' ? 0.2 : 0,\n transition: 'opacity 1s',\n }} />\n </div>\n\n {/* Logo — spins out */}\n <div className={`relative transition-all duration-1000 ease-in ${phase === 'out' ? 'scale-0 opacity-0' : 'scale-100 opacity-100'}`}\n style={phase === 'out' ? { transform: 'scale(0) rotate(180deg)' } : undefined}>\n <img src=\"/favicon.svg\" alt=\"\" className=\"h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]\" />\n </div>\n\n {/* Title — fades down */}\n <div className={`mt-6 text-center transition-all duration-700 ${phase === 'show' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`}>\n <h1 className=\"text-2xl font-bold tracking-[0.3em] text-white/90 uppercase\">Goodbye</h1>\n <p className=\"mt-2 text-xs text-white/40\">See you next time</p>\n </div>\n\n {/* Subtitle (consumer-supplied — typically the company / product name) */}\n {subtitle && (\n <div className={`absolute bottom-8 transition-all duration-500 ${phase === 'show' ? 'opacity-40' : 'opacity-0'}`}>\n <p className=\"text-[10px] text-white/40 font-mono tracking-wider\">{subtitle}</p>\n </div>\n )}\n\n <style>{`\n @keyframes logout-glow {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.15; }\n 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.25; }\n }\n `}</style>\n </div>\n );\n}\n","import { useState, useEffect, useLayoutEffect, useRef, isValidElement, cloneElement, type ReactElement, type ReactNode } from 'react';\nimport {\n navSections as defaultNavSections,\n navIcons as defaultNavIcons,\n sectionIcons as defaultSectionIcons,\n startMenuCategories as defaultCategories,\n isSection,\n type NavSection,\n type NavItem,\n type StartMenuCategories,\n type VirtualSection,\n} from '../shell-config/nav';\nimport { useAuth } from '../contexts/AuthContext';\nimport { glassStyle, GLASS_INPUT_BG } from '../utils/glass';\nimport { useIsMobile } from './useIsMobile';\n\ninterface StartMenuProps {\n open: boolean; onClose: () => void; openPage: (path: string) => void;\n openWindows: { route?: string; label: string }[];\n profile: any; user: any; onLogout: () => void; onNavigate: (path: string) => void;\n taskbarPosition: 'top' | 'bottom' | 'left' | 'right'; taskbarH: number; taskbarW?: number;\n size?: 'small' | 'medium' | 'large';\n /** Override the default nav sections (sections + top-level items). */\n navSections?: (NavSection | NavItem)[];\n /** Per-route icon map for items in the menu. */\n navIcons?: Record<string, ReactNode>;\n /** Per-section header icon map. */\n sectionIcons?: Record<string, ReactNode>;\n /** Section grouping + virtual flyouts (Utilities-style trays). */\n categories?: StartMenuCategories;\n}\n\nconst ITEM_H = 36; // approximate height per menu item in px\n\nexport default function StartMenu({\n open, onClose, openPage, profile, user, onLogout,\n taskbarPosition, taskbarH, taskbarW = 0, size = 'medium',\n navSections = defaultNavSections,\n navIcons = defaultNavIcons,\n sectionIcons = defaultSectionIcons,\n categories = defaultCategories,\n}: StartMenuProps) {\n const erpLabels = new Set(categories.erp);\n const systemLabels = new Set(categories.system);\n const footerLabels = new Set(categories.footer ?? []);\n const virtualSections = categories.virtual ?? [];\n const virtualByLabel: Record<string, VirtualSection> = Object.fromEntries(\n virtualSections.map(v => [v.label, v]),\n );\n const { hasAnyPerm } = useAuth();\n // Flat rows pinned to the footer (next to the profile), e.g. System\n // Preferences. Rendered directly — no flyout — unlike `categories.footer`.\n const footerItems = (categories.footerItems ?? []).filter(item => !item.perms || hasAnyPerm(item.perms));\n const isMobile = useIsMobile();\n const [hoveredSection, setHoveredSection] = useState<string | null>(null);\n const [hoveredY, setHoveredY] = useState(0);\n // 3rd-level flyout: when the user hovers a NavItem (inside a section flyout)\n // that has `children`, we open a sub-flyout anchored next to that item.\n const [hoveredChild, setHoveredChild] = useState<string | null>(null);\n const [hoveredChildY, setHoveredChildY] = useState(0);\n const [search, setSearch] = useState('');\n const [searchIdx, setSearchIdx] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n const flyoutRef = useRef<HTMLDivElement>(null);\n const subFlyoutRef = useRef<HTMLDivElement>(null);\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>();\n const childHoverTimeout = useRef<ReturnType<typeof setTimeout>>();\n // Measured heights — used to refine the estimate-based top position so the\n // flyout fits its content without needing a scrollbar. Tracked together\n // with the target (section/child) the measurement is FOR, so a stale value\n // from a previous target is never used: when the target changes the\n // derived `flyoutH` falls back to the estimate until useLayoutEffect\n // re-measures. This avoids the post-paint reset that previously caused the\n // level-2 flyout to \"bounce\" between estimate and measured positions —\n // that bounce would shift items vertically right under the cursor, so\n // hovering an item with children on the first try never registered.\n const [measuredFlyout, setMeasuredFlyout] = useState<{ key: string; h: number } | null>(null);\n const [measuredSub, setMeasuredSub] = useState<{ key: string; h: number } | null>(null);\n\n useEffect(() => { if (!open) { setSearch(''); setHoveredSection(null); setHoveredChild(null); setSearchIdx(0); } }, [open]);\n\n // Clear the 3rd-level flyout whenever the level-2 flyout changes target.\n useEffect(() => { setHoveredChild(null); }, [hoveredSection]);\n\n // Capture each flyout's intrinsic rendered height after layout. Runs\n // before paint, so the very next paint repositions using the actual h.\n // Stale measurements from a different target are discarded by the\n // `measuredFlyout?.key === hoveredSection` check below.\n useLayoutEffect(() => {\n if (!flyoutRef.current || !hoveredSection || search.length >= 2) return;\n const h = flyoutRef.current.offsetHeight;\n if (measuredFlyout?.key !== hoveredSection || measuredFlyout.h !== h) {\n setMeasuredFlyout({ key: hoveredSection, h });\n }\n }, [hoveredSection, search, measuredFlyout]);\n useLayoutEffect(() => {\n if (!subFlyoutRef.current || !hoveredChild || search.length >= 2) return;\n const h = subFlyoutRef.current.offsetHeight;\n if (measuredSub?.key !== hoveredChild || measuredSub.h !== h) {\n setMeasuredSub({ key: hoveredChild, h });\n }\n }, [hoveredChild, search, measuredSub]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n const click = (e: PointerEvent | MouseEvent) => {\n if ((e.target as HTMLElement).closest('[data-menu-toggle]')) return;\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener('keydown', handler);\n window.addEventListener('pointerdown', click);\n return () => { window.removeEventListener('keydown', handler); window.removeEventListener('pointerdown', click); };\n }, [open, onClose]);\n\n if (!open) return null;\n\n const handleClick = (path: string) => { openPage(path); onClose(); };\n\n // Mobile: render as full-screen slide-up sheet with search + flat list.\n // Folders live on MobileHome; this sheet is the quick-launch / search UI\n // surfaced from the bottom-nav \"Menu\" button.\n if (isMobile) {\n const allItems: { item: NavItem; sectionLabel?: string }[] = [];\n // Recursively flatten — 3rd-level children show up as their own rows so\n // they can be searched/tapped from the mobile sheet too.\n const pushItem = (it: NavItem, sectionLabel?: string) => {\n if (it.perms && !hasAnyPerm(it.perms)) return;\n allItems.push({ item: it, sectionLabel });\n if (it.children) {\n for (const c of it.children) pushItem(c, it.label);\n }\n };\n for (const entry of navSections) {\n if (isSection(entry)) {\n const sec = entry as NavSection;\n if (sec.perms && !hasAnyPerm(sec.perms)) continue;\n for (const it of sec.items) pushItem(it, sec.label);\n } else {\n pushItem(entry as NavItem);\n }\n }\n for (const it of footerItems) pushItem(it);\n const filtered = search.length >= 1\n ? allItems.filter(({ item }) => item.label.toLowerCase().includes(search.toLowerCase()))\n : allItems;\n\n return (\n <div\n ref={menuRef}\n className=\"fixed inset-0 z-[260] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 56px)' }}\n >\n {/* Sheet handle + header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close menu\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <div className={`flex-1 flex items-center gap-2 ${GLASS_INPUT_BG} rounded-lg px-3 py-2`}>\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search apps...\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder-gray-400\"\n autoFocus\n />\n </div>\n </div>\n\n {/* Flat list */}\n <div className=\"flex-1 overflow-y-auto\">\n {filtered.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-12\">No matching apps</p>\n ) : (\n filtered.map(({ item, sectionLabel }, i) => {\n const icon = navIcons[item.to];\n return (\n <button\n key={`${item.to}-${i}`}\n onClick={() => handleClick(item.to)}\n className=\"w-full flex items-center gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <span className=\"h-8 w-8 rounded-lg bg-gray-100 flex items-center justify-center text-gray-600 shrink-0\">\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-5 w-5' })\n : null}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-gray-900 truncate\">{item.label}</div>\n {sectionLabel && <div className=\"text-[11px] text-gray-500 truncate\">{sectionLabel}</div>}\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n );\n }\n\n // Use the \"vertical\" (sidebar-style) layout for top, left, right taskbar positions.\n // Only the bottom taskbar uses the original layout (top items first, ERP after divider).\n const isVertical = taskbarPosition !== 'bottom';\n const topItems = navSections.filter(item => !isSection(item)) as NavItem[];\n const erpSections = navSections.filter(item => isSection(item) && erpLabels.has((item as NavSection).label));\n const systemSections = navSections.filter(item => isSection(item) && systemLabels.has((item as NavSection).label));\n const footerSections = navSections.filter(item => isSection(item) && footerLabels.has((item as NavSection).label));\n // The \"apps\" group = top-level items + system + virtual sections. Gates the\n // ERP↔apps divider so it only renders when both sides have content.\n const hasAppsGroup = topItems.length > 0 || systemSections.length > 0 || virtualSections.length > 0;\n\n const getVisibleItems = (section: NavSection) =>\n section.items.filter(item => !item.perms || hasAnyPerm(item.perms));\n\n // Search — walks 3rd-level children too. Section column shows the parent\n // item label for children so users can tell nested entries apart.\n const matchTree = (it: NavItem, sectionLabel: string): (NavItem & { section: string })[] => {\n if (it.perms && !hasAnyPerm(it.perms)) return [];\n const hits: (NavItem & { section: string })[] = [];\n if (it.label.toLowerCase().includes(search.toLowerCase())) {\n hits.push({ ...it, section: sectionLabel });\n }\n if (it.children) {\n for (const c of it.children) hits.push(...matchTree(c, it.label));\n }\n return hits;\n };\n const searchResults = search.length >= 2 ? [\n ...navSections.flatMap(item => {\n if (isSection(item)) {\n const sec = item as NavSection;\n return sec.items.flatMap(i => matchTree(i, sec.label));\n }\n return matchTree(item as NavItem, '');\n }),\n ...footerItems.flatMap(item => matchTree(item, '')),\n ] : [];\n\n const posStyle: React.CSSProperties =\n taskbarPosition === 'top' ? { top: taskbarH + 8, left: 8 } :\n taskbarPosition === 'left' ? { top: 8, left: taskbarW + 8 } :\n taskbarPosition === 'right' ? { top: 8, right: taskbarW + 8 } :\n { bottom: taskbarH + 8, left: 8 };\n\n const iconEl = (path: string) => {\n const icon = navIcons[path];\n if (icon && isValidElement(icon)) return cloneElement(icon as ReactElement, { className: 'h-4 w-4' });\n return null;\n };\n\n const secIcon = (label: string) => {\n const icon = sectionIcons[label];\n if (icon && isValidElement(icon)) return cloneElement(icon as ReactElement, { className: 'h-4 w-4' });\n return null;\n };\n\n // Flyout data — either a real section or a configured virtual section\n const hoveredVirtual = hoveredSection ? virtualByLabel[hoveredSection] : undefined;\n const hoveredData = hoveredVirtual\n ? null\n : (hoveredSection ? [...erpSections, ...systemSections, ...footerSections].find(s => (s as NavSection).label === hoveredSection) as NavSection | undefined : null);\n const flyoutItems = hoveredVirtual\n ? hoveredVirtual.items\n : (hoveredData ? getVisibleItems(hoveredData) : []);\n\n // Density from CSS variable\n const menuDensity = typeof document !== 'undefined' ? (getComputedStyle(document.documentElement).getPropertyValue('--menu-density')?.trim() || 'normal') : 'normal';\n const tight = menuDensity === 'tight';\n\n // Size-dependent styles (adjusted for density)\n const sizeConfig = tight\n ? { small: { w: 'w-52', fw: 'w-44', text: 'text-xs', py: 'py-1', px: 'px-3', mw: 208, itemH: 24 }, medium: { w: 'w-56', fw: 'w-48', text: 'text-xs', py: 'py-1', px: 'px-3', mw: 224, itemH: 26 }, large: { w: 'w-64', fw: 'w-52', text: 'text-sm', py: 'py-1.5', px: 'px-3', mw: 256, itemH: 30 } }[size]\n : { small: { w: 'w-56', fw: 'w-48', text: 'text-xs', py: 'py-1.5', px: 'px-3', mw: 224, itemH: 30 }, medium: { w: 'w-64', fw: 'w-56', text: 'text-sm', py: 'py-2', px: 'px-4', mw: 256, itemH: 36 }, large: { w: 'w-72', fw: 'w-60', text: 'text-sm', py: 'py-2.5', px: 'px-4', mw: 288, itemH: 40 } }[size];\n const menuGlass = glassStyle();\n const itemCls = `w-full flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;\n\n // Calculate flyout vertical position — center on hovered item, clamp so it\n // stays within the main menu's visible span (so it can't drift below the\n // menu bottom and overlap the taskbar). The first render uses a rough\n // estimate (`flyoutEstH`); a `useLayoutEffect` then captures the actual\n // rendered height in `measuredFlyout`, and the next paint repositions the\n // flyout using that measured value — so it never needs a scrollbar even\n // when labels wrap or dividers nudge the height past the estimate.\n const flyoutEstH = flyoutItems.length * sizeConfig.itemH + 12;\n const flyoutH = measuredFlyout?.key === hoveredSection ? measuredFlyout.h : flyoutEstH;\n const menuWidth = sizeConfig.mw;\n const menuRect = menuRef.current?.getBoundingClientRect();\n const minTop = menuRect ? menuRect.top : (taskbarPosition === 'top' ? taskbarH + 4 : 4);\n const maxBottom = menuRect ? menuRect.bottom : (taskbarPosition === 'bottom' ? window.innerHeight - taskbarH - 4 : window.innerHeight - 4);\n let flyoutTop = hoveredY - flyoutH / 2;\n if (flyoutTop < minTop) flyoutTop = minTop;\n if (flyoutTop + flyoutH > maxBottom) flyoutTop = Math.max(minTop, maxBottom - flyoutH);\n\n const handleSectionHover = (label: string, e: React.MouseEvent) => {\n clearTimeout(hoverTimeout.current);\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setHoveredY(rect.top + rect.height / 2);\n setHoveredSection(label);\n };\n\n const renderSection = (section: NavSection, isErp: boolean) => {\n if (section.perms && !hasAnyPerm(section.perms)) return null;\n const items = getVisibleItems(section);\n if (items.length === 0) return null;\n const isHovered = hoveredSection === section.label;\n return (\n <div key={section.label}\n onMouseEnter={e => handleSectionHover(section.label, e)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => setHoveredSection(null), 200); }}>\n <button className={`${itemCls} transition-colors ${isHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {secIcon(section.label)}\n <span className={isErp ? 'font-medium' : ''}>{section.label}</span>\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n );\n };\n\n const renderVirtualSection = (v: VirtualSection) => {\n if (v.items.length === 0) return null;\n const isHovered = hoveredSection === v.label;\n return (\n <div key={v.label}\n onMouseEnter={e => handleSectionHover(v.label, e)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => setHoveredSection(null), 200); }}>\n <button className={`${itemCls} transition-colors ${isHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {v.icon}\n <span>{v.label}</span>\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n );\n };\n\n return (\n <div ref={menuRef} className=\"fixed z-[260]\" style={posStyle}>\n <div className=\"flex\">\n {/* Main menu */}\n <div className={`${sizeConfig.w} rounded-2xl flex ${isVertical ? 'flex-col-reverse' : 'flex-col'} overflow-hidden`}\n style={{ animation: 'menu-in 0.15s ease-out', ...menuGlass }}>\n\n {/* Search — at top for horizontal, at bottom for vertical */}\n <div className={`px-3 ${isVertical ? 'pb-3 pt-2 border-t border-white/20' : 'pt-3 pb-2'}`}>\n <div className={`flex items-center gap-2 ${GLASS_INPUT_BG} rounded-lg px-2.5 py-1.5`}>\n <svg className=\"h-3.5 w-3.5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" /></svg>\n <input value={search} onChange={e => { setSearch(e.target.value); setHoveredSection(null); setSearchIdx(0); }}\n onKeyDown={e => {\n if (search.length >= 2 && searchResults.length > 0) {\n if (e.key === 'ArrowDown') { e.preventDefault(); setSearchIdx(i => Math.min(i + 1, searchResults.length - 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setSearchIdx(i => Math.max(i - 1, 0)); }\n else if (e.key === 'Enter') { e.preventDefault(); handleClick(searchResults[searchIdx].to); }\n }\n }}\n placeholder=\"Search...\"\n className=\"flex-1 bg-transparent text-xs outline-none placeholder-gray-400\" autoFocus />\n </div>\n </div>\n\n {search.length >= 2 ? (\n <div className=\"flex-1 overflow-y-auto px-1 pb-2 max-h-[400px]\">\n {searchResults.length === 0 ? (\n <p className=\"text-xs text-gray-400 text-center py-4\">No results</p>\n ) : searchResults.map((r, i) => (\n <button key={i} onClick={() => handleClick(r.to)}\n onMouseEnter={() => setSearchIdx(i)}\n className={`${itemCls} transition-colors ${i === searchIdx ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {iconEl(r.to)}\n <span>{r.label}</span>\n {r.section && <span className=\"text-[10px] text-gray-400 ml-auto\">{r.section}</span>}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex-1 overflow-y-auto px-1 pb-1 flex flex-col\">\n {isVertical && (<>\n {/* Reversed column → profile sits at the top, so footer items +\n sections render first to stay pinned next to it. */}\n {footerItems.map(item => (\n <button key={item.to} onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n ))}\n {footerSections.map(s => renderSection(s as NavSection, false))}\n {(footerSections.length > 0 || footerItems.length > 0) && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {/* Vertical layout: ERP sections first */}\n {erpSections.map(s => renderSection(s as NavSection, true))}\n {erpSections.length > 0 && hasAppsGroup && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {/* Then top-level items + system */}\n {topItems.map(item => (\n <div key={item.to}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}{systemSections.map(s => renderSection(s as NavSection, false))}\n {virtualSections.map(v => renderVirtualSection(v))}\n </>)}\n\n {!isVertical && (<>\n {/* Horizontal layout: top-level items first, ERP after divider */}\n {topItems.map(item => (\n <div key={item.to}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}{systemSections.map(s => renderSection(s as NavSection, false))}\n {virtualSections.map(v => renderVirtualSection(v))}\n {hasAppsGroup && erpSections.length > 0 && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {erpSections.map(s => renderSection(s as NavSection, true))}\n {/* Footer items + sections: pinned just above the profile, divided from ERP. */}\n {(footerSections.length > 0 || footerItems.length > 0) && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {footerSections.map(s => renderSection(s as NavSection, false))}\n {footerItems.map(item => (\n <button key={item.to} onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n ))}\n </>)}\n </div>\n )}\n\n {/* User profile — name + sign out on same row */}\n <div className={`${isVertical ? 'border-b' : 'border-t'} border-white/20 p-1`}>\n <div onClick={() => handleClick('/profile')}\n className=\"rounded-lg px-2 py-1.5 flex items-center gap-2.5 hover:bg-blue-50 hover:text-blue-700 transition-colors cursor-pointer\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-8 w-8 rounded-full object-cover border border-white/20 shrink-0\" />\n ) : (\n <div className=\"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-sm font-bold text-blue-700 shrink-0\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <p className=\"flex-1 min-w-0 text-sm font-medium text-gray-900 truncate\">\n {profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}\n </p>\n <button onClick={e => { e.stopPropagation(); onClose(); onLogout(); }} title=\"Sign Out\"\n className=\"shrink-0 p-1.5 rounded-md text-gray-500 hover:text-red-600 hover:bg-red-50 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" /></svg>\n </button>\n </div>\n </div>\n </div>\n\n {/* Flyout submenu — positioned vertically centered on hovered item.\n Height is left intrinsic; the useLayoutEffect above measures the\n rendered offsetHeight and `flyoutTop` clamps using that measured\n value, so the flyout shifts up to fit without ever scrolling. */}\n {hoveredSection && flyoutItems.length > 0 && search.length < 2 && (\n <div ref={flyoutRef} className={`fixed ${sizeConfig.fw} rounded-2xl overflow-hidden`}\n style={{ left: menuRef.current ? menuRef.current.getBoundingClientRect().right + 4 : menuWidth + 12, top: flyoutTop, animation: 'submenu-in 0.1s ease-out', ...menuGlass }}\n onMouseEnter={() => clearTimeout(hoverTimeout.current)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => { setHoveredSection(null); setHoveredChild(null); }, 200); }}>\n <div className=\"py-1 px-1\">\n {flyoutItems.map(item => {\n const hasChildren = !!item.children && item.children.length > 0;\n const isChildHovered = hoveredChild === item.to;\n return (\n <div key={item.to}\n onMouseEnter={hasChildren ? (e) => {\n clearTimeout(childHoverTimeout.current);\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setHoveredChildY(rect.top + rect.height / 2);\n setHoveredChild(item.to);\n } : () => {\n // Hovering a leaf inside the flyout cancels any pending\n // sub-flyout from a sibling that had children.\n childHoverTimeout.current = setTimeout(() => setHoveredChild(null), 200);\n }}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} transition-colors ${isChildHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n {hasChildren && (\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n )}\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* 3rd-level flyout — anchored to the right of the level-2 flyout. */}\n {(() => {\n if (search.length >= 2 || !hoveredChild) return null;\n const parent = flyoutItems.find(it => it.to === hoveredChild);\n const kids = (parent?.children ?? []).filter(c => !c.perms || hasAnyPerm(c.perms));\n if (!parent || kids.length === 0) return null;\n const flyoutRect = flyoutRef.current?.getBoundingClientRect();\n const subLeft = flyoutRect ? flyoutRect.right + 4 : 0;\n const subEstH = kids.length * sizeConfig.itemH + 12;\n const subH = measuredSub?.key === hoveredChild ? measuredSub.h : subEstH;\n let subTop = hoveredChildY - subH / 2;\n if (subTop < minTop) subTop = minTop;\n if (subTop + subH > maxBottom) subTop = Math.max(minTop, maxBottom - subH);\n return (\n <div ref={subFlyoutRef} className={`fixed ${sizeConfig.fw} rounded-2xl overflow-hidden`}\n style={{ left: subLeft, top: subTop, animation: 'submenu-in 0.1s ease-out', ...menuGlass }}\n onMouseEnter={() => { clearTimeout(hoverTimeout.current); clearTimeout(childHoverTimeout.current); }}\n onMouseLeave={() => { childHoverTimeout.current = setTimeout(() => setHoveredChild(null), 200); }}>\n <div className=\"py-1 px-1\">\n {kids.map(child => (\n <div key={child.to}>\n <button onClick={() => handleClick(child.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(child.to)}\n <span>{child.label}</span>\n </button>\n {child.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}\n </div>\n </div>\n );\n })()}\n </div>\n\n <style>{`\n @keyframes menu-in { from { opacity: 0; transform: scale(0.95) translateY(8px); } to { opacity: 1; transform: scale(1) translateY(0); } }\n @keyframes submenu-in { from { opacity: 0; transform: translateX(-4px); } to { opacity: 1; transform: translateX(0); } }\n `}</style>\n </div>\n );\n}\n","/**\n * Module-level mobile-shell state — mirrors the activationOrder pattern in\n * Modal.tsx so any component (including Modal, which portals outside the\n * React tree) can read/write the current mode without prop drilling.\n *\n * home — full-screen home grid is shown\n * switcher — Chrome-tab-style snapshot grid of open apps\n * app — current modal renders fullscreen; only the bottom nav overlays it\n */\n\nexport type MobileMode = 'home' | 'switcher' | 'app';\n\nlet _mode: MobileMode = 'home';\nconst listeners = new Set<() => void>();\n\nexport function getMobileMode(): MobileMode {\n return _mode;\n}\n\nexport function setMobileMode(mode: MobileMode): void {\n if (_mode === mode) return;\n _mode = mode;\n listeners.forEach(fn => fn());\n}\n\nexport function subscribeMobileMode(cb: () => void): () => void {\n listeners.add(cb);\n return () => { listeners.delete(cb); };\n}\n","/**\n * Mobile home screen — open widgets render at the top, app + folder icons sit\n * in a unified grid below. Long-press any icon to drag it. Order persists\n * in localStorage.\n *\n * Folders open as a centered popup with a blurred backdrop and a scale-in\n * animation. The folder tile itself shows a 2×2 preview of the apps inside,\n * iOS-style.\n */\nimport { useState, useMemo, useEffect, useRef, Suspense, type ReactNode, isValidElement, cloneElement, type ReactElement } from 'react';\nimport { isSection, type NavItem, type NavSection } from './nav-types';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport type { MinimizedItem } from './WindowManager';\nimport LoadingSpinner from './LoadingSpinner';\n\nconst MOBILE_WIDGET_ORDER_KEY = 'erp_mobile_widget_order';\nconst MOBILE_HOME_ORDER_KEY = 'erp_mobile_home_order';\nconst LONG_PRESS_MS = 400;\n\n// Per-app colored tile background. Tailwind's JIT scans the source so each\n// gradient class string must appear in full somewhere — keep them inline.\nconst ICON_GRADIENTS = [\n 'from-blue-500 to-blue-700',\n 'from-indigo-500 to-purple-600',\n 'from-purple-500 to-pink-600',\n 'from-pink-500 to-rose-600',\n 'from-red-500 to-rose-600',\n 'from-orange-500 to-red-600',\n 'from-amber-500 to-orange-600',\n 'from-yellow-500 to-amber-500',\n 'from-lime-500 to-green-600',\n 'from-green-500 to-emerald-600',\n 'from-emerald-500 to-teal-600',\n 'from-teal-500 to-cyan-600',\n 'from-cyan-500 to-sky-600',\n 'from-sky-500 to-blue-600',\n 'from-violet-500 to-fuchsia-600',\n];\n\nfunction hashGradient(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h << 5) - h + seed.charCodeAt(i);\n return ICON_GRADIENTS[Math.abs(h) % ICON_GRADIENTS.length];\n}\n\nfunction loadOrder(key: string): string[] {\n try {\n const raw = localStorage.getItem(key);\n if (raw) {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed.filter(s => typeof s === 'string');\n }\n } catch {}\n return [];\n}\n\nfunction saveOrder(key: string, order: string[]): void {\n try { localStorage.setItem(key, JSON.stringify(order)); } catch {}\n}\n\ninterface MobileHomeProps {\n navSections: (NavSection | NavItem)[];\n navIcons: Record<string, ReactNode>;\n sectionIcons: Record<string, ReactNode>;\n openWindows: MinimizedItem[];\n onOpenApp: (path: string) => void;\n onActivateWindow: (id: string) => void;\n}\n\ntype HomeIcon =\n | { kind: 'app'; id: string; label: string; route: string }\n | { kind: 'folder'; id: string; label: string; section: NavSection };\n\nconst FALLBACK_APP_ICON = (\n <svg className=\"h-10 w-10\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75A2.25 2.25 0 016 4.5h12a2.25 2.25 0 012.25 2.25v10.5A2.25 2.25 0 0118 19.5H6a2.25 2.25 0 01-2.25-2.25V6.75z\" />\n </svg>\n);\n\nfunction sizeIcon(node: ReactNode, fallback: ReactNode, sizeClass = 'h-10 w-10'): ReactNode {\n if (!node) return fallback;\n if (isValidElement(node)) {\n return cloneElement(node as ReactElement, {\n className: `${sizeClass} ${(node as ReactElement).props?.className ?? ''}`.trim(),\n } as any);\n }\n return node;\n}\n\n/** A colored gradient tile with the app's glyph in white — one per app on\n * the home grid. iOS-style. Icon fills its grid cell so the left/right\n * edges land precisely on the column lines (no centered margin). */\nfunction AppTile({ route, icon }: { route: string; icon: ReactNode }) {\n return (\n <span className={`relative aspect-square w-full rounded-2xl bg-gradient-to-br ${hashGradient(route)} flex items-center justify-center text-white shadow-sm border border-white/30`}>\n {sizeIcon(icon, FALLBACK_APP_ICON, 'h-11 w-11')}\n </span>\n );\n}\n\n/** Folder tile = 2×2 mini-grid of the apps inside, on a translucent backplate. */\nfunction FolderTile({ section, navIcons }: { section: NavSection; navIcons: Record<string, ReactNode> }) {\n const previewItems = section.items.slice(0, 4);\n return (\n <span className=\"relative aspect-square w-full rounded-2xl bg-white/30 backdrop-blur-sm border border-white/40 p-1.5 grid grid-cols-2 gap-1 shadow-sm\">\n {previewItems.map(item => (\n <span\n key={item.to}\n className={`rounded-md bg-gradient-to-br ${hashGradient(item.to)} flex items-center justify-center text-white`}\n >\n {sizeIcon(navIcons[item.to], FALLBACK_APP_ICON, 'h-3.5 w-3.5')}\n </span>\n ))}\n {Array.from({ length: Math.max(0, 4 - previewItems.length) }).map((_, i) => (\n <span key={`empty-${i}`} className=\"rounded-md bg-white/20\" />\n ))}\n </span>\n );\n}\n\nexport default function MobileHome({\n navSections,\n navIcons,\n sectionIcons,\n openWindows,\n onOpenApp,\n onActivateWindow,\n}: MobileHomeProps) {\n const [selectedFolder, setSelectedFolder] = useState<NavSection | null>(null);\n\n const homeIconsRaw = useMemo<HomeIcon[]>(() => {\n const list: HomeIcon[] = [];\n for (const entry of navSections) {\n if (isSection(entry)) {\n const sec = entry as NavSection;\n list.push({ kind: 'folder', id: `folder:${sec.label}`, label: sec.label, section: sec });\n } else {\n const it = entry as NavItem;\n list.push({ kind: 'app', id: `app:${it.to}`, label: it.label, route: it.to });\n }\n }\n return list;\n }, [navSections]);\n\n const [homeOrder, setHomeOrder] = useState<string[]>(() => loadOrder(MOBILE_HOME_ORDER_KEY));\n\n const homeIcons = useMemo(() => {\n const indexFor = (id: string) => {\n const i = homeOrder.indexOf(id);\n return i === -1 ? Number.MAX_SAFE_INTEGER : i;\n };\n return homeIconsRaw.slice().sort((a, b) => {\n const ia = indexFor(a.id);\n const ib = indexFor(b.id);\n if (ia !== ib) return ia - ib;\n return homeIconsRaw.indexOf(a) - homeIconsRaw.indexOf(b);\n });\n }, [homeIconsRaw, homeOrder]);\n\n useEffect(() => {\n const visibleIds = homeIconsRaw.map(i => i.id);\n const next = [\n ...homeOrder.filter(id => visibleIds.includes(id)),\n ...visibleIds.filter(id => !homeOrder.includes(id)),\n ];\n if (next.length !== homeOrder.length || next.some((id, i) => id !== homeOrder[i])) {\n setHomeOrder(next);\n saveOrder(MOBILE_HOME_ORDER_KEY, next);\n }\n }, [homeIconsRaw, homeOrder]);\n\n // Long-press drag.\n const [dragId, setDragId] = useState<string | null>(null);\n const [dragPos, setDragPos] = useState<{ x: number; y: number } | null>(null);\n const dragOffsetRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const longPressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressFiredRef = useRef(false);\n\n const cancelLongPress = () => {\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n };\n\n const beginLongPress = (id: string, e: React.PointerEvent<HTMLElement>) => {\n if (dragId) return;\n const x = e.clientX;\n const y = e.clientY;\n const target = e.currentTarget;\n longPressFiredRef.current = false;\n cancelLongPress();\n longPressTimerRef.current = setTimeout(() => {\n if (!target.isConnected) return;\n const rect = target.getBoundingClientRect();\n dragOffsetRef.current = { x: x - rect.left, y: y - rect.top };\n longPressFiredRef.current = true;\n setDragId(id);\n setDragPos({ x, y });\n try { (navigator as any).vibrate?.(15); } catch {}\n }, LONG_PRESS_MS);\n };\n\n useEffect(() => {\n if (!dragId) return;\n const onMove = (e: PointerEvent) => {\n setDragPos({ x: e.clientX, y: e.clientY });\n const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null;\n const targetEl = el?.closest('[data-home-icon-id]') as HTMLElement | null;\n if (!targetEl) return;\n const targetId = targetEl.dataset.homeIconId!;\n if (targetId === dragId) return;\n setHomeOrder(prev => {\n const fromIdx = prev.indexOf(dragId);\n const toIdx = prev.indexOf(targetId);\n if (fromIdx === -1 || toIdx === -1) return prev;\n const next = prev.slice();\n next.splice(fromIdx, 1);\n next.splice(toIdx, 0, dragId);\n return next;\n });\n };\n const onUp = () => {\n setDragId(null);\n setDragPos(null);\n setHomeOrder(prev => { saveOrder(MOBILE_HOME_ORDER_KEY, prev); return prev; });\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [dragId]);\n\n const handleIconClick = (icon: HomeIcon) => {\n if (longPressFiredRef.current) {\n longPressFiredRef.current = false;\n return;\n }\n if (icon.kind === 'app') onOpenApp(icon.route);\n else setSelectedFolder(icon.section);\n };\n\n // Widget tray — vertical order persisted but no per-card reorder buttons.\n const [widgetOrder, _setWidgetOrder] = useState<string[]>(() => loadOrder(MOBILE_WIDGET_ORDER_KEY));\n\n const widgetWindows = useMemo(() => {\n const widgets = openWindows.filter(w => {\n if (!w.route) return false;\n const entry = WINDOW_REGISTRY[w.route];\n return entry && isPageEntry(entry) && (entry as PageRegistryEntry).widget;\n });\n const indexFor = (route: string) => {\n const i = widgetOrder.indexOf(route);\n return i === -1 ? Number.MAX_SAFE_INTEGER : i;\n };\n return widgets.slice().sort((a, b) => indexFor(a.route!) - indexFor(b.route!));\n }, [openWindows, widgetOrder]);\n\n useEffect(() => {\n const visibleRoutes = widgetWindows.map(w => w.route!).filter(Boolean);\n const next = [\n ...widgetOrder.filter(r => visibleRoutes.includes(r)),\n ...visibleRoutes.filter(r => !widgetOrder.includes(r)),\n ];\n if (next.length !== widgetOrder.length || next.some((r, i) => r !== widgetOrder[i])) {\n _setWidgetOrder(next);\n saveOrder(MOBILE_WIDGET_ORDER_KEY, next);\n }\n }, [widgetWindows, widgetOrder]);\n\n const openCountByRoute = useMemo(() => {\n const map = new Map<string, number>();\n for (const w of openWindows) {\n if (!w.route) continue;\n map.set(w.route, (map.get(w.route) ?? 0) + 1);\n }\n return map;\n }, [openWindows]);\n\n const openInFolder = (folder: NavSection): MinimizedItem[] => {\n const routes = new Set(folder.items.map(i => i.to));\n return openWindows.filter(w => w.route && routes.has(w.route));\n };\n\n const draggedIcon = dragId ? homeIcons.find(i => i.id === dragId) : null;\n\n return (\n <>\n <div\n className=\"h-full overflow-y-auto px-4 pt-4 pb-4 select-none\"\n style={{\n // Disable iOS long-press text-selection / \"Copy\" callout on icon labels.\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n }}\n >\n {/* Edge padding (px-4 = 16 px) matches the grid gap (gap-4 = 16 px),\n * so the space between the screen edge and the first icon equals the\n * space between two icons. Icons fill their grid cells (no max-width\n * cap), so widget col-span-2 edges align exactly with icon edges. */}\n <div>\n\n {/* Widgets — share the icon grid layout (grid-cols-4 gap-4) so the\n * widget width = 2 cells + 1 gap, exactly aligned with the icons\n * below. aspect-square keeps each card the same height as width. */}\n {widgetWindows.length > 0 && (\n <section className=\"mb-4\">\n <div className=\"grid grid-cols-4 gap-4\">\n {widgetWindows.map(w => {\n const entry = WINDOW_REGISTRY[w.route!] as PageRegistryEntry | undefined;\n if (!entry) return null;\n const Component = entry.component;\n return (\n <div\n key={w.id}\n className=\"col-span-2 relative rounded-2xl bg-white/85 backdrop-blur border border-white/40 shadow-md overflow-hidden aspect-square\"\n >\n <Suspense fallback={<div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}>\n <Component />\n </Suspense>\n </div>\n );\n })}\n </div>\n </section>\n )}\n\n {/* Unified home grid — apps + folders. Icon tiles are colored\n * gradients (one per app); folder tiles preview their contents in a\n * 2×2 mini-grid. Long-press any tile to start dragging. */}\n {homeIcons.length > 0 && (\n <section>\n <div className=\"grid grid-cols-4 gap-4\">\n {homeIcons.map(icon => {\n const isFolder = icon.kind === 'folder';\n const isBeingDragged = dragId === icon.id;\n\n return (\n <button\n key={icon.id}\n data-home-icon-id={icon.id}\n onPointerDown={(e) => beginLongPress(icon.id, e)}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n onPointerLeave={cancelLongPress}\n onClick={() => handleIconClick(icon)}\n style={{ touchAction: 'none', visibility: isBeingDragged ? 'hidden' : 'visible' }}\n className={`flex flex-col items-center gap-1 py-1 rounded-lg active:bg-white/20 ${dragId && !isBeingDragged ? 'transition-transform' : ''}`}\n >\n {isFolder\n ? <FolderTile section={(icon as Extract<HomeIcon, { kind: 'folder' }>).section} navIcons={navIcons} />\n : <AppTile route={(icon as Extract<HomeIcon, { kind: 'app' }>).route} icon={navIcons[(icon as Extract<HomeIcon, { kind: 'app' }>).route]} />}\n <span className=\"text-[11px] font-medium text-white drop-shadow-sm truncate w-full text-center\">\n {icon.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n </div>\n </div>\n\n {/* Floating \"ghost\" of the icon being dragged — follows the finger. */}\n {draggedIcon && dragPos && (\n <div\n className=\"fixed pointer-events-none z-[400] transition-none\"\n style={{\n left: dragPos.x - dragOffsetRef.current.x,\n top: dragPos.y - dragOffsetRef.current.y,\n transform: 'scale(1.12)',\n }}\n >\n <div className=\"flex flex-col items-center gap-1 py-1 w-20\">\n {draggedIcon.kind === 'folder'\n ? <FolderTile section={draggedIcon.section} navIcons={navIcons} />\n : <AppTile route={draggedIcon.route} icon={navIcons[draggedIcon.route]} />}\n <span className=\"text-[11px] font-medium text-white drop-shadow-md truncate w-full text-center\">\n {draggedIcon.label}\n </span>\n </div>\n </div>\n )}\n\n {/* Folder popup */}\n {selectedFolder && (\n <FolderPopup\n folder={selectedFolder}\n navIcons={navIcons}\n onClose={() => setSelectedFolder(null)}\n onOpenApp={(path) => { setSelectedFolder(null); onOpenApp(path); }}\n />\n )}\n </>\n );\n}\n\nfunction FolderPopup({\n folder,\n navIcons,\n onClose,\n onOpenApp,\n}: {\n folder: NavSection;\n navIcons: Record<string, ReactNode>;\n onClose: () => void;\n onOpenApp: (path: string) => void;\n}) {\n // Two-phase close: kick off the fade-out / scale-down animation, then unmount\n // after the duration so the user actually sees the reverse transition.\n // Used both for tap-outside dismiss and tap-an-app-inside-the-folder.\n const [closing, setClosing] = useState(false);\n const beginClose = () => {\n if (closing) return;\n setClosing(true);\n setTimeout(onClose, 200);\n };\n const closeThen = (after: () => void) => {\n if (closing) return;\n setClosing(true);\n setTimeout(after, 200);\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col items-center justify-center px-6 bg-black/45 backdrop-blur-xl select-none\"\n style={{\n paddingBottom: 'calc(var(--mobile-bottom-nav, 70px) + 16px)',\n animation: closing\n ? 'folder-fade-out 200ms ease-in forwards'\n : 'folder-fade-in 220ms ease-out',\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n }}\n onClick={beginClose}\n >\n <style>{`\n @keyframes folder-fade-in { from { opacity: 0; } to { opacity: 1; } }\n @keyframes folder-fade-out { from { opacity: 1; } to { opacity: 0; } }\n @keyframes folder-pop-in { from { opacity: 0; transform: scale(0.86) translateY(8px); } to { opacity: 1; transform: scale(1) translateY(0); } }\n @keyframes folder-pop-out { from { opacity: 1; transform: scale(1) translateY(0); } to { opacity: 0; transform: scale(0.9) translateY(4px); } }\n `}</style>\n\n {/* Title + card share the same max-width wrapper so the title's ml-4\n * (= card's px-4 inner padding) lands precisely on the first icon's\n * left edge regardless of viewport. */}\n <div className=\"w-full max-w-[304px]\">\n <h2 className=\"text-2xl font-semibold text-white drop-shadow-md mb-4 ml-4\">{folder.label}</h2>\n\n {/* Card width capped so 3 cells × ~80 px + 2 × 16 px gap + 2 × 16 px\n * inner padding lands at ~304 px — folder icon size matches the home\n * icon size on most phones. */}\n <div\n className=\"max-h-[70vh] flex flex-col rounded-3xl bg-white/15 backdrop-blur-xl border border-white/25 shadow-2xl overflow-hidden\"\n style={{\n animation: closing\n ? 'folder-pop-out 180ms ease-in forwards'\n : 'folder-pop-in 240ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex-1 overflow-y-auto px-4 py-5\">\n {/* Folder shows just the apps inside — open-window summary lives on\n * the home screen and the switcher, not here. */}\n <div className=\"grid grid-cols-3 gap-4\">\n {folder.items.map(item => {\n return (\n <button\n key={item.to}\n onClick={() => closeThen(() => onOpenApp(item.to))}\n className=\"flex flex-col items-center gap-1 py-1 rounded-lg active:bg-white/15\"\n >\n <AppTile route={item.to} icon={navIcons[item.to]} />\n <span className=\"text-[11px] font-medium text-white drop-shadow-sm truncate w-full text-center\">{item.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Mobile app switcher — Chrome-tab-style snapshot grid of open apps.\n * Tapping a card brings that window forward + switches to 'app' mode.\n * The X on each card closes the corresponding window.\n *\n * Reuses <ThumbCard> from WindowManager which already handles the snapshot\n * cloning and aspect-ratio sizing.\n */\nimport { useEffect, useState } from 'react';\nimport { ThumbCard, type MinimizedItem } from './WindowManager';\n\ninterface MobileSwitcherProps {\n windows: MinimizedItem[];\n onActivate: (id: string) => void;\n onClose: (id: string) => void;\n onCloseAll: () => void;\n}\n\nexport default function MobileSwitcher({ windows, onActivate, onClose, onCloseAll }: MobileSwitcherProps) {\n // Cards size based on viewport — half the screen width, two columns with gap.\n const [cardSize, setCardSize] = useState(() => computeCardSize());\n\n useEffect(() => {\n const onResize = () => setCardSize(computeCardSize());\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n if (windows.length === 0) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center gap-3 text-white/80 px-6 text-center\">\n <svg className=\"h-12 w-12 text-white/40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.4}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n </svg>\n <p className=\"text-sm\">No open apps.</p>\n <p className=\"text-xs text-white/50\">Tap Home to launch one.</p>\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex-1 overflow-y-auto px-3 pt-4 pb-4\">\n <h1 className=\"text-white text-base font-semibold mb-3 px-1\">Open apps · {windows.length}</h1>\n <div className=\"grid grid-cols-2 gap-3\">\n {windows.map(w => (\n <div key={w.id} className=\"group flex flex-col items-stretch gap-1\">\n <ThumbCard\n id={w.id}\n label={w.label}\n maxW={cardSize.w}\n maxH={cardSize.h}\n titleAbove\n onClick={() => onActivate(w.id)}\n onClose={() => onClose(w.id)}\n />\n <span className=\"text-[11px] text-white/80 truncate px-1\">{w.label}</span>\n </div>\n ))}\n </div>\n </div>\n {/* Close-all bar — sits just above the bottom nav. The switcher's outer\n * paddingBottom already reserves space for the nav; this bar slots\n * above that reservation. */}\n <div className=\"shrink-0 px-3 py-3 flex justify-center\">\n <button\n onClick={onCloseAll}\n className=\"px-5 py-2.5 rounded-full bg-white/15 backdrop-blur-md border border-white/25 text-white text-sm font-medium active:bg-white/25 shadow-lg\"\n >\n Close All\n </button>\n </div>\n </div>\n );\n}\n\nfunction computeCardSize() {\n const w = typeof window !== 'undefined' ? window.innerWidth : 360;\n const h = typeof window !== 'undefined' ? window.innerHeight : 640;\n // 2 columns with 12px gap on each side and 12px between\n const cardW = Math.max(120, Math.floor((w - 36) / 2));\n // Cap card height to ~40% of viewport so multiple rows are visible\n const cardH = Math.min(cardW * 1.4, Math.floor(h * 0.4));\n return { w: cardW, h: cardH };\n}\n","/**\n * Mobile notification sheet — full-screen list popped up from the bottom-nav\n * Notifications button. Reuses the same `NotificationsConfig` Layout receives\n * (so the consumer wires up `useUnreadCount` / `list` / `markRead` / etc.\n * once and both the desktop bell popup and this sheet draw from it).\n */\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useCallback } from 'react';\nimport { formatDate } from '../utils/date';\nimport type { NotificationsConfig, ShellNotification } from './NotificationBell';\n\ninterface MobileNotificationSheetProps {\n config: NotificationsConfig;\n onClose: () => void;\n}\n\nfunction timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return formatDate(dateStr);\n}\n\nexport default function MobileNotificationSheet({ config, onClose }: MobileNotificationSheetProps) {\n const { list, markRead, markAllRead, onItemClick } = config;\n const queryClient = useQueryClient();\n const unreadCount = config.useUnreadCount();\n\n const { data: notifData } = useQuery({\n queryKey: ['notifications-dropdown'],\n queryFn: () => list({ page_size: 30 }),\n staleTime: 30_000,\n });\n const notifications: ShellNotification[] = notifData?.results ?? [];\n\n const handleClick = useCallback((notif: ShellNotification) => {\n if (!notif.is_read) {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: Math.max(0, (old.count || 0) - 1) } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => n.id === notif.id ? { ...n, is_read: true } : n) };\n });\n markRead(notif.id).catch(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n }\n onClose();\n onItemClick(notif);\n }, [queryClient, markRead, onItemClick, onClose]);\n\n const handleMarkAllRead = () => {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: 0 } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => ({ ...n, is_read: true })) };\n });\n markAllRead().then(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}\n >\n <header className=\"flex items-center justify-between px-3 py-3 border-b border-gray-200 shrink-0\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <h1 className=\"text-base font-semibold text-gray-900\">Notifications</h1>\n {unreadCount > 0 ? (\n <button onClick={handleMarkAllRead} className=\"text-xs text-blue-600 font-medium px-2 py-1 active:bg-blue-50 rounded\">\n Mark all read\n </button>\n ) : <span className=\"w-[88px]\" />}\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 px-6 text-center\">\n <svg className=\"h-10 w-10 text-gray-300 mb-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n <p className=\"text-sm text-gray-700 font-medium\">All caught up</p>\n <p className=\"text-xs text-gray-400 mt-1\">No notifications yet</p>\n </div>\n ) : (\n notifications.map(notif => (\n <button\n key={notif.id}\n onClick={() => handleClick(notif)}\n className=\"w-full flex items-start gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <div className=\"pt-1 shrink-0\">\n {!notif.is_read\n ? <div className=\"h-2.5 w-2.5 rounded-full bg-blue-500\" />\n : <div className=\"h-2.5 w-2.5\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className={`text-sm leading-snug ${!notif.is_read ? 'font-medium text-gray-900' : 'text-gray-700'}`}>{notif.title}</p>\n {notif.message && <p className=\"text-xs text-gray-500 mt-1 line-clamp-2\">{notif.message}</p>}\n <div className=\"flex items-center gap-2 mt-1.5\">\n <span className=\"text-[11px] text-gray-400\">{timeAgo(notif.created_at)}</span>\n {notif.actor_name && <span className=\"text-[11px] text-gray-400\">by {notif.actor_name}</span>}\n </div>\n </div>\n </button>\n ))\n )}\n </div>\n </div>\n );\n}\n","/**\n * Mobile profile sheet — full-screen panel with the user's avatar / name /\n * email at top, then quick-access actions (Customization route if registered,\n * Logout). Mirrors the desktop ProfileMenu popup but laid out as a vertical\n * sheet for touch.\n */\n\ninterface MobileProfileSheetProps {\n profile: any;\n user: any;\n onClose: () => void;\n /** Open a route in the shell. */\n onNavigate: (path: string) => void;\n /** Sign the user out (Layout already triggers the logout animation). */\n onLogout: () => void;\n}\n\nexport default function MobileProfileSheet({ profile, user, onClose, onNavigate, onLogout }: MobileProfileSheetProps) {\n const initial = (profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase();\n const displayName = profile?.first_name\n ? `${profile.first_name} ${profile.last_name || ''}`.trim()\n : user?.email ?? 'Account';\n const groups: string[] = profile?.group_names ?? [];\n\n const handleNav = (path: string) => { onNavigate(path); onClose(); };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}\n >\n <header className=\"flex items-center justify-between px-3 py-3 border-b border-gray-200 shrink-0\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <h1 className=\"text-base font-semibold text-gray-900\">Profile</h1>\n <span className=\"w-10\" />\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {/* User header */}\n <div className=\"flex flex-col items-center text-center px-6 py-8 border-b border-gray-100\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-20 w-20 rounded-full object-cover border border-gray-200 shadow-sm\" />\n ) : (\n <div className=\"h-20 w-20 rounded-full bg-blue-100 flex items-center justify-center text-2xl font-bold text-blue-700 shadow-sm\">\n {initial}\n </div>\n )}\n <div className=\"mt-3 text-base font-semibold text-gray-900 truncate max-w-full\">{displayName}</div>\n {user?.email && profile?.first_name && (\n <div className=\"text-sm text-gray-500 truncate max-w-full\">{user.email}</div>\n )}\n {groups.length > 0 && (\n <div className=\"mt-2 flex flex-wrap justify-center gap-1.5\">\n {groups.map(g => (\n <span key={g} className=\"text-[11px] px-2 py-0.5 rounded-full bg-gray-100 text-gray-700\">{g}</span>\n ))}\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"py-2\">\n <button\n onClick={() => handleNav('/customization')}\n className=\"w-full flex items-center gap-3 px-4 py-4 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <span className=\"h-9 w-9 rounded-lg bg-gray-100 flex items-center justify-center text-gray-700 shrink-0\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </span>\n <span className=\"flex-1 text-sm font-medium text-gray-800\">Customization</span>\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n\n <button\n onClick={() => { onLogout(); onClose(); }}\n className=\"w-full flex items-center gap-3 px-4 py-4 active:bg-red-50 text-left\"\n >\n <span className=\"h-9 w-9 rounded-lg bg-red-50 flex items-center justify-center text-red-600 shrink-0\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75\" />\n </svg>\n </span>\n <span className=\"flex-1 text-sm font-medium text-red-600\">Sign out</span>\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Mobile shell — phone/tablet-portrait replacement for the desktop <Layout>\n * chrome (taskbar / start-menu sidebar / windowed apps).\n *\n * Modes (mobileShellStore):\n * home — full-screen icon grid (folders + apps)\n * switcher — Chrome-tab-style snapshot grid of open apps\n * app — current Modal renders fullscreen; we just paint the bottom nav\n *\n * The bottom nav surfaces four entry points: Home, Apps switcher,\n * Notifications (sheet), Profile (sheet). Notifications and Profile sheets\n * live as MobileShell-owned state so they don't pollute the global mode\n * machine.\n */\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { useWindowManager } from './WindowManager';\nimport { activateModal } from './Modal';\nimport { getMobileMode, setMobileMode, subscribeMobileMode } from './mobileShellStore';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport MobileHome from './MobileHome';\nimport MobileSwitcher from './MobileSwitcher';\nimport MobileNotificationSheet from './MobileNotificationSheet';\nimport MobileProfileSheet from './MobileProfileSheet';\nimport type { NavItem, NavSection } from './nav-types';\nimport type { NotificationsConfig } from './NotificationBell';\n\ninterface MobileShellProps {\n productName?: string;\n productIcon?: string;\n navSections: (NavSection | NavItem)[];\n navIcons: Record<string, ReactNode>;\n sectionIcons: Record<string, ReactNode>;\n /** Wallpaper / background style computed by Layout — applied to the home\n * overlay so the user's chosen wallpaper carries onto mobile. */\n wallpaperStyle?: React.CSSProperties;\n /** Notification system config — when omitted, the bell button is hidden. */\n notifications?: NotificationsConfig;\n /** User profile (`first_name`, `last_name`, `avatar_url`, `group_names`). */\n profile?: any;\n /** Auth user (`email`). */\n user?: any;\n /** Open a route in the shell — used by the profile sheet. */\n onNavigate?: (path: string) => void;\n /** Logout handler — wired to Layout's logout-animation trigger. */\n onLogout?: () => void;\n}\n\nexport default function MobileShell({\n navSections,\n navIcons,\n sectionIcons,\n wallpaperStyle,\n notifications,\n profile,\n user,\n onNavigate,\n onLogout,\n}: MobileShellProps) {\n const { openWindows, openPage, closeEntity } = useWindowManager();\n const mode = useSyncExternalStore(subscribeMobileMode, getMobileMode);\n const [sheet, setSheet] = useState<'notifications' | 'profile' | null>(null);\n const unreadCount = notifications?.useUnreadCount() ?? 0;\n\n // The Apps switcher and the open-app count badge ignore widget windows —\n // widgets render directly on the home screen, so they shouldn't pollute the\n // \"running apps\" view.\n const switcherWindows = useMemo(() => {\n return openWindows.filter(w => {\n if (!w.route) return true;\n const entry = WINDOW_REGISTRY[w.route];\n if (!entry || !isPageEntry(entry)) return true;\n return !(entry as PageRegistryEntry).widget;\n });\n }, [openWindows]);\n\n // When the last open window closes, fall back to home. While other windows\n // are still open we stay in 'app' mode so the next window in the stack\n // (typically the parent list a child entity was opened from) shows through.\n const prevOpenCountRef = useRef(openWindows.length);\n useEffect(() => {\n if (openWindows.length === 0 && mode === 'app') {\n setMobileMode('home');\n }\n prevOpenCountRef.current = openWindows.length;\n }, [openWindows.length, mode]);\n\n const activateWindowById = (windowId: string) => {\n const panel = document.querySelector(`[data-modal-panel][data-window-key=\"${windowId}\"]`);\n const mid = panel?.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n };\n\n const handleOpenApp = (path: string) => {\n openPage(path);\n setMobileMode('app');\n };\n\n const handleActivateWindow = (id: string) => {\n activateWindowById(id);\n setMobileMode('app');\n };\n\n const closeSheet = () => setSheet(null);\n\n return (\n <>\n {/* Wallpaper backdrop — always rendered in mobile mode so swipe-right\n * reveals the home wallpaper underneath the swiping window, instead of\n * another open app. Sits below window z-indices (windows start at 50+).\n * In 'home' mode the home overlay above renders on top of this. */}\n <div\n className=\"fixed inset-0 z-0 pointer-events-none\"\n style={wallpaperStyle}\n />\n\n {/* Home overlay — wallpaper underneath, content scrolls over it */}\n {mode === 'home' && (\n <div\n className=\"fixed inset-0 z-[200]\"\n style={{\n ...wallpaperStyle,\n paddingBottom: 'var(--mobile-bottom-nav, 70px)',\n }}\n >\n <MobileHome\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n openWindows={openWindows}\n onOpenApp={handleOpenApp}\n onActivateWindow={handleActivateWindow}\n />\n </div>\n )}\n\n {/* Switcher overlay — widgets are excluded so it shows only real apps. */}\n {mode === 'switcher' && (\n <div className=\"fixed inset-0 z-[200] bg-gray-900/95 backdrop-blur-sm\" style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}>\n <MobileSwitcher\n windows={switcherWindows}\n onActivate={handleActivateWindow}\n onClose={(id) => closeEntity(id)}\n onCloseAll={() => switcherWindows.forEach(w => closeEntity(w.id))}\n />\n </div>\n )}\n\n {/* Notification sheet */}\n {sheet === 'notifications' && notifications && (\n <MobileNotificationSheet config={notifications} onClose={closeSheet} />\n )}\n\n {/* Profile sheet */}\n {sheet === 'profile' && (\n <MobileProfileSheet\n profile={profile}\n user={user}\n onClose={closeSheet}\n onNavigate={(path) => { onNavigate?.(path); }}\n onLogout={() => onLogout?.()}\n />\n )}\n\n {/* Bottom nav — always visible, sits above modals AND overlays */}\n <MobileBottomNav\n mode={mode}\n unreadCount={unreadCount}\n showNotifications={!!notifications}\n profileAvatar={profile?.avatar_url}\n profileInitial={(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n onHome={() => { closeSheet(); setMobileMode('home'); }}\n onSwitcher={() => { closeSheet(); setMobileMode('switcher'); }}\n onNotifications={() => setSheet(sheet === 'notifications' ? null : 'notifications')}\n onProfile={() => setSheet(sheet === 'profile' ? null : 'profile')}\n />\n </>\n );\n}\n\ninterface MobileBottomNavProps {\n mode: 'home' | 'switcher' | 'app';\n unreadCount: number;\n showNotifications: boolean;\n profileAvatar?: string;\n profileInitial: string;\n onHome: () => void;\n onSwitcher: () => void;\n onNotifications: () => void;\n onProfile: () => void;\n}\n\nfunction MobileBottomNav({\n mode, unreadCount, showNotifications,\n profileAvatar, profileInitial,\n onHome, onSwitcher, onNotifications, onProfile,\n}: MobileBottomNavProps) {\n const btnClass = (active: boolean) =>\n `flex-1 flex flex-col items-center justify-center gap-0.5 py-2 transition-colors select-none ${\n active ? 'text-blue-600' : 'text-gray-700 active:text-gray-900'\n }`;\n\n return (\n <nav\n className=\"fixed bottom-0 inset-x-0 z-[300] flex items-stretch border-t border-white/40\"\n style={{\n height: 'var(--mobile-bottom-nav, 70px)',\n paddingBottom: 'env(safe-area-inset-bottom)',\n WebkitBackdropFilter: 'blur(28px) saturate(1.8)',\n backdropFilter: 'blur(28px) saturate(1.8)',\n background: 'linear-gradient(135deg, rgba(255,255,255,0.65) 0%, rgba(255,255,255,0.45) 50%, rgba(255,255,255,0.55) 100%)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.6), 0 -2px 12px rgba(0,0,0,0.08)',\n }}\n >\n <button onClick={onHome} className={btnClass(mode === 'home')} aria-label=\"Home\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\" />\n </svg>\n <span className=\"text-[11px] font-medium\">Home</span>\n </button>\n\n <button onClick={onSwitcher} className={btnClass(mode === 'switcher')} aria-label=\"App switcher\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n </svg>\n <span className=\"text-[11px] font-medium\">Apps</span>\n </button>\n\n {showNotifications && (\n <button onClick={onNotifications} className={btnClass(false)} aria-label=\"Notifications\">\n <span className=\"relative\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"absolute -top-1.5 -right-2 min-w-[18px] h-[18px] px-1 rounded-full bg-red-500 text-white text-[10px] font-bold leading-[18px] text-center\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </span>\n <span className=\"text-[11px] font-medium\">Alerts</span>\n </button>\n )}\n\n <button onClick={onProfile} className={btnClass(false)} aria-label=\"Profile\">\n {profileAvatar ? (\n <img src={profileAvatar} alt=\"\" className=\"h-8 w-8 rounded-full object-cover border border-gray-200\" />\n ) : (\n <div className=\"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-xs font-bold text-blue-700\">\n {profileInitial}\n </div>\n )}\n <span className=\"text-[11px] font-medium\">Profile</span>\n </button>\n </nav>\n );\n}\n","import { useState, useEffect, useCallback, useRef, useSyncExternalStore, isValidElement, cloneElement, lazy, Suspense, type ReactElement } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from '../contexts/AuthContext';\nimport apiClient from '../api/client';\nimport GlobalSearch, { type SearchConfig } from './GlobalSearch';\nimport ShortcutHelp from './ShortcutHelp';\nimport NotificationBell, { type NotificationsConfig } from './NotificationBell';\nimport { getPomoSnapshot, subscribePomo } from './pomodoroStore';\nimport { useShellPrefs } from './ShellPrefs';\nimport { useWindowManager } from './WindowManager';\nimport { useTheme } from '../hooks/useTheme';\nimport Desktop from './Desktop';\nimport useClickOutside from '../hooks/useClickOutside';\nimport { playStartup } from '../utils/sounds';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\nimport { reportBug } from '../utils/reportBug';\nimport { useBugReport } from './BugReportDialog';\nimport StartupAnimation from './StartupAnimation';\nimport LogoutAnimation from './LogoutAnimation';\nimport StartMenu from './StartMenu';\n// Sidebar is opt-in (`prefs.layout_mode === 'sidebar'`) and adds nothing\n// to the classic-mode bundle. lazy() also means consumers running a\n// stale source checkout where Sidebar.tsx hasn't been pulled yet won't\n// crash on module load — only when they actually flip into sidebar mode.\nconst Sidebar = lazy(() => import('./Sidebar'));\nimport MobileShell from './MobileShell';\nimport { useIsMobile } from './useIsMobile';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider } from './PopupMenu';\nimport {\n navIcons as defaultNavIcons,\n sectionIcons as defaultSectionIcons,\n navSections as defaultNavSections,\n startMenuCategories as defaultCategories,\n isSection,\n type NavItem,\n type NavSection,\n type StartMenuCategories,\n} from '../shell-config/nav';\nimport type { ReactNode } from 'react';\n\n// Transitional re-exports — go away after each consumer migrates to importing\n// nav data from their own shell-config rather than from <Layout>.\nexport {\n defaultNavIcons as navIcons,\n defaultSectionIcons as sectionIcons,\n defaultNavSections as navSections,\n isSection,\n};\nexport type { NavItem, NavSection };\n\nexport interface LayoutProps {\n /** Brand label rendered on the start-menu button. */\n productName?: string;\n /** Icon URL rendered next to the brand label. Defaults to `/favicon.svg`. */\n productIcon?: string;\n /** Wallpaper image URLs for the desktop background. When omitted, the\n * desktop renders with no image (just the dark fallback). */\n wallpapers?: string[];\n /** Override the default nav sections shown in the start menu. */\n navSections?: (NavSection | NavItem)[];\n /** Override the per-route icon map used by start menu and favorites. */\n navIcons?: Record<string, ReactNode>;\n /** Override the per-section header icon map used by start menu. */\n sectionIcons?: Record<string, ReactNode>;\n /** Override the start menu's section grouping + virtual flyouts. */\n categories?: StartMenuCategories;\n /** Notification system config — when omitted, the bell isn't rendered. */\n notifications?: NotificationsConfig;\n /** Universal search config — when omitted, Cmd-K opens the picker but no\n * results ever come back. */\n search?: SearchConfig;\n /** Custom node rendered in the system tray to the LEFT of the\n * notification bell (or above it on a vertical taskbar). Lets a host\n * app drop in icons like a server-status indicator without forking\n * the shell. The shell renders the node as-is — keep it small (a\n * single icon-sized button) so it fits the existing tray rhythm. */\n taskbarTrayLeft?: ReactNode;\n}\n\n\nfunction ProfileMenu({ profile, user, onLogout, onNavigate }: { profile: any; user: any; onLogout: () => void; onNavigate: (path: string) => void }) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number } | null>(null);\n\n useClickOutside(ref, useCallback(() => { if (open) setOpen(false); }, [open]));\n\n useEffect(() => {\n if (open && buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n // Center popup over button, clamp to viewport\n const popupW = 256; // w-64\n let left = rect.left + rect.width / 2 - popupW / 2;\n left = Math.max(8, Math.min(left, window.innerWidth - popupW - 8));\n if (taskbarPos === 'top') {\n setPos({ left, top: rect.bottom + 4 });\n } else {\n setPos({ left, bottom: window.innerHeight - rect.top + 4 });\n }\n }\n }, [open]);\n\n const groupNames: any[] = profile?.group_names ?? [];\n\n return (\n <div ref={ref} className=\"relative\">\n <button ref={buttonRef} onClick={() => setOpen(!open)} className=\"flex items-center gap-2 rounded-md px-2 py-1 hover:bg-gray-200 transition-colors text-left shrink-0\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-7 w-7 rounded-full object-cover border border-gray-300\" />\n ) : (\n <div className=\"h-7 w-7 rounded-full bg-gray-300 flex items-center justify-center text-[10px] font-bold text-gray-600\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <span className=\"text-xs font-medium text-gray-700 hidden sm:inline\">{profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}</span>\n </button>\n\n {open && pos && (\n <PopupMenu minWidth={256} style={{ left: pos.left, ...(pos.top != null ? { top: pos.top } : { bottom: pos.bottom }) }}>\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200/60\">\n <div className=\"flex items-center gap-3\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-10 w-10 rounded-full object-cover border border-gray-300\" />\n ) : (\n <div className=\"h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-lg font-bold text-blue-700\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-gray-900 truncate\">{profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}</p>\n <p className=\"text-xs text-gray-500 truncate\">{user?.email}</p>\n </div>\n </div>\n {groupNames.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {groupNames.map((g: any) => (\n <span key={typeof g === 'string' ? g : g.name} className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-blue-100 text-blue-700\">\n {typeof g === 'string' ? g : g.name}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Menu items */}\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/profile'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\" /></svg>\n My Profile\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/notifications'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" /></svg>\n Notifications\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/settings/favorites'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" /></svg>\n Favorites\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/settings/customization'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42\" /></svg>\n Customization\n </PopupMenuItem>\n\n {/* Logout */}\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={async () => {\n setOpen(false);\n const { confirm } = await import('./ConfirmDialog');\n const ok = await confirm({\n title: 'Sign Out',\n message: 'Do you want to log out? All windows will reopen when you log back in.',\n confirmLabel: 'Sign Out',\n cancelLabel: 'Cancel',\n variant: 'warning',\n });\n if (ok) onLogout();\n }}>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" /></svg>\n Sign Out\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n </div>\n );\n}\n\nconst NAV_CATEGORIES = [\n { label: 'Clients', items: [\n { path: '/orders', label: 'Sales Orders' }, { path: '/invoices', label: 'Sales Invoices' },\n { path: '/warranty-claims', label: 'Warranty Claims' }, { path: '/clients', label: 'Clients' },\n { path: '/price-sheets', label: 'Price Sheets' },\n ]},\n { label: 'Vendors', items: [\n { path: '/vendor-orders', label: 'Purchase Orders' }, { path: '/qc-reports', label: 'QC Reports' },\n { path: '/production-progress', label: 'Production Progress' }, { path: '/vendor-shipments', label: 'Goods Receipt' },\n { path: '/vendor-invoices', label: 'Vendor Invoices' }, { path: '/vendor-payments', label: 'Vendor Payments' },\n { path: '/manufacturers', label: 'Vendors' }, { path: '/vendor-price-sheets', label: 'Vendor Price Sheets' },\n ]},\n { label: 'Inventory', items: [\n { path: '/goods-issue', label: 'Goods Issue' }, { path: '/stock-on-hand', label: 'Stock on Hand' },\n { path: '/warehouses', label: 'Warehouses' },\n ]},\n { label: 'Products', items: [\n { path: '/products', label: 'Part Numbers' }, { path: '/brands', label: 'Brands' },\n { path: '/designs', label: 'Designs' }, { path: '/wheel-finishes', label: 'Wheel Finishes' },\n ]},\n { label: 'R&D', items: [\n { path: '/projects', label: 'Projects' }, { path: '/proposals', label: 'Proposals' },\n { path: '/moulds', label: 'Moulds' }, { path: '/dfm-logs', label: 'DFM Logs' },\n { path: '/weight-logs', label: 'Weight Logs' },\n ]},\n { label: 'Finance', items: [\n { path: '/payments', label: 'Receipts' }, { path: '/bank-accounts', label: 'Bank Accounts' },\n ]},\n];\n\nfunction useFavorites(wallpapers?: string[]) {\n const { prefs, save } = useShellPrefs();\n const favorites: string[] = prefs.favorite_pages || [];\n\n const toggle = useCallback((path: string) => {\n const next = favorites.includes(path) ? favorites.filter((p: string) => p !== path) : [...favorites, path];\n save({ favorite_pages: next });\n }, [favorites, save]);\n\n const wallpaperPool = wallpapers && wallpapers.length > 0 ? wallpapers : [];\n const randomPickRef = useRef(wallpaperPool.length > 0 ? wallpaperPool[Math.floor(Math.random() * wallpaperPool.length)] : 'none');\n const rawBg: string = prefs.desktop_bg || (wallpaperPool.length > 0 ? 'random' : 'none');\n const desktopBg: string = rawBg === 'random' ? randomPickRef.current : rawBg;\n\n const setDesktopBg = useCallback((bg: string) => {\n save({ desktop_bg: bg });\n }, [save]);\n\n return { favorites, toggle, isFavorite: (path: string) => favorites.includes(path), desktopBg, setDesktopBg };\n}\n\nexport { useFavorites };\n\n/** Star button for list page titles — toggles favorite status */\nexport function FavoriteStar({ path }: { path?: string }) {\n const location = useLocation();\n const { isFavorite, toggle } = useFavorites();\n const currentPath = path || location.pathname;\n const fav = isFavorite(currentPath);\n return (\n <button onClick={() => toggle(currentPath)} title={fav ? 'Remove from favorites' : 'Add to favorites'}\n className={`shrink-0 transition-colors ${fav ? 'text-yellow-500 hover:text-yellow-600' : 'text-gray-300 hover:text-yellow-400'}`}>\n <svg className=\"h-5 w-5\" fill={fav ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" />\n </svg>\n </button>\n );\n}\n\nexport const ALL_TIMEZONES = [\n { tz: 'Pacific/Auckland', label: 'Auckland' }, { tz: 'Australia/Sydney', label: 'Sydney' },\n { tz: 'Australia/Adelaide', label: 'Adelaide' }, { tz: 'Australia/Brisbane', label: 'Brisbane' },\n { tz: 'Australia/Perth', label: 'Perth' }, { tz: 'Asia/Tokyo', label: 'Tokyo' },\n { tz: 'Asia/Seoul', label: 'Seoul' }, { tz: 'Asia/Shanghai', label: 'Shanghai' },\n { tz: 'Asia/Hong_Kong', label: 'Hong Kong' }, { tz: 'Asia/Singapore', label: 'Singapore' },\n { tz: 'Asia/Bangkok', label: 'Bangkok' }, { tz: 'Asia/Kolkata', label: 'Mumbai' },\n { tz: 'Asia/Dubai', label: 'Dubai' }, { tz: 'Europe/Moscow', label: 'Moscow' },\n { tz: 'Europe/Istanbul', label: 'Istanbul' }, { tz: 'Europe/Berlin', label: 'Berlin' },\n { tz: 'Europe/Paris', label: 'Paris' }, { tz: 'Europe/London', label: 'London' },\n { tz: 'America/Sao_Paulo', label: 'Sao Paulo' }, { tz: 'America/New_York', label: 'New York' },\n { tz: 'America/Chicago', label: 'Chicago' }, { tz: 'America/Denver', label: 'Denver' },\n { tz: 'America/Los_Angeles', label: 'Los Angeles' }, { tz: 'Pacific/Honolulu', label: 'Honolulu' },\n { tz: 'UTC', label: 'UTC' },\n];\n\nexport function ClockContent({ localTz, worldClocks, now, fmtTime, fmtDate, fmtOffset, removeClock, adding, setAdding, addClock, availableToAdd, showAdd }: {\n localTz: string; worldClocks: string[]; now: Date;\n fmtTime: (tz: string) => string; fmtDate: (tz: string) => string; fmtOffset: (tz: string) => string;\n removeClock: (tz: string) => void; adding: boolean; setAdding: (v: boolean) => void; addClock: (tz: string) => void;\n availableToAdd: { tz: string; label: string }[]; showAdd: boolean;\n}) {\n return (\n <>\n {/* Local time header */}\n <div className=\"px-4 py-3 border-b border-gray-200\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wide\">Local Time</p>\n <div className=\"flex items-baseline justify-between mt-1\">\n <span className=\"text-2xl font-semibold text-gray-900 tabular-nums\">{fmtTime(localTz)}</span>\n <span className=\"text-xs text-gray-400\">{fmtOffset(localTz)}</span>\n </div>\n <p className=\"text-xs text-gray-500 mt-0.5\">{fmtDate(localTz)} &middot; {localTz.replace(/_/g, ' ')}</p>\n </div>\n\n {/* World clocks */}\n <div className=\"max-h-60 overflow-y-auto\">\n {worldClocks.map(tz => {\n const info = ALL_TIMEZONES.find(t => t.tz === tz);\n const label = info?.label || tz.split('/').pop()?.replace(/_/g, ' ') || tz;\n return (\n <div key={tz} className=\"flex items-center justify-between px-4 py-2 hover:bg-gray-50 group\">\n <div>\n <p className=\"text-sm font-medium text-gray-900\">{label}</p>\n <p className=\"text-[10px] text-gray-400\">{fmtDate(tz)} &middot; {fmtOffset(tz)}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-700 tabular-nums\">{fmtTime(tz)}</span>\n <button onClick={() => removeClock(tz)} className=\"opacity-0 group-hover:opacity-100 text-gray-300 hover:text-red-500 transition-all\" title=\"Remove\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\n </div>\n );\n })}\n {worldClocks.length === 0 && (\n <p className=\"text-sm text-gray-400 text-center py-4\">No world clocks added</p>\n )}\n </div>\n\n {/* Add timezone — only shown when not pinned */}\n {showAdd && (\n <div className=\"border-t border-gray-200 p-2\">\n {adding ? (\n <select autoFocus onChange={e => { if (e.target.value) addClock(e.target.value); }} onBlur={() => setAdding(false)}\n className=\"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-blue-500\">\n <option value=\"\">Select timezone...</option>\n {availableToAdd.map(t => (\n <option key={t.tz} value={t.tz}>{t.label} ({fmtOffset(t.tz)})</option>\n ))}\n </select>\n ) : (\n <button onClick={() => setAdding(true)} className=\"w-full flex items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm text-gray-500 hover:bg-gray-100 hover:text-gray-700 transition-colors\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n Add World Clock\n </button>\n )}\n </div>\n )}\n </>\n );\n}\n\n/**\n * Compact countdown chip rendered in the system tray when a Pomodoro\n * session is in progress. Subscribes to `pomodoroStore` so it updates\n * once per second without re-rendering the whole shell. Tapping it opens\n * (or focuses) the Pomodoro widget.\n */\nfunction TaskbarPomodoro() {\n const snap = useSyncExternalStore(subscribePomo, getPomoSnapshot, getPomoSnapshot);\n const { openPage } = useWindowManager();\n\n // Show whenever the user has an active or paused-mid-session timer.\n const inSession = snap.running || (snap.remaining < snap.total && snap.remaining > 0);\n if (!inSession) return 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 const dot =\n snap.mode === 'focus' ? 'bg-blue-500' :\n snap.mode === 'short' ? 'bg-emerald-500' : 'bg-emerald-600';\n const label =\n snap.mode === 'focus' ? 'Focus' :\n snap.mode === 'short' ? 'Short break' : 'Long break';\n\n return (\n <button onClick={() => openPage('/pomodoro')}\n title={`${label} · ${mm}:${ss}${snap.running ? '' : ' (paused)'}`}\n className={`shrink-0 flex items-center gap-1.5 rounded-md px-2 py-1 text-[11px] font-mono font-semibold tabular-nums hover:bg-gray-200/50 transition-colors ${snap.running ? 'text-gray-800' : 'text-gray-400'}`}>\n <span className={`block w-1.5 h-1.5 rounded-full ${dot} ${snap.running ? 'animate-pulse' : 'opacity-60'}`} />\n {mm}:{ss}\n </button>\n );\n}\n\nfunction TaskbarClock() {\n const [now, setNow] = useState(new Date());\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { openPage } = useWindowManager();\n\n useEffect(() => {\n const t = setInterval(() => setNow(new Date()), 10000);\n return () => clearInterval(t);\n }, []);\n\n useClickOutside(ref, useCallback(() => { if (open) setOpen(false); }, [open]));\n\n return (\n <div ref={ref} className=\"relative shrink-0\">\n <button ref={buttonRef} onClick={() => setOpen(!open)} className=\"text-right leading-tight cursor-pointer hover:bg-gray-200/50 rounded px-1.5 py-0.5 transition-colors\">\n <p className=\"text-[11px] font-medium text-gray-800\">{now.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}</p>\n <p className=\"text-[10px] text-gray-700\">{now.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })}</p>\n </button>\n\n {open && (() => {\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const rect = buttonRef.current?.getBoundingClientRect();\n const right = rect ? Math.max(8, window.innerWidth - rect.right) : 8;\n const posStyle = taskbarPos === 'top'\n ? { right, top: (rect?.bottom ?? 0) + 4 }\n : { right, bottom: window.innerHeight - (rect?.top ?? 0) + 4 };\n\n return (\n <div className=\"fixed z-[300] rounded-lg border border-gray-200 bg-white shadow-xl\" style={posStyle}>\n <CalendarPopup now={now} />\n </div>\n );\n })()}\n </div>\n );\n}\n\n/**\n * Mini month calendar shown when the user clicks the taskbar clock.\n * Header has month + year and prev/next nav arrows; today is filled in\n * the accent colour; days outside the current month are dimmed.\n */\nfunction CalendarPopup({ now }: { now: Date }) {\n const [month, setMonth] = useState(() => new Date(now.getFullYear(), now.getMonth(), 1));\n\n const monthLabel = month.toLocaleDateString(undefined, { month: 'long', year: 'numeric' });\n const fullDate = now.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' });\n const fullTime = now.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n\n const firstDay = month.getDay(); // 0 = Sunday\n const daysInMonth = new Date(month.getFullYear(), month.getMonth() + 1, 0).getDate();\n const prevDays = new Date(month.getFullYear(), month.getMonth(), 0).getDate();\n\n const cells: { day: number; thisMonth: boolean; date: Date }[] = [];\n for (let i = firstDay - 1; i >= 0; i--) {\n const day = prevDays - i;\n cells.push({ day, thisMonth: false, date: new Date(month.getFullYear(), month.getMonth() - 1, day) });\n }\n for (let day = 1; day <= daysInMonth; day++) {\n cells.push({ day, thisMonth: true, date: new Date(month.getFullYear(), month.getMonth(), day) });\n }\n let nextDay = 1;\n while (cells.length < 42) {\n cells.push({ day: nextDay, thisMonth: false, date: new Date(month.getFullYear(), month.getMonth() + 1, nextDay) });\n nextDay++;\n }\n\n const today = new Date();\n const isToday = (d: Date) =>\n d.getFullYear() === today.getFullYear() &&\n d.getMonth() === today.getMonth() &&\n d.getDate() === today.getDate();\n\n const goPrev = () => setMonth(m => new Date(m.getFullYear(), m.getMonth() - 1, 1));\n const goNext = () => setMonth(m => new Date(m.getFullYear(), m.getMonth() + 1, 1));\n const goToday = () => setMonth(new Date(today.getFullYear(), today.getMonth(), 1));\n\n return (\n <div className=\"w-[260px] p-3\">\n {/* Live date + time line */}\n <div className=\"px-1 pb-2.5 border-b border-gray-100\">\n <div className=\"text-[11px] font-semibold text-gray-500 uppercase tracking-wide\">{fullDate}</div>\n <div className=\"text-2xl font-semibold text-gray-800 tabular-nums leading-tight mt-0.5\">{fullTime}</div>\n </div>\n\n {/* Month nav */}\n <div className=\"flex items-center justify-between mt-2.5 mb-2\">\n <button onClick={goPrev} className=\"p-1 rounded hover:bg-gray-100 text-gray-600\" aria-label=\"Previous month\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button onClick={goToday} className=\"text-sm font-semibold text-gray-700 hover:text-blue-600 transition-colors\">\n {monthLabel}\n </button>\n <button onClick={goNext} className=\"p-1 rounded hover:bg-gray-100 text-gray-600\" aria-label=\"Next month\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-1 text-[10px] font-semibold text-gray-400 text-center uppercase tracking-wide\">\n {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((d, i) => <div key={i} className=\"py-1\">{d}</div>)}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 gap-px text-center\">\n {cells.map((cell, i) => {\n const todayCell = cell.thisMonth && isToday(cell.date);\n return (\n <div key={i}\n className={`text-[12px] py-1.5 rounded-md transition-colors ${\n todayCell\n ? 'bg-blue-500 text-white font-semibold'\n : cell.thisMonth\n ? 'text-gray-700 hover:bg-gray-100'\n : 'text-gray-300'\n }`}>\n {cell.day}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction TaskbarContextMenu({ x, y, position, size, onChangePosition, onChangeSize, onClose, onReportBug }: {\n x: number; y: number; position: string; size: string;\n onChangePosition: (v: string) => void; onChangeSize: (v: string) => void; onClose: () => void;\n onReportBug?: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useClickOutside(ref, onClose);\n\n const posStyle: React.CSSProperties =\n position === 'top' ? { left: Math.min(x, window.innerWidth - 200), top: y + 4 } :\n position === 'left' ? { left: x + 4, top: Math.min(y, window.innerHeight - 300) } :\n position === 'right' ? { right: window.innerWidth - x + 4, top: Math.min(y, window.innerHeight - 300) } :\n { left: Math.min(x, window.innerWidth - 200), bottom: window.innerHeight - y + 4 };\n\n const check = (active: boolean) => active\n ? <svg className=\"h-3.5 w-3.5 text-blue-600 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n : <span className=\"w-3.5\" />;\n\n return (\n <div ref={ref} className=\"fixed z-[400] rounded-2xl py-1 min-w-[180px]\" style={{ ...posStyle, ...getGlassStyle() }}>\n <p className=\"px-3 py-1 text-[10px] font-semibold text-gray-400 uppercase tracking-wide\">Position</p>\n {(['bottom', 'top', 'left', 'right'] as const).map(pos => (\n <button key={pos} onClick={() => onChangePosition(pos)}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n {check(position === pos)}\n {pos.charAt(0).toUpperCase() + pos.slice(1)}\n </button>\n ))}\n <div className=\"border-t border-white/20 my-1 mx-3\" />\n <p className=\"px-3 py-1 text-[10px] font-semibold text-gray-400 uppercase tracking-wide\">Size</p>\n {(['small', 'medium', 'large'] as const).map(s => (\n <button key={s} onClick={() => onChangeSize(s)}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n {check(size === s)}\n {s.charAt(0).toUpperCase() + s.slice(1)}\n </button>\n ))}\n {onReportBug && <>\n <div className=\"border-t border-white/20 my-1 mx-3\" />\n <button onClick={() => { onClose(); onReportBug(); }}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n <span className=\"w-3.5 shrink-0\" />\n Suggestion or Bug\n </button>\n </>}\n </div>\n );\n}\n\nexport default function Layout({\n productName = 'react-os-shell',\n productIcon = '/favicon.svg',\n wallpapers,\n navSections = defaultNavSections,\n navIcons = defaultNavIcons,\n sectionIcons = defaultSectionIcons,\n categories = defaultCategories,\n notifications,\n search,\n taskbarTrayLeft,\n}: LayoutProps = {}) {\n const bugReport = useBugReport();\n const { user, logout, hasAnyPerm } = useAuth();\n const { openPage, openEntity, openWindows } = useWindowManager();\n const [menuOpen, setMenuOpen] = useState(false);\n const isMobile = useIsMobile();\n\n // Profile is reserved for consumer integration; the shell only consumes prefs.\n const profile: any = user || {};\n\n useTheme();\n const { favorites, toggle: toggleFavorite, isFavorite, desktopBg, setDesktopBg } = useFavorites(wallpapers);\n\n const { prefs, save: savePrefs } = useShellPrefs();\n\n // Layout mode — 'sidebar' opt-in for small-screen users. Forces a\n // persistent left strip, horizontal taskbar starting at the sidebar's\n // right edge, and always-maximized non-widget windows.\n const layoutMode: 'classic' | 'sidebar' = prefs.layout_mode === 'sidebar' ? 'sidebar' : 'classic';\n const sidebarMode = layoutMode === 'sidebar';\n const sidebarWidth = sidebarMode ? 280 : 0;\n\n // Taskbar layout — when sidebar mode is active we force the taskbar\n // horizontal across the bottom; the design doesn't support a vertical\n // taskbar living next to the sidebar.\n const taskbarPositionRaw: string = prefs.taskbar_position || 'bottom';\n const taskbarPosition: string = sidebarMode ? 'bottom' : taskbarPositionRaw;\n const taskbarSize: string = prefs.taskbar_size || 'medium';\n const desktopDblClick: string = prefs.desktop_dblclick || 'deactivate';\n\n const isVerticalTaskbar = taskbarPosition === 'left' || taskbarPosition === 'right';\n const taskbarH = isVerticalTaskbar ? 0 : (taskbarSize === 'small' ? 40 : taskbarSize === 'large' ? 72 : 56);\n const taskbarW = isVerticalTaskbar ? (taskbarSize === 'small' ? 180 : taskbarSize === 'large' ? 260 : 220) : 0;\n const taskbarHClass = taskbarSize === 'small' ? 'h-10' : taskbarSize === 'large' ? 'h-[72px]' : 'h-14';\n const taskbarWClass = taskbarSize === 'small' ? 'w-[180px]' : taskbarSize === 'large' ? 'w-[260px]' : 'w-[220px]';\n // Transparency preferences → CSS custom properties for Modal.tsx to read\n const taskbarOpacity = (prefs.transparency_taskbar ?? 70) / 100;\n const menuOpacity = (prefs.transparency_start_menu ?? 95) / 100;\n const inactiveHeaderOpacity = (prefs.transparency_inactive_header ?? 70) / 100;\n const inactiveContentOpacity = (prefs.transparency_inactive_content ?? 80) / 100;\n const activeHeaderOpacity = (prefs.transparency_active_header ?? 80) / 100;\n const activeContentOpacity = (prefs.transparency_active_content ?? 90) / 100;\n useEffect(() => {\n const root = document.documentElement;\n root.style.setProperty('--inactive-header-opacity', String(inactiveHeaderOpacity));\n root.style.setProperty('--inactive-content-opacity', String(inactiveContentOpacity));\n root.style.setProperty('--active-header-opacity', String(activeHeaderOpacity));\n root.style.setProperty('--active-content-opacity', String(activeContentOpacity));\n root.style.setProperty('--menu-opacity', String(menuOpacity));\n // Suffix `px` so consumers using these vars inside CSS calc() get a\n // valid length. JS readers (parseInt(...)) handle either form. Without\n // the unit, expressions like `calc(100vh - var(--taskbar-height) - 24px)`\n // are invalid and the browser drops the whole property — which previously\n // broke the Modal autoHeight cap for any consumer that wasn't a widget.\n root.style.setProperty('--taskbar-height', `${taskbarH}px`);\n root.style.setProperty('--taskbar-width', `${taskbarW}px`);\n root.style.setProperty('--taskbar-position', taskbarPosition);\n // Sidebar mode: width of the persistent left strip + a layout-mode\n // marker. Modal reads both — sidebar-width to offset its calcMaximized\n // box, layout-mode to switch into \"always maximized\" behaviour.\n root.style.setProperty('--sidebar-width', `${sidebarWidth}px`);\n root.style.setProperty('--layout-mode', layoutMode);\n // Tell already-mounted Modals to refresh their alwaysMaximized flag\n // (they don't have access to ShellPrefs context — they listen for\n // this event so the toggle takes effect immediately).\n window.dispatchEvent(new CustomEvent('react-os-shell:layout-mode-changed'));\n root.style.setProperty('--default-window-size', prefs.default_window_size || 'large');\n root.style.setProperty('--window-position', prefs.window_position || 'cascade');\n root.style.setProperty('--menu-density', prefs.menu_density || 'normal');\n // Menu size — affects font size and item padding across PopupMenu (context menus, dropdowns, notification popup, etc.)\n // Also drives the taskbar window-tab width so it stays proportional.\n const menuSize = prefs.start_menu_size || 'medium';\n const sizeVars: Record<string, { font: string; px: string; py: string; tabW: string; tabFont: string }> = {\n small: { font: '12px', px: '0.75rem', py: '0.25rem', tabW: '150px', tabFont: '11px' },\n medium: { font: '14px', px: '1rem', py: '0.5rem', tabW: '200px', tabFont: '12px' },\n large: { font: '15px', px: '1.125rem', py: '0.625rem', tabW: '240px', tabFont: '13px' },\n };\n const sv = sizeVars[menuSize] || sizeVars.medium;\n root.style.setProperty('--menu-font-size', sv.font);\n root.style.setProperty('--menu-padding-x', sv.px);\n root.style.setProperty('--menu-padding-y', sv.py);\n root.style.setProperty('--window-tab-width', sv.tabW);\n root.style.setProperty('--window-tab-font-size', sv.tabFont);\n }, [inactiveHeaderOpacity, inactiveContentOpacity, activeHeaderOpacity, activeContentOpacity, taskbarH, taskbarPosition, prefs.default_window_size, prefs.window_position, prefs.menu_density, prefs.start_menu_size, sidebarWidth, layoutMode]);\n\n // Mobile-only CSS var: bottom-nav reservation height. Modal reads this to\n // shrink fullscreen apps so they don't render under the nav. Zero on desktop\n // so the variable can be used unconditionally in Modal styles.\n useEffect(() => {\n document.documentElement.style.setProperty('--mobile-bottom-nav', isMobile ? '100px' : '0px');\n }, [isMobile]);\n const [balloonDismissed, setBalloonDismissed] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(!!document.fullscreenElement);\n const [taskbarMenu, setTaskbarMenu] = useState<{ x: number; y: number } | null>(null);\n const [showLogout, setShowLogout] = useState(false);\n\n const savePref = useCallback((key: string, value: any) => {\n savePrefs({ [key]: value });\n }, [savePrefs]);\n\n const toggleFullscreen = useCallback(async () => {\n if (document.fullscreenElement) {\n // Release keyboard lock before exiting\n if ((navigator as any).keyboard?.unlock) (navigator as any).keyboard.unlock();\n document.exitFullscreen();\n } else {\n await document.documentElement.requestFullscreen();\n // Lock Escape key so it goes to our app instead of exiting fullscreen\n if ((navigator as any).keyboard?.lock) {\n try { await (navigator as any).keyboard.lock(['Escape']); } catch { /* not supported or denied */ }\n }\n }\n }, []);\n\n // Sync fullscreen state with browser\n useEffect(() => {\n const handler = () => {\n setIsFullscreen(!!document.fullscreenElement);\n // Release keyboard lock when exiting fullscreen\n if (!document.fullscreenElement && (navigator as any).keyboard?.unlock) {\n (navigator as any).keyboard.unlock();\n }\n };\n document.addEventListener('fullscreenchange', handler);\n return () => document.removeEventListener('fullscreenchange', handler);\n }, []);\n\n // Auto-fullscreen on login\n const autoFullscreenDone = useRef(false);\n useEffect(() => {\n if (autoFullscreenDone.current) return;\n if (prefs.auto_fullscreen && !document.fullscreenElement) {\n autoFullscreenDone.current = true;\n // Needs a user gesture — use a one-time click listener\n const handler = async () => {\n if (!document.fullscreenElement) {\n try {\n await document.documentElement.requestFullscreen();\n if ((navigator as any).keyboard?.lock) (navigator as any).keyboard.lock(['Escape']).catch(() => {});\n } catch {}\n }\n document.removeEventListener('click', handler);\n };\n document.addEventListener('click', handler, { once: true });\n }\n }, [prefs.auto_fullscreen]);\n\n // Startup animation + sound\n const [showStartup, setShowStartup] = useState(false);\n const startupChecked = useRef(false);\n useEffect(() => {\n if (startupChecked.current) return;\n startupChecked.current = true;\n const key = 'erp_startup_shown';\n if (!sessionStorage.getItem(key)) {\n sessionStorage.setItem(key, '1');\n setShowStartup(true);\n }\n }, []);\n\n const startupSoundDone = useRef(false);\n useEffect(() => {\n if (startupSoundDone.current || !showStartup) return;\n startupSoundDone.current = true;\n setTimeout(() => playStartup(), 500);\n }, [showStartup]);\n\n // Hotkey: Ctrl+. / Cmd+. to toggle menu, F11 to toggle fullscreen\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === '.') {\n e.preventDefault();\n setMenuOpen(prev => !prev);\n }\n if (e.ctrlKey && e.key === 'F11') {\n e.preventDefault();\n toggleFullscreen();\n }\n if (e.key === 'Escape' && document.fullscreenElement) {\n // Only exit fullscreen if no modals are open (let modals handle Escape first)\n const hasOpenModals = document.querySelectorAll('[data-modal-panel]').length > 0;\n if (!hasOpenModals) {\n e.preventDefault();\n toggleFullscreen();\n }\n }\n };\n window.addEventListener('keydown', handler);\n return () => { window.removeEventListener('keydown', handler); };\n }, [toggleFullscreen]);\n\n return (\n <div className=\"flex flex-col h-screen\">\n {showStartup && <StartupAnimation onComplete={() => setShowStartup(false)} ready={!!profile} productName={productName} />}\n {showLogout && <LogoutAnimation onComplete={() => { sessionStorage.removeItem('erp_startup_shown'); logout(); }} />}\n {/* Start Menu — suppressed in sidebar mode (Sidebar replaces it). */}\n {!sidebarMode && (\n <StartMenu\n open={menuOpen}\n onClose={() => setMenuOpen(false)}\n openPage={(path) => { openPage(path); setMenuOpen(false); }}\n openWindows={openWindows}\n profile={profile}\n user={user}\n onLogout={() => setShowLogout(true)}\n onNavigate={(path) => { openPage(path); setMenuOpen(false); }}\n taskbarPosition={taskbarPosition as 'top' | 'bottom' | 'left' | 'right'}\n taskbarH={taskbarH}\n taskbarW={taskbarW}\n size={(prefs.start_menu_size || 'medium') as 'small' | 'medium' | 'large'}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n categories={categories}\n />\n )}\n\n {/* Sidebar — persistent left strip for sidebar layout mode.\n Lazy-imported so a stale source checkout missing Sidebar.tsx\n only blows up if the user flips into sidebar mode (vs. crashing\n at module load), and so the chunk is only fetched when needed. */}\n {sidebarMode && (\n <Suspense fallback={null}>\n <Sidebar\n width={sidebarWidth}\n openPage={(path) => openPage(path)}\n profile={profile}\n user={user}\n onLogout={() => setShowLogout(true)}\n onNavigate={(path) => openPage(path)}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n categories={categories}\n productName={productName}\n productIcon={productIcon}\n />\n </Suspense>\n )}\n\n {(() => {\n // Shared wallpaper style used by both desktop main and mobile home so\n // the user's chosen background carries across breakpoints.\n const wallpaperStyle: React.CSSProperties = {\n backgroundColor: desktopBg?.startsWith('#') ? desktopBg : desktopBg === 'none' ? (() => {\n const customBg = getComputedStyle(document.documentElement).getPropertyValue('--custom-bg-color')?.trim();\n if (customBg) return customBg;\n const t = document.documentElement.getAttribute('data-theme') || 'light';\n const map: Record<string, string> = { light: '#f3f4f6', dark: '#1e1e2e', pink: '#fdf2f8', green: '#f0fdf4', grey: '#d1d5db', blue: '#eff6ff' };\n return map[t] || '#f3f4f6';\n })() : '#1a1a2e',\n backgroundImage: desktopBg && desktopBg !== 'none' && !desktopBg.startsWith('#') ? `url(${desktopBg})` : 'none',\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n };\n\n if (isMobile) {\n return (\n <MobileShell\n productName={productName}\n productIcon={productIcon}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n wallpaperStyle={wallpaperStyle}\n notifications={notifications}\n profile={profile}\n user={user}\n onNavigate={(path) => openPage(path)}\n onLogout={() => setShowLogout(true)}\n />\n );\n }\n\n return (\n <>\n <div className=\"flex flex-1 min-h-0\">\n <main\n className=\"flex-1 flex flex-col overflow-hidden cursor-default\"\n onDoubleClick={() => {\n if (desktopDblClick === 'deactivate') { setMenuOpen(false); window.dispatchEvent(new CustomEvent('deactivate-all-modals')); }\n }}\n style={wallpaperStyle}\n >\n {/* Desktop with shortcuts, folders, and context menu */}\n <Desktop profile={profile} />\n </main>\n </div>\n\n {/* Taskbar — overlays content for transparency. In sidebar mode the\n left edge starts at the sidebar's right edge instead of x=0. */}\n <div className={`flex backdrop-blur-sm border-gray-200 z-[250] fixed ${\n isVerticalTaskbar\n ? `flex-col items-center ${taskbarWClass} py-3 gap-2 top-0 bottom-0 ${taskbarPosition === 'left' ? 'left-0 border-r' : 'right-0 border-l'}`\n : `items-center ${taskbarHClass} px-3 gap-2 right-0 ${taskbarPosition === 'top' ? 'top-0 border-b' : 'bottom-0 border-t'}`\n }`}\n style={{\n backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${taskbarOpacity})`,\n ...(isVerticalTaskbar ? {} : { left: sidebarWidth }),\n }}\n onContextMenu={e => { e.preventDefault(); setTaskbarMenu({ x: e.clientX, y: e.clientY }); }}>\n {/* ERP button — toggles Start Menu. Hidden in sidebar mode where\n the persistent left sidebar replaces the start-menu role. */}\n {!sidebarMode && <div className=\"relative shrink-0\">\n {openWindows.length === 0 && !menuOpen && !balloonDismissed && (\n <div className={`absolute left-1/2 -translate-x-1/2 whitespace-nowrap text-white text-[10px] font-medium pl-3 pr-2 py-1 rounded-full shadow-lg animate-bounce flex items-center gap-1 ${taskbarPosition === 'top' ? 'top-full mt-2' : '-top-8'}`}\n style={{ backgroundColor: 'var(--accent-600, #7c3aed)' }}>\n Click here to start\n <button onClick={(e) => { e.stopPropagation(); setBalloonDismissed(true); }} className=\"text-white/60 hover:text-white ml-1.5\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n <div className={`absolute left-1/2 -translate-x-1/2 border-[6px] border-transparent ${taskbarPosition === 'top' ? 'bottom-full border-b-[var(--accent-color,#7c3aed)]' : 'top-full border-t-[var(--accent-color,#7c3aed)]'}`}\n style={taskbarPosition === 'top' ? { borderBottomColor: 'var(--accent-600, #7c3aed)' } : { borderTopColor: 'var(--accent-600, #7c3aed)' }} />\n </div>\n )}\n <button data-menu-toggle onClick={() => setMenuOpen(prev => !prev)} title={menuOpen ? 'Close menu' : 'Open menu'}\n className={`group/erp relative flex items-center justify-center gap-1.5 rounded-lg px-4 py-2 text-xs font-medium border overflow-hidden transition-all ${isVerticalTaskbar ? 'w-full' : 'min-w-[140px]'} ${menuOpen ? 'bg-gray-200/40 border-gray-300/40 text-gray-800' : 'bg-gray-50/40 border-gray-200/40 text-gray-600 hover:text-gray-800'}`}\n style={{ transition: 'box-shadow 0.3s, border-color 0.3s' }}\n onMouseMove={e => { const r = e.currentTarget.getBoundingClientRect(); e.currentTarget.style.setProperty('--mx', `${e.clientX - r.left}px`); e.currentTarget.style.setProperty('--my', `${e.clientY - r.top}px`); }}\n onMouseEnter={e => { e.currentTarget.style.boxShadow = '0 0 15px rgba(255,255,255,0.2), 0 0 30px rgba(255,255,255,0.1)'; e.currentTarget.style.borderColor = 'rgba(255,255,255,0.4)'; }}\n onMouseLeave={e => { e.currentTarget.style.boxShadow = ''; e.currentTarget.style.borderColor = ''; }}>\n <span className=\"absolute inset-0 opacity-0 group-hover/erp:opacity-100 transition-opacity duration-200 pointer-events-none\"\n style={{ background: 'radial-gradient(circle 60px at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,0.25) 0%, transparent 100%)' }} />\n {productIcon && <img src={productIcon} alt=\"\" className=\"relative z-10 h-3.5 w-3.5 shrink-0 opacity-60\" />}\n <span className=\"relative z-10 truncate\">{productName}</span>\n </button>\n </div>}\n\n {/* Separator (only when the ERP button is also rendered) */}\n {!sidebarMode && <div className={isVerticalTaskbar ? 'h-px w-6 bg-gray-300 my-1' : 'w-px h-6 bg-gray-300 mx-1'} />}\n\n {/* Window tabs rendered here by WindowManagerProvider */}\n <div id=\"taskbar-windows\" className={`flex-1 flex ${isVerticalTaskbar ? 'flex-col items-center gap-1 min-h-0 overflow-y-auto w-full' : 'items-center gap-1.5 min-w-0 overflow-x-auto'}`} />\n\n {/* Separator */}\n <div className={isVerticalTaskbar ? 'h-px w-6 bg-gray-300 my-1' : 'w-px h-6 bg-gray-300 mx-1'} />\n\n {/* System tray */}\n {isVerticalTaskbar ? (\n /* Vertical: clock + bell evenly spaced */\n <div className=\"w-full px-2\">\n <div className={`flex items-center justify-center gap-2 ${taskbarPosition === 'right' ? 'flex-row-reverse' : ''}`}>\n <TaskbarClock />\n <TaskbarPomodoro />\n {/* Host-supplied tray content (e.g. server-status icon).\n Sits next to the notification bell on the bell's\n outer edge. */}\n {taskbarTrayLeft}\n {notifications && <NotificationBell {...notifications} popDirection={taskbarPosition === 'right' ? 'left' : 'right'} />}\n </div>\n </div>\n ) : (\n /* Horizontal: icons then clock */\n <>\n <TaskbarPomodoro />\n {taskbarTrayLeft}\n {notifications && <NotificationBell {...notifications} />}\n <TaskbarClock />\n </>\n )}\n </div>\n </>\n );\n })()}\n\n {/* Taskbar context menu */}\n {taskbarMenu && (\n <TaskbarContextMenu\n x={taskbarMenu.x} y={taskbarMenu.y}\n position={taskbarPosition}\n size={taskbarSize}\n onChangePosition={v => { savePref('taskbar_position', v); setTaskbarMenu(null); }}\n onChangeSize={v => { savePref('taskbar_size', v); setTaskbarMenu(null); }}\n onClose={() => setTaskbarMenu(null)}\n onReportBug={bugReport ? () => reportBug(bugReport.submit) : undefined}\n />\n )}\n\n <GlobalSearch {...search} />\n <ShortcutHelp />\n </div>\n );\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { ModalActions } from '../shell/Modal';\nimport { useDesktopHost } from '../shell/Desktop';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { SOUND_PACKS, SOUND_PACK_KEYS, SOUND_TYPES, SOUND_TYPE_LABELS, getSoundConfig, setSoundForType, setAllSounds, soundsEnabled, previewSound, type SoundType } from '../utils/sounds';\n\n// Preview tiles use literal hex values via arbitrary Tailwind syntax so that the\n// active theme's [data-theme=\"...\"] !important overrides don't repaint them\n// (the Light preview must stay light even when Dark is the current theme).\nconst THEMES = [\n { key: 'system', label: 'System', bar1: 'bg-[#e5e7eb]', bar2: 'bg-[#e5e7eb]' },\n { key: 'light', label: 'Light', bar1: 'bg-[#e5e7eb]', bar2: 'bg-[#e5e7eb]' },\n { key: 'dark', label: 'Dark', bar1: 'bg-[#45475a]', bar2: 'bg-[#45475a]' },\n { key: 'pink', label: 'Blossom', bar1: 'bg-[#fbcfe8]', bar2: 'bg-[#fbcfe8]' },\n { key: 'green', label: 'Nature', bar1: 'bg-[#bbf7d0]', bar2: 'bg-[#bbf7d0]' },\n { key: 'grey', label: 'Quicksilver', bar1: 'bg-[#d1d5db]', bar2: 'bg-[#d1d5db]' },\n { key: 'blue', label: 'Ocean', bar1: 'bg-[#bfdbfe]', bar2: 'bg-[#bfdbfe]' },\n];\n\n// Default wallpaper list (consumer-overridable via DesktopHostProvider).\nconst DEFAULT_WALLPAPERS: { src: string; label: string }[] = [];\n\n/** Resolve what data-theme is actually active (for preview rendering) */\nfunction resolveTheme(key: string): string {\n if (key === 'system') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return key;\n}\n\nfunction getVersion() {\n const now = new Date();\n return `v${String(now.getDate()).padStart(2, '0')}${String(now.getMonth() + 1).padStart(2, '0')}.${String(now.getHours()).padStart(2, '0')}.${String(now.getMinutes()).padStart(2, '0')}.${now.getFullYear()}`;\n}\n\nfunction previewColor(resolved: string, light: string, dark: string, pink: string, green: string, grey?: string, blue?: string) {\n if (resolved === 'dark') return dark;\n if (resolved === 'pink') return pink;\n if (resolved === 'green') return green;\n if (resolved === 'grey') return grey ?? light;\n if (resolved === 'blue') return blue ?? light;\n return light;\n}\n\n/** Sections that can be omitted from the inline Customization page when the\n * consumer renders them elsewhere (e.g. as separate entries in SystemPreferences). */\nexport type CustomizationOmitSection = 'behavior' | 'desktop';\n\nexport interface CustomizationProps {\n omit?: readonly CustomizationOmitSection[];\n}\n\nexport default function Customization({ omit }: CustomizationProps = {}) {\n const omitSet = new Set(omit ?? []);\n const host = useDesktopHost();\n const WALLPAPERS = host.wallpapers && host.wallpapers.length > 0 ? host.wallpapers : DEFAULT_WALLPAPERS;\n const { prefs, save } = useShellPrefs();\n\n const currentTheme: string = prefs.theme || 'system';\n const resolved = resolveTheme(currentTheme);\n const rawBg: string = prefs.desktop_bg || (WALLPAPERS.length > 0 ? 'random' : 'none');\n const randomPickRef = useRef(WALLPAPERS.length > 0 ? WALLPAPERS[Math.floor(Math.random() * WALLPAPERS.length)].src : 'none');\n const desktopBg = rawBg === 'random' ? randomPickRef.current : rawBg;\n const customBg: string = prefs.desktop_bg_custom || '';\n const isColor = desktopBg?.startsWith('#');\n const presetPaths = new Set([...WALLPAPERS.map(w => w.src), 'random']);\n const isCustom = !isColor && desktopBg !== 'none' && rawBg !== 'random' && desktopBg && !presetPaths.has(desktopBg);\n\n const savePref = (key: string, value: any) => {\n save({ [key]: value });\n };\n\n // Debounced save for sliders — updates local state instantly, saves after 300ms idle\n const [localSliders, setLocalSliders] = useState<Record<string, number>>({});\n const sliderTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n const saveSlider = useCallback((key: string, value: number) => {\n setLocalSliders(prev => ({ ...prev, [key]: value }));\n // Apply CSS variable immediately for instant visual feedback\n const cssMap: Record<string, string> = {\n transparency_taskbar: '--taskbar-opacity',\n transparency_inactive_header: '--inactive-header-opacity',\n transparency_inactive_content: '--inactive-content-opacity',\n transparency_active_header: '--active-header-opacity',\n transparency_active_content: '--active-content-opacity',\n };\n if (cssMap[key]) {\n document.documentElement.style.setProperty(cssMap[key], String(value / 100));\n }\n if (sliderTimers.current[key]) clearTimeout(sliderTimers.current[key]);\n sliderTimers.current[key] = setTimeout(() => {\n savePref(key, value);\n setLocalSliders(prev => { const next = { ...prev }; delete next[key]; return next; });\n }, 300);\n }, [savePref]);\n // Cleanup timers on unmount\n useEffect(() => () => { Object.values(sliderTimers.current).forEach(clearTimeout); }, []);\n\n const prevTaskbarOpacity = (prefs.transparency_taskbar ?? 70) / 100;\n const prevActiveHeaderOpacity = (prefs.transparency_active_header ?? 80) / 100;\n const prevActiveContentOpacity = (prefs.transparency_active_content ?? 90) / 100;\n const taskbarBg = previewColor(resolved, 'bg-white/90', 'bg-[#1e1e2e]/90', 'bg-pink-50/90', 'bg-green-50/90', 'bg-gray-200/90', 'bg-blue-50/90');\n const iconBg = previewColor(resolved, 'bg-gray-200', 'bg-[#313244]', 'bg-pink-200', 'bg-green-200', 'bg-gray-400', 'bg-blue-200');\n const winBg = previewColor(resolved, 'bg-white border border-gray-200', 'bg-[#1e1e2e] border border-[#45475a]', 'bg-white border border-pink-200', 'bg-white border border-green-200', 'bg-gray-100 border border-gray-300', 'bg-blue-50 border border-blue-200');\n const headerBg = previewColor(resolved, 'bg-gray-100', 'bg-[#313244]', 'bg-pink-50', 'bg-green-50', 'bg-gray-300', 'bg-blue-100');\n const accentBg = previewColor(resolved, 'bg-blue-600', 'bg-blue-500', 'bg-pink-600', 'bg-green-600', 'bg-gray-700', 'bg-blue-700');\n\n return (\n <div className=\"space-y-6\">\n {/* ── Live Preview ── */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-lg border border-gray-200 overflow-hidden\" style={{ width: 480 }}>\n <div className=\"relative\" style={{ height: 300 }}>\n {/* Wallpaper */}\n {isColor ? (\n <div className=\"absolute inset-0\" style={{ backgroundColor: desktopBg }} />\n ) : (\n <img src={desktopBg} alt=\"\" className=\"absolute inset-0 w-full h-full object-cover\" />\n )}\n {/* Mini taskbar */}\n <div className={`absolute left-0 right-0 bottom-0 h-4 ${taskbarBg} border-t border-gray-200/50 flex items-center px-2 gap-1`} style={{ opacity: prevTaskbarOpacity }}>\n <div className={`h-2 w-8 rounded-sm ${accentBg}`} />\n <div className={`h-2 w-6 rounded-sm ${iconBg}`} />\n </div>\n {/* Desktop icons */}\n <div className=\"absolute left-4 top-4 flex gap-4\">\n {[\n { icon: '📋', label: 'Orders' },\n { icon: '📦', label: 'Products' },\n { icon: '📊', label: 'Reports' },\n ].map(d => (\n <div key={d.label} className=\"flex flex-col items-center gap-0.5 w-8\">\n <div className=\"text-sm drop-shadow\">{d.icon}</div>\n <span className=\"text-[5px] text-white font-medium drop-shadow-[0_1px_1px_rgba(0,0,0,0.8)] leading-tight\">{d.label}</span>\n </div>\n ))}\n </div>\n {/* Mini window */}\n <div className={`absolute rounded shadow-md ${winBg}`} style={{ left: '35%', top: '20%', width: '55%', height: '55%' }}>\n <div className={`h-3 rounded-t ${headerBg} flex items-center px-1.5 gap-0.5`} style={{ opacity: prevActiveHeaderOpacity }}>\n <div className=\"w-1 h-1 rounded-full bg-red-400\" />\n <div className=\"w-1 h-1 rounded-full bg-yellow-400\" />\n <div className=\"w-1 h-1 rounded-full bg-green-400\" />\n </div>\n <div className=\"p-1.5 space-y-1\" style={{ opacity: prevActiveContentOpacity }}>\n <div className={`h-1 rounded w-3/4 ${iconBg}`} />\n <div className={`h-1 rounded w-1/2 ${iconBg}`} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Theme ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Theme</h3>\n <div className=\"flex gap-3 flex-wrap\">\n {[...THEMES, { key: 'custom', label: 'Custom', bar1: 'bg-gray-200', bar2: 'bg-gray-200' }].map(t => {\n const isCustom = t.key === 'custom';\n const r = isCustom ? 'light' : resolveTheme(t.key);\n const customColor = prefs.accent_color || '#8b5cf6';\n const tAccent = isCustom ? '' : previewColor(r, 'bg-[#2563eb]', 'bg-[#3b82f6]', 'bg-[#db2777]', 'bg-[#16a34a]', 'bg-[#374151]', 'bg-[#1d4ed8]');\n const tBg = isCustom ? 'bg-[#ffffff] border-[#d1d5db]' : previewColor(r, 'bg-[#ffffff] border-[#d1d5db]', 'bg-[#1e1e2e] border-[#45475a]', 'bg-[#fdf2f8] border-[#f9a8d4]', 'bg-[#f0fdf4] border-[#86efac]', 'bg-[#e5e7eb] border-[#9ca3af]', 'bg-[#eff6ff] border-[#93c5fd]');\n return (\n <button key={t.key} onClick={() => {\n if (isCustom) {\n savePref('theme', 'light');\n if (!prefs.accent_color) savePref('accent_color', '#8b5cf6');\n } else {\n savePref('theme', t.key);\n savePref('accent_color', null);\n }\n }}\n className={`flex flex-col items-center gap-1.5 rounded-lg border-2 p-3 transition-all ${(isCustom ? !!prefs.accent_color : currentTheme === t.key && !prefs.accent_color) ? 'border-blue-500 shadow-md' : 'border-gray-200 hover:border-gray-300'}`}>\n <div className={`w-20 h-14 rounded ${tBg} border overflow-hidden flex flex-col`}>\n {t.key === 'system' ? (\n <div className=\"flex-1 flex\">\n <div className=\"flex-1 flex flex-col bg-[#ffffff]\">\n <div className=\"h-2 bg-[#2563eb] w-full\" />\n <div className=\"flex-1 flex gap-0.5 p-0.5\">\n <div className=\"w-3 rounded-sm bg-[#f3f4f6]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1 rounded-sm w-3/4 bg-[#e5e7eb]\" />\n <div className=\"h-1 rounded-sm w-1/2 bg-[#e5e7eb]\" />\n </div>\n </div>\n </div>\n <div className=\"flex-1 flex flex-col bg-[#1e1e2e]\">\n <div className=\"h-2 bg-[#3b82f6] w-full\" />\n <div className=\"flex-1 flex gap-0.5 p-0.5\">\n <div className=\"w-3 rounded-sm bg-[#313244]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1 rounded-sm w-3/4 bg-[#45475a]\" />\n <div className=\"h-1 rounded-sm w-1/2 bg-[#45475a]\" />\n </div>\n </div>\n </div>\n </div>\n ) : isCustom ? (\n <>\n <div className=\"h-2 w-full\" style={{ backgroundColor: customColor }} />\n <div className=\"flex-1 flex gap-0.5 p-1\">\n <div className=\"w-4 rounded-sm bg-[#f3f4f6]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1.5 rounded-sm w-3/4 bg-[#e5e7eb]\" />\n <div className=\"h-1.5 rounded-sm w-1/2 bg-[#e5e7eb]\" />\n </div>\n </div>\n </>\n ) : (\n <>\n <div className={`h-2 ${tAccent} w-full`} />\n <div className=\"flex-1 flex gap-0.5 p-1\">\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className={`h-1.5 rounded-sm w-3/4 ${t.bar1}`} />\n <div className={`h-1.5 rounded-sm w-1/2 ${t.bar2}`} />\n </div>\n </div>\n </>\n )}\n </div>\n <span className={`text-xs font-medium ${(isCustom ? !!prefs.accent_color : currentTheme === t.key && !prefs.accent_color) ? 'text-blue-600' : 'text-gray-600'}`}>{t.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Custom color pickers — only visible when Custom theme is selected */}\n {prefs.accent_color && (\n <div className=\"mt-3 space-y-2\">\n {([\n { key: 'custom_bg_color', label: 'Background Color', defaultVal: '#f3f4f6' },\n { key: 'custom_title_color', label: 'Title Color', defaultVal: '#f9fafb' },\n { key: 'custom_window_color', label: 'Windows Background', defaultVal: '#ffffff' },\n { key: 'custom_button_color', label: 'Button Color', defaultVal: '#2563eb' },\n { key: 'accent_color', label: 'Accent Color', defaultVal: '#8b5cf6' },\n ]).map(item => (\n <div key={item.key} className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">{item.label}</span>\n <label className=\"w-8 h-8 rounded-lg border-2 border-gray-300 overflow-hidden cursor-pointer flex items-center justify-center shrink-0\"\n style={{ backgroundColor: prefs[item.key] || item.defaultVal }}>\n <input type=\"color\" value={prefs[item.key] || item.defaultVal}\n onChange={e => savePref(item.key, e.target.value)}\n className=\"opacity-0 absolute w-0 h-0\" />\n </label>\n <span className=\"text-xs text-gray-500 font-mono\">{prefs[item.key] || item.defaultVal}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Desktop Wallpaper ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop Wallpaper</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <button onClick={() => savePref('desktop_bg', 'none')}\n className={`w-28 h-20 rounded border-2 overflow-hidden flex items-center justify-center ${rawBg === 'none' ? 'border-blue-500' : 'border-gray-300'}`}\n style={{ backgroundColor: previewColor(resolved, '#f3f4f6', '#1e1e2e', '#fdf2f8', '#f0fdf4', '#d1d5db', '#eff6ff') }}>\n <span className=\"text-[9px] text-gray-500\">None</span>\n </button>\n <button onClick={() => savePref('desktop_bg', 'random')}\n className={`w-28 h-20 rounded border-2 overflow-hidden flex items-center justify-center ${rawBg === 'random' ? 'border-blue-500' : 'border-gray-300'}`}>\n <div className=\"grid grid-cols-2 grid-rows-2 w-full h-full\">\n {WALLPAPERS.slice(0, 4).map(wp => (\n <img key={wp.src} src={wp.src} alt=\"\" loading=\"lazy\" className=\"w-full h-full object-cover\" />\n ))}\n </div>\n </button>\n {WALLPAPERS.map(wp => (\n <button key={wp.src} onClick={() => savePref('desktop_bg', wp.src)}\n className={`w-28 h-20 rounded border-2 overflow-hidden ${rawBg === wp.src ? 'border-blue-500' : 'border-gray-300'}`}>\n <img src={wp.src} alt={wp.label} loading=\"lazy\" className=\"w-full h-full object-cover\" />\n </button>\n ))}\n {(customBg || isCustom) && (\n <div className=\"relative group\">\n <button onClick={() => savePref('desktop_bg', customBg || desktopBg)}\n className={`w-28 h-20 rounded border-2 overflow-hidden ${isCustom ? 'border-blue-500' : 'border-gray-300'}`}>\n <img src={customBg || desktopBg} alt=\"Custom\" loading=\"lazy\" className=\"w-full h-full object-cover\" />\n </button>\n <button onClick={() => save({ desktop_bg: 'random', desktop_bg_custom: '' })}\n className=\"absolute -top-1.5 -right-1.5 h-4 w-4 rounded-full bg-red-500 text-white flex items-center justify-center text-[10px] leading-none opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-600 shadow\">&times;</button>\n </div>\n )}\n <label className=\"w-28 h-20 rounded border-2 border-gray-300 border-dashed overflow-hidden cursor-pointer flex items-center justify-center text-gray-400 hover:text-gray-600\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n <input type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onloadend = () => {\n if (reader.result) {\n save({ desktop_bg: reader.result as string, desktop_bg_custom: reader.result as string });\n }\n };\n reader.readAsDataURL(file);\n }} />\n </label>\n </div>\n </div>\n\n {/* ── Transparency ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Transparency</h3>\n <div className=\"space-y-3\">\n {([\n { key: 'transparency_taskbar', label: 'Taskbar', defaultVal: 70 },\n { key: 'transparency_start_menu', label: 'Start Menu', defaultVal: 70 },\n { key: 'transparency_inactive_header', label: 'Inactive Windows Header / Footer', defaultVal: 70 },\n { key: 'transparency_inactive_content', label: 'Inactive Windows Content', defaultVal: 80 },\n { key: 'transparency_active_header', label: 'Active Windows Header / Footer', defaultVal: 80 },\n { key: 'transparency_active_content', label: 'Active Windows Content', defaultVal: 90 },\n ] as const).map(item => {\n const val: number = localSliders[item.key] ?? prefs[item.key] ?? item.defaultVal;\n return (\n <div key={item.key} className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-64 shrink-0\">{item.label}</span>\n <input type=\"range\" min={20} max={100} value={val}\n onChange={e => saveSlider(item.key, Number(e.target.value))}\n className=\"flex-1 h-1.5 accent-blue-600 cursor-pointer\" />\n <span className=\"text-xs text-gray-500 w-10 text-right font-mono\">{val}%</span>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* ── Layout Mode ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Layout Mode</h3>\n <p className=\"text-xs text-gray-500 mb-3\">\n Sidebar mode is designed for small screens — windows always run maximized\n and the start menu lives in a persistent left sidebar (sections expand inline\n instead of opening flyouts).\n </p>\n <div className=\"flex gap-2\">\n {([\n { key: 'classic', label: 'Classic' },\n { key: 'sidebar', label: 'Sidebar' },\n ] as const).map(m => (\n <button\n key={m.key}\n onClick={() => {\n savePref('layout_mode', m.key);\n // Stay consistent if the user later switches back to classic —\n // sidebar implies maximized, so set the default-window-size pref\n // to match.\n if (m.key === 'sidebar') savePref('default_window_size', 'maximized');\n }}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.layout_mode || 'classic') === m.key\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}\n >\n {m.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* ── Taskbar ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Taskbar</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Position</span>\n <div className=\"flex gap-2\">\n {(['bottom', 'top', 'left', 'right'] as const).map(pos => (\n <button key={pos} onClick={() => savePref('taskbar_position', pos)}\n disabled={prefs.layout_mode === 'sidebar'}\n title={prefs.layout_mode === 'sidebar' ? 'Sidebar mode forces a horizontal taskbar.' : undefined}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors disabled:opacity-40 disabled:cursor-not-allowed ${\n (prefs.taskbar_position || 'bottom') === pos ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{pos.charAt(0).toUpperCase() + pos.slice(1)}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Menu ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Menu</h3>\n <p className=\"text-xs text-gray-500 mb-3\">Controls font size, padding, taskbar height, and window button height across the Start Menu, context menus, dropdowns, and the notification popup.</p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Size</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('start_menu_size', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.start_menu_size || 'medium') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Density</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'tight', label: 'Tight' },\n { key: 'normal', label: 'Normal' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('menu_density', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.menu_density || 'normal') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Behavior ── */}\n {!omitSet.has('behavior') && (\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Behavior</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">New window position</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'center', label: 'Center' },\n { key: 'cascade', label: 'Cascade' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('window_position', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.window_position || 'cascade') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">Double-click desktop</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'deactivate', label: 'Deactivate all' },\n { key: 'nothing', label: 'Do nothing' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('desktop_dblclick', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.desktop_dblclick || 'deactivate') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">Default window size</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n { key: 'maximized', label: 'Maximized' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('default_window_size', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.default_window_size || 'large') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* ── Desktop ── */}\n {!omitSet.has('desktop') && (\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={prefs.show_desktop_version ?? true} onChange={e => savePref('show_desktop_version', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Show version on desktop</span>\n <span className=\"text-xs text-gray-400 ml-1 font-mono\">{getVersion()}</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer mt-2\">\n <input type=\"checkbox\" checked={prefs.auto_fullscreen ?? false} onChange={e => savePref('auto_fullscreen', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Enter full screen mode automatically</span>\n <span className=\"text-xs text-gray-400 ml-1\">— on login</span>\n </label>\n <SoundSettings />\n </div>\n )}\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n\nfunction SoundSettings() {\n const [enabled, setEnabled] = useState(soundsEnabled());\n const [config, setConfig] = useState(getSoundConfig());\n\n const update = (soundType: SoundType, packKey: string) => {\n setSoundForType(soundType, packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, soundType);\n };\n\n const applyAll = (packKey: string) => {\n setAllSounds(packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, 'success');\n };\n\n return (\n <div className=\"mt-2 space-y-2\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={enabled} onChange={e => { localStorage.setItem('erp_sounds', String(e.target.checked)); setEnabled(e.target.checked); }}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Sound effects</span>\n </label>\n {enabled && (\n <div className=\"ml-6\">\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <table className=\"w-full text-[11px]\">\n <thead>\n <tr className=\"bg-gray-50\">\n <th className=\"px-2 py-1.5 text-left font-medium text-gray-500 w-24\"></th>\n {SOUND_PACK_KEYS.map(key => (\n <th key={key} className=\"px-1 py-1.5 text-center\">\n <button onClick={() => applyAll(key)} className=\"font-medium text-gray-500 hover:text-blue-600 transition-colors\">\n {SOUND_PACKS[key].label}\n </button>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {SOUND_TYPES.map(soundType => (\n <tr key={soundType}>\n <td className=\"px-2 py-1.5 text-gray-700 font-medium\">{SOUND_TYPE_LABELS[soundType]}</td>\n {SOUND_PACK_KEYS.map(packKey => (\n <td key={packKey} className=\"px-1 py-1.5 text-center\">\n <button onClick={() => update(soundType, packKey)}\n className={`w-4 h-4 rounded-full border-2 transition-colors ${config[soundType] === packKey ? 'bg-blue-600 border-blue-600' : 'border-gray-300 hover:border-blue-400'}`} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n","import { useShellPrefs } from '../shell/ShellPrefs';\nimport { ModalActions } from '../shell/Modal';\n\nconst WINDOW_POSITIONS = [\n { key: 'center', label: 'Center' },\n { key: 'cascade', label: 'Cascade' },\n];\n\nconst DESKTOP_DBLCLICK = [\n { key: 'deactivate', label: 'Deactivate all' },\n { key: 'nothing', label: 'Do nothing' },\n];\n\nconst WINDOW_SIZES = [\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n { key: 'maximized', label: 'Maximized' },\n];\n\n/**\n * Standalone Behavior settings panel — window position, double-click,\n * default window size, plus the two desktop-related toggles\n * (Show version on desktop, Enter full screen mode automatically).\n *\n * Reads/writes shell prefs via `useShellPrefs()`. Suitable for use as a\n * section in `SystemPreferences` or rendered standalone.\n */\nexport default function BehaviorPanel() {\n const { prefs, save } = useShellPrefs();\n const savePref = (key: string, value: any) => save({ [key]: value });\n\n const windowPosition: string = prefs.window_position || 'cascade';\n const desktopDblclick: string = prefs.desktop_dblclick || 'deactivate';\n const defaultWindowSize: string = prefs.default_window_size || 'large';\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Behavior</h3>\n <div className=\"space-y-3\">\n <Row\n label=\"New window position\"\n options={WINDOW_POSITIONS}\n value={windowPosition}\n onChange={v => savePref('window_position', v)}\n />\n <Row\n label=\"Double-click desktop\"\n options={DESKTOP_DBLCLICK}\n value={desktopDblclick}\n onChange={v => savePref('desktop_dblclick', v)}\n />\n <Row\n label=\"Default window size\"\n options={WINDOW_SIZES}\n value={defaultWindowSize}\n onChange={v => savePref('default_window_size', v)}\n />\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={prefs.show_desktop_version ?? true}\n onChange={e => savePref('show_desktop_version', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Show version on desktop</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer mt-2\">\n <input\n type=\"checkbox\"\n checked={prefs.auto_fullscreen ?? false}\n onChange={e => savePref('auto_fullscreen', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Enter full screen mode automatically</span>\n <span className=\"text-xs text-gray-400 ml-1\">— on login</span>\n </label>\n </div>\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n\nfunction Row({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: { key: string; label: string }[];\n value: string;\n onChange: (v: string) => void;\n}) {\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">{label}</span>\n <div className=\"flex gap-2\">\n {options.map(o => (\n <button\n key={o.key}\n type=\"button\"\n onClick={() => onChange(o.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n value === o.key\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}\n >\n {o.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { ModalActions } from '../shell/Modal';\nimport {\n SOUND_PACKS,\n SOUND_PACK_KEYS,\n SOUND_TYPES,\n SOUND_TYPE_LABELS,\n getSoundConfig,\n setSoundForType,\n setAllSounds,\n soundsEnabled,\n previewSound,\n type SoundType,\n} from '../utils/sounds';\n\n/**\n * Standalone Sounds settings panel — sound effects toggle + per-event\n * sound-pack picker. Reads/writes the shell's `erp_sounds` and\n * `erp_sound_config` localStorage keys. Plays a preview when a pack is\n * picked. Suitable as a section in `SystemPreferences` or rendered\n * standalone.\n */\nexport default function SoundsPanel() {\n const [enabled, setEnabled] = useState(soundsEnabled());\n const [config, setConfig] = useState(getSoundConfig());\n\n const update = (soundType: SoundType, packKey: string) => {\n setSoundForType(soundType, packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, soundType);\n };\n\n const applyAll = (packKey: string) => {\n setAllSounds(packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, 'success');\n };\n\n return (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-gray-900\">Sounds</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={e => {\n localStorage.setItem('erp_sounds', String(e.target.checked));\n setEnabled(e.target.checked);\n }}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Sound effects</span>\n </label>\n\n {enabled && (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <table className=\"w-full text-[11px]\">\n <thead>\n <tr className=\"bg-gray-50\">\n <th className=\"px-2 py-1.5 text-left font-medium text-gray-500 w-24\"></th>\n {SOUND_PACK_KEYS.map(key => (\n <th key={key} className=\"px-1 py-1.5 text-center\">\n <button\n onClick={() => applyAll(key)}\n className=\"font-medium text-gray-500 hover:text-blue-600 transition-colors\"\n >\n {SOUND_PACKS[key].label}\n </button>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {SOUND_TYPES.map(soundType => (\n <tr key={soundType}>\n <td className=\"px-2 py-1.5 text-gray-700 font-medium\">{SOUND_TYPE_LABELS[soundType]}</td>\n {SOUND_PACK_KEYS.map(packKey => (\n <td key={packKey} className=\"px-1 py-1.5 text-center\">\n <button\n onClick={() => update(soundType, packKey)}\n aria-label={`${SOUND_TYPE_LABELS[soundType]} — ${SOUND_PACKS[packKey].label}`}\n aria-pressed={config[soundType] === packKey}\n className={`w-4 h-4 rounded-full border-2 transition-colors ${\n config[soundType] === packKey\n ? 'bg-blue-600 border-blue-600'\n : 'border-gray-300 hover:border-blue-400'\n }`}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\n\n/** One section in the SystemPreferences sidebar. */\nexport interface SystemPreferencesSection {\n /** Unique key, e.g. `'notifications'`, `'customization'`. */\n key: string;\n /** Sidebar label, e.g. \"Notifications\". */\n label: string;\n /** Short description shown under the label in the sidebar. */\n description?: string;\n /** Sidebar icon (any ReactNode — typically a 4×4 svg). */\n icon?: ReactNode;\n /** Body renderer. Receives no args; access shell prefs via your own hook. */\n render: () => ReactNode;\n}\n\nexport interface SystemPreferencesProps {\n /** Ordered sections — left sidebar lists these top-to-bottom, the matching\n * body renders on the right. The first section is selected by default\n * unless `defaultSelected` is supplied. */\n sections: readonly SystemPreferencesSection[];\n /** Key of the section to highlight on first render. Falls back to the first\n * section in `sections`. */\n defaultSelected?: string;\n /** Optional className applied to the outer flex container. */\n className?: string;\n}\n\n/**\n * Two-pane settings window: a fixed sidebar of sections on the left, the\n * active section's body on the right. Consumers compose by passing\n * `sections` — each entry has a `key`, `label`, optional `icon` and\n * `description`, and a `render()` callback that returns the body JSX.\n *\n * The shell exposes ready-made panels (`Customization`, `BehaviorPanel`,\n * `SoundsPanel`) that can be used as section bodies directly; portals\n * add their own sections (notification subscriptions, delivery defaults,\n * personal formatting prefs, etc.) alongside.\n *\n * Example:\n * ```tsx\n * <SystemPreferences sections={[\n * { key: 'notifications', label: 'Notifications', icon: <BellIcon />, render: () => <MyNotifications /> },\n * { key: 'customization', label: 'Customization', icon: <PaintBrushIcon />, render: () => <Customization omit={['behavior','desktop']} /> },\n * { key: 'behavior', label: 'Behavior', icon: <Cog6ToothIcon />, render: () => <BehaviorPanel /> },\n * { key: 'sounds', label: 'Sounds', icon: <SpeakerWaveIcon />, render: () => <SoundsPanel /> },\n * ]} />\n * ```\n */\nexport default function SystemPreferences({\n sections,\n defaultSelected,\n className,\n}: SystemPreferencesProps) {\n const initial = defaultSelected && sections.some(s => s.key === defaultSelected)\n ? defaultSelected\n : sections[0]?.key ?? '';\n const [selected, setSelected] = useState<string>(initial);\n const active = sections.find(s => s.key === selected) ?? sections[0];\n\n return (\n <div className={`flex h-full gap-4 px-4 py-3 min-h-0 ${className ?? ''}`.trim()}>\n <aside className=\"w-60 shrink-0 flex flex-col bg-white rounded-lg shadow overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto py-1\">\n {sections.map(item => {\n const isActive = item.key === selected;\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => setSelected(item.key)}\n className={`w-full text-left px-3 py-2.5 text-sm transition-colors flex items-start gap-2.5 ${\n isActive ? 'bg-blue-50 text-blue-700' : 'hover:bg-gray-50 text-gray-700'\n }`}\n >\n {item.icon && (\n <span className={`mt-0.5 ${isActive ? 'text-blue-600' : 'text-gray-400'}`}>\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={`block ${\n isActive ? 'font-semibold text-blue-700' : 'font-medium text-gray-800'\n }`}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"block text-[11px] text-gray-500 mt-0.5\">\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n </aside>\n\n <main className=\"flex-1 min-w-0 flex flex-col min-h-0 overflow-auto pr-2\">\n {active?.render()}\n </main>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useModalActive } from '../shell/Modal';\n\n/**\n * Keyboard + shift-click navigation for table rows.\n *\n * - J/K or Arrow keys to move focus\n * - Enter to open the focused row (calls `onSelect`)\n * - Space to toggle the focused row's checkbox (calls `onToggle`)\n * - Shift+J/K to extend selection while moving\n * - Shift+click to range-select (calls `onSelectRange`)\n * - Cmd/Ctrl+A to select/deselect all (calls `onSelectAll`)\n *\n * Each list instance gates its document-level listeners on `useModalActive`\n * so two open lists don't both react to the same shift-click.\n */\nexport default function useTableNav<T>(\n items: T[],\n onSelect: (item: T) => void,\n onToggle?: (item: T) => void,\n onSelectAll?: () => void,\n onSelectRange?: (from: number, to: number) => void,\n) {\n const [focusIdx, setFocusIdx] = useState(-1);\n const itemsRef = useRef(items);\n const onSelectRef = useRef(onSelect);\n const onToggleRef = useRef(onToggle);\n const onSelectAllRef = useRef(onSelectAll);\n const onSelectRangeRef = useRef(onSelectRange);\n const focusRef = useRef(focusIdx);\n const lastToggledRef = useRef(-1);\n const isActive = useModalActive();\n const isActiveRef = useRef(isActive);\n itemsRef.current = items;\n onSelectRef.current = onSelect;\n onToggleRef.current = onToggle;\n onSelectAllRef.current = onSelectAll;\n onSelectRangeRef.current = onSelectRange;\n focusRef.current = focusIdx;\n isActiveRef.current = isActive;\n\n const prevLen = useRef(items.length);\n useEffect(() => {\n if (items.length !== prevLen.current) {\n setFocusIdx(-1);\n lastToggledRef.current = -1;\n prevLen.current = items.length;\n }\n }, [items.length]);\n\n // Track normal checkbox clicks to set the anchor for Shift+click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (!isActiveRef.current) return;\n if (e.shiftKey) return;\n const target = e.target as HTMLElement;\n const row = target?.closest?.('[data-row-idx]');\n if (!row) return;\n if (target.tagName !== 'INPUT' || (target as HTMLInputElement).type !== 'checkbox') return;\n const idx = parseInt(row.getAttribute('data-row-idx')!, 10);\n if (!isNaN(idx)) {\n lastToggledRef.current = idx;\n setFocusIdx(idx);\n }\n };\n document.addEventListener('click', handler);\n return () => document.removeEventListener('click', handler);\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (!isActiveRef.current) return;\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.target as HTMLElement)?.isContentEditable) return;\n\n if ((e.metaKey || e.ctrlKey) && e.key === 'a') {\n e.preventDefault();\n onSelectAllRef.current?.();\n return;\n }\n\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n const len = itemsRef.current.length;\n if (len === 0) return;\n\n const isDown = e.code === 'KeyJ' || e.key === 'j' || e.key === 'J' || e.key === 'ArrowDown';\n const isUp = e.code === 'KeyK' || e.key === 'k' || e.key === 'K' || e.key === 'ArrowUp';\n\n if (isDown || isUp) {\n e.preventDefault();\n const prev = focusRef.current;\n const next = isDown\n ? Math.min(prev + 1, len - 1)\n : Math.max(prev - 1, 0);\n if (next !== prev) {\n setFocusIdx(next);\n scrollRowIntoView(next);\n if (e.shiftKey && onToggleRef.current) {\n onToggleRef.current(itemsRef.current[next]);\n lastToggledRef.current = next;\n }\n }\n } else if (e.key === 'Enter' && focusRef.current >= 0 && focusRef.current < len) {\n e.preventDefault();\n onSelectRef.current(itemsRef.current[focusRef.current]);\n } else if (e.key === ' ' && focusRef.current >= 0 && focusRef.current < len) {\n e.preventDefault();\n if (e.shiftKey && lastToggledRef.current >= 0 && onSelectRangeRef.current) {\n const from = Math.min(lastToggledRef.current, focusRef.current);\n const to = Math.max(lastToggledRef.current, focusRef.current);\n onSelectRangeRef.current(from, to);\n } else {\n onToggleRef.current?.(itemsRef.current[focusRef.current]);\n }\n lastToggledRef.current = focusRef.current;\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, []);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (!isActiveRef.current) return;\n if (!e.shiftKey) return;\n const target = e.target as HTMLElement;\n const row = target?.closest?.('[data-row-idx]');\n if (!row) return;\n const clickedIdx = parseInt(row.getAttribute('data-row-idx')!, 10);\n if (isNaN(clickedIdx)) return;\n\n const anchor = lastToggledRef.current;\n if (anchor < 0) {\n onToggleRef.current?.(itemsRef.current[clickedIdx]);\n lastToggledRef.current = clickedIdx;\n setFocusIdx(clickedIdx);\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n const from = Math.min(anchor, clickedIdx);\n const to = Math.max(anchor, clickedIdx);\n if (onSelectRangeRef.current) {\n onSelectRangeRef.current(from, to);\n } else if (onToggleRef.current) {\n for (let i = from; i <= to; i++) {\n onToggleRef.current(itemsRef.current[i]);\n }\n }\n lastToggledRef.current = clickedIdx;\n setFocusIdx(clickedIdx);\n };\n\n document.addEventListener('click', handler, true);\n return () => document.removeEventListener('click', handler, true);\n }, []);\n\n return focusIdx;\n}\n\nfunction scrollRowIntoView(idx: number) {\n requestAnimationFrame(() => {\n const row = document.querySelector(`[data-row-idx=\"${idx}\"]`);\n row?.scrollIntoView({ block: 'nearest' });\n });\n}\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport apiClient from '../api/client';\nimport type { ColumnDef } from './types';\n\ninterface ColumnState {\n key: string;\n width: number;\n hidden?: boolean;\n}\n\n/** Ensure _select column (if present) is always at index 0 and never hidden */\nfunction pinSelectColumn(cols: ColumnState[]): ColumnState[] {\n const selectIdx = cols.findIndex(c => c.key === '_select');\n if (selectIdx >= 0) {\n const [sel] = cols.splice(selectIdx, 1);\n sel.hidden = false;\n cols.unshift(sel);\n }\n return cols;\n}\n\n/**\n * Resizable + reorderable + hideable column state for `<ResizableTable>`.\n *\n * Persists per-user via `PATCH /auth/me/` (`preferences.columns_{tableId}`)\n * with a 1-second debounce, and per-viewport admin defaults via\n * `GET /auth/default-columns/{tableId}?viewport=…`. The consumer wires these\n * endpoints on its backend; the shell's `apiClient` proxy resolves to the\n * consumer-registered axios instance (`setShellApiClient`).\n */\nexport function useColumnConfig(tableId: string, defaultColumns: ColumnDef[]) {\n const [columns, setColumns] = useState<ColumnState[]>(() => {\n const cached = localStorage.getItem(`col-config-${tableId}`);\n if (cached) {\n try {\n const parsed = JSON.parse(cached) as ColumnState[];\n const existing = new Set(parsed.map(c => c.key));\n const merged = pinSelectColumn([\n ...parsed.filter(c => defaultColumns.some(d => d.key === c.key)),\n ...defaultColumns.filter(d => !existing.has(d.key)).map(d => ({ key: d.key, width: d.defaultWidth || 150 })),\n ]);\n return merged;\n } catch { /* fall through */ }\n }\n return pinSelectColumn(defaultColumns.map(d => ({ key: d.key, width: d.defaultWidth || 150, hidden: d.defaultHidden })));\n });\n\n const [draggedIdx, setDraggedIdx] = useState<number | null>(null);\n const [dropGap, setDropGap] = useState<number | null>(null);\n const resizingRef = useRef<{ idx: number; startX: number; startWidth: number } | null>(null);\n\n const saveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const saveMut = useMutation({\n mutationFn: (cols: ColumnState[]) =>\n apiClient.patch('/auth/me/', {\n preferences: { [`columns_${tableId}`]: cols },\n }),\n });\n\n const persistColumns = useCallback((cols: ColumnState[]) => {\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(cols));\n if (saveTimer.current) clearTimeout(saveTimer.current);\n saveTimer.current = setTimeout(() => saveMut.mutate(cols), 1000);\n }, [tableId, saveMut]);\n\n useEffect(() => {\n // Pick the viewport once at mount, using the same query as `useIsMobile`\n // so the column-defaults split lines up with the rest of the UI's mobile\n // affordances. Refresh covers users who resize past the breakpoint\n // mid-session.\n const viewport: 'desktop' | 'mobile' =\n typeof window !== 'undefined' &&\n window.matchMedia('(max-width: 767px), (pointer: coarse)').matches\n ? 'mobile' : 'desktop';\n\n Promise.all([\n apiClient.get('/auth/me/').catch(() => null),\n apiClient.get(`/auth/default-columns/${tableId}/`, { params: { viewport } }).catch(() => null),\n ]).then(([userRes, defaultRes]) => {\n const prefs = userRes?.data?.preferences;\n const userSaved = prefs?.[`columns_${tableId}`];\n\n if (userSaved && Array.isArray(userSaved)) {\n const existing = new Set(userSaved.map((c: any) => c.key));\n const merged = pinSelectColumn([\n ...userSaved.filter((c: any) => defaultColumns.some(d => d.key === c.key)),\n ...defaultColumns.filter(d => !existing.has(d.key)).map(d => ({ key: d.key, width: d.defaultWidth || 150, hidden: d.defaultHidden })),\n ]);\n setColumns(merged);\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(merged));\n } else if (Array.isArray(defaultRes?.data?.visible_columns) && defaultRes.data.visible_columns.length > 0) {\n // Non-empty system defaults — apply them. (An empty array is treated\n // as \"no admin opinion\" and we leave the initial useState value alone,\n // which uses the per-column `defaultHidden` flag from each ColumnDef.)\n const visibleSet = new Set(defaultRes.data.visible_columns as string[]);\n const systemCols = pinSelectColumn(defaultColumns.map(d => ({\n key: d.key,\n width: d.defaultWidth || 150,\n hidden: !visibleSet.has(d.key),\n })));\n setColumns(systemCols);\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(systemCols));\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tableId]);\n\n const visibleColumns = columns.filter(c => !c.hidden);\n\n const onResizeStart = useCallback((idx: number, e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const visCol = visibleColumns[idx];\n const realIdx = columns.findIndex(c => c.key === visCol.key);\n resizingRef.current = { idx: realIdx, startX: e.clientX, startWidth: columns[realIdx].width };\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!resizingRef.current) return;\n const { idx: i, startX, startWidth } = resizingRef.current;\n const minW = defaultColumns.find(d => d.key === columns[i].key)?.minWidth || 30;\n const newWidth = Math.max(minW, startWidth + ev.clientX - startX);\n setColumns(prev => {\n const updated = [...prev];\n updated[i] = { ...updated[i], width: newWidth };\n return updated;\n });\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n resizingRef.current = null;\n setColumns(prev => { persistColumns(prev); return prev; });\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [columns, visibleColumns, defaultColumns, persistColumns]);\n\n const onDragStart = useCallback((idx: number) => {\n setDraggedIdx(idx);\n }, []);\n\n const onDragOver = useCallback((visIdx: number, e: React.DragEvent) => {\n e.preventDefault();\n if (draggedIdx === null) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n let gap = e.clientX < rect.left + rect.width / 2 ? visIdx : visIdx + 1;\n const vis = columns.filter(c => !c.hidden);\n if (vis[0]?.key === '_select' && gap === 0) gap = 1;\n setDropGap(gap);\n }, [draggedIdx, columns]);\n\n const onDrop = useCallback((_visIdx: number, e: React.DragEvent) => {\n e.preventDefault();\n if (draggedIdx === null || dropGap === null) {\n setDraggedIdx(null);\n setDropGap(null);\n return;\n }\n if (dropGap === draggedIdx || dropGap === draggedIdx + 1) {\n setDraggedIdx(null);\n setDropGap(null);\n return;\n }\n setColumns(prev => {\n const visible = prev.filter(c => !c.hidden);\n const moved = visible[draggedIdx];\n if (!moved) return prev;\n const fromReal = prev.findIndex(c => c.key === moved.key);\n let toReal: number;\n if (dropGap < visible.length) {\n toReal = prev.findIndex(c => c.key === visible[dropGap].key);\n } else {\n toReal = prev.findIndex(c => c.key === visible[visible.length - 1].key) + 1;\n }\n const updated = [...prev];\n const [item] = updated.splice(fromReal, 1);\n updated.splice(toReal > fromReal ? toReal - 1 : toReal, 0, item);\n persistColumns(updated);\n return updated;\n });\n setDraggedIdx(null);\n setDropGap(null);\n }, [draggedIdx, dropGap, persistColumns]);\n\n const onDragEnd = useCallback(() => {\n setDraggedIdx(null);\n setDropGap(null);\n }, []);\n\n const toggleColumn = useCallback((key: string) => {\n setColumns(prev => {\n const updated = prev.map(c => c.key === key ? { ...c, hidden: !c.hidden } : c);\n if (updated.filter(c => !c.hidden).length === 0) return prev;\n persistColumns(updated);\n return updated;\n });\n }, [persistColumns]);\n\n const resetColumns = useCallback(() => {\n const defaults = defaultColumns.map(d => ({ key: d.key, width: d.defaultWidth || 150 }));\n setColumns(defaults);\n persistColumns(defaults);\n }, [defaultColumns, persistColumns]);\n\n const orderedColumns = visibleColumns.map(c => {\n const def = defaultColumns.find(d => d.key === c.key);\n return { ...def!, width: c.width };\n }).filter(Boolean);\n\n const allColumns = columns.map(c => {\n const def = defaultColumns.find(d => d.key === c.key);\n return { key: c.key, label: def?.label || c.key, hidden: !!c.hidden };\n });\n\n return {\n orderedColumns,\n allColumns,\n onResizeStart,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n toggleColumn,\n resetColumns,\n draggedIdx,\n dropGap,\n };\n}\n","import { useState, useRef, useCallback, useMemo } from 'react';\nimport { useColumnConfig } from './useColumnConfig';\nimport { useIsMobile } from '../shell/useIsMobile';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\nimport apiClient from '../api/client';\nimport useClickOutside from '../hooks/useClickOutside';\nimport { useShellAuth } from '../shell/ShellAuth';\nimport type { ColumnDef, SortState } from './types';\n\ninterface ResizableTableProps {\n tableId: string;\n columns: ColumnDef[];\n sort?: SortState;\n onSort?: (field: string) => void;\n footer?: React.ReactNode;\n afterBody?: React.ReactNode;\n /** Permission codename(s) that gate the \"Save as default for all users\" link\n * in the column picker. The shell's `useShellAuth().hasAnyPerm` is queried\n * against this list. Defaults to a single placeholder permission; consumers\n * with no admin gate can pass `[]` to hide the link entirely. */\n saveDefaultPerms?: string[];\n children: (orderedColumns: (ColumnDef & { width: number })[]) => React.ReactNode;\n}\n\n/**\n * Sticky-header, scrollable-body table primitive with:\n * - drag-to-reorder columns (with a blue drop-indicator line)\n * - resize columns by the right-edge handle\n * - hide/show columns via a glass popover picker\n * - admin-only \"Save as default for all users\" link in the picker\n * - per-user persistence (via the shell-registered apiClient)\n * - mobile-aware selection mode toggle\n */\nexport default function ResizableTable({\n tableId,\n columns,\n sort,\n onSort,\n footer,\n afterBody,\n saveDefaultPerms = ['change_numberingconfig'],\n children,\n}: ResizableTableProps) {\n const isMobile = useIsMobile();\n const [selectionMode, setSelectionMode] = useState(false);\n // Strip the `_select` column on mobile (unless selection mode is on) so it\n // doesn't take up scarce screen real estate.\n const effectiveColumns = useMemo(\n () => (isMobile && !selectionMode ? columns.filter(c => c.key !== '_select') : columns),\n [columns, isMobile, selectionMode],\n );\n const {\n orderedColumns,\n allColumns,\n onResizeStart,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n toggleColumn,\n resetColumns,\n draggedIdx,\n dropGap,\n } = useColumnConfig(tableId, effectiveColumns);\n const { hasAnyPerm } = useShellAuth();\n const [pickerOpen, setPickerOpen] = useState(false);\n const [savingDefault, setSavingDefault] = useState(false);\n const [savedDefault, setSavedDefault] = useState(false);\n const pickerRef = useRef<HTMLDivElement>(null);\n const isAdmin = saveDefaultPerms.length > 0 && hasAnyPerm(saveDefaultPerms);\n\n useClickOutside(pickerRef, useCallback(() => { if (pickerOpen) setPickerOpen(false); }, [pickerOpen]));\n\n const totalWidth = orderedColumns.reduce((sum, col) => sum + col.width, 0);\n const colWidths = orderedColumns.map(col => `${(col.width / totalWidth) * 100}%`);\n\n const saveAsDefault = async () => {\n setSavingDefault(true);\n const visibleKeys = allColumns.filter(c => !c.hidden).map(c => c.key);\n const viewport = isMobile ? 'mobile' : 'desktop';\n try {\n await apiClient\n .patch(`/auth/default-columns/${tableId}/`, { visible_columns: visibleKeys }, { params: { viewport } })\n .catch(() =>\n apiClient.post('/auth/default-columns/', { table_id: tableId, viewport, visible_columns: visibleKeys }),\n );\n setSavedDefault(true);\n setTimeout(() => setSavedDefault(false), 2000);\n } catch { /* ignore */ }\n setSavingDefault(false);\n };\n\n const supportsSelection = useMemo(() => columns.some(c => c.key === '_select'), [columns]);\n\n return (\n <div className={`flex flex-col flex-1 min-h-0 ${isMobile ? '-mx-4' : ''}`}>\n {/* Fixed header */}\n <table className=\"w-full divide-y divide-gray-200 shrink-0\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n {orderedColumns.map((col, i) => (\n <col key={col.key} style={{ width: colWidths[i] }} />\n ))}\n </colgroup>\n <thead className=\"bg-gray-50\">\n <tr>\n {orderedColumns.map((col, idx) => {\n const colDef = columns.find(c => c.key === col.key);\n const sortField = colDef?.sortField ?? (col.key !== '_select' ? col.key : undefined);\n const isSorted = sort && sortField && sort.field === sortField;\n const isFixed = col.key === '_select';\n return (\n <th\n key={col.key}\n className={`px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase select-none relative ${draggedIdx === idx ? 'bg-blue-50' : ''}`}\n draggable={!isFixed}\n onDragStart={isFixed ? undefined : () => onDragStart(idx)}\n onDragOver={isFixed ? undefined : (e) => onDragOver(idx, e)}\n onDrop={isFixed ? undefined : (e) => onDrop(idx, e)}\n onDragEnd={isFixed ? undefined : onDragEnd}\n style={isFixed ? undefined : { cursor: 'grab' }}\n >\n <span\n className={`${isFixed ? '' : 'truncate pr-3'} block ${sortField && onSort ? 'cursor-pointer hover:text-gray-700' : ''}`}\n onClick={sortField && onSort ? (e) => { e.stopPropagation(); onSort(sortField); } : undefined}\n >\n {col.headerNode ?? col.label}\n {isSorted && <span className=\"ml-1\">{sort!.direction === 'asc' ? '▲' : '▼'}</span>}\n </span>\n {!isFixed && (\n <div\n className=\"absolute right-0 top-0 bottom-0 w-4 cursor-col-resize flex items-center justify-center z-10\"\n onMouseDown={(e) => onResizeStart(idx, e)}\n style={{ marginRight: -8 }}\n >\n <div className=\"w-0.5 h-full bg-gray-200 hover:bg-blue-500 transition-colors\" />\n </div>\n )}\n {dropGap === idx && (\n <div className=\"absolute left-0 top-0 bottom-0 w-0.5 bg-blue-500 z-20 pointer-events-none\" />\n )}\n {idx === orderedColumns.length - 1 && dropGap === orderedColumns.length && (\n <div className=\"absolute right-0 top-0 bottom-0 w-0.5 bg-blue-500 z-20 pointer-events-none\" />\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n </table>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto overflow-x-auto min-h-0\">\n <table className=\"w-full divide-y divide-gray-200\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n {orderedColumns.map((col, i) => (\n <col key={col.key} style={{ width: colWidths[i] }} />\n ))}\n </colgroup>\n {children(orderedColumns as any)}\n </table>\n {afterBody}\n </div>\n\n {/* Footer */}\n {footer !== undefined && (\n <div className=\"border-t border-gray-200 px-4 py-2 text-sm text-gray-500 shrink-0 flex items-center justify-between\">\n <span>{footer}</span>\n <div className=\"flex items-center gap-3 relative\" ref={pickerRef}>\n {isMobile && supportsSelection && (\n <button\n onClick={() => setSelectionMode(s => !s)}\n className={`text-[11px] px-2 py-0.5 rounded ${selectionMode ? 'bg-blue-600 text-white' : 'text-gray-500 hover:text-gray-700 border border-gray-300'}`}\n title={selectionMode ? 'Hide selection column' : 'Show selection column'}\n >\n {selectionMode ? 'Done' : 'Select'}\n </button>\n )}\n <button onClick={resetColumns} className=\"text-[10px] text-gray-400 hover:text-gray-600\">Reset</button>\n <button onClick={() => setPickerOpen(!pickerOpen)} className=\"text-gray-400 hover:text-gray-600\" title=\"Choose columns\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" />\n </svg>\n </button>\n {pickerOpen && (\n <div className=\"absolute bottom-full right-0 mb-1 w-52 rounded-2xl z-50 py-1 max-h-80 overflow-y-auto\" style={getGlassStyle()}>\n <p className=\"px-3 py-1.5 text-[10px] font-semibold text-gray-400 uppercase\">Columns</p>\n {allColumns.filter(col => col.key !== '_select').map(col => (\n <label key={col.key} className=\"flex items-center gap-2 px-3 py-1 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={!col.hidden}\n onChange={() => toggleColumn(col.key)}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n {col.label}\n </label>\n ))}\n {isAdmin && (\n <div className=\"border-t border-gray-100 mt-1 pt-1 px-3 pb-1\">\n <button onClick={saveAsDefault} disabled={savingDefault}\n className={`text-[10px] w-full text-center py-1 rounded ${savedDefault ? 'text-green-600' : 'text-gray-500 hover:text-blue-600'}`}>\n {savingDefault ? '...' : savedDefault ? 'Saved as default' : 'Save as default for all users'}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\ninterface ListFooterProps {\n selectedCount: number;\n loadedCount: number;\n totalCount?: number;\n label: string;\n isFetchingMore?: boolean;\n extra?: ReactNode;\n}\n\n/**\n * Standardized footer for `EntityList`. Shows:\n * \"[X selected — ] Y records\"\n * \"Y of Z records · Loading more...\"\n * \"All N records loaded\"\n */\nexport default function ListFooter({\n selectedCount,\n loadedCount,\n totalCount,\n label,\n isFetchingMore,\n extra,\n}: ListFooterProps) {\n const total = totalCount ?? loadedCount;\n const allLoaded = loadedCount >= total;\n\n return (\n <>\n {extra}\n {selectedCount > 0 ? `${selectedCount} selected — ` : ''}\n {allLoaded\n ? (totalCount != null ? `All ${total.toLocaleString()} ${label} loaded` : `${total.toLocaleString()} ${label}`)\n : `${loadedCount.toLocaleString()} of ${total.toLocaleString()} ${label}`\n }\n {isFetchingMore ? ' · Loading more...' : ''}\n </>\n );\n}\n","import type { ReactNode, RefObject, Dispatch, SetStateAction } from 'react';\nimport useTableNav from './useTableNav';\nimport ResizableTable from './ResizableTable';\nimport LoadingSpinner from '../shell/LoadingSpinner';\nimport ListFooter from './ListFooter';\n\nexport interface EntityListColumn {\n key: string;\n label: string;\n defaultWidth?: number;\n minWidth?: number;\n defaultHidden?: boolean;\n sortField?: string;\n headerNode?: ReactNode;\n}\n\nexport interface EntityListProps<T> {\n items: T[];\n isLoading: boolean;\n emptyState: ReactNode;\n totalCount?: number;\n\n tableId: string;\n columns: EntityListColumn[];\n renderCell: (item: T, colKey: string) => ReactNode;\n getRowId?: (item: T) => string | number;\n\n sort?: { field: string; direction: 'asc' | 'desc' };\n onSort?: (field: string) => void;\n\n selected: Set<string | number>;\n setSelected: Dispatch<SetStateAction<Set<string | number>>>;\n\n onRowClick: (item: T) => void;\n onRowHover?: (item: T) => void;\n getRowClassName?: (item: T) => string;\n\n footerLabel: string;\n footerExtra?: ReactNode;\n\n // Loose ref type so consumers on React 18 (RefObject<HTMLDivElement>) and\n // React 19 (RefObject<HTMLDivElement | null>) both type-check cleanly.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sentinelRef?: RefObject<any>;\n isFetchingNextPage?: boolean;\n\n /** Perm codenames that gate \"Save as default for all users\" in the column\n * picker. Defaults to `['change_numberingconfig']` (admin-portal's proxy\n * for admin access). Pass `[]` to hide the link entirely. */\n saveDefaultPerms?: string[];\n}\n\n/**\n * The canonical pageless data grid for both portals. Wraps `<ResizableTable>`\n * with selection-checkbox logic, keyboard navigation, the standardized list\n * footer, and an infinite-scroll sentinel hook-up.\n *\n * Usage:\n *\n * const { sort, onSort } = useSort('mid');\n * const { items, totalCount, isLoading, isFetchingNextPage, sentinelRef } =\n * useInfiniteScroll<Supplier>({ queryKey: ['suppliers', filters],\n * fetchFn: (p) => getSuppliers(p) });\n *\n * <EntityList\n * items={items}\n * totalCount={totalCount}\n * isLoading={isLoading}\n * sentinelRef={sentinelRef}\n * isFetchingNextPage={isFetchingNextPage}\n * tableId=\"suppliers\"\n * columns={SUPPLIER_COLUMNS}\n * renderCell={(s, k) => …}\n * sort={sort} onSort={onSort}\n * selected={selected} setSelected={setSelected}\n * onRowClick={(s) => openEntity('supplier', s.id, s, s.mid, '/suppliers')}\n * footerLabel=\"suppliers\"\n * emptyState={<EmptyState message=\"No suppliers yet.\" />}\n * />\n */\nexport default function EntityList<T>(props: EntityListProps<T>) {\n const {\n items, isLoading, emptyState, totalCount,\n tableId, columns, renderCell, getRowId = (item: any) => item.id,\n sort, onSort,\n selected, setSelected,\n onRowClick, onRowHover, getRowClassName,\n footerLabel, footerExtra,\n sentinelRef, isFetchingNextPage,\n saveDefaultPerms,\n } = props;\n\n const toggleItem = (item: T) => {\n setSelected(prev => {\n const next = new Set(prev);\n const id = getRowId(item);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n\n const toggleAll = () => {\n setSelected(prev => prev.size === items.length ? new Set() : new Set(items.map(getRowId)));\n };\n\n const selectRange = (from: number, to: number) => {\n setSelected(prev => {\n const next = new Set(prev);\n for (let i = from; i <= to; i++) next.add(getRowId(items[i]));\n return next;\n });\n };\n\n const focusIdx = useTableNav(items, onRowClick, toggleItem, toggleAll, selectRange);\n\n if (isLoading) return <LoadingSpinner />;\n if (items.length === 0) return <>{emptyState}</>;\n\n const allSelected = items.length > 0 && selected.size === items.length;\n\n const fullColumns: EntityListColumn[] = [\n {\n key: '_select',\n label: '',\n defaultWidth: 52,\n minWidth: 52,\n headerNode: (\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleAll}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n ),\n },\n ...columns,\n ];\n\n const footer = (\n <ListFooter\n selectedCount={selected.size}\n loadedCount={items.length}\n totalCount={totalCount}\n label={footerLabel}\n isFetchingMore={isFetchingNextPage}\n extra={footerExtra}\n />\n );\n\n const afterBody = sentinelRef ? (\n <>\n <div ref={sentinelRef} />\n {isFetchingNextPage && (\n <div className=\"text-center py-3\"><span className=\"text-sm text-gray-500\">Loading more...</span></div>\n )}\n </>\n ) : undefined;\n\n return (\n <div className=\"flex-1 flex flex-col mb-1 bg-white rounded-lg shadow overflow-hidden\">\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ResizableTable\n tableId={tableId}\n columns={fullColumns}\n sort={sort}\n onSort={onSort}\n footer={footer}\n afterBody={afterBody}\n saveDefaultPerms={saveDefaultPerms}\n >\n {(cols) => (\n <tbody className=\"divide-y divide-gray-100\">\n {items.map((item, rowIdx) => {\n const id = getRowId(item);\n return (\n <tr\n key={id}\n data-row-idx={rowIdx}\n className={`cursor-pointer ${focusIdx === rowIdx ? 'bg-blue-50 ring-1 ring-inset ring-blue-300' : selected.has(id) ? 'bg-blue-50 hover:bg-blue-100' : 'hover:bg-gray-50'} ${getRowClassName?.(item) ?? ''}`}\n onClick={() => onRowClick(item)}\n onMouseEnter={onRowHover ? () => onRowHover(item) : undefined}\n >\n {cols.map(col => (\n <td key={col.key} className=\"px-4 py-3 whitespace-nowrap text-sm overflow-hidden\">\n {col.key === '_select' ? (\n <input\n type=\"checkbox\"\n checked={selected.has(id)}\n onClick={e => { e.stopPropagation(); toggleItem(item); }}\n readOnly\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n ) : renderCell(item, col.key)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n )}\n </ResizableTable>\n </div>\n </div>\n );\n}\n","import { Fragment, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Generic, drag-and-drop Kanban board. Self-contained (native HTML5 DnD, no\n * library) and styled with the same Tailwind utilities + `grid-scroll` class the\n * shell already ships, so consumers get it for free.\n *\n * Group items into columns with `columnOf`, render each card with `renderCard`.\n * Cards can be dragged **between** columns (to change which column they belong\n * to) and **within** a column (to reorder / prioritise). On drop, `onMove(id,\n * toColumn, toIndex)` fires — `toIndex` is the target position within `toColumn`\n * measured against that column's cards *excluding* the dragged one, so the\n * consumer can persist an order (e.g. midpoint between neighbours) that every\n * user then sees. Sort each column by that order via `sortInColumn`.\n *\n * Affordance: a blue **drop-line** shows exactly where the card will land\n * (between two cards, in either the source or a different column), and the\n * target column highlights. The dragged card dims. The insertion point tracks\n * `dragenter` (once per card crossed) so the line stays stable rather than\n * flickering.\n */\nexport interface KanbanColumn {\n /** Stable column key — what `columnOf` returns and `onMove` receives. */\n value: string;\n label: string;\n /** Tailwind text + bg classes for the column header. */\n accent?: string;\n /** Tailwind bg class for the header dot. */\n dot?: string;\n}\n\nexport interface KanbanProps<T> {\n items: T[];\n columns: KanbanColumn[];\n columnOf: (item: T) => string;\n getId: (item: T) => string;\n /**\n * Fired on drop. `toColumn` is the destination column's `value`; `toIndex` is\n * the target position within that column measured against its cards\n * **excluding** the dragged card (0 = top). A same-column drop that wouldn't\n * change the order is not reported.\n */\n onMove: (id: string, toColumn: string, toIndex: number) => void;\n /** Inner card content — the card chrome (border, padding, hover) is provided. */\n renderCard: (item: T) => ReactNode;\n onCardClick?: (item: T) => void;\n /** Comparator for ordering within a column — sort by the persisted order field. */\n sortInColumn?: (a: T, b: T) => number;\n isLoading?: boolean;\n loadingText?: string;\n /** Shown when there are no items at all. */\n emptyState?: ReactNode;\n /** Placeholder text inside an empty column. */\n columnEmptyText?: string;\n}\n\ninterface OverState {\n col: string;\n index: number;\n}\n\nexport default function Kanban<T>({\n items,\n columns,\n columnOf,\n getId,\n onMove,\n renderCard,\n onCardClick,\n sortInColumn,\n isLoading = false,\n loadingText = 'Loading…',\n emptyState,\n columnEmptyText = 'Drop here',\n}: KanbanProps<T>) {\n const [dragId, setDragId] = useState<string | null>(null);\n const [over, setOver] = useState<OverState | null>(null);\n\n const grouped = useMemo(() => {\n const map: Record<string, T[]> = {};\n for (const c of columns) map[c.value] = [];\n for (const it of items) (map[columnOf(it)] ??= []).push(it);\n if (sortInColumn) for (const k of Object.keys(map)) map[k].sort(sortInColumn);\n return map;\n }, [items, columns, columnOf, sortInColumn]);\n\n const reset = () => {\n setDragId(null);\n setOver(null);\n };\n\n const commitMove = (col: string) => {\n if (dragId && over && over.col === col) {\n const colItems = grouped[col] ?? [];\n const dp = colItems.findIndex(it => getId(it) === dragId); // dragged's pos in this column, or -1\n const sameCol = dp !== -1;\n // Dropping right above or below itself changes nothing.\n const noop = sameCol && (over.index === dp || over.index === dp + 1);\n if (!noop) {\n // `over.index` counts the dragged card while it's still shown; remove it\n // from the count when the drop lands below its current slot.\n const toIndex = sameCol && over.index > dp ? over.index - 1 : over.index;\n onMove(dragId, col, toIndex);\n }\n }\n reset();\n };\n\n if (isLoading) return <div className=\"text-sm text-gray-500 p-4\">{loadingText}</div>;\n if (items.length === 0) {\n return <>{emptyState ?? <div className=\"text-sm text-gray-500 p-4\">No items.</div>}</>;\n }\n\n return (\n <div className=\"flex-1 overflow-x-auto grid-scroll\">\n <div className=\"flex gap-3 h-full min-w-max pb-2\">\n {columns.map(col => {\n const colItems = grouped[col.value] ?? [];\n const isOver = over !== null && over.col === col.value;\n const dp = dragId !== null ? colItems.findIndex(it => getId(it) === dragId) : -1;\n // The drop-line index, or -1 to hide it (incl. the no-op slots next to the dragged card).\n const lineAt = isOver && !(dp !== -1 && (over!.index === dp || over!.index === dp + 1)) ? over!.index : -1;\n return (\n <div\n key={col.value}\n className={`flex flex-col w-72 shrink-0 rounded-xl bg-gray-50 border transition-colors ${\n isOver ? 'border-blue-400 ring-2 ring-blue-300/60' : 'border-gray-200'\n }`}\n onDragOver={e => e.preventDefault()}\n onDrop={() => commitMove(col.value)}\n >\n <div\n className={`flex items-center justify-between px-3 py-2 rounded-t-xl text-sm font-medium ${\n col.accent ?? 'text-gray-700 bg-gray-100'\n }`}\n >\n <span className=\"flex items-center gap-2\">\n <span className={`h-2 w-2 rounded-full ${col.dot ?? 'bg-gray-400'}`} />\n {col.label}\n </span>\n <span className=\"text-xs opacity-70\">{colItems.length}</span>\n </div>\n <div\n className=\"flex-1 overflow-y-auto p-2 space-y-2 min-h-[120px]\"\n // Entering the column's empty area (not a card) targets the end.\n onDragEnter={() =>\n setOver(prev =>\n prev && prev.col === col.value && prev.index === colItems.length\n ? prev\n : { col: col.value, index: colItems.length },\n )\n }\n >\n {colItems.map((item, index) => {\n const id = getId(item);\n const isDragged = id === dragId;\n return (\n <Fragment key={id}>\n {lineAt === index && <div className=\"h-0.5 rounded-full bg-blue-500\" aria-hidden />}\n <div\n draggable\n onDragStart={e => {\n setDragId(id);\n try {\n e.dataTransfer.effectAllowed = 'move';\n } catch {\n /* some environments disallow setting this */\n }\n }}\n onDragEnter={e => {\n // Don't let the column's onDragEnter override this precise slot.\n e.stopPropagation();\n setOver(prev =>\n prev && prev.col === col.value && prev.index === index ? prev : { col: col.value, index },\n );\n }}\n onDragEnd={reset}\n onClick={onCardClick ? () => onCardClick(item) : undefined}\n style={dragId === null ? undefined : { opacity: isDragged ? 0.4 : 1, transition: 'opacity 120ms ease' }}\n className={`rounded-lg bg-white border border-gray-200 p-3 shadow-sm hover:border-blue-400 hover:shadow transition ${\n onCardClick ? 'cursor-pointer' : ''\n }`}\n >\n {renderCard(item)}\n </div>\n </Fragment>\n );\n })}\n {colItems.length > 0 && lineAt === colItems.length && (\n <div className=\"h-0.5 rounded-full bg-blue-500\" aria-hidden />\n )}\n {colItems.length === 0 && (\n <div\n className={`text-[11px] text-center rounded-lg transition-all duration-150 ${\n isOver\n ? 'border-2 border-dashed border-blue-300 bg-blue-50/50 text-blue-400 py-8'\n : 'text-gray-400 py-6'\n }`}\n >\n {columnEmptyText}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { PaginatedResponse } from './types';\n\ninterface UseInfiniteScrollOptions<T> {\n /** queryKey segments — arbitrary cache shapes (filters often include booleans,\n * dates, undefined). Callers pass their natural filter shape. */\n queryKey: (string | Record<string, unknown>)[];\n fetchFn: (params: Record<string, string>) => Promise<PaginatedResponse<T>>;\n /** Extra query-string params. Undefined values are dropped so axios doesn't\n * serialise them as \"?key=undefined\". */\n extraParams?: Record<string, string | undefined>;\n pageSize?: number;\n}\n\n/**\n * Wraps TanStack `useInfiniteQuery` with an IntersectionObserver-driven\n * sentinel so attaching `sentinelRef` to a div near the bottom of a scrollable\n * container auto-fires `fetchNextPage` as the user scrolls.\n *\n * Works inside modal windows too — the observer roots itself on the nearest\n * scrollable ancestor rather than the viewport.\n */\nexport function useInfiniteScroll<T>({\n queryKey,\n fetchFn,\n extraParams = {},\n pageSize: _pageSize = 25,\n}: UseInfiniteScrollOptions<T>) {\n void _pageSize; // reserved for future use; current backend defaults are fine\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n const cleanExtra = Object.fromEntries(\n Object.entries(extraParams).filter(([, v]) => v !== undefined),\n ) as Record<string, string>;\n\n const query = useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam = 1 }) =>\n fetchFn({ page: String(pageParam), ...cleanExtra }),\n getNextPageParam: (lastPage, allPages) => {\n if (lastPage.next) {\n return allPages.length + 1;\n }\n return undefined;\n },\n initialPageParam: 1,\n });\n\n const { fetchNextPage, hasNextPage, isFetchingNextPage } = query;\n\n const handleObserver = useCallback(\n (entries: IntersectionObserverEntry[]) => {\n const [entry] = entries;\n if (entry.isIntersecting && hasNextPage && !isFetchingNextPage) {\n fetchNextPage();\n }\n },\n [fetchNextPage, hasNextPage, isFetchingNextPage],\n );\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n\n // Find the nearest scrollable ancestor — using root:null (viewport) fails\n // when the list is inside a modal window because the sentinel can scroll\n // into view within the modal's own overflow container without ever\n // entering the viewport.\n let scrollParent: HTMLElement | null = el.parentElement;\n while (scrollParent) {\n const overflow = getComputedStyle(scrollParent).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') break;\n scrollParent = scrollParent.parentElement;\n }\n\n const observer = new IntersectionObserver(handleObserver, {\n root: scrollParent,\n rootMargin: '200px',\n threshold: 0,\n });\n\n observer.observe(el);\n return () => observer.disconnect();\n }, [handleObserver]);\n\n // Defensive: drop any null/undefined entries that creep in from a malformed\n // page payload (e.g. backend serializer returns null for soft-deleted\n // records). Otherwise downstream `.map(r => r.id)` blows up the whole list.\n const allItems = (query.data?.pages.flatMap((page) => page?.results ?? []) ?? [])\n .filter((x): x is T => x != null);\n const totalCount = query.data?.pages[0]?.count ?? 0;\n\n return {\n items: allItems,\n totalCount,\n isLoading: query.isLoading,\n isFetchingNextPage,\n hasNextPage: !!hasNextPage,\n sentinelRef,\n refetch: query.refetch,\n };\n}\n","import { useState } from 'react';\nimport type { SortState } from './types';\n\n/**\n * Tiny sort-state hook used by list pages. Returns:\n * - `sort` — current `{ field, direction }`\n * - `onSort(field)` — toggle direction if same field, else activate asc\n * - `ordering` — DRF-style string (`'-mid'` for desc, `'mid'` for asc) ready\n * to drop into a query-string param.\n */\nexport function useSort(defaultField: string, defaultDir: 'asc' | 'desc' = 'asc') {\n const [sort, setSort] = useState<SortState>({ field: defaultField, direction: defaultDir });\n\n const onSort = (field: string) => {\n setSort(prev =>\n prev.field === field\n ? { field, direction: prev.direction === 'asc' ? 'desc' : 'asc' }\n : { field, direction: 'asc' },\n );\n };\n\n const ordering = sort.direction === 'desc' ? `-${sort.field}` : sort.field;\n\n return { sort, onSort, ordering };\n}\n","/**\n * Shell-side entity fetcher — used by <WindowManager> when the user opens an\n * entity window. The shell knows the endpoint string (from the registry\n * entry) and the entity ID; the consumer translates that into an HTTP call\n * (or a mock, or whatever).\n *\n * Without a provider, the shell will throw if any code path tries to fetch\n * an entity — this is by design: a host that registers entity windows MUST\n * also wire the fetcher, or the open-entity flow has nothing to call.\n */\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport type EntityFetcher = (endpoint: string, id: string) => Promise<any>;\n\nconst EntityFetcherContext = createContext<EntityFetcher | null>(null);\n\nexport function ShellEntityFetcherProvider({\n value,\n children,\n}: { value: EntityFetcher; children: ReactNode }) {\n return <EntityFetcherContext.Provider value={value}>{children}</EntityFetcherContext.Provider>;\n}\n\n/** Returns the consumer-supplied entity fetcher, or a stub that throws\n * on call. Components that fetch entities call this hook eagerly so any\n * misconfiguration surfaces synchronously rather than at click-time. */\nexport function useShellEntityFetcher(): EntityFetcher {\n const ctx = useContext(EntityFetcherContext);\n return ctx ?? ((endpoint: string) => {\n throw new Error(\n `react-os-shell: cannot fetch ${endpoint} — no <ShellEntityFetcherProvider> mounted. ` +\n `If your app registers entity windows, supply an entityFetcher.`\n );\n });\n}\n","import { useEffect } from 'react';\n\n/**\n * Registers Alt+Shift+N (Windows) / Opt+Shift+N (Mac) hotkey to trigger a \"New\" action.\n * Uses e.code (physical key) to avoid locale/modifier character issues.\n */\nexport default function useNewHotkey(callback: () => void) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const isN = e.code === 'KeyN' || e.key === 'N' || e.key === 'n';\n if (e.altKey && e.shiftKey && isN && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n callback();\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [callback]);\n}\n","import { useEffect } from 'react';\nimport { useModalActive } from '../shell/Modal';\n\n/**\n * Registers Alt+Shift+E (Windows) / Opt+Shift+E (Mac) hotkey to trigger an \"Edit\" action.\n * Uses e.code (physical key) to avoid locale/modifier character issues.\n * Only fires for the active (frontmost) modal.\n */\nexport default function useEditHotkey(callback: (() => void) | null) {\n const isActive = useModalActive();\n useEffect(() => {\n if (!callback || !isActive) return;\n const handler = (e: KeyboardEvent) => {\n const isE = e.code === 'KeyE' || e.key === 'E' || e.key === 'e';\n if (e.altKey && e.shiftKey && isE && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n callback();\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [callback, isActive]);\n}\n"]}
1
+ {"version":3,"sources":["../src/windowRegistry/createWindowRegistry.ts","../src/shell/GlobalSearch.tsx","../src/shell/Kbd.tsx","../src/shell/ShortcutHelp.tsx","../src/shell/Markdown.tsx","../src/shell/HelpCenter.tsx","../src/shell/SidebarLayout.tsx","../src/shell/NotificationBell.tsx","../src/shell/BugReportDialog.tsx","../src/shell/BugReportDetail.tsx","../src/shell/StatusBadge.tsx","../src/utils/env.ts","../src/shell/DevIndicator.tsx","../src/shell/WidgetManager.tsx","../src/version.ts","../src/changelog.ts","../src/utils/reportBug.ts","../src/shell/Desktop.tsx","../src/hooks/useTheme.ts","../src/hooks/useClickOutside.ts","../src/shell/StartupAnimation.tsx","../src/shell/LogoutAnimation.tsx","../src/shell/StartMenu.tsx","../src/shell/mobileShellStore.ts","../src/shell/MobileHome.tsx","../src/shell/MobileSwitcher.tsx","../src/shell/MobileNotificationSheet.tsx","../src/shell/MobileProfileSheet.tsx","../src/shell/MobileShell.tsx","../src/shell/Layout.tsx","../src/settings/Customization.tsx","../src/settings/BehaviorPanel.tsx","../src/settings/SoundsPanel.tsx","../src/settings/SystemPreferences.tsx","../src/data/useTableNav.ts","../src/data/useColumnConfig.ts","../src/data/ResizableTable.tsx","../src/data/ListFooter.tsx","../src/data/EntityList.tsx","../src/data/Kanban.tsx","../src/data/useInfiniteScroll.ts","../src/data/useSort.ts","../src/shell/ShellEntityFetcher.tsx","../src/hooks/useNewHotkey.ts","../src/hooks/useEditHotkey.ts"],"names":["useState","useEffect","jsxs","jsx","useRef","useCallback","Fragment","Dialog","DialogBackdrop","DialogPanel","useQueryClient","createContext","useContext","useMemo","previewColor","isValidElement","cloneElement","e","entries","dx","dy","move","navSections","navIcons","sectionIcons","useLayoutEffect","Suspense","timeAgo","useQuery","useSyncExternalStore","lazy","isCustom","sections","useMutation"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * createWindowRegistry — composes a window registry from one or more partial\n * registry maps. Used at the consumer's App layer to merge package-bundled\n * apps with the consumer's own entity windows.\n *\n * const windows = createWindowRegistry(\n * bundledApps, // utility apps + games + Google apps from the package\n * entityWindows, // consumer-defined entity windows (e.g. Sales Order, Invoice)\n * );\n *\n * Later partials override earlier ones on the same key — handy when a\n * consumer wants to swap a built-in app for their own variant.\n */\nimport type { WindowRegistry } from './types';\n\nexport function createWindowRegistry(...partials: WindowRegistry[]): WindowRegistry {\n return Object.assign({}, ...partials);\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { useWindowManager } from './WindowManager';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\n\nexport interface SearchResult {\n /** Category label, e.g. \"Sales Order\". */\n type: string;\n /** Primary text shown in the result row. */\n label: string;\n /** Optional secondary line. */\n sub?: string;\n /** Window-registry key passed to openEntity. */\n entity_type: string;\n entity_id: string;\n}\n\n/** A search provider — given a query, returns matching results. The shell\n * calls every provider in parallel and concatenates the responses. */\nexport type SearchProvider = (query: string) => Promise<SearchResult[]>;\n\n/** Bundle of search-related consumer config. */\nexport interface SearchConfig {\n providers: SearchProvider[];\n /** Per-result-type icon (SVG path `d` attribute). Unmatched types fall\n * back to a generic magnifier glyph. */\n typeIcons?: Record<string, string>;\n placeholder?: string;\n}\n\ninterface GlobalSearchProps extends Partial<SearchConfig> {}\n\nconst DEFAULT_MAGNIFIER = 'M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z';\n\nexport default function GlobalSearch({ providers, typeIcons, placeholder = 'Search...' }: GlobalSearchProps = {}) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [activeIdx, setActiveIdx] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const { openEntity } = useWindowManager();\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n\n // Hotkey: Cmd+K / Ctrl+K\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault();\n setOpen(prev => !prev);\n }\n if (e.key === 'Escape' && open) {\n setOpen(false);\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [open]);\n\n useEffect(() => {\n if (open) {\n setTimeout(() => inputRef.current?.focus(), 50);\n } else {\n setQuery('');\n setResults([]);\n }\n }, [open]);\n\n // Debounced search across all providers\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (query.length < 2) { setResults([]); return; }\n if (!providers || providers.length === 0) { setResults([]); return; }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const responses = await Promise.all(providers.map(p => p(query).catch(() => [] as SearchResult[])));\n setResults(responses.flat());\n setActiveIdx(0);\n } catch { setResults([]); }\n setLoading(false);\n }, 250);\n return () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\n }, [query, providers]);\n\n const handleSelect = useCallback((result: SearchResult) => {\n setOpen(false);\n openEntity(result.entity_type, result.entity_id, null, result.label);\n }, [openEntity]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') { e.preventDefault(); setActiveIdx(i => Math.min(i + 1, results.length - 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setActiveIdx(i => Math.max(i - 1, 0)); }\n else if (e.key === 'Enter' && results[activeIdx]) { handleSelect(results[activeIdx]); }\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-[200] flex items-start justify-center pt-[15vh]\" onClick={() => setOpen(false)}>\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" />\n <div className=\"relative z-10 w-full max-w-xl rounded-2xl overflow-hidden\" onClick={e => e.stopPropagation()} style={getGlassStyle()}>\n {/* Search input */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-gray-200\">\n <svg className=\"h-5 w-5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={DEFAULT_MAGNIFIER} />\n </svg>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex-1 text-sm bg-transparent border-0 outline-none placeholder-gray-400\"\n />\n <kbd className=\"hidden sm:inline-flex items-center rounded border border-gray-300 px-1.5 py-0.5 text-[10px] font-medium text-gray-400\">ESC</kbd>\n </div>\n\n {/* Results */}\n <div className=\"max-h-[50vh] overflow-y-auto\">\n {loading && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">Searching...</div>\n )}\n {!loading && query.length >= 2 && results.length === 0 && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">No results found.</div>\n )}\n {!loading && results.length > 0 && (\n <ul className=\"py-2\">\n {results.map((r, i) => (\n <li key={`${r.type}-${r.label}-${i}`}>\n <button\n className={`flex items-center gap-3 w-full px-4 py-2.5 text-left transition-colors ${\n i === activeIdx ? 'bg-blue-50' : 'hover:bg-gray-50'\n }`}\n onClick={() => handleSelect(r)}\n onMouseEnter={() => setActiveIdx(i)}\n >\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={typeIcons?.[r.type] || DEFAULT_MAGNIFIER} />\n </svg>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">{r.label}</p>\n {r.sub && <p className=\"text-xs text-gray-400 truncate\">{r.sub}</p>}\n </div>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-500\">{r.type}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {!loading && query.length < 2 && (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400\">Type at least 2 characters to search...</div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-gray-100 bg-gray-50 text-[11px] text-gray-400\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">&uarr;</kbd><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">&darr;</kbd> navigate</span>\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">Enter</kbd> open</span>\n </div>\n <span className=\"flex items-center gap-1\"><kbd className=\"rounded border border-gray-300 px-1 py-0.5 font-medium\">Esc</kbd> close</span>\n </div>\n </div>\n </div>\n );\n}\n","export const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\n/** Platform-aware modifier symbols */\nexport const MOD = isMac ? '\\u2318' : 'Ctrl';\nexport const ALT = isMac ? '\\u2325' : 'Alt';\nexport const SHIFT = '\\u21E7';\nexport const ENTER = '\\u23CE';\n\n/** Common shortcut labels */\nexport const CMD_ENTER = isMac ? '\\u2318\\u23CE' : 'Ctrl\\u23CE';\nexport const CMD_S = isMac ? '\\u2318S' : 'Ctrl+S';\nexport const CMD_K = isMac ? '\\u2318K' : 'Ctrl+K';\nexport const CMD_DOT = isMac ? '\\u2318.' : 'Ctrl+.';\nexport const CMD_A = isMac ? '\\u2318A' : 'Ctrl+A';\nexport const ALT_SHIFT_D = isMac ? '\\u2325\\u21E7D' : 'Alt+Shift+D';\nexport const ALT_SHIFT_E = isMac ? '\\u2325\\u21E7E' : 'Alt+Shift+E';\nexport const ALT_SHIFT_N = isMac ? '\\u2325\\u21E7N' : 'Alt+Shift+N';\n","import { useState, useEffect } from 'react';\nimport { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react';\nimport { CMD_ENTER, CMD_S, CMD_K, CMD_DOT, CMD_A, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N } from './Kbd';\n\nconst sections = [\n {\n title: 'Global',\n shortcuts: [\n { keys: CMD_K, description: 'Search' },\n { keys: CMD_DOT, description: 'Toggle sidebar' },\n { keys: 'Ctrl F11', description: 'Toggle fullscreen' },\n { keys: 'ESC', description: 'Exit fullscreen (when no windows open)' },\n { keys: '?', description: 'Show keyboard shortcuts' },\n ],\n },\n {\n title: 'Lists',\n shortcuts: [\n { keys: 'J / \\u2193', description: 'Next row' },\n { keys: 'K / \\u2191', description: 'Previous row' },\n { keys: '\\u23CE', description: 'Open selected row' },\n { keys: '\\u21E7J / \\u21E7K', description: 'Move and select' },\n { keys: '\\u21E7 Click', description: 'Range select' },\n { keys: 'Space', description: 'Toggle row checkbox' },\n { keys: CMD_A, description: 'Select / deselect all' },\n { keys: ALT_SHIFT_N, description: 'Create new item' },\n { keys: ALT_SHIFT_E, description: 'Edit selected item' },\n ],\n },\n {\n title: 'Modals / Forms',\n shortcuts: [\n { keys: CMD_ENTER, description: 'Submit' },\n { keys: CMD_S, description: 'Save' },\n { keys: ALT_SHIFT_D, description: 'Save as new (duplicate)' },\n { keys: 'ESC', description: 'Close modal' },\n ],\n },\n];\n\nexport default function ShortcutHelp() {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n const toggle = () => setOpen(prev => !prev);\n document.addEventListener('toggle-shortcut-help', toggle);\n return () => document.removeEventListener('toggle-shortcut-help', toggle);\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === '?' && !e.metaKey && !e.ctrlKey && !e.altKey) {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.target as HTMLElement)?.isContentEditable) return;\n e.preventDefault();\n setOpen(prev => !prev);\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, []);\n\n return (\n <Dialog open={open} onClose={() => setOpen(false)} className=\"relative z-[9999]\">\n <DialogBackdrop className=\"fixed inset-0 bg-black/30 transition-opacity\" />\n <div className=\"fixed inset-0 flex items-center justify-center p-6\">\n <DialogPanel className=\"w-full max-w-md rounded-lg bg-white shadow-xl\">\n <div className=\"flex items-center justify-between px-5 pt-5 pb-3 border-b border-gray-200\">\n <h2 className=\"text-base font-semibold text-gray-900\">Keyboard Shortcuts</h2>\n <button onClick={() => setOpen(false)} className=\"text-gray-400 hover:text-gray-500 text-sm\">\n ESC\n </button>\n </div>\n <div className=\"px-5 py-4 space-y-5 max-h-[60vh] overflow-y-auto\">\n {sections.map(section => (\n <div key={section.title}>\n <h3 className=\"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2\">{section.title}</h3>\n <div className=\"space-y-1.5\">\n {section.shortcuts.map(s => (\n <div key={s.keys + s.description} className=\"flex items-center justify-between\">\n <span className=\"text-sm text-gray-700\">{s.description}</span>\n <kbd className=\"inline-flex items-center rounded border border-gray-300 bg-gray-50 px-2 py-0.5 text-xs font-medium text-gray-600 font-mono\">\n {s.keys}\n </kbd>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n <div className=\"px-5 py-3 border-t border-gray-100 text-center\">\n <span className=\"text-xs text-gray-400\">Press <kbd className=\"rounded border border-gray-300 bg-gray-50 px-1.5 py-0.5 text-[10px] font-medium text-gray-500\">?</kbd> to toggle</span>\n </div>\n </DialogPanel>\n </div>\n </Dialog>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Dependency-free Markdown renderer for help / documentation bodies.\n *\n * Supports the subset used by in-app articles: ATX headings (`##`–`####`),\n * **bold**, *italic*, `inline code`, [links](url), bullet and numbered lists\n * (with wrapped continuation lines), GitHub-style pipe **tables**, `>`\n * blockquote **callouts**, `---` rules, paragraphs, and image syntax\n * `![alt](src)` — which renders as a labelled *screenshot placeholder* box\n * (manual images may not exist yet). Unrecognised syntax degrades to plain\n * text, so author-written articles never break the page. No raw HTML is\n * interpreted.\n */\n\nconst INLINE_RE =\n /!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\*([^*]+)\\*/g;\n\nfunction renderInline(text: string): ReactNode[] {\n const out: ReactNode[] = [];\n let last = 0;\n let key = 0;\n let m: RegExpExecArray | null;\n INLINE_RE.lastIndex = 0;\n while ((m = INLINE_RE.exec(text)) !== null) {\n if (m.index > last) out.push(text.slice(last, m.index));\n if (m[1] !== undefined) {\n out.push(\n <span key={key++} className=\"text-gray-400\">\n [{m[1]}]\n </span>,\n );\n } else if (m[3] !== undefined) {\n out.push(\n <a\n key={key++}\n href={m[4]}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-blue-600 hover:underline\"\n >\n {m[3]}\n </a>,\n );\n } else if (m[5] !== undefined) {\n out.push(\n <strong key={key++} className=\"font-semibold text-gray-900\">\n {m[5]}\n </strong>,\n );\n } else if (m[6] !== undefined) {\n out.push(\n <code\n key={key++}\n className=\"rounded bg-gray-100 px-1 py-0.5 font-mono text-[0.85em] text-gray-800\"\n >\n {m[6]}\n </code>,\n );\n } else if (m[7] !== undefined) {\n out.push(<em key={key++}>{m[7]}</em>);\n }\n last = INLINE_RE.lastIndex;\n }\n if (last < text.length) out.push(text.slice(last));\n return out;\n}\n\nfunction ScreenshotPlaceholder({ alt }: { alt: string }) {\n const label = alt.replace(/^screenshot:\\s*/i, '');\n return (\n <div className=\"my-1 flex items-start gap-2 rounded-lg border border-dashed border-gray-300 bg-gray-50 px-3 py-2.5\">\n <svg\n className=\"mt-0.5 h-4 w-4 shrink-0 text-gray-400\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 6a1.5 1.5 0 0 1 1.5-1.5h1.1l.4-.9a1 1 0 0 1 .9-.6h6.2a1 1 0 0 1 .9.6l.4.9h1.1A1.5 1.5 0 0 1 18 6v8.5A1.5 1.5 0 0 1 16.5 16h-13A1.5 1.5 0 0 1 2 14.5V6Zm7.5 1.5a3.25 3.25 0 1 0 0 6.5 3.25 3.25 0 0 0 0-6.5Z\" />\n </svg>\n <span className=\"text-xs text-gray-500\">\n <span className=\"font-medium text-gray-600\">Screenshot — </span>\n {label}\n </span>\n </div>\n );\n}\n\n/** Collect list items, merging wrapped continuation lines into their item. */\nfunction collectItems(lines: string[], itemRe: RegExp): string[] {\n const items: string[] = [];\n for (const line of lines) {\n const m = itemRe.exec(line);\n if (m) {\n items.push(m[1]);\n } else if (items.length) {\n items[items.length - 1] += ' ' + line.trim();\n }\n }\n return items;\n}\n\nconst splitCells = (line: string): string[] =>\n line\n .replace(/^\\s*\\|/, '')\n .replace(/\\|\\s*$/, '')\n .split('|')\n .map(c => c.trim());\n\n/** A pipe table: header row, a `---|---` separator, then body rows. */\nfunction isTable(lines: string[]): boolean {\n return (\n lines.length >= 2 &&\n lines[0].includes('|') &&\n /^\\s*\\|?[\\s:|-]*-[\\s:|-]*\\|?\\s*$/.test(lines[1]) &&\n lines[1].includes('-')\n );\n}\n\nfunction renderTable(lines: string[], key: number): ReactNode {\n const header = splitCells(lines[0]);\n const rows = lines.slice(2).map(splitCells);\n return (\n <div key={key} className=\"my-1 overflow-x-auto rounded-lg border border-gray-200\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"bg-gray-50\">\n {header.map((h, i) => (\n <th\n key={i}\n className=\"border-b border-gray-200 px-3 py-1.5 text-left font-semibold text-gray-700\"\n >\n {renderInline(h)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={r} className=\"even:bg-gray-50/50\">\n {row.map((c, i) => (\n <td key={i} className=\"border-t border-gray-100 px-3 py-1.5 align-top text-gray-700\">\n {renderInline(c)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction renderBlock(block: string, key: number): ReactNode {\n const lines = block.split('\\n');\n const first = lines[0];\n\n const heading = /^(#{2,4})\\s+(.*)$/.exec(first);\n if (heading && lines.length === 1) {\n const level = heading[1].length;\n const Tag = (`h${level}` as 'h2');\n const cls =\n level === 2\n ? 'mt-2 text-[13px] font-semibold uppercase tracking-wide text-gray-500'\n : level === 3\n ? 'mt-1 text-base font-semibold text-gray-900'\n : 'mt-1 text-sm font-semibold text-gray-900';\n return (\n <Tag key={key} className={cls}>\n {renderInline(heading[2])}\n </Tag>\n );\n }\n\n if (lines.length === 1 && /^---+$/.test(first)) {\n return <hr key={key} className=\"border-gray-200\" />;\n }\n\n if (isTable(lines)) {\n return renderTable(lines, key);\n }\n\n if (/^>\\s?/.test(first)) {\n const text = lines.map(l => l.replace(/^>\\s?/, '')).join(' ');\n return (\n <div\n key={key}\n className=\"my-1 rounded-r-lg border-l-4 border-blue-300 bg-blue-50/60 px-3 py-2 text-gray-700\"\n >\n {renderInline(text)}\n </div>\n );\n }\n\n const img = /^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/.exec(first);\n if (img && lines.length === 1) {\n return <ScreenshotPlaceholder key={key} alt={img[1]} />;\n }\n\n if (/^[-*]\\s+/.test(first)) {\n const items = collectItems(lines, /^[-*]\\s+(.*)$/);\n return (\n <ul key={key} className=\"list-disc space-y-1 pl-5 marker:text-gray-400\">\n {items.map((it, j) => (\n <li key={j}>{renderInline(it)}</li>\n ))}\n </ul>\n );\n }\n\n const ordered = /^(\\d+)\\.\\s+/.exec(first);\n if (ordered) {\n const items = collectItems(lines, /^\\d+\\.\\s+(.*)$/);\n return (\n <ol\n key={key}\n start={Number(ordered[1])}\n className=\"list-decimal space-y-1 pl-5 marker:text-gray-400\"\n >\n {items.map((it, j) => (\n <li key={j} className=\"pl-1\">\n {renderInline(it)}\n </li>\n ))}\n </ol>\n );\n }\n\n return <p key={key}>{renderInline(lines.join(' '))}</p>;\n}\n\nexport interface MarkdownProps {\n children: string;\n className?: string;\n}\n\nexport default function Markdown({ children, className }: MarkdownProps) {\n const blocks = (children ?? '')\n .replace(/\\r\\n/g, '\\n')\n .split(/\\n{2,}/)\n .map(b => b.replace(/\\s+$/, ''))\n .filter(b => b.trim() !== '');\n\n return (\n <div className={`space-y-3 text-sm leading-relaxed text-gray-700 ${className ?? ''}`.trim()}>\n {blocks.map((block, i) => renderBlock(block, i))}\n </div>\n );\n}\n","import { useMemo, useState, type ReactNode } from 'react';\nimport Markdown from './Markdown';\n\n/**\n * One help article. Generic shape — the consuming portal maps its own\n * help-doc records onto this before passing them in.\n */\nexport interface HelpCenterDoc {\n id: string;\n slug: string;\n title: string;\n body: string;\n /** Grouping key (e.g. `'getting_started'`). */\n category: string;\n /** Group header text (e.g. \"Getting Started\"). */\n category_label: string;\n /** When `false`, a \"Draft\" badge is shown. Omit for always-published docs. */\n is_published?: boolean;\n}\n\nexport interface HelpCenterProps {\n docs: HelpCenterDoc[];\n loading?: boolean;\n /**\n * Category keys in display order. Categories not listed fall to the end in\n * first-seen order. Without it, groups follow first-seen order.\n */\n categoryOrder?: string[];\n /** Show the New/Edit affordances (consumer gates this on write permission). */\n canEdit?: boolean;\n onNew?: () => void;\n onEdit?: (doc: HelpCenterDoc) => void;\n /** Custom body renderer; defaults to preformatted text. */\n renderBody?: (doc: HelpCenterDoc) => ReactNode;\n emptyMessage?: string;\n}\n\ninterface Group {\n key: string;\n label: string;\n docs: HelpCenterDoc[];\n}\n\nconst Chevron = ({ open }: { open: boolean }) => (\n <svg\n className={`h-3.5 w-3.5 shrink-0 text-gray-400 transition-transform ${open ? 'rotate-90' : ''}`}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 0 1 .02-1.06L11.168 10 7.23 6.29a.75.75 0 1 1 1.04-1.08l4.5 4.25a.75.75 0 0 1 0 1.08l-4.5 4.25a.75.75 0 0 1-1.06-.02Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * In-app help / documentation viewer. Two panes: a searchable, collapsible\n * category tree on the left, the selected article's body on the right.\n *\n * Presentational only — it holds no API or permission knowledge. The consumer\n * fetches its own help docs, maps them to `HelpCenterDoc`, and (for editors)\n * wires `canEdit` + `onNew`/`onEdit` to its own create/edit UI.\n *\n * Search is client-side: a case-insensitive substring match over title, body\n * and category label. While searching, matching groups auto-expand.\n */\nexport default function HelpCenter({\n docs,\n loading = false,\n categoryOrder,\n canEdit = false,\n onNew,\n onEdit,\n renderBody,\n emptyMessage = 'No help articles yet.',\n}: HelpCenterProps) {\n const [query, setQuery] = useState('');\n const [selectedSlug, setSelectedSlug] = useState<string | null>(null);\n // Per-category open/closed override. A category absent from the map uses its\n // default (only the selected article's group starts open).\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const q = query.trim().toLowerCase();\n\n // Group docs by category, preserving categoryOrder then first-seen order.\n const groups = useMemo<Group[]>(() => {\n const map = new Map<string, Group>();\n for (const doc of docs) {\n let g = map.get(doc.category);\n if (!g) {\n g = { key: doc.category, label: doc.category_label || doc.category, docs: [] };\n map.set(doc.category, g);\n }\n g.docs.push(doc);\n }\n if (!categoryOrder?.length) return [...map.values()];\n const rank = new Map(categoryOrder.map((k, i) => [k, i]));\n return [...map.values()].sort(\n (a, b) => (rank.get(a.key) ?? Infinity) - (rank.get(b.key) ?? Infinity),\n );\n }, [docs, categoryOrder]);\n\n const matches = (doc: HelpCenterDoc) =>\n !q ||\n doc.title.toLowerCase().includes(q) ||\n doc.body.toLowerCase().includes(q) ||\n doc.category_label.toLowerCase().includes(q);\n\n // Groups with their docs filtered by the search query; empty groups drop out.\n const visibleGroups = useMemo<Group[]>(\n () =>\n groups\n .map(g => ({ ...g, docs: g.docs.filter(matches) }))\n .filter(g => g.docs.length > 0),\n [groups, q],\n );\n\n const visibleDocs = useMemo(() => visibleGroups.flatMap(g => g.docs), [visibleGroups]);\n\n // Keep the chosen article if it's still visible, else fall back to the first\n // visible one (so typing a query jumps to the first match).\n const selected =\n (selectedSlug ? visibleDocs.find(d => d.slug === selectedSlug) : undefined) ??\n visibleDocs[0] ??\n null;\n\n const isGroupOpen = (key: string) =>\n q ? true : (expanded[key] ?? key === selected?.category);\n\n const toggleGroup = (key: string) =>\n setExpanded(prev => ({ ...prev, [key]: !isGroupOpen(key) }));\n\n return (\n <div className=\"flex h-full gap-4 px-4 py-3 min-h-0\">\n <aside className=\"w-64 shrink-0 flex flex-col bg-white rounded-lg shadow overflow-hidden\">\n <div className=\"flex items-center justify-between gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <h2 className=\"text-sm font-semibold text-gray-900\">Help</h2>\n {canEdit && onNew && (\n <button type=\"button\" onClick={onNew} className=\"text-xs text-blue-600 hover:underline\">\n + New\n </button>\n )}\n </div>\n\n <div className=\"px-2.5 py-2 border-b border-gray-100 shrink-0\">\n <div className=\"relative\">\n <svg\n className=\"pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M9 3.5a5.5 5.5 0 1 0 3.36 9.85l3.14 3.15a.75.75 0 1 0 1.06-1.06l-3.15-3.14A5.5 5.5 0 0 0 9 3.5ZM5 9a4 4 0 1 1 8 0 4 4 0 0 1-8 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <input\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n placeholder=\"Search help…\"\n className=\"w-full rounded-md border border-gray-300 bg-white py-1.5 pl-8 pr-2 text-sm shadow-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto py-1\">\n {loading ? (\n <p className=\"px-3 py-6 text-center text-xs text-gray-400\">Loading…</p>\n ) : visibleGroups.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-xs text-gray-500\">\n {q ? 'No articles match your search.' : emptyMessage}\n </p>\n ) : (\n visibleGroups.map(group => {\n const open = isGroupOpen(group.key);\n return (\n <div key={group.key} className=\"py-0.5\">\n <button\n type=\"button\"\n onClick={() => toggleGroup(group.key)}\n className=\"w-full flex items-center gap-1.5 px-3 py-1.5 text-left text-[10px] font-semibold uppercase tracking-wide text-gray-400 hover:text-gray-600\"\n >\n <Chevron open={open} />\n <span className=\"truncate\">{group.label}</span>\n </button>\n {open &&\n group.docs.map(doc => {\n const active = selected?.slug === doc.slug;\n return (\n <button\n key={doc.slug}\n type=\"button\"\n onClick={() => setSelectedSlug(doc.slug)}\n className={`w-full text-left pl-8 pr-3 py-1.5 text-sm flex items-center gap-1.5 transition-colors ${\n active\n ? 'bg-blue-50 text-blue-700 font-medium'\n : 'text-gray-700 hover:bg-gray-50'\n }`}\n >\n <span className=\"truncate\">{doc.title}</span>\n {doc.is_published === false && (\n <span className=\"ml-auto shrink-0 text-[10px] text-amber-600\">Draft</span>\n )}\n </button>\n );\n })}\n </div>\n );\n })\n )}\n </div>\n </aside>\n\n <main className=\"flex-1 min-w-0 bg-white rounded-lg shadow overflow-hidden flex flex-col\">\n {selected ? (\n <>\n <div className=\"flex items-start justify-between gap-4 px-5 py-3 border-b border-gray-200 bg-gray-50 shrink-0\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold text-gray-900 truncate\">{selected.title}</h1>\n <p className=\"text-xs text-gray-500 mt-0.5\">\n {selected.category_label}\n {selected.is_published === false && (\n <span className=\"ml-2 text-amber-600\">· Draft</span>\n )}\n </p>\n </div>\n {canEdit && onEdit && (\n <button\n type=\"button\"\n onClick={() => onEdit(selected)}\n className=\"shrink-0 text-sm text-blue-600 hover:underline\"\n >\n Edit\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-auto px-5 py-4\">\n {renderBody ? (\n renderBody(selected)\n ) : selected.body ? (\n <Markdown>{selected.body}</Markdown>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">This article has no body yet.</p>\n )}\n </div>\n </>\n ) : (\n <div className=\"flex-1 flex items-center justify-center px-6 text-center\">\n <p className=\"text-sm text-gray-500\">\n {loading ? 'Loading…' : 'Pick a help article from the left.'}\n </p>\n </div>\n )}\n </main>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent } from 'react';\n\n/**\n * Two-pane layout with a drag-to-resize sidebar (left or right).\n *\n * Renders flush (`h-full w-full`) — pair it with a `flushBody` window so the\n * sidebar runs from just under the title bar to the very bottom with no\n * surrounding padding. The user can drag the sidebar's inner edge to resize\n * it; pass `storageKey` to persist that width across reopens, or double-click\n * the handle to reset to `defaultWidth`. Set `side=\"right\"` to put the sidebar\n * on the right (e.g. a detail-panel layout).\n *\n * @example\n * <SidebarLayout sidebar={<MyNav />} storageKey=\"todo.sidebarWidth\">\n * <MyContent />\n * </SidebarLayout>\n */\nexport interface SidebarLayoutProps {\n /** Content of the left sidebar pane. */\n sidebar: ReactNode;\n /** Content of the main pane (opposite the sidebar). */\n children: ReactNode;\n /** Which side the sidebar sits on. Default `'left'`. When `'right'`, the\n * sidebar renders on the right with the resize handle on its left edge. */\n side?: 'left' | 'right';\n /** localStorage key to persist the sidebar width across reopens. When set,\n * the last dragged width is restored on mount. Omit for session-only width. */\n storageKey?: string;\n /** Initial sidebar width in px (used when nothing is persisted). Default 256. */\n defaultWidth?: number;\n /** Minimum sidebar width in px. Default 180. */\n minWidth?: number;\n /** Maximum sidebar width in px. Default 480. */\n maxWidth?: number;\n /** Extra classes for the outer flex row. */\n className?: string;\n /** Classes for the sidebar pane (background, border, …). The pane is a flex\n * column that scrolls its own overflow. Defaults to a light-grey,\n * right-bordered sidebar. */\n sidebarClassName?: string;\n /** Classes for the main content pane. Defaults to a white background. */\n contentClassName?: string;\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi);\n\nexport default function SidebarLayout({\n sidebar,\n children,\n side = 'left',\n storageKey,\n defaultWidth = 256,\n minWidth = 180,\n maxWidth = 480,\n className = '',\n sidebarClassName = side === 'right'\n ? 'border-l border-gray-200 bg-gray-50'\n : 'border-r border-gray-200 bg-gray-50',\n contentClassName = 'bg-white',\n}: SidebarLayoutProps) {\n const sideRight = side === 'right';\n const [width, setWidth] = useState<number>(() => {\n if (storageKey && typeof window !== 'undefined') {\n const saved = window.localStorage.getItem(storageKey);\n const n = saved ? parseInt(saved, 10) : NaN;\n if (!Number.isNaN(n)) return clamp(n, minWidth, maxWidth);\n }\n return clamp(defaultWidth, minWidth, maxWidth);\n });\n\n const dragRef = useRef<{ startX: number; startWidth: number } | null>(null);\n\n const onMove = useCallback((e: PointerEvent) => {\n const d = dragRef.current;\n if (!d) return;\n // Right-side sidebar grows as the handle is dragged left → invert the delta.\n const delta = (e.clientX - d.startX) * (sideRight ? -1 : 1);\n setWidth(clamp(d.startWidth + delta, minWidth, maxWidth));\n }, [minWidth, maxWidth, sideRight]);\n\n const onUp = useCallback(() => {\n dragRef.current = null;\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.removeProperty('cursor');\n document.body.style.removeProperty('user-select');\n }, [onMove]);\n\n const startDrag = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n dragRef.current = { startX: e.clientX, startWidth: width };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, [width, onMove, onUp]);\n\n // Persist (debounced) once the width settles.\n useEffect(() => {\n if (!storageKey) return;\n const id = window.setTimeout(() => {\n try { window.localStorage.setItem(storageKey, String(Math.round(width))); } catch { /* ignore quota / privacy mode */ }\n }, 200);\n return () => window.clearTimeout(id);\n }, [width, storageKey]);\n\n // Drop listeners if we unmount mid-drag.\n useEffect(() => () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n }, [onMove, onUp]);\n\n const edge = sideRight ? 'left-0' : 'right-0';\n const sidebarPane = (\n <div className=\"relative flex h-full shrink-0 flex-col\" style={{ width }}>\n <div className={`flex h-full flex-col overflow-y-auto ${sidebarClassName}`}>\n {sidebar}\n </div>\n {/* Resize handle — pinned to the sidebar's inner edge, fixed while it scrolls. */}\n <div\n onPointerDown={startDrag}\n onDoubleClick={() => setWidth(clamp(defaultWidth, minWidth, maxWidth))}\n title=\"Drag to resize · double-click to reset\"\n className={`group absolute inset-y-0 ${edge} z-10 w-2 cursor-col-resize`}\n >\n <div className={`absolute inset-y-0 ${edge} w-px bg-transparent transition-colors group-hover:bg-blue-400`} />\n </div>\n </div>\n );\n const contentPane = (\n <div className={`flex min-w-0 flex-1 flex-col ${contentClassName}`}>\n {children}\n </div>\n );\n\n return (\n <div className={`flex h-full w-full overflow-hidden ${className}`}>\n {sideRight ? (\n <>{contentPane}{sidebarPane}</>\n ) : (\n <>{sidebarPane}{contentPane}</>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { formatDate } from '../utils/date';\nimport { playNotification } from '../utils/sounds';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider, PopupMenuLabel } from './PopupMenu';\n\n/** Generic notification shape consumed by the shell. Consumer-specific\n * fields live on `extra` (or just on additional properties — TS structural\n * typing is permissive). */\nexport interface ShellNotification {\n id: string;\n title: string;\n message?: string;\n entity_type?: string;\n entity_id?: string;\n entity_label?: string;\n is_read: boolean;\n actor_name?: string;\n created_at: string;\n}\n\n/** Config bundle for the notification system. Supplied by the consumer;\n * the shell never calls a hardcoded URL. */\nexport interface NotificationsConfig {\n /** Hook called inside <NotificationBell> on every render. Return the\n * current unread count for the signed-in user. */\n useUnreadCount: () => number;\n /** Fetcher for the dropdown list (most recent first). */\n list: (params?: { page_size?: number }) => Promise<{ results: ShellNotification[] }>;\n /** Mark a single notification as read. */\n markRead: (id: string) => Promise<unknown>;\n /** Mark every unread notification as read. */\n markAllRead: () => Promise<unknown>;\n /** Click handler for a notification item. */\n onItemClick: (notif: ShellNotification) => void;\n /** Click handler for \"View all notifications\". When omitted, the link is hidden. */\n onViewAll?: () => void;\n}\n\nfunction timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return formatDate(dateStr);\n}\n\ninterface NotificationBellProps extends NotificationsConfig {\n popDirection?: 'left' | 'right';\n}\n\nexport default function NotificationBell({\n useUnreadCount, list, markRead, markAllRead, onItemClick, onViewAll, popDirection,\n}: NotificationBellProps) {\n const [open, setOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const queryClient = useQueryClient();\n\n const unreadCount = useUnreadCount();\n\n useEffect(() => {\n if ('Notification' in window && Notification.permission === 'default') Notification.requestPermission();\n }, []);\n\n // Extracted click flow shared by the bell popup, the toast, and the\n // browser-Notification fallback. Optimistic mark-read + invoke consumer\n // `onItemClick` to open the entity.\n const handleClick = useCallback((notif: ShellNotification) => {\n if (!notif.is_read) {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: Math.max(0, (old.count || 0) - 1) } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => n.id === notif.id ? { ...n, is_read: true } : n) };\n });\n markRead(notif.id).catch(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n }\n setOpen(false);\n onItemClick(notif);\n }, [queryClient, markRead, onItemClick]);\n\n // The actionable in-page notification — top-right, click anywhere on the\n // card to open the entity (same behavior as clicking the same item in the\n // bell popup), X to dismiss only. Lives as React state (not via toast.info)\n // so the click target is a first-class part of the notification system.\n const [inlineNotif, setInlineNotif] = useState<ShellNotification | null>(null);\n const inlineTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dismissInline = useCallback(() => {\n if (inlineTimerRef.current) { clearTimeout(inlineTimerRef.current); inlineTimerRef.current = null; }\n setInlineNotif(null);\n }, []);\n const showInlineNotif = useCallback((notif: ShellNotification, durationMs = 5000) => {\n setInlineNotif(notif);\n playNotification();\n if (inlineTimerRef.current) clearTimeout(inlineTimerRef.current);\n inlineTimerRef.current = setTimeout(() => setInlineNotif(null), durationMs);\n }, []);\n useEffect(() => () => { if (inlineTimerRef.current) clearTimeout(inlineTimerRef.current); }, []);\n\n const prevCountRef = useRef<number | null>(null);\n useEffect(() => {\n if (prevCountRef.current === null) { prevCountRef.current = unreadCount; return; }\n if (unreadCount > prevCountRef.current) {\n list({ page_size: 1 }).then(data => {\n const latest = data?.results?.[0];\n if (!latest) return;\n const title = latest.title || 'New Notification';\n const body = latest.message || latest.entity_label || '';\n if (document.hidden) {\n if ('Notification' in window && Notification.permission === 'granted') {\n const n = new Notification(title, { body, icon: '/favicon.svg', tag: `notif-${latest.id}` });\n n.onclick = () => { window.focus(); handleClick(latest); n.close(); };\n }\n } else {\n showInlineNotif(latest);\n }\n }).catch(() => {});\n }\n prevCountRef.current = unreadCount;\n }, [unreadCount, list, showInlineNotif]);\n\n // Always run on mount + every 30s so the dropdown is always populated\n // with cached data before the first click — no loading-state flash.\n const { data: notifData } = useQuery({\n queryKey: ['notifications-dropdown'],\n queryFn: () => list({ page_size: 30 }),\n staleTime: 30_000,\n refetchInterval: 30_000,\n });\n const notifications: ShellNotification[] = notifData?.results ?? [];\n\n // Outside-click is handled by PopupMenu's own onClose listener. Since the\n // popup is portaled into document.body it doesn't sit inside dropdownRef,\n // so any handler scoped to dropdownRef would fire pointerdown on items\n // inside the popup and close it before their onClick runs — see #issue.\n\n const handleMarkAllRead = () => {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: 0 } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => ({ ...n, is_read: true })) };\n });\n markAllRead().then(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n };\n\n const [dropdownPos, setDropdownPos] = useState<Record<string, number | string>>({});\n const calcPos = useCallback(() => {\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 56;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const verticalReserve = (taskbarPos === 'top' || taskbarPos === 'bottom') ? taskbarH + 16 : 16;\n const maxHeight = `calc(100vh - ${verticalReserve}px)`;\n if (popDirection === 'right') setDropdownPos({ left: taskbarW + 8, bottom: 8, maxHeight });\n else if (popDirection === 'left') setDropdownPos({ right: taskbarW + 8, bottom: 8, maxHeight });\n else if (taskbarPos === 'top') setDropdownPos({ right: 8, top: taskbarH + 8, maxHeight });\n else setDropdownPos({ right: 8, bottom: taskbarH + 8, maxHeight });\n }, [popDirection]);\n // Run synchronously before paint so the dropdown renders at the right\n // position on first open (otherwise it briefly flashes at viewport origin).\n useLayoutEffect(() => {\n if (!open) return;\n calcPos();\n }, [open, calcPos]);\n useEffect(() => {\n if (!open) return;\n window.addEventListener('resize', calcPos);\n return () => window.removeEventListener('resize', calcPos);\n }, [open, calcPos]);\n\n return (\n <div ref={dropdownRef} className=\"relative\">\n <button ref={buttonRef} data-menu-toggle\n onMouseEnter={() => queryClient.prefetchQuery({ queryKey: ['notifications-dropdown'], queryFn: () => list({ page_size: 30 }) })}\n onClick={() => setOpen(prev => !prev)}\n title=\"Notifications\"\n className=\"relative shrink-0 rounded-md p-2 text-gray-900 hover:text-black hover:bg-white/20 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"absolute top-0.5 right-0.5 flex h-4 min-w-[16px] items-center justify-center rounded-full bg-red-500 px-1 text-[10px] font-bold text-white\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </button>\n\n {open && createPortal(\n <PopupMenu minWidth={320} className=\"w-80 flex flex-col overflow-hidden\" style={{ ...dropdownPos }} onClose={() => setOpen(false)}>\n <PopupMenuLabel>\n <span className=\"flex items-center justify-between w-full\">\n <span>Notifications</span>\n {unreadCount > 0 && (\n <button onClick={handleMarkAllRead} className=\"text-[10px] text-blue-600 hover:text-blue-700 font-medium normal-case tracking-normal\">\n Mark all read\n </button>\n )}\n </span>\n </PopupMenuLabel>\n <PopupMenuDivider />\n <div className=\"overflow-y-auto\" style={{ flex: '1 1 auto', minHeight: 0 }}>\n {notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\n <svg className=\"h-8 w-8 text-gray-300 mb-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n <p className=\"text-sm text-gray-600 font-medium\">All caught up</p>\n <p className=\"text-xs text-gray-400 mt-0.5\">No notifications yet</p>\n </div>\n ) : (\n notifications.map(notif => (\n <PopupMenuItem key={notif.id} onClick={() => handleClick(notif)}>\n <div className=\"pt-0.5 shrink-0\">\n {!notif.is_read ? <div className=\"h-2 w-2 rounded-full bg-blue-500\" /> : <div className=\"h-2 w-2\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className={`text-sm leading-tight ${!notif.is_read ? 'font-medium' : ''}`}>{notif.title}</p>\n {notif.message && <p className=\"text-xs text-gray-500 mt-0.5 truncate\">{notif.message}</p>}\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-[10px] text-gray-400\">{timeAgo(notif.created_at)}</span>\n {notif.actor_name && <span className=\"text-[10px] text-gray-400\">by {notif.actor_name}</span>}\n </div>\n </div>\n </PopupMenuItem>\n ))\n )}\n </div>\n {onViewAll && (\n <>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setOpen(false); onViewAll(); }}>\n <span className=\"w-full text-center text-xs text-blue-600 font-medium\">View all notifications</span>\n </PopupMenuItem>\n </>\n )}\n </PopupMenu>,\n document.body\n )}\n\n {inlineNotif && createPortal(\n <>\n <style>{`@keyframes notif-in { from { opacity: 0; transform: translateX(30px) scale(0.95); } to { opacity: 1; transform: translateX(0) scale(1); } }`}</style>\n <div\n onClick={() => { handleClick(inlineNotif); dismissInline(); }}\n className=\"fixed top-4 right-4 z-[9999] w-[320px] max-w-[calc(100vw-2rem)] cursor-pointer rounded-2xl bg-white/85 backdrop-blur-md border border-white/40 shadow-2xl flex items-start gap-3 px-4 py-3\"\n style={{ animation: 'notif-in 300ms cubic-bezier(0.4,0,0.2,1)' }}\n >\n <div className=\"h-9 w-9 shrink-0 rounded-lg bg-blue-500/15 flex items-center justify-center\">\n <svg className=\"h-5 w-5 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-blue-600 mb-0.5\">Notification</div>\n <div className=\"text-sm font-medium text-gray-800 leading-snug truncate\">{inlineNotif.title}</div>\n {inlineNotif.message && (\n <div className=\"text-xs text-gray-500 leading-snug truncate mt-0.5\">{inlineNotif.message}</div>\n )}\n </div>\n <button\n onClick={(e) => { e.stopPropagation(); dismissInline(); }}\n className=\"shrink-0 p-1 -mr-1 -mt-1 text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Dismiss notification\"\n >\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </>,\n document.body\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect, useCallback, createContext, useContext, lazy, Suspense, type ReactNode } from 'react';\nimport { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';\n\n/**\n * Feedback dialog — shows the captured screenshot and lets the user pick\n * Bug or Suggestion and add a quick description before sending.\n *\n * Triggered imperatively from utils/reportBug.ts via openBugReportDialog().\n * The Provider is mounted once at the App root.\n */\n\nexport type ReportType = 'bug' | 'suggestion';\n\n/** Extra select-style field the consumer can inject into the bug-report\n * dialog (e.g. a \"module\" picker that the consumer's submit callback\n * forwards to its API). Rendered above the description textarea so\n * reporters confirm or override before submitting. The shell stays\n * generic — it knows nothing about what the field actually means. */\nexport interface BugReportExtraSelectField {\n /** Stable key — used as the form-field name and as the lookup key\n * in the submission payload's `extras` map. */\n key: string;\n /** Visible label above the select. */\n label: string;\n type: 'select';\n /** Choices rendered in the dropdown, in order. */\n options: { value: string; label: string }[];\n /** Initial value. Either a literal or a function called with the\n * open-dialog context (current URL, the pending report type) so the\n * consumer can auto-detect from where the user is when the dialog\n * opens. */\n defaultValue?: string | ((ctx: { url: string; reportType: ReportType }) => string);\n /** Optional helper text shown beneath the select. */\n hint?: string;\n}\nexport type BugReportExtraField = BugReportExtraSelectField;\n\nexport interface BugReportSubmission {\n description: string;\n reportType: ReportType;\n /** The screenshot the user actually wants to send. Reflects any in-dialog\n * annotation: callers should upload THIS blob, not the original capture\n * they passed into `openBugReportDialog`. May be null if the original\n * capture failed and the user submitted without uploading a fallback. */\n screenshot: Blob | null;\n /** Map of consumer-supplied extra-field values keyed by field.key. Empty\n * object when no extras were declared. */\n extras: Record<string, string>;\n}\n\n/** Generic bug-report record shape consumed by the shell's list/detail UI. */\nexport interface BugReport {\n id: string;\n report_code?: string;\n reporter_name?: string | null;\n screenshot_url?: string | null;\n url?: string;\n user_agent?: string;\n viewport?: string;\n description?: string;\n report_type?: ReportType;\n is_resolved: boolean;\n resolution_note?: string;\n created_at: string;\n // Allow consumer-specific fields without blocking compilation\n [k: string]: unknown;\n}\n\n/** Payload that <reportBug> sends to the consumer's `submit` callback. */\nexport interface BugReportSubmitPayload {\n description?: string;\n screenshot?: Blob;\n url: string;\n userAgent: string;\n viewport: string;\n reportType: ReportType;\n /** Values for any consumer-declared `extraFields` (keyed by field.key).\n * Always present; empty object when no extras were declared. */\n extras: Record<string, string>;\n}\n\n/** Config bundle for the bug-report subsystem. Consumer-supplied; the shell\n * never calls a hardcoded URL. */\nexport interface BugReportConfig {\n submit: (p: BugReportSubmitPayload) => Promise<unknown>;\n /** Extra fields to render inside the bug-report dialog above the\n * description textarea. Keeps the consumer's domain-specific\n * metadata (e.g. \"which module is this report about?\") in the same\n * one-step submit flow without forking the shell dialog. */\n extraFields?: BugReportExtraField[];\n /** Fetcher for the admin Bug Reports list. Receives query-string-shaped\n * params (e.g. `is_resolved=false`); paginated response. When omitted the\n * Bug Reports list page is unavailable. */\n list?: (params?: Record<string, string>) => Promise<{ results: BugReport[]; count?: number; next?: string | null; previous?: string | null }>;\n /** Mark a report resolved or reopened, with an optional admin note. */\n resolve?: (id: string, is_resolved: boolean, resolution_note?: string) => Promise<BugReport>;\n /** Permanently delete a report. When omitted the Delete button in\n * `<BugReportDetail>` is hidden — the consumer's permission system\n * decides whether to expose the capability at all. */\n delete?: (id: string) => Promise<void>;\n}\n\nconst BugReportContext = createContext<BugReportConfig | null>(null);\n\nexport function BugReportConfigProvider({ value, children }: { value: BugReportConfig; children: ReactNode }) {\n return <BugReportContext.Provider value={value}>{children}</BugReportContext.Provider>;\n}\n\n/** Returns the consumer-supplied bug-report config, or null when no provider\n * is mounted. Click handlers should hide their menu item if this is null. */\nexport function useBugReport(): BugReportConfig | null {\n return useContext(BugReportContext);\n}\n\ntype OpenFn = (screenshot: Blob | null) => Promise<BugReportSubmission | null>;\n\nlet globalOpen: OpenFn = () => Promise.resolve(null);\nexport const openBugReportDialog: OpenFn = (screenshot) => globalOpen(screenshot);\n\nexport function BugReportProvider({ children }: { children: React.ReactNode }) {\n const [open, setOpen] = useState(false);\n const [screenshot, setScreenshot] = useState<Blob | null>(null);\n const [previewUrl, setPreviewUrl] = useState<string | null>(null);\n const [description, setDescription] = useState('');\n const [reportType, setReportType] = useState<ReportType>('bug');\n // Values for consumer-declared extra fields, keyed by field.key. Re-\n // initialised every time the dialog opens so a fresh report doesn't\n // inherit the previous session's selection.\n const [extras, setExtras] = useState<Record<string, string>>({});\n // Annotator overlay state — opens on top of the dialog. Lazy-loaded so\n // the annotator (and its SVG/canvas weight) only enters the bundle when\n // the user actually opens it.\n const [annotating, setAnnotating] = useState(false);\n const resolveRef = useRef<(value: BugReportSubmission | null) => void>();\n // Pull the consumer-supplied extra-field config — dialog renders one\n // labelled select per entry above the description textarea.\n const config = useContext(BugReportContext);\n const extraFields = config?.extraFields ?? [];\n\n const openFn: OpenFn = useCallback((s) => {\n setScreenshot(s);\n setDescription('');\n setReportType('bug');\n // Seed extra-field values from each field's defaultValue. The\n // function form receives { url, reportType } so a consumer can\n // auto-detect from the page the user was on (e.g. derive\n // module=clients from /orders/...). Plain string defaults pass\n // through verbatim. New report defaults to `reportType: 'bug'`,\n // matching setReportType above.\n const seeded: Record<string, string> = {};\n const ctx = { url: window.location.href, reportType: 'bug' as ReportType };\n for (const f of extraFields) {\n if (typeof f.defaultValue === 'function') {\n try { seeded[f.key] = f.defaultValue(ctx) ?? ''; }\n catch { seeded[f.key] = f.options[0]?.value ?? ''; }\n } else if (typeof f.defaultValue === 'string') {\n seeded[f.key] = f.defaultValue;\n } else {\n seeded[f.key] = f.options[0]?.value ?? '';\n }\n }\n setExtras(seeded);\n // Defensive: ensure we never re-open straight into the annotator if a\n // previous session somehow exited with `annotating` left at true.\n setAnnotating(false);\n setOpen(true);\n return new Promise<BugReportSubmission | null>(resolve => {\n resolveRef.current = resolve;\n });\n }, [extraFields]);\n\n useEffect(() => { globalOpen = openFn; }, [openFn]);\n\n // Manage object URL lifetime for the preview\n useEffect(() => {\n if (!screenshot) { setPreviewUrl(null); return; }\n const url = URL.createObjectURL(screenshot);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [screenshot]);\n\n // Paste-to-attach: while the dialog is open, pasting an image from the\n // clipboard replaces the screenshot. Lets a user grab a system screenshot\n // (Cmd+Shift+4 / Win+Shift+S) and drop it in without leaving the dialog.\n // Listens at the document level so it works regardless of focus —\n // including from the description textarea, where the image side of the\n // clipboard would otherwise be silently dropped (textareas don't accept\n // image paste). We deliberately DON'T preventDefault: if the clipboard\n // also has text, the textarea's normal text paste still runs.\n useEffect(() => {\n if (!open) return;\n const onPaste = (e: ClipboardEvent) => {\n const items = Array.from(e.clipboardData?.items ?? []);\n const imageItem = items.find((it) => it.kind === 'file' && it.type.startsWith('image/'));\n if (!imageItem) return;\n const blob = imageItem.getAsFile();\n if (!blob) return;\n setScreenshot(blob);\n };\n document.addEventListener('paste', onPaste);\n return () => document.removeEventListener('paste', onPaste);\n }, [open]);\n\n const handleSubmit = () => {\n setAnnotating(false);\n setOpen(false);\n // Pass the current screenshot (which may be the annotated blob if the\n // user marked it up before sending) rather than relying on the caller\n // to remember what they captured.\n resolveRef.current?.({ description: description.trim(), reportType, screenshot, extras });\n };\n\n const handleCancel = () => {\n setAnnotating(false);\n setOpen(false);\n resolveRef.current?.(null);\n };\n\n const isBug = reportType === 'bug';\n\n return (\n <>\n {children}\n <Dialog\n open={open}\n // Suppress onClose while the annotator is up. The annotator is nested\n // inside <Dialog> (so it isn't inert and receives pointer events), but\n // it's a sibling of <DialogPanel> — and HeadlessUI treats anything\n // outside the panel as an outside-click. Without this, every click on\n // the annotator's toolbar/canvas would dismiss the bug-report dialog.\n // The annotator's own Apply / Cancel buttons drive setAnnotating(false).\n onClose={annotating ? () => {} : handleCancel}\n className=\"relative z-[9999]\"\n >\n <DialogBackdrop className=\"fixed inset-0 bg-black/40\" />\n <div className=\"fixed inset-0 flex items-center justify-center p-4\">\n <DialogPanel className=\"w-full max-w-2xl rounded-lg bg-white p-6 shadow-xl\">\n <DialogTitle className=\"text-base font-semibold text-gray-900\">Suggestion or Bug</DialogTitle>\n <p className=\"mt-1 text-xs text-gray-500\">A screenshot of your current view will be sent to the admin team.</p>\n\n <div className=\"mt-4 inline-flex rounded-lg border border-gray-300 bg-gray-50 p-0.5\">\n <button type=\"button\" onClick={() => setReportType('bug')}\n className={`px-3 py-1 text-sm font-medium rounded-md transition-colors ${isBug ? 'bg-white text-gray-900 shadow-sm' : 'text-gray-600 hover:text-gray-900'}`}>\n Bug\n </button>\n <button type=\"button\" onClick={() => setReportType('suggestion')}\n className={`px-3 py-1 text-sm font-medium rounded-md transition-colors ${!isBug ? 'bg-white text-gray-900 shadow-sm' : 'text-gray-600 hover:text-gray-900'}`}>\n Suggestion\n </button>\n </div>\n\n {previewUrl && (\n <div className=\"mt-4\">\n <div className=\"relative rounded-md border border-gray-200 overflow-hidden bg-gray-50 max-h-64\">\n <img src={previewUrl} alt=\"Screenshot preview\" className=\"w-full h-auto max-h-64 object-contain\" />\n <button\n type=\"button\"\n onClick={() => setAnnotating(true)}\n className=\"absolute top-2 right-2 inline-flex items-center gap-1 px-2.5 py-1 rounded-md bg-white/95 backdrop-blur border border-gray-200 shadow-sm text-xs font-medium text-gray-700 hover:bg-white\"\n title=\"Mark up the screenshot — circle, arrow, mosaic, text…\"\n >\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\" />\n </svg>\n Annotate\n </button>\n </div>\n <p className=\"mt-1 text-[11px] text-gray-400\">Click Annotate to mark up the screenshot before sending. Or paste a different image from the clipboard to replace it.</p>\n </div>\n )}\n {!previewUrl && (\n <UploadDropZone onSelect={(blob) => setScreenshot(blob)} />\n )}\n\n {/* Consumer-declared extra fields — rendered as labelled\n selects between the screenshot and the description so\n they're hard to miss but don't dominate the dialog.\n Stack vertically; one row per field for readability. */}\n {extraFields.length > 0 && (\n <div className=\"mt-4 space-y-3\">\n {extraFields.map((f) => (\n <div key={f.key}>\n <label htmlFor={`bug-report-extra-${f.key}`} className=\"block text-sm font-medium text-gray-700\">\n {f.label}\n </label>\n <select\n id={`bug-report-extra-${f.key}`}\n value={extras[f.key] ?? ''}\n onChange={(e) => setExtras((prev) => ({ ...prev, [f.key]: e.target.value }))}\n className=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none\"\n >\n {f.options.map((o) => (\n <option key={o.value} value={o.value}>{o.label}</option>\n ))}\n </select>\n {f.hint && <p className=\"mt-1 text-[11px] text-gray-500\">{f.hint}</p>}\n </div>\n ))}\n </div>\n )}\n\n <label className=\"mt-4 block text-sm font-medium text-gray-700\">\n {isBug ? 'What went wrong?' : \"What's your suggestion?\"}\n <span className=\"font-normal text-gray-400 ml-1\">(optional)</span>\n </label>\n <textarea\n autoFocus\n value={description}\n onChange={e => setDescription(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) handleSubmit();\n }}\n placeholder={isBug\n ? 'Briefly describe the issue, what you were doing, what you expected to happen…'\n : 'Briefly describe what would make this better…'}\n rows={3}\n className=\"mt-1 w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none resize-none\"\n />\n\n <div className=\"mt-6 flex justify-end gap-3\">\n <button type=\"button\" onClick={handleCancel}\n className=\"bg-white text-gray-700 border border-gray-300 px-4 py-2 text-sm font-medium rounded-lg hover:bg-gray-50\">\n Cancel\n </button>\n <button type=\"button\" onClick={handleSubmit}\n className=\"bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 text-sm font-medium rounded-lg\">\n Send\n </button>\n </div>\n </DialogPanel>\n </div>\n\n {/* Annotator lives inside the Dialog tree on purpose: HeadlessUI marks\n DOM outside the open Dialog as inert (so pointer events don't fire\n there) AND treats clicks outside the Dialog as outside-clicks (which\n would call onClose). Nesting the annotator here sidesteps both. */}\n {annotating && previewUrl && (\n <BugReportAnnotator\n src={previewUrl}\n onApply={(blob) => { setScreenshot(blob); setAnnotating(false); }}\n onCancel={() => setAnnotating(false)}\n />\n )}\n </Dialog>\n </>\n );\n}\n\n// Lazy-import the annotator so its SVG / canvas weight only enters the bundle\n// when the user actually opens the markup overlay. Wrapped in our own Suspense\n// boundary with a lightweight loader so it doesn't fall through to the app's.\nconst LazyImageAnnotator = lazy(() => import('../apps/ImageAnnotator'));\n\n/** Fallback when automatic screenshot capture fails (user denies the\n * Screen Capture permission, or it's unsupported). The user can drop or\n * pick an image file — the bytes are passed to the parent as a Blob via\n * `onSelect`, which behaves identically to a captured screenshot\n * downstream (annotate / send). */\nfunction UploadDropZone({ onSelect }: { onSelect: (blob: Blob) => void }) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [hover, setHover] = useState(false);\n\n const accept = (file: File | undefined) => {\n if (!file) return;\n if (!file.type.startsWith('image/')) return;\n onSelect(file);\n };\n\n return (\n <div\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setHover(true); }}\n onDragLeave={() => setHover(false)}\n onDrop={(e) => {\n e.preventDefault();\n setHover(false);\n accept(e.dataTransfer.files?.[0]);\n }}\n className={`mt-4 rounded-md border border-dashed px-4 py-6 text-center text-sm cursor-pointer transition-colors ${\n hover ? 'border-blue-400 bg-blue-50 text-blue-700' : 'border-gray-300 text-gray-500 hover:border-gray-400 hover:bg-gray-50'\n }`}\n >\n <p className=\"text-gray-700 font-medium\">Screenshot capture failed</p>\n <p className=\"mt-1 text-xs text-gray-500\">\n Drop an image here, paste one from the clipboard, or <span className=\"text-blue-600 underline\">click to upload</span>. Your description will be sent either way.\n </p>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => accept(e.target.files?.[0])}\n className=\"hidden\"\n />\n </div>\n );\n}\n\nfunction BugReportAnnotator({\n src, onApply, onCancel,\n}: { src: string; onApply: (blob: Blob) => void; onCancel: () => void }) {\n return (\n <div className=\"fixed inset-0 z-[10000] bg-black/60 backdrop-blur-sm flex flex-col\">\n <Suspense fallback={<div className=\"flex-1 flex items-center justify-center text-sm text-white/80\">Loading editor…</div>}>\n <div className=\"flex-1 m-4 rounded-lg overflow-hidden bg-white shadow-2xl\">\n <LazyImageAnnotator src={src} filename=\"screenshot.png\" onApply={onApply} onCancel={onCancel} />\n </div>\n </Suspense>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBugReport, type BugReport } from './BugReportDialog';\nimport { formatDate } from '../utils/date';\nimport Modal from './Modal';\nimport { confirm } from './ConfirmDialog';\nimport { useWindowManager } from './WindowManager';\nimport { setPdfPreview } from '../apps/Preview';\n\nfunction StatePill({ resolved }: { resolved: boolean }) {\n return (\n <span className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${resolved ? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800'}`}>\n {resolved ? 'Resolved' : 'Open'}\n </span>\n );\n}\n\ninterface Props {\n report: BugReport;\n /** Called after a successful delete so the parent window can close itself. */\n onClose?: () => void;\n}\n\nexport default function BugReportDetail({ report, onClose }: Props) {\n const qc = useQueryClient();\n const config = useBugReport();\n const { openPage } = useWindowManager();\n const [resolveOpen, setResolveOpen] = useState(false);\n const [note, setNote] = useState('');\n\n // Neutral noun across the dialog — a record may be a Bug or a Suggestion.\n const kind = report.report_type === 'suggestion' ? 'suggestion' : 'bug';\n const Kind = kind === 'suggestion' ? 'Suggestion' : 'Bug';\n\n const openScreenshot = () => {\n if (!report.screenshot_url) return;\n const filename = `${kind}-${report.id}-screenshot.png`;\n setPdfPreview({ url: report.screenshot_url, filename, kind: 'image' });\n openPage('/preview');\n };\n\n const resolve = useMutation({\n mutationFn: ({ is_resolved, resolution_note }: { is_resolved: boolean; resolution_note?: string }) => {\n if (!config?.resolve) {\n return Promise.reject(new Error('Resolve is not configured.'));\n }\n return config.resolve(report.id, is_resolved, resolution_note);\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['bug-reports'] });\n qc.invalidateQueries({ queryKey: ['entity', 'bug_report', report.id] });\n setResolveOpen(false);\n setNote('');\n },\n meta: { success: (d: BugReport) => d.is_resolved ? `${Kind} marked resolved.` : `${Kind} reopened.` },\n });\n\n const del = useMutation({\n mutationFn: () => {\n if (!config?.delete) return Promise.reject(new Error('Delete is not configured.'));\n return config.delete(report.id);\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['bug-reports'] });\n qc.removeQueries({ queryKey: ['entity', 'bug_report', report.id] });\n onClose?.();\n },\n meta: { success: () => `${Kind} deleted.` },\n });\n\n const handleDelete = async () => {\n const ok = await confirm({\n title: `Delete this ${kind}?`,\n message: 'This is permanent and cannot be undone.',\n confirmLabel: 'Delete',\n cancelLabel: 'Keep',\n variant: 'danger',\n });\n if (!ok) return;\n del.mutate();\n };\n\n const handleAction = () => {\n if (report.is_resolved) {\n // Reopen — no note prompt; clear any prior resolution note\n resolve.mutate({ is_resolved: false, resolution_note: '' });\n } else {\n setNote('');\n setResolveOpen(true);\n }\n };\n\n const submitResolve = () => {\n resolve.mutate({ is_resolved: true, resolution_note: note.trim() });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3 text-sm\">\n <span className=\"font-semibold text-gray-900\">{report.reporter_name || 'Unknown'}</span>\n <StatePill resolved={report.is_resolved} />\n <span className=\"text-gray-500 ml-auto\">{formatDate(report.created_at)}</span>\n </div>\n\n {report.description && (\n <div className=\"rounded-lg bg-gray-50 border border-gray-200 p-3 text-sm text-gray-800 whitespace-pre-wrap\">\n {report.description}\n </div>\n )}\n\n {report.is_resolved && report.resolution_note && (\n <div className=\"rounded-lg bg-green-50 border border-green-200 p-3 text-sm text-green-900 whitespace-pre-wrap\">\n <div className=\"text-xs font-medium uppercase tracking-wide text-green-700 mb-1\">Resolution note</div>\n {report.resolution_note}\n </div>\n )}\n\n <dl className=\"text-xs text-gray-600 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1.5\">\n <dt className=\"font-medium text-gray-700\">Page</dt>\n <dd className=\"break-all\"><a href={report.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:underline\">{report.url}</a></dd>\n <dt className=\"font-medium text-gray-700\">Viewport</dt>\n <dd>{report.viewport}</dd>\n <dt className=\"font-medium text-gray-700\">Browser</dt>\n <dd className=\"break-all\">{report.user_agent}</dd>\n </dl>\n\n {report.screenshot_url ? (\n <button type=\"button\" onClick={openScreenshot} className=\"block w-full text-left p-0 bg-transparent border-0 cursor-pointer\">\n <img src={report.screenshot_url} alt=\"Screenshot at time of report\"\n className=\"w-full rounded-lg border border-gray-200 hover:border-blue-400 transition-colors\" />\n </button>\n ) : (\n <div className=\"rounded-lg border border-dashed border-gray-300 p-6 text-center text-sm text-gray-400\">\n No screenshot was captured for this report.\n </div>\n )}\n\n {(config?.resolve || config?.delete) && (\n <div className=\"flex justify-end items-center gap-2 pt-2 border-t border-gray-200\">\n {config?.delete && (\n <button onClick={handleDelete} disabled={del.isPending || resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium transition-colors bg-white border border-red-300 text-red-700 hover:bg-red-50 disabled:opacity-50 mr-auto\">\n {del.isPending ? 'Deleting…' : 'Delete'}\n </button>\n )}\n {config?.resolve && (\n <button onClick={handleAction} disabled={resolve.isPending || del.isPending}\n className={`px-3 py-1.5 text-sm rounded-lg font-medium transition-colors ${report.is_resolved ? 'bg-white border border-gray-300 text-gray-700 hover:bg-gray-50' : 'bg-blue-600 text-white hover:bg-blue-700'}`}>\n {resolve.isPending ? '...' : report.is_resolved ? 'Reopen' : 'Mark Resolved'}\n </button>\n )}\n </div>\n )}\n\n <Modal open={resolveOpen} onClose={() => !resolve.isPending && setResolveOpen(false)} title={`Resolve ${report.report_code ?? Kind}`} size=\"md\" compact>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-gray-600\">\n Add a short note for {report.reporter_name || 'the reporter'} (optional).\n </p>\n <textarea\n value={note}\n onChange={e => setNote(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) submitResolve(); }}\n rows={3}\n autoFocus\n placeholder=\"e.g. Fixed in v1256 — let me know if you still see it.\"\n className=\"w-full rounded-lg border border-gray-300 px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none\"\n />\n <div className=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <button onClick={() => setResolveOpen(false)} disabled={resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium bg-white border border-gray-300 text-gray-700 hover:bg-gray-50 transition-colors\">\n Cancel\n </button>\n <button onClick={submitResolve} disabled={resolve.isPending}\n className=\"px-3 py-1.5 text-sm rounded-lg font-medium bg-blue-600 text-white hover:bg-blue-700 transition-colors\">\n {resolve.isPending ? 'Resolving...' : 'Resolve'}\n </button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n","/**\n * StatusBadge — unified status pill across the system.\n *\n * The shell defines 8 semantic groups so the same concept always looks the\n * same color, regardless of which entity the status came from. The mapping\n * from raw status strings → groups is consumer-supplied via\n * <StatusBadgeProvider groups={...}>; when no provider is present (or a\n * status isn't mapped), the badge falls back to the \"neutral\" group.\n *\n * Dark-mode tone-down lives in index.css under [data-theme=\"dark\"].\n */\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport type SemanticGroup =\n | 'success' // finished, done, paid, approved, confirmed, received, active, production_ready, shipped\n | 'active' // in-progress, in production, in transit, posted, development\n | 'queued' // sent, arranged, loaded, submitted, pending_production\n | 'info' // initialized, delivered\n | 'pending' // pending, at_port (waiting / hold)\n | 'warning' // customs, partially_paid (needs attention)\n | 'danger' // overdue\n | 'draft' // draft (slightly more visible than neutral)\n | 'neutral'; // cancelled, inactive, rejected\n\nconst GROUP_COLORS: Record<SemanticGroup, string> = {\n success: 'bg-green-100 text-green-800',\n active: 'bg-blue-100 text-blue-800',\n queued: 'bg-indigo-100 text-indigo-800',\n info: 'bg-sky-100 text-sky-800',\n pending: 'bg-yellow-100 text-yellow-800',\n warning: 'bg-orange-100 text-orange-800',\n danger: 'bg-red-100 text-red-800',\n draft: 'bg-gray-300 text-gray-800',\n neutral: 'bg-gray-100 text-gray-800',\n};\n\nconst StatusGroupsContext = createContext<Record<string, SemanticGroup>>({});\n\nexport function StatusBadgeProvider({\n groups,\n children,\n}: { groups: Record<string, SemanticGroup>; children: ReactNode }) {\n return <StatusGroupsContext.Provider value={groups}>{children}</StatusGroupsContext.Provider>;\n}\n\ninterface StatusBadgeProps {\n status: string;\n}\n\nexport default function StatusBadge({ status }: StatusBadgeProps) {\n const groups = useContext(StatusGroupsContext);\n const group = groups[status] ?? 'neutral';\n const color = GROUP_COLORS[group];\n const label = status.replace(/_/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\n\n return (\n <span className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${color}`}>\n {label}\n </span>\n );\n}\n","/**\n * Dev-environment detection + browser chrome.\n *\n * A deployed bundle is byte-identical across hosts (CI builds once and promotes\n * the same image between environments), so build-time signals like\n * `import.meta.env.MODE` can't tell a developer's machine from a deployed site —\n * only the runtime hostname can. `isDevEnv()` is therefore gated on\n * `localhost`/`127.0.0.1`, and everything dev-only (the <DevIndicator/> tray\n * badge, the `[DEV]` tab-title prefix) keys off it so it never leaks onto a\n * deployed host.\n */\n\n/** Tooltip/banner copy for the dev indicator. */\nexport const DEV_BANNER_TEXT =\n 'LOCAL DEV ENVIRONMENT — running against your local backend; not connected to the live system';\n\n/**\n * True only when served from a developer's own machine.\n *\n * Gated on `localhost`/`127.0.0.1` only (not `*.local` mDNS names), so a\n * teammate reaching a dev server over the LAN doesn't get the dev chrome.\n */\nexport function isDevEnv(): boolean {\n const host = window.location.hostname;\n return host === 'localhost' || host === '127.0.0.1';\n}\n\n/**\n * Apply local-dev browser chrome: prefix the tab title with `[DEV]` and,\n * optionally, swap the favicon. No-op outside localhost. Idempotent — safe to\n * call at startup and again whenever a route overwrites `document.title`.\n *\n * Call before React mounts (e.g. in `main.tsx`) so the title is correct on the\n * first paint. Pass `faviconHref` only if the host actually ships that asset.\n */\nexport function applyDevTitle(opts?: { faviconHref?: string }): void {\n if (!isDevEnv()) return;\n\n if (!document.title.startsWith('[DEV]')) {\n document.title = `[DEV] ${document.title}`;\n }\n\n if (opts?.faviconHref) {\n const icon = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (icon) icon.href = opts.faviconHref;\n }\n}\n","import { isDevEnv, DEV_BANNER_TEXT } from '../utils/env';\n\n/**\n * System-tray badge shown only when the app is served from a developer's own\n * machine (localhost / 127.0.0.1). Drop it into the host's `taskbarTrayLeft`\n * slot — it renders nothing off-localhost, so it's safe to leave wired on every\n * build. Visibility is gated on the runtime hostname; see utils/env.ts.\n */\nexport default function DevIndicator() {\n if (!isDevEnv()) return null;\n\n return (\n <div\n className=\"shrink-0 inline-flex items-center gap-1 rounded-md bg-blue-600 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-blue-50 select-none\"\n title={DEV_BANNER_TEXT}\n >\n <svg className=\"h-3 w-3 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n <span>Dev</span>\n </div>\n );\n}\n","import { useMemo, isValidElement, cloneElement, type ReactElement } from 'react';\nimport Modal, { setWindowPosition } from './Modal';\nimport { useWindowManager } from './WindowManager';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport { navIcons } from '../shell-config/nav';\n\ninterface AvailableWidget {\n route: string;\n label: string;\n entry: PageRegistryEntry;\n}\n\n/** Generic fallback glyph for widgets the consumer hasn't given a navIcon. */\nfunction FallbackIcon() {\n return (\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n </svg>\n );\n}\n\nfunction widgetIcon(entry: PageRegistryEntry, route: string) {\n const icon = navIcons[entry.icon ?? route];\n if (icon && isValidElement(icon)) {\n return cloneElement(icon as ReactElement, { className: 'h-5 w-5' });\n }\n return <FallbackIcon />;\n}\n\n/**\n * Widget gallery — the \"manage widgets on the desktop\" surface.\n *\n * Enumerates every widget-flagged page in the live window registry (so it\n * automatically lists whatever the consumer registered, not just the bundled\n * five) and cross-references the window manager's `openWindows` to know which\n * are currently sitting on the desktop. Adding a widget calls `openPage`\n * (which drops the chrome-less panel onto the desktop and persists it via the\n * normal open-windows session store); removing one calls `closeEntity` on the\n * live window. No new persistence layer — it drives the same plumbing the\n * Start Menu already uses.\n *\n * Surfaced from the desktop right-click menu (\"Manage Widgets…\") and exported\n * so a consumer can also register it as a window or wire it to a tray button.\n */\nexport default function WidgetManager({ open, onClose }: { open: boolean; onClose: () => void }) {\n const { openWindows, openPage, closeEntity } = useWindowManager();\n\n // Widget-flagged page entries from the live registry, alphabetised.\n const widgets = useMemo<AvailableWidget[]>(() => {\n if (!open) return [];\n return Object.entries(WINDOW_REGISTRY)\n .filter(([, e]) => isPageEntry(e) && (e as PageRegistryEntry).widget)\n .map(([route, e]) => ({ route, label: (e as PageRegistryEntry).label, entry: e as PageRegistryEntry }))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [open]);\n\n if (!open) return null;\n\n // route → the live open-window item (widgets aren't multi-instance, so at\n // most one per route).\n const activeByRoute = new Map(openWindows.filter(w => w.route).map(w => [w.route!, w]));\n const isActive = (route: string) => activeByRoute.has(route);\n\n // ── Placement ────────────────────────────────────────────────────────────\n // Newly-added widgets drop into the top-left corner and stack downward so\n // they never cover an existing widget. We read the live on-screen rects of\n // any widgets already on the desktop and place the new one below the lowest\n // one in the left column, wrapping to a new column when the column fills.\n const PAD = 20, GAP = 16;\n type Rect = { x: number; y: number; w: number; h: number };\n\n const workArea = () => {\n const cs = getComputedStyle(document.documentElement);\n const tbH = parseInt(cs.getPropertyValue('--taskbar-height')) || 0;\n const tbW = parseInt(cs.getPropertyValue('--taskbar-width')) || 0;\n const tbPos = cs.getPropertyValue('--taskbar-position').trim() || 'bottom';\n const sidebarW = parseInt(cs.getPropertyValue('--sidebar-width')) || 0;\n return {\n leftOffset: (tbPos === 'left' ? tbW : 0) + sidebarW + PAD,\n topOffset: (tbPos === 'top' ? tbH : 0) + PAD,\n maxBottom: window.innerHeight - (tbPos === 'bottom' ? tbH : 0) - PAD,\n };\n };\n\n const liveWidgetRects = (): Rect[] =>\n [...document.querySelectorAll<HTMLElement>('[data-modal-panel][data-widget]')]\n .map(el => { const r = el.getBoundingClientRect(); return { x: r.left, y: r.top, w: r.width, h: r.height }; })\n .filter(r => r.w > 0 && r.h > 0);\n\n const computeSlot = (occupied: Rect[], w: number, h: number) => {\n const { leftOffset, topOffset, maxBottom } = workArea();\n const rightLimit = window.innerWidth - PAD;\n const lowestInColumn = (colX: number) => {\n const ov = occupied.filter(r => r.x < colX + w && r.x + r.w > colX);\n return ov.length ? Math.max(...ov.map(r => r.y + r.h)) + GAP : topOffset;\n };\n let x = leftOffset, y = lowestInColumn(x), guard = 0;\n // Move to a fresh column when this one is full — but never push a widget\n // off the right edge: only wrap if the next column still fits on-screen.\n while (y + h > maxBottom && x + (w + GAP) + w <= rightLimit && guard < 12) {\n x += w + GAP; y = lowestInColumn(x); guard++;\n }\n return { x, y };\n };\n\n const dimsFor = (route: string) => {\n const e = WINDOW_REGISTRY[route] as PageRegistryEntry;\n return { w: e?.dimensions?.[0] ?? 320, h: e?.dimensions?.[1] ?? 240, auto: !!e?.autoHeight };\n };\n\n // Place a widget into a free top-left slot, then open it. We choose the slot\n // from the *live* rects of widgets already on the desktop, so the new one\n // stacks below their real (content-aware) heights. `autoHeight` widgets\n // shrink to their content, so we only reserve a small slice of height for\n // them when picking a column — otherwise their full dimension height would\n // push later widgets into needless extra columns. The seeded `h` is just a\n // first-paint placeholder; autoHeight widgets re-measure on open.\n const placeAndOpen = (route: string) => {\n const { w, h, auto } = dimsFor(route);\n const selfH = auto ? Math.min(h, 160) : h;\n const { x, y } = computeSlot(liveWidgetRects(), w, selfH);\n setWindowPosition(`page:${route}`, { x, y, w, h });\n openPage(route);\n };\n\n // Resolve once the just-opened widget has rendered with a real height, so the\n // next placement in a batch can read its actual rect (capped so a slow lazy\n // chunk never hangs the loop).\n const waitForWidget = (route: string) => new Promise<void>(resolve => {\n const sel = `[data-modal-panel][data-window-key=\"page:${route}\"]`;\n let n = 0;\n const tick = () => {\n const el = document.querySelector(sel) as HTMLElement | null;\n if ((el && el.getBoundingClientRect().height > 40) || n++ > 30) resolve();\n else setTimeout(tick, 30);\n };\n setTimeout(tick, 30);\n });\n\n const add = (route: string) => { if (!isActive(route)) placeAndOpen(route); };\n const remove = (route: string) => { const w = activeByRoute.get(route); if (w) closeEntity(w.id); };\n const toggle = (route: string) => { isActive(route) ? remove(route) : add(route); };\n\n const activeCount = widgets.reduce((n, w) => n + (isActive(w.route) ? 1 : 0), 0);\n const allActive = widgets.length > 0 && activeCount === widgets.length;\n const addAll = async () => {\n for (const w of widgets) {\n if (isActive(w.route)) continue;\n placeAndOpen(w.route);\n await waitForWidget(w.route);\n }\n };\n const removeAll = () => widgets.forEach(w => remove(w.route));\n\n const widgetGlyph = (\n <svg className=\"h-5 w-5 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" />\n </svg>\n );\n\n return (\n <Modal open={open} onClose={onClose} title=\"Widgets\" icon={widgetGlyph} size=\"md\" compact dimensions={[480, 560]}>\n <div className=\"flex flex-col h-full\">\n {/* Summary + bulk actions */}\n <div className=\"flex items-center justify-between gap-2 px-1 pb-3\">\n <p className=\"text-xs text-gray-500\">\n {widgets.length === 0\n ? 'No widgets available'\n : <><span className=\"font-semibold text-gray-700\">{activeCount}</span> of {widgets.length} on your desktop</>}\n </p>\n {widgets.length > 0 && (\n <button\n onClick={allActive ? removeAll : addAll}\n className=\"text-xs font-medium text-blue-600 hover:text-blue-700 hover:underline\">\n {allActive ? 'Remove all' : 'Add all'}\n </button>\n )}\n </div>\n\n {/* Gallery */}\n <div className=\"flex-1 overflow-y-auto -mx-1 px-1\">\n {widgets.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center text-center py-12 text-gray-400\">\n <div className=\"opacity-60 mb-2\">{widgetGlyph}</div>\n <p className=\"text-sm\">No widgets are registered.</p>\n <p className=\"text-xs mt-1\">Widgets like Weather, Currency, and the Pomodoro timer appear here once available.</p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n {widgets.map(({ route, label, entry }) => {\n const active = isActive(route);\n return (\n <button\n key={route}\n onClick={() => toggle(route)}\n title={active ? `Remove ${label} from desktop` : `Add ${label} to desktop`}\n className={`group relative flex items-center gap-3 rounded-xl border p-3 text-left transition-colors ${\n active\n ? 'border-blue-300 bg-blue-50/70 hover:bg-blue-50'\n : 'border-gray-200 bg-white/60 hover:border-gray-300 hover:bg-gray-50'\n }`}>\n <span className={`shrink-0 flex items-center justify-center h-10 w-10 rounded-lg ${\n active ? 'bg-blue-100 text-blue-600' : 'bg-gray-100 text-gray-500'\n }`}>\n {widgetIcon(entry, route)}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-sm font-medium text-gray-900 truncate\">{label}</span>\n <span className={`block text-[11px] ${active ? 'text-blue-600' : 'text-gray-400'}`}>\n {active ? 'On desktop' : 'Available'}\n </span>\n </span>\n {/* Toggle affordance */}\n <span className={`shrink-0 inline-flex items-center justify-center h-6 w-6 rounded-full border transition-colors ${\n active\n ? 'border-blue-500 bg-blue-500 text-white group-hover:border-red-400 group-hover:bg-red-400'\n : 'border-gray-300 text-gray-400 group-hover:border-blue-400 group-hover:text-blue-500'\n }`}>\n {active ? (\n <>\n {/* check by default, swap to × on hover to signal removal */}\n <svg className=\"h-3.5 w-3.5 group-hover:hidden\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n <svg className=\"h-3.5 w-3.5 hidden group-hover:block\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </>\n ) : (\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n )}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Hint */}\n <p className=\"shrink-0 pt-3 mt-1 border-t border-gray-100 text-[11px] text-gray-400 leading-relaxed\">\n Drag a widget anywhere on the desktop to reposition it. Right-click a widget for its appearance settings.\n </p>\n </div>\n </Modal>\n );\n}\n","declare const __PKG_VERSION__: string | undefined;\n\n/** Package version, injected by tsup at build time. Stays as an empty\n * string when the source is consumed without a build (e.g. tests). */\nexport const VERSION: string = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '';\n\n/** Legacy alias kept so existing consumers do not break. */\nexport const APP_VERSION = VERSION;\n","/**\n * INTERNAL stub — Desktop's About modal references the consumer-side\n * changelog. The package ships no built-in changelog; consumer wires their\n * own through the eventual `branding` prop (TODO). Default = empty array\n * keeps the import compiling.\n */\nexport interface ChangelogEntry {\n version: string;\n date: string;\n changes: string[];\n}\nconst changelog: ChangelogEntry[] = [];\nexport default changelog;\n","/**\n * Suggestion or Bug — screenshot the current tab, let the user pick whether\n * it's a Bug or a Suggestion and describe it, then hand the payload to the\n * consumer-supplied `submit` callback. Triggered from the wallpaper / taskbar\n * right-click menus.\n *\n * The shell does NOT call any HTTP endpoint here; the caller passes a\n * `BugReportConfig['submit']` (typically resolved via `useBugReport()`).\n */\nimport toast from '../shell/toast';\nimport { openBugReportDialog, type BugReportConfig } from '../shell/BugReportDialog';\n\n/** Capture the current tab via the Screen Capture API. OS-level screenshot —\n * immune to the CSS quirks (Tailwind v4, oklch(), backdrop-filter, custom\n * properties) that break DOM-based renderers like html2canvas / html-to-image.\n * preferCurrentTab pre-selects the current tab so the user just clicks Share. */\nasync function captureViewport(): Promise<Blob | null> {\n try {\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: { displaySurface: 'browser' } as MediaTrackConstraints,\n audio: false,\n // Chromium-only hints — ignored by other engines, no harm done.\n preferCurrentTab: true,\n selfBrowserSurface: 'include',\n surfaceSwitching: 'exclude',\n } as any);\n\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n await video.play();\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d')!.drawImage(video, 0, 0);\n\n stream.getTracks().forEach(t => t.stop());\n\n return await new Promise<Blob | null>((resolve) => {\n canvas.toBlob((b) => resolve(b), 'image/jpeg', 0.9);\n });\n } catch (err) {\n console.error('Bug report screenshot failed:', err);\n return null;\n }\n}\n\nexport async function reportBug(submit: BugReportConfig['submit']): Promise<void> {\n const screenshot = await captureViewport();\n\n // Show review dialog with preview + description box\n const submission = await openBugReportDialog(screenshot);\n if (submission === null) return; // user cancelled\n\n // Use the screenshot the dialog returns — that's the annotated version\n // when the user marked up the capture before sending. Falls back to the\n // original capture for safety.\n const finalScreenshot = submission.screenshot ?? screenshot;\n\n try {\n await submit({\n description: submission.description || undefined,\n screenshot: finalScreenshot ?? undefined,\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: `${window.innerWidth}x${window.innerHeight}`,\n reportType: submission.reportType,\n extras: submission.extras ?? {},\n });\n toast.success(submission.reportType === 'bug' ? 'Bug sent to admins.' : 'Suggestion sent to admins.');\n } catch (err: any) {\n toast.error(err?.response?.data?.detail || 'Failed to send.');\n }\n}\n","import { useState, useRef, useEffect, useCallback, isValidElement, cloneElement, createContext, useContext, type ReactNode, type ReactElement } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useWindowManager } from './WindowManager';\nimport { navIcons } from '../shell-config/nav';\nimport { useShellPrefs } from './ShellPrefs';\nimport Modal from './Modal';\nimport WidgetManager from './WidgetManager';\nimport { APP_VERSION } from '../version';\nimport changelog, { type ChangelogEntry } from '../changelog';\nimport toast from './toast';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider } from './PopupMenu';\nimport { reportBug } from '../utils/reportBug';\nimport { useBugReport } from './BugReportDialog';\nimport { formatDate } from '../utils/date';\nimport {\n openPreviewFile,\n PREVIEW_OPENED_EVENT,\n type PreviewFileKind,\n type PreviewOpenedDetail,\n} from '../utils/openPreviewFile';\n\n// ── Entity icon config ──\nconst ENTITY_ICON_COLORS: Record<string, string> = {\n order: 'text-blue-600', purchase_order: 'text-purple-600', invoice: 'text-green-600',\n client: 'text-indigo-600', manufacturer: 'text-orange-600', shipment: 'text-teal-600',\n part_number: 'text-gray-600', project: 'text-pink-600', mould: 'text-red-600',\n design: 'text-cyan-600', brand: 'text-amber-600', price_sheet: 'text-emerald-600',\n folder: 'text-yellow-600', page: 'text-blue-500',\n};\nconst ENTITY_ICONS: Record<string, string> = {\n order: 'SO', purchase_order: 'PO', invoice: 'INV', client: 'CLI',\n manufacturer: 'MFR', shipment: 'DN', part_number: 'PN', project: 'PRJ',\n mould: 'MLD', design: 'DSN', brand: 'BRD', price_sheet: 'PS',\n vendor_invoice: 'VI', vendor_payment: 'VP', warranty_claim: 'WC',\n qc_report: 'QC', vendor_shipment: 'GRN', bank_account: 'BA',\n wheel_finish: 'WF', weight_log: 'WL', production_progress: 'PP',\n vendor_price_sheet: 'VPS', proposal: 'PR', folder: 'FLD',\n};\n\n// Glyphs and colors for the auto-tracked preview shortcuts that live in the\n// Documents folder. Keyed by `fileKind`, not `entityType`.\nconst PREVIEW_FILE_CODES: Record<PreviewFileKind, string> = {\n pdf: 'PDF', dxf: 'DXF', '3d': 'STP', image: 'IMG', csv: 'CSV',\n};\nconst PREVIEW_FILE_COLORS: Record<PreviewFileKind, string> = {\n pdf: 'text-red-600', dxf: 'text-blue-600', '3d': 'text-purple-600',\n image: 'text-emerald-600', csv: 'text-green-600',\n};\nconst DOCUMENTS_FOLDER_ID = 'documents';\nconst DOCUMENTS_FOLDER_NAME = 'Documents';\n\ninterface DesktopItem {\n entityType: string;\n entityId: string;\n label: string;\n x?: number;\n y?: number;\n folderId?: string; // if inside a folder\n // When the item lives inside a folder, these hold its free-form position\n // (in pixels, relative to the folder body's top-left). Undefined → fall\n // back to the default grid layout for that folder.\n folderX?: number;\n folderY?: number;\n // Set for `entityType: 'preview-file'` shortcuts auto-recorded when the\n // user previews a file. `filePath` is the server-relative path passed\n // back into `openPreviewFile` on shortcut click.\n filePath?: string;\n fileKind?: PreviewFileKind;\n}\n\n// Shared 48×48 tile used by both the desktop and folder-window icon\n// renderers, so the two surfaces never visually diverge.\nfunction FileIconTile({ entityType, isSelected, entityId, label, fileKind }: {\n entityType: string;\n isSelected: boolean;\n entityId?: string;\n label?: string;\n fileKind?: PreviewFileKind;\n}) {\n const isPreviewFile = entityType === 'preview-file' && fileKind;\n const previewColor = isPreviewFile ? PREVIEW_FILE_COLORS[fileKind!] : null;\n const previewCode = isPreviewFile ? PREVIEW_FILE_CODES[fileKind!] : null;\n if (entityType === 'folder') {\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]\" viewBox=\"0 0 48 48\">\n <path d=\"M6 12a4 4 0 014-4h10l4 4h14a4 4 0 014 4v20a4 4 0 01-4 4H10a4 4 0 01-4-4V12z\" fill=\"white\" stroke=\"#eab308\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M6 18h36\" stroke=\"#eab308\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n );\n }\n if (entityType === 'page') {\n const icon = (label && navIcons[label]) || (entityId ? navIcons[entityId] : undefined);\n return (\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-10 w-10 text-white drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]' })\n : <svg className=\"h-10 w-10 text-white drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6z\" /></svg>}\n </div>\n );\n }\n return (\n <div className={`w-12 h-12 relative flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''}`}>\n <svg className={`w-10 h-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)] ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-500'}`} viewBox=\"0 0 40 48\" fill=\"none\">\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" fill=\"white\" fillOpacity=\"0.92\" />\n <path d=\"M26 0l10 10H30a4 4 0 01-4-4V0z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <path d=\"M4 0h22l10 10v34a4 4 0 01-4 4H4a4 4 0 01-4-4V4a4 4 0 014-4z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeOpacity=\"0.5\" />\n </svg>\n <span className={`absolute inset-0 flex items-center justify-center text-[9px] font-bold pt-2 ${previewColor ?? ENTITY_ICON_COLORS[entityType] ?? 'text-gray-600'}`}>\n {previewCode ?? ENTITY_ICONS[entityType] ?? entityType.slice(0, 3).toUpperCase()}\n </span>\n </div>\n );\n}\n\ninterface DesktopFolder {\n id: string;\n name: string;\n x?: number;\n y?: number;\n}\n\nconst GRID = 90; // snap grid size\n\nfunction snapToGrid(x: number, y: number) {\n return { x: Math.round(x / GRID) * GRID, y: Math.round(y / GRID) * GRID };\n}\n\n// ── Consumer-supplied desktop config ────────────────────────────────────────\n//\n// Desktop talks to two consumer-specific things:\n// 1. A sticky-note ref resolver — turns `PREFIX#NUMBER` into an entity\n// window-registry key + id. Implementations look up numbering configs\n// and search the consumer's REST API.\n// 2. Persistence callbacks — where to save the user's reordered shortcuts,\n// created folders, snap toggle, etc. The shell hands the new array; the\n// consumer commits it (server profile, localStorage, whatever).\n//\n// Both default to no-ops, so the desktop renders as a static surface when no\n// provider is mounted.\n\nexport interface StickyEntityRef {\n /** Window-registry key used by `openEntity`. */\n entityType: string;\n entityId: string;\n /** Optional human-readable label (defaults to `${prefix}#${number}`). */\n label?: string;\n /** Optional pre-fetched entity payload passed to openEntity as snapshot. */\n snapshot?: unknown;\n}\n\nexport type StickyResolver = (prefix: string, number: string) => Promise<StickyEntityRef | null>;\n\nexport interface DesktopHostConfig {\n /** Product name shown in the About dialog and desktop context menu. */\n productName?: string;\n /** Tagline shown under the product name in the About dialog. */\n productTagline?: string;\n /** Icon URL shown in the About dialog. Defaults to `/favicon.svg`. */\n productIcon?: string;\n /** Version string shown on the desktop watermark and About dialog. Falls\n * back to the react-os-shell package version if omitted. */\n productVersion?: string;\n /** Changelog rendered in the \"What's New\" dialog. Hidden when omitted. */\n productChangelog?: ChangelogEntry[];\n /** Copyright line in the About dialog footer. Hidden when omitted. */\n productCopyright?: string;\n /** Website URL in the About dialog footer. Hidden when omitted. */\n productWebsite?: string;\n /** Wallpaper picker options for the Customization settings page. */\n wallpapers?: { src: string; label: string }[];\n /** Resolves sticky-note refs (e.g. \"SO#27150\") to window-registry coords. */\n stickyResolver?: StickyResolver;\n /** Persists the user's desktop shortcut list. */\n saveShortcuts?: (items: DesktopItem[]) => void | Promise<void>;\n /** Persists the user's folder list. */\n saveFolders?: (folders: DesktopFolder[]) => void | Promise<void>;\n /** Persists the snap-to-grid preference. */\n saveSnap?: (snap: boolean) => void | Promise<void>;\n /** Persists the user's notepad / sticky-note content. */\n saveNotes?: (notes: unknown[]) => void | Promise<void>;\n}\n\nconst DesktopHostContext = createContext<DesktopHostConfig>({});\n\nexport function DesktopHostProvider({ value, children }: { value: DesktopHostConfig; children: ReactNode }) {\n return <DesktopHostContext.Provider value={value}>{children}</DesktopHostContext.Provider>;\n}\n\nexport function useDesktopHost(): DesktopHostConfig {\n return useContext(DesktopHostContext);\n}\n\nconst FOLDER_GRID = 90;\nconst FOLDER_ITEM_W = 80;\nconst FOLDER_ITEM_H = 80;\nconst FOLDER_PAD = 12;\n\n/** Folder content window — visually distinct from regular windows\n * (manilla-paper background, folder glyph in title) and supports\n * rubber-band selection, shift / cmd / ctrl multi-select, free\n * positioning of items, and drag-to-desktop to move items out. */\nfunction FolderWindow({ folder, items, onClose, onOpen, onMoveOut, onSetFolderPosition, onDragOutToDesktop }: {\n folder: { id: string; name: string };\n items: DesktopItem[];\n onClose: () => void;\n onOpen: (item: DesktopItem) => void;\n onMoveOut: (items: DesktopItem[]) => void;\n onSetFolderPosition: (updates: { item: DesktopItem; x: number; y: number }[]) => void;\n onDragOutToDesktop: (drops: { item: DesktopItem; clientX: number; clientY: number }[]) => void;\n}) {\n const [selected, setSelected] = useState<Set<number>>(new Set());\n const [rubber, setRubber] = useState<{ x1: number; y1: number; x2: number; y2: number } | null>(null);\n const didDragRubber = useRef(false);\n const bodyRef = useRef<HTMLDivElement>(null);\n const [bodyWidth, setBodyWidth] = useState(800);\n // Drag-out indicator is updated via direct DOM manipulation rather than\n // React state — otherwise the re-render at the boundary crossing would\n // clobber the inline `style.left`/`top` overrides we apply to the\n // dragged items, making them flicker back to their saved positions.\n const setDragOutsideClass = (on: boolean) => {\n const el = bodyRef.current;\n if (!el) return;\n el.style.outline = on ? '2px dashed rgb(96 165 250 / 0.6)' : '';\n el.style.outlineOffset = on ? '-2px' : '';\n };\n\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n const update = () => setBodyWidth(el.clientWidth);\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const cols = Math.max(1, Math.floor((bodyWidth - FOLDER_PAD) / FOLDER_GRID));\n const getItemFolderPos = (item: DesktopItem, idx: number) => {\n if (item.folderX != null && item.folderY != null) return { x: item.folderX, y: item.folderY };\n return { x: FOLDER_PAD + (idx % cols) * FOLDER_GRID, y: FOLDER_PAD + Math.floor(idx / cols) * FOLDER_GRID };\n };\n\n const toggleSelect = (i: number, e: React.MouseEvent) => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(i) ? next.delete(i) : next.add(i); return next; });\n } else if (!selected.has(i)) {\n setSelected(new Set([i]));\n }\n };\n\n // ── Rubber band on body ─────────────────────────────────────────────────\n // Coordinates are in the body's *scrolled content* space so the rectangle\n // and the items it intersects stay in sync when the body is scrolled.\n const startRubber = (e: React.PointerEvent) => {\n if (e.button !== 0 || e.target !== bodyRef.current) return;\n const el = bodyRef.current!;\n const r = el.getBoundingClientRect();\n const x = e.clientX - r.left + el.scrollLeft;\n const y = e.clientY - r.top + el.scrollTop;\n setRubber({ x1: x, y1: y, x2: x, y2: y });\n didDragRubber.current = false;\n setSelected(new Set());\n };\n\n useEffect(() => {\n if (!rubber) return;\n const computeSelection = (minX: number, maxX: number, minY: number, maxY: number) => {\n const next = new Set<number>();\n const r = bodyRef.current;\n if (!r) return next;\n const tiles = r.querySelectorAll<HTMLElement>('[data-folder-item]');\n const containerRect = r.getBoundingClientRect();\n tiles.forEach(t => {\n const tr = t.getBoundingClientRect();\n const tx = tr.left - containerRect.left + r.scrollLeft;\n const ty = tr.top - containerRect.top + r.scrollTop;\n if (tx + tr.width > minX && tx < maxX && ty + tr.height > minY && ty < maxY) {\n const i = parseInt(t.getAttribute('data-folder-item') || '-1', 10);\n if (i >= 0) next.add(i);\n }\n });\n return next;\n };\n const move = (e: PointerEvent) => {\n const el = bodyRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const x = e.clientX - r.left + el.scrollLeft;\n const y = e.clientY - r.top + el.scrollTop;\n const dx = x - rubber.x1, dy = y - rubber.y1;\n if (dx * dx + dy * dy > 16) didDragRubber.current = true;\n setRubber(prev => prev ? { ...prev, x2: x, y2: y } : null);\n if (didDragRubber.current) {\n const minX = Math.min(rubber.x1, x);\n const maxX = Math.max(rubber.x1, x);\n const minY = Math.min(rubber.y1, y);\n const maxY = Math.max(rubber.y1, y);\n setSelected(computeSelection(minX, maxX, minY, maxY));\n }\n };\n const up = () => setRubber(null);\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [rubber]);\n\n // ── Item drag (move within folder OR drop out to desktop) ──────────────\n // Mirrors Desktop's drag: if the grabbed icon is part of a multi-selection\n // they all move together; otherwise it's a single-icon drag.\n type FDragEntry = { idx: number; item: DesktopItem; origX: number; origY: number; el: HTMLElement | null };\n const dragEntriesRef = useRef<FDragEntry[]>([]);\n const dragStartRef = useRef<{ clientX: number; clientY: number } | null>(null);\n\n const startItemDrag = (i: number, e: React.PointerEvent) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n // Multi-drag if the grabbed item is already in a multi-selection.\n const useMulti = selected.has(i) && selected.size > 1;\n const idxs = useMulti ? Array.from(selected) : [i];\n if (!useMulti) setSelected(new Set([i]));\n const entries: FDragEntry[] = idxs.map(idx => {\n const item = items[idx];\n const pos = getItemFolderPos(item, idx);\n const el = bodyRef.current?.querySelector<HTMLElement>(`[data-folder-item=\"${idx}\"]`) ?? null;\n return { idx, item, origX: pos.x, origY: pos.y, el };\n }).filter(e => e.item);\n dragEntriesRef.current = entries;\n dragStartRef.current = { clientX: e.clientX, clientY: e.clientY };\n setDragOutsideClass(false);\n\n let moved = false;\n const move = (ev: PointerEvent) => {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = ev.clientX - start.clientX;\n const dy = ev.clientY - start.clientY;\n if (!moved && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) moved = true;\n if (!moved) return;\n for (const entry of dragEntriesRef.current) {\n if (!entry.el) continue;\n entry.el.style.left = `${entry.origX + dx}px`;\n entry.el.style.top = `${entry.origY + dy}px`;\n entry.el.style.zIndex = '100';\n entry.el.style.opacity = '0.85';\n }\n // Outside-folder hit-test for the \"drop on desktop\" affordance.\n const r = bodyRef.current?.getBoundingClientRect();\n const inside = !!r && ev.clientX >= r.left && ev.clientX <= r.right && ev.clientY >= r.top && ev.clientY <= r.bottom;\n setDragOutsideClass(!inside);\n };\n const up = (ev: PointerEvent) => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n const entries = dragEntriesRef.current;\n dragEntriesRef.current = [];\n dragStartRef.current = null;\n // Reset transient visual overrides. zIndex / opacity aren't React-\n // managed so they'd otherwise stick after the re-render.\n for (const entry of entries) {\n if (!entry.el) continue;\n entry.el.style.zIndex = '';\n entry.el.style.opacity = '';\n }\n setDragOutsideClass(false);\n if (!moved) return;\n const r = bodyRef.current?.getBoundingClientRect();\n const inside = !!r && ev.clientX >= r.left && ev.clientX <= r.right && ev.clientY >= r.top && ev.clientY <= r.bottom;\n if (!inside) {\n const drops = entries.map(e => ({ item: e.item, clientX: ev.clientX, clientY: ev.clientY }));\n // The items are about to leave this folder; clear the now-stale\n // index-based selection so it doesn't carry over to a different row.\n setSelected(new Set());\n onDragOutToDesktop(drops);\n } else {\n // The new in-folder position is whatever we already wrote to\n // `style.left`/`top` during the last move — read it back so React\n // can persist it.\n const updates = entries.map(e => {\n const leftStr = e.el?.style.left || `${e.origX}px`;\n const topStr = e.el?.style.top || `${e.origY}px`;\n const x = Math.max(0, parseFloat(leftStr));\n const y = Math.max(0, parseFloat(topStr));\n return { item: e.item, x, y };\n });\n onSetFolderPosition(updates);\n }\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n };\n\n const moveSelectedOut = () => {\n if (selected.size === 0) return;\n onMoveOut(Array.from(selected).map(i => items[i]).filter(Boolean));\n setSelected(new Set());\n };\n\n // Header icon = folder glyph\n const folderIcon = (\n <svg className=\"h-5 w-5 text-amber-500\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M2 6a2 2 0 012-2h5l2 2h9a2 2 0 012 2v10a2 2 0 01-2 2H4a2 2 0 01-2-2V6z\" />\n </svg>\n );\n\n // Body height: enough to hold the lowest item, with breathing room. So\n // free-positioned items can sit anywhere and the body still scrolls when\n // they're dragged below the visible region.\n const contentHeight = items.reduce((max, item, i) => {\n const pos = getItemFolderPos(item, i);\n return Math.max(max, pos.y + FOLDER_ITEM_H + FOLDER_PAD);\n }, 300);\n\n return (\n <Modal open onClose={onClose} title={folder.name} icon={folderIcon} size=\"lg\">\n <div\n ref={bodyRef}\n onPointerDown={startRubber}\n onClick={() => {\n if (didDragRubber.current) { didDragRubber.current = false; return; }\n setSelected(new Set());\n }}\n className=\"relative h-full min-h-[300px] p-3 overflow-auto\"\n style={{\n background: 'linear-gradient(135deg, rgba(254, 243, 199, 0.55) 0%, rgba(253, 230, 138, 0.4) 50%, rgba(252, 211, 77, 0.3) 100%)',\n }}\n >\n {selected.size > 0 && (\n <div className=\"sticky top-0 z-20 mb-2 flex items-center gap-2 px-2 py-1 rounded-md bg-white/80 backdrop-blur-sm shadow border border-gray-200 text-xs text-gray-700 w-fit\">\n <span>{selected.size} selected</span>\n <button onClick={moveSelectedOut} className=\"px-2 py-0.5 rounded text-blue-600 hover:bg-blue-50\">Move to desktop</button>\n <button onClick={() => setSelected(new Set())} className=\"px-2 py-0.5 rounded text-gray-500 hover:bg-gray-100\">Clear</button>\n </div>\n )}\n\n {items.length === 0 ? (\n <p className=\"text-sm text-gray-500 text-center py-8 italic\">Folder is empty. Drag documents here.</p>\n ) : (\n <div className=\"relative\" style={{ height: contentHeight }}>\n {items.map((item, i) => {\n const isSelected = selected.has(i);\n const pos = getItemFolderPos(item, i);\n return (\n <div\n key={`${item.entityType}-${item.entityId}-${i}`}\n data-folder-item={i}\n onPointerDown={(e) => startItemDrag(i, e)}\n onClick={(e) => toggleSelect(i, e)}\n onDoubleClick={() => onOpen(item)}\n style={{ position: 'absolute', left: pos.x, top: pos.y }}\n className=\"cursor-default select-none\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <FileIconTile entityType={item.entityType} isSelected={isSelected} entityId={item.entityId} label={item.label} fileKind={item.fileKind} />\n <span className={`text-[10px] font-medium text-center leading-tight truncate w-full ${isSelected ? 'text-blue-900 bg-blue-200/60 rounded px-1' : 'text-gray-700'}`}>\n {item.label}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {rubber && (\n <div\n className=\"absolute border border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(rubber.x1, rubber.x2),\n top: Math.min(rubber.y1, rubber.y2),\n width: Math.abs(rubber.x2 - rubber.x1),\n height: Math.abs(rubber.y2 - rubber.y1),\n }}\n />\n )}\n </div>\n </Modal>\n );\n}\n\nexport default function Desktop({ profile }: { profile: any }) {\n const queryClient = useQueryClient();\n const { openEntity, openPage } = useWindowManager();\n const bugReport = useBugReport();\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Read desktop preferences from the consumer prefs adapter so they stay\n // in sync with what apps like Notepad write. Some legacy code paths\n // also expect them under profile.preferences — fall back to that for\n // consumers who haven't migrated.\n const { prefs: shellPrefs, save: saveShellPrefs } = useShellPrefs();\n const prefs = { ...(profile?.preferences || {}), ...shellPrefs };\n const favDocs: DesktopItem[] = prefs.favorite_documents || [];\n const folders: DesktopFolder[] = prefs.desktop_folders || [];\n const snapEnabled: boolean = prefs.desktop_snap ?? false;\n\n // Sticky notes from notepad\n interface StickyNote { id: string; title: string; content: string; color: string; sticky: boolean; sticky_x?: number; sticky_y?: number; sticky_w?: number; sticky_h?: number; sticky_on_top?: boolean; sticky_anchor?: 'left' | 'right'; updated_at: string; }\n const allNotes: StickyNote[] = prefs.notepad_notes || [];\n const stickyNotes = allNotes.filter(n => n.sticky);\n\n // ── Entity reference support for sticky notes ──\n // The PREFIX#NUMBER → entity lookup is consumer-supplied; the shell only\n // calls the resolver and hands the result to openEntity().\n const host = useDesktopHost();\n const openStickyRef = async (prefix: string, number: string) => {\n const refNum = `${prefix}#${number}`;\n if (!host.stickyResolver) { toast.error(`Unknown reference: ${refNum}`); return; }\n try {\n const result = await host.stickyResolver(prefix, number);\n if (result) openEntity(result.entityType, result.entityId, result.snapshot, result.label ?? refNum);\n else toast.error(`${refNum} not found`);\n } catch {\n toast.error(`Failed to open ${refNum}`);\n }\n };\n\n const toggleStickyCheckbox = (noteId: string, charIndex: number) => {\n const note = allNotes.find(n => n.id === noteId);\n if (!note) return;\n const content = note.content;\n const match = content.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const updated = content.slice(0, charIndex) + replacement + content.slice(charIndex + match[0].length);\n saveNotes(allNotes.map(n => n.id === noteId ? { ...n, content: updated, updated_at: new Date().toISOString() } : n));\n };\n\n const renderStickyContent = (noteId: string, text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n let charOffset = 0;\n return lines.map((line, li) => {\n const lineStart = charOffset;\n charOffset += line.length + 1;\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — rendered as clickable when a resolver is configured;\n // if the resolver returns null at click-time the user sees a \"not found\" toast.\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n if (host.stickyResolver) {\n const prefix = m[1], num = m[2], startIdx = m.index, matchText = m[0];\n tokens.push({ idx: startIdx, len: matchText.length, render: () => (\n <button key={`r-${li}-${startIdx}`} onClick={e => { e.stopPropagation(); openStickyRef(prefix, num); }}\n className=\"text-blue-700 hover:underline font-medium cursor-pointer\">{matchText}</button>\n )});\n }\n }\n\n // Checkboxes\n const cbRegex = /\\[([ xX]?)\\]/g;\n while ((m = cbRegex.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStart + startIdx;\n tokens.push({ idx: startIdx, len: m[0].length, render: () => (\n <button key={`c-${li}-${startIdx}`} onClick={e => { e.stopPropagation(); toggleStickyCheckbox(noteId, contentCharIdx); }}\n className={`inline-flex items-center justify-center w-3.5 h-3.5 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-500 bg-white/50 hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-2.5 h-2.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n )});\n }\n\n tokens.sort((a, b) => a.idx - b.idx);\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n for (const t of tokens) {\n if (t.idx > lastIdx) parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, t.idx)}</span>);\n parts.push(t.render());\n lastIdx = t.idx + t.len;\n }\n if (lastIdx < line.length) parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n if (parts.length === 0) parts.push(<span key={`e-${li}`}>{'\\u200B'}</span>);\n\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return <div key={li} className={lineHasChecked ? 'line-through opacity-50' : ''}>{parts}</div>;\n });\n };\n\n // State\n const [dragging, setDragging] = useState<{ type: 'item' | 'folder'; idx: number; startX: number; startY: number; origX: number; origY: number } | null>(null);\n const [contextMenu, setContextMenu] = useState<{ x: number; y: number; itemIdx?: number; folderIdx?: number } | null>(null);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [rubberBand, setRubberBand] = useState<{ startX: number; startY: number; endX: number; endY: number } | null>(null);\n const [openFolder, setOpenFolder] = useState<string | null>(null);\n const [aboutOpen, setAboutOpen] = useState(false);\n const [whatsNewOpen, setWhatsNewOpen] = useState(false);\n const [widgetsOpen, setWidgetsOpen] = useState(false);\n const [renamingFolder, setRenamingFolder] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n const [editingStickyId, setEditingStickyId] = useState<string | null>(null);\n const [stickyDrag, setStickyDrag] = useState<{ id: string; startX: number; startY: number; origX: number; origY: number } | null>(null);\n const [stickyResize, setStickyResize] = useState<{ id: string; startX: number; startY: number; origW: number; origH: number } | null>(null);\n // Index of the folder the user is currently hovering while dragging an\n // icon — drives the lift / glow animation and the on-drop fold-in.\n const [hoverFolderIdx, setHoverFolderIdx] = useState<number | null>(null);\n const hoverFolderIdxRef = useRef<number | null>(null);\n\n // Save helpers — delegate persistence to the consumer-supplied callbacks\n // when wired, otherwise write through the prefs adapter so backend-less\n // demos still survive a reload.\n const saveDocs = useCallback((docs: DesktopItem[]) => {\n if (host.saveShortcuts) host.saveShortcuts(docs);\n else saveShellPrefs({ favorite_documents: docs });\n }, [host, saveShellPrefs]);\n\n const saveFolders = useCallback((f: DesktopFolder[]) => {\n if (host.saveFolders) host.saveFolders(f);\n else saveShellPrefs({ desktop_folders: f });\n }, [host, saveShellPrefs]);\n\n const saveSnap = useCallback((v: boolean) => {\n if (host.saveSnap) host.saveSnap(v);\n else saveShellPrefs({ desktop_snap: v });\n }, [host, saveShellPrefs]);\n\n // Latest-state refs so the preview-opened event handler (registered once)\n // always reads the current folders / favDocs instead of stale closure\n // values from initial mount.\n const previewStateRef = useRef({ folders, favDocs, saveFolders, saveDocs });\n previewStateRef.current = { folders, favDocs, saveFolders, saveDocs };\n\n // When the user previews a file (via Files app or a Documents-folder\n // shortcut), drop a dedup'd shortcut into the auto-created \"Documents\"\n // folder. The folder is created on first preview and recreated if the\n // user has deleted it since.\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<PreviewOpenedDetail>).detail;\n if (!detail?.filePath) return;\n const { folders: fs, favDocs: docs, saveFolders: sf, saveDocs: sd } = previewStateRef.current;\n if (!fs.some(f => f.id === DOCUMENTS_FOLDER_ID)) {\n sf([...fs, { id: DOCUMENTS_FOLDER_ID, name: DOCUMENTS_FOLDER_NAME }]);\n }\n const deduped = docs.filter(d =>\n !(d.entityType === 'preview-file' && d.filePath === detail.filePath),\n );\n const next: DesktopItem = {\n entityType: 'preview-file',\n entityId: detail.filePath,\n label: detail.filename,\n filePath: detail.filePath,\n fileKind: detail.kind,\n folderId: DOCUMENTS_FOLDER_ID,\n };\n sd([next, ...deduped]);\n };\n window.addEventListener(PREVIEW_OPENED_EVENT, handler);\n return () => window.removeEventListener(PREVIEW_OPENED_EVENT, handler);\n }, []);\n\n // Positions stored as { right, top } — distance from right/top edges\n // This keeps icons anchored to the top-right regardless of window size\n const getDefaultPos = (idx: number) => {\n const col = Math.floor(idx / 8);\n const row = idx % 8;\n return { right: 20 + col * GRID, top: 20 + row * GRID };\n };\n\n const getItemPos = (item: DesktopItem, idx: number) => {\n if (item.x != null && item.y != null) return { right: item.x, top: item.y };\n return getDefaultPos(idx);\n };\n\n const getFolderPos = (folder: DesktopFolder, idx: number) => {\n if (folder.x != null && folder.y != null) return { right: folder.x, top: folder.y };\n return getDefaultPos(favDocs.filter(d => !d.folderId).length + idx);\n };\n\n // Items not in any folder\n const desktopItems = favDocs.filter(d => !d.folderId);\n const folderItems = (folderId: string) => favDocs.filter(d => d.folderId === folderId);\n\n // ── Drag logic ──\n // Local position overrides — applied immediately on drop, before API responds\n const [localPositions, setLocalPositions] = useState<Record<string, { right: number; top: number }>>({});\n // When the drag starts on a selected icon, all selected icons move together.\n // dragEntriesRef holds one entry per moving icon: its element, type, index,\n // and origin position (relative to the desktop).\n type DragEntry = { key: string; type: 'item' | 'folder'; idx: number; origX: number; origY: number; el: HTMLElement | null };\n const dragEntriesRef = useRef<DragEntry[]>([]);\n\n const startDrag = (type: 'item' | 'folder', idx: number, e: React.PointerEvent) => {\n if (e.button !== 0) return;\n const primaryKey = `${type}-${idx}`;\n // If the icon being grabbed is in the current selection, every selected\n // icon comes along. Otherwise it's a single-icon drag and we replace\n // the selection with just this one.\n const draggingMulti = selected.has(primaryKey) && selected.size > 1;\n const keys = draggingMulti ? Array.from(selected) : [primaryKey];\n\n const entries: DragEntry[] = [];\n for (const key of keys) {\n if (key.startsWith('item-')) {\n const i = parseInt(key.slice(5), 10);\n const itm = desktopItems[i];\n if (!itm) continue;\n const pos = getItemPos(itm, i);\n const el = document.querySelector(`[data-desktop-icon=\"${key}\"]`) as HTMLElement | null;\n entries.push({ key, type: 'item', idx: i, origX: pos.right, origY: pos.top, el });\n } else if (key.startsWith('folder-')) {\n const i = parseInt(key.slice(7), 10);\n const f = folders[i];\n if (!f) continue;\n const pos = getFolderPos(f, i);\n const el = document.querySelector(`[data-desktop-icon=\"${key}\"]`) as HTMLElement | null;\n entries.push({ key, type: 'folder', idx: i, origX: pos.right, origY: pos.top, el });\n }\n }\n dragEntriesRef.current = entries;\n const primaryEntry = entries.find(e => e.key === primaryKey) ?? entries[0];\n if (!primaryEntry) return;\n setDragging({ type, idx, startX: e.clientX, startY: e.clientY, origX: primaryEntry.origX, origY: primaryEntry.origY });\n e.preventDefault();\n };\n\n useEffect(() => {\n if (!dragging) return;\n const entries = dragEntriesRef.current;\n // Single-icon drags can fold into a folder; track which folder the\n // cursor is currently hovering over so the folder element can react\n // (scale + glow) and so we can short-circuit the right-overlap test\n // on drop.\n const isSingleItemDrag = entries.length === 1 && entries[0].type === 'item';\n const move = (e: PointerEvent) => {\n const dx = e.clientX - dragging.startX;\n const dy = e.clientY - dragging.startY;\n // Apply delta to every dragged icon.\n for (const entry of entries) {\n if (!entry.el) continue;\n // Moving right → decrease right offset; moving down → increase top offset\n entry.el.style.right = `${entry.origX - dx}px`;\n entry.el.style.top = `${entry.origY + dy}px`;\n entry.el.style.left = 'auto';\n entry.el.style.zIndex = '100';\n entry.el.style.opacity = '0.7';\n }\n // Detect hover-over-folder for drop-into-folder UX.\n if (isSingleItemDrag) {\n const elsBelow = document.elementsFromPoint(e.clientX, e.clientY);\n let nextHover: number | null = null;\n for (const el of elsBelow) {\n const fk = (el as HTMLElement).closest?.('[data-desktop-icon^=\"folder-\"]');\n if (fk) {\n const key = (fk as HTMLElement).getAttribute('data-desktop-icon');\n if (key) nextHover = parseInt(key.slice(7), 10);\n break;\n }\n }\n hoverFolderIdxRef.current = nextHover;\n setHoverFolderIdx(prev => (prev === nextHover ? prev : nextHover));\n }\n };\n const up = (e: PointerEvent) => {\n const dx = e.clientX - dragging.startX;\n const dy = e.clientY - dragging.startY;\n // Reset visual transform overrides on every dragged icon.\n for (const entry of entries) {\n if (!entry.el) continue;\n entry.el.style.zIndex = '';\n entry.el.style.opacity = '';\n }\n const liveHoverIdx = hoverFolderIdxRef.current;\n const hoveredFolder = liveHoverIdx != null ? folders[liveHoverIdx] : null;\n hoverFolderIdxRef.current = null;\n setHoverFolderIdx(null);\n\n // Compute final positions for each dragged entry.\n const computedPositions = entries.map(entry => {\n let finalRight = entry.origX - dx;\n let finalTop = Math.max(0, entry.origY + dy);\n if (snapEnabled) { const s = snapToGrid(finalRight, finalTop); finalRight = s.x; finalTop = s.y; }\n finalRight = Math.max(0, finalRight);\n return { entry, finalRight, finalTop };\n });\n\n // Persist items.\n const itemMoves = computedPositions.filter(p => p.entry.type === 'item');\n if (itemMoves.length > 0) {\n const updated = [...favDocs];\n const positionsPatch: Record<string, { right: number; top: number }> = {};\n // Single-item drag onto a folder still folds in (multi-drag never folds).\n const singleItem = itemMoves.length === 1 && entries.length === 1 ? itemMoves[0] : null;\n // Prefer the actively-hovered folder (live cursor hit-test) and fall\n // back to a position-overlap check for snap-to-grid edge cases.\n const droppedOnFolder = singleItem\n ? (hoveredFolder ?? folders.find((f, fi) => {\n const fp = getFolderPos(f, fi);\n return Math.abs(singleItem.finalRight - fp.right) < 40 && Math.abs(singleItem.finalTop - fp.top) < 40;\n }))\n : undefined;\n // Visual feedback: shrink the dragged icon into the folder before the\n // saved state actually removes it from the desktop.\n if (droppedOnFolder && singleItem?.entry.el) {\n const itemEl = singleItem.entry.el;\n const folderIdx = folders.indexOf(droppedOnFolder);\n const folderEl = document.querySelector(`[data-desktop-icon=\"folder-${folderIdx}\"]`) as HTMLElement | null;\n if (folderEl) {\n const ir = itemEl.getBoundingClientRect();\n const fr = folderEl.getBoundingClientRect();\n const dx = (fr.left + fr.width / 2) - (ir.left + ir.width / 2);\n const dy = (fr.top + fr.height / 2) - (ir.top + ir.height / 2);\n itemEl.style.transition = 'transform 220ms ease-out, opacity 220ms ease-out';\n itemEl.style.transform = `translate(${dx}px, ${dy}px) scale(0.2)`;\n itemEl.style.opacity = '0';\n }\n folderEl?.animate(\n [{ transform: 'scale(1)' }, { transform: 'scale(1.15)' }, { transform: 'scale(1)' }],\n { duration: 280, easing: 'ease-out' },\n );\n }\n for (const move of itemMoves) {\n const desktopIdx = favDocs.indexOf(desktopItems[move.entry.idx]);\n if (desktopIdx === -1) continue;\n if (droppedOnFolder) {\n updated[desktopIdx] = { ...updated[desktopIdx], folderId: droppedOnFolder.id, x: undefined, y: undefined, folderX: undefined, folderY: undefined };\n } else {\n updated[desktopIdx] = { ...updated[desktopIdx], x: move.finalRight, y: move.finalTop, folderId: undefined };\n positionsPatch[`item-${desktopIdx}`] = { right: move.finalRight, top: move.finalTop };\n }\n }\n // Defer the state update so the fold-in animation has time to play.\n const commit = () => {\n saveDocs(updated);\n if (Object.keys(positionsPatch).length > 0) {\n setLocalPositions(prev => ({ ...prev, ...positionsPatch }));\n }\n };\n if (droppedOnFolder) setTimeout(commit, 220);\n else commit();\n }\n\n // Persist folders.\n const folderMoves = computedPositions.filter(p => p.entry.type === 'folder');\n if (folderMoves.length > 0) {\n const updated = [...folders];\n const positionsPatch: Record<string, { right: number; top: number }> = {};\n for (const move of folderMoves) {\n updated[move.entry.idx] = { ...updated[move.entry.idx], x: move.finalRight, y: move.finalTop };\n positionsPatch[`folder-${move.entry.idx}`] = { right: move.finalRight, top: move.finalTop };\n }\n saveFolders(updated);\n setLocalPositions(prev => ({ ...prev, ...positionsPatch }));\n }\n\n setDragging(null);\n dragEntriesRef.current = [];\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [dragging, snapEnabled, favDocs, folders, desktopItems]);\n\n // Clear local position overrides when profile data updates\n // Cache key has to include positions too — otherwise \"Snap to Grid\"\n // updates favDocs.x/y but the entityId list is unchanged, so the\n // localPositions overlay keeps the pre-snap values pinned in place.\n const favDocsKey = JSON.stringify(favDocs.map(d => `${d.entityId}:${d.x ?? ''}:${d.y ?? ''}:${d.folderId ?? ''}`));\n const foldersKey = JSON.stringify(folders.map(f => `${f.id}:${f.x ?? ''}:${f.y ?? ''}`));\n useEffect(() => { setLocalPositions({}); }, [favDocsKey, foldersKey]);\n\n // ── Rubber band selection ──\n const didRubberBandDragRef = useRef(false);\n const startRubberBand = (e: React.PointerEvent) => {\n if (e.button !== 0 || e.target !== containerRef.current) return;\n const rect = containerRef.current!.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setRubberBand({ startX: x, startY: y, endX: x, endY: y });\n didRubberBandDragRef.current = false;\n setSelected(new Set());\n };\n\n useEffect(() => {\n if (!rubberBand) return;\n const computeSelection = (minX: number, maxX: number, minY: number, maxY: number) => {\n const sel = new Set<string>();\n const cw = containerRef.current?.clientWidth || 800;\n desktopItems.forEach((item, i) => {\n const pos = getItemPos(item, i);\n const leftX = cw - pos.right - 80;\n if (leftX + 40 > minX && leftX < maxX && pos.top + 40 > minY && pos.top < maxY) {\n sel.add(`item-${i}`);\n }\n });\n folders.forEach((f, i) => {\n const pos = getFolderPos(f, i);\n const leftX = cw - pos.right - 80;\n if (leftX + 40 > minX && leftX < maxX && pos.top + 40 > minY && pos.top < maxY) {\n sel.add(`folder-${i}`);\n }\n });\n return sel;\n };\n const move = (e: PointerEvent) => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n // Mark as a real drag once the cursor has moved more than a tap.\n const dx = x - rubberBand.startX;\n const dy = y - rubberBand.startY;\n if (dx * dx + dy * dy > 16) didRubberBandDragRef.current = true;\n setRubberBand(prev => prev ? { ...prev, endX: x, endY: y } : null);\n if (didRubberBandDragRef.current) {\n const minX = Math.min(rubberBand.startX, x);\n const maxX = Math.max(rubberBand.startX, x);\n const minY = Math.min(rubberBand.startY, y);\n const maxY = Math.max(rubberBand.startY, y);\n setSelected(computeSelection(minX, maxX, minY, maxY));\n }\n };\n const up = () => {\n setRubberBand(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [rubberBand]);\n\n // ── Context menu ──\n const handleDesktopContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenu({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemContextMenu = (e: React.MouseEvent, itemIdx: number) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenu({ x: e.clientX, y: e.clientY, itemIdx });\n };\n\n const handleFolderContextMenu = (e: React.MouseEvent, folderIdx: number) => {\n e.preventDefault();\n e.stopPropagation();\n setContextMenu({ x: e.clientX, y: e.clientY, folderIdx });\n };\n\n useEffect(() => {\n if (!contextMenu) return;\n const handler = () => setContextMenu(null);\n window.addEventListener('click', handler);\n return () => window.removeEventListener('click', handler);\n }, [contextMenu]);\n\n const createFolder = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n // Icons render right-anchored (style.right = pos.right). Convert the\n // cursor's left-from-container into a right-from-container so the new\n // folder lands under the click instead of mirroring across the desktop.\n const containerW = rect?.width ?? 0;\n const cursorLeft = contextMenu ? contextMenu.x - (rect?.left ?? 0) : containerW - 100;\n const cursorTop = contextMenu ? contextMenu.y - (rect?.top ?? 0) : 100;\n const x = Math.max(0, containerW - cursorLeft - 40);\n const y = Math.max(0, cursorTop - 20);\n const id = `folder-${Date.now()}`;\n saveFolders([...folders, { id, name: 'New Folder', x, y }]);\n setContextMenu(null);\n setRenamingFolder(id);\n setRenameValue('New Folder');\n };\n\n const doSnapAll = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n const h = rect?.height || 600;\n const colCount = Math.max(1, Math.floor(h / GRID));\n let slot = 0;\n const getSlotPos = () => {\n const col = Math.floor(slot / colCount);\n const row = slot % colCount;\n slot++;\n return { right: 20 + col * GRID, top: 10 + row * GRID };\n };\n // Arrange folders first, then items\n const updatedF = folders.map(f => {\n const pos = getSlotPos();\n return { ...f, x: pos.right, y: pos.top };\n });\n saveFolders(updatedF);\n const updated = favDocs.map(d => {\n if (d.folderId) return d;\n const pos = getSlotPos();\n return { ...d, x: pos.right, y: pos.top };\n });\n saveDocs(updated);\n setContextMenu(null);\n };\n\n const removeItem = (idx: number) => {\n const desktopIdx = favDocs.indexOf(desktopItems[idx]);\n saveDocs(favDocs.filter((_, i) => i !== desktopIdx));\n setContextMenu(null);\n };\n\n const removeFolder = (idx: number) => {\n const folder = folders[idx];\n // Move folder items back to desktop\n const updated = favDocs.map(d => d.folderId === folder.id ? { ...d, folderId: undefined } : d);\n saveDocs(updated);\n saveFolders(folders.filter((_, i) => i !== idx));\n setContextMenu(null);\n };\n\n const renameFolder = (id: string, name: string) => {\n saveFolders(folders.map(f => f.id === id ? { ...f, name } : f));\n setRenamingFolder(null);\n };\n\n // ── Sticky notes ──\n // Persist through the consumer-supplied callback when one is wired,\n // otherwise fall back to the prefs adapter under `notepad_notes` so\n // Desktop drags survive a refresh and stay in sync with what Notepad\n // wrote.\n const saveNotes = useCallback((updated: StickyNote[]) => {\n if (host.saveNotes) host.saveNotes(updated);\n else saveShellPrefs({ notepad_notes: updated });\n }, [host, saveShellPrefs]);\n\n const createStickyNote = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n const x = contextMenu ? contextMenu.x - (rect?.left || 0) : 100;\n const y = contextMenu ? contextMenu.y - (rect?.top || 0) : 100;\n const n: StickyNote = {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '', content: '', color: 'yellow', sticky: true,\n sticky_x: x, sticky_y: y, updated_at: new Date().toISOString(),\n };\n saveNotes([n, ...allNotes]);\n setEditingStickyId(n.id);\n setContextMenu(null);\n };\n\n const updateStickyContent = (id: string, content: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, content, updated_at: new Date().toISOString() } : n));\n };\n\n const removeStickyFromDesktop = (id: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, sticky: false } : n));\n };\n\n const deleteStickyNote = (id: string) => {\n saveNotes(allNotes.filter(n => n.id !== id));\n };\n\n const cycleStickyColor = (id: string) => {\n const STICKY_COLORS = ['yellow', 'blue', 'green', 'pink', 'purple', 'orange'];\n const note = allNotes.find(n => n.id === id);\n if (!note) return;\n const idx = STICKY_COLORS.indexOf(note.color);\n const next = STICKY_COLORS[(idx + 1) % STICKY_COLORS.length];\n saveNotes(allNotes.map(n => n.id === id ? { ...n, color: next } : n));\n };\n\n const toggleStickyOnTop = (id: string) => {\n saveNotes(allNotes.map(n => n.id === id ? { ...n, sticky_on_top: !n.sticky_on_top } : n));\n };\n\n // Sticky drag\n useEffect(() => {\n if (!stickyDrag) return;\n const move = (e: PointerEvent) => {\n const el = document.querySelector(`[data-sticky-id=\"${stickyDrag.id}\"]`) as HTMLElement;\n if (el) {\n el.style.left = `${stickyDrag.origX + e.clientX - stickyDrag.startX}px`;\n el.style.right = 'auto';\n el.style.top = `${stickyDrag.origY + e.clientY - stickyDrag.startY}px`;\n }\n };\n const up = (e: PointerEvent) => {\n const finalX = stickyDrag.origX + e.clientX - stickyDrag.startX;\n const finalY = Math.max(0, stickyDrag.origY + e.clientY - stickyDrag.startY);\n const el = document.querySelector(`[data-sticky-id=\"${stickyDrag.id}\"]`) as HTMLElement;\n const noteW = el?.offsetWidth ?? 192;\n const centerX = finalX + noteW / 2;\n const anchor: 'left' | 'right' = centerX > window.innerWidth / 2 ? 'right' : 'left';\n // Store x as left offset for left-anchored, or right offset for right-anchored\n const xVal = anchor === 'right' ? window.innerWidth - finalX - noteW : finalX;\n saveNotes(allNotes.map(n => n.id === stickyDrag.id ? { ...n, sticky_x: xVal, sticky_y: finalY, sticky_anchor: anchor } : n));\n // Clear inline styles so React takes over\n if (el) { el.style.left = ''; el.style.right = ''; }\n setStickyDrag(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [stickyDrag, allNotes]);\n\n // Sticky resize\n useEffect(() => {\n if (!stickyResize) return;\n const move = (e: PointerEvent) => {\n const el = document.querySelector(`[data-sticky-id=\"${stickyResize.id}\"]`) as HTMLElement;\n if (el) {\n el.style.width = `${Math.max(140, stickyResize.origW + e.clientX - stickyResize.startX)}px`;\n el.style.height = `${Math.max(100, stickyResize.origH + e.clientY - stickyResize.startY)}px`;\n }\n };\n const up = (e: PointerEvent) => {\n const finalW = Math.max(140, stickyResize.origW + e.clientX - stickyResize.startX);\n const finalH = Math.max(100, stickyResize.origH + e.clientY - stickyResize.startY);\n saveNotes(allNotes.map(n => n.id === stickyResize.id ? { ...n, sticky_w: finalW, sticky_h: finalH } : n));\n setStickyResize(null);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => { window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); };\n }, [stickyResize, allNotes]);\n\n const STICKY_BG: Record<string, string> = {\n yellow: 'bg-yellow-100 border-yellow-300', blue: 'bg-blue-100 border-blue-300',\n green: 'bg-green-100 border-green-300', pink: 'bg-pink-100 border-pink-300',\n purple: 'bg-purple-100 border-purple-300', orange: 'bg-orange-100 border-orange-300',\n };\n\n // ── Render icon ──\n const renderIcon = (entityType: string, label: string, isSelected: boolean, entityId?: string, fileKind?: PreviewFileKind) => (\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <FileIconTile entityType={entityType} isSelected={isSelected} entityId={entityId} label={label} fileKind={fileKind} />\n <span className={`text-[10px] font-medium text-center leading-tight w-full drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)] ${isSelected ? 'text-blue-200 bg-blue-600/60 rounded px-1' : 'text-white'}`}>\n {label}\n </span>\n </div>\n );\n\n const menuStyle = (x: number, y: number): React.CSSProperties => ({\n ...(x + 180 > window.innerWidth ? { right: window.innerWidth - x } : { left: x }),\n ...(y + 250 > window.innerHeight ? { bottom: window.innerHeight - y } : { top: y }),\n });\n\n return (\n <div ref={containerRef} className=\"flex-1 relative overflow-hidden\"\n onPointerDown={startRubberBand}\n onContextMenu={handleDesktopContextMenu}\n onClick={() => {\n // Don't clear selection if the user just finished a rubber-band drag.\n if (didRubberBandDragRef.current) { didRubberBandDragRef.current = false; return; }\n setSelected(new Set());\n setContextMenu(null);\n }}\n >\n {/* Built-in Trash icon. Lives outside favDocs so it can't be\n deleted, renamed, or dropped into a folder, but the user can\n drag it around — its position persists to\n `prefs.desktop_trash_position`. Default position is the\n bottom-right corner, shifted in to clear the taskbar (the\n taskbar is `position: fixed` and overlays this container, so\n a naive `bottom: 20` would hide the icon under it). Double-\n click opens the Files app in trash view via the side-channel\n defined in Files.tsx. */}\n {(() => {\n const cs = typeof document !== 'undefined' ? getComputedStyle(document.documentElement) : null;\n const tbH = parseInt(cs?.getPropertyValue('--taskbar-height') || '0') || 0;\n const tbW = parseInt(cs?.getPropertyValue('--taskbar-width') || '0') || 0;\n const tbPos = (cs?.getPropertyValue('--taskbar-position') || 'bottom').trim();\n const defaultRight = 20 + (tbPos === 'right' ? tbW : 0);\n const defaultBottom = 20 + (tbPos === 'bottom' ? tbH : 0);\n const trashPos = (prefs as any).desktop_trash_position as { right: number; bottom: number } | undefined;\n const right = trashPos?.right ?? defaultRight;\n const bottom = trashPos?.bottom ?? defaultBottom;\n\n const startTrashDrag = (e: React.PointerEvent) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n const el = e.currentTarget as HTMLElement;\n const startX = e.clientX, startY = e.clientY;\n let moved = false;\n const move = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n if (!moved && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) moved = true;\n if (!moved) return;\n // Drag is from-bottom-right, so cursor moving right shrinks the\n // right offset, and moving down shrinks the bottom offset.\n el.style.right = `${right - dx}px`;\n el.style.bottom = `${bottom - dy}px`;\n el.style.opacity = '0.7';\n el.style.zIndex = '100';\n };\n const up = (ev: PointerEvent) => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n el.style.opacity = '';\n el.style.zIndex = '';\n if (!moved) return;\n const newRight = Math.max(0, right - (ev.clientX - startX));\n const newBottom = Math.max(0, bottom - (ev.clientY - startY));\n saveShellPrefs({ desktop_trash_position: { right: newRight, bottom: newBottom } } as any);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n };\n\n return (\n <div\n data-desktop-icon=\"trash\"\n style={{ position: 'absolute', right, bottom, zIndex: 1 }}\n onPointerDown={startTrashDrag}\n onClick={e => e.stopPropagation()}\n onContextMenu={e => e.preventDefault()}\n onDoubleClick={e => {\n e.stopPropagation();\n // Side-channel contract owned by src/apps/Files.tsx:\n // - global flag is read on mount when Files isn't open yet\n // - event tells an already-open Files instance to flip view\n (window as any).__REACT_OS_SHELL_FILES_VIEW__ = 'trash';\n window.dispatchEvent(new CustomEvent('react-os-shell:files-show-trash'));\n openPage('/files');\n }}\n className=\"cursor-default select-none\"\n title=\"Trash — double-click to open, drag to move\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <div className=\"w-12 h-12 flex items-center justify-center\">\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.4)]\" viewBox=\"0 0 24 24\">\n {/* Solid heroicons trash, filled with silver. Subtle darker\n stroke gives it a metallic edge against light wallpapers. */}\n <path\n fill=\"#c0c4cc\"\n stroke=\"#5f6677\"\n strokeWidth=\"0.6\"\n strokeLinejoin=\"round\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M16.5 4.478v.227a48.816 48.816 0 013.878.512.75.75 0 11-.256 1.478l-.209-.035-1.005 13.07a3 3 0 01-2.991 2.77H8.084a3 3 0 01-2.991-2.77L4.087 6.66l-.209.035a.75.75 0 01-.256-1.478A48.567 48.567 0 017.5 4.705v-.227c0-1.564 1.213-2.9 2.816-2.951a52.662 52.662 0 014.368 0c1.603.051 2.816 1.387 2.816 2.951zm-6.136-1.452a51.196 51.196 0 013.273 0C14.39 3.05 15 3.684 15 4.478v.113a49.488 49.488 0 00-6 0v-.113c0-.794.609-1.428 1.364-1.452zm-.355 5.945a.75.75 0 10-1.5.058l.347 9a.75.75 0 101.499-.058l-.346-9zm5.48.058a.75.75 0 10-1.498-.058l-.347 9a.75.75 0 001.5.058l.346-9z\"\n />\n </svg>\n </div>\n <span className=\"text-[10px] font-medium text-center leading-tight text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]\">\n Trash\n </span>\n </div>\n </div>\n );\n })()}\n\n {/* Desktop items */}\n {desktopItems.map((doc, i) => {\n const docIdx = favDocs.indexOf(doc);\n const pos = localPositions[`item-${docIdx}`] || getItemPos(doc, i);\n const isSelected = selected.has(`item-${i}`);\n return (\n <div key={`item-${doc.entityType}-${doc.entityId}-${i}`} data-desktop-icon={`item-${i}`}\n style={{ position: 'absolute', right: pos.right, top: pos.top, zIndex: 1 }}\n onPointerDown={e => { e.stopPropagation(); startDrag('item', i, e); }}\n onClick={e => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(`item-${i}`) ? next.delete(`item-${i}`) : next.add(`item-${i}`); return next; });\n } else if (!selected.has(`item-${i}`)) {\n setSelected(new Set([`item-${i}`]));\n }\n }}\n onContextMenu={e => handleItemContextMenu(e, i)}\n onDoubleClick={e => {\n e.stopPropagation();\n if (doc.entityType === 'preview-file' && doc.filePath && doc.fileKind) {\n openPreviewFile({\n filePath: doc.filePath,\n filename: doc.label,\n kind: doc.fileKind,\n onStaged: route => openPage(route),\n });\n } else if (doc.entityType === 'page') {\n openPage(doc.entityId);\n } else {\n openEntity(doc.entityType, doc.entityId, null, doc.label);\n }\n }}\n className=\"cursor-default select-none\"\n >\n {renderIcon(doc.entityType, doc.label, isSelected, doc.entityId, doc.fileKind)}\n </div>\n );\n })}\n\n {/* Folders */}\n {folders.map((folder, i) => {\n const pos = localPositions[`folder-${i}`] || getFolderPos(folder, i);\n const isSelected = selected.has(`folder-${i}`);\n const isHovered = hoverFolderIdx === i;\n const itemCount = folderItems(folder.id).length;\n return (\n <div key={`folder-${folder.id}`} data-desktop-icon={`folder-${i}`}\n style={{\n position: 'absolute', right: pos.right, top: pos.top, zIndex: 1,\n transform: isHovered ? 'scale(1.15)' : 'scale(1)',\n transition: 'transform 180ms ease-out',\n }}\n onPointerDown={e => { e.stopPropagation(); startDrag('folder', i, e); }}\n onClick={e => {\n e.stopPropagation();\n if (e.shiftKey || e.metaKey || e.ctrlKey) {\n setSelected(prev => { const next = new Set(prev); next.has(`folder-${i}`) ? next.delete(`folder-${i}`) : next.add(`folder-${i}`); return next; });\n } else if (!selected.has(`folder-${i}`)) {\n setSelected(new Set([`folder-${i}`]));\n }\n }}\n onContextMenu={e => handleFolderContextMenu(e, i)}\n onDoubleClick={e => { e.stopPropagation(); setOpenFolder(folder.id); }}\n className=\"cursor-default select-none\"\n >\n <div className=\"flex flex-col items-center gap-1 w-20 p-2\">\n <div className={`w-12 h-12 flex items-center justify-center ${isSelected ? 'rounded-lg bg-blue-400/30 ring-2 ring-blue-500' : ''} ${isHovered ? 'rounded-lg ring-4 ring-amber-400 shadow-[0_0_20px_rgba(245,158,11,0.6)]' : ''}`}>\n <svg className=\"h-12 w-12 drop-shadow-[0_2px_3px_rgba(0,0,0,0.3)]\" viewBox=\"0 0 48 48\">\n <path d=\"M6 12a4 4 0 014-4h10l4 4h14a4 4 0 014 4v20a4 4 0 01-4 4H10a4 4 0 01-4-4V12z\" fill=\"white\" stroke=\"#eab308\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M6 18h36\" stroke=\"#eab308\" strokeWidth=\"1.5\" />\n </svg>\n </div>\n {renamingFolder === folder.id ? (\n <input autoFocus value={renameValue} onChange={e => setRenameValue(e.target.value)}\n onBlur={() => renameFolder(folder.id, renameValue)}\n onKeyDown={e => { if (e.key === 'Enter') renameFolder(folder.id, renameValue); if (e.key === 'Escape') setRenamingFolder(null); }}\n className=\"text-[10px] w-full text-center bg-white/80 rounded px-1 outline-none\"\n onClick={e => e.stopPropagation()}\n />\n ) : (\n <span className={`text-[10px] font-medium text-center leading-tight w-full drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)] ${isSelected ? 'text-blue-200 bg-blue-600/60 rounded px-1' : 'text-white'}`}>\n {folder.name}{itemCount > 0 ? ` (${itemCount})` : ''}\n </span>\n )}\n </div>\n </div>\n );\n })}\n\n {/* Sticky notes */}\n {stickyNotes.map(note => {\n const xVal = note.sticky_x ?? 100;\n const y = note.sticky_y ?? 100;\n const w = note.sticky_w ?? 192;\n const h = note.sticky_h ?? 148;\n const anchor = note.sticky_anchor || 'left';\n const bg = STICKY_BG[note.color] || STICKY_BG.yellow;\n const isEditing = editingStickyId === note.id;\n return (\n <div key={`sticky-${note.id}`} data-sticky-id={note.id}\n style={{ position: 'absolute', ...(anchor === 'right' ? { right: xVal } : { left: xVal }), top: y, width: w, height: h, zIndex: note.sticky_on_top ? 200 : isEditing ? 50 : 10 }}\n onClick={e => e.stopPropagation()}\n className={`rounded-lg shadow-lg border ${bg} select-none flex flex-col`}\n >\n {/* Header — drag handle */}\n <div className=\"flex items-center justify-between px-2 py-1 cursor-move border-b border-black/5\"\n onPointerDown={e => {\n if (e.button !== 0) return;\n e.preventDefault(); e.stopPropagation();\n // Always drag using left position; convert right-anchored to left\n const el = (e.target as HTMLElement).closest('[data-sticky-id]') as HTMLElement;\n const actualLeft = el ? el.getBoundingClientRect().left - (containerRef.current?.getBoundingClientRect().left ?? 0) : (anchor === 'right' ? window.innerWidth - xVal - w : xVal);\n setStickyDrag({ id: note.id, startX: e.clientX, startY: e.clientY, origX: actualLeft, origY: y });\n }}>\n <div className=\"flex items-center gap-1\">\n <button\n onPointerDown={e => e.stopPropagation()}\n onClick={e => { e.stopPropagation(); cycleStickyColor(note.id); }}\n title=\"Change color\"\n className=\"w-3 h-3 rounded-full bg-black/10 hover:bg-black/20 transition-colors\" />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); toggleStickyOnTop(note.id); }} title={note.sticky_on_top ? 'Remove from top' : 'Always on top'}\n className={`p-0.5 rounded transition-colors ${note.sticky_on_top ? 'text-blue-500' : 'text-black/20 hover:text-black/50'}`}>\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 4.5h14.25M3 9h9.75M3 13.5h5.25m5.914 5.046a5.25 5.25 0 01-1.414 0M15.75 9v6\" /><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12.75 12l3 3 3-3\" /></svg>\n </button>\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); removeStickyFromDesktop(note.id); }} title=\"Unpin from desktop\"\n className=\"p-0.5 rounded text-black/20 hover:text-black/50 transition-colors\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 12h-15\" /></svg>\n </button>\n <button onPointerDown={e => e.stopPropagation()} onClick={e => { e.stopPropagation(); deleteStickyNote(note.id); }} title=\"Delete note\"\n className=\"p-0.5 rounded text-black/20 hover:text-red-500 transition-colors\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\n </div>\n {/* Content */}\n {isEditing ? (\n <textarea\n autoFocus\n defaultValue={note.content}\n onBlur={e => { updateStickyContent(note.id, e.target.value); setEditingStickyId(null); }}\n onKeyDown={e => { if (e.key === 'Escape') { updateStickyContent(note.id, (e.target as HTMLTextAreaElement).value); setEditingStickyId(null); } }}\n className=\"flex-1 w-full p-2 text-xs leading-relaxed bg-transparent outline-none resize-none placeholder:text-black/30\"\n placeholder=\"Write something...\"\n />\n ) : (\n <div className=\"flex-1 p-2 cursor-text overflow-hidden\" onDoubleClick={e => { e.stopPropagation(); setEditingStickyId(note.id); }}>\n <div className=\"text-xs leading-relaxed text-black/70\">\n {note.content ? renderStickyContent(note.id, note.content) : <span className=\"text-black/30 italic\">Double-click to edit...</span>}\n </div>\n </div>\n )}\n {/* Resize handle */}\n <div className=\"absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize\"\n onPointerDown={e => {\n if (e.button !== 0) return;\n e.preventDefault(); e.stopPropagation();\n const el = (e.target as HTMLElement).closest('[data-sticky-id]') as HTMLElement;\n setStickyResize({ id: note.id, startX: e.clientX, startY: e.clientY, origW: el?.offsetWidth ?? w, origH: el?.offsetHeight ?? h });\n }}>\n <svg className=\"w-3 h-3 text-black/15 absolute bottom-0.5 right-0.5\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <circle cx=\"10\" cy=\"10\" r=\"1.5\" /><circle cx=\"6\" cy=\"10\" r=\"1.5\" /><circle cx=\"10\" cy=\"6\" r=\"1.5\" />\n </svg>\n </div>\n </div>\n );\n })}\n\n {/* Rubber band selection */}\n {rubberBand && (\n <div className=\"absolute border border-blue-400 bg-blue-400/10 pointer-events-none\" style={{\n left: Math.min(rubberBand.startX, rubberBand.endX),\n top: Math.min(rubberBand.startY, rubberBand.endY),\n width: Math.abs(rubberBand.endX - rubberBand.startX),\n height: Math.abs(rubberBand.endY - rubberBand.startY),\n }} />\n )}\n\n {/* Context menu — desktop */}\n {contextMenu && contextMenu.itemIdx == null && contextMenu.folderIdx == null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)}>\n <PopupMenuItem onClick={createStickyNote}>\n <svg className=\"h-4 w-4 text-yellow-500\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M4 4a2 2 0 012-2h8a2 2 0 012 2v8a2 2 0 01-2 2H6a2 2 0 01-2-2V4z\" opacity=\"0.8\" /><path d=\"M14 14v4a2 2 0 01-2 2H6a2 2 0 01-2-2v-6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" /></svg>\n New Sticky Note\n </PopupMenuItem>\n <PopupMenuItem onClick={createFolder}>\n <svg className=\"h-4 w-4 text-yellow-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z\" /></svg>\n Create Folder\n </PopupMenuItem>\n <PopupMenuItem onClick={doSnapAll}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" /></svg>\n Snap to Grid\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); setWidgetsOpen(true); }}>\n <svg className=\"h-4 w-4 text-blue-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" /><rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.5\" /></svg>\n Manage Widgets…\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setContextMenu(null); openPage('/settings/customization'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42\" /></svg>\n Customization\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); openPage('/settings/favorites'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" /></svg>\n Favorites\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setContextMenu(null); setAboutOpen(true); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" /></svg>\n About {host.productName ?? 'this app'}\n </PopupMenuItem>\n {bugReport && <>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setContextMenu(null); reportBug(bugReport.submit); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" /></svg>\n Suggestion or Bug\n </PopupMenuItem>\n </>}\n </PopupMenu>\n )}\n\n {/* Context menu — item */}\n {contextMenu && contextMenu.itemIdx != null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)} minWidth={160}>\n <PopupMenuItem onClick={() => { const d = desktopItems[contextMenu.itemIdx!]; d.entityType === 'page' ? openPage(d.entityId) : openEntity(d.entityType, d.entityId, null, d.label); setContextMenu(null); }}>\n Open\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={() => removeItem(contextMenu.itemIdx!)}>\n Remove Shortcut\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n {/* Context menu — folder */}\n {contextMenu && contextMenu.folderIdx != null && (\n <PopupMenu style={menuStyle(contextMenu.x, contextMenu.y)} minWidth={160}>\n <PopupMenuItem onClick={() => { setOpenFolder(folders[contextMenu.folderIdx!].id); setContextMenu(null); }}>\n Open\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setRenamingFolder(folders[contextMenu.folderIdx!].id); setRenameValue(folders[contextMenu.folderIdx!].name); setContextMenu(null); }}>\n Rename\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={() => removeFolder(contextMenu.folderIdx!)}>\n Delete Folder\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n {/* Folder window */}\n {openFolder && (() => {\n const folder = folders.find(f => f.id === openFolder);\n if (!folder) return null;\n return (\n <FolderWindow\n folder={folder}\n items={folderItems(openFolder)}\n onClose={() => setOpenFolder(null)}\n onOpen={(item) => {\n if (item.entityType === 'preview-file' && item.filePath && item.fileKind) {\n openPreviewFile({\n filePath: item.filePath,\n filename: item.label,\n kind: item.fileKind,\n onStaged: route => openPage(route),\n });\n } else {\n openEntity(item.entityType, item.entityId, null, item.label);\n }\n }}\n onMoveOut={(toMove) => {\n const ids = new Set(toMove.map(t => `${t.entityType}|${t.entityId}`));\n const updated = favDocs.map(d =>\n d.folderId === openFolder && ids.has(`${d.entityType}|${d.entityId}`)\n ? { ...d, folderId: undefined, folderX: undefined, folderY: undefined }\n : d,\n );\n saveDocs(updated);\n }}\n onSetFolderPosition={(updates) => {\n // Patch folderX/folderY on each affected item. Items are\n // matched by entityType+entityId so the patch survives any\n // concurrent reordering.\n const patch = new Map(updates.map(u => [`${u.item.entityType}|${u.item.entityId}`, u]));\n const updated = favDocs.map(d => {\n const u = patch.get(`${d.entityType}|${d.entityId}`);\n return u ? { ...d, folderX: u.x, folderY: u.y } : d;\n });\n saveDocs(updated);\n }}\n onDragOutToDesktop={(drops) => {\n // Convert cursor coords to desktop right/top (icons are\n // right-anchored on the desktop, same convention used for\n // desktop→folder drops). Container ref gives us the offset.\n const containerRect = containerRef.current?.getBoundingClientRect();\n const cw = containerRef.current?.clientWidth ?? window.innerWidth;\n const patch = new Map<string, { right: number; top: number }>();\n for (const d of drops) {\n const offX = containerRect ? d.clientX - containerRect.left : d.clientX;\n const offY = containerRect ? d.clientY - containerRect.top : d.clientY;\n // Center the 80×80 icon on the cursor.\n let right = cw - offX - 40;\n let top = Math.max(0, offY - 40);\n if (snapEnabled) { const s = snapToGrid(right, top); right = s.x; top = s.y; }\n right = Math.max(0, right);\n patch.set(`${d.item.entityType}|${d.item.entityId}`, { right, top });\n }\n const updated = favDocs.map(d => {\n const p = patch.get(`${d.entityType}|${d.entityId}`);\n return p\n ? { ...d, folderId: undefined, folderX: undefined, folderY: undefined, x: p.right, y: p.top }\n : d;\n });\n saveDocs(updated);\n }}\n />\n );\n })()}\n\n {/* Widget manager — add / remove desktop widgets */}\n <WidgetManager open={widgetsOpen} onClose={() => setWidgetsOpen(false)} />\n\n {/* About dialog */}\n {aboutOpen && (() => {\n const version = host.productVersion ?? APP_VERSION;\n const showVersion: boolean = prefs.show_desktop_version ?? true;\n return (\n <Modal open={true} onClose={() => setAboutOpen(false)} title={`About ${host.productName ?? 'this app'}`} size=\"sm\" bodyScroll={false} compact dimensions={[340, 420]}>\n <div className=\"flex flex-col items-center\">\n {/* Logo & Title */}\n <div className=\"flex flex-col items-center gap-2 pt-4 pb-3 w-full\">\n <img src={host.productIcon ?? '/favicon.svg'} alt=\"\" className=\"h-16 w-16\" />\n <div className=\"text-center\">\n <h2 className=\"text-lg font-bold text-gray-900 tracking-wide\">{host.productName ?? 'react-os-shell'}</h2>\n {host.productTagline && <p className=\"text-xs text-gray-500\">{host.productTagline}</p>}\n <p className=\"text-[11px] text-gray-400 mt-1 font-mono\">{version}</p>\n </div>\n </div>\n\n {/* Open Source Licenses */}\n <div className=\"py-3 border-t border-gray-200 w-full px-4\">\n <h3 className=\"text-[10px] font-semibold text-gray-400 uppercase tracking-wide mb-2 text-center\">Open Source Licenses</h3>\n <div className=\"max-h-40 overflow-y-auto\">\n <table className=\"w-full text-[11px]\">\n <thead><tr className=\"text-gray-500 border-b border-gray-100\"><th className=\"text-left py-1 font-medium\">Package</th><th className=\"text-left py-1 font-medium\">License</th></tr></thead>\n <tbody className=\"divide-y divide-gray-50\">\n {[\n ['React', 'MIT', 'facebook/react'],\n ['React DOM', 'MIT', 'facebook/react'],\n ['React Router', 'MIT', 'remix-run/react-router'],\n ['TanStack Query', 'MIT', 'TanStack/query'],\n ['TanStack Table', 'MIT', 'TanStack/table'],\n ['React Hook Form', 'MIT', 'react-hook-form'],\n ['Axios', 'MIT', 'axios/axios'],\n ['Tailwind CSS', 'MIT', 'tailwindlabs/tailwindcss'],\n ['Headless UI', 'MIT', 'tailwindlabs/headlessui'],\n ['Heroicons', 'MIT', 'tailwindlabs/heroicons'],\n ['Recharts', 'MIT', 'recharts/recharts'],\n ['Zod', 'MIT', 'colinhacks/zod'],\n ['Vite', 'MIT', 'vitejs/vite'],\n ['TypeScript', 'Apache-2.0', 'microsoft/TypeScript'],\n ['jSpreadsheet CE', 'MIT', 'jspreadsheet/ce'],\n ['Django', 'BSD-3', 'django/django'],\n ['Django REST Framework', 'BSD-3', 'encode/django-rest-framework'],\n ['PostgreSQL', 'PostgreSQL', 'postgres/postgres'],\n ['Gunicorn', 'MIT', 'benoitc/gunicorn'],\n ].map(([name, license, repo]) => (\n <tr key={name} className=\"text-gray-600\">\n <td className=\"py-1\"><a href={`https://github.com/${repo}`} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-blue-600 hover:underline\">{name}</a></td>\n <td className=\"py-1 text-gray-400\">{license}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Copyright — bottom (consumer-configurable; hidden when neither field is supplied) */}\n {(host.productCopyright || host.productWebsite) && (\n <div className=\"pt-3 pb-2 border-t border-gray-200 w-full text-center\">\n {host.productCopyright && <p className=\"text-[10px] text-gray-400\">{host.productCopyright}</p>}\n {host.productWebsite && (\n <a href={host.productWebsite} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-[10px] text-blue-500 hover:underline\">\n {host.productWebsite.replace(/^https?:\\/\\//, '')}\n </a>\n )}\n </div>\n )}\n </div>\n </Modal>\n );\n })()}\n\n {/* Version watermark on desktop — opt-in only. Hidden by default so\n consumer apps don't end up with two version labels (the bundled\n one and their own). Set prefs.show_desktop_version = true and\n provide host.productVersion to surface it. */}\n {prefs.show_desktop_version === true && (host.productVersion ?? APP_VERSION) && (\n <button\n onClick={(e) => { e.stopPropagation(); setWhatsNewOpen(true); }}\n className={`absolute bottom-3 text-[10px] text-white/50 font-mono select-none drop-shadow-[0_1px_1px_rgba(0,0,0,0.5)] hover:text-white/80 transition-colors cursor-pointer ${\n prefs.taskbar_position === 'top' ? 'right-3' :\n prefs.taskbar_position === 'left' ? 'right-3' :\n prefs.taskbar_position === 'right' ? 'left-3' :\n 'right-3 !bottom-16'\n }`}\n >\n {host.productVersion ?? APP_VERSION}\n </button>\n )}\n\n {/* What's New dialog */}\n {whatsNewOpen && (() => {\n const entries = host.productChangelog ?? changelog;\n return (\n <Modal open={true} onClose={() => setWhatsNewOpen(false)} title=\"What's New\" size=\"md\" bodyScroll={false}>\n <div className=\"space-y-5 max-h-[60vh] overflow-y-auto px-1\">\n {entries.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-6\">No changelog available.</p>\n ) : entries.map((entry, i) => (\n <div key={entry.version}>\n <div className=\"flex items-center gap-3 mb-2\">\n <span className=\"text-sm font-bold text-gray-900 font-mono\">{entry.version}</span>\n <span className=\"text-xs text-gray-400\">{formatDate(entry.date)}</span>\n </div>\n <ul className=\"space-y-1.5 ml-1\">\n {entry.changes.map((change, j) => (\n <li key={j} className=\"flex items-start gap-2 text-sm text-gray-600\">\n <span className=\"text-blue-500 mt-1 shrink-0\">&#8226;</span>\n {change}\n </li>\n ))}\n </ul>\n {i < entries.length - 1 && <div className=\"border-b border-gray-200 mt-4\" />}\n </div>\n ))}\n </div>\n </Modal>\n );\n })()}\n </div>\n );\n}\n","import { useEffect, useSyncExternalStore } from 'react';\nimport { useShellPrefs } from '../shell/ShellPrefs';\n\nexport type Theme = 'system' | 'light' | 'dark' | 'pink' | 'green' | 'grey' | 'blue';\n\n/** Subscribe to OS dark-mode changes */\nfunction subscribeMediaQuery(cb: () => void) {\n const mq = window.matchMedia('(prefers-color-scheme: dark)');\n mq.addEventListener('change', cb);\n return () => mq.removeEventListener('change', cb);\n}\nfunction getSystemIsDark() {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/** Derive lighter / darker shades from a hex color via HSL */\nfunction hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n const max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h = 0, s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n }\n return [h * 360, s * 100, l * 100];\n}\nfunction hslToHex(h: number, s: number, l: number): string {\n s /= 100; l /= 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) => { const k = (n + h / 30) % 12; return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); };\n const toHex = (x: number) => Math.round(x * 255).toString(16).padStart(2, '0');\n return `#${toHex(f(0))}${toHex(f(8))}${toHex(f(4))}`;\n}\n\nexport function useTheme() {\n const { prefs } = useShellPrefs();\n const systemDark = useSyncExternalStore(subscribeMediaQuery, getSystemIsDark);\n const saved: Theme = (prefs.theme as Theme) || 'system';\n const accentColor: string | null = prefs.accent_color || null;\n const customBgColor: string | null = prefs.custom_bg_color || null;\n const customTitleColor: string | null = prefs.custom_title_color || null;\n const customWindowColor: string | null = prefs.custom_window_color || null;\n const customButtonColor: string | null = prefs.custom_button_color || null;\n\n // Resolve \"system\" to actual theme\n const resolved = saved === 'system' ? (systemDark ? 'dark' : 'light') : saved;\n\n useEffect(() => {\n document.documentElement.setAttribute('data-theme', resolved);\n return () => document.documentElement.removeAttribute('data-theme');\n }, [resolved]);\n\n // Custom accent color\n useEffect(() => {\n const root = document.documentElement;\n if (accentColor && /^#[0-9a-fA-F]{6}$/.test(accentColor)) {\n const [h, s, l] = hexToHsl(accentColor);\n root.setAttribute('data-custom-accent', 'true');\n root.style.setProperty('--accent-600', accentColor);\n root.style.setProperty('--accent-700', hslToHex(h, s, Math.max(l - 10, 5)));\n root.style.setProperty('--accent-500', hslToHex(h, s, Math.min(l + 10, 95)));\n root.style.setProperty('--accent-400', hslToHex(h, s, Math.min(l + 20, 95)));\n root.style.setProperty('--accent-300', hslToHex(h, Math.min(s + 10, 100), Math.min(l + 30, 92)));\n root.style.setProperty('--accent-200', hslToHex(h, Math.min(s + 15, 100), Math.min(l + 38, 94)));\n root.style.setProperty('--accent-100', hslToHex(h, Math.min(s + 20, 100), Math.min(l + 42, 96)));\n root.style.setProperty('--accent-50', hslToHex(h, Math.min(s + 20, 100), Math.min(l + 46, 98)));\n } else {\n root.removeAttribute('data-custom-accent');\n ['--accent-600', '--accent-700', '--accent-500', '--accent-400', '--accent-300', '--accent-200', '--accent-100', '--accent-50'].forEach(p => root.style.removeProperty(p));\n }\n }, [accentColor]);\n\n // Custom theme colors (bg, title, window, button)\n useEffect(() => {\n const root = document.documentElement;\n if (accentColor) {\n // Helper to convert hex to \"r g b\" for rgba usage\n const hexToRgb = (hex: 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 `${r} ${g} ${b}`;\n };\n if (customBgColor) root.style.setProperty('--custom-bg-color', customBgColor);\n if (customTitleColor) {\n root.style.setProperty('--window-header-rgb', hexToRgb(customTitleColor));\n root.style.setProperty('--window-footer-rgb', hexToRgb(customTitleColor));\n }\n if (customWindowColor) root.style.setProperty('--window-content-rgb', hexToRgb(customWindowColor));\n if (customButtonColor) {\n root.style.setProperty('--custom-button-color', customButtonColor);\n const [h, s, l] = hexToHsl(customButtonColor);\n root.style.setProperty('--custom-button-hover', hslToHex(h, s, Math.max(l - 10, 5)));\n }\n } else {\n ['--custom-bg-color', '--custom-button-color', '--custom-button-hover'].forEach(p => root.style.removeProperty(p));\n }\n }, [accentColor, customBgColor, customTitleColor, customWindowColor, customButtonColor]);\n\n return { theme: saved, resolved };\n}\n","import { useEffect, type RefObject } from 'react';\n\nexport default function useClickOutside(ref: RefObject<HTMLElement | null>, onClose: () => void) {\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [ref, onClose]);\n}\n","import { useState, useEffect, useRef } from 'react';\n\n/**\n * Startup splash animation — shown once when the app first loads after login.\n * Fades out after the animation completes, then unmounts.\n */\nexport default function StartupAnimation({ onComplete, ready = false, productName = 'react-os-shell', subtitle }: { onComplete: () => void; ready?: boolean; productName?: string; subtitle?: string }) {\n const [phase, setPhase] = useState<'logo' | 'text' | 'fade'>('logo');\n const [minTimePassed, setMinTimePassed] = useState(false);\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n const fadingRef = useRef(false);\n\n useEffect(() => {\n const t1 = setTimeout(() => setPhase('text'), 600);\n const t2 = setTimeout(() => setMinTimePassed(true), 2000);\n // Safety: force complete after 5s even if ready never fires\n const t3 = setTimeout(() => {\n if (!fadingRef.current) { fadingRef.current = true; setPhase('fade'); setTimeout(() => onCompleteRef.current(), 500); }\n }, 5000);\n return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); };\n }, []);\n\n // Fade out when both ready AND minimum time passed\n useEffect(() => {\n if (!ready || !minTimePassed || fadingRef.current) return;\n fadingRef.current = true;\n setPhase('fade');\n const t = setTimeout(() => onCompleteRef.current(), 500);\n return () => clearTimeout(t);\n }, [ready, minTimePassed]);\n\n return (\n <div\n className={`fixed inset-0 z-[9999] flex flex-col items-center justify-center transition-opacity duration-500 ${phase === 'fade' ? 'opacity-0 pointer-events-none' : 'opacity-100'}`}\n style={{ background: 'linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)' }}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full opacity-20\"\n style={{ background: 'radial-gradient(circle, rgba(124,58,237,0.4) 0%, transparent 70%)', animation: 'pulse-glow 2s ease-in-out infinite' }} />\n </div>\n\n {/* Logo */}\n <div className={`relative transition-all duration-700 ease-out ${phase === 'logo' ? 'scale-75 opacity-0' : 'scale-100 opacity-100'}`}>\n <img src=\"/favicon.svg\" alt=\"\" className=\"h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]\"\n style={{ animation: 'spin-in 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards' }} />\n </div>\n\n {/* Title */}\n <div className={`mt-6 text-center transition-all duration-500 ${phase !== 'logo' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`}>\n <h1 className=\"text-2xl font-bold tracking-[0.3em] text-white/90 uppercase\">{productName}</h1>\n <div className=\"mt-2 flex items-center justify-center gap-1.5\">\n {[0, 1, 2].map(i => (\n <div key={i} className=\"w-1.5 h-1.5 rounded-full bg-purple-400\"\n style={{ animation: `dot-bounce 1s ease-in-out ${i * 0.15}s infinite` }} />\n ))}\n </div>\n </div>\n\n {/* Subtitle (consumer-supplied — typically the company / product name) */}\n {subtitle && (\n <div className={`absolute bottom-8 transition-all duration-500 ${phase !== 'logo' ? 'opacity-40' : 'opacity-0'}`}>\n <p className=\"text-[10px] text-white/40 font-mono tracking-wider\">{subtitle}</p>\n </div>\n )}\n\n <style>{`\n @keyframes spin-in {\n 0% { transform: scale(0) rotate(-180deg); opacity: 0; }\n 100% { transform: scale(1) rotate(0deg); opacity: 1; }\n }\n @keyframes dot-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }\n 40% { transform: scale(1); opacity: 1; }\n }\n @keyframes pulse-glow {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.15; }\n 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.25; }\n }\n `}</style>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { playLogout } from '../utils/sounds';\n\nexport default function LogoutAnimation({ onComplete, subtitle }: { onComplete: () => void; subtitle?: string }) {\n // 'show' → greeting visible; 'out' → logo/title spin and fade away. The\n // full-screen cover itself stays opaque the whole time — it never fades to\n // transparent — so the desktop underneath is never revealed. onComplete\n // fires while the cover is still solid, so the consumer's login screen\n // swaps in behind it and the user goes straight from \"Goodbye\" to login\n // (no flash of the desktop in between).\n const [phase, setPhase] = useState<'show' | 'out'>('show');\n\n useEffect(() => {\n playLogout();\n const t1 = setTimeout(() => setPhase('out'), 800);\n const t2 = setTimeout(onComplete, 2300);\n return () => { clearTimeout(t1); clearTimeout(t2); };\n }, [onComplete]);\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex flex-col items-center justify-center\"\n style={{ background: 'linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)' }}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full\"\n style={{\n background: 'radial-gradient(circle, rgba(124,58,237,0.4) 0%, transparent 70%)',\n animation: 'logout-glow 2s ease-in-out infinite',\n opacity: phase === 'show' ? 0.2 : 0,\n transition: 'opacity 1s',\n }} />\n </div>\n\n {/* Logo — spins out */}\n <div className={`relative transition-all duration-1000 ease-in ${phase === 'out' ? 'scale-0 opacity-0' : 'scale-100 opacity-100'}`}\n style={phase === 'out' ? { transform: 'scale(0) rotate(180deg)' } : undefined}>\n <img src=\"/favicon.svg\" alt=\"\" className=\"h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]\" />\n </div>\n\n {/* Title — fades down */}\n <div className={`mt-6 text-center transition-all duration-700 ${phase === 'show' ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'}`}>\n <h1 className=\"text-2xl font-bold tracking-[0.3em] text-white/90 uppercase\">Goodbye</h1>\n <p className=\"mt-2 text-xs text-white/40\">See you next time</p>\n </div>\n\n {/* Subtitle (consumer-supplied — typically the company / product name) */}\n {subtitle && (\n <div className={`absolute bottom-8 transition-all duration-500 ${phase === 'show' ? 'opacity-40' : 'opacity-0'}`}>\n <p className=\"text-[10px] text-white/40 font-mono tracking-wider\">{subtitle}</p>\n </div>\n )}\n\n <style>{`\n @keyframes logout-glow {\n 0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.15; }\n 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.25; }\n }\n `}</style>\n </div>\n );\n}\n","import { useState, useEffect, useLayoutEffect, useRef, isValidElement, cloneElement, type ReactElement, type ReactNode } from 'react';\nimport {\n navSections as defaultNavSections,\n navIcons as defaultNavIcons,\n sectionIcons as defaultSectionIcons,\n startMenuCategories as defaultCategories,\n isSection,\n type NavSection,\n type NavItem,\n type StartMenuCategories,\n type VirtualSection,\n} from '../shell-config/nav';\nimport { useAuth } from '../contexts/AuthContext';\nimport { glassStyle, GLASS_INPUT_BG } from '../utils/glass';\nimport { useIsMobile } from './useIsMobile';\n\ninterface StartMenuProps {\n open: boolean; onClose: () => void; openPage: (path: string) => void;\n openWindows: { route?: string; label: string }[];\n profile: any; user: any; onLogout: () => void; onNavigate: (path: string) => void;\n taskbarPosition: 'top' | 'bottom' | 'left' | 'right'; taskbarH: number; taskbarW?: number;\n size?: 'small' | 'medium' | 'large';\n /** Override the default nav sections (sections + top-level items). */\n navSections?: (NavSection | NavItem)[];\n /** Per-route icon map for items in the menu. */\n navIcons?: Record<string, ReactNode>;\n /** Per-section header icon map. */\n sectionIcons?: Record<string, ReactNode>;\n /** Section grouping + virtual flyouts (Utilities-style trays). */\n categories?: StartMenuCategories;\n}\n\nconst ITEM_H = 36; // approximate height per menu item in px\n\nexport default function StartMenu({\n open, onClose, openPage, profile, user, onLogout,\n taskbarPosition, taskbarH, taskbarW = 0, size = 'medium',\n navSections = defaultNavSections,\n navIcons = defaultNavIcons,\n sectionIcons = defaultSectionIcons,\n categories = defaultCategories,\n}: StartMenuProps) {\n const erpLabels = new Set(categories.erp);\n const systemLabels = new Set(categories.system);\n const footerLabels = new Set(categories.footer ?? []);\n const virtualSections = categories.virtual ?? [];\n const virtualByLabel: Record<string, VirtualSection> = Object.fromEntries(\n virtualSections.map(v => [v.label, v]),\n );\n const { hasAnyPerm } = useAuth();\n // Flat rows pinned to the footer (next to the profile), e.g. System\n // Preferences. Rendered directly — no flyout — unlike `categories.footer`.\n const footerItems = (categories.footerItems ?? []).filter(item => !item.perms || hasAnyPerm(item.perms));\n const isMobile = useIsMobile();\n const [hoveredSection, setHoveredSection] = useState<string | null>(null);\n const [hoveredY, setHoveredY] = useState(0);\n // 3rd-level flyout: when the user hovers a NavItem (inside a section flyout)\n // that has `children`, we open a sub-flyout anchored next to that item.\n const [hoveredChild, setHoveredChild] = useState<string | null>(null);\n const [hoveredChildY, setHoveredChildY] = useState(0);\n const [search, setSearch] = useState('');\n const [searchIdx, setSearchIdx] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n const flyoutRef = useRef<HTMLDivElement>(null);\n const subFlyoutRef = useRef<HTMLDivElement>(null);\n const hoverTimeout = useRef<ReturnType<typeof setTimeout>>();\n const childHoverTimeout = useRef<ReturnType<typeof setTimeout>>();\n // Measured heights — used to refine the estimate-based top position so the\n // flyout fits its content without needing a scrollbar. Tracked together\n // with the target (section/child) the measurement is FOR, so a stale value\n // from a previous target is never used: when the target changes the\n // derived `flyoutH` falls back to the estimate until useLayoutEffect\n // re-measures. This avoids the post-paint reset that previously caused the\n // level-2 flyout to \"bounce\" between estimate and measured positions —\n // that bounce would shift items vertically right under the cursor, so\n // hovering an item with children on the first try never registered.\n const [measuredFlyout, setMeasuredFlyout] = useState<{ key: string; h: number } | null>(null);\n const [measuredSub, setMeasuredSub] = useState<{ key: string; h: number } | null>(null);\n\n useEffect(() => { if (!open) { setSearch(''); setHoveredSection(null); setHoveredChild(null); setSearchIdx(0); } }, [open]);\n\n // Clear the 3rd-level flyout whenever the level-2 flyout changes target.\n useEffect(() => { setHoveredChild(null); }, [hoveredSection]);\n\n // Capture each flyout's intrinsic rendered height after layout. Runs\n // before paint, so the very next paint repositions using the actual h.\n // Stale measurements from a different target are discarded by the\n // `measuredFlyout?.key === hoveredSection` check below.\n useLayoutEffect(() => {\n if (!flyoutRef.current || !hoveredSection || search.length >= 2) return;\n const h = flyoutRef.current.offsetHeight;\n if (measuredFlyout?.key !== hoveredSection || measuredFlyout.h !== h) {\n setMeasuredFlyout({ key: hoveredSection, h });\n }\n }, [hoveredSection, search, measuredFlyout]);\n useLayoutEffect(() => {\n if (!subFlyoutRef.current || !hoveredChild || search.length >= 2) return;\n const h = subFlyoutRef.current.offsetHeight;\n if (measuredSub?.key !== hoveredChild || measuredSub.h !== h) {\n setMeasuredSub({ key: hoveredChild, h });\n }\n }, [hoveredChild, search, measuredSub]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n const click = (e: PointerEvent | MouseEvent) => {\n if ((e.target as HTMLElement).closest('[data-menu-toggle]')) return;\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener('keydown', handler);\n window.addEventListener('pointerdown', click);\n return () => { window.removeEventListener('keydown', handler); window.removeEventListener('pointerdown', click); };\n }, [open, onClose]);\n\n if (!open) return null;\n\n const handleClick = (path: string) => { openPage(path); onClose(); };\n\n // Mobile: render as full-screen slide-up sheet with search + flat list.\n // Folders live on MobileHome; this sheet is the quick-launch / search UI\n // surfaced from the bottom-nav \"Menu\" button.\n if (isMobile) {\n const allItems: { item: NavItem; sectionLabel?: string }[] = [];\n // Recursively flatten — 3rd-level children show up as their own rows so\n // they can be searched/tapped from the mobile sheet too.\n const pushItem = (it: NavItem, sectionLabel?: string) => {\n if (it.perms && !hasAnyPerm(it.perms)) return;\n allItems.push({ item: it, sectionLabel });\n if (it.children) {\n for (const c of it.children) pushItem(c, it.label);\n }\n };\n for (const entry of navSections) {\n if (isSection(entry)) {\n const sec = entry as NavSection;\n if (sec.perms && !hasAnyPerm(sec.perms)) continue;\n for (const it of sec.items) pushItem(it, sec.label);\n } else {\n pushItem(entry as NavItem);\n }\n }\n for (const it of footerItems) pushItem(it);\n const filtered = search.length >= 1\n ? allItems.filter(({ item }) => item.label.toLowerCase().includes(search.toLowerCase()))\n : allItems;\n\n return (\n <div\n ref={menuRef}\n className=\"fixed inset-0 z-[260] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 56px)' }}\n >\n {/* Sheet handle + header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close menu\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <div className={`flex-1 flex items-center gap-2 ${GLASS_INPUT_BG} rounded-lg px-3 py-2`}>\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n <input\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search apps...\"\n className=\"flex-1 bg-transparent text-sm outline-none placeholder-gray-400\"\n autoFocus\n />\n </div>\n </div>\n\n {/* Flat list */}\n <div className=\"flex-1 overflow-y-auto\">\n {filtered.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-12\">No matching apps</p>\n ) : (\n filtered.map(({ item, sectionLabel }, i) => {\n const icon = navIcons[item.to];\n return (\n <button\n key={`${item.to}-${i}`}\n onClick={() => handleClick(item.to)}\n className=\"w-full flex items-center gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <span className=\"h-8 w-8 rounded-lg bg-gray-100 flex items-center justify-center text-gray-600 shrink-0\">\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: 'h-5 w-5' })\n : null}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-gray-900 truncate\">{item.label}</div>\n {sectionLabel && <div className=\"text-[11px] text-gray-500 truncate\">{sectionLabel}</div>}\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n );\n }\n\n // Use the \"vertical\" (sidebar-style) layout for top, left, right taskbar positions.\n // Only the bottom taskbar uses the original layout (top items first, ERP after divider).\n const isVertical = taskbarPosition !== 'bottom';\n const topItems = navSections.filter(item => !isSection(item)) as NavItem[];\n const erpSections = navSections.filter(item => isSection(item) && erpLabels.has((item as NavSection).label));\n const systemSections = navSections.filter(item => isSection(item) && systemLabels.has((item as NavSection).label));\n const footerSections = navSections.filter(item => isSection(item) && footerLabels.has((item as NavSection).label));\n // The \"apps\" group = top-level items + system + virtual sections. Gates the\n // ERP↔apps divider so it only renders when both sides have content.\n const hasAppsGroup = topItems.length > 0 || systemSections.length > 0 || virtualSections.length > 0;\n\n const getVisibleItems = (section: NavSection) =>\n section.items.filter(item => !item.perms || hasAnyPerm(item.perms));\n\n // Search — walks 3rd-level children too. Section column shows the parent\n // item label for children so users can tell nested entries apart.\n const matchTree = (it: NavItem, sectionLabel: string): (NavItem & { section: string })[] => {\n if (it.perms && !hasAnyPerm(it.perms)) return [];\n const hits: (NavItem & { section: string })[] = [];\n if (it.label.toLowerCase().includes(search.toLowerCase())) {\n hits.push({ ...it, section: sectionLabel });\n }\n if (it.children) {\n for (const c of it.children) hits.push(...matchTree(c, it.label));\n }\n return hits;\n };\n const searchResults = search.length >= 2 ? [\n ...navSections.flatMap(item => {\n if (isSection(item)) {\n const sec = item as NavSection;\n return sec.items.flatMap(i => matchTree(i, sec.label));\n }\n return matchTree(item as NavItem, '');\n }),\n ...footerItems.flatMap(item => matchTree(item, '')),\n ] : [];\n\n const posStyle: React.CSSProperties =\n taskbarPosition === 'top' ? { top: taskbarH + 8, left: 8 } :\n taskbarPosition === 'left' ? { top: 8, left: taskbarW + 8 } :\n taskbarPosition === 'right' ? { top: 8, right: taskbarW + 8 } :\n { bottom: taskbarH + 8, left: 8 };\n\n const iconEl = (path: string) => {\n const icon = navIcons[path];\n if (icon && isValidElement(icon)) return cloneElement(icon as ReactElement, { className: 'h-4 w-4' });\n return null;\n };\n\n const secIcon = (label: string) => {\n const icon = sectionIcons[label];\n if (icon && isValidElement(icon)) return cloneElement(icon as ReactElement, { className: 'h-4 w-4' });\n return null;\n };\n\n // Flyout data — either a real section or a configured virtual section\n const hoveredVirtual = hoveredSection ? virtualByLabel[hoveredSection] : undefined;\n const hoveredData = hoveredVirtual\n ? null\n : (hoveredSection ? [...erpSections, ...systemSections, ...footerSections].find(s => (s as NavSection).label === hoveredSection) as NavSection | undefined : null);\n const flyoutItems = hoveredVirtual\n ? hoveredVirtual.items\n : (hoveredData ? getVisibleItems(hoveredData) : []);\n\n // Density from CSS variable\n const menuDensity = typeof document !== 'undefined' ? (getComputedStyle(document.documentElement).getPropertyValue('--menu-density')?.trim() || 'normal') : 'normal';\n const tight = menuDensity === 'tight';\n\n // Size-dependent styles (adjusted for density)\n const sizeConfig = tight\n ? { small: { w: 'w-52', fw: 'w-44', text: 'text-xs', py: 'py-1', px: 'px-3', mw: 208, itemH: 24 }, medium: { w: 'w-56', fw: 'w-48', text: 'text-xs', py: 'py-1', px: 'px-3', mw: 224, itemH: 26 }, large: { w: 'w-64', fw: 'w-52', text: 'text-sm', py: 'py-1.5', px: 'px-3', mw: 256, itemH: 30 } }[size]\n : { small: { w: 'w-56', fw: 'w-48', text: 'text-xs', py: 'py-1.5', px: 'px-3', mw: 224, itemH: 30 }, medium: { w: 'w-64', fw: 'w-56', text: 'text-sm', py: 'py-2', px: 'px-4', mw: 256, itemH: 36 }, large: { w: 'w-72', fw: 'w-60', text: 'text-sm', py: 'py-2.5', px: 'px-4', mw: 288, itemH: 40 } }[size];\n const menuGlass = glassStyle();\n const itemCls = `w-full flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;\n\n // Calculate flyout vertical position — center on hovered item, clamp so it\n // stays within the main menu's visible span (so it can't drift below the\n // menu bottom and overlap the taskbar). The first render uses a rough\n // estimate (`flyoutEstH`); a `useLayoutEffect` then captures the actual\n // rendered height in `measuredFlyout`, and the next paint repositions the\n // flyout using that measured value — so it never needs a scrollbar even\n // when labels wrap or dividers nudge the height past the estimate.\n const flyoutEstH = flyoutItems.length * sizeConfig.itemH + 12;\n const flyoutH = measuredFlyout?.key === hoveredSection ? measuredFlyout.h : flyoutEstH;\n const menuWidth = sizeConfig.mw;\n const menuRect = menuRef.current?.getBoundingClientRect();\n const minTop = menuRect ? menuRect.top : (taskbarPosition === 'top' ? taskbarH + 4 : 4);\n const maxBottom = menuRect ? menuRect.bottom : (taskbarPosition === 'bottom' ? window.innerHeight - taskbarH - 4 : window.innerHeight - 4);\n let flyoutTop = hoveredY - flyoutH / 2;\n if (flyoutTop < minTop) flyoutTop = minTop;\n if (flyoutTop + flyoutH > maxBottom) flyoutTop = Math.max(minTop, maxBottom - flyoutH);\n\n const handleSectionHover = (label: string, e: React.MouseEvent) => {\n clearTimeout(hoverTimeout.current);\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setHoveredY(rect.top + rect.height / 2);\n setHoveredSection(label);\n };\n\n const renderSection = (section: NavSection, isErp: boolean) => {\n if (section.perms && !hasAnyPerm(section.perms)) return null;\n const items = getVisibleItems(section);\n if (items.length === 0) return null;\n const isHovered = hoveredSection === section.label;\n return (\n <div key={section.label}\n onMouseEnter={e => handleSectionHover(section.label, e)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => setHoveredSection(null), 200); }}>\n <button className={`${itemCls} transition-colors ${isHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {secIcon(section.label)}\n <span className={isErp ? 'font-medium' : ''}>{section.label}</span>\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n );\n };\n\n const renderVirtualSection = (v: VirtualSection) => {\n if (v.items.length === 0) return null;\n const isHovered = hoveredSection === v.label;\n return (\n <div key={v.label}\n onMouseEnter={e => handleSectionHover(v.label, e)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => setHoveredSection(null), 200); }}>\n <button className={`${itemCls} transition-colors ${isHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {v.icon}\n <span>{v.label}</span>\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n </button>\n </div>\n );\n };\n\n return (\n <div ref={menuRef} className=\"fixed z-[260]\" style={posStyle}>\n <div className=\"flex\">\n {/* Main menu */}\n <div className={`${sizeConfig.w} rounded-2xl flex ${isVertical ? 'flex-col-reverse' : 'flex-col'} overflow-hidden`}\n style={{ animation: 'menu-in 0.15s ease-out', ...menuGlass }}>\n\n {/* Search — at top for horizontal, at bottom for vertical */}\n <div className={`px-3 ${isVertical ? 'pb-3 pt-2 border-t border-white/20' : 'pt-3 pb-2'}`}>\n <div className={`flex items-center gap-2 ${GLASS_INPUT_BG} rounded-lg px-2.5 py-1.5`}>\n <svg className=\"h-3.5 w-3.5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" /></svg>\n <input value={search} onChange={e => { setSearch(e.target.value); setHoveredSection(null); setSearchIdx(0); }}\n onKeyDown={e => {\n if (search.length >= 2 && searchResults.length > 0) {\n if (e.key === 'ArrowDown') { e.preventDefault(); setSearchIdx(i => Math.min(i + 1, searchResults.length - 1)); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); setSearchIdx(i => Math.max(i - 1, 0)); }\n else if (e.key === 'Enter') { e.preventDefault(); handleClick(searchResults[searchIdx].to); }\n }\n }}\n placeholder=\"Search...\"\n className=\"flex-1 bg-transparent text-xs outline-none placeholder-gray-400\" autoFocus />\n </div>\n </div>\n\n {search.length >= 2 ? (\n <div className=\"flex-1 overflow-y-auto px-1 pb-2 max-h-[400px]\">\n {searchResults.length === 0 ? (\n <p className=\"text-xs text-gray-400 text-center py-4\">No results</p>\n ) : searchResults.map((r, i) => (\n <button key={i} onClick={() => handleClick(r.to)}\n onMouseEnter={() => setSearchIdx(i)}\n className={`${itemCls} transition-colors ${i === searchIdx ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {iconEl(r.to)}\n <span>{r.label}</span>\n {r.section && <span className=\"text-[10px] text-gray-400 ml-auto\">{r.section}</span>}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex-1 overflow-y-auto px-1 pb-1 flex flex-col\">\n {isVertical && (<>\n {/* Reversed column → profile sits at the top, so footer items +\n sections render first to stay pinned next to it. */}\n {footerItems.map(item => (\n <button key={item.to} onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n ))}\n {footerSections.map(s => renderSection(s as NavSection, false))}\n {(footerSections.length > 0 || footerItems.length > 0) && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {/* Vertical layout: ERP sections first */}\n {erpSections.map(s => renderSection(s as NavSection, true))}\n {erpSections.length > 0 && hasAppsGroup && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {/* Then top-level items + system */}\n {topItems.map(item => (\n <div key={item.to}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}{systemSections.map(s => renderSection(s as NavSection, false))}\n {virtualSections.map(v => renderVirtualSection(v))}\n </>)}\n\n {!isVertical && (<>\n {/* Horizontal layout: top-level items first, ERP after divider */}\n {topItems.map(item => (\n <div key={item.to}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}{systemSections.map(s => renderSection(s as NavSection, false))}\n {virtualSections.map(v => renderVirtualSection(v))}\n {hasAppsGroup && erpSections.length > 0 && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {erpSections.map(s => renderSection(s as NavSection, true))}\n {/* Footer items + sections: pinned just above the profile, divided from ERP. */}\n {(footerSections.length > 0 || footerItems.length > 0) && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n {footerSections.map(s => renderSection(s as NavSection, false))}\n {footerItems.map(item => (\n <button key={item.to} onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n </button>\n ))}\n </>)}\n </div>\n )}\n\n {/* User profile — name + sign out on same row */}\n <div className={`${isVertical ? 'border-b' : 'border-t'} border-white/20 p-1`}>\n <div onClick={() => handleClick('/profile')}\n className=\"rounded-lg px-2 py-1.5 flex items-center gap-2.5 hover:bg-blue-50 hover:text-blue-700 transition-colors cursor-pointer\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-8 w-8 rounded-full object-cover border border-white/20 shrink-0\" />\n ) : (\n <div className=\"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-sm font-bold text-blue-700 shrink-0\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <p className=\"flex-1 min-w-0 text-sm font-medium text-gray-900 truncate\">\n {profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}\n </p>\n <button onClick={e => { e.stopPropagation(); onClose(); onLogout(); }} title=\"Sign Out\"\n className=\"shrink-0 p-1.5 rounded-md text-gray-500 hover:text-red-600 hover:bg-red-50 transition-colors\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" /></svg>\n </button>\n </div>\n </div>\n </div>\n\n {/* Flyout submenu — positioned vertically centered on hovered item.\n Height is left intrinsic; the useLayoutEffect above measures the\n rendered offsetHeight and `flyoutTop` clamps using that measured\n value, so the flyout shifts up to fit without ever scrolling. */}\n {hoveredSection && flyoutItems.length > 0 && search.length < 2 && (\n <div ref={flyoutRef} className={`fixed ${sizeConfig.fw} rounded-2xl overflow-hidden`}\n style={{ left: menuRef.current ? menuRef.current.getBoundingClientRect().right + 4 : menuWidth + 12, top: flyoutTop, animation: 'submenu-in 0.1s ease-out', ...menuGlass }}\n onMouseEnter={() => clearTimeout(hoverTimeout.current)}\n onMouseLeave={() => { hoverTimeout.current = setTimeout(() => { setHoveredSection(null); setHoveredChild(null); }, 200); }}>\n <div className=\"py-1 px-1\">\n {flyoutItems.map(item => {\n const hasChildren = !!item.children && item.children.length > 0;\n const isChildHovered = hoveredChild === item.to;\n return (\n <div key={item.to}\n onMouseEnter={hasChildren ? (e) => {\n clearTimeout(childHoverTimeout.current);\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setHoveredChildY(rect.top + rect.height / 2);\n setHoveredChild(item.to);\n } : () => {\n // Hovering a leaf inside the flyout cancels any pending\n // sub-flyout from a sibling that had children.\n childHoverTimeout.current = setTimeout(() => setHoveredChild(null), 200);\n }}>\n <button onClick={() => handleClick(item.to)}\n className={`${itemCls} transition-colors ${isChildHovered ? 'bg-blue-50 text-blue-700' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}`}>\n {iconEl(item.to)}\n <span>{item.label}</span>\n {hasChildren && (\n <svg className=\"h-3.5 w-3.5 ml-auto text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" /></svg>\n )}\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* 3rd-level flyout — anchored to the right of the level-2 flyout. */}\n {(() => {\n if (search.length >= 2 || !hoveredChild) return null;\n const parent = flyoutItems.find(it => it.to === hoveredChild);\n const kids = (parent?.children ?? []).filter(c => !c.perms || hasAnyPerm(c.perms));\n if (!parent || kids.length === 0) return null;\n const flyoutRect = flyoutRef.current?.getBoundingClientRect();\n const subLeft = flyoutRect ? flyoutRect.right + 4 : 0;\n const subEstH = kids.length * sizeConfig.itemH + 12;\n const subH = measuredSub?.key === hoveredChild ? measuredSub.h : subEstH;\n let subTop = hoveredChildY - subH / 2;\n if (subTop < minTop) subTop = minTop;\n if (subTop + subH > maxBottom) subTop = Math.max(minTop, maxBottom - subH);\n return (\n <div ref={subFlyoutRef} className={`fixed ${sizeConfig.fw} rounded-2xl overflow-hidden`}\n style={{ left: subLeft, top: subTop, animation: 'submenu-in 0.1s ease-out', ...menuGlass }}\n onMouseEnter={() => { clearTimeout(hoverTimeout.current); clearTimeout(childHoverTimeout.current); }}\n onMouseLeave={() => { childHoverTimeout.current = setTimeout(() => setHoveredChild(null), 200); }}>\n <div className=\"py-1 px-1\">\n {kids.map(child => (\n <div key={child.to}>\n <button onClick={() => handleClick(child.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}>\n {iconEl(child.to)}\n <span>{child.label}</span>\n </button>\n {child.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n ))}\n </div>\n </div>\n );\n })()}\n </div>\n\n <style>{`\n @keyframes menu-in { from { opacity: 0; transform: scale(0.95) translateY(8px); } to { opacity: 1; transform: scale(1) translateY(0); } }\n @keyframes submenu-in { from { opacity: 0; transform: translateX(-4px); } to { opacity: 1; transform: translateX(0); } }\n `}</style>\n </div>\n );\n}\n","/**\n * Module-level mobile-shell state — mirrors the activationOrder pattern in\n * Modal.tsx so any component (including Modal, which portals outside the\n * React tree) can read/write the current mode without prop drilling.\n *\n * home — full-screen home grid is shown\n * switcher — Chrome-tab-style snapshot grid of open apps\n * app — current modal renders fullscreen; only the bottom nav overlays it\n */\n\nexport type MobileMode = 'home' | 'switcher' | 'app';\n\nlet _mode: MobileMode = 'home';\nconst listeners = new Set<() => void>();\n\nexport function getMobileMode(): MobileMode {\n return _mode;\n}\n\nexport function setMobileMode(mode: MobileMode): void {\n if (_mode === mode) return;\n _mode = mode;\n listeners.forEach(fn => fn());\n}\n\nexport function subscribeMobileMode(cb: () => void): () => void {\n listeners.add(cb);\n return () => { listeners.delete(cb); };\n}\n","/**\n * Mobile home screen — open widgets render at the top, app + folder icons sit\n * in a unified grid below. Long-press any icon to drag it. Order persists\n * in localStorage.\n *\n * Folders open as a centered popup with a blurred backdrop and a scale-in\n * animation. The folder tile itself shows a 2×2 preview of the apps inside,\n * iOS-style.\n */\nimport { useState, useMemo, useEffect, useRef, Suspense, type ReactNode, isValidElement, cloneElement, type ReactElement } from 'react';\nimport { isSection, type NavItem, type NavSection } from './nav-types';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport type { MinimizedItem } from './WindowManager';\nimport LoadingSpinner from './LoadingSpinner';\n\nconst MOBILE_WIDGET_ORDER_KEY = 'erp_mobile_widget_order';\nconst MOBILE_HOME_ORDER_KEY = 'erp_mobile_home_order';\nconst LONG_PRESS_MS = 400;\n\n// Per-app colored tile background. Tailwind's JIT scans the source so each\n// gradient class string must appear in full somewhere — keep them inline.\nconst ICON_GRADIENTS = [\n 'from-blue-500 to-blue-700',\n 'from-indigo-500 to-purple-600',\n 'from-purple-500 to-pink-600',\n 'from-pink-500 to-rose-600',\n 'from-red-500 to-rose-600',\n 'from-orange-500 to-red-600',\n 'from-amber-500 to-orange-600',\n 'from-yellow-500 to-amber-500',\n 'from-lime-500 to-green-600',\n 'from-green-500 to-emerald-600',\n 'from-emerald-500 to-teal-600',\n 'from-teal-500 to-cyan-600',\n 'from-cyan-500 to-sky-600',\n 'from-sky-500 to-blue-600',\n 'from-violet-500 to-fuchsia-600',\n];\n\nfunction hashGradient(seed: string): string {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h << 5) - h + seed.charCodeAt(i);\n return ICON_GRADIENTS[Math.abs(h) % ICON_GRADIENTS.length];\n}\n\nfunction loadOrder(key: string): string[] {\n try {\n const raw = localStorage.getItem(key);\n if (raw) {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed.filter(s => typeof s === 'string');\n }\n } catch {}\n return [];\n}\n\nfunction saveOrder(key: string, order: string[]): void {\n try { localStorage.setItem(key, JSON.stringify(order)); } catch {}\n}\n\ninterface MobileHomeProps {\n navSections: (NavSection | NavItem)[];\n navIcons: Record<string, ReactNode>;\n sectionIcons: Record<string, ReactNode>;\n openWindows: MinimizedItem[];\n onOpenApp: (path: string) => void;\n onActivateWindow: (id: string) => void;\n}\n\ntype HomeIcon =\n | { kind: 'app'; id: string; label: string; route: string }\n | { kind: 'folder'; id: string; label: string; section: NavSection };\n\nconst FALLBACK_APP_ICON = (\n <svg className=\"h-10 w-10\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75A2.25 2.25 0 016 4.5h12a2.25 2.25 0 012.25 2.25v10.5A2.25 2.25 0 0118 19.5H6a2.25 2.25 0 01-2.25-2.25V6.75z\" />\n </svg>\n);\n\nfunction sizeIcon(node: ReactNode, fallback: ReactNode, sizeClass = 'h-10 w-10'): ReactNode {\n if (!node) return fallback;\n if (isValidElement(node)) {\n return cloneElement(node as ReactElement, {\n className: `${sizeClass} ${(node as ReactElement).props?.className ?? ''}`.trim(),\n } as any);\n }\n return node;\n}\n\n/** A colored gradient tile with the app's glyph in white — one per app on\n * the home grid. iOS-style. Icon fills its grid cell so the left/right\n * edges land precisely on the column lines (no centered margin). */\nfunction AppTile({ route, icon }: { route: string; icon: ReactNode }) {\n return (\n <span className={`relative aspect-square w-full rounded-2xl bg-gradient-to-br ${hashGradient(route)} flex items-center justify-center text-white shadow-sm border border-white/30`}>\n {sizeIcon(icon, FALLBACK_APP_ICON, 'h-11 w-11')}\n </span>\n );\n}\n\n/** Folder tile = 2×2 mini-grid of the apps inside, on a translucent backplate. */\nfunction FolderTile({ section, navIcons }: { section: NavSection; navIcons: Record<string, ReactNode> }) {\n const previewItems = section.items.slice(0, 4);\n return (\n <span className=\"relative aspect-square w-full rounded-2xl bg-white/30 backdrop-blur-sm border border-white/40 p-1.5 grid grid-cols-2 gap-1 shadow-sm\">\n {previewItems.map(item => (\n <span\n key={item.to}\n className={`rounded-md bg-gradient-to-br ${hashGradient(item.to)} flex items-center justify-center text-white`}\n >\n {sizeIcon(navIcons[item.to], FALLBACK_APP_ICON, 'h-3.5 w-3.5')}\n </span>\n ))}\n {Array.from({ length: Math.max(0, 4 - previewItems.length) }).map((_, i) => (\n <span key={`empty-${i}`} className=\"rounded-md bg-white/20\" />\n ))}\n </span>\n );\n}\n\nexport default function MobileHome({\n navSections,\n navIcons,\n sectionIcons,\n openWindows,\n onOpenApp,\n onActivateWindow,\n}: MobileHomeProps) {\n const [selectedFolder, setSelectedFolder] = useState<NavSection | null>(null);\n\n const homeIconsRaw = useMemo<HomeIcon[]>(() => {\n const list: HomeIcon[] = [];\n for (const entry of navSections) {\n if (isSection(entry)) {\n const sec = entry as NavSection;\n list.push({ kind: 'folder', id: `folder:${sec.label}`, label: sec.label, section: sec });\n } else {\n const it = entry as NavItem;\n list.push({ kind: 'app', id: `app:${it.to}`, label: it.label, route: it.to });\n }\n }\n return list;\n }, [navSections]);\n\n const [homeOrder, setHomeOrder] = useState<string[]>(() => loadOrder(MOBILE_HOME_ORDER_KEY));\n\n const homeIcons = useMemo(() => {\n const indexFor = (id: string) => {\n const i = homeOrder.indexOf(id);\n return i === -1 ? Number.MAX_SAFE_INTEGER : i;\n };\n return homeIconsRaw.slice().sort((a, b) => {\n const ia = indexFor(a.id);\n const ib = indexFor(b.id);\n if (ia !== ib) return ia - ib;\n return homeIconsRaw.indexOf(a) - homeIconsRaw.indexOf(b);\n });\n }, [homeIconsRaw, homeOrder]);\n\n useEffect(() => {\n const visibleIds = homeIconsRaw.map(i => i.id);\n const next = [\n ...homeOrder.filter(id => visibleIds.includes(id)),\n ...visibleIds.filter(id => !homeOrder.includes(id)),\n ];\n if (next.length !== homeOrder.length || next.some((id, i) => id !== homeOrder[i])) {\n setHomeOrder(next);\n saveOrder(MOBILE_HOME_ORDER_KEY, next);\n }\n }, [homeIconsRaw, homeOrder]);\n\n // Long-press drag.\n const [dragId, setDragId] = useState<string | null>(null);\n const [dragPos, setDragPos] = useState<{ x: number; y: number } | null>(null);\n const dragOffsetRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const longPressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressFiredRef = useRef(false);\n\n const cancelLongPress = () => {\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n };\n\n const beginLongPress = (id: string, e: React.PointerEvent<HTMLElement>) => {\n if (dragId) return;\n const x = e.clientX;\n const y = e.clientY;\n const target = e.currentTarget;\n longPressFiredRef.current = false;\n cancelLongPress();\n longPressTimerRef.current = setTimeout(() => {\n if (!target.isConnected) return;\n const rect = target.getBoundingClientRect();\n dragOffsetRef.current = { x: x - rect.left, y: y - rect.top };\n longPressFiredRef.current = true;\n setDragId(id);\n setDragPos({ x, y });\n try { (navigator as any).vibrate?.(15); } catch {}\n }, LONG_PRESS_MS);\n };\n\n useEffect(() => {\n if (!dragId) return;\n const onMove = (e: PointerEvent) => {\n setDragPos({ x: e.clientX, y: e.clientY });\n const el = document.elementFromPoint(e.clientX, e.clientY) as HTMLElement | null;\n const targetEl = el?.closest('[data-home-icon-id]') as HTMLElement | null;\n if (!targetEl) return;\n const targetId = targetEl.dataset.homeIconId!;\n if (targetId === dragId) return;\n setHomeOrder(prev => {\n const fromIdx = prev.indexOf(dragId);\n const toIdx = prev.indexOf(targetId);\n if (fromIdx === -1 || toIdx === -1) return prev;\n const next = prev.slice();\n next.splice(fromIdx, 1);\n next.splice(toIdx, 0, dragId);\n return next;\n });\n };\n const onUp = () => {\n setDragId(null);\n setDragPos(null);\n setHomeOrder(prev => { saveOrder(MOBILE_HOME_ORDER_KEY, prev); return prev; });\n };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, [dragId]);\n\n const handleIconClick = (icon: HomeIcon) => {\n if (longPressFiredRef.current) {\n longPressFiredRef.current = false;\n return;\n }\n if (icon.kind === 'app') onOpenApp(icon.route);\n else setSelectedFolder(icon.section);\n };\n\n // Widget tray — vertical order persisted but no per-card reorder buttons.\n const [widgetOrder, _setWidgetOrder] = useState<string[]>(() => loadOrder(MOBILE_WIDGET_ORDER_KEY));\n\n const widgetWindows = useMemo(() => {\n const widgets = openWindows.filter(w => {\n if (!w.route) return false;\n const entry = WINDOW_REGISTRY[w.route];\n return entry && isPageEntry(entry) && (entry as PageRegistryEntry).widget;\n });\n const indexFor = (route: string) => {\n const i = widgetOrder.indexOf(route);\n return i === -1 ? Number.MAX_SAFE_INTEGER : i;\n };\n return widgets.slice().sort((a, b) => indexFor(a.route!) - indexFor(b.route!));\n }, [openWindows, widgetOrder]);\n\n useEffect(() => {\n const visibleRoutes = widgetWindows.map(w => w.route!).filter(Boolean);\n const next = [\n ...widgetOrder.filter(r => visibleRoutes.includes(r)),\n ...visibleRoutes.filter(r => !widgetOrder.includes(r)),\n ];\n if (next.length !== widgetOrder.length || next.some((r, i) => r !== widgetOrder[i])) {\n _setWidgetOrder(next);\n saveOrder(MOBILE_WIDGET_ORDER_KEY, next);\n }\n }, [widgetWindows, widgetOrder]);\n\n const openCountByRoute = useMemo(() => {\n const map = new Map<string, number>();\n for (const w of openWindows) {\n if (!w.route) continue;\n map.set(w.route, (map.get(w.route) ?? 0) + 1);\n }\n return map;\n }, [openWindows]);\n\n const openInFolder = (folder: NavSection): MinimizedItem[] => {\n const routes = new Set(folder.items.map(i => i.to));\n return openWindows.filter(w => w.route && routes.has(w.route));\n };\n\n const draggedIcon = dragId ? homeIcons.find(i => i.id === dragId) : null;\n\n return (\n <>\n <div\n className=\"h-full overflow-y-auto px-4 pt-4 pb-4 select-none\"\n style={{\n // Disable iOS long-press text-selection / \"Copy\" callout on icon labels.\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n }}\n >\n {/* Edge padding (px-4 = 16 px) matches the grid gap (gap-4 = 16 px),\n * so the space between the screen edge and the first icon equals the\n * space between two icons. Icons fill their grid cells (no max-width\n * cap), so widget col-span-2 edges align exactly with icon edges. */}\n <div>\n\n {/* Widgets — share the icon grid layout (grid-cols-4 gap-4) so the\n * widget width = 2 cells + 1 gap, exactly aligned with the icons\n * below. aspect-square keeps each card the same height as width. */}\n {widgetWindows.length > 0 && (\n <section className=\"mb-4\">\n <div className=\"grid grid-cols-4 gap-4\">\n {widgetWindows.map(w => {\n const entry = WINDOW_REGISTRY[w.route!] as PageRegistryEntry | undefined;\n if (!entry) return null;\n const Component = entry.component;\n return (\n <div\n key={w.id}\n className=\"col-span-2 relative rounded-2xl bg-white/85 backdrop-blur border border-white/40 shadow-md overflow-hidden aspect-square\"\n >\n <Suspense fallback={<div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}>\n <Component />\n </Suspense>\n </div>\n );\n })}\n </div>\n </section>\n )}\n\n {/* Unified home grid — apps + folders. Icon tiles are colored\n * gradients (one per app); folder tiles preview their contents in a\n * 2×2 mini-grid. Long-press any tile to start dragging. */}\n {homeIcons.length > 0 && (\n <section>\n <div className=\"grid grid-cols-4 gap-4\">\n {homeIcons.map(icon => {\n const isFolder = icon.kind === 'folder';\n const isBeingDragged = dragId === icon.id;\n\n return (\n <button\n key={icon.id}\n data-home-icon-id={icon.id}\n onPointerDown={(e) => beginLongPress(icon.id, e)}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n onPointerLeave={cancelLongPress}\n onClick={() => handleIconClick(icon)}\n style={{ touchAction: 'none', visibility: isBeingDragged ? 'hidden' : 'visible' }}\n className={`flex flex-col items-center gap-1 py-1 rounded-lg active:bg-white/20 ${dragId && !isBeingDragged ? 'transition-transform' : ''}`}\n >\n {isFolder\n ? <FolderTile section={(icon as Extract<HomeIcon, { kind: 'folder' }>).section} navIcons={navIcons} />\n : <AppTile route={(icon as Extract<HomeIcon, { kind: 'app' }>).route} icon={navIcons[(icon as Extract<HomeIcon, { kind: 'app' }>).route]} />}\n <span className=\"text-[11px] font-medium text-white drop-shadow-sm truncate w-full text-center\">\n {icon.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n </div>\n </div>\n\n {/* Floating \"ghost\" of the icon being dragged — follows the finger. */}\n {draggedIcon && dragPos && (\n <div\n className=\"fixed pointer-events-none z-[400] transition-none\"\n style={{\n left: dragPos.x - dragOffsetRef.current.x,\n top: dragPos.y - dragOffsetRef.current.y,\n transform: 'scale(1.12)',\n }}\n >\n <div className=\"flex flex-col items-center gap-1 py-1 w-20\">\n {draggedIcon.kind === 'folder'\n ? <FolderTile section={draggedIcon.section} navIcons={navIcons} />\n : <AppTile route={draggedIcon.route} icon={navIcons[draggedIcon.route]} />}\n <span className=\"text-[11px] font-medium text-white drop-shadow-md truncate w-full text-center\">\n {draggedIcon.label}\n </span>\n </div>\n </div>\n )}\n\n {/* Folder popup */}\n {selectedFolder && (\n <FolderPopup\n folder={selectedFolder}\n navIcons={navIcons}\n onClose={() => setSelectedFolder(null)}\n onOpenApp={(path) => { setSelectedFolder(null); onOpenApp(path); }}\n />\n )}\n </>\n );\n}\n\nfunction FolderPopup({\n folder,\n navIcons,\n onClose,\n onOpenApp,\n}: {\n folder: NavSection;\n navIcons: Record<string, ReactNode>;\n onClose: () => void;\n onOpenApp: (path: string) => void;\n}) {\n // Two-phase close: kick off the fade-out / scale-down animation, then unmount\n // after the duration so the user actually sees the reverse transition.\n // Used both for tap-outside dismiss and tap-an-app-inside-the-folder.\n const [closing, setClosing] = useState(false);\n const beginClose = () => {\n if (closing) return;\n setClosing(true);\n setTimeout(onClose, 200);\n };\n const closeThen = (after: () => void) => {\n if (closing) return;\n setClosing(true);\n setTimeout(after, 200);\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col items-center justify-center px-6 bg-black/45 backdrop-blur-xl select-none\"\n style={{\n paddingBottom: 'calc(var(--mobile-bottom-nav, 70px) + 16px)',\n animation: closing\n ? 'folder-fade-out 200ms ease-in forwards'\n : 'folder-fade-in 220ms ease-out',\n WebkitUserSelect: 'none',\n WebkitTouchCallout: 'none',\n }}\n onClick={beginClose}\n >\n <style>{`\n @keyframes folder-fade-in { from { opacity: 0; } to { opacity: 1; } }\n @keyframes folder-fade-out { from { opacity: 1; } to { opacity: 0; } }\n @keyframes folder-pop-in { from { opacity: 0; transform: scale(0.86) translateY(8px); } to { opacity: 1; transform: scale(1) translateY(0); } }\n @keyframes folder-pop-out { from { opacity: 1; transform: scale(1) translateY(0); } to { opacity: 0; transform: scale(0.9) translateY(4px); } }\n `}</style>\n\n {/* Title + card share the same max-width wrapper so the title's ml-4\n * (= card's px-4 inner padding) lands precisely on the first icon's\n * left edge regardless of viewport. */}\n <div className=\"w-full max-w-[304px]\">\n <h2 className=\"text-2xl font-semibold text-white drop-shadow-md mb-4 ml-4\">{folder.label}</h2>\n\n {/* Card width capped so 3 cells × ~80 px + 2 × 16 px gap + 2 × 16 px\n * inner padding lands at ~304 px — folder icon size matches the home\n * icon size on most phones. */}\n <div\n className=\"max-h-[70vh] flex flex-col rounded-3xl bg-white/15 backdrop-blur-xl border border-white/25 shadow-2xl overflow-hidden\"\n style={{\n animation: closing\n ? 'folder-pop-out 180ms ease-in forwards'\n : 'folder-pop-in 240ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex-1 overflow-y-auto px-4 py-5\">\n {/* Folder shows just the apps inside — open-window summary lives on\n * the home screen and the switcher, not here. */}\n <div className=\"grid grid-cols-3 gap-4\">\n {folder.items.map(item => {\n return (\n <button\n key={item.to}\n onClick={() => closeThen(() => onOpenApp(item.to))}\n className=\"flex flex-col items-center gap-1 py-1 rounded-lg active:bg-white/15\"\n >\n <AppTile route={item.to} icon={navIcons[item.to]} />\n <span className=\"text-[11px] font-medium text-white drop-shadow-sm truncate w-full text-center\">{item.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Mobile app switcher — Chrome-tab-style snapshot grid of open apps.\n * Tapping a card brings that window forward + switches to 'app' mode.\n * The X on each card closes the corresponding window.\n *\n * Reuses <ThumbCard> from WindowManager which already handles the snapshot\n * cloning and aspect-ratio sizing.\n */\nimport { useEffect, useState } from 'react';\nimport { ThumbCard, type MinimizedItem } from './WindowManager';\n\ninterface MobileSwitcherProps {\n windows: MinimizedItem[];\n onActivate: (id: string) => void;\n onClose: (id: string) => void;\n onCloseAll: () => void;\n}\n\nexport default function MobileSwitcher({ windows, onActivate, onClose, onCloseAll }: MobileSwitcherProps) {\n // Cards size based on viewport — half the screen width, two columns with gap.\n const [cardSize, setCardSize] = useState(() => computeCardSize());\n\n useEffect(() => {\n const onResize = () => setCardSize(computeCardSize());\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n if (windows.length === 0) {\n return (\n <div className=\"h-full flex flex-col items-center justify-center gap-3 text-white/80 px-6 text-center\">\n <svg className=\"h-12 w-12 text-white/40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.4}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n </svg>\n <p className=\"text-sm\">No open apps.</p>\n <p className=\"text-xs text-white/50\">Tap Home to launch one.</p>\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex-1 overflow-y-auto px-3 pt-4 pb-4\">\n <h1 className=\"text-white text-base font-semibold mb-3 px-1\">Open apps · {windows.length}</h1>\n <div className=\"grid grid-cols-2 gap-3\">\n {windows.map(w => (\n <div key={w.id} className=\"group flex flex-col items-stretch gap-1\">\n <ThumbCard\n id={w.id}\n label={w.label}\n maxW={cardSize.w}\n maxH={cardSize.h}\n titleAbove\n onClick={() => onActivate(w.id)}\n onClose={() => onClose(w.id)}\n />\n <span className=\"text-[11px] text-white/80 truncate px-1\">{w.label}</span>\n </div>\n ))}\n </div>\n </div>\n {/* Close-all bar — sits just above the bottom nav. The switcher's outer\n * paddingBottom already reserves space for the nav; this bar slots\n * above that reservation. */}\n <div className=\"shrink-0 px-3 py-3 flex justify-center\">\n <button\n onClick={onCloseAll}\n className=\"px-5 py-2.5 rounded-full bg-white/15 backdrop-blur-md border border-white/25 text-white text-sm font-medium active:bg-white/25 shadow-lg\"\n >\n Close All\n </button>\n </div>\n </div>\n );\n}\n\nfunction computeCardSize() {\n const w = typeof window !== 'undefined' ? window.innerWidth : 360;\n const h = typeof window !== 'undefined' ? window.innerHeight : 640;\n // 2 columns with 12px gap on each side and 12px between\n const cardW = Math.max(120, Math.floor((w - 36) / 2));\n // Cap card height to ~40% of viewport so multiple rows are visible\n const cardH = Math.min(cardW * 1.4, Math.floor(h * 0.4));\n return { w: cardW, h: cardH };\n}\n","/**\n * Mobile notification sheet — full-screen list popped up from the bottom-nav\n * Notifications button. Reuses the same `NotificationsConfig` Layout receives\n * (so the consumer wires up `useUnreadCount` / `list` / `markRead` / etc.\n * once and both the desktop bell popup and this sheet draw from it).\n */\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useCallback } from 'react';\nimport { formatDate } from '../utils/date';\nimport type { NotificationsConfig, ShellNotification } from './NotificationBell';\n\ninterface MobileNotificationSheetProps {\n config: NotificationsConfig;\n onClose: () => void;\n}\n\nfunction timeAgo(dateStr: string): string {\n const diff = Date.now() - new Date(dateStr).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return formatDate(dateStr);\n}\n\nexport default function MobileNotificationSheet({ config, onClose }: MobileNotificationSheetProps) {\n const { list, markRead, markAllRead, onItemClick } = config;\n const queryClient = useQueryClient();\n const unreadCount = config.useUnreadCount();\n\n const { data: notifData } = useQuery({\n queryKey: ['notifications-dropdown'],\n queryFn: () => list({ page_size: 30 }),\n staleTime: 30_000,\n });\n const notifications: ShellNotification[] = notifData?.results ?? [];\n\n const handleClick = useCallback((notif: ShellNotification) => {\n if (!notif.is_read) {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: Math.max(0, (old.count || 0) - 1) } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => n.id === notif.id ? { ...n, is_read: true } : n) };\n });\n markRead(notif.id).catch(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n }\n onClose();\n onItemClick(notif);\n }, [queryClient, markRead, onItemClick, onClose]);\n\n const handleMarkAllRead = () => {\n queryClient.setQueryData(['notification-unread-count'], (old: any) => old ? { ...old, count: 0 } : old);\n queryClient.setQueryData(['notifications-dropdown'], (old: any) => {\n if (!old?.results) return old;\n return { ...old, results: old.results.map((n: any) => ({ ...n, is_read: true })) };\n });\n markAllRead().then(() => {\n queryClient.invalidateQueries({ queryKey: ['notification-unread-count'] });\n queryClient.invalidateQueries({ queryKey: ['notifications-dropdown'] });\n });\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}\n >\n <header className=\"flex items-center justify-between px-3 py-3 border-b border-gray-200 shrink-0\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <h1 className=\"text-base font-semibold text-gray-900\">Notifications</h1>\n {unreadCount > 0 ? (\n <button onClick={handleMarkAllRead} className=\"text-xs text-blue-600 font-medium px-2 py-1 active:bg-blue-50 rounded\">\n Mark all read\n </button>\n ) : <span className=\"w-[88px]\" />}\n </header>\n <div className=\"flex-1 overflow-y-auto\">\n {notifications.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 px-6 text-center\">\n <svg className=\"h-10 w-10 text-gray-300 mb-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n <p className=\"text-sm text-gray-700 font-medium\">All caught up</p>\n <p className=\"text-xs text-gray-400 mt-1\">No notifications yet</p>\n </div>\n ) : (\n notifications.map(notif => (\n <button\n key={notif.id}\n onClick={() => handleClick(notif)}\n className=\"w-full flex items-start gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <div className=\"pt-1 shrink-0\">\n {!notif.is_read\n ? <div className=\"h-2.5 w-2.5 rounded-full bg-blue-500\" />\n : <div className=\"h-2.5 w-2.5\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className={`text-sm leading-snug ${!notif.is_read ? 'font-medium text-gray-900' : 'text-gray-700'}`}>{notif.title}</p>\n {notif.message && <p className=\"text-xs text-gray-500 mt-1 line-clamp-2\">{notif.message}</p>}\n <div className=\"flex items-center gap-2 mt-1.5\">\n <span className=\"text-[11px] text-gray-400\">{timeAgo(notif.created_at)}</span>\n {notif.actor_name && <span className=\"text-[11px] text-gray-400\">by {notif.actor_name}</span>}\n </div>\n </div>\n </button>\n ))\n )}\n </div>\n </div>\n );\n}\n","/**\n * Mobile profile sheet — full-screen panel with the user's avatar / name /\n * email at top, then quick-access actions (Customization route if registered,\n * Logout). Mirrors the desktop ProfileMenu popup but laid out as a vertical\n * sheet for touch.\n */\n\ninterface MobileProfileSheetProps {\n profile: any;\n user: any;\n onClose: () => void;\n /** Open a route in the shell. */\n onNavigate: (path: string) => void;\n /** Sign the user out (Layout already triggers the logout animation). */\n onLogout: () => void;\n}\n\nexport default function MobileProfileSheet({ profile, user, onClose, onNavigate, onLogout }: MobileProfileSheetProps) {\n const initial = (profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase();\n const displayName = profile?.first_name\n ? `${profile.first_name} ${profile.last_name || ''}`.trim()\n : user?.email ?? 'Account';\n const groups: string[] = profile?.group_names ?? [];\n\n const handleNav = (path: string) => { onNavigate(path); onClose(); };\n\n return (\n <div\n className=\"fixed inset-0 z-[210] flex flex-col bg-white\"\n style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}\n >\n <header className=\"flex items-center justify-between px-3 py-3 border-b border-gray-200 shrink-0\">\n <button onClick={onClose} className=\"p-2 -ml-1 rounded-full active:bg-gray-200 text-gray-700\" aria-label=\"Close\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n <h1 className=\"text-base font-semibold text-gray-900\">Profile</h1>\n <span className=\"w-10\" />\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {/* User header */}\n <div className=\"flex flex-col items-center text-center px-6 py-8 border-b border-gray-100\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-20 w-20 rounded-full object-cover border border-gray-200 shadow-sm\" />\n ) : (\n <div className=\"h-20 w-20 rounded-full bg-blue-100 flex items-center justify-center text-2xl font-bold text-blue-700 shadow-sm\">\n {initial}\n </div>\n )}\n <div className=\"mt-3 text-base font-semibold text-gray-900 truncate max-w-full\">{displayName}</div>\n {user?.email && profile?.first_name && (\n <div className=\"text-sm text-gray-500 truncate max-w-full\">{user.email}</div>\n )}\n {groups.length > 0 && (\n <div className=\"mt-2 flex flex-wrap justify-center gap-1.5\">\n {groups.map(g => (\n <span key={g} className=\"text-[11px] px-2 py-0.5 rounded-full bg-gray-100 text-gray-700\">{g}</span>\n ))}\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"py-2\">\n <button\n onClick={() => handleNav('/customization')}\n className=\"w-full flex items-center gap-3 px-4 py-4 active:bg-gray-100 border-b border-gray-100 text-left\"\n >\n <span className=\"h-9 w-9 rounded-lg bg-gray-100 flex items-center justify-center text-gray-700 shrink-0\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </span>\n <span className=\"flex-1 text-sm font-medium text-gray-800\">Customization</span>\n <svg className=\"h-4 w-4 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n\n <button\n onClick={() => { onLogout(); onClose(); }}\n className=\"w-full flex items-center gap-3 px-4 py-4 active:bg-red-50 text-left\"\n >\n <span className=\"h-9 w-9 rounded-lg bg-red-50 flex items-center justify-center text-red-600 shrink-0\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75\" />\n </svg>\n </span>\n <span className=\"flex-1 text-sm font-medium text-red-600\">Sign out</span>\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Mobile shell — phone/tablet-portrait replacement for the desktop <Layout>\n * chrome (taskbar / start-menu sidebar / windowed apps).\n *\n * Modes (mobileShellStore):\n * home — full-screen icon grid (folders + apps)\n * switcher — Chrome-tab-style snapshot grid of open apps\n * app — current Modal renders fullscreen; we just paint the bottom nav\n *\n * The bottom nav surfaces four entry points: Home, Apps switcher,\n * Notifications (sheet), Profile (sheet). Notifications and Profile sheets\n * live as MobileShell-owned state so they don't pollute the global mode\n * machine.\n */\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { useWindowManager } from './WindowManager';\nimport { activateModal } from './Modal';\nimport { getMobileMode, setMobileMode, subscribeMobileMode } from './mobileShellStore';\nimport { WINDOW_REGISTRY, isPageEntry, type PageRegistryEntry } from '../windowRegistry/types';\nimport MobileHome from './MobileHome';\nimport MobileSwitcher from './MobileSwitcher';\nimport MobileNotificationSheet from './MobileNotificationSheet';\nimport MobileProfileSheet from './MobileProfileSheet';\nimport type { NavItem, NavSection } from './nav-types';\nimport type { NotificationsConfig } from './NotificationBell';\n\ninterface MobileShellProps {\n productName?: string;\n productIcon?: string;\n navSections: (NavSection | NavItem)[];\n navIcons: Record<string, ReactNode>;\n sectionIcons: Record<string, ReactNode>;\n /** Wallpaper / background style computed by Layout — applied to the home\n * overlay so the user's chosen wallpaper carries onto mobile. */\n wallpaperStyle?: React.CSSProperties;\n /** Notification system config — when omitted, the bell button is hidden. */\n notifications?: NotificationsConfig;\n /** User profile (`first_name`, `last_name`, `avatar_url`, `group_names`). */\n profile?: any;\n /** Auth user (`email`). */\n user?: any;\n /** Open a route in the shell — used by the profile sheet. */\n onNavigate?: (path: string) => void;\n /** Logout handler — wired to Layout's logout-animation trigger. */\n onLogout?: () => void;\n}\n\nexport default function MobileShell({\n navSections,\n navIcons,\n sectionIcons,\n wallpaperStyle,\n notifications,\n profile,\n user,\n onNavigate,\n onLogout,\n}: MobileShellProps) {\n const { openWindows, openPage, closeEntity } = useWindowManager();\n const mode = useSyncExternalStore(subscribeMobileMode, getMobileMode);\n const [sheet, setSheet] = useState<'notifications' | 'profile' | null>(null);\n const unreadCount = notifications?.useUnreadCount() ?? 0;\n\n // The Apps switcher and the open-app count badge ignore widget windows —\n // widgets render directly on the home screen, so they shouldn't pollute the\n // \"running apps\" view.\n const switcherWindows = useMemo(() => {\n return openWindows.filter(w => {\n if (!w.route) return true;\n const entry = WINDOW_REGISTRY[w.route];\n if (!entry || !isPageEntry(entry)) return true;\n return !(entry as PageRegistryEntry).widget;\n });\n }, [openWindows]);\n\n // When the last open window closes, fall back to home. While other windows\n // are still open we stay in 'app' mode so the next window in the stack\n // (typically the parent list a child entity was opened from) shows through.\n const prevOpenCountRef = useRef(openWindows.length);\n useEffect(() => {\n if (openWindows.length === 0 && mode === 'app') {\n setMobileMode('home');\n }\n prevOpenCountRef.current = openWindows.length;\n }, [openWindows.length, mode]);\n\n const activateWindowById = (windowId: string) => {\n const panel = document.querySelector(`[data-modal-panel][data-window-key=\"${windowId}\"]`);\n const mid = panel?.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n };\n\n const handleOpenApp = (path: string) => {\n openPage(path);\n setMobileMode('app');\n };\n\n const handleActivateWindow = (id: string) => {\n activateWindowById(id);\n setMobileMode('app');\n };\n\n const closeSheet = () => setSheet(null);\n\n return (\n <>\n {/* Wallpaper backdrop — always rendered in mobile mode so swipe-right\n * reveals the home wallpaper underneath the swiping window, instead of\n * another open app. Sits below window z-indices (windows start at 50+).\n * In 'home' mode the home overlay above renders on top of this. */}\n <div\n className=\"fixed inset-0 z-0 pointer-events-none\"\n style={wallpaperStyle}\n />\n\n {/* Home overlay — wallpaper underneath, content scrolls over it */}\n {mode === 'home' && (\n <div\n className=\"fixed inset-0 z-[200]\"\n style={{\n ...wallpaperStyle,\n paddingBottom: 'var(--mobile-bottom-nav, 70px)',\n }}\n >\n <MobileHome\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n openWindows={openWindows}\n onOpenApp={handleOpenApp}\n onActivateWindow={handleActivateWindow}\n />\n </div>\n )}\n\n {/* Switcher overlay — widgets are excluded so it shows only real apps. */}\n {mode === 'switcher' && (\n <div className=\"fixed inset-0 z-[200] bg-gray-900/95 backdrop-blur-sm\" style={{ paddingBottom: 'var(--mobile-bottom-nav, 70px)' }}>\n <MobileSwitcher\n windows={switcherWindows}\n onActivate={handleActivateWindow}\n onClose={(id) => closeEntity(id)}\n onCloseAll={() => switcherWindows.forEach(w => closeEntity(w.id))}\n />\n </div>\n )}\n\n {/* Notification sheet */}\n {sheet === 'notifications' && notifications && (\n <MobileNotificationSheet config={notifications} onClose={closeSheet} />\n )}\n\n {/* Profile sheet */}\n {sheet === 'profile' && (\n <MobileProfileSheet\n profile={profile}\n user={user}\n onClose={closeSheet}\n onNavigate={(path) => { onNavigate?.(path); }}\n onLogout={() => onLogout?.()}\n />\n )}\n\n {/* Bottom nav — always visible, sits above modals AND overlays */}\n <MobileBottomNav\n mode={mode}\n unreadCount={unreadCount}\n showNotifications={!!notifications}\n profileAvatar={profile?.avatar_url}\n profileInitial={(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n onHome={() => { closeSheet(); setMobileMode('home'); }}\n onSwitcher={() => { closeSheet(); setMobileMode('switcher'); }}\n onNotifications={() => setSheet(sheet === 'notifications' ? null : 'notifications')}\n onProfile={() => setSheet(sheet === 'profile' ? null : 'profile')}\n />\n </>\n );\n}\n\ninterface MobileBottomNavProps {\n mode: 'home' | 'switcher' | 'app';\n unreadCount: number;\n showNotifications: boolean;\n profileAvatar?: string;\n profileInitial: string;\n onHome: () => void;\n onSwitcher: () => void;\n onNotifications: () => void;\n onProfile: () => void;\n}\n\nfunction MobileBottomNav({\n mode, unreadCount, showNotifications,\n profileAvatar, profileInitial,\n onHome, onSwitcher, onNotifications, onProfile,\n}: MobileBottomNavProps) {\n const btnClass = (active: boolean) =>\n `flex-1 flex flex-col items-center justify-center gap-0.5 py-2 transition-colors select-none ${\n active ? 'text-blue-600' : 'text-gray-700 active:text-gray-900'\n }`;\n\n return (\n <nav\n className=\"fixed bottom-0 inset-x-0 z-[300] flex items-stretch border-t border-white/40\"\n style={{\n height: 'var(--mobile-bottom-nav, 70px)',\n paddingBottom: 'env(safe-area-inset-bottom)',\n WebkitBackdropFilter: 'blur(28px) saturate(1.8)',\n backdropFilter: 'blur(28px) saturate(1.8)',\n background: 'linear-gradient(135deg, rgba(255,255,255,0.65) 0%, rgba(255,255,255,0.45) 50%, rgba(255,255,255,0.55) 100%)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.6), 0 -2px 12px rgba(0,0,0,0.08)',\n }}\n >\n <button onClick={onHome} className={btnClass(mode === 'home')} aria-label=\"Home\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\" />\n </svg>\n <span className=\"text-[11px] font-medium\">Home</span>\n </button>\n\n <button onClick={onSwitcher} className={btnClass(mode === 'switcher')} aria-label=\"App switcher\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n <rect x=\"13.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1.25\" />\n </svg>\n <span className=\"text-[11px] font-medium\">Apps</span>\n </button>\n\n {showNotifications && (\n <button onClick={onNotifications} className={btnClass(false)} aria-label=\"Notifications\">\n <span className=\"relative\">\n <svg className=\"h-8 w-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.7}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"absolute -top-1.5 -right-2 min-w-[18px] h-[18px] px-1 rounded-full bg-red-500 text-white text-[10px] font-bold leading-[18px] text-center\">\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </span>\n <span className=\"text-[11px] font-medium\">Alerts</span>\n </button>\n )}\n\n <button onClick={onProfile} className={btnClass(false)} aria-label=\"Profile\">\n {profileAvatar ? (\n <img src={profileAvatar} alt=\"\" className=\"h-8 w-8 rounded-full object-cover border border-gray-200\" />\n ) : (\n <div className=\"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-xs font-bold text-blue-700\">\n {profileInitial}\n </div>\n )}\n <span className=\"text-[11px] font-medium\">Profile</span>\n </button>\n </nav>\n );\n}\n","import { useState, useEffect, useCallback, useRef, useSyncExternalStore, isValidElement, cloneElement, lazy, Suspense, type ReactElement } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useAuth } from '../contexts/AuthContext';\nimport apiClient from '../api/client';\nimport GlobalSearch, { type SearchConfig } from './GlobalSearch';\nimport ShortcutHelp from './ShortcutHelp';\nimport NotificationBell, { type NotificationsConfig } from './NotificationBell';\nimport { getPomoSnapshot, subscribePomo } from './pomodoroStore';\nimport { useShellPrefs } from './ShellPrefs';\nimport { useWindowManager } from './WindowManager';\nimport { useTheme } from '../hooks/useTheme';\nimport Desktop from './Desktop';\nimport useClickOutside from '../hooks/useClickOutside';\nimport { playStartup } from '../utils/sounds';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\nimport { reportBug } from '../utils/reportBug';\nimport { useBugReport } from './BugReportDialog';\nimport StartupAnimation from './StartupAnimation';\nimport LogoutAnimation from './LogoutAnimation';\nimport StartMenu from './StartMenu';\n// Sidebar is opt-in (`prefs.layout_mode === 'sidebar'`) and adds nothing\n// to the classic-mode bundle. lazy() also means consumers running a\n// stale source checkout where Sidebar.tsx hasn't been pulled yet won't\n// crash on module load — only when they actually flip into sidebar mode.\nconst Sidebar = lazy(() => import('./Sidebar'));\nimport MobileShell from './MobileShell';\nimport { useIsMobile } from './useIsMobile';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider } from './PopupMenu';\nimport {\n navIcons as defaultNavIcons,\n sectionIcons as defaultSectionIcons,\n navSections as defaultNavSections,\n startMenuCategories as defaultCategories,\n isSection,\n type NavItem,\n type NavSection,\n type StartMenuCategories,\n} from '../shell-config/nav';\nimport type { ReactNode } from 'react';\n\n// Transitional re-exports — go away after each consumer migrates to importing\n// nav data from their own shell-config rather than from <Layout>.\nexport {\n defaultNavIcons as navIcons,\n defaultSectionIcons as sectionIcons,\n defaultNavSections as navSections,\n isSection,\n};\nexport type { NavItem, NavSection };\n\nexport interface LayoutProps {\n /** Brand label rendered on the start-menu button. */\n productName?: string;\n /** Icon URL rendered next to the brand label. Defaults to `/favicon.svg`. */\n productIcon?: string;\n /** Wallpaper image URLs for the desktop background. When omitted, the\n * desktop renders with no image (just the dark fallback). */\n wallpapers?: string[];\n /** Override the default nav sections shown in the start menu. */\n navSections?: (NavSection | NavItem)[];\n /** Override the per-route icon map used by start menu and favorites. */\n navIcons?: Record<string, ReactNode>;\n /** Override the per-section header icon map used by start menu. */\n sectionIcons?: Record<string, ReactNode>;\n /** Override the start menu's section grouping + virtual flyouts. */\n categories?: StartMenuCategories;\n /** Notification system config — when omitted, the bell isn't rendered. */\n notifications?: NotificationsConfig;\n /** Universal search config — when omitted, Cmd-K opens the picker but no\n * results ever come back. */\n search?: SearchConfig;\n /** Custom node rendered in the system tray to the LEFT of the\n * notification bell (or above it on a vertical taskbar). Lets a host\n * app drop in icons like a server-status indicator without forking\n * the shell. The shell renders the node as-is — keep it small (a\n * single icon-sized button) so it fits the existing tray rhythm. */\n taskbarTrayLeft?: ReactNode;\n}\n\n\nfunction ProfileMenu({ profile, user, onLogout, onNavigate }: { profile: any; user: any; onLogout: () => void; onNavigate: (path: string) => void }) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number } | null>(null);\n\n useClickOutside(ref, useCallback(() => { if (open) setOpen(false); }, [open]));\n\n useEffect(() => {\n if (open && buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n // Center popup over button, clamp to viewport\n const popupW = 256; // w-64\n let left = rect.left + rect.width / 2 - popupW / 2;\n left = Math.max(8, Math.min(left, window.innerWidth - popupW - 8));\n if (taskbarPos === 'top') {\n setPos({ left, top: rect.bottom + 4 });\n } else {\n setPos({ left, bottom: window.innerHeight - rect.top + 4 });\n }\n }\n }, [open]);\n\n const groupNames: any[] = profile?.group_names ?? [];\n\n return (\n <div ref={ref} className=\"relative\">\n <button ref={buttonRef} onClick={() => setOpen(!open)} className=\"flex items-center gap-2 rounded-md px-2 py-1 hover:bg-gray-200 transition-colors text-left shrink-0\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-7 w-7 rounded-full object-cover border border-gray-300\" />\n ) : (\n <div className=\"h-7 w-7 rounded-full bg-gray-300 flex items-center justify-center text-[10px] font-bold text-gray-600\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <span className=\"text-xs font-medium text-gray-700 hidden sm:inline\">{profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}</span>\n </button>\n\n {open && pos && (\n <PopupMenu minWidth={256} style={{ left: pos.left, ...(pos.top != null ? { top: pos.top } : { bottom: pos.bottom }) }}>\n {/* Header */}\n <div className=\"px-4 py-3 border-b border-gray-200/60\">\n <div className=\"flex items-center gap-3\">\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-10 w-10 rounded-full object-cover border border-gray-300\" />\n ) : (\n <div className=\"h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-lg font-bold text-blue-700\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-gray-900 truncate\">{profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}</p>\n <p className=\"text-xs text-gray-500 truncate\">{user?.email}</p>\n </div>\n </div>\n {groupNames.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {groupNames.map((g: any) => (\n <span key={typeof g === 'string' ? g : g.name} className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium bg-blue-100 text-blue-700\">\n {typeof g === 'string' ? g : g.name}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Menu items */}\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/profile'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\" /></svg>\n My Profile\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/notifications'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0\" /></svg>\n Notifications\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/settings/favorites'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" /></svg>\n Favorites\n </PopupMenuItem>\n <PopupMenuItem onClick={() => { setOpen(false); onNavigate('/settings/customization'); }}>\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.53 16.122a3 3 0 00-5.78 1.128 2.25 2.25 0 01-2.4 2.245 4.5 4.5 0 008.4-2.245c0-.399-.078-.78-.22-1.128zm0 0a15.998 15.998 0 003.388-1.62m-5.043-.025a15.994 15.994 0 011.622-3.395m3.42 3.42a15.995 15.995 0 004.764-4.648l3.876-5.814a1.151 1.151 0 00-1.597-1.597L14.146 6.32a15.996 15.996 0 00-4.649 4.763m3.42 3.42a6.776 6.776 0 00-3.42-3.42\" /></svg>\n Customization\n </PopupMenuItem>\n\n {/* Logout */}\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={async () => {\n setOpen(false);\n const { confirm } = await import('./ConfirmDialog');\n const ok = await confirm({\n title: 'Sign Out',\n message: 'Do you want to log out? All windows will reopen when you log back in.',\n confirmLabel: 'Sign Out',\n cancelLabel: 'Cancel',\n variant: 'warning',\n });\n if (ok) onLogout();\n }}>\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" /></svg>\n Sign Out\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n </div>\n );\n}\n\nconst NAV_CATEGORIES = [\n { label: 'Clients', items: [\n { path: '/orders', label: 'Sales Orders' }, { path: '/invoices', label: 'Sales Invoices' },\n { path: '/warranty-claims', label: 'Warranty Claims' }, { path: '/clients', label: 'Clients' },\n { path: '/price-sheets', label: 'Price Sheets' },\n ]},\n { label: 'Vendors', items: [\n { path: '/vendor-orders', label: 'Purchase Orders' }, { path: '/qc-reports', label: 'QC Reports' },\n { path: '/production-progress', label: 'Production Progress' }, { path: '/vendor-shipments', label: 'Goods Receipt' },\n { path: '/vendor-invoices', label: 'Vendor Invoices' }, { path: '/vendor-payments', label: 'Vendor Payments' },\n { path: '/manufacturers', label: 'Vendors' }, { path: '/vendor-price-sheets', label: 'Vendor Price Sheets' },\n ]},\n { label: 'Inventory', items: [\n { path: '/goods-issue', label: 'Goods Issue' }, { path: '/stock-on-hand', label: 'Stock on Hand' },\n { path: '/warehouses', label: 'Warehouses' },\n ]},\n { label: 'Products', items: [\n { path: '/products', label: 'Part Numbers' }, { path: '/brands', label: 'Brands' },\n { path: '/designs', label: 'Designs' }, { path: '/wheel-finishes', label: 'Wheel Finishes' },\n ]},\n { label: 'R&D', items: [\n { path: '/projects', label: 'Projects' }, { path: '/proposals', label: 'Proposals' },\n { path: '/moulds', label: 'Moulds' }, { path: '/dfm-logs', label: 'DFM Logs' },\n { path: '/weight-logs', label: 'Weight Logs' },\n ]},\n { label: 'Finance', items: [\n { path: '/payments', label: 'Receipts' }, { path: '/bank-accounts', label: 'Bank Accounts' },\n ]},\n];\n\nfunction useFavorites(wallpapers?: string[]) {\n const { prefs, save } = useShellPrefs();\n const favorites: string[] = prefs.favorite_pages || [];\n\n const toggle = useCallback((path: string) => {\n const next = favorites.includes(path) ? favorites.filter((p: string) => p !== path) : [...favorites, path];\n save({ favorite_pages: next });\n }, [favorites, save]);\n\n const wallpaperPool = wallpapers && wallpapers.length > 0 ? wallpapers : [];\n const randomPickRef = useRef(wallpaperPool.length > 0 ? wallpaperPool[Math.floor(Math.random() * wallpaperPool.length)] : 'none');\n const rawBg: string = prefs.desktop_bg || (wallpaperPool.length > 0 ? 'random' : 'none');\n const desktopBg: string = rawBg === 'random' ? randomPickRef.current : rawBg;\n\n const setDesktopBg = useCallback((bg: string) => {\n save({ desktop_bg: bg });\n }, [save]);\n\n return { favorites, toggle, isFavorite: (path: string) => favorites.includes(path), desktopBg, setDesktopBg };\n}\n\nexport { useFavorites };\n\n/** Star button for list page titles — toggles favorite status */\nexport function FavoriteStar({ path }: { path?: string }) {\n const location = useLocation();\n const { isFavorite, toggle } = useFavorites();\n const currentPath = path || location.pathname;\n const fav = isFavorite(currentPath);\n return (\n <button onClick={() => toggle(currentPath)} title={fav ? 'Remove from favorites' : 'Add to favorites'}\n className={`shrink-0 transition-colors ${fav ? 'text-yellow-500 hover:text-yellow-600' : 'text-gray-300 hover:text-yellow-400'}`}>\n <svg className=\"h-5 w-5\" fill={fav ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\" />\n </svg>\n </button>\n );\n}\n\nexport const ALL_TIMEZONES = [\n { tz: 'Pacific/Auckland', label: 'Auckland' }, { tz: 'Australia/Sydney', label: 'Sydney' },\n { tz: 'Australia/Adelaide', label: 'Adelaide' }, { tz: 'Australia/Brisbane', label: 'Brisbane' },\n { tz: 'Australia/Perth', label: 'Perth' }, { tz: 'Asia/Tokyo', label: 'Tokyo' },\n { tz: 'Asia/Seoul', label: 'Seoul' }, { tz: 'Asia/Shanghai', label: 'Shanghai' },\n { tz: 'Asia/Hong_Kong', label: 'Hong Kong' }, { tz: 'Asia/Singapore', label: 'Singapore' },\n { tz: 'Asia/Bangkok', label: 'Bangkok' }, { tz: 'Asia/Kolkata', label: 'Mumbai' },\n { tz: 'Asia/Dubai', label: 'Dubai' }, { tz: 'Europe/Moscow', label: 'Moscow' },\n { tz: 'Europe/Istanbul', label: 'Istanbul' }, { tz: 'Europe/Berlin', label: 'Berlin' },\n { tz: 'Europe/Paris', label: 'Paris' }, { tz: 'Europe/London', label: 'London' },\n { tz: 'America/Sao_Paulo', label: 'Sao Paulo' }, { tz: 'America/New_York', label: 'New York' },\n { tz: 'America/Chicago', label: 'Chicago' }, { tz: 'America/Denver', label: 'Denver' },\n { tz: 'America/Los_Angeles', label: 'Los Angeles' }, { tz: 'Pacific/Honolulu', label: 'Honolulu' },\n { tz: 'UTC', label: 'UTC' },\n];\n\nexport function ClockContent({ localTz, worldClocks, now, fmtTime, fmtDate, fmtOffset, removeClock, adding, setAdding, addClock, availableToAdd, showAdd }: {\n localTz: string; worldClocks: string[]; now: Date;\n fmtTime: (tz: string) => string; fmtDate: (tz: string) => string; fmtOffset: (tz: string) => string;\n removeClock: (tz: string) => void; adding: boolean; setAdding: (v: boolean) => void; addClock: (tz: string) => void;\n availableToAdd: { tz: string; label: string }[]; showAdd: boolean;\n}) {\n return (\n <>\n {/* Local time header */}\n <div className=\"px-4 py-3 border-b border-gray-200\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wide\">Local Time</p>\n <div className=\"flex items-baseline justify-between mt-1\">\n <span className=\"text-2xl font-semibold text-gray-900 tabular-nums\">{fmtTime(localTz)}</span>\n <span className=\"text-xs text-gray-400\">{fmtOffset(localTz)}</span>\n </div>\n <p className=\"text-xs text-gray-500 mt-0.5\">{fmtDate(localTz)} &middot; {localTz.replace(/_/g, ' ')}</p>\n </div>\n\n {/* World clocks */}\n <div className=\"max-h-60 overflow-y-auto\">\n {worldClocks.map(tz => {\n const info = ALL_TIMEZONES.find(t => t.tz === tz);\n const label = info?.label || tz.split('/').pop()?.replace(/_/g, ' ') || tz;\n return (\n <div key={tz} className=\"flex items-center justify-between px-4 py-2 hover:bg-gray-50 group\">\n <div>\n <p className=\"text-sm font-medium text-gray-900\">{label}</p>\n <p className=\"text-[10px] text-gray-400\">{fmtDate(tz)} &middot; {fmtOffset(tz)}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-700 tabular-nums\">{fmtTime(tz)}</span>\n <button onClick={() => removeClock(tz)} className=\"opacity-0 group-hover:opacity-100 text-gray-300 hover:text-red-500 transition-all\" title=\"Remove\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n </div>\n </div>\n );\n })}\n {worldClocks.length === 0 && (\n <p className=\"text-sm text-gray-400 text-center py-4\">No world clocks added</p>\n )}\n </div>\n\n {/* Add timezone — only shown when not pinned */}\n {showAdd && (\n <div className=\"border-t border-gray-200 p-2\">\n {adding ? (\n <select autoFocus onChange={e => { if (e.target.value) addClock(e.target.value); }} onBlur={() => setAdding(false)}\n className=\"w-full rounded-md border border-gray-300 px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-blue-500\">\n <option value=\"\">Select timezone...</option>\n {availableToAdd.map(t => (\n <option key={t.tz} value={t.tz}>{t.label} ({fmtOffset(t.tz)})</option>\n ))}\n </select>\n ) : (\n <button onClick={() => setAdding(true)} className=\"w-full flex items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-sm text-gray-500 hover:bg-gray-100 hover:text-gray-700 transition-colors\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n Add World Clock\n </button>\n )}\n </div>\n )}\n </>\n );\n}\n\n/**\n * Compact countdown chip rendered in the system tray when a Pomodoro\n * session is in progress. Subscribes to `pomodoroStore` so it updates\n * once per second without re-rendering the whole shell. Tapping it opens\n * (or focuses) the Pomodoro widget.\n */\nfunction TaskbarPomodoro() {\n const snap = useSyncExternalStore(subscribePomo, getPomoSnapshot, getPomoSnapshot);\n const { openPage } = useWindowManager();\n\n // Show whenever the user has an active or paused-mid-session timer.\n const inSession = snap.running || (snap.remaining < snap.total && snap.remaining > 0);\n if (!inSession) return 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 const dot =\n snap.mode === 'focus' ? 'bg-blue-500' :\n snap.mode === 'short' ? 'bg-emerald-500' : 'bg-emerald-600';\n const label =\n snap.mode === 'focus' ? 'Focus' :\n snap.mode === 'short' ? 'Short break' : 'Long break';\n\n return (\n <button onClick={() => openPage('/pomodoro')}\n title={`${label} · ${mm}:${ss}${snap.running ? '' : ' (paused)'}`}\n className={`shrink-0 flex items-center gap-1.5 rounded-md px-2 py-1 text-[11px] font-mono font-semibold tabular-nums hover:bg-gray-200/50 transition-colors ${snap.running ? 'text-gray-800' : 'text-gray-400'}`}>\n <span className={`block w-1.5 h-1.5 rounded-full ${dot} ${snap.running ? 'animate-pulse' : 'opacity-60'}`} />\n {mm}:{ss}\n </button>\n );\n}\n\nfunction TaskbarClock() {\n const [now, setNow] = useState(new Date());\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { openPage } = useWindowManager();\n\n useEffect(() => {\n const t = setInterval(() => setNow(new Date()), 10000);\n return () => clearInterval(t);\n }, []);\n\n useClickOutside(ref, useCallback(() => { if (open) setOpen(false); }, [open]));\n\n return (\n <div ref={ref} className=\"relative shrink-0\">\n <button ref={buttonRef} onClick={() => setOpen(!open)} className=\"text-right leading-tight cursor-pointer hover:bg-gray-200/50 rounded px-1.5 py-0.5 transition-colors\">\n <p className=\"text-[11px] font-medium text-gray-800\">{now.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}</p>\n <p className=\"text-[10px] text-gray-700\">{now.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })}</p>\n </button>\n\n {open && (() => {\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const rect = buttonRef.current?.getBoundingClientRect();\n const right = rect ? Math.max(8, window.innerWidth - rect.right) : 8;\n const posStyle = taskbarPos === 'top'\n ? { right, top: (rect?.bottom ?? 0) + 4 }\n : { right, bottom: window.innerHeight - (rect?.top ?? 0) + 4 };\n\n return (\n <div className=\"fixed z-[300] rounded-lg border border-gray-200 bg-white shadow-xl\" style={posStyle}>\n <CalendarPopup now={now} />\n </div>\n );\n })()}\n </div>\n );\n}\n\n/**\n * Mini month calendar shown when the user clicks the taskbar clock.\n * Header has month + year and prev/next nav arrows; today is filled in\n * the accent colour; days outside the current month are dimmed.\n */\nfunction CalendarPopup({ now }: { now: Date }) {\n const [month, setMonth] = useState(() => new Date(now.getFullYear(), now.getMonth(), 1));\n\n const monthLabel = month.toLocaleDateString(undefined, { month: 'long', year: 'numeric' });\n const fullDate = now.toLocaleDateString(undefined, { weekday: 'long', month: 'long', day: 'numeric' });\n const fullTime = now.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n\n const firstDay = month.getDay(); // 0 = Sunday\n const daysInMonth = new Date(month.getFullYear(), month.getMonth() + 1, 0).getDate();\n const prevDays = new Date(month.getFullYear(), month.getMonth(), 0).getDate();\n\n const cells: { day: number; thisMonth: boolean; date: Date }[] = [];\n for (let i = firstDay - 1; i >= 0; i--) {\n const day = prevDays - i;\n cells.push({ day, thisMonth: false, date: new Date(month.getFullYear(), month.getMonth() - 1, day) });\n }\n for (let day = 1; day <= daysInMonth; day++) {\n cells.push({ day, thisMonth: true, date: new Date(month.getFullYear(), month.getMonth(), day) });\n }\n let nextDay = 1;\n while (cells.length < 42) {\n cells.push({ day: nextDay, thisMonth: false, date: new Date(month.getFullYear(), month.getMonth() + 1, nextDay) });\n nextDay++;\n }\n\n const today = new Date();\n const isToday = (d: Date) =>\n d.getFullYear() === today.getFullYear() &&\n d.getMonth() === today.getMonth() &&\n d.getDate() === today.getDate();\n\n const goPrev = () => setMonth(m => new Date(m.getFullYear(), m.getMonth() - 1, 1));\n const goNext = () => setMonth(m => new Date(m.getFullYear(), m.getMonth() + 1, 1));\n const goToday = () => setMonth(new Date(today.getFullYear(), today.getMonth(), 1));\n\n return (\n <div className=\"w-[260px] p-3\">\n {/* Live date + time line */}\n <div className=\"px-1 pb-2.5 border-b border-gray-100\">\n <div className=\"text-[11px] font-semibold text-gray-500 uppercase tracking-wide\">{fullDate}</div>\n <div className=\"text-2xl font-semibold text-gray-800 tabular-nums leading-tight mt-0.5\">{fullTime}</div>\n </div>\n\n {/* Month nav */}\n <div className=\"flex items-center justify-between mt-2.5 mb-2\">\n <button onClick={goPrev} className=\"p-1 rounded hover:bg-gray-100 text-gray-600\" aria-label=\"Previous month\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button onClick={goToday} className=\"text-sm font-semibold text-gray-700 hover:text-blue-600 transition-colors\">\n {monthLabel}\n </button>\n <button onClick={goNext} className=\"p-1 rounded hover:bg-gray-100 text-gray-600\" aria-label=\"Next month\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n {/* Day labels */}\n <div className=\"grid grid-cols-7 mb-1 text-[10px] font-semibold text-gray-400 text-center uppercase tracking-wide\">\n {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map((d, i) => <div key={i} className=\"py-1\">{d}</div>)}\n </div>\n\n {/* Day grid */}\n <div className=\"grid grid-cols-7 gap-px text-center\">\n {cells.map((cell, i) => {\n const todayCell = cell.thisMonth && isToday(cell.date);\n return (\n <div key={i}\n className={`text-[12px] py-1.5 rounded-md transition-colors ${\n todayCell\n ? 'bg-blue-500 text-white font-semibold'\n : cell.thisMonth\n ? 'text-gray-700 hover:bg-gray-100'\n : 'text-gray-300'\n }`}>\n {cell.day}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction TaskbarContextMenu({ x, y, position, size, onChangePosition, onChangeSize, onClose, onReportBug }: {\n x: number; y: number; position: string; size: string;\n onChangePosition: (v: string) => void; onChangeSize: (v: string) => void; onClose: () => void;\n onReportBug?: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useClickOutside(ref, onClose);\n\n const posStyle: React.CSSProperties =\n position === 'top' ? { left: Math.min(x, window.innerWidth - 200), top: y + 4 } :\n position === 'left' ? { left: x + 4, top: Math.min(y, window.innerHeight - 300) } :\n position === 'right' ? { right: window.innerWidth - x + 4, top: Math.min(y, window.innerHeight - 300) } :\n { left: Math.min(x, window.innerWidth - 200), bottom: window.innerHeight - y + 4 };\n\n const check = (active: boolean) => active\n ? <svg className=\"h-3.5 w-3.5 text-blue-600 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>\n : <span className=\"w-3.5\" />;\n\n return (\n <div ref={ref} className=\"fixed z-[400] rounded-2xl py-1 min-w-[180px]\" style={{ ...posStyle, ...getGlassStyle() }}>\n <p className=\"px-3 py-1 text-[10px] font-semibold text-gray-400 uppercase tracking-wide\">Position</p>\n {(['bottom', 'top', 'left', 'right'] as const).map(pos => (\n <button key={pos} onClick={() => onChangePosition(pos)}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n {check(position === pos)}\n {pos.charAt(0).toUpperCase() + pos.slice(1)}\n </button>\n ))}\n <div className=\"border-t border-white/20 my-1 mx-3\" />\n <p className=\"px-3 py-1 text-[10px] font-semibold text-gray-400 uppercase tracking-wide\">Size</p>\n {(['small', 'medium', 'large'] as const).map(s => (\n <button key={s} onClick={() => onChangeSize(s)}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n {check(size === s)}\n {s.charAt(0).toUpperCase() + s.slice(1)}\n </button>\n ))}\n {onReportBug && <>\n <div className=\"border-t border-white/20 my-1 mx-3\" />\n <button onClick={() => { onClose(); onReportBug(); }}\n className=\"w-full text-left px-3 py-1.5 text-sm text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors rounded-lg mx-1 flex items-center gap-2\" style={{ width: 'calc(100% - 8px)' }}>\n <span className=\"w-3.5 shrink-0\" />\n Suggestion or Bug\n </button>\n </>}\n </div>\n );\n}\n\nexport default function Layout({\n productName = 'react-os-shell',\n productIcon = '/favicon.svg',\n wallpapers,\n navSections = defaultNavSections,\n navIcons = defaultNavIcons,\n sectionIcons = defaultSectionIcons,\n categories = defaultCategories,\n notifications,\n search,\n taskbarTrayLeft,\n}: LayoutProps = {}) {\n const bugReport = useBugReport();\n const { user, logout, hasAnyPerm } = useAuth();\n const { openPage, openEntity, openWindows } = useWindowManager();\n const [menuOpen, setMenuOpen] = useState(false);\n const isMobile = useIsMobile();\n\n // Profile is reserved for consumer integration; the shell only consumes prefs.\n const profile: any = user || {};\n\n useTheme();\n const { favorites, toggle: toggleFavorite, isFavorite, desktopBg, setDesktopBg } = useFavorites(wallpapers);\n\n const { prefs, save: savePrefs } = useShellPrefs();\n\n // Layout mode — 'sidebar' opt-in for small-screen users. Forces a\n // persistent left strip, horizontal taskbar starting at the sidebar's\n // right edge, and always-maximized non-widget windows.\n const layoutMode: 'classic' | 'sidebar' = prefs.layout_mode === 'sidebar' ? 'sidebar' : 'classic';\n const sidebarMode = layoutMode === 'sidebar';\n const sidebarWidth = sidebarMode ? 280 : 0;\n\n // Taskbar layout — when sidebar mode is active we force the taskbar\n // horizontal across the bottom; the design doesn't support a vertical\n // taskbar living next to the sidebar.\n const taskbarPositionRaw: string = prefs.taskbar_position || 'bottom';\n const taskbarPosition: string = sidebarMode ? 'bottom' : taskbarPositionRaw;\n const taskbarSize: string = prefs.taskbar_size || 'medium';\n const desktopDblClick: string = prefs.desktop_dblclick || 'deactivate';\n\n const isVerticalTaskbar = taskbarPosition === 'left' || taskbarPosition === 'right';\n const taskbarH = isVerticalTaskbar ? 0 : (taskbarSize === 'small' ? 40 : taskbarSize === 'large' ? 72 : 56);\n const taskbarW = isVerticalTaskbar ? (taskbarSize === 'small' ? 180 : taskbarSize === 'large' ? 260 : 220) : 0;\n const taskbarHClass = taskbarSize === 'small' ? 'h-10' : taskbarSize === 'large' ? 'h-[72px]' : 'h-14';\n const taskbarWClass = taskbarSize === 'small' ? 'w-[180px]' : taskbarSize === 'large' ? 'w-[260px]' : 'w-[220px]';\n // Transparency preferences → CSS custom properties for Modal.tsx to read\n const taskbarOpacity = (prefs.transparency_taskbar ?? 70) / 100;\n const menuOpacity = (prefs.transparency_start_menu ?? 95) / 100;\n const inactiveHeaderOpacity = (prefs.transparency_inactive_header ?? 70) / 100;\n const inactiveContentOpacity = (prefs.transparency_inactive_content ?? 80) / 100;\n const activeHeaderOpacity = (prefs.transparency_active_header ?? 80) / 100;\n const activeContentOpacity = (prefs.transparency_active_content ?? 90) / 100;\n useEffect(() => {\n const root = document.documentElement;\n root.style.setProperty('--inactive-header-opacity', String(inactiveHeaderOpacity));\n root.style.setProperty('--inactive-content-opacity', String(inactiveContentOpacity));\n root.style.setProperty('--active-header-opacity', String(activeHeaderOpacity));\n root.style.setProperty('--active-content-opacity', String(activeContentOpacity));\n root.style.setProperty('--menu-opacity', String(menuOpacity));\n // Suffix `px` so consumers using these vars inside CSS calc() get a\n // valid length. JS readers (parseInt(...)) handle either form. Without\n // the unit, expressions like `calc(100vh - var(--taskbar-height) - 24px)`\n // are invalid and the browser drops the whole property — which previously\n // broke the Modal autoHeight cap for any consumer that wasn't a widget.\n root.style.setProperty('--taskbar-height', `${taskbarH}px`);\n root.style.setProperty('--taskbar-width', `${taskbarW}px`);\n root.style.setProperty('--taskbar-position', taskbarPosition);\n // Sidebar mode: width of the persistent left strip + a layout-mode\n // marker. Modal reads both — sidebar-width to offset its calcMaximized\n // box, layout-mode to switch into \"always maximized\" behaviour.\n root.style.setProperty('--sidebar-width', `${sidebarWidth}px`);\n root.style.setProperty('--layout-mode', layoutMode);\n // Tell already-mounted Modals to refresh their alwaysMaximized flag\n // (they don't have access to ShellPrefs context — they listen for\n // this event so the toggle takes effect immediately).\n window.dispatchEvent(new CustomEvent('react-os-shell:layout-mode-changed'));\n root.style.setProperty('--default-window-size', prefs.default_window_size || 'large');\n root.style.setProperty('--window-position', prefs.window_position || 'cascade');\n root.style.setProperty('--menu-density', prefs.menu_density || 'normal');\n // Menu size — affects font size and item padding across PopupMenu (context menus, dropdowns, notification popup, etc.)\n // Also drives the taskbar window-tab width so it stays proportional.\n const menuSize = prefs.start_menu_size || 'medium';\n const sizeVars: Record<string, { font: string; px: string; py: string; tabW: string; tabFont: string }> = {\n small: { font: '12px', px: '0.75rem', py: '0.25rem', tabW: '150px', tabFont: '11px' },\n medium: { font: '14px', px: '1rem', py: '0.5rem', tabW: '200px', tabFont: '12px' },\n large: { font: '15px', px: '1.125rem', py: '0.625rem', tabW: '240px', tabFont: '13px' },\n };\n const sv = sizeVars[menuSize] || sizeVars.medium;\n root.style.setProperty('--menu-font-size', sv.font);\n root.style.setProperty('--menu-padding-x', sv.px);\n root.style.setProperty('--menu-padding-y', sv.py);\n root.style.setProperty('--window-tab-width', sv.tabW);\n root.style.setProperty('--window-tab-font-size', sv.tabFont);\n }, [inactiveHeaderOpacity, inactiveContentOpacity, activeHeaderOpacity, activeContentOpacity, taskbarH, taskbarPosition, prefs.default_window_size, prefs.window_position, prefs.menu_density, prefs.start_menu_size, sidebarWidth, layoutMode]);\n\n // Mobile-only CSS var: bottom-nav reservation height. Modal reads this to\n // shrink fullscreen apps so they don't render under the nav. Zero on desktop\n // so the variable can be used unconditionally in Modal styles.\n useEffect(() => {\n document.documentElement.style.setProperty('--mobile-bottom-nav', isMobile ? '100px' : '0px');\n }, [isMobile]);\n const [balloonDismissed, setBalloonDismissed] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(!!document.fullscreenElement);\n const [taskbarMenu, setTaskbarMenu] = useState<{ x: number; y: number } | null>(null);\n const [showLogout, setShowLogout] = useState(false);\n\n const savePref = useCallback((key: string, value: any) => {\n savePrefs({ [key]: value });\n }, [savePrefs]);\n\n const toggleFullscreen = useCallback(async () => {\n if (document.fullscreenElement) {\n // Release keyboard lock before exiting\n if ((navigator as any).keyboard?.unlock) (navigator as any).keyboard.unlock();\n document.exitFullscreen();\n } else {\n await document.documentElement.requestFullscreen();\n // Lock Escape key so it goes to our app instead of exiting fullscreen\n if ((navigator as any).keyboard?.lock) {\n try { await (navigator as any).keyboard.lock(['Escape']); } catch { /* not supported or denied */ }\n }\n }\n }, []);\n\n // Sync fullscreen state with browser\n useEffect(() => {\n const handler = () => {\n setIsFullscreen(!!document.fullscreenElement);\n // Release keyboard lock when exiting fullscreen\n if (!document.fullscreenElement && (navigator as any).keyboard?.unlock) {\n (navigator as any).keyboard.unlock();\n }\n };\n document.addEventListener('fullscreenchange', handler);\n return () => document.removeEventListener('fullscreenchange', handler);\n }, []);\n\n // Auto-fullscreen on login\n const autoFullscreenDone = useRef(false);\n useEffect(() => {\n if (autoFullscreenDone.current) return;\n if (prefs.auto_fullscreen && !document.fullscreenElement) {\n autoFullscreenDone.current = true;\n // Needs a user gesture — use a one-time click listener\n const handler = async () => {\n if (!document.fullscreenElement) {\n try {\n await document.documentElement.requestFullscreen();\n if ((navigator as any).keyboard?.lock) (navigator as any).keyboard.lock(['Escape']).catch(() => {});\n } catch {}\n }\n document.removeEventListener('click', handler);\n };\n document.addEventListener('click', handler, { once: true });\n }\n }, [prefs.auto_fullscreen]);\n\n // Startup animation + sound\n const [showStartup, setShowStartup] = useState(false);\n const startupChecked = useRef(false);\n useEffect(() => {\n if (startupChecked.current) return;\n startupChecked.current = true;\n const key = 'erp_startup_shown';\n if (!sessionStorage.getItem(key)) {\n sessionStorage.setItem(key, '1');\n setShowStartup(true);\n }\n }, []);\n\n const startupSoundDone = useRef(false);\n useEffect(() => {\n if (startupSoundDone.current || !showStartup) return;\n startupSoundDone.current = true;\n setTimeout(() => playStartup(), 500);\n }, [showStartup]);\n\n // Hotkey: Ctrl+. / Cmd+. to toggle menu, F11 to toggle fullscreen\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === '.') {\n e.preventDefault();\n setMenuOpen(prev => !prev);\n }\n if (e.ctrlKey && e.key === 'F11') {\n e.preventDefault();\n toggleFullscreen();\n }\n if (e.key === 'Escape' && document.fullscreenElement) {\n // Only exit fullscreen if no modals are open (let modals handle Escape first)\n const hasOpenModals = document.querySelectorAll('[data-modal-panel]').length > 0;\n if (!hasOpenModals) {\n e.preventDefault();\n toggleFullscreen();\n }\n }\n };\n window.addEventListener('keydown', handler);\n return () => { window.removeEventListener('keydown', handler); };\n }, [toggleFullscreen]);\n\n return (\n <div className=\"flex flex-col h-screen\">\n {showStartup && <StartupAnimation onComplete={() => setShowStartup(false)} ready={!!profile} productName={productName} />}\n {showLogout && <LogoutAnimation onComplete={() => { sessionStorage.removeItem('erp_startup_shown'); logout(); }} />}\n {/* Start Menu — suppressed in sidebar mode (Sidebar replaces it). */}\n {!sidebarMode && (\n <StartMenu\n open={menuOpen}\n onClose={() => setMenuOpen(false)}\n openPage={(path) => { openPage(path); setMenuOpen(false); }}\n openWindows={openWindows}\n profile={profile}\n user={user}\n onLogout={() => setShowLogout(true)}\n onNavigate={(path) => { openPage(path); setMenuOpen(false); }}\n taskbarPosition={taskbarPosition as 'top' | 'bottom' | 'left' | 'right'}\n taskbarH={taskbarH}\n taskbarW={taskbarW}\n size={(prefs.start_menu_size || 'medium') as 'small' | 'medium' | 'large'}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n categories={categories}\n />\n )}\n\n {/* Sidebar — persistent left strip for sidebar layout mode.\n Lazy-imported so a stale source checkout missing Sidebar.tsx\n only blows up if the user flips into sidebar mode (vs. crashing\n at module load), and so the chunk is only fetched when needed. */}\n {sidebarMode && (\n <Suspense fallback={null}>\n <Sidebar\n width={sidebarWidth}\n openPage={(path) => openPage(path)}\n profile={profile}\n user={user}\n onLogout={() => setShowLogout(true)}\n onNavigate={(path) => openPage(path)}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n categories={categories}\n productName={productName}\n productIcon={productIcon}\n />\n </Suspense>\n )}\n\n {(() => {\n // Shared wallpaper style used by both desktop main and mobile home so\n // the user's chosen background carries across breakpoints.\n const wallpaperStyle: React.CSSProperties = {\n backgroundColor: desktopBg?.startsWith('#') ? desktopBg : desktopBg === 'none' ? (() => {\n const customBg = getComputedStyle(document.documentElement).getPropertyValue('--custom-bg-color')?.trim();\n if (customBg) return customBg;\n const t = document.documentElement.getAttribute('data-theme') || 'light';\n const map: Record<string, string> = { light: '#f3f4f6', dark: '#1e1e2e', pink: '#fdf2f8', green: '#f0fdf4', grey: '#d1d5db', blue: '#eff6ff' };\n return map[t] || '#f3f4f6';\n })() : '#1a1a2e',\n backgroundImage: desktopBg && desktopBg !== 'none' && !desktopBg.startsWith('#') ? `url(${desktopBg})` : 'none',\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n };\n\n if (isMobile) {\n return (\n <MobileShell\n productName={productName}\n productIcon={productIcon}\n navSections={navSections}\n navIcons={navIcons}\n sectionIcons={sectionIcons}\n wallpaperStyle={wallpaperStyle}\n notifications={notifications}\n profile={profile}\n user={user}\n onNavigate={(path) => openPage(path)}\n onLogout={() => setShowLogout(true)}\n />\n );\n }\n\n return (\n <>\n <div className=\"flex flex-1 min-h-0\">\n <main\n className=\"flex-1 flex flex-col overflow-hidden cursor-default\"\n onDoubleClick={() => {\n if (desktopDblClick === 'deactivate') { setMenuOpen(false); window.dispatchEvent(new CustomEvent('deactivate-all-modals')); }\n }}\n style={wallpaperStyle}\n >\n {/* Desktop with shortcuts, folders, and context menu */}\n <Desktop profile={profile} />\n </main>\n </div>\n\n {/* Taskbar — overlays content for transparency. In sidebar mode the\n left edge starts at the sidebar's right edge instead of x=0. */}\n <div className={`flex backdrop-blur-sm border-gray-200 z-[250] fixed ${\n isVerticalTaskbar\n ? `flex-col items-center ${taskbarWClass} py-3 gap-2 top-0 bottom-0 ${taskbarPosition === 'left' ? 'left-0 border-r' : 'right-0 border-l'}`\n : `items-center ${taskbarHClass} px-3 gap-2 right-0 ${taskbarPosition === 'top' ? 'top-0 border-b' : 'bottom-0 border-t'}`\n }`}\n style={{\n backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${taskbarOpacity})`,\n ...(isVerticalTaskbar ? {} : { left: sidebarWidth }),\n }}\n onContextMenu={e => { e.preventDefault(); setTaskbarMenu({ x: e.clientX, y: e.clientY }); }}>\n {/* ERP button — toggles Start Menu. Hidden in sidebar mode where\n the persistent left sidebar replaces the start-menu role. */}\n {!sidebarMode && <div className=\"relative shrink-0\">\n {openWindows.length === 0 && !menuOpen && !balloonDismissed && (\n <div className={`absolute left-1/2 -translate-x-1/2 whitespace-nowrap text-white text-[10px] font-medium pl-3 pr-2 py-1 rounded-full shadow-lg animate-bounce flex items-center gap-1 ${taskbarPosition === 'top' ? 'top-full mt-2' : '-top-8'}`}\n style={{ backgroundColor: 'var(--accent-600, #7c3aed)' }}>\n Click here to start\n <button onClick={(e) => { e.stopPropagation(); setBalloonDismissed(true); }} className=\"text-white/60 hover:text-white ml-1.5\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n <div className={`absolute left-1/2 -translate-x-1/2 border-[6px] border-transparent ${taskbarPosition === 'top' ? 'bottom-full border-b-[var(--accent-color,#7c3aed)]' : 'top-full border-t-[var(--accent-color,#7c3aed)]'}`}\n style={taskbarPosition === 'top' ? { borderBottomColor: 'var(--accent-600, #7c3aed)' } : { borderTopColor: 'var(--accent-600, #7c3aed)' }} />\n </div>\n )}\n <button data-menu-toggle onClick={() => setMenuOpen(prev => !prev)} title={menuOpen ? 'Close menu' : 'Open menu'}\n className={`group/erp relative flex items-center justify-center gap-1.5 rounded-lg px-4 py-2 text-xs font-medium border overflow-hidden transition-all ${isVerticalTaskbar ? 'w-full' : 'min-w-[140px]'} ${menuOpen ? 'bg-gray-200/40 border-gray-300/40 text-gray-800' : 'bg-gray-50/40 border-gray-200/40 text-gray-600 hover:text-gray-800'}`}\n style={{ transition: 'box-shadow 0.3s, border-color 0.3s' }}\n onMouseMove={e => { const r = e.currentTarget.getBoundingClientRect(); e.currentTarget.style.setProperty('--mx', `${e.clientX - r.left}px`); e.currentTarget.style.setProperty('--my', `${e.clientY - r.top}px`); }}\n onMouseEnter={e => { e.currentTarget.style.boxShadow = '0 0 15px rgba(255,255,255,0.2), 0 0 30px rgba(255,255,255,0.1)'; e.currentTarget.style.borderColor = 'rgba(255,255,255,0.4)'; }}\n onMouseLeave={e => { e.currentTarget.style.boxShadow = ''; e.currentTarget.style.borderColor = ''; }}>\n <span className=\"absolute inset-0 opacity-0 group-hover/erp:opacity-100 transition-opacity duration-200 pointer-events-none\"\n style={{ background: 'radial-gradient(circle 60px at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,0.25) 0%, transparent 100%)' }} />\n {productIcon && <img src={productIcon} alt=\"\" className=\"relative z-10 h-3.5 w-3.5 shrink-0 opacity-60\" />}\n <span className=\"relative z-10 truncate\">{productName}</span>\n </button>\n </div>}\n\n {/* Separator (only when the ERP button is also rendered) */}\n {!sidebarMode && <div className={isVerticalTaskbar ? 'h-px w-6 bg-gray-300 my-1' : 'w-px h-6 bg-gray-300 mx-1'} />}\n\n {/* Window tabs rendered here by WindowManagerProvider */}\n <div id=\"taskbar-windows\" className={`flex-1 flex ${isVerticalTaskbar ? 'flex-col items-center gap-1 min-h-0 overflow-y-auto w-full' : 'items-center gap-1.5 min-w-0 overflow-x-auto'}`} />\n\n {/* Separator */}\n <div className={isVerticalTaskbar ? 'h-px w-6 bg-gray-300 my-1' : 'w-px h-6 bg-gray-300 mx-1'} />\n\n {/* System tray */}\n {isVerticalTaskbar ? (\n /* Vertical: clock + bell evenly spaced */\n <div className=\"w-full px-2\">\n <div className={`flex items-center justify-center gap-2 ${taskbarPosition === 'right' ? 'flex-row-reverse' : ''}`}>\n <TaskbarClock />\n <TaskbarPomodoro />\n {/* Host-supplied tray content (e.g. server-status icon).\n Sits next to the notification bell on the bell's\n outer edge. */}\n {taskbarTrayLeft}\n {notifications && <NotificationBell {...notifications} popDirection={taskbarPosition === 'right' ? 'left' : 'right'} />}\n </div>\n </div>\n ) : (\n /* Horizontal: icons then clock */\n <>\n <TaskbarPomodoro />\n {taskbarTrayLeft}\n {notifications && <NotificationBell {...notifications} />}\n <TaskbarClock />\n </>\n )}\n </div>\n </>\n );\n })()}\n\n {/* Taskbar context menu */}\n {taskbarMenu && (\n <TaskbarContextMenu\n x={taskbarMenu.x} y={taskbarMenu.y}\n position={taskbarPosition}\n size={taskbarSize}\n onChangePosition={v => { savePref('taskbar_position', v); setTaskbarMenu(null); }}\n onChangeSize={v => { savePref('taskbar_size', v); setTaskbarMenu(null); }}\n onClose={() => setTaskbarMenu(null)}\n onReportBug={bugReport ? () => reportBug(bugReport.submit) : undefined}\n />\n )}\n\n <GlobalSearch {...search} />\n <ShortcutHelp />\n </div>\n );\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport { ModalActions } from '../shell/Modal';\nimport { useDesktopHost } from '../shell/Desktop';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport { SOUND_PACKS, SOUND_PACK_KEYS, SOUND_TYPES, SOUND_TYPE_LABELS, getSoundConfig, setSoundForType, setAllSounds, soundsEnabled, previewSound, type SoundType } from '../utils/sounds';\n\n// Preview tiles use literal hex values via arbitrary Tailwind syntax so that the\n// active theme's [data-theme=\"...\"] !important overrides don't repaint them\n// (the Light preview must stay light even when Dark is the current theme).\nconst THEMES = [\n { key: 'system', label: 'System', bar1: 'bg-[#e5e7eb]', bar2: 'bg-[#e5e7eb]' },\n { key: 'light', label: 'Light', bar1: 'bg-[#e5e7eb]', bar2: 'bg-[#e5e7eb]' },\n { key: 'dark', label: 'Dark', bar1: 'bg-[#45475a]', bar2: 'bg-[#45475a]' },\n { key: 'pink', label: 'Blossom', bar1: 'bg-[#fbcfe8]', bar2: 'bg-[#fbcfe8]' },\n { key: 'green', label: 'Nature', bar1: 'bg-[#bbf7d0]', bar2: 'bg-[#bbf7d0]' },\n { key: 'grey', label: 'Quicksilver', bar1: 'bg-[#d1d5db]', bar2: 'bg-[#d1d5db]' },\n { key: 'blue', label: 'Ocean', bar1: 'bg-[#bfdbfe]', bar2: 'bg-[#bfdbfe]' },\n];\n\n// Default wallpaper list (consumer-overridable via DesktopHostProvider).\nconst DEFAULT_WALLPAPERS: { src: string; label: string }[] = [];\n\n/** Resolve what data-theme is actually active (for preview rendering) */\nfunction resolveTheme(key: string): string {\n if (key === 'system') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return key;\n}\n\nfunction getVersion() {\n const now = new Date();\n return `v${String(now.getDate()).padStart(2, '0')}${String(now.getMonth() + 1).padStart(2, '0')}.${String(now.getHours()).padStart(2, '0')}.${String(now.getMinutes()).padStart(2, '0')}.${now.getFullYear()}`;\n}\n\nfunction previewColor(resolved: string, light: string, dark: string, pink: string, green: string, grey?: string, blue?: string) {\n if (resolved === 'dark') return dark;\n if (resolved === 'pink') return pink;\n if (resolved === 'green') return green;\n if (resolved === 'grey') return grey ?? light;\n if (resolved === 'blue') return blue ?? light;\n return light;\n}\n\n/** Sections that can be omitted from the inline Customization page when the\n * consumer renders them elsewhere (e.g. as separate entries in SystemPreferences). */\nexport type CustomizationOmitSection = 'behavior' | 'desktop';\n\nexport interface CustomizationProps {\n omit?: readonly CustomizationOmitSection[];\n}\n\nexport default function Customization({ omit }: CustomizationProps = {}) {\n const omitSet = new Set(omit ?? []);\n const host = useDesktopHost();\n const WALLPAPERS = host.wallpapers && host.wallpapers.length > 0 ? host.wallpapers : DEFAULT_WALLPAPERS;\n const { prefs, save } = useShellPrefs();\n\n const currentTheme: string = prefs.theme || 'system';\n const resolved = resolveTheme(currentTheme);\n const rawBg: string = prefs.desktop_bg || (WALLPAPERS.length > 0 ? 'random' : 'none');\n const randomPickRef = useRef(WALLPAPERS.length > 0 ? WALLPAPERS[Math.floor(Math.random() * WALLPAPERS.length)].src : 'none');\n const desktopBg = rawBg === 'random' ? randomPickRef.current : rawBg;\n const customBg: string = prefs.desktop_bg_custom || '';\n const isColor = desktopBg?.startsWith('#');\n const presetPaths = new Set([...WALLPAPERS.map(w => w.src), 'random']);\n const isCustom = !isColor && desktopBg !== 'none' && rawBg !== 'random' && desktopBg && !presetPaths.has(desktopBg);\n\n const savePref = (key: string, value: any) => {\n save({ [key]: value });\n };\n\n // Debounced save for sliders — updates local state instantly, saves after 300ms idle\n const [localSliders, setLocalSliders] = useState<Record<string, number>>({});\n const sliderTimers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n const saveSlider = useCallback((key: string, value: number) => {\n setLocalSliders(prev => ({ ...prev, [key]: value }));\n // Apply CSS variable immediately for instant visual feedback\n const cssMap: Record<string, string> = {\n transparency_taskbar: '--taskbar-opacity',\n transparency_inactive_header: '--inactive-header-opacity',\n transparency_inactive_content: '--inactive-content-opacity',\n transparency_active_header: '--active-header-opacity',\n transparency_active_content: '--active-content-opacity',\n };\n if (cssMap[key]) {\n document.documentElement.style.setProperty(cssMap[key], String(value / 100));\n }\n if (sliderTimers.current[key]) clearTimeout(sliderTimers.current[key]);\n sliderTimers.current[key] = setTimeout(() => {\n savePref(key, value);\n setLocalSliders(prev => { const next = { ...prev }; delete next[key]; return next; });\n }, 300);\n }, [savePref]);\n // Cleanup timers on unmount\n useEffect(() => () => { Object.values(sliderTimers.current).forEach(clearTimeout); }, []);\n\n const prevTaskbarOpacity = (prefs.transparency_taskbar ?? 70) / 100;\n const prevActiveHeaderOpacity = (prefs.transparency_active_header ?? 80) / 100;\n const prevActiveContentOpacity = (prefs.transparency_active_content ?? 90) / 100;\n const taskbarBg = previewColor(resolved, 'bg-white/90', 'bg-[#1e1e2e]/90', 'bg-pink-50/90', 'bg-green-50/90', 'bg-gray-200/90', 'bg-blue-50/90');\n const iconBg = previewColor(resolved, 'bg-gray-200', 'bg-[#313244]', 'bg-pink-200', 'bg-green-200', 'bg-gray-400', 'bg-blue-200');\n const winBg = previewColor(resolved, 'bg-white border border-gray-200', 'bg-[#1e1e2e] border border-[#45475a]', 'bg-white border border-pink-200', 'bg-white border border-green-200', 'bg-gray-100 border border-gray-300', 'bg-blue-50 border border-blue-200');\n const headerBg = previewColor(resolved, 'bg-gray-100', 'bg-[#313244]', 'bg-pink-50', 'bg-green-50', 'bg-gray-300', 'bg-blue-100');\n const accentBg = previewColor(resolved, 'bg-blue-600', 'bg-blue-500', 'bg-pink-600', 'bg-green-600', 'bg-gray-700', 'bg-blue-700');\n\n return (\n <div className=\"space-y-6\">\n {/* ── Live Preview ── */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-lg border border-gray-200 overflow-hidden\" style={{ width: 480 }}>\n <div className=\"relative\" style={{ height: 300 }}>\n {/* Wallpaper */}\n {isColor ? (\n <div className=\"absolute inset-0\" style={{ backgroundColor: desktopBg }} />\n ) : (\n <img src={desktopBg} alt=\"\" className=\"absolute inset-0 w-full h-full object-cover\" />\n )}\n {/* Mini taskbar */}\n <div className={`absolute left-0 right-0 bottom-0 h-4 ${taskbarBg} border-t border-gray-200/50 flex items-center px-2 gap-1`} style={{ opacity: prevTaskbarOpacity }}>\n <div className={`h-2 w-8 rounded-sm ${accentBg}`} />\n <div className={`h-2 w-6 rounded-sm ${iconBg}`} />\n </div>\n {/* Desktop icons */}\n <div className=\"absolute left-4 top-4 flex gap-4\">\n {[\n { icon: '📋', label: 'Orders' },\n { icon: '📦', label: 'Products' },\n { icon: '📊', label: 'Reports' },\n ].map(d => (\n <div key={d.label} className=\"flex flex-col items-center gap-0.5 w-8\">\n <div className=\"text-sm drop-shadow\">{d.icon}</div>\n <span className=\"text-[5px] text-white font-medium drop-shadow-[0_1px_1px_rgba(0,0,0,0.8)] leading-tight\">{d.label}</span>\n </div>\n ))}\n </div>\n {/* Mini window */}\n <div className={`absolute rounded shadow-md ${winBg}`} style={{ left: '35%', top: '20%', width: '55%', height: '55%' }}>\n <div className={`h-3 rounded-t ${headerBg} flex items-center px-1.5 gap-0.5`} style={{ opacity: prevActiveHeaderOpacity }}>\n <div className=\"w-1 h-1 rounded-full bg-red-400\" />\n <div className=\"w-1 h-1 rounded-full bg-yellow-400\" />\n <div className=\"w-1 h-1 rounded-full bg-green-400\" />\n </div>\n <div className=\"p-1.5 space-y-1\" style={{ opacity: prevActiveContentOpacity }}>\n <div className={`h-1 rounded w-3/4 ${iconBg}`} />\n <div className={`h-1 rounded w-1/2 ${iconBg}`} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Theme ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Theme</h3>\n <div className=\"flex gap-3 flex-wrap\">\n {[...THEMES, { key: 'custom', label: 'Custom', bar1: 'bg-gray-200', bar2: 'bg-gray-200' }].map(t => {\n const isCustom = t.key === 'custom';\n const r = isCustom ? 'light' : resolveTheme(t.key);\n const customColor = prefs.accent_color || '#8b5cf6';\n const tAccent = isCustom ? '' : previewColor(r, 'bg-[#2563eb]', 'bg-[#3b82f6]', 'bg-[#db2777]', 'bg-[#16a34a]', 'bg-[#374151]', 'bg-[#1d4ed8]');\n const tBg = isCustom ? 'bg-[#ffffff] border-[#d1d5db]' : previewColor(r, 'bg-[#ffffff] border-[#d1d5db]', 'bg-[#1e1e2e] border-[#45475a]', 'bg-[#fdf2f8] border-[#f9a8d4]', 'bg-[#f0fdf4] border-[#86efac]', 'bg-[#e5e7eb] border-[#9ca3af]', 'bg-[#eff6ff] border-[#93c5fd]');\n return (\n <button key={t.key} onClick={() => {\n if (isCustom) {\n savePref('theme', 'light');\n if (!prefs.accent_color) savePref('accent_color', '#8b5cf6');\n } else {\n savePref('theme', t.key);\n savePref('accent_color', null);\n }\n }}\n className={`flex flex-col items-center gap-1.5 rounded-lg border-2 p-3 transition-all ${(isCustom ? !!prefs.accent_color : currentTheme === t.key && !prefs.accent_color) ? 'border-blue-500 shadow-md' : 'border-gray-200 hover:border-gray-300'}`}>\n <div className={`w-20 h-14 rounded ${tBg} border overflow-hidden flex flex-col`}>\n {t.key === 'system' ? (\n <div className=\"flex-1 flex\">\n <div className=\"flex-1 flex flex-col bg-[#ffffff]\">\n <div className=\"h-2 bg-[#2563eb] w-full\" />\n <div className=\"flex-1 flex gap-0.5 p-0.5\">\n <div className=\"w-3 rounded-sm bg-[#f3f4f6]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1 rounded-sm w-3/4 bg-[#e5e7eb]\" />\n <div className=\"h-1 rounded-sm w-1/2 bg-[#e5e7eb]\" />\n </div>\n </div>\n </div>\n <div className=\"flex-1 flex flex-col bg-[#1e1e2e]\">\n <div className=\"h-2 bg-[#3b82f6] w-full\" />\n <div className=\"flex-1 flex gap-0.5 p-0.5\">\n <div className=\"w-3 rounded-sm bg-[#313244]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1 rounded-sm w-3/4 bg-[#45475a]\" />\n <div className=\"h-1 rounded-sm w-1/2 bg-[#45475a]\" />\n </div>\n </div>\n </div>\n </div>\n ) : isCustom ? (\n <>\n <div className=\"h-2 w-full\" style={{ backgroundColor: customColor }} />\n <div className=\"flex-1 flex gap-0.5 p-1\">\n <div className=\"w-4 rounded-sm bg-[#f3f4f6]\" />\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className=\"h-1.5 rounded-sm w-3/4 bg-[#e5e7eb]\" />\n <div className=\"h-1.5 rounded-sm w-1/2 bg-[#e5e7eb]\" />\n </div>\n </div>\n </>\n ) : (\n <>\n <div className={`h-2 ${tAccent} w-full`} />\n <div className=\"flex-1 flex gap-0.5 p-1\">\n <div className=\"flex-1 flex flex-col gap-0.5\">\n <div className={`h-1.5 rounded-sm w-3/4 ${t.bar1}`} />\n <div className={`h-1.5 rounded-sm w-1/2 ${t.bar2}`} />\n </div>\n </div>\n </>\n )}\n </div>\n <span className={`text-xs font-medium ${(isCustom ? !!prefs.accent_color : currentTheme === t.key && !prefs.accent_color) ? 'text-blue-600' : 'text-gray-600'}`}>{t.label}</span>\n </button>\n );\n })}\n </div>\n\n {/* Custom color pickers — only visible when Custom theme is selected */}\n {prefs.accent_color && (\n <div className=\"mt-3 space-y-2\">\n {([\n { key: 'custom_bg_color', label: 'Background Color', defaultVal: '#f3f4f6' },\n { key: 'custom_title_color', label: 'Title Color', defaultVal: '#f9fafb' },\n { key: 'custom_window_color', label: 'Windows Background', defaultVal: '#ffffff' },\n { key: 'custom_button_color', label: 'Button Color', defaultVal: '#2563eb' },\n { key: 'accent_color', label: 'Accent Color', defaultVal: '#8b5cf6' },\n ]).map(item => (\n <div key={item.key} className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">{item.label}</span>\n <label className=\"w-8 h-8 rounded-lg border-2 border-gray-300 overflow-hidden cursor-pointer flex items-center justify-center shrink-0\"\n style={{ backgroundColor: prefs[item.key] || item.defaultVal }}>\n <input type=\"color\" value={prefs[item.key] || item.defaultVal}\n onChange={e => savePref(item.key, e.target.value)}\n className=\"opacity-0 absolute w-0 h-0\" />\n </label>\n <span className=\"text-xs text-gray-500 font-mono\">{prefs[item.key] || item.defaultVal}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Desktop Wallpaper ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop Wallpaper</h3>\n <div className=\"flex gap-2 flex-wrap items-center\">\n <button onClick={() => savePref('desktop_bg', 'none')}\n className={`w-28 h-20 rounded border-2 overflow-hidden flex items-center justify-center ${rawBg === 'none' ? 'border-blue-500' : 'border-gray-300'}`}\n style={{ backgroundColor: previewColor(resolved, '#f3f4f6', '#1e1e2e', '#fdf2f8', '#f0fdf4', '#d1d5db', '#eff6ff') }}>\n <span className=\"text-[9px] text-gray-500\">None</span>\n </button>\n <button onClick={() => savePref('desktop_bg', 'random')}\n className={`w-28 h-20 rounded border-2 overflow-hidden flex items-center justify-center ${rawBg === 'random' ? 'border-blue-500' : 'border-gray-300'}`}>\n <div className=\"grid grid-cols-2 grid-rows-2 w-full h-full\">\n {WALLPAPERS.slice(0, 4).map(wp => (\n <img key={wp.src} src={wp.src} alt=\"\" loading=\"lazy\" className=\"w-full h-full object-cover\" />\n ))}\n </div>\n </button>\n {WALLPAPERS.map(wp => (\n <button key={wp.src} onClick={() => savePref('desktop_bg', wp.src)}\n className={`w-28 h-20 rounded border-2 overflow-hidden ${rawBg === wp.src ? 'border-blue-500' : 'border-gray-300'}`}>\n <img src={wp.src} alt={wp.label} loading=\"lazy\" className=\"w-full h-full object-cover\" />\n </button>\n ))}\n {(customBg || isCustom) && (\n <div className=\"relative group\">\n <button onClick={() => savePref('desktop_bg', customBg || desktopBg)}\n className={`w-28 h-20 rounded border-2 overflow-hidden ${isCustom ? 'border-blue-500' : 'border-gray-300'}`}>\n <img src={customBg || desktopBg} alt=\"Custom\" loading=\"lazy\" className=\"w-full h-full object-cover\" />\n </button>\n <button onClick={() => save({ desktop_bg: 'random', desktop_bg_custom: '' })}\n className=\"absolute -top-1.5 -right-1.5 h-4 w-4 rounded-full bg-red-500 text-white flex items-center justify-center text-[10px] leading-none opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-600 shadow\">&times;</button>\n </div>\n )}\n <label className=\"w-28 h-20 rounded border-2 border-gray-300 border-dashed overflow-hidden cursor-pointer flex items-center justify-center text-gray-400 hover:text-gray-600\">\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n <input type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={e => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onloadend = () => {\n if (reader.result) {\n save({ desktop_bg: reader.result as string, desktop_bg_custom: reader.result as string });\n }\n };\n reader.readAsDataURL(file);\n }} />\n </label>\n </div>\n </div>\n\n {/* ── Transparency ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Transparency</h3>\n <div className=\"space-y-3\">\n {([\n { key: 'transparency_taskbar', label: 'Taskbar', defaultVal: 70 },\n { key: 'transparency_start_menu', label: 'Start Menu', defaultVal: 70 },\n { key: 'transparency_inactive_header', label: 'Inactive Windows Header / Footer', defaultVal: 70 },\n { key: 'transparency_inactive_content', label: 'Inactive Windows Content', defaultVal: 80 },\n { key: 'transparency_active_header', label: 'Active Windows Header / Footer', defaultVal: 80 },\n { key: 'transparency_active_content', label: 'Active Windows Content', defaultVal: 90 },\n ] as const).map(item => {\n const val: number = localSliders[item.key] ?? prefs[item.key] ?? item.defaultVal;\n return (\n <div key={item.key} className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-64 shrink-0\">{item.label}</span>\n <input type=\"range\" min={20} max={100} value={val}\n onChange={e => saveSlider(item.key, Number(e.target.value))}\n className=\"flex-1 h-1.5 accent-blue-600 cursor-pointer\" />\n <span className=\"text-xs text-gray-500 w-10 text-right font-mono\">{val}%</span>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* ── Layout Mode ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Layout Mode</h3>\n <p className=\"text-xs text-gray-500 mb-3\">\n Sidebar mode is designed for small screens — windows always run maximized\n and the start menu lives in a persistent left sidebar (sections expand inline\n instead of opening flyouts).\n </p>\n <div className=\"flex gap-2\">\n {([\n { key: 'classic', label: 'Classic' },\n { key: 'sidebar', label: 'Sidebar' },\n ] as const).map(m => (\n <button\n key={m.key}\n onClick={() => {\n savePref('layout_mode', m.key);\n // Stay consistent if the user later switches back to classic —\n // sidebar implies maximized, so set the default-window-size pref\n // to match.\n if (m.key === 'sidebar') savePref('default_window_size', 'maximized');\n }}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.layout_mode || 'classic') === m.key\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}\n >\n {m.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* ── Taskbar ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Taskbar</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Position</span>\n <div className=\"flex gap-2\">\n {(['bottom', 'top', 'left', 'right'] as const).map(pos => (\n <button key={pos} onClick={() => savePref('taskbar_position', pos)}\n disabled={prefs.layout_mode === 'sidebar'}\n title={prefs.layout_mode === 'sidebar' ? 'Sidebar mode forces a horizontal taskbar.' : undefined}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors disabled:opacity-40 disabled:cursor-not-allowed ${\n (prefs.taskbar_position || 'bottom') === pos ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{pos.charAt(0).toUpperCase() + pos.slice(1)}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Menu ── */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Menu</h3>\n <p className=\"text-xs text-gray-500 mb-3\">Controls font size, padding, taskbar height, and window button height across the Start Menu, context menus, dropdowns, and the notification popup.</p>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Size</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('start_menu_size', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.start_menu_size || 'medium') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-24 shrink-0\">Density</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'tight', label: 'Tight' },\n { key: 'normal', label: 'Normal' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('menu_density', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.menu_density || 'normal') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Behavior ── */}\n {!omitSet.has('behavior') && (\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Behavior</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">New window position</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'center', label: 'Center' },\n { key: 'cascade', label: 'Cascade' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('window_position', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.window_position || 'cascade') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">Double-click desktop</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'deactivate', label: 'Deactivate all' },\n { key: 'nothing', label: 'Do nothing' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('desktop_dblclick', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.desktop_dblclick || 'deactivate') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">Default window size</span>\n <div className=\"flex gap-2\">\n {([\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n { key: 'maximized', label: 'Maximized' },\n ]).map(s => (\n <button key={s.key} onClick={() => savePref('default_window_size', s.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n (prefs.default_window_size || 'large') === s.key ? 'bg-blue-600 text-white border-blue-600' : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}>{s.label}</button>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* ── Desktop ── */}\n {!omitSet.has('desktop') && (\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={prefs.show_desktop_version ?? true} onChange={e => savePref('show_desktop_version', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Show version on desktop</span>\n <span className=\"text-xs text-gray-400 ml-1 font-mono\">{getVersion()}</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer mt-2\">\n <input type=\"checkbox\" checked={prefs.auto_fullscreen ?? false} onChange={e => savePref('auto_fullscreen', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Enter full screen mode automatically</span>\n <span className=\"text-xs text-gray-400 ml-1\">— on login</span>\n </label>\n <SoundSettings />\n </div>\n )}\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n\nfunction SoundSettings() {\n const [enabled, setEnabled] = useState(soundsEnabled());\n const [config, setConfig] = useState(getSoundConfig());\n\n const update = (soundType: SoundType, packKey: string) => {\n setSoundForType(soundType, packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, soundType);\n };\n\n const applyAll = (packKey: string) => {\n setAllSounds(packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, 'success');\n };\n\n return (\n <div className=\"mt-2 space-y-2\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={enabled} onChange={e => { localStorage.setItem('erp_sounds', String(e.target.checked)); setEnabled(e.target.checked); }}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\" />\n <span className=\"text-sm text-gray-700\">Sound effects</span>\n </label>\n {enabled && (\n <div className=\"ml-6\">\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <table className=\"w-full text-[11px]\">\n <thead>\n <tr className=\"bg-gray-50\">\n <th className=\"px-2 py-1.5 text-left font-medium text-gray-500 w-24\"></th>\n {SOUND_PACK_KEYS.map(key => (\n <th key={key} className=\"px-1 py-1.5 text-center\">\n <button onClick={() => applyAll(key)} className=\"font-medium text-gray-500 hover:text-blue-600 transition-colors\">\n {SOUND_PACKS[key].label}\n </button>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {SOUND_TYPES.map(soundType => (\n <tr key={soundType}>\n <td className=\"px-2 py-1.5 text-gray-700 font-medium\">{SOUND_TYPE_LABELS[soundType]}</td>\n {SOUND_PACK_KEYS.map(packKey => (\n <td key={packKey} className=\"px-1 py-1.5 text-center\">\n <button onClick={() => update(soundType, packKey)}\n className={`w-4 h-4 rounded-full border-2 transition-colors ${config[soundType] === packKey ? 'bg-blue-600 border-blue-600' : 'border-gray-300 hover:border-blue-400'}`} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n","import { useShellPrefs } from '../shell/ShellPrefs';\nimport { ModalActions } from '../shell/Modal';\n\nconst WINDOW_POSITIONS = [\n { key: 'center', label: 'Center' },\n { key: 'cascade', label: 'Cascade' },\n];\n\nconst DESKTOP_DBLCLICK = [\n { key: 'deactivate', label: 'Deactivate all' },\n { key: 'nothing', label: 'Do nothing' },\n];\n\nconst WINDOW_SIZES = [\n { key: 'small', label: 'Small' },\n { key: 'medium', label: 'Medium' },\n { key: 'large', label: 'Large' },\n { key: 'maximized', label: 'Maximized' },\n];\n\n/**\n * Standalone Behavior settings panel — window position, double-click,\n * default window size, plus the two desktop-related toggles\n * (Show version on desktop, Enter full screen mode automatically).\n *\n * Reads/writes shell prefs via `useShellPrefs()`. Suitable for use as a\n * section in `SystemPreferences` or rendered standalone.\n */\nexport default function BehaviorPanel() {\n const { prefs, save } = useShellPrefs();\n const savePref = (key: string, value: any) => save({ [key]: value });\n\n const windowPosition: string = prefs.window_position || 'cascade';\n const desktopDblclick: string = prefs.desktop_dblclick || 'deactivate';\n const defaultWindowSize: string = prefs.default_window_size || 'large';\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Behavior</h3>\n <div className=\"space-y-3\">\n <Row\n label=\"New window position\"\n options={WINDOW_POSITIONS}\n value={windowPosition}\n onChange={v => savePref('window_position', v)}\n />\n <Row\n label=\"Double-click desktop\"\n options={DESKTOP_DBLCLICK}\n value={desktopDblclick}\n onChange={v => savePref('desktop_dblclick', v)}\n />\n <Row\n label=\"Default window size\"\n options={WINDOW_SIZES}\n value={defaultWindowSize}\n onChange={v => savePref('default_window_size', v)}\n />\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900 mb-3\">Desktop</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={prefs.show_desktop_version ?? true}\n onChange={e => savePref('show_desktop_version', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Show version on desktop</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer mt-2\">\n <input\n type=\"checkbox\"\n checked={prefs.auto_fullscreen ?? false}\n onChange={e => savePref('auto_fullscreen', e.target.checked)}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Enter full screen mode automatically</span>\n <span className=\"text-xs text-gray-400 ml-1\">— on login</span>\n </label>\n </div>\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n\nfunction Row({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: { key: string; label: string }[];\n value: string;\n onChange: (v: string) => void;\n}) {\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-gray-700 w-40 shrink-0\">{label}</span>\n <div className=\"flex gap-2\">\n {options.map(o => (\n <button\n key={o.key}\n type=\"button\"\n onClick={() => onChange(o.key)}\n className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-colors ${\n value === o.key\n ? 'bg-blue-600 text-white border-blue-600'\n : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50'\n }`}\n >\n {o.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import { useState } from 'react';\nimport { ModalActions } from '../shell/Modal';\nimport {\n SOUND_PACKS,\n SOUND_PACK_KEYS,\n SOUND_TYPES,\n SOUND_TYPE_LABELS,\n getSoundConfig,\n setSoundForType,\n setAllSounds,\n soundsEnabled,\n previewSound,\n type SoundType,\n} from '../utils/sounds';\n\n/**\n * Standalone Sounds settings panel — sound effects toggle + per-event\n * sound-pack picker. Reads/writes the shell's `erp_sounds` and\n * `erp_sound_config` localStorage keys. Plays a preview when a pack is\n * picked. Suitable as a section in `SystemPreferences` or rendered\n * standalone.\n */\nexport default function SoundsPanel() {\n const [enabled, setEnabled] = useState(soundsEnabled());\n const [config, setConfig] = useState(getSoundConfig());\n\n const update = (soundType: SoundType, packKey: string) => {\n setSoundForType(soundType, packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, soundType);\n };\n\n const applyAll = (packKey: string) => {\n setAllSounds(packKey);\n setConfig(getSoundConfig());\n previewSound(packKey, 'success');\n };\n\n return (\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-semibold text-gray-900\">Sounds</h3>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={e => {\n localStorage.setItem('erp_sounds', String(e.target.checked));\n setEnabled(e.target.checked);\n }}\n className=\"h-4 w-4 rounded border-gray-300 text-blue-600\"\n />\n <span className=\"text-sm text-gray-700\">Sound effects</span>\n </label>\n\n {enabled && (\n <div className=\"border border-gray-200 rounded-lg overflow-hidden\">\n <table className=\"w-full text-[11px]\">\n <thead>\n <tr className=\"bg-gray-50\">\n <th className=\"px-2 py-1.5 text-left font-medium text-gray-500 w-24\"></th>\n {SOUND_PACK_KEYS.map(key => (\n <th key={key} className=\"px-1 py-1.5 text-center\">\n <button\n onClick={() => applyAll(key)}\n className=\"font-medium text-gray-500 hover:text-blue-600 transition-colors\"\n >\n {SOUND_PACKS[key].label}\n </button>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-100\">\n {SOUND_TYPES.map(soundType => (\n <tr key={soundType}>\n <td className=\"px-2 py-1.5 text-gray-700 font-medium\">{SOUND_TYPE_LABELS[soundType]}</td>\n {SOUND_PACK_KEYS.map(packKey => (\n <td key={packKey} className=\"px-1 py-1.5 text-center\">\n <button\n onClick={() => update(soundType, packKey)}\n aria-label={`${SOUND_TYPE_LABELS[soundType]} — ${SOUND_PACKS[packKey].label}`}\n aria-pressed={config[soundType] === packKey}\n className={`w-4 h-4 rounded-full border-2 transition-colors ${\n config[soundType] === packKey\n ? 'bg-blue-600 border-blue-600'\n : 'border-gray-300 hover:border-blue-400'\n }`}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n <ModalActions>\n <span className=\"text-xs text-gray-400\">Changes are saved automatically</span>\n </ModalActions>\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport SidebarLayout from '../shell/SidebarLayout';\n\n/** One section in the SystemPreferences sidebar. */\nexport interface SystemPreferencesSection {\n /** Unique key, e.g. `'notifications'`, `'customization'`. */\n key: string;\n /** Sidebar label, e.g. \"Notifications\". */\n label: string;\n /** Short description shown under the label in the sidebar. */\n description?: string;\n /** Sidebar icon (any ReactNode — typically a 4×4 svg). */\n icon?: ReactNode;\n /** Body renderer. Receives no args; access shell prefs via your own hook. */\n render: () => ReactNode;\n}\n\nexport interface SystemPreferencesProps {\n /** Ordered sections — left sidebar lists these top-to-bottom, the matching\n * body renders on the right. The first section is selected by default\n * unless `defaultSelected` is supplied. */\n sections: readonly SystemPreferencesSection[];\n /** Key of the section to highlight on first render. Falls back to the first\n * section in `sections`. */\n defaultSelected?: string;\n /** Optional className applied to the outer flex container. */\n className?: string;\n}\n\n/**\n * Two-pane settings window: a fixed sidebar of sections on the left, the\n * active section's body on the right. Consumers compose by passing\n * `sections` — each entry has a `key`, `label`, optional `icon` and\n * `description`, and a `render()` callback that returns the body JSX.\n *\n * The shell exposes ready-made panels (`Customization`, `BehaviorPanel`,\n * `SoundsPanel`) that can be used as section bodies directly; portals\n * add their own sections (notification subscriptions, delivery defaults,\n * personal formatting prefs, etc.) alongside.\n *\n * Example:\n * ```tsx\n * <SystemPreferences sections={[\n * { key: 'notifications', label: 'Notifications', icon: <BellIcon />, render: () => <MyNotifications /> },\n * { key: 'customization', label: 'Customization', icon: <PaintBrushIcon />, render: () => <Customization omit={['behavior','desktop']} /> },\n * { key: 'behavior', label: 'Behavior', icon: <Cog6ToothIcon />, render: () => <BehaviorPanel /> },\n * { key: 'sounds', label: 'Sounds', icon: <SpeakerWaveIcon />, render: () => <SoundsPanel /> },\n * ]} />\n * ```\n */\nexport default function SystemPreferences({\n sections,\n defaultSelected,\n className,\n}: SystemPreferencesProps) {\n const initial = defaultSelected && sections.some(s => s.key === defaultSelected)\n ? defaultSelected\n : sections[0]?.key ?? '';\n const [selected, setSelected] = useState<string>(initial);\n const active = sections.find(s => s.key === selected) ?? sections[0];\n\n return (\n <SidebarLayout\n storageKey=\"shell.systemPreferences.sidebarWidth\"\n defaultWidth={240}\n minWidth={200}\n maxWidth={360}\n className={className}\n sidebarClassName=\"border-r border-gray-200 bg-gray-50\"\n sidebar={\n <nav className=\"py-1.5\">\n {sections.map(item => {\n const isActive = item.key === selected;\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => setSelected(item.key)}\n className={`w-full text-left px-3 py-2.5 text-sm transition-colors flex items-start gap-2.5 ${\n isActive ? 'bg-blue-50 text-blue-700' : 'hover:bg-gray-100 text-gray-700'\n }`}\n >\n {item.icon && (\n <span className={`mt-0.5 ${isActive ? 'text-blue-600' : 'text-gray-400'}`}>\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={`block ${\n isActive ? 'font-semibold text-blue-700' : 'font-medium text-gray-800'\n }`}\n >\n {item.label}\n </span>\n {item.description && (\n <span className=\"block text-[11px] text-gray-500 mt-0.5\">\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </nav>\n }\n >\n <main className=\"flex-1 min-w-0 overflow-auto p-4\">\n {active?.render()}\n </main>\n </SidebarLayout>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useModalActive } from '../shell/Modal';\n\n/**\n * Keyboard + shift-click navigation for table rows.\n *\n * - J/K or Arrow keys to move focus\n * - Enter to open the focused row (calls `onSelect`)\n * - Space to toggle the focused row's checkbox (calls `onToggle`)\n * - Shift+J/K to extend selection while moving\n * - Shift+click to range-select (calls `onSelectRange`)\n * - Cmd/Ctrl+A to select/deselect all (calls `onSelectAll`)\n *\n * Each list instance gates its document-level listeners on `useModalActive`\n * so two open lists don't both react to the same shift-click.\n */\nexport default function useTableNav<T>(\n items: T[],\n onSelect: (item: T) => void,\n onToggle?: (item: T) => void,\n onSelectAll?: () => void,\n onSelectRange?: (from: number, to: number) => void,\n) {\n const [focusIdx, setFocusIdx] = useState(-1);\n const itemsRef = useRef(items);\n const onSelectRef = useRef(onSelect);\n const onToggleRef = useRef(onToggle);\n const onSelectAllRef = useRef(onSelectAll);\n const onSelectRangeRef = useRef(onSelectRange);\n const focusRef = useRef(focusIdx);\n const lastToggledRef = useRef(-1);\n const isActive = useModalActive();\n const isActiveRef = useRef(isActive);\n itemsRef.current = items;\n onSelectRef.current = onSelect;\n onToggleRef.current = onToggle;\n onSelectAllRef.current = onSelectAll;\n onSelectRangeRef.current = onSelectRange;\n focusRef.current = focusIdx;\n isActiveRef.current = isActive;\n\n const prevLen = useRef(items.length);\n useEffect(() => {\n if (items.length !== prevLen.current) {\n setFocusIdx(-1);\n lastToggledRef.current = -1;\n prevLen.current = items.length;\n }\n }, [items.length]);\n\n // Track normal checkbox clicks to set the anchor for Shift+click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (!isActiveRef.current) return;\n if (e.shiftKey) return;\n const target = e.target as HTMLElement;\n const row = target?.closest?.('[data-row-idx]');\n if (!row) return;\n if (target.tagName !== 'INPUT' || (target as HTMLInputElement).type !== 'checkbox') return;\n const idx = parseInt(row.getAttribute('data-row-idx')!, 10);\n if (!isNaN(idx)) {\n lastToggledRef.current = idx;\n setFocusIdx(idx);\n }\n };\n document.addEventListener('click', handler);\n return () => document.removeEventListener('click', handler);\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (!isActiveRef.current) return;\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n if ((e.target as HTMLElement)?.isContentEditable) return;\n\n if ((e.metaKey || e.ctrlKey) && e.key === 'a') {\n e.preventDefault();\n onSelectAllRef.current?.();\n return;\n }\n\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n\n const len = itemsRef.current.length;\n if (len === 0) return;\n\n const isDown = e.code === 'KeyJ' || e.key === 'j' || e.key === 'J' || e.key === 'ArrowDown';\n const isUp = e.code === 'KeyK' || e.key === 'k' || e.key === 'K' || e.key === 'ArrowUp';\n\n if (isDown || isUp) {\n e.preventDefault();\n const prev = focusRef.current;\n const next = isDown\n ? Math.min(prev + 1, len - 1)\n : Math.max(prev - 1, 0);\n if (next !== prev) {\n setFocusIdx(next);\n scrollRowIntoView(next);\n if (e.shiftKey && onToggleRef.current) {\n onToggleRef.current(itemsRef.current[next]);\n lastToggledRef.current = next;\n }\n }\n } else if (e.key === 'Enter' && focusRef.current >= 0 && focusRef.current < len) {\n e.preventDefault();\n onSelectRef.current(itemsRef.current[focusRef.current]);\n } else if (e.key === ' ' && focusRef.current >= 0 && focusRef.current < len) {\n e.preventDefault();\n if (e.shiftKey && lastToggledRef.current >= 0 && onSelectRangeRef.current) {\n const from = Math.min(lastToggledRef.current, focusRef.current);\n const to = Math.max(lastToggledRef.current, focusRef.current);\n onSelectRangeRef.current(from, to);\n } else {\n onToggleRef.current?.(itemsRef.current[focusRef.current]);\n }\n lastToggledRef.current = focusRef.current;\n }\n };\n\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, []);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (!isActiveRef.current) return;\n if (!e.shiftKey) return;\n const target = e.target as HTMLElement;\n const row = target?.closest?.('[data-row-idx]');\n if (!row) return;\n const clickedIdx = parseInt(row.getAttribute('data-row-idx')!, 10);\n if (isNaN(clickedIdx)) return;\n\n const anchor = lastToggledRef.current;\n if (anchor < 0) {\n onToggleRef.current?.(itemsRef.current[clickedIdx]);\n lastToggledRef.current = clickedIdx;\n setFocusIdx(clickedIdx);\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n const from = Math.min(anchor, clickedIdx);\n const to = Math.max(anchor, clickedIdx);\n if (onSelectRangeRef.current) {\n onSelectRangeRef.current(from, to);\n } else if (onToggleRef.current) {\n for (let i = from; i <= to; i++) {\n onToggleRef.current(itemsRef.current[i]);\n }\n }\n lastToggledRef.current = clickedIdx;\n setFocusIdx(clickedIdx);\n };\n\n document.addEventListener('click', handler, true);\n return () => document.removeEventListener('click', handler, true);\n }, []);\n\n return focusIdx;\n}\n\nfunction scrollRowIntoView(idx: number) {\n requestAnimationFrame(() => {\n const row = document.querySelector(`[data-row-idx=\"${idx}\"]`);\n row?.scrollIntoView({ block: 'nearest' });\n });\n}\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport apiClient from '../api/client';\nimport type { ColumnDef } from './types';\n\ninterface ColumnState {\n key: string;\n width: number;\n hidden?: boolean;\n}\n\n/** Ensure _select column (if present) is always at index 0 and never hidden */\nfunction pinSelectColumn(cols: ColumnState[]): ColumnState[] {\n const selectIdx = cols.findIndex(c => c.key === '_select');\n if (selectIdx >= 0) {\n const [sel] = cols.splice(selectIdx, 1);\n sel.hidden = false;\n cols.unshift(sel);\n }\n return cols;\n}\n\n/**\n * Resizable + reorderable + hideable column state for `<ResizableTable>`.\n *\n * Persists per-user via `PATCH /auth/me/` (`preferences.columns_{tableId}`)\n * with a 1-second debounce, and per-viewport admin defaults via\n * `GET /auth/default-columns/{tableId}?viewport=…`. The consumer wires these\n * endpoints on its backend; the shell's `apiClient` proxy resolves to the\n * consumer-registered axios instance (`setShellApiClient`).\n */\nexport function useColumnConfig(tableId: string, defaultColumns: ColumnDef[]) {\n const [columns, setColumns] = useState<ColumnState[]>(() => {\n const cached = localStorage.getItem(`col-config-${tableId}`);\n if (cached) {\n try {\n const parsed = JSON.parse(cached) as ColumnState[];\n const existing = new Set(parsed.map(c => c.key));\n const merged = pinSelectColumn([\n ...parsed.filter(c => defaultColumns.some(d => d.key === c.key)),\n ...defaultColumns.filter(d => !existing.has(d.key)).map(d => ({ key: d.key, width: d.defaultWidth || 150 })),\n ]);\n return merged;\n } catch { /* fall through */ }\n }\n return pinSelectColumn(defaultColumns.map(d => ({ key: d.key, width: d.defaultWidth || 150, hidden: d.defaultHidden })));\n });\n\n const [draggedIdx, setDraggedIdx] = useState<number | null>(null);\n const [dropGap, setDropGap] = useState<number | null>(null);\n const resizingRef = useRef<{ idx: number; startX: number; startWidth: number } | null>(null);\n\n const saveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const saveMut = useMutation({\n mutationFn: (cols: ColumnState[]) =>\n apiClient.patch('/auth/me/', {\n preferences: { [`columns_${tableId}`]: cols },\n }),\n });\n\n const persistColumns = useCallback((cols: ColumnState[]) => {\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(cols));\n if (saveTimer.current) clearTimeout(saveTimer.current);\n saveTimer.current = setTimeout(() => saveMut.mutate(cols), 1000);\n }, [tableId, saveMut]);\n\n useEffect(() => {\n // Pick the viewport once at mount, using the same query as `useIsMobile`\n // so the column-defaults split lines up with the rest of the UI's mobile\n // affordances. Refresh covers users who resize past the breakpoint\n // mid-session.\n const viewport: 'desktop' | 'mobile' =\n typeof window !== 'undefined' &&\n window.matchMedia('(max-width: 767px), (pointer: coarse)').matches\n ? 'mobile' : 'desktop';\n\n Promise.all([\n apiClient.get('/auth/me/').catch(() => null),\n apiClient.get(`/auth/default-columns/${tableId}/`, { params: { viewport } }).catch(() => null),\n ]).then(([userRes, defaultRes]) => {\n const prefs = userRes?.data?.preferences;\n const userSaved = prefs?.[`columns_${tableId}`];\n\n if (userSaved && Array.isArray(userSaved)) {\n const existing = new Set(userSaved.map((c: any) => c.key));\n const merged = pinSelectColumn([\n ...userSaved.filter((c: any) => defaultColumns.some(d => d.key === c.key)),\n ...defaultColumns.filter(d => !existing.has(d.key)).map(d => ({ key: d.key, width: d.defaultWidth || 150, hidden: d.defaultHidden })),\n ]);\n setColumns(merged);\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(merged));\n } else if (Array.isArray(defaultRes?.data?.visible_columns) && defaultRes.data.visible_columns.length > 0) {\n // Non-empty system defaults — apply them. (An empty array is treated\n // as \"no admin opinion\" and we leave the initial useState value alone,\n // which uses the per-column `defaultHidden` flag from each ColumnDef.)\n const visibleSet = new Set(defaultRes.data.visible_columns as string[]);\n const systemCols = pinSelectColumn(defaultColumns.map(d => ({\n key: d.key,\n width: d.defaultWidth || 150,\n hidden: !visibleSet.has(d.key),\n })));\n setColumns(systemCols);\n localStorage.setItem(`col-config-${tableId}`, JSON.stringify(systemCols));\n }\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tableId]);\n\n const visibleColumns = columns.filter(c => !c.hidden);\n\n const onResizeStart = useCallback((idx: number, e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const visCol = visibleColumns[idx];\n const realIdx = columns.findIndex(c => c.key === visCol.key);\n resizingRef.current = { idx: realIdx, startX: e.clientX, startWidth: columns[realIdx].width };\n\n const onMouseMove = (ev: MouseEvent) => {\n if (!resizingRef.current) return;\n const { idx: i, startX, startWidth } = resizingRef.current;\n const minW = defaultColumns.find(d => d.key === columns[i].key)?.minWidth || 30;\n const newWidth = Math.max(minW, startWidth + ev.clientX - startX);\n setColumns(prev => {\n const updated = [...prev];\n updated[i] = { ...updated[i], width: newWidth };\n return updated;\n });\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n resizingRef.current = null;\n setColumns(prev => { persistColumns(prev); return prev; });\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }, [columns, visibleColumns, defaultColumns, persistColumns]);\n\n const onDragStart = useCallback((idx: number) => {\n setDraggedIdx(idx);\n }, []);\n\n const onDragOver = useCallback((visIdx: number, e: React.DragEvent) => {\n e.preventDefault();\n if (draggedIdx === null) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n let gap = e.clientX < rect.left + rect.width / 2 ? visIdx : visIdx + 1;\n const vis = columns.filter(c => !c.hidden);\n if (vis[0]?.key === '_select' && gap === 0) gap = 1;\n setDropGap(gap);\n }, [draggedIdx, columns]);\n\n const onDrop = useCallback((_visIdx: number, e: React.DragEvent) => {\n e.preventDefault();\n if (draggedIdx === null || dropGap === null) {\n setDraggedIdx(null);\n setDropGap(null);\n return;\n }\n if (dropGap === draggedIdx || dropGap === draggedIdx + 1) {\n setDraggedIdx(null);\n setDropGap(null);\n return;\n }\n setColumns(prev => {\n const visible = prev.filter(c => !c.hidden);\n const moved = visible[draggedIdx];\n if (!moved) return prev;\n const fromReal = prev.findIndex(c => c.key === moved.key);\n let toReal: number;\n if (dropGap < visible.length) {\n toReal = prev.findIndex(c => c.key === visible[dropGap].key);\n } else {\n toReal = prev.findIndex(c => c.key === visible[visible.length - 1].key) + 1;\n }\n const updated = [...prev];\n const [item] = updated.splice(fromReal, 1);\n updated.splice(toReal > fromReal ? toReal - 1 : toReal, 0, item);\n persistColumns(updated);\n return updated;\n });\n setDraggedIdx(null);\n setDropGap(null);\n }, [draggedIdx, dropGap, persistColumns]);\n\n const onDragEnd = useCallback(() => {\n setDraggedIdx(null);\n setDropGap(null);\n }, []);\n\n const toggleColumn = useCallback((key: string) => {\n setColumns(prev => {\n const updated = prev.map(c => c.key === key ? { ...c, hidden: !c.hidden } : c);\n if (updated.filter(c => !c.hidden).length === 0) return prev;\n persistColumns(updated);\n return updated;\n });\n }, [persistColumns]);\n\n const resetColumns = useCallback(() => {\n const defaults = defaultColumns.map(d => ({ key: d.key, width: d.defaultWidth || 150 }));\n setColumns(defaults);\n persistColumns(defaults);\n }, [defaultColumns, persistColumns]);\n\n const orderedColumns = visibleColumns.map(c => {\n const def = defaultColumns.find(d => d.key === c.key);\n return { ...def!, width: c.width };\n }).filter(Boolean);\n\n const allColumns = columns.map(c => {\n const def = defaultColumns.find(d => d.key === c.key);\n return { key: c.key, label: def?.label || c.key, hidden: !!c.hidden };\n });\n\n return {\n orderedColumns,\n allColumns,\n onResizeStart,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n toggleColumn,\n resetColumns,\n draggedIdx,\n dropGap,\n };\n}\n","import { useState, useRef, useCallback, useMemo } from 'react';\nimport { useColumnConfig } from './useColumnConfig';\nimport { useIsMobile } from '../shell/useIsMobile';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\nimport apiClient from '../api/client';\nimport useClickOutside from '../hooks/useClickOutside';\nimport { useShellAuth } from '../shell/ShellAuth';\nimport type { ColumnDef, SortState } from './types';\n\ninterface ResizableTableProps {\n tableId: string;\n columns: ColumnDef[];\n sort?: SortState;\n onSort?: (field: string) => void;\n footer?: React.ReactNode;\n afterBody?: React.ReactNode;\n /** Permission codename(s) that gate the \"Save as default for all users\" link\n * in the column picker. The shell's `useShellAuth().hasAnyPerm` is queried\n * against this list. Defaults to a single placeholder permission; consumers\n * with no admin gate can pass `[]` to hide the link entirely. */\n saveDefaultPerms?: string[];\n children: (orderedColumns: (ColumnDef & { width: number })[]) => React.ReactNode;\n}\n\n/**\n * Sticky-header, scrollable-body table primitive with:\n * - drag-to-reorder columns (with a blue drop-indicator line)\n * - resize columns by the right-edge handle\n * - hide/show columns via a glass popover picker\n * - admin-only \"Save as default for all users\" link in the picker\n * - per-user persistence (via the shell-registered apiClient)\n * - mobile-aware selection mode toggle\n */\nexport default function ResizableTable({\n tableId,\n columns,\n sort,\n onSort,\n footer,\n afterBody,\n saveDefaultPerms = ['change_numberingconfig'],\n children,\n}: ResizableTableProps) {\n const isMobile = useIsMobile();\n const [selectionMode, setSelectionMode] = useState(false);\n // Strip the `_select` column on mobile (unless selection mode is on) so it\n // doesn't take up scarce screen real estate.\n const effectiveColumns = useMemo(\n () => (isMobile && !selectionMode ? columns.filter(c => c.key !== '_select') : columns),\n [columns, isMobile, selectionMode],\n );\n const {\n orderedColumns,\n allColumns,\n onResizeStart,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n toggleColumn,\n resetColumns,\n draggedIdx,\n dropGap,\n } = useColumnConfig(tableId, effectiveColumns);\n const { hasAnyPerm } = useShellAuth();\n const [pickerOpen, setPickerOpen] = useState(false);\n const [savingDefault, setSavingDefault] = useState(false);\n const [savedDefault, setSavedDefault] = useState(false);\n const pickerRef = useRef<HTMLDivElement>(null);\n const isAdmin = saveDefaultPerms.length > 0 && hasAnyPerm(saveDefaultPerms);\n\n useClickOutside(pickerRef, useCallback(() => { if (pickerOpen) setPickerOpen(false); }, [pickerOpen]));\n\n const totalWidth = orderedColumns.reduce((sum, col) => sum + col.width, 0);\n const colWidths = orderedColumns.map(col => `${(col.width / totalWidth) * 100}%`);\n\n const saveAsDefault = async () => {\n setSavingDefault(true);\n const visibleKeys = allColumns.filter(c => !c.hidden).map(c => c.key);\n const viewport = isMobile ? 'mobile' : 'desktop';\n try {\n await apiClient\n .patch(`/auth/default-columns/${tableId}/`, { visible_columns: visibleKeys }, { params: { viewport } })\n .catch(() =>\n apiClient.post('/auth/default-columns/', { table_id: tableId, viewport, visible_columns: visibleKeys }),\n );\n setSavedDefault(true);\n setTimeout(() => setSavedDefault(false), 2000);\n } catch { /* ignore */ }\n setSavingDefault(false);\n };\n\n const supportsSelection = useMemo(() => columns.some(c => c.key === '_select'), [columns]);\n\n return (\n <div className={`flex flex-col flex-1 min-h-0 ${isMobile ? '-mx-4' : ''}`}>\n {/* Fixed header */}\n <table className=\"w-full divide-y divide-gray-200 shrink-0\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n {orderedColumns.map((col, i) => (\n <col key={col.key} style={{ width: colWidths[i] }} />\n ))}\n </colgroup>\n <thead className=\"bg-gray-50\">\n <tr>\n {orderedColumns.map((col, idx) => {\n const colDef = columns.find(c => c.key === col.key);\n const sortField = colDef?.sortField ?? (col.key !== '_select' ? col.key : undefined);\n const isSorted = sort && sortField && sort.field === sortField;\n const isFixed = col.key === '_select';\n return (\n <th\n key={col.key}\n className={`px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase select-none relative ${draggedIdx === idx ? 'bg-blue-50' : ''}`}\n draggable={!isFixed}\n onDragStart={isFixed ? undefined : () => onDragStart(idx)}\n onDragOver={isFixed ? undefined : (e) => onDragOver(idx, e)}\n onDrop={isFixed ? undefined : (e) => onDrop(idx, e)}\n onDragEnd={isFixed ? undefined : onDragEnd}\n style={isFixed ? undefined : { cursor: 'grab' }}\n >\n <span\n className={`${isFixed ? '' : 'truncate pr-3'} block ${sortField && onSort ? 'cursor-pointer hover:text-gray-700' : ''}`}\n onClick={sortField && onSort ? (e) => { e.stopPropagation(); onSort(sortField); } : undefined}\n >\n {col.headerNode ?? col.label}\n {isSorted && <span className=\"ml-1\">{sort!.direction === 'asc' ? '▲' : '▼'}</span>}\n </span>\n {!isFixed && (\n <div\n className=\"absolute right-0 top-0 bottom-0 w-4 cursor-col-resize flex items-center justify-center z-10\"\n onMouseDown={(e) => onResizeStart(idx, e)}\n style={{ marginRight: -8 }}\n >\n <div className=\"w-0.5 h-full bg-gray-200 hover:bg-blue-500 transition-colors\" />\n </div>\n )}\n {dropGap === idx && (\n <div className=\"absolute left-0 top-0 bottom-0 w-0.5 bg-blue-500 z-20 pointer-events-none\" />\n )}\n {idx === orderedColumns.length - 1 && dropGap === orderedColumns.length && (\n <div className=\"absolute right-0 top-0 bottom-0 w-0.5 bg-blue-500 z-20 pointer-events-none\" />\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n </table>\n\n {/* Scrollable body */}\n <div className=\"flex-1 overflow-y-auto overflow-x-auto min-h-0\">\n <table className=\"w-full divide-y divide-gray-200\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n {orderedColumns.map((col, i) => (\n <col key={col.key} style={{ width: colWidths[i] }} />\n ))}\n </colgroup>\n {children(orderedColumns as any)}\n </table>\n {afterBody}\n </div>\n\n {/* Footer */}\n {footer !== undefined && (\n <div className=\"border-t border-gray-200 px-4 py-2 text-sm text-gray-500 shrink-0 flex items-center justify-between\">\n <span>{footer}</span>\n <div className=\"flex items-center gap-3 relative\" ref={pickerRef}>\n {isMobile && supportsSelection && (\n <button\n onClick={() => setSelectionMode(s => !s)}\n className={`text-[11px] px-2 py-0.5 rounded ${selectionMode ? 'bg-blue-600 text-white' : 'text-gray-500 hover:text-gray-700 border border-gray-300'}`}\n title={selectionMode ? 'Hide selection column' : 'Show selection column'}\n >\n {selectionMode ? 'Done' : 'Select'}\n </button>\n )}\n <button onClick={resetColumns} className=\"text-[10px] text-gray-400 hover:text-gray-600\">Reset</button>\n <button onClick={() => setPickerOpen(!pickerOpen)} className=\"text-gray-400 hover:text-gray-600\" title=\"Choose columns\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" />\n </svg>\n </button>\n {pickerOpen && (\n <div className=\"absolute bottom-full right-0 mb-1 w-52 rounded-2xl z-50 py-1 max-h-80 overflow-y-auto\" style={getGlassStyle()}>\n <p className=\"px-3 py-1.5 text-[10px] font-semibold text-gray-400 uppercase\">Columns</p>\n {allColumns.filter(col => col.key !== '_select').map(col => (\n <label key={col.key} className=\"flex items-center gap-2 px-3 py-1 text-sm text-gray-700 hover:bg-gray-50 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={!col.hidden}\n onChange={() => toggleColumn(col.key)}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n {col.label}\n </label>\n ))}\n {isAdmin && (\n <div className=\"border-t border-gray-100 mt-1 pt-1 px-3 pb-1\">\n <button onClick={saveAsDefault} disabled={savingDefault}\n className={`text-[10px] w-full text-center py-1 rounded ${savedDefault ? 'text-green-600' : 'text-gray-500 hover:text-blue-600'}`}>\n {savingDefault ? '...' : savedDefault ? 'Saved as default' : 'Save as default for all users'}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\ninterface ListFooterProps {\n selectedCount: number;\n loadedCount: number;\n totalCount?: number;\n label: string;\n isFetchingMore?: boolean;\n extra?: ReactNode;\n}\n\n/**\n * Standardized footer for `EntityList`. Shows:\n * \"[X selected — ] Y records\"\n * \"Y of Z records · Loading more...\"\n * \"All N records loaded\"\n */\nexport default function ListFooter({\n selectedCount,\n loadedCount,\n totalCount,\n label,\n isFetchingMore,\n extra,\n}: ListFooterProps) {\n const total = totalCount ?? loadedCount;\n const allLoaded = loadedCount >= total;\n\n return (\n <>\n {extra}\n {selectedCount > 0 ? `${selectedCount} selected — ` : ''}\n {allLoaded\n ? (totalCount != null ? `All ${total.toLocaleString()} ${label} loaded` : `${total.toLocaleString()} ${label}`)\n : `${loadedCount.toLocaleString()} of ${total.toLocaleString()} ${label}`\n }\n {isFetchingMore ? ' · Loading more...' : ''}\n </>\n );\n}\n","import type { ReactNode, RefObject, Dispatch, SetStateAction } from 'react';\nimport useTableNav from './useTableNav';\nimport ResizableTable from './ResizableTable';\nimport LoadingSpinner from '../shell/LoadingSpinner';\nimport ListFooter from './ListFooter';\n\nexport interface EntityListColumn {\n key: string;\n label: string;\n defaultWidth?: number;\n minWidth?: number;\n defaultHidden?: boolean;\n sortField?: string;\n headerNode?: ReactNode;\n}\n\nexport interface EntityListProps<T> {\n items: T[];\n isLoading: boolean;\n emptyState: ReactNode;\n totalCount?: number;\n\n tableId: string;\n columns: EntityListColumn[];\n renderCell: (item: T, colKey: string) => ReactNode;\n getRowId?: (item: T) => string | number;\n\n sort?: { field: string; direction: 'asc' | 'desc' };\n onSort?: (field: string) => void;\n\n selected: Set<string | number>;\n setSelected: Dispatch<SetStateAction<Set<string | number>>>;\n\n onRowClick: (item: T) => void;\n onRowHover?: (item: T) => void;\n getRowClassName?: (item: T) => string;\n\n footerLabel: string;\n footerExtra?: ReactNode;\n\n // Loose ref type so consumers on React 18 (RefObject<HTMLDivElement>) and\n // React 19 (RefObject<HTMLDivElement | null>) both type-check cleanly.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sentinelRef?: RefObject<any>;\n isFetchingNextPage?: boolean;\n\n /** Perm codenames that gate \"Save as default for all users\" in the column\n * picker. Defaults to `['change_numberingconfig']` (admin-portal's proxy\n * for admin access). Pass `[]` to hide the link entirely. */\n saveDefaultPerms?: string[];\n}\n\n/**\n * The canonical pageless data grid for both portals. Wraps `<ResizableTable>`\n * with selection-checkbox logic, keyboard navigation, the standardized list\n * footer, and an infinite-scroll sentinel hook-up.\n *\n * Usage:\n *\n * const { sort, onSort } = useSort('mid');\n * const { items, totalCount, isLoading, isFetchingNextPage, sentinelRef } =\n * useInfiniteScroll<Supplier>({ queryKey: ['suppliers', filters],\n * fetchFn: (p) => getSuppliers(p) });\n *\n * <EntityList\n * items={items}\n * totalCount={totalCount}\n * isLoading={isLoading}\n * sentinelRef={sentinelRef}\n * isFetchingNextPage={isFetchingNextPage}\n * tableId=\"suppliers\"\n * columns={SUPPLIER_COLUMNS}\n * renderCell={(s, k) => …}\n * sort={sort} onSort={onSort}\n * selected={selected} setSelected={setSelected}\n * onRowClick={(s) => openEntity('supplier', s.id, s, s.mid, '/suppliers')}\n * footerLabel=\"suppliers\"\n * emptyState={<EmptyState message=\"No suppliers yet.\" />}\n * />\n */\nexport default function EntityList<T>(props: EntityListProps<T>) {\n const {\n items, isLoading, emptyState, totalCount,\n tableId, columns, renderCell, getRowId = (item: any) => item.id,\n sort, onSort,\n selected, setSelected,\n onRowClick, onRowHover, getRowClassName,\n footerLabel, footerExtra,\n sentinelRef, isFetchingNextPage,\n saveDefaultPerms,\n } = props;\n\n const toggleItem = (item: T) => {\n setSelected(prev => {\n const next = new Set(prev);\n const id = getRowId(item);\n if (next.has(id)) next.delete(id); else next.add(id);\n return next;\n });\n };\n\n const toggleAll = () => {\n setSelected(prev => prev.size === items.length ? new Set() : new Set(items.map(getRowId)));\n };\n\n const selectRange = (from: number, to: number) => {\n setSelected(prev => {\n const next = new Set(prev);\n for (let i = from; i <= to; i++) next.add(getRowId(items[i]));\n return next;\n });\n };\n\n const focusIdx = useTableNav(items, onRowClick, toggleItem, toggleAll, selectRange);\n\n if (isLoading) return <LoadingSpinner />;\n if (items.length === 0) return <>{emptyState}</>;\n\n const allSelected = items.length > 0 && selected.size === items.length;\n\n const fullColumns: EntityListColumn[] = [\n {\n key: '_select',\n label: '',\n defaultWidth: 52,\n minWidth: 52,\n headerNode: (\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={toggleAll}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n ),\n },\n ...columns,\n ];\n\n const footer = (\n <ListFooter\n selectedCount={selected.size}\n loadedCount={items.length}\n totalCount={totalCount}\n label={footerLabel}\n isFetchingMore={isFetchingNextPage}\n extra={footerExtra}\n />\n );\n\n const afterBody = sentinelRef ? (\n <>\n <div ref={sentinelRef} />\n {isFetchingNextPage && (\n <div className=\"text-center py-3\"><span className=\"text-sm text-gray-500\">Loading more...</span></div>\n )}\n </>\n ) : undefined;\n\n return (\n <div className=\"flex-1 flex flex-col mb-1 bg-white rounded-lg shadow overflow-hidden\">\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ResizableTable\n tableId={tableId}\n columns={fullColumns}\n sort={sort}\n onSort={onSort}\n footer={footer}\n afterBody={afterBody}\n saveDefaultPerms={saveDefaultPerms}\n >\n {(cols) => (\n <tbody className=\"divide-y divide-gray-100\">\n {items.map((item, rowIdx) => {\n const id = getRowId(item);\n return (\n <tr\n key={id}\n data-row-idx={rowIdx}\n className={`cursor-pointer ${focusIdx === rowIdx ? 'bg-blue-50 ring-1 ring-inset ring-blue-300' : selected.has(id) ? 'bg-blue-50 hover:bg-blue-100' : 'hover:bg-gray-50'} ${getRowClassName?.(item) ?? ''}`}\n onClick={() => onRowClick(item)}\n onMouseEnter={onRowHover ? () => onRowHover(item) : undefined}\n >\n {cols.map(col => (\n <td key={col.key} className=\"px-4 py-3 whitespace-nowrap text-sm overflow-hidden\">\n {col.key === '_select' ? (\n <input\n type=\"checkbox\"\n checked={selected.has(id)}\n onClick={e => { e.stopPropagation(); toggleItem(item); }}\n readOnly\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-blue-600\"\n />\n ) : renderCell(item, col.key)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n )}\n </ResizableTable>\n </div>\n </div>\n );\n}\n","import { Fragment, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\n\n/**\n * Generic, drag-and-drop Kanban board. Self-contained (native HTML5 DnD, no\n * library) and styled with the same Tailwind utilities + `grid-scroll` class the\n * shell already ships, so consumers get it for free.\n *\n * Group items into columns with `columnOf`, render each card with `renderCard`.\n * Cards can be dragged **between** columns (to change which column they belong\n * to) and **within** a column (to reorder / prioritise). On drop, `onMove(id,\n * toColumn, toIndex)` fires — `toIndex` is the target position within `toColumn`\n * measured against that column's cards *excluding* the dragged one, so the\n * consumer can persist an order (e.g. midpoint between neighbours) that every\n * user then sees. Sort each column by that order via `sortInColumn`.\n *\n * Affordance: a blue **drop-line** shows exactly where the card will land\n * (between two cards, in either the source or a different column), and the\n * target column highlights. The dragged card dims. The insertion point tracks\n * `dragenter` (once per card crossed) so the line stays stable rather than\n * flickering.\n */\nexport interface KanbanColumn {\n /** Stable column key — what `columnOf` returns and `onMove` receives. */\n value: string;\n label: string;\n /** Tailwind text + bg classes for the column header. */\n accent?: string;\n /** Tailwind bg class for the header dot. */\n dot?: string;\n}\n\nexport interface KanbanProps<T> {\n items: T[];\n columns: KanbanColumn[];\n columnOf: (item: T) => string;\n getId: (item: T) => string;\n /**\n * Fired on drop. `toColumn` is the destination column's `value`; `toIndex` is\n * the target position within that column measured against its cards\n * **excluding** the dragged card (0 = top). A same-column drop that wouldn't\n * change the order is not reported.\n */\n onMove: (id: string, toColumn: string, toIndex: number) => void;\n /** Inner card content — the card chrome (border, padding, hover) is provided. */\n renderCard: (item: T) => ReactNode;\n onCardClick?: (item: T) => void;\n /** Comparator for ordering within a column — sort by the persisted order field. */\n sortInColumn?: (a: T, b: T) => number;\n isLoading?: boolean;\n loadingText?: string;\n /** Shown when there are no items at all. */\n emptyState?: ReactNode;\n /** Placeholder text inside an empty column. */\n columnEmptyText?: string;\n}\n\ninterface OverState {\n col: string;\n index: number;\n}\n\nexport default function Kanban<T>({\n items,\n columns,\n columnOf,\n getId,\n onMove,\n renderCard,\n onCardClick,\n sortInColumn,\n isLoading = false,\n loadingText = 'Loading…',\n emptyState,\n columnEmptyText = 'Drop here',\n}: KanbanProps<T>) {\n const [dragId, setDragId] = useState<string | null>(null);\n const [over, setOver] = useState<OverState | null>(null);\n\n const grouped = useMemo(() => {\n const map: Record<string, T[]> = {};\n for (const c of columns) map[c.value] = [];\n for (const it of items) (map[columnOf(it)] ??= []).push(it);\n if (sortInColumn) for (const k of Object.keys(map)) map[k].sort(sortInColumn);\n return map;\n }, [items, columns, columnOf, sortInColumn]);\n\n const reset = () => {\n setDragId(null);\n setOver(null);\n };\n\n const commitMove = (col: string) => {\n if (dragId && over && over.col === col) {\n const colItems = grouped[col] ?? [];\n const dp = colItems.findIndex(it => getId(it) === dragId); // dragged's pos in this column, or -1\n const sameCol = dp !== -1;\n // Dropping right above or below itself changes nothing.\n const noop = sameCol && (over.index === dp || over.index === dp + 1);\n if (!noop) {\n // `over.index` counts the dragged card while it's still shown; remove it\n // from the count when the drop lands below its current slot.\n const toIndex = sameCol && over.index > dp ? over.index - 1 : over.index;\n onMove(dragId, col, toIndex);\n }\n }\n reset();\n };\n\n if (isLoading) return <div className=\"text-sm text-gray-500 p-4\">{loadingText}</div>;\n if (items.length === 0) {\n return <>{emptyState ?? <div className=\"text-sm text-gray-500 p-4\">No items.</div>}</>;\n }\n\n return (\n <div className=\"flex-1 overflow-x-auto grid-scroll\">\n <div className=\"flex gap-3 h-full min-w-max pb-2\">\n {columns.map(col => {\n const colItems = grouped[col.value] ?? [];\n const isOver = over !== null && over.col === col.value;\n const dp = dragId !== null ? colItems.findIndex(it => getId(it) === dragId) : -1;\n // The drop-line index, or -1 to hide it (incl. the no-op slots next to the dragged card).\n const lineAt = isOver && !(dp !== -1 && (over!.index === dp || over!.index === dp + 1)) ? over!.index : -1;\n return (\n <div\n key={col.value}\n className={`flex flex-col w-72 shrink-0 rounded-xl bg-gray-50 border transition-colors ${\n isOver ? 'border-blue-400 ring-2 ring-blue-300/60' : 'border-gray-200'\n }`}\n onDragOver={e => e.preventDefault()}\n onDrop={() => commitMove(col.value)}\n >\n <div\n className={`flex items-center justify-between px-3 py-2 rounded-t-xl text-sm font-medium ${\n col.accent ?? 'text-gray-700 bg-gray-100'\n }`}\n >\n <span className=\"flex items-center gap-2\">\n <span className={`h-2 w-2 rounded-full ${col.dot ?? 'bg-gray-400'}`} />\n {col.label}\n </span>\n <span className=\"text-xs opacity-70\">{colItems.length}</span>\n </div>\n <div\n className=\"flex-1 overflow-y-auto p-2 space-y-2 min-h-[120px]\"\n // Entering the column's empty area (not a card) targets the end.\n onDragEnter={() =>\n setOver(prev =>\n prev && prev.col === col.value && prev.index === colItems.length\n ? prev\n : { col: col.value, index: colItems.length },\n )\n }\n >\n {colItems.map((item, index) => {\n const id = getId(item);\n const isDragged = id === dragId;\n return (\n <Fragment key={id}>\n {lineAt === index && <div className=\"h-0.5 rounded-full bg-blue-500\" aria-hidden />}\n <div\n draggable\n onDragStart={e => {\n setDragId(id);\n try {\n e.dataTransfer.effectAllowed = 'move';\n } catch {\n /* some environments disallow setting this */\n }\n }}\n onDragEnter={e => {\n // Don't let the column's onDragEnter override this precise slot.\n e.stopPropagation();\n setOver(prev =>\n prev && prev.col === col.value && prev.index === index ? prev : { col: col.value, index },\n );\n }}\n onDragEnd={reset}\n onClick={onCardClick ? () => onCardClick(item) : undefined}\n style={dragId === null ? undefined : { opacity: isDragged ? 0.4 : 1, transition: 'opacity 120ms ease' }}\n className={`rounded-lg bg-white border border-gray-200 p-3 shadow-sm hover:border-blue-400 hover:shadow transition ${\n onCardClick ? 'cursor-pointer' : ''\n }`}\n >\n {renderCard(item)}\n </div>\n </Fragment>\n );\n })}\n {colItems.length > 0 && lineAt === colItems.length && (\n <div className=\"h-0.5 rounded-full bg-blue-500\" aria-hidden />\n )}\n {colItems.length === 0 && (\n <div\n className={`text-[11px] text-center rounded-lg transition-all duration-150 ${\n isOver\n ? 'border-2 border-dashed border-blue-300 bg-blue-50/50 text-blue-400 py-8'\n : 'text-gray-400 py-6'\n }`}\n >\n {columnEmptyText}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { PaginatedResponse } from './types';\n\ninterface UseInfiniteScrollOptions<T> {\n /** queryKey segments — arbitrary cache shapes (filters often include booleans,\n * dates, undefined). Callers pass their natural filter shape. */\n queryKey: (string | Record<string, unknown>)[];\n fetchFn: (params: Record<string, string>) => Promise<PaginatedResponse<T>>;\n /** Extra query-string params. Undefined values are dropped so axios doesn't\n * serialise them as \"?key=undefined\". */\n extraParams?: Record<string, string | undefined>;\n pageSize?: number;\n}\n\n/**\n * Wraps TanStack `useInfiniteQuery` with an IntersectionObserver-driven\n * sentinel so attaching `sentinelRef` to a div near the bottom of a scrollable\n * container auto-fires `fetchNextPage` as the user scrolls.\n *\n * Works inside modal windows too — the observer roots itself on the nearest\n * scrollable ancestor rather than the viewport.\n */\nexport function useInfiniteScroll<T>({\n queryKey,\n fetchFn,\n extraParams = {},\n pageSize: _pageSize = 25,\n}: UseInfiniteScrollOptions<T>) {\n void _pageSize; // reserved for future use; current backend defaults are fine\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n const cleanExtra = Object.fromEntries(\n Object.entries(extraParams).filter(([, v]) => v !== undefined),\n ) as Record<string, string>;\n\n const query = useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam = 1 }) =>\n fetchFn({ page: String(pageParam), ...cleanExtra }),\n getNextPageParam: (lastPage, allPages) => {\n if (lastPage.next) {\n return allPages.length + 1;\n }\n return undefined;\n },\n initialPageParam: 1,\n });\n\n const { fetchNextPage, hasNextPage, isFetchingNextPage } = query;\n\n const handleObserver = useCallback(\n (entries: IntersectionObserverEntry[]) => {\n const [entry] = entries;\n if (entry.isIntersecting && hasNextPage && !isFetchingNextPage) {\n fetchNextPage();\n }\n },\n [fetchNextPage, hasNextPage, isFetchingNextPage],\n );\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n\n // Find the nearest scrollable ancestor — using root:null (viewport) fails\n // when the list is inside a modal window because the sentinel can scroll\n // into view within the modal's own overflow container without ever\n // entering the viewport.\n let scrollParent: HTMLElement | null = el.parentElement;\n while (scrollParent) {\n const overflow = getComputedStyle(scrollParent).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') break;\n scrollParent = scrollParent.parentElement;\n }\n\n const observer = new IntersectionObserver(handleObserver, {\n root: scrollParent,\n rootMargin: '200px',\n threshold: 0,\n });\n\n observer.observe(el);\n return () => observer.disconnect();\n }, [handleObserver]);\n\n // Defensive: drop any null/undefined entries that creep in from a malformed\n // page payload (e.g. backend serializer returns null for soft-deleted\n // records). Otherwise downstream `.map(r => r.id)` blows up the whole list.\n const allItems = (query.data?.pages.flatMap((page) => page?.results ?? []) ?? [])\n .filter((x): x is T => x != null);\n const totalCount = query.data?.pages[0]?.count ?? 0;\n\n return {\n items: allItems,\n totalCount,\n isLoading: query.isLoading,\n isFetchingNextPage,\n hasNextPage: !!hasNextPage,\n sentinelRef,\n refetch: query.refetch,\n };\n}\n","import { useState } from 'react';\nimport type { SortState } from './types';\n\n/**\n * Tiny sort-state hook used by list pages. Returns:\n * - `sort` — current `{ field, direction }`\n * - `onSort(field)` — toggle direction if same field, else activate asc\n * - `ordering` — DRF-style string (`'-mid'` for desc, `'mid'` for asc) ready\n * to drop into a query-string param.\n */\nexport function useSort(defaultField: string, defaultDir: 'asc' | 'desc' = 'asc') {\n const [sort, setSort] = useState<SortState>({ field: defaultField, direction: defaultDir });\n\n const onSort = (field: string) => {\n setSort(prev =>\n prev.field === field\n ? { field, direction: prev.direction === 'asc' ? 'desc' : 'asc' }\n : { field, direction: 'asc' },\n );\n };\n\n const ordering = sort.direction === 'desc' ? `-${sort.field}` : sort.field;\n\n return { sort, onSort, ordering };\n}\n","/**\n * Shell-side entity fetcher — used by <WindowManager> when the user opens an\n * entity window. The shell knows the endpoint string (from the registry\n * entry) and the entity ID; the consumer translates that into an HTTP call\n * (or a mock, or whatever).\n *\n * Without a provider, the shell will throw if any code path tries to fetch\n * an entity — this is by design: a host that registers entity windows MUST\n * also wire the fetcher, or the open-entity flow has nothing to call.\n */\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport type EntityFetcher = (endpoint: string, id: string) => Promise<any>;\n\nconst EntityFetcherContext = createContext<EntityFetcher | null>(null);\n\nexport function ShellEntityFetcherProvider({\n value,\n children,\n}: { value: EntityFetcher; children: ReactNode }) {\n return <EntityFetcherContext.Provider value={value}>{children}</EntityFetcherContext.Provider>;\n}\n\n/** Returns the consumer-supplied entity fetcher, or a stub that throws\n * on call. Components that fetch entities call this hook eagerly so any\n * misconfiguration surfaces synchronously rather than at click-time. */\nexport function useShellEntityFetcher(): EntityFetcher {\n const ctx = useContext(EntityFetcherContext);\n return ctx ?? ((endpoint: string) => {\n throw new Error(\n `react-os-shell: cannot fetch ${endpoint} — no <ShellEntityFetcherProvider> mounted. ` +\n `If your app registers entity windows, supply an entityFetcher.`\n );\n });\n}\n","import { useEffect } from 'react';\n\n/**\n * Registers Alt+Shift+N (Windows) / Opt+Shift+N (Mac) hotkey to trigger a \"New\" action.\n * Uses e.code (physical key) to avoid locale/modifier character issues.\n */\nexport default function useNewHotkey(callback: () => void) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n const isN = e.code === 'KeyN' || e.key === 'N' || e.key === 'n';\n if (e.altKey && e.shiftKey && isN && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n callback();\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [callback]);\n}\n","import { useEffect } from 'react';\nimport { useModalActive } from '../shell/Modal';\n\n/**\n * Registers Alt+Shift+E (Windows) / Opt+Shift+E (Mac) hotkey to trigger an \"Edit\" action.\n * Uses e.code (physical key) to avoid locale/modifier character issues.\n * Only fires for the active (frontmost) modal.\n */\nexport default function useEditHotkey(callback: (() => void) | null) {\n const isActive = useModalActive();\n useEffect(() => {\n if (!callback || !isActive) return;\n const handler = (e: KeyboardEvent) => {\n const isE = e.code === 'KeyE' || e.key === 'E' || e.key === 'e';\n if (e.altKey && e.shiftKey && isE && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n callback();\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [callback, isActive]);\n}\n"]}