react-os-shell 4.76.0 → 4.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/{Browser-73KSMRVQ.js → Browser-GI3FU3RG.js} +5 -5
  2. package/dist/{Browser-73KSMRVQ.js.map → Browser-GI3FU3RG.js.map} +1 -1
  3. package/dist/{Calculator-SRZGJITP.js → Calculator-PAPSDNSJ.js} +4 -4
  4. package/dist/{Calculator-SRZGJITP.js.map → Calculator-PAPSDNSJ.js.map} +1 -1
  5. package/dist/{CurrencyConverter-3KBUNSD6.js → CurrencyConverter-VJQI2XVV.js} +4 -4
  6. package/dist/{CurrencyConverter-3KBUNSD6.js.map → CurrencyConverter-VJQI2XVV.js.map} +1 -1
  7. package/dist/{Documents-335H6FQS.js → Documents-Z3NTYEOL.js} +5 -5
  8. package/dist/{Documents-335H6FQS.js.map → Documents-Z3NTYEOL.js.map} +1 -1
  9. package/dist/{Files-YICBVMLF.js → Files-VR4VONB3.js} +5 -5
  10. package/dist/{Files-YICBVMLF.js.map → Files-VR4VONB3.js.map} +1 -1
  11. package/dist/{Notepad-Q6T6FM2L.js → Notepad-MU2S4QY7.js} +5 -5
  12. package/dist/{Notepad-Q6T6FM2L.js.map → Notepad-MU2S4QY7.js.map} +1 -1
  13. package/dist/{PomodoroTimer-QGQBN2OH.js → PomodoroTimer-GFL4L3XS.js} +4 -4
  14. package/dist/{PomodoroTimer-QGQBN2OH.js.map → PomodoroTimer-GFL4L3XS.js.map} +1 -1
  15. package/dist/{Preview-EYIY3RYR.js → Preview-4V5XZ7IQ.js} +5 -5
  16. package/dist/{Preview-EYIY3RYR.js.map → Preview-4V5XZ7IQ.js.map} +1 -1
  17. package/dist/{Spreadsheet-YGXJTYYI.js → Spreadsheet-NF7NBZMD.js} +5 -5
  18. package/dist/{Spreadsheet-YGXJTYYI.js.map → Spreadsheet-NF7NBZMD.js.map} +1 -1
  19. package/dist/{Stock-OVVGE7US.js → Stock-WZXVQX3G.js} +4 -4
  20. package/dist/{Stock-OVVGE7US.js.map → Stock-WZXVQX3G.js.map} +1 -1
  21. package/dist/{Weather-PKUXHYIL.js → Weather-FQ7ZVXVR.js} +4 -4
  22. package/dist/{Weather-PKUXHYIL.js.map → Weather-FQ7ZVXVR.js.map} +1 -1
  23. package/dist/{WorldClock-OUO4IYKF.js → WorldClock-XAFQ5ZQF.js} +4 -4
  24. package/dist/{WorldClock-OUO4IYKF.js.map → WorldClock-XAFQ5ZQF.js.map} +1 -1
  25. package/dist/apps/index.js +15 -15
  26. package/dist/chunk-6E3DBIGQ.js +7 -0
  27. package/dist/{chunk-Y2DKWEPS.js.map → chunk-6E3DBIGQ.js.map} +1 -1
  28. package/dist/{chunk-UEJC6VOM.js → chunk-EXSEW5F3.js} +3 -74
  29. package/dist/chunk-EXSEW5F3.js.map +1 -0
  30. package/dist/{chunk-S6K37RLY.js → chunk-VDKHMCWT.js} +6 -5
  31. package/dist/chunk-VDKHMCWT.js.map +1 -0
  32. package/dist/{chunk-GIMXLF42.js → chunk-WXYVPGFY.js} +4 -4
  33. package/dist/{chunk-GIMXLF42.js.map → chunk-WXYVPGFY.js.map} +1 -1
  34. package/dist/{chunk-XYP45LGG.js → chunk-ZO4XGUZQ.js} +3 -3
  35. package/dist/{chunk-XYP45LGG.js.map → chunk-ZO4XGUZQ.js.map} +1 -1
  36. package/dist/{index-DVekeidu.d.ts → index-C_uCjbAh.d.ts} +85 -1
  37. package/dist/index.d.ts +21 -3
  38. package/dist/index.js +54 -15
  39. package/dist/index.js.map +1 -1
  40. package/dist/ui/index.d.ts +1 -1
  41. package/dist/ui/index.js +2 -2
  42. package/package.json +1 -1
  43. package/dist/chunk-S6K37RLY.js.map +0 -1
  44. package/dist/chunk-UEJC6VOM.js.map +0 -1
  45. package/dist/chunk-Y2DKWEPS.js +0 -7
@@ -1,5 +1,5 @@
1
- import { VERSION } from './chunk-Y2DKWEPS.js';
2
- import { useWindowMenuItem, Modal } from './chunk-UEJC6VOM.js';
1
+ import { VERSION } from './chunk-6E3DBIGQ.js';
2
+ import { useWindowMenuItem, Modal } from './chunk-EXSEW5F3.js';
3
3
  import { navIcons } from './chunk-WNLPTLT6.js';
4
4
  import { useState, useCallback, isValidElement, cloneElement } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -75,5 +75,5 @@ function AboutApp({ app }) {
75
75
  }
76
76
 
77
77
  export { AboutApp, BUILTIN_APP_INFO };
78
- //# sourceMappingURL=chunk-GIMXLF42.js.map
79
- //# sourceMappingURL=chunk-GIMXLF42.js.map
78
+ //# sourceMappingURL=chunk-WXYVPGFY.js.map
79
+ //# sourceMappingURL=chunk-WXYVPGFY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-GIMXLF42.js","sourcesContent":["/**\n * Shared \"About\" dialog for the bundled apps.\n *\n * Each bundled app carries its own version (independent of the package\n * version) so app-level changes can be tracked without bumping every app at\n * once. `<AboutApp app=\"…\" />` registers an \"About <Name>\" item in the\n * window title menu and renders the dialog: app icon, name, app version and\n * the react-os-shell attribution + shell version.\n *\n * Bump an app's version in `BUILTIN_APP_INFO` whenever that app's behaviour\n * changes, alongside the package-level CHANGELOG entry.\n */\nimport { useCallback, useState, isValidElement, cloneElement, type ReactElement } from 'react';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport { navIcons } from '../shell-config/nav';\nimport { VERSION } from '../version';\n\nexport interface BuiltinAppInfo {\n /** Display name — matches the window-registry label. */\n name: string;\n /** App version, independent of the package version. */\n version: string;\n /** One-line summary shown in the About dialog. */\n description: string;\n /** Registry route — used to look up the consumer-registered nav icon. */\n route: string;\n}\n\nexport const BUILTIN_APP_INFO = {\n spreadsheet: {\n name: 'Spreadsheets',\n version: '1.1.1',\n route: '/spreadsheet',\n description: 'Multi-sheet spreadsheet editor with CSV / TSV import and export.',\n },\n notepad: {\n name: 'Notepad',\n version: '1.0.0',\n route: '/notepad',\n description: 'Color-coded notes with checklists, desktop stickies and entity autolinking.',\n },\n documents: {\n name: 'Documents',\n version: '1.1.0',\n route: '/documents',\n description: 'Letter-page editor for Word documents and plain-text files — images, lists, alignment.',\n },\n preview: {\n name: 'Preview',\n version: '1.2.1',\n route: '/preview',\n description: 'Viewer for PDF documents, images, DXF drawings and 3D models — CAD-style measuring with object snap and an AutoCAD-like command bar.',\n },\n files: {\n name: 'Files',\n version: '1.1.0',\n route: '/files',\n description: 'Personal file manager with folders, uploads, quota, trash and desktop shortcut folders.',\n },\n browser: {\n name: 'Browser',\n version: '1.0.1',\n route: '/browser',\n description: 'Minimal web browser with bookmarks, history and navigation bar.',\n },\n} satisfies Record<string, BuiltinAppInfo>;\n\nexport type BuiltinAppId = keyof typeof BUILTIN_APP_INFO;\n\nconst ABOUT_MENU_ICON = (\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=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n);\n\n// Generic window glyph shown when the consumer hasn't registered a nav icon\n// for the app's route (same fallback shape as the Modal title bar).\nconst FALLBACK_APP_ICON = (\n <svg className=\"h-9 w-9\" 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\n/** Registers \"About <Name>\" in the window title menu and renders the dialog.\n * Render anywhere inside the app's window. */\nexport default function AboutApp({ app }: { app: BuiltinAppId }) {\n const info = BUILTIN_APP_INFO[app];\n const [open, setOpen] = useState(false);\n const openDialog = useCallback(() => setOpen(true), []);\n useWindowMenuItem(`About ${info.name}`, openDialog, ABOUT_MENU_ICON);\n\n if (!open) return null;\n\n const registered = navIcons[info.route];\n const appIcon = isValidElement(registered)\n ? cloneElement(registered as ReactElement, { className: 'h-9 w-9' } as any)\n : FALLBACK_APP_ICON;\n\n return (\n <Modal open onClose={() => setOpen(false)} title={`About ${info.name}`} size=\"sm\" compact bodyScroll={false} autoHeight dimensions={[320, 320]}>\n <div className=\"flex flex-col items-center text-center px-5 pt-5 pb-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-gray-100 text-gray-600 shrink-0\">\n {appIcon}\n </div>\n <h2 className=\"mt-3 text-lg font-bold text-gray-900\">{info.name}</h2>\n <p className=\"text-[11px] font-mono text-gray-400\">Version {info.version}</p>\n <p className=\"mt-2 text-xs text-gray-500 leading-relaxed\">{info.description}</p>\n <div className=\"mt-4 pt-3 border-t border-gray-200 w-full\">\n <p className=\"text-[11px] text-gray-500\">\n Part of the <span className=\"font-medium text-gray-700\">react-os-shell</span> desktop environment\n </p>\n {VERSION && <p className=\"mt-0.5 text-[10px] font-mono text-gray-400\">shell v{VERSION}</p>}\n </div>\n </div>\n </Modal>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-WXYVPGFY.js","sourcesContent":["/**\n * Shared \"About\" dialog for the bundled apps.\n *\n * Each bundled app carries its own version (independent of the package\n * version) so app-level changes can be tracked without bumping every app at\n * once. `<AboutApp app=\"…\" />` registers an \"About <Name>\" item in the\n * window title menu and renders the dialog: app icon, name, app version and\n * the react-os-shell attribution + shell version.\n *\n * Bump an app's version in `BUILTIN_APP_INFO` whenever that app's behaviour\n * changes, alongside the package-level CHANGELOG entry.\n */\nimport { useCallback, useState, isValidElement, cloneElement, type ReactElement } from 'react';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport { navIcons } from '../shell-config/nav';\nimport { VERSION } from '../version';\n\nexport interface BuiltinAppInfo {\n /** Display name — matches the window-registry label. */\n name: string;\n /** App version, independent of the package version. */\n version: string;\n /** One-line summary shown in the About dialog. */\n description: string;\n /** Registry route — used to look up the consumer-registered nav icon. */\n route: string;\n}\n\nexport const BUILTIN_APP_INFO = {\n spreadsheet: {\n name: 'Spreadsheets',\n version: '1.1.1',\n route: '/spreadsheet',\n description: 'Multi-sheet spreadsheet editor with CSV / TSV import and export.',\n },\n notepad: {\n name: 'Notepad',\n version: '1.0.0',\n route: '/notepad',\n description: 'Color-coded notes with checklists, desktop stickies and entity autolinking.',\n },\n documents: {\n name: 'Documents',\n version: '1.1.0',\n route: '/documents',\n description: 'Letter-page editor for Word documents and plain-text files — images, lists, alignment.',\n },\n preview: {\n name: 'Preview',\n version: '1.2.1',\n route: '/preview',\n description: 'Viewer for PDF documents, images, DXF drawings and 3D models — CAD-style measuring with object snap and an AutoCAD-like command bar.',\n },\n files: {\n name: 'Files',\n version: '1.1.0',\n route: '/files',\n description: 'Personal file manager with folders, uploads, quota, trash and desktop shortcut folders.',\n },\n browser: {\n name: 'Browser',\n version: '1.0.1',\n route: '/browser',\n description: 'Minimal web browser with bookmarks, history and navigation bar.',\n },\n} satisfies Record<string, BuiltinAppInfo>;\n\nexport type BuiltinAppId = keyof typeof BUILTIN_APP_INFO;\n\nconst ABOUT_MENU_ICON = (\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=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n);\n\n// Generic window glyph shown when the consumer hasn't registered a nav icon\n// for the app's route (same fallback shape as the Modal title bar).\nconst FALLBACK_APP_ICON = (\n <svg className=\"h-9 w-9\" 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\n/** Registers \"About <Name>\" in the window title menu and renders the dialog.\n * Render anywhere inside the app's window. */\nexport default function AboutApp({ app }: { app: BuiltinAppId }) {\n const info = BUILTIN_APP_INFO[app];\n const [open, setOpen] = useState(false);\n const openDialog = useCallback(() => setOpen(true), []);\n useWindowMenuItem(`About ${info.name}`, openDialog, ABOUT_MENU_ICON);\n\n if (!open) return null;\n\n const registered = navIcons[info.route];\n const appIcon = isValidElement(registered)\n ? cloneElement(registered as ReactElement, { className: 'h-9 w-9' } as any)\n : FALLBACK_APP_ICON;\n\n return (\n <Modal open onClose={() => setOpen(false)} title={`About ${info.name}`} size=\"sm\" compact bodyScroll={false} autoHeight dimensions={[320, 320]}>\n <div className=\"flex flex-col items-center text-center px-5 pt-5 pb-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-gray-100 text-gray-600 shrink-0\">\n {appIcon}\n </div>\n <h2 className=\"mt-3 text-lg font-bold text-gray-900\">{info.name}</h2>\n <p className=\"text-[11px] font-mono text-gray-400\">Version {info.version}</p>\n <p className=\"mt-2 text-xs text-gray-500 leading-relaxed\">{info.description}</p>\n <div className=\"mt-4 pt-3 border-t border-gray-200 w-full\">\n <p className=\"text-[11px] text-gray-500\">\n Part of the <span className=\"font-medium text-gray-700\">react-os-shell</span> desktop environment\n </p>\n {VERSION && <p className=\"mt-0.5 text-[10px] font-mono text-gray-400\">shell v{VERSION}</p>}\n </div>\n </div>\n </Modal>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Modal } from './chunk-UEJC6VOM.js';
1
+ import { Modal } from './chunk-EXSEW5F3.js';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
3
 
4
4
  var DEFAULT_APPEARANCE = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };
@@ -138,5 +138,5 @@ function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceCha
138
138
  }
139
139
 
140
140
  export { WidgetSettingsModal, loadAppearance };
141
- //# sourceMappingURL=chunk-XYP45LGG.js.map
142
- //# sourceMappingURL=chunk-XYP45LGG.js.map
141
+ //# sourceMappingURL=chunk-ZO4XGUZQ.js.map
142
+ //# sourceMappingURL=chunk-ZO4XGUZQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-XYP45LGG.js","sourcesContent":["import Modal from './Modal';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n return (\n <div onPointerDown={e => e.stopPropagation()} onContextMenu={e => e.stopPropagation()}>\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-ZO4XGUZQ.js","sourcesContent":["import Modal from './Modal';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n return (\n <div onPointerDown={e => e.stopPropagation()} onContextMenu={e => e.stopPropagation()}>\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
@@ -139,12 +139,39 @@ interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'onC
139
139
  /**
140
140
  * Desktop rung, or `touch`. Defaults to `md`.
141
141
  *
142
+ * On `Select` this sizes the DESKTOP branch only: the touch branch takes
143
+ * `touchSize` instead and ignores this entirely. `NativeSelect` and
144
+ * `ListboxSelect` are literal and use it on every viewport.
145
+ *
142
146
  * This shadows the native `size` attribute (the number of rows a select
143
147
  * shows when it is rendered as a list box), which is omitted above rather
144
148
  * than left to collide. Nothing here has ever rendered as a list box — the
145
149
  * kit's Select is a dropdown — so no capability is lost.
146
150
  */
147
151
  size?: InputSize;
152
+ /**
153
+ * Rung for `Select`'s TOUCH branch. Defaults to `touch` (56px), which is the
154
+ * point of the branch — see the Select doc-block.
155
+ *
156
+ * It exists because the default is not right for everyone and the previous
157
+ * escape hatch was too expensive. `NativeSelect` sizes a select freely, but
158
+ * it is a native `<select>` on the desktop too, which is BG#00421: the OS
159
+ * popup swallows every key event, so shell hotkeys die while it is open.
160
+ * That is the whole reason the desktop listbox exists, and no one should
161
+ * have to give it up to render a 40px select on a phone.
162
+ *
163
+ * The case it is really for is a row of mixed controls. `Input`, `Textarea`,
164
+ * `DatePicker`, `TimePicker`, `InputNumber` and `TagInput` all render the
165
+ * rung they are given on every viewport, and `SearchableSelect` is pinned to
166
+ * `INPUT_BASE` (the `md` rung) with no size axis at all — so a phone form
167
+ * that puts a Select beside an unsized one of those now steps 56px against a
168
+ * control a little over half that. Pass `touchSize="md"` on the Select to
169
+ * line the row back up.
170
+ *
171
+ * Only `Select` reads it. `NativeSelect` and `ListboxSelect` accept it and
172
+ * ignore it, so it never reaches the DOM as an unknown attribute.
173
+ */
174
+ touchSize?: InputSize;
148
175
  options: SelectOption[];
149
176
  /** Shown as a disabled first option when no value is selected. */
150
177
  placeholder?: string;
@@ -155,9 +182,66 @@ interface SelectProps extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'onC
155
182
  * Raw native `<select>` styled to match the kit's inputs. This is the original
156
183
  * Select — kept as the mobile rendering and exported for callers that need a
157
184
  * real `HTMLSelectElement` (form posts, native attribute spread, focus).
185
+ *
186
+ * Literal about `size`: it renders the rung it is handed on every viewport,
187
+ * which is what makes it the opt-out from `Select`'s branch entirely. Prefer
188
+ * `Select`'s `touchSize` when you only want a different touch rung — this one
189
+ * costs you the desktop listbox, and with it BG#00421.
190
+ *
191
+ * `touchSize` is pulled out and dropped: it is `Select`'s prop, and letting it
192
+ * through `rest` would put an unknown attribute on the `<select>`.
158
193
  */
159
194
  declare const NativeSelect: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLSelectElement>>;
160
- /** Smart Select: native `<select>` on touch, custom listbox on desktop. */
195
+ /**
196
+ * Smart Select: native `<select>` on touch, custom listbox on desktop.
197
+ *
198
+ * The touch branch takes `touchSize`, default `touch`, and DISCARDS whatever
199
+ * desktop rung the caller asked for. That is not the component second-guessing
200
+ * the caller — `sm`/`md`/`lg` are the desktop ladder, and this branch only ever
201
+ * renders when there is no desktop. A rung off that ladder has nothing to say
202
+ * about how big an OS picker should be under a finger.
203
+ *
204
+ * It had to be said out loud because the omission was a real defect: this
205
+ * component already decided "this is touch, give it the native picker" and then
206
+ * passed the desktop rung straight through, handing a finger a target under the
207
+ * 44px WCAG 2.5.5 floor that `touchPrimitives.test.tsx` holds every Button rung
208
+ * above. `size="lg"` was measured at 39px on a device; the default `md` is a
209
+ * rung shorter again (`py-1.5 text-sm` against `py-2 text-base`, so 8px off the
210
+ * box), which puts it around 31px. The dealer portal's order filters were
211
+ * exactly that.
212
+ *
213
+ * Note this reads the same signal that already picks the branch
214
+ * (`(max-width: 767px), (pointer: coarse)`), so a narrow desktop window has
215
+ * been getting the native picker all along — it now gets a native picker at a
216
+ * touch size rather than a desktop size, which is the smaller surprise of the
217
+ * two.
218
+ *
219
+ * `Button`'s docblock says nothing picks a touch size automatically, and that
220
+ * still holds: it is about a DESKTOP portal not growing finger-sized controls
221
+ * by accident. This branch cannot run on a desktop pointer at a desktop width.
222
+ *
223
+ * ── Where this leaves a mixed row ───────────────────────────────────────────
224
+ *
225
+ * Select is, for now, the ONLY control in the kit that picks its own touch
226
+ * rung. `Input`, `Textarea`, `DatePicker`, `TimePicker`, `DateTimePicker`,
227
+ * `InputNumber` and `TagInput` all render what they are given on every
228
+ * viewport, and `SearchableSelect` has no size axis at all — it is pinned to
229
+ * `INPUT_BASE`. So a phone form that stacks a Select against an unsized one of
230
+ * those steps 56px against a control a little over half that, and a field that
231
+ * renders a Select or an Input depending on its data (a country with states
232
+ * versus one without, say) changes height with the data.
233
+ *
234
+ * That is a real cost and it is not paid off here: whether the whole ladder
235
+ * should follow a finger is a bigger question than one control's hit target,
236
+ * and answering it in `inputClasses` would move every text field in every
237
+ * consumer. `touchSize="md"` is the seam until it is answered — it lines a
238
+ * Select back up with its neighbours without giving up the desktop listbox.
239
+ *
240
+ * `NativeSelect` remains the way out of the branch ENTIRELY, for a caller who
241
+ * wants one raw native control on every viewport. It is the heavier door:
242
+ * native on the desktop is BG#00421, the OS popup that swallows every key
243
+ * event. Reach for `touchSize` first.
244
+ */
161
245
  declare const Select: react.ForwardRefExoticComponent<SelectProps & react.RefAttributes<HTMLSelectElement>>;
162
246
 
163
247
  interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange' | 'checked' | 'className'> {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SearchConfig, C as ColumnDef, a as SortState, P as PaginatedResponse } from './index-DVekeidu.js';
2
- export { A as ALT, b as ALT_SHIFT_D, c as ALT_SHIFT_E, d as ALT_SHIFT_N, e as Accordion, f as AccordionItem, g as AccordionProps, h as Align, i as AuthScreen, j as AuthScreenProps, k as Avatar, l as AvatarGroup, m as AvatarGroupProps, n as AvatarProps, o as AvatarSize, p as AvatarStatus, B as Banner, q as BannerEmphasis, r as BannerProps, s as BannerTone, t as BarChart, u as BarChartProps, v as BreadcrumbItem, w as Breadcrumbs, x as BreadcrumbsProps, y as Button, z as ButtonProps, D as ButtonSize, E as ButtonVariant, F as CMD_A, G as CMD_DOT, H as CMD_ENTER, I as CMD_K, J as CMD_S, K as Calendar, L as CalendarMode, M as CalendarProps, N as Card, O as CardPadding, Q as CardProps, R as CellStyle, T as ChatTemplate, U as Checkbox, V as CheckboxProps, W as CheckoutTemplate, X as ColoredBadge, Y as ColoredBadgeProps, Z as ConfirmProvider, _ as ContainerFillChart, $ as ContainerFillChartProps, a0 as ContainerFillItem, a1 as CountBadge, a2 as CountBadgeProps, a3 as CountBadgeTone, a4 as DEFAULT_SHELL_STRINGS, a5 as DashboardTemplate, a6 as DataTable, a7 as DataTableColumn, a8 as DataTableColumnGroup, a9 as DataTableHeader, aa as DataTablePage, ab as DataTableProps, ac as DatePicker, ad as DatePickerProps, ae as DateRangePicker, af as DateRangePickerProps, ag as DateTimePicker, ah as DateTimePickerProps, ai as DescriptionColumns, aj as DescriptionItem, ak as DescriptionList, al as DescriptionListProps, am as Dialog, an as DialogProps, ao as DialogSize, ap as Divider, aq as DividerProps, ar as DividerSpacing, as as DonutChart, at as DonutChartProps, au as DonutSegment, av as Drawer, aw as DrawerProps, ax as DrawerSide, ay as DrawerSize, az as DropdownMenu, aA as DropdownMenuAlign, aB as DropdownMenuItem, aC as DropdownMenuProps, aD as ENTER, aE as EditableGrid, aF as EditableGridProps, aG as EmailTemplate, aH as EmptyState, aI as EmptyStateProps, aJ as ErrorBoundary, aK as ErrorBoundaryProps, aL as ErrorPage, aM as ErrorPageProps, aN as FilePicker, aO as FilePickerProps, aP as FormError, aQ as FormErrorSummary, aR as FormErrorSummaryProps, aS as FormField, aT as FormFieldProps, aU as FormLayoutPage, aV as GLASS_DIVIDER, aW as GLASS_INPUT_BG, aX as GROUP_COLORS, aY as GalleryTemplate, aZ as Gap, a_ as GlobalSearch, a$ as GlobalSearchProps, b0 as Grid, b1 as GridCols, b2 as GridColumn, b3 as GridProps, b4 as HelpCenter, b5 as HelpCenterDoc, b6 as HelpCenterProps, b7 as INPUT_BASE, b8 as INPUT_SIZES, b9 as IconButton, ba as IconButtonProps, bb as Inline, bc as InlineProps, bd as Input, be as InputNumber, bf as InputNumberProps, bg as InputProps, bh as InputSize, bi as Justify, bj as Kanban, bk as KanbanColumn, bl as KanbanProps, bm as Label, bn as LabelProps, bo as LineChart, bp as LineChartProps, bq as LineChartSeries, br as ListFooter, bs as ListLoadError, bt as ListLoadErrorProps, bu as LoadingSpinner, bv as LoadingSpinnerProps, bw as MAX_FRACTION_DIGITS, bx as MOD, by as Markdown, bz as MarkdownProps, bA as MediaUploadField, bB as MediaUploadFieldProps, bC as MediaUploadGrid, bD as MediaUploadGridItem, bE as MediaUploadGridProps, bF as MetricBar, bG as MetricBarProps, bH as Milestone, bI as MilestoneKind, bJ as MilestoneTimeline, bK as MilestoneTimelineProps, bL as NativeSelect, bM as NumericKeypad, bN as NumericKeypadProps, bO as PageHeader, bP as PageHeaderProps, bQ as Pagination, bR as PaginationProps, bS as Paragraph, bT as ParagraphProps, bU as PopupMenu, bV as PopupMenuDivider, bW as PopupMenuItem, bX as PopupMenuLabel, bY as Radio, bZ as RadioProps, b_ as Result, b$ as ResultProps, c0 as ResultStatus, c1 as SHIFT, c2 as SearchProvider, c3 as SearchResult, c4 as SearchableOption, c5 as SearchableSelect, c6 as SearchableSelectProps, c7 as Segmented, c8 as SegmentedOption, c9 as SegmentedProps, ca as SegmentedSize, cb as Select, cc as SelectOption, cd as SelectProps, ce as SemanticGroup, cf as SeverityTone, cg as ShellPrefsAdapter, ch as ShellPrefsProvider, ci as ShellStrings, cj as ShellStringsOverride, ck as ShellStringsProvider, cl as SidebarActionButton, cm as SidebarActionButtonProps, cn as SidebarGroupLabel, co as SidebarLayout, cp as SidebarLayoutProps, cq as SidebarNavItem, cr as Skeleton, cs as SkeletonProps, ct as SkeletonVariant, cu as Sparkline, cv as SparklineProps, cw as Stack, cx as StackProps, cy as StatCard, cz as StatCardProps, cA as Statistic, cB as StatisticProps, cC as StatisticSize, cD as StatisticTone, cE as StatusBadge, cF as StatusBadgeProvider, cG as StepItem, cH as Stepper, cI as StepperProps, cJ as Switch, cK as SwitchProps, cL as SwitchSize, cM as TabItem, cN as Tabs, cO as TabsProps, cP as TagInput, cQ as TagInputOption, cR as TagInputProps, cS as Text, cT as TextProps, cU as TextSize, cV as TextTone, cW as TextWeight, cX as Textarea, cY as TextareaProps, cZ as Theme, c_ as TileButton, c$ as TileButtonProps, d0 as TileSize, d1 as TimePicker, d2 as TimePickerProps, d3 as Title, d4 as TitleLevel, d5 as TitleProps, d6 as ToastOptions, d7 as ToastPlacement, d8 as Tooltip, d9 as TooltipProps, da as TopNav, db as TopNavItem, dc as TopNavProps, dd as VERSION, de as appendKey, df as applyThemePrefs, dg as backspace, dh as confirm, di as confirmDestructive, dj as formatDate, dk as fromDateKey, dl as glassStyle, dm as inputClasses, dn as isMac, dp as isSeverityTone, dq as mediaFileName, dr as prompt, ds as resolveTheme, dt as severityOf, du as tabButtonId, dv as tabPanelId, dw as toDateKey, dx as toISODate, dy as toast, dz as useClickOutside, dA as useConfirm, dB as useFocusTrap, dC as useIsMobile, dD as useLocalStoragePrefs, dE as useScrollLock, dF as useShellPrefs, dG as useShellStrings, dH as useTheme } from './index-DVekeidu.js';
1
+ import { S as SearchConfig, C as ColumnDef, a as SortState, P as PaginatedResponse } from './index-C_uCjbAh.js';
2
+ export { A as ALT, b as ALT_SHIFT_D, c as ALT_SHIFT_E, d as ALT_SHIFT_N, e as Accordion, f as AccordionItem, g as AccordionProps, h as Align, i as AuthScreen, j as AuthScreenProps, k as Avatar, l as AvatarGroup, m as AvatarGroupProps, n as AvatarProps, o as AvatarSize, p as AvatarStatus, B as Banner, q as BannerEmphasis, r as BannerProps, s as BannerTone, t as BarChart, u as BarChartProps, v as BreadcrumbItem, w as Breadcrumbs, x as BreadcrumbsProps, y as Button, z as ButtonProps, D as ButtonSize, E as ButtonVariant, F as CMD_A, G as CMD_DOT, H as CMD_ENTER, I as CMD_K, J as CMD_S, K as Calendar, L as CalendarMode, M as CalendarProps, N as Card, O as CardPadding, Q as CardProps, R as CellStyle, T as ChatTemplate, U as Checkbox, V as CheckboxProps, W as CheckoutTemplate, X as ColoredBadge, Y as ColoredBadgeProps, Z as ConfirmProvider, _ as ContainerFillChart, $ as ContainerFillChartProps, a0 as ContainerFillItem, a1 as CountBadge, a2 as CountBadgeProps, a3 as CountBadgeTone, a4 as DEFAULT_SHELL_STRINGS, a5 as DashboardTemplate, a6 as DataTable, a7 as DataTableColumn, a8 as DataTableColumnGroup, a9 as DataTableHeader, aa as DataTablePage, ab as DataTableProps, ac as DatePicker, ad as DatePickerProps, ae as DateRangePicker, af as DateRangePickerProps, ag as DateTimePicker, ah as DateTimePickerProps, ai as DescriptionColumns, aj as DescriptionItem, ak as DescriptionList, al as DescriptionListProps, am as Dialog, an as DialogProps, ao as DialogSize, ap as Divider, aq as DividerProps, ar as DividerSpacing, as as DonutChart, at as DonutChartProps, au as DonutSegment, av as Drawer, aw as DrawerProps, ax as DrawerSide, ay as DrawerSize, az as DropdownMenu, aA as DropdownMenuAlign, aB as DropdownMenuItem, aC as DropdownMenuProps, aD as ENTER, aE as EditableGrid, aF as EditableGridProps, aG as EmailTemplate, aH as EmptyState, aI as EmptyStateProps, aJ as ErrorBoundary, aK as ErrorBoundaryProps, aL as ErrorPage, aM as ErrorPageProps, aN as FilePicker, aO as FilePickerProps, aP as FormError, aQ as FormErrorSummary, aR as FormErrorSummaryProps, aS as FormField, aT as FormFieldProps, aU as FormLayoutPage, aV as GLASS_DIVIDER, aW as GLASS_INPUT_BG, aX as GROUP_COLORS, aY as GalleryTemplate, aZ as Gap, a_ as GlobalSearch, a$ as GlobalSearchProps, b0 as Grid, b1 as GridCols, b2 as GridColumn, b3 as GridProps, b4 as HelpCenter, b5 as HelpCenterDoc, b6 as HelpCenterProps, b7 as INPUT_BASE, b8 as INPUT_SIZES, b9 as IconButton, ba as IconButtonProps, bb as Inline, bc as InlineProps, bd as Input, be as InputNumber, bf as InputNumberProps, bg as InputProps, bh as InputSize, bi as Justify, bj as Kanban, bk as KanbanColumn, bl as KanbanProps, bm as Label, bn as LabelProps, bo as LineChart, bp as LineChartProps, bq as LineChartSeries, br as ListFooter, bs as ListLoadError, bt as ListLoadErrorProps, bu as LoadingSpinner, bv as LoadingSpinnerProps, bw as MAX_FRACTION_DIGITS, bx as MOD, by as Markdown, bz as MarkdownProps, bA as MediaUploadField, bB as MediaUploadFieldProps, bC as MediaUploadGrid, bD as MediaUploadGridItem, bE as MediaUploadGridProps, bF as MetricBar, bG as MetricBarProps, bH as Milestone, bI as MilestoneKind, bJ as MilestoneTimeline, bK as MilestoneTimelineProps, bL as NativeSelect, bM as NumericKeypad, bN as NumericKeypadProps, bO as PageHeader, bP as PageHeaderProps, bQ as Pagination, bR as PaginationProps, bS as Paragraph, bT as ParagraphProps, bU as PopupMenu, bV as PopupMenuDivider, bW as PopupMenuItem, bX as PopupMenuLabel, bY as Radio, bZ as RadioProps, b_ as Result, b$ as ResultProps, c0 as ResultStatus, c1 as SHIFT, c2 as SearchProvider, c3 as SearchResult, c4 as SearchableOption, c5 as SearchableSelect, c6 as SearchableSelectProps, c7 as Segmented, c8 as SegmentedOption, c9 as SegmentedProps, ca as SegmentedSize, cb as Select, cc as SelectOption, cd as SelectProps, ce as SemanticGroup, cf as SeverityTone, cg as ShellPrefsAdapter, ch as ShellPrefsProvider, ci as ShellStrings, cj as ShellStringsOverride, ck as ShellStringsProvider, cl as SidebarActionButton, cm as SidebarActionButtonProps, cn as SidebarGroupLabel, co as SidebarLayout, cp as SidebarLayoutProps, cq as SidebarNavItem, cr as Skeleton, cs as SkeletonProps, ct as SkeletonVariant, cu as Sparkline, cv as SparklineProps, cw as Stack, cx as StackProps, cy as StatCard, cz as StatCardProps, cA as Statistic, cB as StatisticProps, cC as StatisticSize, cD as StatisticTone, cE as StatusBadge, cF as StatusBadgeProvider, cG as StepItem, cH as Stepper, cI as StepperProps, cJ as Switch, cK as SwitchProps, cL as SwitchSize, cM as TabItem, cN as Tabs, cO as TabsProps, cP as TagInput, cQ as TagInputOption, cR as TagInputProps, cS as Text, cT as TextProps, cU as TextSize, cV as TextTone, cW as TextWeight, cX as Textarea, cY as TextareaProps, cZ as Theme, c_ as TileButton, c$ as TileButtonProps, d0 as TileSize, d1 as TimePicker, d2 as TimePickerProps, d3 as Title, d4 as TitleLevel, d5 as TitleProps, d6 as ToastOptions, d7 as ToastPlacement, d8 as Tooltip, d9 as TooltipProps, da as TopNav, db as TopNavItem, dc as TopNavProps, dd as VERSION, de as appendKey, df as applyThemePrefs, dg as backspace, dh as confirm, di as confirmDestructive, dj as formatDate, dk as fromDateKey, dl as glassStyle, dm as inputClasses, dn as isMac, dp as isSeverityTone, dq as mediaFileName, dr as prompt, ds as resolveTheme, dt as severityOf, du as tabButtonId, dv as tabPanelId, dw as toDateKey, dx as toISODate, dy as toast, dz as useClickOutside, dA as useConfirm, dB as useFocusTrap, dC as useIsMobile, dD as useLocalStoragePrefs, dE as useScrollLock, dF as useShellPrefs, dG as useShellStrings, dH as useTheme } from './index-C_uCjbAh.js';
3
3
  import { W as WindowRegistry } from './types-C4Fy2SUD.js';
4
4
  export { M as ModalRegistryEntry, P as PageRegistryEntry, a as WindowRegistryEntry, i as isEntityEntry, b as isPageEntry, s as setShellWindowRegistry } from './types-C4Fy2SUD.js';
5
5
  import * as react from 'react';
@@ -1355,6 +1355,13 @@ interface EntityListProps<T> {
1355
1355
  isError?: boolean;
1356
1356
  /** Retry handler for the error state — wire the data source's `refetch`. */
1357
1357
  onRetry?: () => void;
1358
+ /** Heading for the error state, e.g. "Couldn't load candidates". Omit for
1359
+ * {@link ListLoadError}'s generic "Couldn't load this list" — name the
1360
+ * entity where the list has one, so an outage reads as *this* list failing. */
1361
+ errorTitle?: string;
1362
+ /** Explanatory line under {@link EntityListProps.errorTitle}. Omit for
1363
+ * ListLoadError's generic connection/retry message. */
1364
+ errorMessage?: string;
1358
1365
  tableId: string;
1359
1366
  columns: EntityListColumn[];
1360
1367
  renderCell: (item: T, colKey: string) => ReactNode;
@@ -1865,6 +1872,17 @@ interface PdfActionButtonProps {
1865
1872
  onPreviewOpened?: (filename: string) => void;
1866
1873
  /** Optional leading icon override for the button (defaults to a document glyph). */
1867
1874
  icon?: ReactNode;
1875
+ /**
1876
+ * How long to wait for `fetchPdf()` before giving up, in milliseconds.
1877
+ * Defaults to 30 seconds. Pass `0` (or `Infinity`) to wait for ever.
1878
+ *
1879
+ * This exists because a promise that never settles used to leave the Preview
1880
+ * window on its "LOADING PDF" placeholder indefinitely, so a slow document
1881
+ * and a dead one were indistinguishable to the person waiting. Timing out
1882
+ * turns that silence into a stated failure. The request itself is not
1883
+ * cancelled — the consumer owns the transport (see `withTimeout`).
1884
+ */
1885
+ timeoutMs?: number;
1868
1886
  }
1869
1887
  /**
1870
1888
  * A dropdown PDF button that can Preview the document in the shell's Preview
@@ -1878,7 +1896,7 @@ interface PdfActionButtonProps {
1878
1896
  * recent-documents logging) are lifted to the optional `onEmail` /
1879
1897
  * `onPreviewOpened` callbacks.
1880
1898
  */
1881
- declare function PdfActionButton({ fetchPdf, filename, label, className, disabled, onEmail, onPreviewOpened, icon, }: PdfActionButtonProps): react_jsx_runtime.JSX.Element;
1899
+ declare function PdfActionButton({ fetchPdf, filename, label, className, disabled, onEmail, onPreviewOpened, icon, timeoutMs, }: PdfActionButtonProps): react_jsx_runtime.JSX.Element;
1882
1900
 
1883
1901
  interface ShellAuth {
1884
1902
  /** Returns true if the current user has any of the listed permission codes. */
package/dist/index.js CHANGED
@@ -5,8 +5,8 @@ export { ImageAnnotator_default as ImageAnnotator } from './chunk-AXWC3332.js';
5
5
  import { publishDesktopFolders, requestFilesTrashView, FolderGlyph, requestFilesDesktopFolderView, FileIconTile } from './chunk-OQ7GRU7G.js';
6
6
  import './chunk-4SQU5YV6.js';
7
7
  import { setPdfPreview } from './chunk-BV6SQ46N.js';
8
- import { CMD_K, CMD_DOT, SHIFT, MOD, ENTER, CMD_A, ALT_SHIFT_N, ALT_SHIFT_E, CMD_ENTER, CMD_S, ALT_SHIFT_D, CMD_Z, CMD_SHIFT_Z, formatDate, useTheme, GlobalSearch, resolveTheme, useClickOutside, ListLoadError, ListFooter, firstEnabledIndex, Button_default, FormField, Input_default, applyThemePrefs, lastEnabledIndex, nextEnabledIndex, matchTypeahead } from './chunk-S6K37RLY.js';
9
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, Button_default as Button, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Calendar, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DatePicker_default as DatePicker, DateRangePicker, DateTimePicker_default as DateTimePicker, DescriptionList, Divider, DonutChart, Drawer, DropdownMenu, ENTER, EmailTemplate, EmptyState, ErrorBoundary, ErrorPage, FilePicker, FormErrorSummary, FormField, FormLayoutPage, GROUP_COLORS, GalleryTemplate, GlobalSearch, Grid, HelpCenter, INPUT_BASE, INPUT_SIZES, IconButton_default as IconButton, Inline, Input_default as Input, InputNumber_default as InputNumber, Kanban, Label, LineChart, ListFooter, ListLoadError, LoadingSpinner, MAX_FRACTION_DIGITS, MOD, Markdown, MediaUploadField, MediaUploadGrid, MetricBar, MilestoneTimeline, NativeSelect, NumericKeypad, PageHeader, Pagination, Paragraph, Radio_default as Radio, Result, SHIFT, SearchableSelect, Segmented, Select_default as Select, SidebarActionButton, SidebarGroupLabel, SidebarNavItem, Skeleton, Sparkline, Stack, StatCard, Statistic, StatusBadge, StatusBadgeProvider, Stepper, Switch_default as Switch, Tabs, TagInput, Text, Textarea_default as Textarea, TileButton_default as TileButton, TimePicker_default as TimePicker, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, fromKey as fromDateKey, inputClasses, isMac, isSeverityTone, mediaFileName, resolveTheme, severityOf, tabButtonId, tabPanelId, toKey as toDateKey, toISODate, useClickOutside, useTheme } from './chunk-S6K37RLY.js';
8
+ import { CMD_K, CMD_DOT, SHIFT, MOD, ENTER, CMD_A, ALT_SHIFT_N, ALT_SHIFT_E, CMD_ENTER, CMD_S, ALT_SHIFT_D, CMD_Z, CMD_SHIFT_Z, formatDate, useTheme, GlobalSearch, resolveTheme, useClickOutside, ListLoadError, ListFooter, firstEnabledIndex, Button_default, FormField, Input_default, applyThemePrefs, lastEnabledIndex, nextEnabledIndex, matchTypeahead } from './chunk-VDKHMCWT.js';
9
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, Button_default as Button, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Calendar, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DatePicker_default as DatePicker, DateRangePicker, DateTimePicker_default as DateTimePicker, DescriptionList, Divider, DonutChart, Drawer, DropdownMenu, ENTER, EmailTemplate, EmptyState, ErrorBoundary, ErrorPage, FilePicker, FormErrorSummary, FormField, FormLayoutPage, GROUP_COLORS, GalleryTemplate, GlobalSearch, Grid, HelpCenter, INPUT_BASE, INPUT_SIZES, IconButton_default as IconButton, Inline, Input_default as Input, InputNumber_default as InputNumber, Kanban, Label, LineChart, ListFooter, ListLoadError, LoadingSpinner, MAX_FRACTION_DIGITS, MOD, Markdown, MediaUploadField, MediaUploadGrid, MetricBar, MilestoneTimeline, NativeSelect, NumericKeypad, PageHeader, Pagination, Paragraph, Radio_default as Radio, Result, SHIFT, SearchableSelect, Segmented, Select_default as Select, SidebarActionButton, SidebarGroupLabel, SidebarNavItem, Skeleton, Sparkline, Stack, StatCard, Statistic, StatusBadge, StatusBadgeProvider, Stepper, Switch_default as Switch, Tabs, TagInput, Text, Textarea_default as Textarea, TileButton_default as TileButton, TimePicker_default as TimePicker, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, fromKey as fromDateKey, inputClasses, isMac, isSeverityTone, mediaFileName, resolveTheme, severityOf, tabButtonId, tabPanelId, toKey as toDateKey, toISODate, useClickOutside, useTheme } from './chunk-VDKHMCWT.js';
10
10
  export { Breadcrumbs } from './chunk-HNH7FOYB.js';
11
11
  import { withSpareRow, EditableGrid } from './chunk-DC6BYGZ6.js';
12
12
  export { EditableGrid } from './chunk-DC6BYGZ6.js';
@@ -14,13 +14,13 @@ import { SidebarLayout } from './chunk-YG45DAUT.js';
14
14
  export { SidebarLayout } from './chunk-YG45DAUT.js';
15
15
  import { toast_default } from './chunk-2VM2FRZJ.js';
16
16
  export { toast_default as toast } from './chunk-2VM2FRZJ.js';
17
- import { APP_VERSION, VERSION } from './chunk-Y2DKWEPS.js';
18
- export { VERSION } from './chunk-Y2DKWEPS.js';
17
+ import { APP_VERSION, VERSION } from './chunk-6E3DBIGQ.js';
18
+ export { VERSION } from './chunk-6E3DBIGQ.js';
19
19
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
20
20
  import { useAuth } from './chunk-EWDYCO65.js';
21
21
  export { setShellAuthBridge } from './chunk-EWDYCO65.js';
22
- import { cancelWindowFront, requestWindowFront, useWindowManager, WINDOW_REGISTRY, isPageEntry, Modal, setPerfCollecting, drainPerfEvents, markMenuOpen, SIDEBAR_STRIP_W, forgetMaximizedWindowBoxes, ModalActions, useModalActive, client_default, LoadingSpinner, isShellApiClientConfigured, useUndo, useEnclosingModalId, CancelButton, setWindowPosition } from './chunk-UEJC6VOM.js';
23
- export { CancelButton, CopyButton, DocFavStar, MODAL_SUBMIT_SELECTOR, Modal, ModalActions, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useEnclosingModalId, useIsActiveWindow, useModalActive, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-UEJC6VOM.js';
22
+ import { cancelWindowFront, requestWindowFront, useWindowManager, WINDOW_REGISTRY, isPageEntry, Modal, setPerfCollecting, drainPerfEvents, markMenuOpen, SIDEBAR_STRIP_W, forgetMaximizedWindowBoxes, ModalActions, useModalActive, client_default, LoadingSpinner, isShellApiClientConfigured, useUndo, useEnclosingModalId, CancelButton, setWindowPosition } from './chunk-EXSEW5F3.js';
23
+ export { CancelButton, CopyButton, DocFavStar, MODAL_SUBMIT_SELECTOR, Modal, ModalActions, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useEnclosingModalId, useIsActiveWindow, useModalActive, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-EXSEW5F3.js';
24
24
  import { useShellStrings, useShellPrefs, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, useIsMobile } from './chunk-BLLINYDD.js';
25
25
  export { DEFAULT_SHELL_STRINGS, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, ShellStringsProvider, useIsMobile, useLocalStoragePrefs, useShellPrefs, useShellStrings } from './chunk-BLLINYDD.js';
26
26
  import { registerModalEscapeInterceptor } from './chunk-CDR2Q64Q.js';
@@ -341,14 +341,14 @@ function NotificationBell({
341
341
  ] })
342
342
  ] }) }),
343
343
  /* @__PURE__ */ jsx(PopupMenuDivider, {}),
344
- /* @__PURE__ */ jsx("div", { className: "overflow-y-auto", style: { flex: "1 1 auto", minHeight: 0 }, children: notifications.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-8 px-4 text-center", children: [
344
+ /* @__PURE__ */ jsx("div", { className: "overflow-y-auto overflow-x-hidden", style: { flex: "1 1 auto", minHeight: 0 }, children: notifications.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-8 px-4 text-center", children: [
345
345
  /* @__PURE__ */ jsx("svg", { className: "h-8 w-8 text-gray-300 mb-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" }) }),
346
346
  /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 font-medium", children: strings.caughtUp }),
347
347
  /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 mt-0.5", children: strings.empty })
348
348
  ] }) : notifications.map((notif) => /* @__PURE__ */ jsxs(PopupMenuItem, { onClick: () => handleClick(notif), children: [
349
349
  /* @__PURE__ */ jsx("div", { className: "pt-0.5 shrink-0", children: !notif.is_read ? /* @__PURE__ */ jsx("div", { className: "h-2 w-2 rounded-full bg-blue-500" }) : /* @__PURE__ */ jsx("div", { className: "h-2 w-2" }) }),
350
350
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
351
- /* @__PURE__ */ jsx("p", { className: `text-sm leading-tight ${!notif.is_read ? "font-medium" : ""}`, children: notif.title }),
351
+ /* @__PURE__ */ jsx("p", { className: `text-sm leading-tight break-words ${!notif.is_read ? "font-medium" : ""}`, children: notif.title }),
352
352
  notif.message && /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500 mt-0.5 truncate", children: notif.message }),
353
353
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mt-1", children: [
354
354
  /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-400", children: timeAgo(notif.created_at) }),
@@ -2866,7 +2866,7 @@ function StartMenu({
2866
2866
  )
2867
2867
  ] })
2868
2868
  ] }),
2869
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400 text-center py-12", children: "No matching apps" }) : filtered.map(({ item, sectionLabel }, i) => {
2869
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere", children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400 text-center py-12", children: "No matching apps" }) : filtered.map(({ item, sectionLabel }, i) => {
2870
2870
  const icon = navIcons2[item.to];
2871
2871
  return /* @__PURE__ */ jsxs(
2872
2872
  "button",
@@ -3049,7 +3049,7 @@ function StartMenu({
3049
3049
  ] })
3050
3050
  }
3051
3051
  ),
3052
- search.length >= 2 ? /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto px-1 pb-2 max-h-[400px]", children: searchResults.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 text-center py-4", children: "No results" }) : searchResults.map((r, i) => /* @__PURE__ */ jsxs(
3052
+ search.length >= 2 ? /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere px-1 pb-2 max-h-[400px]", children: searchResults.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 text-center py-4", children: "No results" }) : searchResults.map((r, i) => /* @__PURE__ */ jsxs(
3053
3053
  "button",
3054
3054
  {
3055
3055
  onClick: () => handleClick(r.to),
@@ -3062,7 +3062,7 @@ function StartMenu({
3062
3062
  ]
3063
3063
  },
3064
3064
  i
3065
- )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto px-1 pb-1 flex flex-col", children: [
3065
+ )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere px-1 pb-1 flex flex-col", children: [
3066
3066
  isVertical && /* @__PURE__ */ jsxs(Fragment, { children: [
3067
3067
  footerItems.map((item) => /* @__PURE__ */ jsxs(
3068
3068
  "button",
@@ -3174,7 +3174,7 @@ function StartMenu({
3174
3174
  style: menuGlass,
3175
3175
  onMouseEnter: () => scheduleClose(i + 1),
3176
3176
  onMouseLeave: () => scheduleClose(i),
3177
- children: /* @__PURE__ */ jsx("div", { className: "py-1 px-1 overflow-y-auto overscroll-contain", style: { maxHeight: availH }, children: items.map((item) => {
3177
+ children: /* @__PURE__ */ jsx("div", { className: "py-1 px-1 overflow-y-auto overflow-x-hidden wrap-anywhere overscroll-contain", style: { maxHeight: availH }, children: items.map((item) => {
3178
3178
  const kids = submenuItems(item);
3179
3179
  const isOpen = openPath[i + 1]?.key === item.to;
3180
3180
  return /* @__PURE__ */ jsxs(
@@ -5223,6 +5223,8 @@ function EntityList(props) {
5223
5223
  totalCount,
5224
5224
  isError,
5225
5225
  onRetry,
5226
+ errorTitle,
5227
+ errorMessage,
5226
5228
  tableId,
5227
5229
  columns,
5228
5230
  renderCell,
@@ -5315,7 +5317,9 @@ function EntityList(props) {
5315
5317
  }
5316
5318
  };
5317
5319
  if (isLoading) return /* @__PURE__ */ jsx(LoadingSpinner, {});
5318
- if (isError && items.length === 0) return /* @__PURE__ */ jsx(ListLoadError, { onRetry });
5320
+ if (isError && items.length === 0) {
5321
+ return /* @__PURE__ */ jsx(ListLoadError, { title: errorTitle, message: errorMessage, onRetry });
5322
+ }
5319
5323
  if (items.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: emptyState });
5320
5324
  const allSelected = items.length > 0 && selected.size === items.length;
5321
5325
  const fullColumns = [
@@ -6851,6 +6855,24 @@ function ChangePasswordForm({
6851
6855
  ] }) })
6852
6856
  ] });
6853
6857
  }
6858
+
6859
+ // src/shell/withTimeout.ts
6860
+ var TIMED_OUT = /* @__PURE__ */ Symbol("react-os-shell:timed-out");
6861
+ async function withTimeout(work, ms) {
6862
+ if (!Number.isFinite(ms) || ms <= 0) return work;
6863
+ let timer;
6864
+ try {
6865
+ return await Promise.race([
6866
+ work,
6867
+ new Promise((resolve) => {
6868
+ timer = setTimeout(() => resolve(TIMED_OUT), ms);
6869
+ })
6870
+ ]);
6871
+ } finally {
6872
+ if (timer !== void 0) clearTimeout(timer);
6873
+ }
6874
+ }
6875
+ var DEFAULT_TIMEOUT_MS = 3e4;
6854
6876
  var DEFAULT_BUTTON_CLASS = "inline-flex items-center gap-1.5 bg-white text-gray-700 border border-gray-300 px-3 py-1.5 text-sm font-medium rounded-lg hover:bg-gray-50 disabled:opacity-50";
6855
6877
  var DocumentIcon = /* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" }) });
6856
6878
  function PdfActionButton({
@@ -6861,7 +6883,8 @@ function PdfActionButton({
6861
6883
  disabled,
6862
6884
  onEmail,
6863
6885
  onPreviewOpened,
6864
- icon
6886
+ icon,
6887
+ timeoutMs = DEFAULT_TIMEOUT_MS
6865
6888
  }) {
6866
6889
  const [open, setOpen] = useState(false);
6867
6890
  const [loading, setLoading] = useState(false);
@@ -6877,7 +6900,7 @@ function PdfActionButton({
6877
6900
  const resolvePdf = async () => {
6878
6901
  setLoading(true);
6879
6902
  try {
6880
- return await fetchPdf();
6903
+ return await withTimeout(fetchPdf(), timeoutMs);
6881
6904
  } finally {
6882
6905
  setLoading(false);
6883
6906
  }
@@ -6885,6 +6908,10 @@ function PdfActionButton({
6885
6908
  const handleDownload = async () => {
6886
6909
  setOpen(false);
6887
6910
  const blob = await resolvePdf();
6911
+ if (blob === TIMED_OUT) {
6912
+ toast_default.error(`${filename} took too long to load. Please try again.`);
6913
+ return;
6914
+ }
6888
6915
  if (!blob) return;
6889
6916
  const url = window.URL.createObjectURL(blob);
6890
6917
  const a = document.createElement("a");
@@ -6899,6 +6926,14 @@ function PdfActionButton({
6899
6926
  const handle = setPdfPreview({ filename, converting: true, convertingMessage: "LOADING PDF" });
6900
6927
  openPage("/preview");
6901
6928
  const blob = await resolvePdf();
6929
+ if (blob === TIMED_OUT) {
6930
+ handle.update({
6931
+ filename,
6932
+ converting: false,
6933
+ convertingMessage: "This document took too long to load. Close this window and try again."
6934
+ });
6935
+ return;
6936
+ }
6902
6937
  if (!blob) {
6903
6938
  handle.update({ filename, converting: false, convertingMessage: "Failed to load PDF." });
6904
6939
  return;
@@ -6910,6 +6945,10 @@ function PdfActionButton({
6910
6945
  const handleEmail = async () => {
6911
6946
  setOpen(false);
6912
6947
  const blob = await resolvePdf();
6948
+ if (blob === TIMED_OUT) {
6949
+ toast_default.error(`${filename} took too long to load. Please try again.`);
6950
+ return;
6951
+ }
6913
6952
  if (!blob || !onEmail) return;
6914
6953
  onEmail(blob);
6915
6954
  };