react-os-shell 0.2.18 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/{Browser-EBBYHPBS.js → Browser-RJZLTAJQ.js} +3 -3
  2. package/dist/{Browser-EBBYHPBS.js.map → Browser-RJZLTAJQ.js.map} +1 -1
  3. package/dist/{Calculator-CAKKD24W.js → Calculator-DMROKOY2.js} +4 -4
  4. package/dist/{Calculator-CAKKD24W.js.map → Calculator-DMROKOY2.js.map} +1 -1
  5. package/dist/{Calendar-DHAUIE7N.js → Calendar-24TAKCAJ.js} +3 -3
  6. package/dist/{Calendar-DHAUIE7N.js.map → Calendar-24TAKCAJ.js.map} +1 -1
  7. package/dist/{CurrencyConverter-5LWH5WLH.js → CurrencyConverter-KMBBKLHZ.js} +4 -4
  8. package/dist/{CurrencyConverter-5LWH5WLH.js.map → CurrencyConverter-KMBBKLHZ.js.map} +1 -1
  9. package/dist/{Documents-LECUPQZ4.js → Documents-QMP6QN3C.js} +3 -3
  10. package/dist/{Documents-LECUPQZ4.js.map → Documents-QMP6QN3C.js.map} +1 -1
  11. package/dist/{Email-AJYKU4M7.js → Email-XTFUEIE5.js} +3 -3
  12. package/dist/{Email-AJYKU4M7.js.map → Email-XTFUEIE5.js.map} +1 -1
  13. package/dist/Files-GMIYQPAA.js +7 -0
  14. package/dist/{Files-RPYWW7CV.js.map → Files-GMIYQPAA.js.map} +1 -1
  15. package/dist/{Minesweeper-JKDGSZMW.js → Minesweeper-YPAR6SPJ.js} +3 -3
  16. package/dist/{Minesweeper-JKDGSZMW.js.map → Minesweeper-YPAR6SPJ.js.map} +1 -1
  17. package/dist/{Notepad-VL2E3ZAM.js → Notepad-VEEUZROP.js} +3 -3
  18. package/dist/{Notepad-VL2E3ZAM.js.map → Notepad-VEEUZROP.js.map} +1 -1
  19. package/dist/{PomodoroTimer-5WFFVIXI.js → PomodoroTimer-HWHMQZO6.js} +4 -4
  20. package/dist/{PomodoroTimer-5WFFVIXI.js.map → PomodoroTimer-HWHMQZO6.js.map} +1 -1
  21. package/dist/Preview-Z447TOCE.js +6 -0
  22. package/dist/{Preview-WE6TMZ2L.js.map → Preview-Z447TOCE.js.map} +1 -1
  23. package/dist/{Spreadsheet-COXQUNF6.js → Spreadsheet-W76QOD42.js} +3 -3
  24. package/dist/{Spreadsheet-COXQUNF6.js.map → Spreadsheet-W76QOD42.js.map} +1 -1
  25. package/dist/{Weather-4ZPRC6CB.js → Weather-DIKN7BOT.js} +4 -4
  26. package/dist/{Weather-4ZPRC6CB.js.map → Weather-DIKN7BOT.js.map} +1 -1
  27. package/dist/apps/index.js +16 -16
  28. package/dist/{chunk-QF5IZXIA.js → chunk-4J466VCS.js} +3 -3
  29. package/dist/{chunk-QF5IZXIA.js.map → chunk-4J466VCS.js.map} +1 -1
  30. package/dist/{chunk-HTNCG36G.js → chunk-7ZUE7PEH.js} +4 -4
  31. package/dist/{chunk-HTNCG36G.js.map → chunk-7ZUE7PEH.js.map} +1 -1
  32. package/dist/{chunk-CXR7YLO7.js → chunk-HVZUPS3P.js} +3 -3
  33. package/dist/{chunk-CXR7YLO7.js.map → chunk-HVZUPS3P.js.map} +1 -1
  34. package/dist/{chunk-IDUZR4KY.js → chunk-QXY6ZHRX.js} +48 -25
  35. package/dist/chunk-QXY6ZHRX.js.map +1 -0
  36. package/dist/index.d.ts +10 -1
  37. package/dist/index.js +30 -5
  38. package/dist/index.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/Files-RPYWW7CV.js +0 -7
  41. package/dist/Preview-WE6TMZ2L.js +0 -6
  42. package/dist/chunk-IDUZR4KY.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-os-shell",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "Desktop-style React UI shell — windows, taskbar, start menu, sticky notes, frosted glass theming, and 17 bundled apps including a PDF Preview viewer.",
5
5
  "license": "MIT",
6
6
  "author": "Victor Y. Mau",
@@ -1,7 +0,0 @@
1
- export { Files as default, openFilesInTrashMode } from './chunk-HTNCG36G.js';
2
- import './chunk-QF5IZXIA.js';
3
- import './chunk-WIJ45SYD.js';
4
- import './chunk-IDUZR4KY.js';
5
- import './chunk-PLGHQ7QW.js';
6
- //# sourceMappingURL=Files-RPYWW7CV.js.map
7
- //# sourceMappingURL=Files-RPYWW7CV.js.map
@@ -1,6 +0,0 @@
1
- export { Preview as default, setPdfPreview } from './chunk-QF5IZXIA.js';
2
- import './chunk-WIJ45SYD.js';
3
- import './chunk-IDUZR4KY.js';
4
- import './chunk-PLGHQ7QW.js';
5
- //# sourceMappingURL=Preview-WE6TMZ2L.js.map
6
- //# sourceMappingURL=Preview-WE6TMZ2L.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shell/nav-types.ts","../src/shell-config/nav.tsx","../src/windowRegistry/types.ts","../src/api/client.ts","../src/utils/glass.ts","../src/shell/PopupMenu.tsx","../src/shell/useIsMobile.ts","../src/shell/mobileShellStore.ts","../src/shell/Modal.tsx","../src/shell/LoadingSpinner.tsx","../src/shell/WindowManager.tsx"],"names":["useEffect","useRef","jsx","useSyncExternalStore","confirm","jsxs","createContext","useContext","useCallback","useState","createPortal","Fragment","isValidElement","cloneElement"],"mappings":"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","file":"chunk-IDUZR4KY.js","sourcesContent":["/**\n * Nav data types used by <Layout> + <StartMenu>. The actual sections, icons,\n * and categories are consumer-supplied via Layout props — the package never\n * ships nav DATA, only the shape it expects.\n */\nimport type { ReactNode } from 'react';\n\nexport interface NavItem {\n to: string;\n label: string;\n perms?: string[];\n dividerAfter?: boolean;\n}\n\nexport interface NavSection {\n label: string;\n items: NavItem[];\n perms?: string[];\n /** Optional landing route for clicks on the section title itself\n * (e.g. R&D's `/rd` dashboard). */\n to?: string;\n}\n\nexport interface VirtualSection {\n label: string;\n items: NavItem[];\n icon?: ReactNode;\n}\n\nexport interface StartMenuCategories {\n /** Section labels rendered in the \"ERP\" group (bold, with section icon). */\n erp: string[];\n /** Section labels rendered in the \"system\" group. */\n system: string[];\n /** Optional virtual flyouts (e.g. a \"Utilities\" tray). */\n virtual?: VirtualSection[];\n}\n\nexport function isSection(item: NavSection | NavItem): item is NavSection {\n return 'items' in item;\n}\n","/**\n * INTERNAL stub — package-side compatibility for files that legacy-imported\n * default nav data from `shell-config/nav`. The package never ships nav\n * DATA; consumers always supply `navSections` / `navIcons` / `sectionIcons` /\n * `categories` as Layout props.\n *\n * Empty defaults exported here so the copied files compile during the\n * extraction transition. Each consumer-facing field is also re-exported as\n * a TYPE alias for code that only needed the shape.\n */\nimport type { ReactNode } from 'react';\nimport type { NavItem, NavSection, StartMenuCategories, VirtualSection } from '../shell/nav-types';\n\n// Live proxy: WindowManager reads window-title icons from this module-level\n// map. Consumers register their full icon set once at app startup so the\n// title bars show the same glyphs as the start menu.\nconst _navIcons: Record<string, ReactNode> = {};\nexport const navIcons: Record<string, ReactNode> = new Proxy(_navIcons, {\n get(_t, k: string) { return _navIcons[k]; },\n has(_t, k: string) { return k in _navIcons; },\n ownKeys() { return Object.keys(_navIcons); },\n getOwnPropertyDescriptor(_t, k: string) {\n if (k in _navIcons) return { configurable: true, enumerable: true, value: _navIcons[k] };\n return undefined;\n },\n});\nexport function setShellNavIcons(icons: Record<string, ReactNode>): void {\n for (const k of Object.keys(_navIcons)) delete _navIcons[k];\n Object.assign(_navIcons, icons);\n}\n\nexport const sectionIcons: Record<string, ReactNode> = {};\nexport const navSections: (NavSection | NavItem)[] = [];\nexport const startMenuCategories: StartMenuCategories = { erp: [], system: [], virtual: [] };\n\nexport { isSection } from '../shell/nav-types';\nexport type { NavItem, NavSection, StartMenuCategories, VirtualSection };\n","/**\n * Window registry types — generic shell concepts (no consumer-specific data).\n *\n * Two kinds of entries can be registered:\n * - PageRegistryEntry: a lazy-loaded React component rendered as a windowed\n * page (Calculator, Notepad, Sales Order list, etc.).\n * - ModalRegistryEntry: a detail-modal definition that fetches an entity\n * from a REST endpoint and hands it to a render function (Sales Order\n * detail, Bug Report detail, etc.).\n *\n * Consumers compose their full registry by passing entries to\n * `createWindowRegistry()` (see ./createWindowRegistry).\n */\nimport type { ReactNode, LazyExoticComponent } from 'react';\n\n/** Page window entry — renders a lazy-loaded page component. */\nexport interface PageRegistryEntry {\n component: LazyExoticComponent<any>;\n label: string;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n allowPinOnTop?: boolean;\n /** Utility apps don't show as taskbar window tabs. */\n utility?: boolean;\n /** Initial position hint. */\n initialPosition?: 'top-right' | 'top-left';\n /** Widget mode: no title bar, drag via body, right-click context menu. */\n widget?: boolean;\n /** Compact title bar: smaller header with title + close only, no footer. */\n compact?: boolean;\n /** App-style window for self-chromed apps (Preview, Files, Browser, etc.):\n * small title bar with full controls, no body padding, no footer. */\n appStyle?: boolean;\n /** Custom window dimensions [width, height] in pixels. */\n dimensions?: [number, number];\n /** Auto-size window height to its content. Combine with naturally-flowing\n * content (forms, settings, simple tools); avoid for windows whose root\n * uses `h-full` / `flex-1` since those would collapse. */\n autoHeight?: boolean;\n /** Floor for `autoHeight` (px). Defaults to 240. */\n autoMinHeight?: number;\n /** When true, openPage(path) opens a new instance each time instead of\n * activating an existing one. Each instance gets a unique window id and\n * the taskbar groups them under a single icon. */\n multiInstance?: boolean;\n /** navIcon route key for window title icon (e.g. '/orders'). */\n icon?: string;\n}\n\n/** Entity window entry — renders a detail modal with API data. */\nexport interface ModalRegistryEntry {\n /** API endpoint prefix — entity fetched via GET {endpoint}{id}/. */\n endpoint: string;\n /** How to render the detail content. */\n render: (entity: any, onClose: () => void, entityId?: string, editing?: boolean, setEditing?: (v: boolean) => void) => ReactNode;\n /** Generate modal title from entity data. Editing state passed for Edit button. */\n title: (entity: any, editing?: boolean, setEditing?: (v: boolean) => void) => ReactNode;\n /** Generate modal footer from entity data. */\n footer?: (entity: any) => ReactNode;\n /** Modal size. */\n size?: string;\n /** If true, the component fetches its own data — pass ID, not entity. */\n selfFetching?: boolean;\n /** If true, the component renders its own Modal — skip outer Modal wrapper. */\n rendersOwnModal?: boolean;\n /** Query key prefix for React Query — must match what detail components invalidate. */\n queryKey?: string;\n /** Auto-size window height to its content. See PageRegistryEntry.autoHeight. */\n autoHeight?: boolean;\n /** Floor for `autoHeight` (px). Defaults to 240. */\n autoMinHeight?: number;\n /** App-style window: small title bar, no body padding, no footer. */\n appStyle?: boolean;\n /** navIcon route key for window title icon (e.g. '/orders'). */\n icon?: string;\n}\n\nexport type WindowRegistryEntry = PageRegistryEntry | ModalRegistryEntry;\n\nexport type WindowRegistry = Record<string, WindowRegistryEntry>;\n\n/** Type guard: true if entry is a page window (has `component`). */\nexport function isPageEntry(entry: WindowRegistryEntry): entry is PageRegistryEntry {\n return 'component' in entry;\n}\n\n/** Type guard: true if entry is an entity window (has `endpoint`). */\nexport function isEntityEntry(entry: WindowRegistryEntry): entry is ModalRegistryEntry {\n return 'endpoint' in entry;\n}\n\n/** Module-level registry — the package no longer ships entity/page data;\n * consumers register their composed registry once at app startup via\n * setShellWindowRegistry(). The shell's WindowManager reads from here at\n * every openEntity / openPage call. */\nlet _registry: WindowRegistry = {};\n\nexport function setShellWindowRegistry(registry: WindowRegistry): void {\n _registry = registry;\n}\n\n/** Live proxy onto the consumer-registered registry — reads always reflect\n * the latest setShellWindowRegistry() call. */\nexport const WINDOW_REGISTRY: WindowRegistry = new Proxy({} as WindowRegistry, {\n get(_t, prop: string) { return _registry[prop]; },\n has(_t, prop: string) { return prop in _registry; },\n ownKeys() { return Object.keys(_registry); },\n getOwnPropertyDescriptor(_t, prop: string) {\n if (prop in _registry) {\n return { configurable: true, enumerable: true, value: _registry[prop] };\n }\n return undefined;\n },\n});\n","/**\n * INTERNAL stub — bridges legacy `apiClient.get/patch('/auth/me/', ...)` calls\n * inside the shell to the new <ShellPrefsProvider> contract. This keeps the\n * package's copied source compiling without rewriting every call site at\n * once; consumer-supplied prefs flow through `<ShellPrefsProvider>`.\n *\n * Outside calls (anything not hitting `/auth/me/`) need the consumer to mount\n * <ShellEntityFetcherProvider> and wire `entityFetcher` on <WindowManager>.\n *\n * When `setShellApiClient` has not been called, HTTP methods resolve with an\n * empty payload instead of throwing — so consumers without a backend (the\n * Pages demo, for instance) can still mount the shell. A one-time console\n * warning surfaces the missing wiring without crashing the app.\n *\n * Long-term this file is removed when each call site migrates to\n * `useShellPrefs()` directly.\n */\nimport axios, { AxiosInstance } from 'axios';\n\nlet _apiClient: AxiosInstance | null = null;\n\n/** Consumer registers their own axios instance — typically the same one\n * they use elsewhere. The package only delegates HTTP to this. */\nexport function setShellApiClient(instance: AxiosInstance) {\n _apiClient = instance;\n}\n\n/** Whether the consumer has wired an api client. Internal shell queries gate\n * themselves on this so demos / consumers without a backend don't fire\n * doomed HTTP requests. */\nexport function isShellApiClientConfigured(): boolean {\n return _apiClient !== null;\n}\n\n// HTTP methods that resolve with empty data when no client is wired. Internal\n// callers gate on `isShellApiClientConfigured()` so this branch shouldn't\n// fire normally; it remains as a safety net for consumer-supplied apps that\n// import the shell's `apiClient` directly without setting one up.\nconst NOOP_METHODS = new Set([\n 'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'request',\n]);\n\nconst apiClient: AxiosInstance = new Proxy({} as AxiosInstance, {\n get(_t, prop) {\n if (_apiClient) return (_apiClient as any)[prop];\n if (typeof prop === 'string' && NOOP_METHODS.has(prop)) {\n return () => Promise.resolve({ data: null, status: 0, statusText: '', headers: {}, config: {} });\n }\n return undefined;\n },\n});\n\nexport default apiClient;\n// Re-export the axios type for legacy code that imports it.\nexport type { AxiosInstance };\n// Provide a cheap axios stub for files that import it.\nexport { axios };\n","import type { CSSProperties } from 'react';\n\n/** Read the system menu opacity from CSS custom property set by Layout */\nfunction getMenuOpacity(): number {\n try {\n const val = getComputedStyle(document.documentElement).getPropertyValue('--menu-opacity')?.trim();\n if (val) return parseFloat(val);\n } catch {}\n return 0.95;\n}\n\nfunction isDarkTheme(): boolean {\n try {\n return document.documentElement.getAttribute('data-theme') === 'dark';\n } catch {\n return false;\n }\n}\n\n/** Frosted glass style — shared across all menus, popups, and glass UI elements.\n * Reads --menu-opacity CSS variable set by the theme system, and adapts the\n * base tint to dark mode so menus don't stay light-cream when text is light. */\nexport function glassStyle(opacity?: number): CSSProperties {\n const o = opacity ?? getMenuOpacity();\n if (isDarkTheme()) {\n // Dark frosted glass — Catppuccin-aligned base (#1e1e2e / 30,30,46) with\n // a subtle gradient and lighter inner highlight.\n return {\n background: `linear-gradient(135deg, rgba(30,30,46,${o * 0.85}) 0%, rgba(24,24,37,${o * 0.75}) 50%, rgba(30,30,46,${o * 0.85}) 100%)`,\n backdropFilter: 'blur(40px) saturate(1.6)',\n WebkitBackdropFilter: 'blur(40px) saturate(1.6)',\n border: '1px solid rgba(255,255,255,0.08)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.06), inset 0 -1px 0 rgba(0,0,0,0.4), 0 8px 32px rgba(0,0,0,0.5), 0 2px 8px rgba(0,0,0,0.3)',\n };\n }\n return {\n background: `linear-gradient(135deg, rgba(255,255,255,${o * 0.85}) 0%, rgba(255,255,255,${o * 0.65}) 50%, rgba(255,255,255,${o * 0.75}) 100%)`,\n backdropFilter: 'blur(40px) saturate(1.8)',\n WebkitBackdropFilter: 'blur(40px) saturate(1.8)',\n border: '1px solid rgba(255,255,255,0.35)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.4), inset 0 -1px 0 rgba(255,255,255,0.1), 0 8px 32px rgba(0,0,0,0.15), 0 2px 8px rgba(0,0,0,0.08)',\n };\n}\n\n/** Glass divider border color */\nexport const GLASS_DIVIDER = 'border-white/20';\n\n/** Glass input/search bar background — declared in styles.css so it can adapt\n * to dark mode (a flat `bg-white/15` reads as a too-bright tile on the dark\n * glass gradient). */\nexport const GLASS_INPUT_BG = 'glass-input-bg';\n","import { useEffect, useRef, type ReactNode, type CSSProperties } from 'react';\nimport { glassStyle, GLASS_DIVIDER } from '../utils/glass';\n\n/**\n * Unified popup menu component — used for all context menus, dropdowns, and flyouts.\n * Reads --menu-density CSS variable: 'tight' or 'normal' (default).\n */\n\nexport interface PopupMenuProps {\n children: ReactNode;\n style?: CSSProperties;\n className?: string;\n onClose?: () => void;\n minWidth?: number;\n}\n\nfunction getDensity(): 'tight' | 'normal' {\n return (getComputedStyle(document.documentElement).getPropertyValue('--menu-density')?.trim() as any) || 'normal';\n}\n\n/** Container for a popup menu — auto-clamps to stay within viewport */\nexport function PopupMenu({ children, style, className = '', onClose, minWidth = 180 }: PopupMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!onClose) return;\n const handleClick = (e: PointerEvent | MouseEvent) => {\n if ((e.target as HTMLElement).closest('[data-menu-toggle]')) return;\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('pointerdown', handleClick);\n window.addEventListener('keydown', handleKey);\n return () => { window.removeEventListener('pointerdown', handleClick); window.removeEventListener('keydown', handleKey); };\n }, [onClose]);\n\n // After render, clamp position to viewport boundaries\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n requestAnimationFrame(() => {\n const rect = el.getBoundingClientRect();\n const margin = 8;\n // Clamp right edge\n if (rect.right > window.innerWidth - margin) {\n const overflow = rect.right - window.innerWidth + margin;\n if (el.style.left) {\n el.style.left = `${parseFloat(el.style.left) - overflow}px`;\n } else if (!el.style.right) {\n el.style.left = `${rect.left - overflow}px`;\n }\n }\n // Clamp left edge\n if (rect.left < margin) {\n if (el.style.left) {\n el.style.left = `${margin}px`;\n } else if (el.style.right) {\n el.style.right = `${window.innerWidth - rect.width - margin}px`;\n }\n }\n // Clamp bottom edge\n if (rect.bottom > window.innerHeight - margin) {\n const overflow = rect.bottom - window.innerHeight + margin;\n if (el.style.top) {\n el.style.top = `${parseFloat(el.style.top) - overflow}px`;\n } else if (el.style.bottom) {\n // Already anchored to bottom, just clamp\n el.style.bottom = `${margin}px`;\n } else {\n el.style.top = `${rect.top - overflow}px`;\n }\n }\n // Clamp top edge\n if (rect.top < margin) {\n if (el.style.top) {\n el.style.top = `${margin}px`;\n } else if (el.style.bottom) {\n el.style.bottom = `${window.innerHeight - rect.height - margin}px`;\n }\n }\n });\n });\n\n const tight = getDensity() === 'tight';\n\n return (\n <div ref={ref}\n className={`fixed z-[400] rounded-2xl ${tight ? 'py-1' : 'py-1.5'} ${className}`}\n style={{ minWidth, animation: 'popup-in 0.12s ease-out', ...glassStyle(), ...style }}>\n {children}\n <style>{`@keyframes popup-in { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }`}</style>\n </div>\n );\n}\n\n/** A clickable menu item */\nexport function PopupMenuItem({ onClick, children, className = '', danger, disabled }: {\n onClick?: () => void;\n children: ReactNode;\n className?: string;\n danger?: boolean;\n disabled?: boolean;\n}) {\n const tight = getDensity() === 'tight';\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full flex items-center gap-2 text-left transition-colors rounded-lg mx-auto\n ${danger ? 'text-red-600 hover:bg-red-50' : 'text-gray-700 hover:bg-blue-50 hover:text-blue-700'}\n ${disabled ? 'opacity-40 cursor-not-allowed' : ''}\n ${className}`}\n style={{\n width: 'calc(100% - 8px)',\n marginLeft: 4,\n marginRight: 4,\n fontSize: 'var(--menu-font-size, 14px)',\n paddingLeft: 'var(--menu-padding-x, 1rem)',\n paddingRight: 'var(--menu-padding-x, 1rem)',\n paddingTop: tight ? '0.25rem' : 'var(--menu-padding-y, 0.5rem)',\n paddingBottom: tight ? '0.25rem' : 'var(--menu-padding-y, 0.5rem)',\n }}\n >\n {children}\n </button>\n );\n}\n\n/** A divider line between menu items */\nexport function PopupMenuDivider() {\n const tight = getDensity() === 'tight';\n return <div className={`border-t ${GLASS_DIVIDER} ${tight ? 'my-0.5' : 'my-1'} mx-3`} />;\n}\n\n/** A section header label */\nexport function PopupMenuLabel({ children }: { children: ReactNode }) {\n const tight = getDensity() === 'tight';\n return (\n <div\n className=\"text-[10px] font-medium text-gray-400 uppercase tracking-wider\"\n style={{\n paddingLeft: 'var(--menu-padding-x, 1rem)',\n paddingRight: 'var(--menu-padding-x, 1rem)',\n paddingTop: tight ? '0.125rem' : '0.25rem',\n paddingBottom: tight ? '0.125rem' : '0.25rem',\n }}\n >\n {children}\n </div>\n );\n}\n\n/** An icon helper */\nexport function MenuIcon({ d, className = 'h-4 w-4 text-gray-400' }: { d: string; className?: string }) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d={d} />\n </svg>\n );\n}\n","/**\n * Mobile breakpoint hook — single source of truth for \"is this a phone/tablet\n * portrait viewport?\" Drives whether <Layout> renders the desktop chrome\n * (windows / taskbar / start menu sidebar) or <MobileShell> (home / fullscreen\n * apps / bottom-nav switcher).\n *\n * Locked at 768 px so iPad portrait gets the mobile shell. Also OR's with\n * `pointer: coarse` so touch-only devices that happen to be wider (e.g. an\n * Android tablet in landscape) still get touch-appropriate UI.\n */\nimport { useSyncExternalStore } from 'react';\n\nconst QUERY = '(max-width: 767px), (pointer: coarse)';\n\nfunction getSnapshot(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia(QUERY).matches;\n}\n\nfunction getServerSnapshot(): boolean {\n return false;\n}\n\nfunction subscribe(cb: () => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const mql = window.matchMedia(QUERY);\n // Older Safari uses addListener; modern browsers use addEventListener.\n if (mql.addEventListener) {\n mql.addEventListener('change', cb);\n return () => mql.removeEventListener('change', cb);\n }\n mql.addListener(cb);\n return () => mql.removeListener(cb);\n}\n\nexport function useIsMobile(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\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","import { useEffect, useCallback, useRef, useState, createContext, useContext, useSyncExternalStore, cloneElement, isValidElement } from 'react';\nimport { createPortal } from 'react-dom';\nimport { XMarkIcon } from '@heroicons/react/24/outline';\nimport { confirm } from './ConfirmDialog';\nimport { useWindowManager } from './WindowManager';\nimport { glassStyle as getGlassStyle } from '../utils/glass';\nimport { PopupMenu, PopupMenuItem, PopupMenuDivider } from './PopupMenu';\nimport { useIsMobile } from './useIsMobile';\nimport { setMobileMode } from './mobileShellStore';\n\n/** Context that passes the modal's unique ID to children */\nconst ModalIdContext = createContext<string>('');\n\n/** Hook for widget components to register a settings handler for the right-click menu. */\nexport function useWidgetSettings(handler: () => void) {\n const id = useContext(ModalIdContext);\n useEffect(() => {\n if (!id) return;\n const listener = (e: Event) => { if ((e as CustomEvent).detail === id) handler(); };\n window.addEventListener('widget-open-settings', listener);\n return () => window.removeEventListener('widget-open-settings', listener);\n }, [handler, id]);\n}\n\n/** Registry for extra window menu items added by child components */\nconst _extraMenuItems: Record<string, { label: string; icon?: React.ReactNode; onClick: () => void }[]> = {};\n\n/** Hook to add custom items to the window title menu from inside a modal */\nexport function useWindowMenuItem(label: string, onClick: () => void, icon?: React.ReactNode) {\n const id = useContext(ModalIdContext);\n useEffect(() => {\n if (!id) return;\n if (!_extraMenuItems[id]) _extraMenuItems[id] = [];\n const item = { label, icon, onClick };\n _extraMenuItems[id].push(item);\n return () => { _extraMenuItems[id] = (_extraMenuItems[id] || []).filter(i => i !== item); };\n }, [id, label, onClick, icon]);\n}\n\n/** Component that updates the surrounding window's title bar. Render anywhere\n * inside a Modal-rendered page. Cross-bundle safe (uses DOM traversal rather\n * than React Context, which has separate instances in each bundle). */\nexport function WindowTitle({ title }: { title: string }) {\n const ref = useRef<HTMLSpanElement>(null);\n useEffect(() => {\n const handle = setTimeout(() => {\n const panel = ref.current?.closest('[data-modal-id]');\n const id = panel?.getAttribute('data-modal-id');\n if (id) window.dispatchEvent(new CustomEvent('window-title-update', { detail: { id, title } }));\n }, 0);\n return () => clearTimeout(handle);\n }, [title]);\n return <span ref={ref} style={{ display: 'none' }} aria-hidden=\"true\" />;\n}\n\n/** @deprecated Use <WindowTitle> instead — the hook variant doesn't work\n * across bundle boundaries (apps barrel has its own ModalIdContext). */\nexport function useWindowTitle(_title: string) {\n // Intentionally a no-op now. Kept for type compatibility during migration.\n}\n\n/**\n * Portal component — renders children into the nearest Modal's footer actions area.\n * position=\"left\" for destructive actions (Delete), default is right for primary actions.\n */\nexport function CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n return (\n <button onClick={handleCopy} title={copied ? 'Copied!' : `Copy ${text}`}\n className=\"shrink-0 text-gray-400 hover:text-gray-600 transition-colors\">\n {copied ? (\n <svg className=\"w-4 h-4 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" /></svg>\n ) : (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" /></svg>\n )}\n </button>\n );\n}\n\n// Context to pass action container refs from Modal to ModalActions\ninterface ModalActionsCtx {\n rightRef: React.RefObject<HTMLDivElement | null>;\n leftRef: React.RefObject<HTMLDivElement | null>;\n notify: () => void;\n active: boolean;\n isDirty: boolean;\n}\nconst ModalActionsContext = createContext<ModalActionsCtx | null>(null);\n\n/** Hook to check if the current modal is active (frontmost) */\nexport function useModalActive(): boolean {\n const activeId = useSyncExternalStore(subscribeActive, getActiveModalId);\n const ctx = useContext(ModalActionsContext);\n return ctx?.active ?? (activationOrder.length <= 1 || activeId != null);\n}\n\nexport function ModalActions({ children, position = 'right' }: { children: React.ReactNode; position?: 'left' | 'right' }) {\n const ctx = useContext(ModalActionsContext);\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!ctx) return;\n const ref = position === 'left' ? ctx.leftRef : ctx.rightRef;\n const check = () => {\n if (ref.current) { setTarget(ref.current); ctx.notify(); return true; }\n return false;\n };\n if (check()) return;\n // Ref might not be set yet — retry\n const t = setInterval(() => { if (check()) clearInterval(t); }, 50);\n const cleanup = setTimeout(() => clearInterval(t), 2000);\n return () => { clearInterval(t); clearTimeout(cleanup); };\n }, [ctx, position]);\n\n if (!target) return null;\n return createPortal(children, target);\n}\n\n/**\n * Cancel button that checks for unsaved changes before calling onClick.\n * Automatically detects dirty state from the nearest Modal context.\n */\nexport function CancelButton({ onClick, children, className }: { onClick: () => void; children?: React.ReactNode; className?: string }) {\n const ctx = useContext(ModalActionsContext);\n\n const handleClick = async () => {\n if (ctx?.isDirty) {\n const { confirm } = await import('./ConfirmDialog');\n const ok = await confirm({\n title: 'Discard changes?',\n message: 'You have unsaved changes. Are you sure you want to cancel? All changes will be lost.',\n confirmLabel: 'Discard',\n cancelLabel: 'Keep Editing',\n variant: 'warning',\n });\n if (!ok) return;\n }\n onClick();\n };\n\n return (\n <button type=\"button\" onClick={handleClick}\n className={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 {children || 'Cancel'}\n </button>\n );\n}\n\n// ── Window position persistence ──\nconst WP_KEY = 'erp_window_positions';\nlet _windowPositions: Record<string, { x: number; y: number; w: number; h: number }> = {};\ntry {\n const stored = localStorage.getItem(WP_KEY);\n if (stored) _windowPositions = JSON.parse(stored);\n} catch {}\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\nfunction _savePositionsDebounced() {\n if (_saveTimer) clearTimeout(_saveTimer);\n _saveTimer = setTimeout(() => {\n try { localStorage.setItem(WP_KEY, JSON.stringify(_windowPositions)); } catch {}\n }, 500);\n}\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title: React.ReactNode;\n /** Window icon — shown before title, clicking it opens window menu */\n icon?: React.ReactNode;\n /** Text to copy when the copy icon in the header is clicked (e.g. entity number) */\n copyText?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n dirty?: boolean | 'auto';\n onNext?: () => void;\n onPrev?: () => void;\n footer?: React.ReactNode;\n /** When true, body uses overflow-hidden — child content manages its own scrolling */\n bodyScroll?: false;\n /** Custom minimize handler — called instead of the default global minimize */\n onMinimize?: (savedBox: { x: number; y: number; w: number; h: number; maximized: boolean }) => void;\n /** Restore to a previously saved position/size */\n initialBox?: { x: number; y: number; w: number; h: number; maximized: boolean };\n /** Footer actions (right side) — alternative to ModalActions portal */\n actions?: React.ReactNode;\n /** Footer actions (left side) — alternative to ModalActions portal */\n actionsLeft?: React.ReactNode;\n /** Allow the window to be pinned on top of all others */\n allowPinOnTop?: boolean;\n /** Initial position hint */\n initialPosition?: 'top-right' | 'top-left';\n /** Widget mode: no title/footer, drag anywhere, right-click context menu */\n widget?: boolean;\n /** Compact title bar: smaller header with title + close only, no minimize/maximize */\n compact?: boolean;\n /** App-style window: full title bar but body uses no padding so the app's own\n * chrome (toolbars, menus) sits flush against the window frame. For\n * self-chromed apps like Preview, Files, Browser. Implies `bodyScroll: false`\n * — apps manage their own scrolling internally. */\n appStyle?: boolean;\n /** Auto-size height based on content. Window's height adapts to whatever the\n * body renders; combined with `autoMinHeight` to prevent collapse and capped\n * to the available viewport so nothing overflows the screen. Only set this\n * for windows whose root content uses natural (block / shrink-to-fit) sizing\n * — windows whose root uses `h-full` / `flex-1` would collapse here. */\n autoHeight?: boolean;\n /** Minimum height (px) when `autoHeight` is on. Defaults to 240. */\n autoMinHeight?: number;\n /** Custom menu items for widget right-click context menu */\n widgetMenu?: React.ReactNode;\n /** Custom window dimensions [width, height] in pixels */\n dimensions?: [number, number];\n /** Stable key for persisting window position to sessionStorage */\n windowKey?: string;\n children: React.ReactNode;\n}\n\nconst sizeDefaults: Record<string, number> = {\n sm: 384, md: 512, lg: 672, xl: 896, '2xl': 1152,\n};\n\n// Track modal depth for stacking z-index and ESC handling\nexport let modalDepth = 0;\nexport const modalStack: string[] = [];\nexport const modalDepthRef = { get: () => modalDepth, inc: () => ++modalDepth, dec: () => --modalDepth };\n\n// Activation order — last element is the frontmost modal\nconst activationOrder: string[] = [];\nconst activeListeners = new Set<() => void>();\nexport function activateModal(id: string) {\n const idx = activationOrder.indexOf(id);\n if (idx !== -1) activationOrder.splice(idx, 1);\n activationOrder.push(id);\n activeListeners.forEach(fn => fn());\n window.dispatchEvent(new CustomEvent('modal-reorder'));\n}\n// Track which modal IDs belong to widget windows; widgets stay visible when\n// the user double-clicks the desktop (\"show desktop\"), only regular windows\n// are hidden.\nconst widgetIds = new Set<string>();\nexport function deactivateAllModals() {\n // Drop everything that is not a widget.\n for (let i = activationOrder.length - 1; i >= 0; i--) {\n if (!widgetIds.has(activationOrder[i])) activationOrder.splice(i, 1);\n }\n activeListeners.forEach(fn => fn());\n window.dispatchEvent(new CustomEvent('modal-reorder'));\n}\n// ── Window snapping ──────────────────────────────────────────────────────\n// Aero/Magnet-style edge snapping. The drag handler watches the cursor\n// position and calls into these helpers. A single translucent preview\n// element is reused across drags (lazily created, kept around in body).\n\ntype SnapZone = 'top' | 'left' | 'right' | 'tl' | 'tr' | 'bl' | 'br';\nconst EDGE_THRESHOLD = 8; // px from edge to trigger half-screen snap\nconst CORNER_THRESHOLD = 32; // px square at each corner for quarter-screen snap\n\ninterface Box { x: number; y: number; w: number; h: number; }\n\nfunction workArea(): Box {\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 0;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const tbPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const x = tbPos === 'left' ? taskbarW : 0;\n const y = tbPos === 'top' ? taskbarH : 0;\n const w = window.innerWidth - (tbPos === 'left' || tbPos === 'right' ? taskbarW : 0);\n const h = window.innerHeight - (tbPos === 'top' || tbPos === 'bottom' ? taskbarH : 0);\n return { x, y, w, h };\n}\n\nfunction calcSnapBox(zone: SnapZone): Box {\n const a = workArea();\n const halfW = Math.floor(a.w / 2);\n const halfH = Math.floor(a.h / 2);\n switch (zone) {\n case 'top': return { x: a.x, y: a.y, w: a.w, h: a.h };\n case 'left': return { x: a.x, y: a.y, w: halfW, h: a.h };\n case 'right': return { x: a.x + halfW, y: a.y, w: a.w - halfW, h: a.h };\n case 'tl': return { x: a.x, y: a.y, w: halfW, h: halfH };\n case 'tr': return { x: a.x + halfW, y: a.y, w: a.w - halfW, h: halfH };\n case 'bl': return { x: a.x, y: a.y + halfH, w: halfW, h: a.h - halfH };\n case 'br': return { x: a.x + halfW, y: a.y + halfH, w: a.w - halfW, h: a.h - halfH };\n }\n}\n\nfunction detectSnapZone(clientX: number, clientY: number): SnapZone | null {\n const a = workArea();\n const nearLeft = clientX <= a.x + EDGE_THRESHOLD;\n const nearRight = clientX >= a.x + a.w - EDGE_THRESHOLD;\n const nearTop = clientY <= a.y + EDGE_THRESHOLD;\n const nearBottom = clientY >= a.y + a.h - EDGE_THRESHOLD;\n // Corners take priority over edges (larger detection square).\n const cornerLeft = clientX <= a.x + CORNER_THRESHOLD;\n const cornerRight = clientX >= a.x + a.w - CORNER_THRESHOLD;\n const cornerTop = clientY <= a.y + CORNER_THRESHOLD;\n const cornerBottom = clientY >= a.y + a.h - CORNER_THRESHOLD;\n if (nearTop && cornerLeft) return 'tl';\n if (nearTop && cornerRight) return 'tr';\n if (nearBottom && cornerLeft) return 'bl';\n if (nearBottom && cornerRight)return 'br';\n if (cornerTop && nearLeft) return 'tl';\n if (cornerTop && nearRight) return 'tr';\n if (cornerBottom && nearLeft) return 'bl';\n if (cornerBottom && nearRight)return 'br';\n if (nearTop) return 'top';\n if (nearLeft) return 'left';\n if (nearRight) return 'right';\n return null;\n}\n\nlet snapPreviewEl: HTMLDivElement | null = null;\nfunction getSnapPreviewEl(): HTMLDivElement {\n if (!snapPreviewEl) {\n snapPreviewEl = document.createElement('div');\n snapPreviewEl.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 40',\n 'border-radius: 8px',\n 'background: rgba(59, 130, 246, 0.18)',\n 'border: 2px solid rgb(59, 130, 246)',\n 'transition: left 120ms ease, top 120ms ease, width 120ms ease, height 120ms ease, opacity 120ms ease',\n 'opacity: 0',\n 'display: none',\n ].join(';');\n document.body.appendChild(snapPreviewEl);\n }\n return snapPreviewEl;\n}\nfunction showSnapPreview(box: Box) {\n const el = getSnapPreviewEl();\n el.style.display = 'block';\n el.style.left = `${box.x}px`;\n el.style.top = `${box.y}px`;\n el.style.width = `${box.w}px`;\n el.style.height = `${box.h}px`;\n el.style.opacity = '1';\n}\nfunction hideSnapPreview() {\n if (!snapPreviewEl) return;\n snapPreviewEl.style.opacity = '0';\n snapPreviewEl.style.display = 'none';\n}\n\n// Listen for deactivate-all event from taskbar\nwindow.addEventListener('deactivate-all-modals', deactivateAllModals);\nfunction getZForModal(id: string): number {\n const idx = activationOrder.indexOf(id);\n if (idx === -1) return -1; // Behind everything — hidden below listing page\n return 50 + idx * 10;\n}\nexport function getActiveModalId() {\n return activationOrder[activationOrder.length - 1] || null;\n}\nexport function subscribeActive(cb: () => void) {\n activeListeners.add(cb);\n return () => { activeListeners.delete(cb); };\n}\n/** Hook: returns true if this modal ID is the frontmost */\nfunction useIsActiveModal(modalId: string): boolean {\n const activeId = useSyncExternalStore(subscribeActive, getActiveModalId);\n return activationOrder.length <= 1 || activeId === modalId;\n}\n\n// Split view: tile all open modals side by side\nfunction triggerSplitView() {\n window.dispatchEvent(new CustomEvent('modal-split-view'));\n}\nexport { triggerSplitView };\n\n\nexport default function Modal({ open, onClose, title, icon, copyText, size = 'lg', dirty = false, onNext, onPrev, footer, bodyScroll, onMinimize, initialBox, actions, actionsLeft, allowPinOnTop, initialPosition, widget, compact, appStyle, autoHeight, autoMinHeight, widgetMenu, dimensions, windowKey, children }: ModalProps) {\n const isMobile = useIsMobile();\n // Mobile swipe-from-left-edge gesture: track horizontal offset of the panel.\n // 0 = at rest. While the user is dragging from the left edge, this grows\n // with the finger. On release, if past the threshold the panel slides off\n // and `onClose` fires; otherwise it animates back to 0.\n const [swipeX, setSwipeX] = useState(0);\n const [swipeDragging, setSwipeDragging] = useState(false);\n const swipeStartRef = useRef<{ startX: number; startY: number; pointerId: number } | null>(null);\n const swipeXRef = useRef(0);\n useEffect(() => { swipeXRef.current = swipeX; }, [swipeX]);\n\n const handleEdgePointerDown = useCallback((e: React.PointerEvent) => {\n if (!isMobile) return;\n swipeStartRef.current = { startX: e.clientX, startY: e.clientY, pointerId: e.pointerId };\n setSwipeDragging(true);\n }, [isMobile]);\n\n // Move + release wired globally during a swipe so the panel keeps tracking\n // the finger even if it leaves the edge zone (e.g. the user drags clear\n // across the screen).\n useEffect(() => {\n if (!swipeDragging) return;\n const onMove = (ev: PointerEvent) => {\n if (!swipeStartRef.current) return;\n const dx = ev.clientX - swipeStartRef.current.startX;\n const dy = Math.abs(ev.clientY - swipeStartRef.current.startY);\n if (dy > Math.abs(dx) + 12) {\n // Vertical movement dominates — abandon the gesture so the user can\n // scroll content normally.\n swipeStartRef.current = null;\n setSwipeDragging(false);\n setSwipeX(0);\n return;\n }\n setSwipeX(Math.max(0, dx));\n };\n const onUp = () => {\n if (!swipeStartRef.current) return;\n const threshold = window.innerWidth * 0.3;\n const past = swipeXRef.current > threshold;\n swipeStartRef.current = null;\n setSwipeDragging(false);\n if (past) {\n // Swipe-from-edge sends the user to home. The app stays open in the\n // background (still in `openWindows`) so they can resume it from the\n // switcher. Reset translateX after the slide-off animation so the\n // next time the user reactivates this app it sits at rest.\n setSwipeX(window.innerWidth);\n setTimeout(() => {\n setMobileMode('home');\n setSwipeX(0);\n }, 180);\n } else {\n setSwipeX(0);\n }\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 }, [swipeDragging]);\n const [displayTitle, setDisplayTitle] = useState<React.ReactNode>(title);\n useEffect(() => { setDisplayTitle(title); }, [title]);\n const [touched, setTouched] = useState(false);\n const [pinnedOnTop, setPinnedOnTop] = useState(false);\n const [windowMenu, setWindowMenu] = useState<{ x: number; y: number } | null>(null);\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number } | null>(null);\n // Widget anchoring: 'left' or 'right' — determines which edge the widget is fixed to\n const [widgetAnchor, setWidgetAnchor] = useState<'left' | 'right'>(initialPosition === 'top-right' ? 'right' : 'left');\n const closingRef = useRef(false);\n const panelRef = useRef<HTMLDivElement>(null);\n const actionsRef = useRef<HTMLDivElement>(null);\n const actionsLeftRef = useRef<HTMLDivElement>(null);\n const [hasActions, setHasActions] = useState(false);\n // Every window must surface a clickable icon — it's the only entry point\n // to the window menu. Fall back to a generic \"window\" glyph when the\n // consumer hasn't supplied one. Consumer icons rarely include explicit\n // size classes (the start menu adds them via cloneElement), so we also\n // size them here to keep the title bar layout stable.\n const fallbackIcon = (\n <svg className=\"h-4 w-4 text-gray-400\" 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 M3.75 9h16.5\" />\n </svg>\n );\n const effectiveIcon = icon && isValidElement(icon)\n ? cloneElement(icon as React.ReactElement, {\n className: `h-4 w-4 ${(icon as React.ReactElement).props?.className ?? ''}`.trim(),\n } as any)\n : (icon ?? fallbackIcon);\n const renderIconButton = () => (\n <button\n onPointerDown={e => e.stopPropagation()}\n onClick={e => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setWindowMenu(prev => prev ? null : { x: rect.left, y: rect.bottom + 4 });\n }}\n className=\"shrink-0 p-0.5 rounded hover:bg-gray-200/50 transition-colors\"\n title=\"Window menu\"\n >\n {effectiveIcon}\n </button>\n );\n const padding = 40;\n const { minimize: globalMinimize, items: minimizedItems, restoreIfMinimized } = useWindowManager();\n const modalId = useRef(`modal-${Math.random().toString(36).slice(2, 8)}`).current;\n\n // Mark widget windows so deactivate-all (show desktop) skips them.\n useEffect(() => {\n if (widget) {\n widgetIds.add(modalId);\n return () => { widgetIds.delete(modalId); };\n }\n }, [widget, modalId]);\n\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (detail?.id === modalId) setDisplayTitle(detail.title);\n };\n window.addEventListener('window-title-update', handler);\n return () => window.removeEventListener('window-title-update', handler);\n }, [modalId]);\n const [zIndex, setZIndex] = useState(50);\n const isActive = useIsActiveModal(modalId);\n\n\n // Track whether ModalActions portal has content (either left or right)\n useEffect(() => {\n const r = actionsRef.current;\n const l = actionsLeftRef.current;\n if (!r && !l) return;\n const check = () => setHasActions((r?.childElementCount ?? 0) + (l?.childElementCount ?? 0) > 0);\n check();\n const obs = new MutationObserver(check);\n if (r) obs.observe(r, { childList: true });\n if (l) obs.observe(l, { childList: true });\n return () => obs.disconnect();\n }, [open]);\n\n // Forward submit-button clicks from portaled actions to the form\n // (React onClick won't fire for portal children — must use native listener)\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n const btn = (e.target as HTMLElement).closest('button[type=\"submit\"]');\n if (btn && panelRef.current) {\n const form = panelRef.current.querySelector('form');\n if (form) { e.preventDefault(); form.requestSubmit(); }\n }\n };\n const r = actionsRef.current;\n const l = actionsLeftRef.current;\n if (r) r.addEventListener('click', handler);\n if (l) l.addEventListener('click', handler);\n return () => { if (r) r.removeEventListener('click', handler); if (l) l.removeEventListener('click', handler); };\n }, [open]);\n\n // ── Draggable/resizable state ──\n const isNested = useRef(false);\n\n const calcMaximized = useCallback(() => {\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 0;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const tbPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const x = tbPos === 'left' ? taskbarW : 0;\n const y = tbPos === 'top' ? taskbarH : 0;\n const w = window.innerWidth - (tbPos === 'left' || tbPos === 'right' ? taskbarW : 0);\n const h = window.innerHeight - (tbPos === 'top' || tbPos === 'bottom' ? taskbarH : 0);\n return { x, y, w, h };\n }, []);\n\n const calcWindowed = useCallback(() => {\n const sw = 0;\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 0;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const tbPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const leftOffset = tbPos === 'left' ? taskbarW : 0;\n const rightOffset = tbPos === 'right' ? taskbarW : 0;\n const targetW = dimensions ? dimensions[0] : (sizeDefaults[size] || 672);\n const availW = window.innerWidth - sw - leftOffset - rightOffset - padding * 2;\n const availH = window.innerHeight - taskbarH - padding * 2;\n const w = Math.min(targetW, availW);\n const h = dimensions\n ? Math.min(dimensions[1], availH)\n : (() => { const minH = size === 'sm' ? 300 : 400; const maxH = size === 'sm' ? 500 : size === 'md' ? 600 : size === 'lg' ? 700 : availH; return Math.max(minH, Math.min(maxH, window.innerHeight - taskbarH - 80)); })();\n // Window position mode\n const posMode = getComputedStyle(document.documentElement).getPropertyValue('--window-position')?.trim() || 'cascade';\n const offset = posMode === 'cascade' ? (activationOrder.length - 1) * 30 : 0;\n const maxOffsetX = availW - w;\n const maxOffsetY = availH - h;\n // Position hints\n if (initialPosition === 'top-right') {\n return { x: window.innerWidth - w - padding, y: padding, w, h };\n }\n if (initialPosition === 'top-left') {\n return { x: sw + padding, y: padding, w, h };\n }\n return {\n x: sw + Math.max(padding, (availW - w) / 2 + padding) + Math.min(offset, Math.max(0, maxOffsetX)),\n y: Math.max(padding, (availH - h) / 2) + Math.min(offset, Math.max(0, maxOffsetY)),\n w, h,\n };\n }, [size]);\n\n const interceptedRef = useRef(false);\n if (!open) interceptedRef.current = false;\n\n useEffect(() => {\n if (!open) return;\n modalDepthRef.inc();\n modalStack.push(modalId);\n activateModal(modalId);\n isNested.current = false; // All modals are independent top-level windows\n setZIndex(getZForModal(modalId));\n // Listen for reorder events to update z-index\n const onReorder = () => {\n setZIndex(getZForModal(modalId));\n };\n // Split view: tile modals side by side (utility, widget, and pinned\n // windows are excluded — those manage their own placement).\n const onSplitView = () => {\n if (allowPinOnTop || widget) return;\n // Count tileable windows for layout — exclude both utility and widget.\n const allPanels = document.querySelectorAll('[data-modal-panel]');\n let nonUtilityCount = 0;\n let myNonUtilIdx = -1;\n activationOrder.forEach((id, _i) => {\n const panel = Array.from(allPanels).find(p => p.getAttribute('data-modal-id') === id);\n if (panel && !panel.hasAttribute('data-utility') && !panel.hasAttribute('data-widget')) {\n if (id === modalId) myNonUtilIdx = nonUtilityCount;\n nonUtilityCount++;\n }\n });\n const count = nonUtilityCount;\n if (count < 2) return;\n const myIdx = myNonUtilIdx;\n if (myIdx < 0) return;\n const a = workArea();\n // Edge-to-edge tiling: distribute pixels exactly so the rightmost column\n // ends on the work-area edge instead of leaving a rounding gap.\n const baseW = Math.floor(a.w / count);\n const remainder = a.w - baseW * count;\n const colW = baseW + (myIdx < remainder ? 1 : 0);\n const xOffset = myIdx * baseW + Math.min(myIdx, remainder);\n setBox({ x: a.x + xOffset, y: a.y, w: colW, h: a.h });\n setMaximized(false);\n };\n\n // Center window on double-click from taskbar\n const onCenter = (e: Event) => {\n const label = (e as CustomEvent).detail?.label;\n if (!label) return;\n const titleEl = panelRef.current?.querySelector('.text-lg, .text-sm');\n if (!titleEl?.textContent?.includes(label)) return;\n activateModal(modalId);\n const taskbarH = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-height')) || 0;\n const taskbarW = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--taskbar-width')) || 0;\n const tbPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n const leftOff = tbPos === 'left' ? taskbarW : 0;\n const rightOff = tbPos === 'right' ? taskbarW : 0;\n const availW = window.innerWidth - leftOff - rightOff;\n const availH = window.innerHeight - taskbarH;\n // Clamp size to viewport if bigger\n const w = Math.min(boxRef.current.w, availW - 40);\n const h = Math.min(boxRef.current.h, availH - 40);\n const x = leftOff + (availW - w) / 2;\n const y = (tbPos === 'top' ? taskbarH : 0) + (availH - h) / 2;\n setBox({ x, y, w, h });\n setMaximized(false);\n };\n // Context menu from taskbar right-click\n const onCtxMenu = (e: Event) => {\n const { label, x, y } = (e as CustomEvent).detail || {};\n if (!label) return;\n const titleEl = panelRef.current?.querySelector('.text-lg, .text-sm');\n if (!titleEl?.textContent?.includes(label)) return;\n activateModal(modalId);\n setWindowMenu({ x, y });\n };\n\n window.addEventListener('modal-reorder', onReorder);\n window.addEventListener('modal-split-view', onSplitView);\n window.addEventListener('modal-center', onCenter);\n window.addEventListener('modal-context-menu', onCtxMenu);\n return () => {\n modalDepthRef.dec();\n const idx = modalStack.indexOf(modalId);\n if (idx !== -1) modalStack.splice(idx, 1);\n const aidx = activationOrder.indexOf(modalId);\n if (aidx !== -1) { activationOrder.splice(aidx, 1); activeListeners.forEach(fn => fn()); }\n window.removeEventListener('modal-reorder', onReorder);\n window.removeEventListener('modal-split-view', onSplitView);\n window.removeEventListener('modal-center', onCenter);\n window.removeEventListener('modal-context-menu', onCtxMenu);\n // Notify remaining modals to recalc z-index\n window.dispatchEvent(new CustomEvent('modal-reorder'));\n };\n }, [open, modalId, calcMaximized]);\n\n // Restore saved position from window position store\n const boxKey = windowKey || copyText || null;\n const [box, setBox] = useState(() => {\n if (boxKey && _windowPositions[boxKey]) {\n const saved = { ..._windowPositions[boxKey] };\n // If dimensions are specified, enforce them (override cached size but keep position)\n if (dimensions) { saved.w = dimensions[0]; if (!autoHeight) saved.h = dimensions[1]; }\n return saved;\n }\n return initialBox ? { x: initialBox.x, y: initialBox.y, w: initialBox.w, h: initialBox.h } : calcWindowed();\n });\n const [maximized, setMaximized] = useState(false);\n const boxRef = useRef(box);\n boxRef.current = box;\n\n // Persist box position on changes (debounced to localStorage)\n useEffect(() => {\n if (open && boxKey) {\n _windowPositions[boxKey] = box;\n _savePositionsDebounced();\n }\n }, [box, open, boxKey]);\n\n // Sync on viewport resize when maximized\n useEffect(() => {\n if (!open) return;\n const sync = () => { if (maximized) setBox(calcMaximized()); };\n window.addEventListener('resize', sync);\n // Only observe DOM changes when maximized — avoids unnecessary re-renders\n let observer: MutationObserver | null = null;\n if (maximized) {\n observer = new MutationObserver(sync);\n observer.observe(document.body, { childList: true, subtree: false, attributes: true, attributeFilter: ['class'] });\n }\n return () => { window.removeEventListener('resize', sync); observer?.disconnect(); };\n }, [open, maximized, calcMaximized]);\n\n // Reset when modal opens — skip if we have a saved position\n useEffect(() => {\n if (!open) return;\n setTouched(false);\n closingRef.current = false;\n // If we have a saved position in the store, restore it instead of resetting\n if (boxKey && _windowPositions[boxKey]) {\n setBox({ ..._windowPositions[boxKey] });\n return;\n }\n if (initialBox) {\n setBox({ x: initialBox.x, y: initialBox.y, w: initialBox.w, h: initialBox.h });\n setMaximized(initialBox.maximized);\n }\n // Don't call calcWindowed() here — useState already set the initial position\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-detect dirty\n useEffect(() => {\n if (!open || dirty !== 'auto') return;\n const handler = (e: Event) => { if (panelRef.current?.contains(e.target as HTMLElement)) setTouched(true); };\n document.addEventListener('input', handler, true);\n document.addEventListener('change', handler, true);\n return () => { document.removeEventListener('input', handler, true); document.removeEventListener('change', handler, true); };\n }, [open, dirty]);\n\n const isDirty = dirty === 'auto' ? touched : dirty === true;\n\n const guardedClose = useCallback(async () => {\n if (closingRef.current) return;\n if (isDirty) {\n closingRef.current = true;\n const ok = await confirm({ title: 'Discard changes?', message: 'You have unsaved changes. Are you sure you want to close? All changes will be lost.', confirmLabel: 'Discard', cancelLabel: 'Keep Editing', variant: 'warning' });\n closingRef.current = false;\n if (!ok) return;\n }\n onClose();\n }, [isDirty, onClose]);\n\n // Pre-snap box: if the user drags a window that's currently snapped to an\n // edge, restore it to its previous \"natural\" size so dragging it across\n // the screen feels right. Set on snap-drop, consumed on next drag start.\n const preSnapBoxRef = useRef<Box | null>(null);\n\n // ── Drag ──\n const startDrag = useCallback((e: React.PointerEvent) => {\n if (e.button !== 0) return;\n if ((e.target as HTMLElement).closest('button, input, a, kbd, select, textarea')) return;\n setWindowMenu(null);\n activateModal(modalId);\n e.preventDefault();\n const sx = e.clientX, sy = e.clientY;\n const panel = panelRef.current;\n const rect = panel?.getBoundingClientRect();\n\n // If this window is currently snapped, restore its pre-snap dimensions\n // and reposition so the cursor lands roughly in the title bar.\n let ox: number, oy: number, actualH: number, actualW: number;\n if (preSnapBoxRef.current) {\n const restore = preSnapBoxRef.current;\n preSnapBoxRef.current = null;\n actualW = restore.w;\n actualH = restore.h;\n // Center the restored window horizontally on the cursor; keep title\n // bar at cursor Y.\n const offsetX = rect ? Math.min(Math.max(20, e.clientX - rect.left), restore.w - 20) : restore.w / 2;\n ox = e.clientX - offsetX;\n oy = e.clientY - 12;\n if (panel) {\n panel.style.width = `${actualW}px`;\n panel.style.height = `${actualH}px`;\n panel.style.left = `${ox}px`;\n panel.style.top = `${oy}px`;\n }\n } else {\n ox = rect ? rect.left : boxRef.current.x;\n oy = rect ? rect.top : boxRef.current.y;\n actualH = rect ? rect.height : boxRef.current.h;\n actualW = rect ? rect.width : boxRef.current.w;\n }\n setMaximized(false);\n setBox(b => ({ ...b, x: ox, y: oy, w: actualW, h: actualH }));\n\n // Snap zone tracking — only re-render preview when zone CHANGES.\n let currentZone: SnapZone | null = null;\n\n const move = (ev: PointerEvent) => {\n const nx = ox + ev.clientX - sx;\n const ny = Math.max(0, oy + ev.clientY - sy);\n if (panel) {\n panel.style.left = `${nx}px`;\n panel.style.top = `${ny}px`;\n }\n boxRef.current = { ...boxRef.current, x: nx, y: ny };\n\n // Snap detection: ignore for widgets so they keep free-positioning.\n if (!widget) {\n const zone = detectSnapZone(ev.clientX, ev.clientY);\n if (zone !== currentZone) {\n currentZone = zone;\n if (zone) showSnapPreview(calcSnapBox(zone));\n else hideSnapPreview();\n }\n }\n };\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n hideSnapPreview();\n const finalBox = { ...boxRef.current };\n\n // Snap drop: lock to the snap target, save the pre-snap size for next drag.\n if (!widget && currentZone) {\n preSnapBoxRef.current = { x: ox, y: oy, w: actualW, h: actualH };\n setBox(calcSnapBox(currentZone));\n return;\n }\n\n // For widgets, determine anchor side based on center position vs viewport midpoint\n if (widget) {\n const centerX = finalBox.x + finalBox.w / 2;\n const mid = window.innerWidth / 2;\n setWidgetAnchor(centerX > mid ? 'right' : 'left');\n }\n // Sync React state once on drop — keep inline position until React re-renders\n setBox(finalBox);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }, []);\n\n // ── Resize ──\n const startResizeCorner = useCallback((e: React.PointerEvent, corner: 'se' | 'sw' | 'ne' | 'nw' | 'n' | 's' | 'e' | 'w') => {\n if (e.button !== 0) return;\n e.preventDefault(); e.stopPropagation();\n const sx = e.clientX, sy = e.clientY;\n const panel = panelRef.current;\n // Always use the live rendered rect as the origin so we don't drift\n // when the panel was previously maximised or pinned.\n const rect = panel?.getBoundingClientRect();\n const ox = rect ? rect.left : boxRef.current.x;\n const oy = rect ? rect.top : boxRef.current.y;\n const ow = rect ? rect.width : boxRef.current.w;\n const oh = rect ? rect.height : boxRef.current.h;\n const MIN_W = 384;\n const MIN_H = 400;\n const isWest = corner === 'sw' || corner === 'nw' || corner === 'w';\n const isNorth = corner === 'ne' || corner === 'nw' || corner === 'n';\n const isEast = corner === 'se' || corner === 'ne' || corner === 'e';\n const isSouth = corner === 'se' || corner === 'sw' || corner === 's';\n setMaximized(false);\n // Pin the box to the actual rendered coordinates immediately so the\n // panel does not jump if it was previously maximised.\n setBox({ x: ox, y: oy, w: ow, h: oh });\n boxRef.current = { x: ox, y: oy, w: ow, h: oh };\n\n const compute = (dx: number, dy: number) => {\n let nx = ox, ny = oy, nw = ow, nh = oh;\n if (isEast) nw = Math.max(MIN_W, ow + dx);\n if (isSouth) nh = Math.max(MIN_H, oh + dy);\n if (isWest) {\n const targetW = Math.max(MIN_W, ow - dx);\n // Anchor the east edge: as W grows/shrinks, x moves opposite so the\n // east edge (ox + ow) stays fixed.\n nx = ox + ow - targetW;\n nw = targetW;\n }\n if (isNorth) {\n const targetH = Math.max(MIN_H, oh - dy);\n ny = oy + oh - targetH;\n nh = targetH;\n }\n return { x: nx, y: ny, w: nw, h: nh };\n };\n\n let raf = 0;\n let pending: { x: number; y: number; w: number; h: number } | null = null;\n const flush = () => {\n raf = 0;\n if (!pending) return;\n const next = pending; pending = null;\n boxRef.current = next;\n setBox(next);\n };\n const move = (ev: PointerEvent) => {\n pending = compute(ev.clientX - sx, ev.clientY - sy);\n if (!raf) raf = requestAnimationFrame(flush);\n };\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n if (raf) cancelAnimationFrame(raf);\n flush();\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }, []);\n\n const reset = () => { setMaximized(true); setBox(calcMaximized()); };\n const handleMinimize = () => {\n const saved = { ...boxRef.current, maximized };\n if (onMinimize) {\n onMinimize(saved);\n } else {\n const label = typeof title === 'string' ? title : (panelRef.current?.querySelector('.text-lg')?.textContent || 'Window');\n const route = window.location.pathname;\n globalMinimize({\n id: copyText || label || modalId, type: 'modal', label, route, savedBox: saved,\n });\n onClose();\n }\n };\n\n // ── Submit modal ──\n const submitModal = useCallback(() => {\n const panel = panelRef.current;\n if (!panel) return;\n const form = panel.querySelector('form');\n if (form) { form.requestSubmit(); } else {\n const btn = panel.querySelector<HTMLButtonElement>('button[type=\"submit\"], button[data-submit], button.bg-green-600, button.bg-blue-600');\n if (btn && !btn.disabled) btn.click();\n }\n }, []);\n\n // Cmd+Enter submits, bare Enter prevented — only for topmost modal\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (activationOrder[activationOrder.length - 1] !== modalId) return;\n if (e.key === 'Enter') {\n const target = e.target as HTMLElement;\n if (target.tagName === 'TEXTAREA' || target.isContentEditable) return;\n if (e.metaKey || e.ctrlKey) { e.preventDefault(); submitModal(); }\n else if (target.tagName === 'INPUT' && target.closest('form')) {\n // Let Enter submit the form naturally (e.g. password fields)\n return;\n }\n else { e.preventDefault(); }\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [open, submitModal, modalId]);\n\n // Cmd+S save-and-stay, Alt+Shift+D duplicate — only for topmost modal\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (activationOrder[activationOrder.length - 1] !== modalId) return;\n if ((e.metaKey || e.ctrlKey) && e.key === 's') { e.preventDefault(); document.dispatchEvent(new CustomEvent('modal-save')); setTouched(false); }\n else if (e.altKey && e.shiftKey && (e.code === 'KeyD' || e.key === 'D' || e.key === 'd')) { e.preventDefault(); document.dispatchEvent(new CustomEvent('modal-duplicate')); }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [open]);\n\n // ESC → close only the topmost modal (with dirty guard)\n useEffect(() => {\n if (!open) return;\n // Widgets (Calculator, Weather, Currency, Pomodoro, World Clock, etc.) are\n // ambient — ESC shouldn't close them. They have their own right-click Close.\n if (widget) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && activationOrder[activationOrder.length - 1] === modalId) {\n e.preventDefault(); e.stopPropagation(); guardedClose();\n }\n };\n window.addEventListener('keydown', handler, true);\n return () => window.removeEventListener('keydown', handler, true);\n }, [open, guardedClose, modalId, widget]);\n\n // J/K navigation\n const hasNav = open && (onNext !== undefined || onPrev !== undefined);\n const showBoundaryToast = useCallback((edge: 'top' | 'bottom') => {\n const existing = document.getElementById('nav-boundary-toast');\n if (existing) existing.remove();\n const lines = edge === 'bottom'\n ? [\"That's the last one, chief.\", \"You've hit rock bottom... of the list.\", \"End of the line, buddy.\", \"Nothing left. Go outside.\", \"Congratulations, you scrolled to the void.\", \"There's no more. I checked.\", \"You've reached the edge of the known universe.\", \"Plot twist: there is no next one.\", \"Even scrolling has limits. Unlike your ambition.\", \"Last one. Time to touch grass.\"]\n : [\"Already at the top. Overachiever.\", \"There is no item above this. Trust me.\", \"You're #1. Literally.\", \"Can't go higher. You've peaked.\", \"This is it. The summit. The top.\", \"First item. No VIP lounge above this.\", \"Going up? Nope. Elevator's broken.\", \"You want negative indexes? Bold.\", \"Top of the list. Top of the world.\", \"The only way is down from here.\"];\n const msg = lines[Math.floor(Math.random() * lines.length)];\n const toast = document.createElement('div');\n toast.id = 'nav-boundary-toast';\n toast.className = 'fixed bottom-6 left-1/2 -translate-x-1/2 z-[9999] bg-gray-900 text-white px-5 py-2.5 rounded-lg shadow-lg text-sm font-medium transition-opacity duration-300';\n toast.textContent = msg;\n document.body.appendChild(toast);\n setTimeout(() => { toast.style.opacity = '0'; setTimeout(() => toast.remove(), 300); }, 2000);\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (activationOrder[activationOrder.length - 1] !== modalId) 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 if (e.key === 'j' && hasNav) { e.preventDefault(); if (onNext) onNext(); else showBoundaryToast('bottom'); }\n if (e.key === 'k' && hasNav) { e.preventDefault(); if (onPrev) onPrev(); else showBoundaryToast('top'); }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n }, [open, onNext, onPrev, hasNav, showBoundaryToast, modalId]);\n\n // When minimized, stay mounted but hidden (preserves all state)\n if (!open || interceptedRef.current) return null;\n\n // ── Full window — render via portal when nested to escape parent overflow:hidden ──\n const content = (\n <div>\n {/* Window */}\n <div ref={panelRef} data-modal-panel data-modal-id={modalId} data-window-key={windowKey || undefined} {...(allowPinOnTop ? { 'data-utility': '' } : {})} {...(widget ? { 'data-widget': '' } : {})}\n className={`fixed rounded-lg flex flex-col overflow-hidden group ${widget ? (isActive ? 'shadow-2xl' : 'shadow-lg') : `border ${isActive ? 'shadow-2xl border-gray-200' : 'shadow-lg border-gray-300'}`}`}\n onMouseDown={(e) => {\n setWindowMenu(null);\n // Don't activate if the click is inside a child modal (nested portal)\n const targetPanel = (e.target as HTMLElement).closest('[data-modal-panel]');\n if (targetPanel && targetPanel !== panelRef.current) return;\n if (!(e.target as HTMLElement).closest('button, input, a, select, textarea')) {\n activateModal(modalId);\n }\n }}\n style={isMobile ? {\n // Mobile fullscreen: ignore stored box, fill viewport down to bottom\n // nav. Widgets stay hidden on mobile.\n zIndex: zIndex + 1,\n top: 0, left: 0, right: 0,\n bottom: 'var(--mobile-bottom-nav, 56px)',\n width: 'auto', height: 'auto',\n transform: `translateX(${swipeX}px)`,\n transition: swipeDragging ? 'none' : 'transform 180ms ease-out',\n ...(widget ? { display: 'none' } : {}),\n ...(zIndex < 0 ? { display: 'none' } : {}),\n } : {\n zIndex: pinnedOnTop ? 999 : zIndex + 1, width: box.w, height: autoHeight ? 'auto' : box.h, top: box.y,\n ...(autoHeight ? {\n // Widgets must fit content exactly (Weather, Currency, etc.) —\n // the 240 px floor only applies to non-widget app windows where\n // a near-empty body would look broken.\n minHeight: `${autoMinHeight ?? (widget ? 0 : 240)}px`,\n maxHeight: `calc(100vh - var(--taskbar-height, 0px) - 24px)`,\n } : {}),\n ...(widget && widgetAnchor === 'right' ? { right: window.innerWidth - box.x - box.w } : { left: box.x }),\n ...(zIndex < 0 && !pinnedOnTop ? { display: 'none' } : {}),\n }}\n >\n {/* Mobile swipe-from-left-edge gesture zone. Captures pointerdown only\n * in the leftmost 22px so it doesn't interfere with normal taps or\n * scrolls in the body. */}\n {isMobile && !widget && (\n <div\n onPointerDown={handleEdgePointerDown}\n className=\"absolute top-0 bottom-0 left-0 w-[22px] z-[5]\"\n style={{ touchAction: 'pan-y' }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* HEADER — draggable on desktop, hidden on mobile (apps go fullscreen\n * with a swipe-from-left-edge gesture to close). */}\n {widget ? (\n /* Widget: no title bar — drag via body, close via right-click context menu */\n null\n ) : isMobile ? (\n null\n ) : compact ? (\n /* Compact: smaller title bar with title + close only */\n <div onPointerDown={startDrag}\n className={`flex items-center justify-between px-3 py-1.5 border-b border-gray-200 shrink-0 cursor-move select-none rounded-t-lg ${isActive ? 'backdrop-blur-sm' : ''}`}\n style={{ touchAction: 'none', backgroundColor: isActive ? `rgb(var(--window-header-rgb) / var(--active-header-opacity, 0.8))` : `rgb(var(--window-header-rgb) / var(--inactive-header-opacity, 0.7))` }}>\n <div className=\"text-sm font-medium min-w-0 flex-1 truncate flex items-center gap-1.5\" style={{ color: isActive ? 'rgb(17 24 39)' : 'rgb(156 163 175)' }}>\n {renderIconButton()}\n <span className=\"truncate\">{displayTitle}</span>\n </div>\n <div className=\"flex items-center gap-1 shrink-0 ml-2\">\n {allowPinOnTop && (\n <button onClick={() => setPinnedOnTop(p => !p)} title={pinnedOnTop ? 'Unpin from top' : 'Pin on top'}\n className={`p-0.5 rounded hover:bg-gray-200 ${pinnedOnTop ? 'text-blue-600' : 'text-gray-400 hover:text-gray-600'}`}>\n <svg className=\"h-3 w-3\" fill={pinnedOnTop ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" /></svg>\n </button>\n )}\n <button type=\"button\" onClick={guardedClose} className=\"rounded p-0.5 text-gray-400 hover:text-gray-600 hover:bg-gray-200\">\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : appStyle ? (\n /* App style: small title bar like compact, but keeps minimize/maximize for full window control. */\n <div onPointerDown={startDrag}\n className={`flex items-center justify-between px-3 py-1.5 border-b border-gray-200 shrink-0 cursor-move select-none rounded-t-lg ${isActive ? 'backdrop-blur-sm' : ''}`}\n style={{ touchAction: 'none', backgroundColor: isActive ? `rgb(var(--window-header-rgb) / var(--active-header-opacity, 0.8))` : `rgb(var(--window-header-rgb) / var(--inactive-header-opacity, 0.7))` }}>\n <div className=\"text-sm font-medium min-w-0 flex-1 truncate flex items-center gap-1.5\" style={{ color: isActive ? 'rgb(17 24 39)' : 'rgb(156 163 175)' }}>\n {renderIconButton()}\n <span className=\"truncate\">{displayTitle}</span>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 ml-2\">\n {allowPinOnTop && (\n <button onClick={() => setPinnedOnTop(p => !p)} title={pinnedOnTop ? 'Unpin from top' : 'Pin on top'}\n className={`p-0.5 rounded hover:bg-gray-200 ${pinnedOnTop ? 'text-blue-600' : 'text-gray-400 hover:text-gray-600'}`}>\n <svg className=\"h-3 w-3\" fill={pinnedOnTop ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" /></svg>\n </button>\n )}\n <button onClick={() => { const idx = activationOrder.indexOf(modalId); if (idx !== -1) activationOrder.splice(idx, 1); activeListeners.forEach(fn => fn()); window.dispatchEvent(new CustomEvent('modal-reorder')); }} title=\"Minimize\" className=\"text-gray-400 hover:text-gray-600 px-1 py-0.5 rounded hover:bg-gray-200 text-xs leading-none\">─</button>\n <button onClick={() => { if (maximized) { setMaximized(false); setBox(calcWindowed()); } else { reset(); } }} title={maximized ? 'Windowed' : 'Maximize'} className=\"text-gray-400 hover:text-gray-600 px-1 py-0.5 rounded hover:bg-gray-200 text-xs leading-none\">{maximized ? '❐' : '⤢'}</button>\n <button type=\"button\" onClick={guardedClose} className=\"rounded p-0.5 text-gray-400 hover:text-gray-600 hover:bg-gray-200\">\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : (\n <div onPointerDown={startDrag}\n className={`flex items-center justify-between px-4 py-2.5 border-b border-gray-200 shrink-0 cursor-move select-none rounded-t-lg ${isActive ? 'backdrop-blur-sm' : ''}`}\n style={{ touchAction: 'none', backgroundColor: isActive ? `rgb(var(--window-header-rgb) / var(--active-header-opacity, 0.8))` : `rgb(var(--window-header-rgb) / var(--inactive-header-opacity, 0.7))` }}>\n <div className=\"text-lg font-semibold min-w-0 flex-1 truncate flex items-center gap-2\" style={{ color: isActive ? 'var(--window-title-active, rgb(17 24 39))' : 'var(--window-title-inactive, rgb(156 163 175))' }}>\n {renderIconButton()}\n <span className=\"truncate\">{displayTitle}</span>\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0 ml-4\">\n {hasNav && (\n <span className=\"flex items-center gap-1 mr-1 text-[10px] text-gray-400\">\n <kbd className=\"rounded border border-gray-300 bg-gray-200 px-1.5 py-0.5 font-medium text-gray-500\">K</kbd><span>Prev</span>\n <kbd className=\"rounded border border-gray-300 bg-gray-200 px-1.5 py-0.5 font-medium ml-1 text-gray-500\">J</kbd><span>Next</span>\n </span>\n )}\n {allowPinOnTop && (\n <button onClick={() => setPinnedOnTop(p => !p)} title={pinnedOnTop ? 'Unpin from top' : 'Pin on top'}\n className={`text-xs px-2 py-1 rounded hover:bg-gray-200 ${pinnedOnTop ? 'text-blue-600' : 'text-gray-400 hover:text-gray-600'}`}>\n <svg className=\"h-3.5 w-3.5\" fill={pinnedOnTop ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" /></svg>\n </button>\n )}\n <button onClick={() => { const idx = activationOrder.indexOf(modalId); if (idx !== -1) activationOrder.splice(idx, 1); activeListeners.forEach(fn => fn()); window.dispatchEvent(new CustomEvent('modal-reorder')); }} title=\"Minimize\" className=\"text-gray-400 hover:text-gray-600 text-xs px-2 py-1 rounded hover:bg-gray-200\">─</button>\n <button onClick={() => { if (maximized) { setMaximized(false); setBox(calcWindowed()); } else { reset(); } }} title={maximized ? 'Windowed' : 'Maximize'} className=\"text-gray-400 hover:text-gray-600 text-xs px-2 py-1 rounded hover:bg-gray-200\">{maximized ? '❐' : '⤢'}</button>\n <kbd className=\"rounded border border-gray-300 bg-gray-200 px-1.5 py-0.5 text-[10px] font-medium text-gray-400\">ESC</kbd>\n <button type=\"button\" onClick={guardedClose} className=\"rounded-md text-gray-400 hover:text-gray-600\">\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n )}\n\n {/* BODY */}\n <ModalIdContext.Provider value={modalId}>\n <ModalActionsContext.Provider value={{ rightRef: actionsRef as React.RefObject<HTMLDivElement | null>, leftRef: actionsLeftRef as React.RefObject<HTMLDivElement | null>, notify: () => setHasActions(true), active: isActive, isDirty }}>\n <div\n {...(widget ? { onPointerDown: startDrag, onContextMenu: (e: React.MouseEvent) => { e.preventDefault(); setCtxMenu({ x: e.clientX, y: e.clientY }); } } : {})}\n className={`flex-1 min-h-0 flex flex-col ${widget ? 'p-0 cursor-move' : appStyle ? 'p-0' : compact ? 'p-2' : 'p-4'} ${widget ? '' : 'backdrop-blur-sm'} ${(bodyScroll === false || appStyle) ? 'overflow-hidden' : 'overflow-y-auto'} ${widget ? 'rounded-lg select-none' : ''}`}\n style={{ ...(widget ? { touchAction: 'none' } : {}), backgroundColor: widget ? 'transparent' : (isActive ? `rgb(var(--window-content-rgb) / var(--active-content-opacity, 0.9))` : `rgb(var(--window-content-rgb) / var(--inactive-content-opacity, 0.8))`) }}>\n {children}\n </div>\n </ModalActionsContext.Provider>\n </ModalIdContext.Provider>\n\n {/* Widget right-click context menu */}\n {widget && ctxMenu && (\n <PopupMenu minWidth={160} style={{ left: ctxMenu.x, top: ctxMenu.y }} onClose={() => setCtxMenu(null)}>\n <PopupMenuItem onClick={() => { setCtxMenu(null); window.dispatchEvent(new CustomEvent('widget-open-settings', { detail: modalId })); }}>\n Settings\n </PopupMenuItem>\n <PopupMenuDivider />\n {widgetMenu && (\n <>\n {widgetMenu}\n <PopupMenuDivider />\n </>\n )}\n <PopupMenuItem onClick={() => { setCtxMenu(null); setPinnedOnTop(p => !p); }}>\n <span className=\"flex-1\">Always on Top</span>\n {pinnedOnTop && <svg className=\"h-4 w-4 text-blue-600 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" /></svg>}\n </PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem onClick={() => { setCtxMenu(null); guardedClose(); }}>\n Close\n </PopupMenuItem>\n </PopupMenu>\n )}\n\n {/* FOOTER — always rendered; visible when footer prop or portal actions exist; hidden for widgets/compact */}\n <div onPointerDown={startDrag}\n className={`px-4 py-2 border-t border-gray-200 shrink-0 flex items-center justify-between text-xs select-none cursor-move${isActive ? ' backdrop-blur-sm' : ''}${widget || compact || appStyle || isMobile || (!footer && !hasActions && !actions && !actionsLeft) ? ' hidden' : ''}`}\n style={{ touchAction: 'none', backgroundColor: isActive ? `rgb(var(--window-footer-rgb) / var(--active-header-opacity, 0.8))` : `rgb(var(--window-footer-rgb) / var(--inactive-header-opacity, 0.7))` }}>\n <div className=\"flex items-center gap-2 min-w-0\">\n {actionsLeft}\n <div ref={actionsLeftRef} data-modal-actions-left className=\"flex items-center gap-2\" />\n {footer}\n </div>\n <div className=\"flex items-center gap-2 ml-auto\">\n <div ref={actionsRef} data-modal-actions className=\"flex items-center gap-2\" />\n {actions}\n </div>\n </div>\n\n {/* RESIZE HANDLES — corners and edges (hidden in widget/mobile mode; only rendered when active to avoid z-index bleed on inactive windows) */}\n {!widget && !isMobile && isActive && <>\n <div onPointerDown={e => startResizeCorner(e, 'se')} className=\"absolute bottom-0 right-0 w-3 h-3 cursor-nwse-resize z-10\" />\n <div onPointerDown={e => startResizeCorner(e, 'sw')} className=\"absolute bottom-0 left-0 w-3 h-3 cursor-nesw-resize z-10\" />\n <div onPointerDown={e => startResizeCorner(e, 'ne')} className=\"absolute top-0 right-0 w-3 h-3 cursor-nesw-resize z-10\" />\n <div onPointerDown={e => startResizeCorner(e, 'nw')} className=\"absolute top-0 left-0 w-3 h-3 cursor-nwse-resize z-10\" />\n <div onPointerDown={e => startResizeCorner(e, 'n')} className=\"absolute top-0 left-3 right-3 h-1 cursor-ns-resize\" />\n <div onPointerDown={e => startResizeCorner(e, 's')} className=\"absolute bottom-0 left-3 right-3 h-1 cursor-ns-resize\" />\n <div onPointerDown={e => startResizeCorner(e, 'e')} className=\"absolute top-3 bottom-3 right-0 w-1 cursor-ew-resize\" />\n <div onPointerDown={e => startResizeCorner(e, 'w')} className=\"absolute top-3 bottom-3 left-0 w-1 cursor-ew-resize\" />\n </>}\n </div>\n </div>\n );\n\n // Window context menu\n const windowMenuEl = windowMenu && (\n <PopupMenu style={{ left: windowMenu.x, top: windowMenu.y }} onClose={() => setWindowMenu(null)} minWidth={160}>\n {!widget && !compact && (<>\n <PopupMenuItem onClick={() => {\n const idx = activationOrder.indexOf(modalId);\n if (idx !== -1) activationOrder.splice(idx, 1);\n activeListeners.forEach(fn => fn());\n window.dispatchEvent(new CustomEvent('modal-reorder'));\n setWindowMenu(null);\n }}>\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=\"M19.5 12h-15\" /></svg>\n Minimize\n </PopupMenuItem>\n {maximized ? (\n <PopupMenuItem onClick={() => { setMaximized(false); setBox(calcWindowed()); setWindowMenu(null); }}>\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 4.5v15m6-15v15M4.5 9h15M4.5 15h15\" /></svg>\n Windowed\n </PopupMenuItem>\n ) : (\n <PopupMenuItem onClick={() => { reset(); setWindowMenu(null); }}>\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 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" /></svg>\n Maximize\n </PopupMenuItem>\n )}\n\n </>)}\n {allowPinOnTop && (\n <PopupMenuItem onClick={() => { setPinnedOnTop(p => !p); setWindowMenu(null); }}>\n <svg className={`h-4 w-4 ${pinnedOnTop ? 'text-blue-600' : 'text-gray-400'}`} fill={pinnedOnTop ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" /></svg>\n {pinnedOnTop ? 'Unpin from Top' : 'Pin on Top'}\n </PopupMenuItem>\n )}\n {/* Custom menu items registered by child components */}\n {(_extraMenuItems[modalId] || []).length > 0 && (<>\n {(_extraMenuItems[modalId] || []).map((item, i) => (\n <PopupMenuItem key={i} onClick={() => { setWindowMenu(null); item.onClick(); }}>\n {item.icon}\n {item.label}\n </PopupMenuItem>\n ))}\n </>)}\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={() => { setWindowMenu(null); guardedClose(); }}>\n <XMarkIcon className=\"h-4 w-4\" />\n Close\n </PopupMenuItem>\n </PopupMenu>\n );\n\n // Always portal to body — ensures DOM persists when hidden/minimized\n return createPortal(<>{content}{windowMenuEl}</>, document.body);\n}\n","export default function LoadingSpinner() {\n return <div className=\"flex items-center justify-center p-8 text-sm text-gray-400\">Loading...</div>;\n}\n","import { createContext, useContext, useState, useCallback, useEffect, useLayoutEffect, useRef, useMemo, useSyncExternalStore, cloneElement, isValidElement, Suspense, type ReactNode, type ReactElement } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { createPortal } from 'react-dom';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport apiClient, { isShellApiClientConfigured } from '../api/client';\nimport { WINDOW_REGISTRY, isPageEntry, isEntityEntry, type PageRegistryEntry, type ModalRegistryEntry } from '../windowRegistry/types';\nimport Modal, { triggerSplitView, modalDepthRef, getActiveModalId, subscribeActive, activateModal, useWindowMenuItem } from './Modal';\nimport PartNumberDetailPopup from './PartNumberDetailPopup';\nimport LoadingSpinner from './LoadingSpinner';\nimport { navIcons } from '../shell-config/nav';\n\n\ninterface SavedBox {\n x: number; y: number; w: number; h: number; maximized: boolean;\n}\n\nexport interface MinimizedItem {\n id: string;\n type: 'part_number' | 'modal' | 'page';\n label: string;\n /** Route path for icon lookup (e.g. '/orders', '/invoices') */\n route?: string;\n savedBox?: SavedBox;\n /** Entity registry key (e.g. 'order', 'manufacturer') for restore */\n entityType?: string;\n /** Entity UUID for API fetch on cross-page restore */\n entityId?: string;\n /** Cached entity data for instant rendering while refetch happens */\n entitySnapshot?: any;\n}\n\ninterface MinimizedContextType {\n openWindows: MinimizedItem[];\n openEntity: (entityType: string, entityId: string, snapshot?: any, label?: string, route?: string) => void;\n openPage: (path: string) => void;\n closeEntity: (id: string) => void;\n /** @deprecated kept for backward compat — aliases openEntity/closeEntity */\n minimize: (item: MinimizedItem) => void;\n items: MinimizedItem[];\n restore: (item: MinimizedItem) => void;\n remove: (id: string) => void;\n restoreIfMinimized: (label: string) => boolean;\n openItems: MinimizedItem[];\n}\n\nconst MinimizedContext = createContext<MinimizedContextType>({\n openWindows: [],\n openEntity: () => {},\n openPage: () => {},\n closeEntity: () => {},\n minimize: () => {},\n items: [],\n restore: () => {},\n remove: () => {},\n restoreIfMinimized: () => false,\n openItems: [],\n});\n\nexport function useWindowManager() {\n return useContext(MinimizedContext);\n}\n\nfunction RestoredPartNumber({ partNumber, savedBox, onClose, onMinimize }: { partNumber: string; savedBox?: SavedBox; onClose: () => void; onMinimize: (sb: SavedBox) => void }) {\n const { data: pn, isLoading } = useQuery({\n queryKey: ['part-number-lookup', partNumber],\n enabled: isShellApiClientConfigured(),\n queryFn: () => apiClient.get('/products/part-numbers/', { params: { search: partNumber, page_size: 1 } }).then(r => {\n const results = r.data?.results ?? r.data ?? [];\n return results.find((p: any) => p.part_number === partNumber) || results[0] || null;\n }),\n });\n\n return (\n <Modal\n open={true}\n onClose={onClose}\n onMinimize={onMinimize}\n initialBox={savedBox}\n size=\"2xl\"\n title={pn ? (\n <span className=\"flex items-center gap-2\">\n {pn.part_number}\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${pn.is_active ? 'bg-green-100 text-green-800' : 'bg-gray-300 text-gray-800'}`}>{pn.is_active ? 'Active' : 'Inactive'}</span>\n </span>\n ) : partNumber}\n footer={pn ? (\n <>\n <span className=\"text-gray-500\">{pn.brand_name} · {pn.category_name || 'Wheel'} · {pn.manufacturer_mid || '—'}</span>\n <span className=\"text-gray-400\">Stock: <b className=\"text-gray-700\">{pn.stock_quantity ?? 0}</b></span>\n </>\n ) : undefined}\n >\n {isLoading ? <div className=\"flex items-center justify-center py-12\"><LoadingSpinner /></div> : pn ? <PartNumberDetailPopup pn={pn} /> : <p className=\"text-sm text-gray-500\">Part number not found.</p>}\n </Modal>\n );\n}\n\n/** Universal fav star for any window — pages and entities. Saves to preferences.favorite_documents */\nfunction WindowFavStar({ item }: { item: MinimizedItem }) {\n const queryClient = useQueryClient();\n const { data: profile } = useQuery({ queryKey: ['my-profile-sidebar'], enabled: isShellApiClientConfigured(), queryFn: () => apiClient.get('/auth/me/').then(r => r.data) });\n const favDocs: { entityType: string; entityId: string; label: string }[] = (profile?.preferences || {}).favorite_documents || [];\n\n // For pages, use route as entityType='page' and entityId=route\n const favType = item.type === 'page' ? 'page' : (item.entityType || '');\n const favId = item.type === 'page' ? (item.route || '') : (item.entityId || '');\n const favLabel = item.label;\n\n const isFav = favDocs.some(d => d.entityType === favType && d.entityId === favId);\n\n const toggle = () => {\n const next = isFav\n ? favDocs.filter(d => !(d.entityType === favType && d.entityId === favId))\n : [...favDocs, { entityType: favType, entityId: favId, label: favLabel }];\n apiClient.patch('/auth/me/', { preferences: { favorite_documents: next } }).then(() => {\n queryClient.invalidateQueries({ queryKey: ['my-profile-sidebar'] });\n });\n };\n\n if (!favId) return null;\n\n return (\n <button onClick={toggle} title={isFav ? 'Remove from desktop' : 'Add to desktop'}\n className={`shrink-0 transition-colors ${isFav ? 'text-yellow-500 hover:text-yellow-600' : 'text-gray-300 hover:text-yellow-400'}`}>\n <svg className=\"h-4 w-4\" fill={isFav ? '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\n/** Adds \"Add to Desktop\" / \"Remove from Desktop\" to the window menu */\nfunction DesktopShortcutMenuItem({ item }: { item: MinimizedItem }) {\n const queryClient = useQueryClient();\n const { data: profile } = useQuery({ queryKey: ['my-profile-sidebar'], enabled: isShellApiClientConfigured(), queryFn: () => apiClient.get('/auth/me/').then(r => r.data) });\n const favDocs: { entityType: string; entityId: string; label: string }[] = (profile?.preferences || {}).favorite_documents || [];\n const favType = item.type === 'page' ? 'page' : (item.entityType || '');\n const favId = item.type === 'page' ? (item.route || '') : (item.entityId || '');\n const isFav = favDocs.some(d => d.entityType === favType && d.entityId === favId);\n\n const toggle = useCallback(() => {\n const next = isFav\n ? favDocs.filter(d => !(d.entityType === favType && d.entityId === favId))\n : [...favDocs, { entityType: favType, entityId: favId, label: item.label }];\n apiClient.patch('/auth/me/', { preferences: { favorite_documents: next } }).then(() => {\n queryClient.invalidateQueries({ queryKey: ['my-profile-sidebar'] });\n });\n }, [isFav, favDocs, favType, favId, item.label, queryClient]);\n\n const icon = useMemo(() => (\n <svg className=\"h-4 w-4\" fill={isFav ? '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 ), [isFav]);\n\n useWindowMenuItem(isFav ? 'Remove from Desktop' : 'Add to Desktop', toggle, icon);\n return null;\n}\n\nfunction PageWindow({ item, onClose }: { item: MinimizedItem; onClose: () => void }) {\n const raw = WINDOW_REGISTRY[item.route!];\n if (!raw || !isPageEntry(raw)) return null;\n const entry = raw as PageRegistryEntry;\n const Component = entry.component;\n return (\n <Modal open={true} onClose={onClose} icon={navIcons[item.route!]} title={entry.label} size={entry.size || '2xl'} allowPinOnTop={entry.allowPinOnTop} initialPosition={entry.initialPosition} widget={entry.widget} compact={entry.compact} appStyle={entry.appStyle} autoHeight={entry.autoHeight} autoMinHeight={entry.autoMinHeight} dimensions={entry.dimensions} windowKey={item.id}>\n <DesktopShortcutMenuItem item={item} />\n <Suspense fallback={<div className=\"flex items-center justify-center py-12\"><LoadingSpinner /></div>}>\n <Component />\n </Suspense>\n </Modal>\n );\n}\n\n/** Star button to favorite a document — saves to preferences.favorite_documents */\nexport function DocFavStar({ entityType, entityId, label }: { entityType: string; entityId: string; label: string }) {\n const queryClient = useQueryClient();\n const { data: profile } = useQuery({ queryKey: ['my-profile-sidebar'], enabled: isShellApiClientConfigured(), queryFn: () => apiClient.get('/auth/me/').then(r => r.data) });\n const favDocs: { entityType: string; entityId: string; label: string }[] = (profile?.preferences || {}).favorite_documents || [];\n const isFav = favDocs.some(d => d.entityType === entityType && d.entityId === entityId);\n\n const toggle = () => {\n const next = isFav\n ? favDocs.filter(d => !(d.entityType === entityType && d.entityId === entityId))\n : [...favDocs, { entityType, entityId, label }];\n apiClient.patch('/auth/me/', { preferences: { favorite_documents: next } }).then(() => {\n queryClient.invalidateQueries({ queryKey: ['my-profile-sidebar'] });\n });\n };\n\n return (\n <button onClick={toggle} title={isFav ? 'Remove from desktop' : 'Add to desktop'}\n className={`shrink-0 transition-colors ${isFav ? 'text-yellow-500 hover:text-yellow-600' : 'text-gray-300 hover:text-yellow-400'}`}>\n <svg className=\"h-4 w-4\" fill={isFav ? '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\nfunction RestoredRegistryModal({ item, onClose, onMinimize }: { item: MinimizedItem; onClose: () => void; onMinimize: (sb: SavedBox) => void }) {\n const raw = WINDOW_REGISTRY[item.entityType!];\n if (!raw || !isEntityEntry(raw)) return null;\n const entry = raw as ModalRegistryEntry;\n\n const [editing, setEditing] = useState(false);\n\n // Use queryKey from registry (matches what detail components invalidate) or derive from endpoint\n const qkPrefix = entry.queryKey || entry.endpoint.replace(/^\\/|\\/$/g, '').split('/').pop() || item.entityType;\n const isDuplicate = item.entitySnapshot?._duplicate;\n const { data: entity, isLoading, refetch } = useQuery({\n queryKey: [qkPrefix, item.entityId],\n queryFn: () => apiClient.get(`${entry.endpoint}${item.entityId}/`).then(r => r.data),\n initialData: item.entitySnapshot,\n initialDataUpdatedAt: 0, // Treat snapshot as stale so query refetches immediately\n enabled: !entry.selfFetching && !isDuplicate && isShellApiClientConfigured(),\n staleTime: 0,\n refetchOnWindowFocus: true,\n refetchOnMount: 'always',\n refetchInterval: 60_000, // Fallback polling; WebSocket provides instant updates\n refetchIntervalInBackground: false,\n });\n\n // Refetch entity data whenever this modal is activated (brought to front)\n useEffect(() => {\n if (entry.selfFetching || isDuplicate) return;\n const handler = () => { refetch(); };\n window.addEventListener('modal-reorder', handler);\n return () => window.removeEventListener('modal-reorder', handler);\n }, [refetch, entry.selfFetching, isDuplicate]);\n\n // When editing, close/ESC exits edit mode instead of closing the window\n const handleClose = useCallback(() => {\n if (editing) {\n setEditing(false);\n } else {\n onClose();\n }\n }, [editing, onClose]);\n\n const titleBase = entry.selfFetching\n ? item.label\n : (entity ? entry.title(entity, editing, setEditing) : item.label);\n\n const entityIconKey = (entry as ModalRegistryEntry).icon;\n const entityIcon = entityIconKey ? navIcons[entityIconKey] : null;\n const titleContent = titleBase;\n\n const footerContent = (!entry.selfFetching && entity && entry.footer && !isDuplicate)\n ? entry.footer(entity)\n : undefined;\n\n // Components that render their own Modal — skip outer wrapper\n if (entry.rendersOwnModal) {\n // selfFetching components handle their own data loading — always render them\n if (entry.selfFetching) {\n return (\n <Suspense fallback={<LoadingSpinner />}>\n {entry.render(entity ?? item.entitySnapshot, handleClose, item.entityId, editing, setEditing)}\n </Suspense>\n );\n }\n return (\n <Suspense fallback={<LoadingSpinner />}>\n {isLoading && !entity ? (\n <LoadingSpinner />\n ) : entity ? (\n entry.render(entity, handleClose, item.entityId, editing, setEditing)\n ) : (\n <Modal open={true} onClose={onClose} title={item.label} size={(entry.size || '2xl') as any}>\n <p className=\"text-sm text-gray-500 py-8 text-center\">Not found.</p>\n </Modal>\n )}\n </Suspense>\n );\n }\n\n return (\n <Modal\n open={true}\n onClose={handleClose}\n onMinimize={onMinimize}\n initialBox={item.savedBox}\n icon={entityIcon}\n title={titleContent}\n footer={footerContent}\n copyText={item.id}\n windowKey={item.id}\n size={(entry.size || '2xl') as any}\n autoHeight={entry.autoHeight}\n autoMinHeight={entry.autoMinHeight}\n appStyle={entry.appStyle}\n >\n <DesktopShortcutMenuItem item={item} />\n <Suspense fallback={<LoadingSpinner />}>\n {entry.selfFetching ? (\n entry.render(null, handleClose, item.entityId, editing, setEditing)\n ) : isLoading && !entity ? (\n <LoadingSpinner />\n ) : entity ? (\n entry.render(entity, handleClose, item.entityId, editing, setEditing)\n ) : (\n <p className=\"text-sm text-gray-500 py-8 text-center\">Not found.</p>\n )}\n </Suspense>\n </Modal>\n );\n}\n\n\n/** Find a modal panel by its window key (the openWindows item id). */\nfunction findPanelByWindowKey(key: string): HTMLElement | null {\n return document.querySelector(`[data-modal-panel][data-window-key=\"${key}\"]`) as HTMLElement | null;\n}\n\n/** Find a modal panel whose title text contains `label`. Used as a fallback\n * when no window key is available (legacy code paths). */\nfunction findPanelByLabel(label: string): HTMLElement | null {\n const panels = document.querySelectorAll('[data-modal-panel]');\n for (const p of Array.from(panels)) {\n const t = p.querySelector('.text-lg, .text-sm.font-medium');\n if (t?.textContent?.includes(label)) return p as HTMLElement;\n }\n return null;\n}\n\n/** Render a single window snapshot. The card sizes itself to the source\n * panel's aspect ratio (clamped to maxW × maxH) so the snapshot fills\n * the card with no empty letterboxing. When the source window is\n * hidden (zero rect — e.g. show-desktop just minimised it) we fall\n * back to a frosted card with the icon + label so the preview is\n * never empty. When `titleAbove` is true the bottom overlay label\n * is dropped — the parent renders the title in a row above instead. */\n/** Snapshot card for an open window. Exported for the mobile switcher.\n * See JSDoc above for sizing/snapshot semantics. */\nexport function ThumbCard({ id, label, maxW, maxH, titleAbove = false, onClick, onClose }: {\n id: string; label: string; maxW: number; maxH: number; titleAbove?: boolean; onClick?: () => void; onClose?: () => void;\n}) {\n const previewRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<{ w: number; h: number }>({ w: maxW, h: Math.round(maxH * 0.75) });\n const [hasSnapshot, setHasSnapshot] = useState(false);\n\n useLayoutEffect(() => {\n const inner = previewRef.current;\n if (!inner) return;\n const target = findPanelByWindowKey(id) ?? findPanelByLabel(label);\n if (!target) { setHasSnapshot(false); return; }\n const rect = target.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) { setHasSnapshot(false); return; }\n const ratio = Math.min(maxW / rect.width, maxH / rect.height);\n const cardW = Math.max(80, Math.round(rect.width * ratio));\n const cardH = Math.max(60, Math.round(rect.height * ratio));\n setSize({ w: cardW, h: cardH });\n setHasSnapshot(true);\n const clone = target.cloneNode(true) as HTMLElement;\n clone.style.position = 'absolute';\n clone.style.top = '0'; clone.style.left = '0';\n clone.style.right = 'auto'; clone.style.bottom = 'auto';\n clone.style.width = rect.width + 'px';\n clone.style.height = rect.height + 'px';\n clone.style.transform = `scale(${ratio})`;\n clone.style.transformOrigin = 'top left';\n clone.style.pointerEvents = 'none';\n clone.style.animation = 'none';\n clone.removeAttribute('data-modal-panel');\n clone.removeAttribute('data-modal-id');\n clone.removeAttribute('data-window-key');\n clone.querySelectorAll<HTMLElement>('[role=\"dialog\"], [data-portal]').forEach(el => { el.style.display = 'none'; });\n inner.innerHTML = '';\n inner.appendChild(clone);\n return () => { inner.innerHTML = ''; };\n }, [id, label, maxW, maxH]);\n\n return (\n <div\n style={{ width: size.w, height: size.h }}\n className=\"relative rounded-md overflow-hidden bg-white/95 border border-gray-300 shadow-md cursor-pointer hover:ring-2 hover:ring-blue-400 transition shrink-0\"\n onClick={onClick}\n >\n <div ref={previewRef} className=\"absolute inset-0 overflow-hidden\" />\n {!hasSnapshot && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-gray-400 bg-gray-50\">\n <svg className=\"h-6 w-6\" 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 M3.75 9h16.5\" />\n </svg>\n <span className=\"mt-1 text-[10px] uppercase tracking-wide\">Hidden</span>\n </div>\n )}\n {!titleAbove && (\n <div className=\"absolute bottom-0 left-0 right-0 px-2 py-1 text-[10px] font-medium text-white bg-gradient-to-t from-black/80 to-transparent truncate pointer-events-none\">\n {label}\n </div>\n )}\n {onClose && (\n <button\n onClick={(e) => { e.stopPropagation(); onClose(); }}\n className=\"absolute top-1 right-1 h-4 w-4 rounded-full bg-black/40 hover:bg-red-500/90 text-white flex items-center justify-center\"\n title=\"Close window\"\n >\n <svg className=\"h-2.5 w-2.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" /></svg>\n </button>\n )}\n </div>\n );\n}\n\n/** Hover popover — single thumbnail for a single window, or a row of\n * thumbnails for a grouped set so the user can pick which instance to\n * activate. Each thumb sizes to its window's aspect ratio (clamped).\n * After mount, the popover measures its own bounding box and centers\n * itself horizontally on the button below — fixed-width math doesn't\n * hold once cards reflect their source aspect ratios. */\nfunction TaskbarTabPreview({ items, anchorEl, onActivate, onClose, onMouseEnter, onMouseLeave }: {\n items: MinimizedItem[]; anchorEl: HTMLElement; onActivate: (id: string) => void; onClose: (id: string) => void;\n onMouseEnter: () => void; onMouseLeave: () => void;\n}) {\n const MAX_W = 240;\n const MAX_H = 160;\n const isGroup = items.length > 1;\n const popoverRef = useRef<HTMLDivElement>(null);\n // Provisional position (off-screen above viewport) so we can measure the\n // actual rendered size before snapping into place. This avoids a single\n // mis-aligned frame.\n const [pos, setPos] = useState<{ left: number; top: number; ready: boolean }>({ left: -9999, top: -9999, ready: false });\n\n useLayoutEffect(() => {\n const el = popoverRef.current;\n if (!el) return;\n const measure = () => {\n const tabRect = anchorEl.getBoundingClientRect();\n const popRect = el.getBoundingClientRect();\n const taskbarPos = getComputedStyle(document.documentElement).getPropertyValue('--taskbar-position')?.trim() || 'bottom';\n let left = tabRect.left + tabRect.width / 2 - popRect.width / 2;\n let top: number;\n if (taskbarPos === 'top') {\n top = tabRect.bottom + 8;\n } else if (taskbarPos === 'left') {\n left = tabRect.right + 8;\n top = tabRect.top + tabRect.height / 2 - popRect.height / 2;\n } else if (taskbarPos === 'right') {\n left = tabRect.left - popRect.width - 8;\n top = tabRect.top + tabRect.height / 2 - popRect.height / 2;\n } else {\n // bottom\n top = tabRect.top - popRect.height - 8;\n }\n // Clamp to viewport.\n left = Math.max(8, Math.min(left, window.innerWidth - popRect.width - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - popRect.height - 8));\n setPos({ left, top, ready: true });\n };\n measure();\n // Re-measure when child cards finalise their size (they pick their\n // dimensions in a useLayoutEffect after the first paint).\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, [anchorEl, items.length]);\n\n return createPortal(\n <div\n ref={popoverRef}\n style={{\n position: 'fixed', left: pos.left, top: pos.top, zIndex: 9999,\n maxWidth: 'calc(100vw - 16px)',\n opacity: pos.ready ? 1 : 0,\n }}\n className={isGroup\n ? 'flex gap-2 p-2 rounded-lg bg-white/40 backdrop-blur-sm border border-white/30 shadow-2xl flex-wrap'\n : ''}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {items.map(it => (\n <div key={it.id} className=\"flex flex-col items-center\">\n <span className=\"mb-1 max-w-[240px] truncate text-[11px] font-medium text-gray-900 bg-white/80 px-2 py-0.5 rounded shadow-sm\">\n {it.label}\n </span>\n <ThumbCard\n id={it.id}\n label={it.label}\n maxW={MAX_W}\n maxH={MAX_H}\n titleAbove\n onClick={() => onActivate(it.id)}\n onClose={() => onClose(it.id)}\n />\n </div>\n ))}\n </div>,\n document.body,\n );\n}\n\nfunction TaskbarWindows({ openWindows, onRemove, onCloseAll, onSplitView, onActivate, onActivateById }: {\n openWindows: MinimizedItem[]; onRemove: (id: string) => void; onCloseAll: () => void; onSplitView: () => void;\n onActivate: (label: string) => void;\n onActivateById: (id: string) => void;\n}) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n useEffect(() => {\n const el = document.getElementById('taskbar-windows');\n if (el) setTarget(el);\n else { const t = setInterval(() => { const e = document.getElementById('taskbar-windows'); if (e) { setTarget(e); clearInterval(t); } }, 100); return () => clearInterval(t); }\n }, []);\n\n const activeModalId = useSyncExternalStore(subscribeActive, getActiveModalId);\n\n // Re-render the taskbar when any window's title changes so the dynamic\n // title (e.g. \"Untitled - Spreadsheets\") shows up on the tab.\n const [, forceTick] = useState(0);\n useEffect(() => {\n const onTitle = () => forceTick(t => t + 1);\n window.addEventListener('window-title-update', onTitle);\n return () => window.removeEventListener('window-title-update', onTitle);\n }, []);\n const liveTitle = (label: string): string => {\n const panel = findPanelByLabel(label);\n const titleEl = panel?.querySelector('.text-lg, .text-sm.font-medium');\n return titleEl?.textContent?.trim() || label;\n };\n\n const [hoveredItems, setHoveredItems] = useState<MinimizedItem[] | null>(null);\n const [hoveredAnchor, setHoveredAnchor] = useState<HTMLElement | null>(null);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const handleEnter = (items: MinimizedItem[], el: HTMLElement) => {\n if (hoverTimerRef.current) { clearTimeout(hoverTimerRef.current); hoverTimerRef.current = null; }\n hoverTimerRef.current = setTimeout(() => { setHoveredItems(items); setHoveredAnchor(el); }, 350);\n };\n const handleLeave = () => {\n if (hoverTimerRef.current) { clearTimeout(hoverTimerRef.current); hoverTimerRef.current = null; }\n hoverTimerRef.current = setTimeout(() => { setHoveredItems(null); setHoveredAnchor(null); }, 150);\n };\n const cancelLeave = () => {\n if (hoverTimerRef.current) { clearTimeout(hoverTimerRef.current); hoverTimerRef.current = null; }\n };\n // Filter out utility apps (e.g. calculator) from taskbar tabs\n const tabWindows = openWindows.filter(item => !item.route || !(WINDOW_REGISTRY[item.route] as PageRegistryEntry)?.utility);\n if (!target || tabWindows.length === 0) return null;\n\n // Group multi-instance windows by route so the taskbar shows one icon\n // per app type with a count badge instead of N identical tabs.\n type Group = { key: string; route?: string; label: string; items: MinimizedItem[] };\n const groups: Group[] = [];\n const idx = new Map<string, number>();\n for (const item of tabWindows) {\n const key = item.route ?? `entity:${item.id}`;\n const i = idx.get(key);\n if (i !== undefined) {\n groups[i].items.push(item);\n } else {\n idx.set(key, groups.length);\n const registryLabel = item.route ? (WINDOW_REGISTRY[item.route] as PageRegistryEntry)?.label : undefined;\n groups.push({ key, route: item.route, label: registryLabel ?? item.label, items: [item] });\n }\n }\n\n return createPortal(\n <>\n {groups.map(group => {\n const icon = group.route ? navIcons[group.route] : null;\n // The \"primary\" item for activation/preview: the most recently opened.\n const primary = group.items[group.items.length - 1];\n // Group is active if any of its instances is the active modal.\n let isActive = false;\n if (activeModalId) {\n const panel = document.querySelector(`[data-modal-id=\"${activeModalId}\"]`);\n if (panel) {\n const titleEl = panel.querySelector('.text-lg, .text-sm.font-medium');\n const titleText = titleEl?.textContent ?? '';\n isActive = group.items.some(it => titleText.includes(it.label));\n }\n }\n const isGrouped = group.items.length > 1;\n\n return (\n <button key={group.key} onClick={() => onActivateById(primary.id)}\n onMouseEnter={(e) => handleEnter(group.items, e.currentTarget)}\n onMouseLeave={handleLeave}\n onDoubleClick={(e) => { e.stopPropagation(); window.dispatchEvent(new CustomEvent('modal-center', { detail: { label: primary.label } })); }}\n onContextMenu={(e) => { e.preventDefault(); e.stopPropagation(); window.dispatchEvent(new CustomEvent('modal-context-menu', { detail: { label: primary.label, x: e.clientX, y: e.clientY } })); }}\n style={{ width: 'var(--window-tab-width, 200px)', fontSize: 'var(--window-tab-font-size, 12px)' }}\n data-tab-group={group.key}\n className={`group relative flex items-center gap-1.5 rounded-lg px-3 py-2 font-medium transition-all min-w-0 shrink ${\n isActive ? 'bg-blue-100/60 border border-blue-400/60 text-blue-700' : 'bg-gray-50/40 border border-gray-200/40 text-gray-700 hover:bg-gray-200/40'\n }`}>\n {icon && isValidElement(icon)\n ? cloneElement(icon as ReactElement, { className: `h-3.5 w-3.5 shrink-0 ${isActive ? 'text-blue-600' : 'text-gray-400'}` })\n : <svg className={`h-3.5 w-3.5 shrink-0 ${isActive ? 'text-blue-600' : 'text-gray-400'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4\" /></svg>\n }\n <span className=\"truncate flex-1\">{isGrouped ? group.label : liveTitle(primary.label)}</span>\n {isGrouped && (\n <span className=\"shrink-0 px-1.5 py-0.5 rounded-full bg-blue-500/80 text-white text-[10px] font-bold leading-none\">{group.items.length}</span>\n )}\n {!isGrouped && (\n <span role=\"button\" onClick={(e) => { e.stopPropagation(); onRemove(primary.id); }} className=\"ml-auto text-gray-400 hover:text-red-500 shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\">\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 </span>\n )}\n </button>\n );\n })}\n <div className=\"flex-1\" />\n {tabWindows.length >= 2 && (\n <button onClick={onSplitView}\n className=\"flex items-center gap-1 rounded px-2 py-1 text-[11px] font-medium text-blue-600 border border-blue-300 hover:bg-blue-50 transition-colors shrink-0\">\n <svg className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 4H5a1 1 0 00-1 1v14a1 1 0 001 1h4m6-16h4a1 1 0 011 1v14a1 1 0 01-1 1h-4m-6 0V4\" /></svg>\n Split\n </button>\n )}\n {hoveredItems && hoveredAnchor && (\n <TaskbarTabPreview\n items={hoveredItems}\n anchorEl={hoveredAnchor}\n onActivate={(id) => { onActivateById(id); setHoveredItems(null); setHoveredAnchor(null); }}\n onClose={(id) => { onRemove(id); setHoveredItems(null); setHoveredAnchor(null); }}\n onMouseEnter={cancelLeave}\n onMouseLeave={handleLeave}\n />\n )}\n </>,\n target\n );\n}\n\nconst SESSION_KEY = 'erp_open_windows';\n\nfunction saveWindowState(windows: MinimizedItem[]) {\n try {\n const serializable = windows.map(w => ({ ...w, entitySnapshot: undefined }));\n localStorage.setItem(SESSION_KEY, JSON.stringify(serializable));\n } catch { /* storage full */ }\n}\n\nconst DEFAULT_WIDGETS: MinimizedItem[] = [\n { id: 'page:/weather', type: 'page', label: 'Weather', route: '/weather' },\n { id: 'page:/currency', type: 'page', label: 'Currency', route: '/currency' },\n];\n\nfunction restoreWindowState(): MinimizedItem[] {\n try {\n if (window.location.pathname === '/login') return [];\n if (!localStorage.getItem('access_token')) return [];\n const stored = localStorage.getItem(SESSION_KEY);\n if (stored) return JSON.parse(stored);\n } catch { /* corrupt data */ }\n return DEFAULT_WIDGETS;\n}\n\nconst AUTH_PAGES = ['/login', '/forgot-password', '/reset-password', '/force-change-password'];\n\nexport function WindowManagerProvider({ children }: { children: ReactNode }) {\n const location = useLocation();\n const isAuthPage = AUTH_PAGES.some(p => location.pathname.startsWith(p));\n const [openWindows, setOpenWindows] = useState<MinimizedItem[]>(() => restoreWindowState());\n\n // Persist window state on every change — but don't save empty on initial mount (login page)\n const hasUserActed = useRef(false);\n useEffect(() => {\n if (openWindows.length > 0) hasUserActed.current = true;\n if (hasUserActed.current) saveWindowState(openWindows);\n }, [openWindows]);\n\n const closeEntity = useCallback((id: string) => {\n setOpenWindows(prev => prev.filter(m => m.id !== id));\n }, []);\n\n const openEntity = useCallback((entityType: string, entityId: string, snapshot?: any, label?: string, route?: string) => {\n if (!WINDOW_REGISTRY[entityType] || !isEntityEntry(WINDOW_REGISTRY[entityType])) return;\n const id = label || entityId;\n // If already open, just activate it\n setOpenWindows(prev => {\n const existing = prev.find(m => m.entityId === entityId && m.entityType === entityType);\n if (existing) {\n // Activate the existing window\n setTimeout(() => {\n const panels = document.querySelectorAll('[data-modal-panel]');\n panels.forEach(p => {\n const titleEl = p.querySelector('.text-lg, .text-sm.font-medium');\n if (titleEl?.textContent?.includes(existing.label)) {\n const mid = p.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n }\n });\n }, 50);\n return prev;\n }\n return [...prev, {\n id, type: 'modal' as const, label: label || entityId,\n route: route || window.location.pathname,\n entityType, entityId, entitySnapshot: snapshot,\n }];\n });\n }, []);\n\n /** Open a page as a window — reuse if already open */\n const openPage = useCallback((path: string) => {\n if (!WINDOW_REGISTRY[path] || !isPageEntry(WINDOW_REGISTRY[path])) return;\n const entry = WINDOW_REGISTRY[path] as PageRegistryEntry;\n setOpenWindows(prev => {\n // Multi-instance pages always spawn a new window with a unique id.\n if (entry.multiInstance) {\n const instanceCount = prev.filter(m => m.type === 'page' && m.route === path).length;\n const nextNum = instanceCount + 1;\n const id = `page:${path}:${Math.random().toString(36).slice(2, 8)}`;\n return [...prev, {\n id, type: 'page' as const,\n label: instanceCount === 0 ? entry.label : `${entry.label} ${nextNum}`,\n route: path,\n }];\n }\n const existing = prev.find(m => m.type === 'page' && m.route === path);\n if (existing) {\n // Widgets toggle on/off; non-widgets activate (bring to front)\n if (entry.widget) {\n return prev.filter(m => m !== existing);\n }\n setTimeout(() => {\n const panels = document.querySelectorAll('[data-modal-panel]');\n panels.forEach(p => {\n const titleEl = p.querySelector('.text-lg, .text-sm.font-medium');\n if (titleEl?.textContent?.includes(existing.label)) {\n const mid = p.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n }\n });\n }, 50);\n return prev;\n }\n return [...prev, {\n id: `page:${path}`, type: 'page' as const, label: entry.label,\n route: path,\n }];\n });\n }, []);\n\n // Backward compat stubs\n const minimize = useCallback(() => {}, []);\n const restore = useCallback(() => {}, []);\n const remove = closeEntity;\n const restoreIfMinimized = () => false;\n\n return (\n <MinimizedContext.Provider value={{ openWindows, openEntity, openPage, closeEntity, minimize, items: [], openItems: openWindows, restore, remove, restoreIfMinimized }}>\n {children}\n\n {/* Taskbar windows */}\n <TaskbarWindows\n openWindows={openWindows}\n onRemove={closeEntity}\n onCloseAll={() => setOpenWindows([])}\n onSplitView={triggerSplitView}\n onActivate={(label) => {\n const panels = document.querySelectorAll('[data-modal-panel]');\n panels.forEach(p => {\n const titleEl = p.querySelector('.text-lg, .text-sm.font-medium');\n if (titleEl?.textContent?.includes(label)) {\n const mid = p.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n }\n });\n }}\n onActivateById={(id) => {\n const panel = document.querySelector(`[data-modal-panel][data-window-key=\"${id}\"]`);\n const mid = panel?.getAttribute('data-modal-id');\n if (mid) activateModal(mid);\n }}\n />\n\n {/* All open windows — pages and entities (hidden on auth pages) */}\n {!isAuthPage && openWindows.map(item => (\n item.type === 'page' ? (\n <PageWindow key={item.id} item={item} onClose={() => closeEntity(item.id)} />\n ) : (\n <RestoredRegistryModal\n key={item.id}\n item={item}\n onClose={() => closeEntity(item.id)}\n onMinimize={() => {}}\n />\n )\n ))}\n </MinimizedContext.Provider>\n );\n}\n"]}