react-os-shell 3.2.0 → 3.3.0

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 (33) hide show
  1. package/dist/{Browser-TFQONJQX.js → Browser-ZNEYNG2T.js} +4 -4
  2. package/dist/{Browser-TFQONJQX.js.map → Browser-ZNEYNG2T.js.map} +1 -1
  3. package/dist/{Documents-Z4O2GRZT.js → Documents-JLFY2LT2.js} +3 -3
  4. package/dist/{Documents-Z4O2GRZT.js.map → Documents-JLFY2LT2.js.map} +1 -1
  5. package/dist/Files-PX52MFPM.js +12 -0
  6. package/dist/{Files-WAOETZWW.js.map → Files-PX52MFPM.js.map} +1 -1
  7. package/dist/{Notepad-LANT34EE.js → Notepad-XA45TQKF.js} +3 -3
  8. package/dist/{Notepad-LANT34EE.js.map → Notepad-XA45TQKF.js.map} +1 -1
  9. package/dist/Preview-V4D7KDJW.js +8 -0
  10. package/dist/{Preview-V7XEP6IS.js.map → Preview-V4D7KDJW.js.map} +1 -1
  11. package/dist/{Spreadsheet-H72MNLPY.js → Spreadsheet-DFOEXXRX.js} +4 -4
  12. package/dist/{Spreadsheet-H72MNLPY.js.map → Spreadsheet-DFOEXXRX.js.map} +1 -1
  13. package/dist/apps/index.d.ts +13 -14
  14. package/dist/apps/index.js +12 -12
  15. package/dist/{chunk-BP64T33A.js → chunk-4WUEFQWP.js} +3 -3
  16. package/dist/{chunk-BP64T33A.js.map → chunk-4WUEFQWP.js.map} +1 -1
  17. package/dist/{chunk-NPUPL2BV.js → chunk-F25NBUMJ.js} +3 -3
  18. package/dist/{chunk-NPUPL2BV.js.map → chunk-F25NBUMJ.js.map} +1 -1
  19. package/dist/{chunk-Q3URRVBM.js → chunk-GM3VN2NL.js} +4 -4
  20. package/dist/{chunk-Q3URRVBM.js.map → chunk-GM3VN2NL.js.map} +1 -1
  21. package/dist/{chunk-JOS6DJXX.js → chunk-WKJ4YVF5.js} +4 -4
  22. package/dist/{chunk-JOS6DJXX.js.map → chunk-WKJ4YVF5.js.map} +1 -1
  23. package/dist/{chunk-2KG5N3NF.js → chunk-WZIH7WZM.js} +3 -3
  24. package/dist/{chunk-2KG5N3NF.js.map → chunk-WZIH7WZM.js.map} +1 -1
  25. package/dist/{chunk-S4EUCOF4.js → chunk-XM647QLH.js} +3 -3
  26. package/dist/{chunk-S4EUCOF4.js.map → chunk-XM647QLH.js.map} +1 -1
  27. package/dist/index.d.ts +45 -46
  28. package/dist/index.js +45 -7
  29. package/dist/index.js.map +1 -1
  30. package/dist/{types-CTPtgkiG.d.ts → types-CXBKusuC.d.ts} +1 -1
  31. package/package.json +1 -1
  32. package/dist/Files-WAOETZWW.js +0 -12
  33. package/dist/Preview-V7XEP6IS.js +0 -8
@@ -4,7 +4,7 @@ import { useState, useCallback, isValidElement, cloneElement } from 'react';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
6
  // src/version.ts
7
- var VERSION = "3.2.0" ;
7
+ var VERSION = "3.3.0" ;
8
8
  var APP_VERSION = VERSION;
9
9
  var BUILTIN_APP_INFO = {
10
10
  spreadsheet: {
@@ -77,5 +77,5 @@ function AboutApp({ app }) {
77
77
  }
78
78
 
79
79
  export { APP_VERSION, AboutApp, BUILTIN_APP_INFO, VERSION };
80
- //# sourceMappingURL=chunk-S4EUCOF4.js.map
81
- //# sourceMappingURL=chunk-S4EUCOF4.js.map
80
+ //# sourceMappingURL=chunk-XM647QLH.js.map
81
+ //# sourceMappingURL=chunk-XM647QLH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-S4EUCOF4.js","sourcesContent":["declare const __PKG_VERSION__: string | undefined;\n\n/** Package version, injected by tsup at build time. Stays as an empty\n * string when the source is consumed without a build (e.g. tests). */\nexport const VERSION: string = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '';\n\n/** Legacy alias kept so existing consumers do not break. */\nexport const APP_VERSION = VERSION;\n","/**\n * 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.0',\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.0',\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/version.ts","../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-XM647QLH.js","sourcesContent":["declare const __PKG_VERSION__: string | undefined;\n\n/** Package version, injected by tsup at build time. Stays as an empty\n * string when the source is consumed without a build (e.g. tests). */\nexport const VERSION: string = typeof __PKG_VERSION__ === 'string' ? __PKG_VERSION__ : '';\n\n/** Legacy alias kept so existing consumers do not break. */\nexport const APP_VERSION = VERSION;\n","/**\n * 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.0',\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.0',\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"]}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import { W as WindowRegistry } from './types-CTPtgkiG.js';
2
- export { M as ModalRegistryEntry, P as PageRegistryEntry, a as WindowRegistryEntry, i as isEntityEntry, b as isPageEntry, s as setShellWindowRegistry } from './types-CTPtgkiG.js';
1
+ import { W as WindowRegistry } from './types-CXBKusuC.js';
2
+ export { M as ModalRegistryEntry, P as PageRegistryEntry, a as WindowRegistryEntry, i as isEntityEntry, b as isPageEntry, s as setShellWindowRegistry } from './types-CXBKusuC.js';
3
3
  import * as react from 'react';
4
4
  import react__default, { ReactNode, Component, ErrorInfo, CSSProperties, Dispatch, SetStateAction, RefObject } from 'react';
5
- import * as react_jsx_runtime from 'react/jsx-runtime';
6
- import * as _tanstack_query_core from '@tanstack/query-core';
5
+ import * as _tanstack_react_query from '@tanstack/react-query';
7
6
  import { AxiosInstance } from 'axios';
8
7
 
9
8
  /**
@@ -90,7 +89,7 @@ declare function useWindowMenuItem(label: string, onClick: () => void, icon?: Re
90
89
  * than React Context, which has separate instances in each bundle). */
91
90
  declare function WindowTitle({ title }: {
92
91
  title: string;
93
- }): react_jsx_runtime.JSX.Element;
92
+ }): react.JSX.Element;
94
93
  /** @deprecated Use <WindowTitle> instead — the hook variant doesn't work
95
94
  * across bundle boundaries (apps barrel has its own ModalIdContext). */
96
95
  declare function useWindowTitle(_title: string): void;
@@ -100,7 +99,7 @@ declare function useWindowTitle(_title: string): void;
100
99
  */
101
100
  declare function CopyButton({ text }: {
102
101
  text: string;
103
- }): react_jsx_runtime.JSX.Element;
102
+ }): react.JSX.Element;
104
103
  /** Hook to check if the current modal is active (frontmost) */
105
104
  declare function useModalActive(): boolean;
106
105
  declare function ModalActions({ children, position }: {
@@ -115,7 +114,7 @@ declare function CancelButton({ onClick, children, className }: {
115
114
  onClick: () => void;
116
115
  children?: React.ReactNode;
117
116
  className?: string;
118
- }): react_jsx_runtime.JSX.Element;
117
+ }): react.JSX.Element;
119
118
  /**
120
119
  * Seed an initial position for a window — applied only when no saved
121
120
  * position already exists for the given key. Use this from the consumer
@@ -247,7 +246,7 @@ declare function Modal({ open, onClose, title, icon, copyText, size, dirty, onNe
247
246
  declare function WindowCrashedFallback({ error, onReload }: {
248
247
  error: Error;
249
248
  onReload: () => void;
250
- }): react_jsx_runtime.JSX.Element;
249
+ }): react.JSX.Element;
251
250
  interface WindowErrorBoundaryProps {
252
251
  children: ReactNode;
253
252
  /** Replaces the default inline {@link WindowCrashedFallback}. `reset`
@@ -274,7 +273,7 @@ declare class WindowErrorBoundary extends Component<WindowErrorBoundaryProps, {
274
273
  };
275
274
  componentDidCatch(error: Error, info: ErrorInfo): void;
276
275
  reset: () => void;
277
- render(): string | number | boolean | Iterable<ReactNode> | react_jsx_runtime.JSX.Element | null | undefined;
276
+ render(): string | number | boolean | Iterable<ReactNode> | react.JSX.Element | null | undefined;
278
277
  }
279
278
 
280
279
  /**
@@ -296,7 +295,7 @@ interface PopupMenuProps {
296
295
  portal?: boolean;
297
296
  }
298
297
  /** Container for a popup menu — auto-clamps to stay within viewport */
299
- declare function PopupMenu({ children, style, className, onClose, minWidth, portal }: PopupMenuProps): react_jsx_runtime.JSX.Element;
298
+ declare function PopupMenu({ children, style, className, onClose, minWidth, portal }: PopupMenuProps): react.JSX.Element;
300
299
  /** A clickable menu item */
301
300
  declare function PopupMenuItem({ onClick, children, className, danger, disabled }: {
302
301
  onClick?: () => void;
@@ -304,13 +303,13 @@ declare function PopupMenuItem({ onClick, children, className, danger, disabled
304
303
  className?: string;
305
304
  danger?: boolean;
306
305
  disabled?: boolean;
307
- }): react_jsx_runtime.JSX.Element;
306
+ }): react.JSX.Element;
308
307
  /** A divider line between menu items */
309
- declare function PopupMenuDivider(): react_jsx_runtime.JSX.Element;
308
+ declare function PopupMenuDivider(): react.JSX.Element;
310
309
  /** A section header label */
311
310
  declare function PopupMenuLabel({ children }: {
312
311
  children: ReactNode;
313
- }): react_jsx_runtime.JSX.Element;
312
+ }): react.JSX.Element;
314
313
 
315
314
  interface ConfirmOptions {
316
315
  title?: string;
@@ -339,7 +338,7 @@ interface PromptOptions {
339
338
  declare const prompt: (opts: PromptOptions | string) => Promise<string | null>;
340
339
  declare function ConfirmProvider({ children }: {
341
340
  children: React.ReactNode;
342
- }): react_jsx_runtime.JSX.Element;
341
+ }): react.JSX.Element;
343
342
 
344
343
  interface SearchResult {
345
344
  /** Category label, e.g. "Sales Order". */
@@ -365,9 +364,9 @@ interface SearchConfig {
365
364
  }
366
365
  interface GlobalSearchProps extends Partial<SearchConfig> {
367
366
  }
368
- declare function GlobalSearch({ providers, typeIcons, placeholder }?: GlobalSearchProps): react_jsx_runtime.JSX.Element | null;
367
+ declare function GlobalSearch({ providers, typeIcons, placeholder }?: GlobalSearchProps): react.JSX.Element | null;
369
368
 
370
- declare function ShortcutHelp(): react_jsx_runtime.JSX.Element;
369
+ declare function ShortcutHelp(): react.JSX.Element;
371
370
 
372
371
  /**
373
372
  * One help article. Generic shape — the consuming portal maps its own
@@ -412,13 +411,13 @@ interface HelpCenterProps {
412
411
  * Search is client-side: a case-insensitive substring match over title, body
413
412
  * and category label. While searching, matching groups auto-expand.
414
413
  */
415
- declare function HelpCenter({ docs, loading, categoryOrder, canEdit, onNew, onEdit, renderBody, emptyMessage, }: HelpCenterProps): react_jsx_runtime.JSX.Element;
414
+ declare function HelpCenter({ docs, loading, categoryOrder, canEdit, onNew, onEdit, renderBody, emptyMessage, }: HelpCenterProps): react.JSX.Element;
416
415
 
417
416
  interface MarkdownProps {
418
417
  children: string;
419
418
  className?: string;
420
419
  }
421
- declare function Markdown({ children, className }: MarkdownProps): react_jsx_runtime.JSX.Element;
420
+ declare function Markdown({ children, className }: MarkdownProps): react.JSX.Element;
422
421
 
423
422
  declare const isMac: boolean;
424
423
  /** Platform-aware modifier symbols */
@@ -507,7 +506,7 @@ interface EditableGridProps {
507
506
  * - Multi-cell paste from spreadsheets (Ctrl+V)
508
507
  * - Tab/Enter/Arrow keyboard navigation
509
508
  */
510
- declare function EditableGrid({ columns, data, onChange, onColumnsChange, fixedRows, minRows, maxHeight, cellStyles, onFocusChange, onSelectionChange }: EditableGridProps): react_jsx_runtime.JSX.Element;
509
+ declare function EditableGrid({ columns, data, onChange, onColumnsChange, fixedRows, minRows, maxHeight, cellStyles, onFocusChange, onSelectionChange }: EditableGridProps): react.JSX.Element;
511
510
 
512
511
  /**
513
512
  * Two-pane layout with a drag-to-resize sidebar (left or right).
@@ -550,7 +549,7 @@ interface SidebarLayoutProps {
550
549
  /** Classes for the main content pane. Defaults to a white background. */
551
550
  contentClassName?: string;
552
551
  }
553
- declare function SidebarLayout({ sidebar, children, side, storageKey, defaultWidth, minWidth, maxWidth, className, sidebarClassName, contentClassName, }: SidebarLayoutProps): react_jsx_runtime.JSX.Element;
552
+ declare function SidebarLayout({ sidebar, children, side, storageKey, defaultWidth, minWidth, maxWidth, className, sidebarClassName, contentClassName, }: SidebarLayoutProps): react.JSX.Element;
554
553
 
555
554
  interface SearchableOption {
556
555
  value: string;
@@ -592,7 +591,7 @@ interface SearchableSelectProps {
592
591
  * Hidden while the user is typing so the search text stays legible. */
593
592
  rightAdornment?: ReactNode;
594
593
  }
595
- declare function SearchableSelect({ value, onChange, options, placeholder, emptyOptionLabel, className, disabled, id, allowFreeText, onSearchChange, rightAdornment, }: SearchableSelectProps): react_jsx_runtime.JSX.Element;
594
+ declare function SearchableSelect({ value, onChange, options, placeholder, emptyOptionLabel, className, disabled, id, allowFreeText, onSearchChange, rightAdornment, }: SearchableSelectProps): react.JSX.Element;
596
595
 
597
596
  /**
598
597
  * Generic top navigation bar. A horizontal row of tab-style links with an
@@ -624,7 +623,7 @@ interface TopNavProps {
624
623
  actions?: ReactNode;
625
624
  className?: string;
626
625
  }
627
- declare function TopNav({ items, activeKey, onSelect, brand, actions, className }: TopNavProps): react_jsx_runtime.JSX.Element;
626
+ declare function TopNav({ items, activeKey, onSelect, brand, actions, className }: TopNavProps): react.JSX.Element;
628
627
 
629
628
  /**
630
629
  * Generic breadcrumb trail. Self-contained and styled with the same Tailwind
@@ -653,7 +652,7 @@ interface BreadcrumbsProps {
653
652
  maxItems?: number;
654
653
  className?: string;
655
654
  }
656
- declare function Breadcrumbs({ items, separator, maxItems, className }: BreadcrumbsProps): react_jsx_runtime.JSX.Element | null;
655
+ declare function Breadcrumbs({ items, separator, maxItems, className }: BreadcrumbsProps): react.JSX.Element | null;
657
656
 
658
657
  /** Generic notification shape consumed by the shell. Consumer-specific
659
658
  * fields live on `extra` (or just on additional properties — TS structural
@@ -693,17 +692,17 @@ interface NotificationsConfig {
693
692
  interface NotificationBellProps extends NotificationsConfig {
694
693
  popDirection?: 'left' | 'right';
695
694
  }
696
- declare function NotificationBell({ useUnreadCount, list, markRead, markAllRead, onItemClick, onViewAll, popDirection, }: NotificationBellProps): react_jsx_runtime.JSX.Element;
695
+ declare function NotificationBell({ useUnreadCount, list, markRead, markAllRead, onItemClick, onViewAll, popDirection, }: NotificationBellProps): react.JSX.Element;
697
696
 
698
697
  type SemanticGroup = 'success' | 'active' | 'queued' | 'info' | 'pending' | 'warning' | 'danger' | 'draft' | 'neutral';
699
698
  declare function StatusBadgeProvider({ groups, children, }: {
700
699
  groups: Record<string, SemanticGroup>;
701
700
  children: ReactNode;
702
- }): react_jsx_runtime.JSX.Element;
701
+ }): react.JSX.Element;
703
702
  interface StatusBadgeProps {
704
703
  status: string;
705
704
  }
706
- declare function StatusBadge({ status }: StatusBadgeProps): react_jsx_runtime.JSX.Element;
705
+ declare function StatusBadge({ status }: StatusBadgeProps): react.JSX.Element;
707
706
 
708
707
  /**
709
708
  * System-tray badge shown only when the app is served from a developer's own
@@ -711,7 +710,7 @@ declare function StatusBadge({ status }: StatusBadgeProps): react_jsx_runtime.JS
711
710
  * slot — it renders nothing off-localhost, so it's safe to leave wired on every
712
711
  * build. Visibility is gated on the runtime hostname; see utils/env.ts.
713
712
  */
714
- declare function DevIndicator(): react_jsx_runtime.JSX.Element | null;
713
+ declare function DevIndicator(): react.JSX.Element | null;
715
714
 
716
715
  /**
717
716
  * Dev-environment detection + browser chrome.
@@ -790,7 +789,7 @@ declare function DocFavStar({ entityType, entityId, label }: {
790
789
  entityType: string;
791
790
  entityId: string;
792
791
  label: string;
793
- }): react_jsx_runtime.JSX.Element;
792
+ }): react.JSX.Element;
794
793
  /** Public, framework-free helper: route ('/orders', '/qc-reports', …)
795
794
  * of the window the user is currently focused on. Returns undefined
796
795
  * when no app window is active (start menu / dashboard with nothing
@@ -800,7 +799,7 @@ declare function DocFavStar({ entityType, entityId, label }: {
800
799
  declare function getActiveWindowRoute(): string | undefined;
801
800
  declare function WindowManagerProvider({ children }: {
802
801
  children: ReactNode;
803
- }): react_jsx_runtime.JSX.Element;
802
+ }): react.JSX.Element;
804
803
 
805
804
  /**
806
805
  * INTERNAL stub — Desktop's About modal references the consumer-side
@@ -893,11 +892,11 @@ interface DesktopHostConfig {
893
892
  declare function DesktopHostProvider({ value, children }: {
894
893
  value: DesktopHostConfig;
895
894
  children: ReactNode;
896
- }): react_jsx_runtime.JSX.Element;
895
+ }): react.JSX.Element;
897
896
  declare function useDesktopHost(): DesktopHostConfig;
898
897
  declare function Desktop({ profile }: {
899
898
  profile: any;
900
- }): react_jsx_runtime.JSX.Element;
899
+ }): react.JSX.Element;
901
900
 
902
901
  interface LayoutProps {
903
902
  /** Brand label rendered on the start-menu button. */
@@ -946,7 +945,7 @@ interface ClockCalendarConfig {
946
945
  close: () => void;
947
946
  }) => ReactNode;
948
947
  }
949
- declare function Layout({ productName, productIcon, wallpapers, navSections, navIcons, sectionIcons, categories, notifications, search, taskbarTrayLeft, clockCalendar, }?: LayoutProps): react_jsx_runtime.JSX.Element;
948
+ declare function Layout({ productName, productIcon, wallpapers, navSections, navIcons, sectionIcons, categories, notifications, search, taskbarTrayLeft, clockCalendar, }?: LayoutProps): react.JSX.Element;
950
949
 
951
950
  interface StartMenuProps {
952
951
  open: boolean;
@@ -973,7 +972,7 @@ interface StartMenuProps {
973
972
  /** Section grouping + virtual flyouts (Utilities-style trays). */
974
973
  categories?: StartMenuCategories;
975
974
  }
976
- declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, taskbarPosition, taskbarH, taskbarW, size, navSections, navIcons, sectionIcons, categories, }: StartMenuProps): react_jsx_runtime.JSX.Element | null;
975
+ declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, taskbarPosition, taskbarH, taskbarW, size, navSections, navIcons, sectionIcons, categories, }: StartMenuProps): react.JSX.Element | null;
977
976
 
978
977
  /**
979
978
  * Widget gallery — the "manage widgets on the desktop" surface.
@@ -993,7 +992,7 @@ declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, t
993
992
  declare function WidgetManager({ open, onClose }: {
994
993
  open: boolean;
995
994
  onClose: () => void;
996
- }): react_jsx_runtime.JSX.Element | null;
995
+ }): react.JSX.Element | null;
997
996
 
998
997
  /** Sections that can be omitted from the inline Customization page when the
999
998
  * consumer renders them elsewhere (e.g. as separate entries in SystemPreferences). */
@@ -1007,7 +1006,7 @@ interface CustomizationProps {
1007
1006
  /** Render only one logical group of settings. Omit to render everything. */
1008
1007
  section?: CustomizationSection;
1009
1008
  }
1010
- declare function Customization({ omit, section }?: CustomizationProps): react_jsx_runtime.JSX.Element;
1009
+ declare function Customization({ omit, section }?: CustomizationProps): react.JSX.Element;
1011
1010
 
1012
1011
  /**
1013
1012
  * Standalone Behavior settings panel — window position, double-click,
@@ -1017,7 +1016,7 @@ declare function Customization({ omit, section }?: CustomizationProps): react_js
1017
1016
  * Reads/writes shell prefs via `useShellPrefs()`. Suitable for use as a
1018
1017
  * section in `SystemPreferences` or rendered standalone.
1019
1018
  */
1020
- declare function BehaviorPanel(): react_jsx_runtime.JSX.Element;
1019
+ declare function BehaviorPanel(): react.JSX.Element;
1021
1020
 
1022
1021
  /**
1023
1022
  * Standalone Sounds settings panel — sound effects toggle + per-event
@@ -1026,7 +1025,7 @@ declare function BehaviorPanel(): react_jsx_runtime.JSX.Element;
1026
1025
  * picked. Suitable as a section in `SystemPreferences` or rendered
1027
1026
  * standalone.
1028
1027
  */
1029
- declare function SoundsPanel(): react_jsx_runtime.JSX.Element;
1028
+ declare function SoundsPanel(): react.JSX.Element;
1030
1029
 
1031
1030
  /** One section in the SystemPreferences sidebar. */
1032
1031
  interface SystemPreferencesSection {
@@ -1073,7 +1072,7 @@ interface SystemPreferencesProps {
1073
1072
  * ]} />
1074
1073
  * ```
1075
1074
  */
1076
- declare function SystemPreferences({ sections, defaultSelected, className, }: SystemPreferencesProps): react_jsx_runtime.JSX.Element;
1075
+ declare function SystemPreferences({ sections, defaultSelected, className, }: SystemPreferencesProps): react.JSX.Element;
1077
1076
 
1078
1077
  interface ImageAnnotatorHandle {
1079
1078
  copy: () => Promise<void>;
@@ -1158,7 +1157,7 @@ interface EntityListProps<T> {
1158
1157
  * emptyState={<EmptyState message="No suppliers yet." />}
1159
1158
  * />
1160
1159
  */
1161
- declare function EntityList<T>(props: EntityListProps<T>): react_jsx_runtime.JSX.Element;
1160
+ declare function EntityList<T>(props: EntityListProps<T>): react.JSX.Element;
1162
1161
 
1163
1162
  /**
1164
1163
  * Generic, drag-and-drop Kanban board. Self-contained (native HTML5 DnD, no
@@ -1220,7 +1219,7 @@ interface KanbanProps<T> {
1220
1219
  /** Label for the per-column add button. */
1221
1220
  addItemText?: string;
1222
1221
  }
1223
- declare function Kanban<T>({ items, columns, columnOf, getId, onMove, renderCard, onCardClick, sortInColumn, isLoading, loadingText, emptyState, columnEmptyText, onAddItem, addItemText, }: KanbanProps<T>): react_jsx_runtime.JSX.Element;
1222
+ declare function Kanban<T>({ items, columns, columnOf, getId, onMove, renderCard, onCardClick, sortInColumn, isLoading, loadingText, emptyState, columnEmptyText, onAddItem, addItemText, }: KanbanProps<T>): react.JSX.Element;
1224
1223
 
1225
1224
  interface PaginatedResponse<T> {
1226
1225
  count: number;
@@ -1269,7 +1268,7 @@ interface ResizableTableProps {
1269
1268
  * - per-user persistence (via the shell-registered apiClient)
1270
1269
  * - mobile-aware selection mode toggle
1271
1270
  */
1272
- declare function ResizableTable({ tableId, columns, sort, onSort, footer, afterBody, saveDefaultPerms, children, }: ResizableTableProps): react_jsx_runtime.JSX.Element;
1271
+ declare function ResizableTable({ tableId, columns, sort, onSort, footer, afterBody, saveDefaultPerms, children, }: ResizableTableProps): react.JSX.Element;
1273
1272
 
1274
1273
  interface ListFooterProps {
1275
1274
  selectedCount: number;
@@ -1285,7 +1284,7 @@ interface ListFooterProps {
1285
1284
  * "Y of Z records · Loading more..."
1286
1285
  * "All N records loaded"
1287
1286
  */
1288
- declare function ListFooter({ selectedCount, loadedCount, totalCount, label, isFetchingMore, extra, }: ListFooterProps): react_jsx_runtime.JSX.Element;
1287
+ declare function ListFooter({ selectedCount, loadedCount, totalCount, label, isFetchingMore, extra, }: ListFooterProps): react.JSX.Element;
1289
1288
 
1290
1289
  /**
1291
1290
  * Keyboard + shift-click navigation for table rows.
@@ -1363,7 +1362,7 @@ declare function useInfiniteScroll<T>({ queryKey, fetchFn, extraParams, pageSize
1363
1362
  isFetchingNextPage: boolean;
1364
1363
  hasNextPage: boolean;
1365
1364
  sentinelRef: react.RefObject<HTMLDivElement>;
1366
- refetch: (options?: _tanstack_query_core.RefetchOptions) => Promise<_tanstack_query_core.QueryObserverResult<_tanstack_query_core.InfiniteData<PaginatedResponse<T>, unknown>, Error>>;
1365
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<_tanstack_react_query.InfiniteData<PaginatedResponse<T>, unknown>, Error>>;
1367
1366
  };
1368
1367
 
1369
1368
  /**
@@ -1390,7 +1389,7 @@ interface ShellAuth {
1390
1389
  declare function ShellAuthProvider({ value, children }: {
1391
1390
  value: ShellAuth;
1392
1391
  children: ReactNode;
1393
- }): react_jsx_runtime.JSX.Element;
1392
+ }): react.JSX.Element;
1394
1393
  declare function useShellAuth(): ShellAuth;
1395
1394
 
1396
1395
  interface ShellPrefsAdapter {
@@ -1403,7 +1402,7 @@ interface ShellPrefsAdapter {
1403
1402
  declare function ShellPrefsProvider({ value, children, }: {
1404
1403
  value: ShellPrefsAdapter;
1405
1404
  children: ReactNode;
1406
- }): react_jsx_runtime.JSX.Element;
1405
+ }): react.JSX.Element;
1407
1406
  /** Default localStorage-backed adapter — useful when the consumer doesn't
1408
1407
  * ship a backend. Pass the result into <ShellPrefsProvider value={…}>.
1409
1408
  *
@@ -1420,7 +1419,7 @@ type EntityFetcher = (endpoint: string, id: string) => Promise<any>;
1420
1419
  declare function ShellEntityFetcherProvider({ value, children, }: {
1421
1420
  value: EntityFetcher;
1422
1421
  children: ReactNode;
1423
- }): react_jsx_runtime.JSX.Element;
1422
+ }): react.JSX.Element;
1424
1423
  /** Returns the consumer-supplied entity fetcher, or a stub that throws
1425
1424
  * on call. Components that fetch entities call this hook eagerly so any
1426
1425
  * misconfiguration surfaces synchronously rather than at click-time. */
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  import { subscribePomo, getPomoSnapshot } from './chunk-6VMTAVUD.js';
2
2
  export { setShellTodoProvider } from './chunk-6VMTAVUD.js';
3
- import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-Q3URRVBM.js';
4
- export { Breadcrumbs } from './chunk-Q3URRVBM.js';
3
+ import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-GM3VN2NL.js';
4
+ export { Breadcrumbs } from './chunk-GM3VN2NL.js';
5
5
  import { SidebarLayout } from './chunk-VGTEM5RZ.js';
6
6
  export { SidebarLayout } from './chunk-VGTEM5RZ.js';
7
7
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
8
- export { ImageAnnotator_default as ImageAnnotator } from './chunk-BP64T33A.js';
8
+ export { ImageAnnotator_default as ImageAnnotator } from './chunk-4WUEFQWP.js';
9
9
  import { toast_default } from './chunk-VENYVK3L.js';
10
10
  export { toast_default as toast } from './chunk-VENYVK3L.js';
11
- export { EditableGrid } from './chunk-2KG5N3NF.js';
11
+ export { EditableGrid } from './chunk-WZIH7WZM.js';
12
12
  import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
13
13
  export { ShellAuthProvider, setShellAuthBridge, useShellAuth } from './chunk-ADJ3CERD.js';
14
- import { APP_VERSION } from './chunk-S4EUCOF4.js';
15
- export { VERSION } from './chunk-S4EUCOF4.js';
14
+ import { APP_VERSION } from './chunk-XM647QLH.js';
15
+ export { VERSION } from './chunk-XM647QLH.js';
16
16
  import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, setWindowPosition, ThumbCard, activateModal } from './chunk-6OWYD4O6.js';
17
17
  export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useLocalStoragePrefs, useModalActive, useShellPrefs, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-6OWYD4O6.js';
18
18
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
@@ -1470,6 +1470,24 @@ function Desktop({ profile }) {
1470
1470
  if (!dragging) return;
1471
1471
  const entries = dragEntriesRef.current;
1472
1472
  const isSingleItemDrag = entries.length === 1 && entries[0].type === "item";
1473
+ const draggedPageRoute = () => {
1474
+ if (!isSingleItemDrag) return null;
1475
+ const itm = desktopItems[entries[0].idx];
1476
+ return itm?.entityType === "page" ? itm.entityId : null;
1477
+ };
1478
+ const taskbarEl = () => document.querySelector("[data-taskbar-dropzone]");
1479
+ const pointOverTaskbar = (x, y) => {
1480
+ const tb = taskbarEl();
1481
+ if (!tb) return false;
1482
+ const r = tb.getBoundingClientRect();
1483
+ return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;
1484
+ };
1485
+ const setTaskbarDropHint = (on) => {
1486
+ const tb = taskbarEl();
1487
+ if (!tb) return;
1488
+ tb.style.outline = on ? "2px solid var(--accent-600, #7c3aed)" : "";
1489
+ tb.style.outlineOffset = on ? "-2px" : "";
1490
+ };
1473
1491
  const move = (e) => {
1474
1492
  const dx = e.clientX - dragging.startX;
1475
1493
  const dy = e.clientY - dragging.startY;
@@ -1498,6 +1516,7 @@ function Desktop({ profile }) {
1498
1516
  }
1499
1517
  hoverFolderIdxRef.current = nextHover;
1500
1518
  setHoverFolderIdx((prev) => prev === nextHover ? prev : nextHover);
1519
+ setTaskbarDropHint(draggedPageRoute() != null && pointOverTaskbar(e.clientX, e.clientY));
1501
1520
  }
1502
1521
  };
1503
1522
  const up = (e) => {
@@ -1508,6 +1527,24 @@ function Desktop({ profile }) {
1508
1527
  entry.el.style.zIndex = "";
1509
1528
  entry.el.style.opacity = "";
1510
1529
  }
1530
+ const pinRoute = draggedPageRoute();
1531
+ if (pinRoute && pointOverTaskbar(e.clientX, e.clientY)) {
1532
+ setTaskbarDropHint(false);
1533
+ for (const entry of entries) {
1534
+ if (!entry.el) continue;
1535
+ entry.el.style.left = "auto";
1536
+ entry.el.style.right = `${entry.origX}px`;
1537
+ entry.el.style.top = `${entry.origY}px`;
1538
+ }
1539
+ const pages = Array.isArray(shellPrefs.favorite_pages) ? shellPrefs.favorite_pages : [];
1540
+ if (!pages.includes(pinRoute)) saveShellPrefs({ favorite_pages: [...pages, pinRoute] });
1541
+ hoverFolderIdxRef.current = null;
1542
+ setHoverFolderIdx(null);
1543
+ setDragging(null);
1544
+ dragEntriesRef.current = [];
1545
+ return;
1546
+ }
1547
+ setTaskbarDropHint(false);
1511
1548
  const liveHoverIdx = hoverFolderIdxRef.current;
1512
1549
  const hoveredFolder = liveHoverIdx != null ? folders[liveHoverIdx] : null;
1513
1550
  hoverFolderIdxRef.current = null;
@@ -1598,7 +1635,7 @@ function Desktop({ profile }) {
1598
1635
  window.removeEventListener("pointermove", move);
1599
1636
  window.removeEventListener("pointerup", up);
1600
1637
  };
1601
- }, [dragging, snapEnabled, favDocs, folders, desktopItems]);
1638
+ }, [dragging, snapEnabled, favDocs, folders, desktopItems, shellPrefs]);
1602
1639
  const favDocsKey = JSON.stringify(favDocs.map((d) => `${d.entityId}:${d.x ?? ""}:${d.y ?? ""}:${d.folderId ?? ""}`));
1603
1640
  const foldersKey = JSON.stringify(folders.map((f) => `${f.id}:${f.x ?? ""}:${f.y ?? ""}`));
1604
1641
  useEffect(() => {
@@ -4408,6 +4445,7 @@ function Layout({
4408
4445
  backgroundColor: `rgb(var(--taskbar-bg-rgb, 243 244 246) / ${taskbarOpacity})`,
4409
4446
  ...isVerticalTaskbar ? {} : { left: sidebarWidth }
4410
4447
  },
4448
+ "data-taskbar-dropzone": true,
4411
4449
  onContextMenu: (e) => {
4412
4450
  e.preventDefault();
4413
4451
  setTaskbarMenu({ x: e.clientX, y: e.clientY });