react-os-shell 3.8.4 → 3.8.5

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-T34WCNYN.js → Browser-46EJUBW5.js} +4 -4
  2. package/dist/{Browser-T34WCNYN.js.map → Browser-46EJUBW5.js.map} +1 -1
  3. package/dist/{Documents-ORXYRD7H.js → Documents-U7KFKFNT.js} +3 -3
  4. package/dist/{Documents-ORXYRD7H.js.map → Documents-U7KFKFNT.js.map} +1 -1
  5. package/dist/Files-ZBUFKYWD.js +12 -0
  6. package/dist/{Files-MFF7AZ35.js.map → Files-ZBUFKYWD.js.map} +1 -1
  7. package/dist/{Notepad-QRBJZMUQ.js → Notepad-5OGGCJGO.js} +3 -3
  8. package/dist/{Notepad-QRBJZMUQ.js.map → Notepad-5OGGCJGO.js.map} +1 -1
  9. package/dist/Preview-JA4S64C6.js +8 -0
  10. package/dist/{Preview-S5QCAIXM.js.map → Preview-JA4S64C6.js.map} +1 -1
  11. package/dist/{Spreadsheet-DKGWO74M.js → Spreadsheet-G6CQ6FU4.js} +4 -4
  12. package/dist/{Spreadsheet-DKGWO74M.js.map → Spreadsheet-G6CQ6FU4.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-TG6RCJNY.js → chunk-3T75O6VR.js} +3 -3
  16. package/dist/{chunk-TG6RCJNY.js.map → chunk-3T75O6VR.js.map} +1 -1
  17. package/dist/{chunk-4MTVCPZK.js → chunk-6FET2LA4.js} +3 -3
  18. package/dist/{chunk-4MTVCPZK.js.map → chunk-6FET2LA4.js.map} +1 -1
  19. package/dist/{chunk-ZJ7WMV57.js → chunk-OY6GC3ZI.js} +4 -4
  20. package/dist/{chunk-ZJ7WMV57.js.map → chunk-OY6GC3ZI.js.map} +1 -1
  21. package/dist/{chunk-BOF2PGOL.js → chunk-QTDUNBNQ.js} +3 -3
  22. package/dist/{chunk-BOF2PGOL.js.map → chunk-QTDUNBNQ.js.map} +1 -1
  23. package/dist/{chunk-LP4C5UHL.js → chunk-S3ZVBCKK.js} +3 -3
  24. package/dist/{chunk-LP4C5UHL.js.map → chunk-S3ZVBCKK.js.map} +1 -1
  25. package/dist/{chunk-4OJAA5EE.js → chunk-YWRNK24T.js} +4 -4
  26. package/dist/{chunk-4OJAA5EE.js.map → chunk-YWRNK24T.js.map} +1 -1
  27. package/dist/index.d.ts +81 -82
  28. package/dist/index.js +16 -9
  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-MFF7AZ35.js +0 -12
  33. package/dist/Preview-S5QCAIXM.js +0 -8
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, ButtonHTMLAttributes, InputHTMLAttributes, TextareaHTMLAttributes, SelectHTMLAttributes, LabelHTMLAttributes } 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. */
@@ -947,7 +946,7 @@ interface ClockCalendarConfig {
947
946
  close: () => void;
948
947
  }) => ReactNode;
949
948
  }
950
- declare function Layout({ productName, productIcon, wallpapers, navSections, navIcons, sectionIcons, categories, notifications, search, taskbarTrayLeft, clockCalendar, }?: LayoutProps): react_jsx_runtime.JSX.Element;
949
+ declare function Layout({ productName, productIcon, wallpapers, navSections, navIcons, sectionIcons, categories, notifications, search, taskbarTrayLeft, clockCalendar, }?: LayoutProps): react.JSX.Element;
951
950
 
952
951
  interface StartMenuProps {
953
952
  open: boolean;
@@ -974,7 +973,7 @@ interface StartMenuProps {
974
973
  /** Section grouping + virtual flyouts (Utilities-style trays). */
975
974
  categories?: StartMenuCategories;
976
975
  }
977
- declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, taskbarPosition, taskbarH, taskbarW, size, navSections, navIcons, sectionIcons, categories, }: StartMenuProps): react_jsx_runtime.JSX.Element | null;
976
+ declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, taskbarPosition, taskbarH, taskbarW, size, navSections, navIcons, sectionIcons, categories, }: StartMenuProps): react.JSX.Element | null;
978
977
 
979
978
  /**
980
979
  * Widget gallery — the "manage widgets on the desktop" surface.
@@ -994,7 +993,7 @@ declare function StartMenu({ open, onClose, openPage, profile, user, onLogout, t
994
993
  declare function WidgetManager({ open, onClose }: {
995
994
  open: boolean;
996
995
  onClose: () => void;
997
- }): react_jsx_runtime.JSX.Element | null;
996
+ }): react.JSX.Element | null;
998
997
 
999
998
  /** Sections that can be omitted from the inline Customization page when the
1000
999
  * consumer renders them elsewhere (e.g. as separate entries in SystemPreferences). */
@@ -1008,7 +1007,7 @@ interface CustomizationProps {
1008
1007
  /** Render only one logical group of settings. Omit to render everything. */
1009
1008
  section?: CustomizationSection;
1010
1009
  }
1011
- declare function Customization({ omit, section }?: CustomizationProps): react_jsx_runtime.JSX.Element;
1010
+ declare function Customization({ omit, section }?: CustomizationProps): react.JSX.Element;
1012
1011
 
1013
1012
  /**
1014
1013
  * Standalone Behavior settings panel — window position, double-click,
@@ -1018,7 +1017,7 @@ declare function Customization({ omit, section }?: CustomizationProps): react_js
1018
1017
  * Reads/writes shell prefs via `useShellPrefs()`. Suitable for use as a
1019
1018
  * section in `SystemPreferences` or rendered standalone.
1020
1019
  */
1021
- declare function BehaviorPanel(): react_jsx_runtime.JSX.Element;
1020
+ declare function BehaviorPanel(): react.JSX.Element;
1022
1021
 
1023
1022
  /**
1024
1023
  * Standalone Sounds settings panel — sound effects toggle + per-event
@@ -1027,7 +1026,7 @@ declare function BehaviorPanel(): react_jsx_runtime.JSX.Element;
1027
1026
  * picked. Suitable as a section in `SystemPreferences` or rendered
1028
1027
  * standalone.
1029
1028
  */
1030
- declare function SoundsPanel(): react_jsx_runtime.JSX.Element;
1029
+ declare function SoundsPanel(): react.JSX.Element;
1031
1030
 
1032
1031
  /** One section in the SystemPreferences sidebar. */
1033
1032
  interface SystemPreferencesSection {
@@ -1074,7 +1073,7 @@ interface SystemPreferencesProps {
1074
1073
  * ]} />
1075
1074
  * ```
1076
1075
  */
1077
- declare function SystemPreferences({ sections, defaultSelected, className, }: SystemPreferencesProps): react_jsx_runtime.JSX.Element;
1076
+ declare function SystemPreferences({ sections, defaultSelected, className, }: SystemPreferencesProps): react.JSX.Element;
1078
1077
 
1079
1078
  interface ImageAnnotatorHandle {
1080
1079
  copy: () => Promise<void>;
@@ -1159,7 +1158,7 @@ interface EntityListProps<T> {
1159
1158
  * emptyState={<EmptyState message="No suppliers yet." />}
1160
1159
  * />
1161
1160
  */
1162
- declare function EntityList<T>(props: EntityListProps<T>): react_jsx_runtime.JSX.Element;
1161
+ declare function EntityList<T>(props: EntityListProps<T>): react.JSX.Element;
1163
1162
 
1164
1163
  /**
1165
1164
  * Generic, drag-and-drop Kanban board. Self-contained (native HTML5 DnD, no
@@ -1221,7 +1220,7 @@ interface KanbanProps<T> {
1221
1220
  /** Label for the per-column add button. */
1222
1221
  addItemText?: string;
1223
1222
  }
1224
- 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;
1223
+ declare function Kanban<T>({ items, columns, columnOf, getId, onMove, renderCard, onCardClick, sortInColumn, isLoading, loadingText, emptyState, columnEmptyText, onAddItem, addItemText, }: KanbanProps<T>): react.JSX.Element;
1225
1224
 
1226
1225
  interface PaginatedResponse<T> {
1227
1226
  count: number;
@@ -1270,7 +1269,7 @@ interface ResizableTableProps {
1270
1269
  * - per-user persistence (via the shell-registered apiClient)
1271
1270
  * - mobile-aware selection mode toggle
1272
1271
  */
1273
- declare function ResizableTable({ tableId, columns, sort, onSort, footer, afterBody, saveDefaultPerms, children, }: ResizableTableProps): react_jsx_runtime.JSX.Element;
1272
+ declare function ResizableTable({ tableId, columns, sort, onSort, footer, afterBody, saveDefaultPerms, children, }: ResizableTableProps): react.JSX.Element;
1274
1273
 
1275
1274
  interface ListFooterProps {
1276
1275
  selectedCount: number;
@@ -1286,7 +1285,7 @@ interface ListFooterProps {
1286
1285
  * "Y of Z records · Loading more..."
1287
1286
  * "All N records loaded"
1288
1287
  */
1289
- declare function ListFooter({ selectedCount, loadedCount, totalCount, label, isFetchingMore, extra, }: ListFooterProps): react_jsx_runtime.JSX.Element;
1288
+ declare function ListFooter({ selectedCount, loadedCount, totalCount, label, isFetchingMore, extra, }: ListFooterProps): react.JSX.Element;
1290
1289
 
1291
1290
  /**
1292
1291
  * Keyboard + shift-click navigation for table rows.
@@ -1364,7 +1363,7 @@ declare function useInfiniteScroll<T>({ queryKey, fetchFn, extraParams, pageSize
1364
1363
  isFetchingNextPage: boolean;
1365
1364
  hasNextPage: boolean;
1366
1365
  sentinelRef: react.RefObject<HTMLDivElement>;
1367
- refetch: (options?: _tanstack_query_core.RefetchOptions) => Promise<_tanstack_query_core.QueryObserverResult<_tanstack_query_core.InfiniteData<PaginatedResponse<T>, unknown>, Error>>;
1366
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<_tanstack_react_query.InfiniteData<PaginatedResponse<T>, unknown>, Error>>;
1368
1367
  };
1369
1368
 
1370
1369
  /**
@@ -1397,7 +1396,7 @@ interface PaginationProps {
1397
1396
  showEdges?: boolean;
1398
1397
  className?: string;
1399
1398
  }
1400
- declare function Pagination({ page, pageCount, onPageChange, siblingCount, showEdges, className, }: PaginationProps): react_jsx_runtime.JSX.Element | null;
1399
+ declare function Pagination({ page, pageCount, onPageChange, siblingCount, showEdges, className, }: PaginationProps): react.JSX.Element | null;
1401
1400
 
1402
1401
  type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
1403
1402
  type ButtonSize = 'sm' | 'md';
@@ -1481,13 +1480,13 @@ interface FormFieldProps {
1481
1480
  className?: string;
1482
1481
  children: ReactNode;
1483
1482
  }
1484
- declare function FormField({ label, htmlFor, hint, error, required, className, children, }: FormFieldProps): react_jsx_runtime.JSX.Element;
1483
+ declare function FormField({ label, htmlFor, hint, error, required, className, children, }: FormFieldProps): react.JSX.Element;
1485
1484
 
1486
1485
  interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
1487
1486
  /** Append a red asterisk. */
1488
1487
  required?: boolean;
1489
1488
  }
1490
- declare function Label({ required, children, className, ...rest }: LabelProps): react_jsx_runtime.JSX.Element;
1489
+ declare function Label({ required, children, className, ...rest }: LabelProps): react.JSX.Element;
1491
1490
 
1492
1491
  /**
1493
1492
  * Shared form-control styling — the single source of truth for the kit's
@@ -1518,7 +1517,7 @@ interface CardProps {
1518
1517
  padded?: boolean;
1519
1518
  className?: string;
1520
1519
  }
1521
- declare function Card({ children, header, footer, padded, className }: CardProps): react_jsx_runtime.JSX.Element;
1520
+ declare function Card({ children, header, footer, padded, className }: CardProps): react.JSX.Element;
1522
1521
  interface StatCardProps {
1523
1522
  label: ReactNode;
1524
1523
  value: ReactNode;
@@ -1530,7 +1529,7 @@ interface StatCardProps {
1530
1529
  };
1531
1530
  className?: string;
1532
1531
  }
1533
- declare function StatCard({ label, value, icon, delta, className }: StatCardProps): react_jsx_runtime.JSX.Element;
1532
+ declare function StatCard({ label, value, icon, delta, className }: StatCardProps): react.JSX.Element;
1534
1533
 
1535
1534
  type AvatarSize = 'xs' | 'sm' | 'md' | 'lg';
1536
1535
  type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';
@@ -1542,7 +1541,7 @@ interface AvatarProps {
1542
1541
  status?: AvatarStatus;
1543
1542
  className?: string;
1544
1543
  }
1545
- declare function Avatar({ src, name, size, status, className }: AvatarProps): react_jsx_runtime.JSX.Element;
1544
+ declare function Avatar({ src, name, size, status, className }: AvatarProps): react.JSX.Element;
1546
1545
  interface AvatarGroupProps {
1547
1546
  children: ReactNode;
1548
1547
  /** Show at most this many avatars; the rest collapse into a +N chip. */
@@ -1552,7 +1551,7 @@ interface AvatarGroupProps {
1552
1551
  size?: AvatarSize;
1553
1552
  className?: string;
1554
1553
  }
1555
- declare function AvatarGroup({ children, max, size, className }: AvatarGroupProps): react_jsx_runtime.JSX.Element;
1554
+ declare function AvatarGroup({ children, max, size, className }: AvatarGroupProps): react.JSX.Element;
1556
1555
 
1557
1556
  type BannerTone = 'info' | 'success' | 'warning' | 'danger';
1558
1557
  interface BannerProps {
@@ -1565,7 +1564,7 @@ interface BannerProps {
1565
1564
  onDismiss?: () => void;
1566
1565
  className?: string;
1567
1566
  }
1568
- declare function Banner({ tone, title, children, icon, onDismiss, className }: BannerProps): react_jsx_runtime.JSX.Element;
1567
+ declare function Banner({ tone, title, children, icon, onDismiss, className }: BannerProps): react.JSX.Element;
1569
1568
 
1570
1569
  interface TabItem {
1571
1570
  id: string;
@@ -1580,7 +1579,7 @@ interface TabsProps {
1580
1579
  variant?: 'underline' | 'pill';
1581
1580
  className?: string;
1582
1581
  }
1583
- declare function Tabs({ items, value, onChange, variant, className }: TabsProps): react_jsx_runtime.JSX.Element;
1582
+ declare function Tabs({ items, value, onChange, variant, className }: TabsProps): react.JSX.Element;
1584
1583
 
1585
1584
  interface AccordionItem {
1586
1585
  id: string;
@@ -1597,7 +1596,7 @@ interface AccordionProps {
1597
1596
  allowMultiple?: boolean;
1598
1597
  className?: string;
1599
1598
  }
1600
- declare function Accordion({ items, defaultOpenIds, openIds, onOpenChange, allowMultiple, className, }: AccordionProps): react_jsx_runtime.JSX.Element;
1599
+ declare function Accordion({ items, defaultOpenIds, openIds, onOpenChange, allowMultiple, className, }: AccordionProps): react.JSX.Element;
1601
1600
 
1602
1601
  interface TooltipProps {
1603
1602
  content: ReactNode;
@@ -1606,7 +1605,7 @@ interface TooltipProps {
1606
1605
  delay?: number;
1607
1606
  children: ReactNode;
1608
1607
  }
1609
- declare function Tooltip({ content, side, delay, children }: TooltipProps): react_jsx_runtime.JSX.Element;
1608
+ declare function Tooltip({ content, side, delay, children }: TooltipProps): react.JSX.Element;
1610
1609
 
1611
1610
  interface ColoredBadgeProps {
1612
1611
  /** Tailwind classes for the badge color, e.g. `bg-green-100 text-green-800`.
@@ -1625,7 +1624,7 @@ interface ColoredBadgeProps {
1625
1624
  * Tailwind class string. Generic counterpart to StatusBadge (which maps status
1626
1625
  * strings to semantic groups); use this when the caller already knows the color.
1627
1626
  */
1628
- declare function ColoredBadge({ colorClass, children, size, capitalize }: ColoredBadgeProps): react_jsx_runtime.JSX.Element;
1627
+ declare function ColoredBadge({ colorClass, children, size, capitalize }: ColoredBadgeProps): react.JSX.Element;
1629
1628
 
1630
1629
  interface EmptyStateProps {
1631
1630
  /** Bold heading, e.g. "No invoices yet". */
@@ -1652,7 +1651,7 @@ interface EmptyStateProps {
1652
1651
  * copies: accepts both the `title`/`description` and `message`/`hint`/`frameless`
1653
1652
  * prop shapes, with a single unified look.
1654
1653
  */
1655
- declare function EmptyState({ title, message, description, hint, variant, frameless, icon, children, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
1654
+ declare function EmptyState({ title, message, description, hint, variant, frameless, icon, children, }: EmptyStateProps): react.JSX.Element;
1656
1655
 
1657
1656
  interface PageHeaderProps {
1658
1657
  title: string;
@@ -1669,7 +1668,7 @@ interface PageHeaderProps {
1669
1668
  * right-aligned actions slot. Accepts both the `description`/`actions` and the
1670
1669
  * `subtitle`/`children` prop shapes the portals previously used locally.
1671
1670
  */
1672
- declare function PageHeader({ title, description, subtitle, actions, children }: PageHeaderProps): react_jsx_runtime.JSX.Element;
1671
+ declare function PageHeader({ title, description, subtitle, actions, children }: PageHeaderProps): react.JSX.Element;
1673
1672
 
1674
1673
  interface LoadingSpinnerProps {
1675
1674
  /** Ring diameter: `sm` = 20px, `md` = 32px (default), `lg` = 48px. */
@@ -1683,7 +1682,7 @@ interface LoadingSpinnerProps {
1683
1682
  * LoadingSpinner — a centered animated ring for pending/loading regions.
1684
1683
  * (Distinct from the shell's internal "Loading…" text used inside data grids.)
1685
1684
  */
1686
- declare function LoadingSpinner({ size, padding, className }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
1685
+ declare function LoadingSpinner({ size, padding, className }: LoadingSpinnerProps): react.JSX.Element;
1687
1686
 
1688
1687
  interface FilterOption {
1689
1688
  label: string;
@@ -1706,7 +1705,7 @@ interface FilterBarProps {
1706
1705
  * `<select>` or, for long lists, a glass-styled searchable dropdown; a "Clear
1707
1706
  * filters" button appears when any filter is active. Pair with `useFilters`.
1708
1707
  */
1709
- declare function FilterBar({ filters, values, onChange, onClear, children }: FilterBarProps): react_jsx_runtime.JSX.Element;
1708
+ declare function FilterBar({ filters, values, onChange, onClear, children }: FilterBarProps): react.JSX.Element;
1710
1709
  /** Local filter-state helper: tracks active filter values + derived params. */
1711
1710
  declare function useFilters(): {
1712
1711
  filterValues: Record<string, string>;
@@ -1722,13 +1721,13 @@ declare function useFilters(): {
1722
1721
  */
1723
1722
  declare function SidebarGroupLabel({ children }: {
1724
1723
  children: ReactNode;
1725
- }): react_jsx_runtime.JSX.Element;
1724
+ }): react.JSX.Element;
1726
1725
  declare function SidebarNavItem({ label, count, active, onClick }: {
1727
1726
  label: string;
1728
1727
  count?: number;
1729
1728
  active: boolean;
1730
1729
  onClick: () => void;
1731
- }): react_jsx_runtime.JSX.Element;
1730
+ }): react.JSX.Element;
1732
1731
 
1733
1732
  /**
1734
1733
  * Semantic role of a column, used to auto-map CSV columns to fields and to
@@ -1780,7 +1779,7 @@ interface BulkImportGridProps {
1780
1779
  * column's `kind` (`price`/`qty`) to opt it into CSV auto-detection and the
1781
1780
  * totals strip.
1782
1781
  */
1783
- declare function BulkImportGrid({ columns, onImport, description, mergeDuplicates }: BulkImportGridProps): react_jsx_runtime.JSX.Element;
1782
+ declare function BulkImportGrid({ columns, onImport, description, mergeDuplicates }: BulkImportGridProps): react.JSX.Element;
1784
1783
 
1785
1784
  /**
1786
1785
  * Pure helpers for reconciling a bulk-import grid (rows of string cells) against
@@ -1887,7 +1886,7 @@ interface ContainerFillChartProps<T = ContainerFillItem> {
1887
1886
  * `getVolume` to inject per-unit volumes; the chart owns the container math and
1888
1887
  * the instruction-vs-loaded dual-bar rendering.
1889
1888
  */
1890
- declare function ContainerFillChart<T = ContainerFillItem>({ items, getVolume, qtyField, showNewIndicator, getInstructionQty, getActualQty, isFilled, isNew, className, style, }: ContainerFillChartProps<T>): react_jsx_runtime.JSX.Element | null;
1889
+ declare function ContainerFillChart<T = ContainerFillItem>({ items, getVolume, qtyField, showNewIndicator, getInstructionQty, getActualQty, isFilled, isNew, className, style, }: ContainerFillChartProps<T>): react.JSX.Element | null;
1891
1890
 
1892
1891
  /** Result of a single health poll. `latencyMs` is optional; when omitted on
1893
1892
  * an ok result the indicator simply shows no latency for that poll. */
@@ -1932,7 +1931,7 @@ interface ServerStatusIndicatorProps {
1932
1931
  * notification bell; supply `healthCheck` (or `healthUrl`), `user`, and
1933
1932
  * `version` via a thin per-app wrapper.
1934
1933
  */
1935
- declare function ServerStatusIndicator({ healthCheck, healthUrl, pollMs, requestTimeoutMs, user, version, }: ServerStatusIndicatorProps): react_jsx_runtime.JSX.Element;
1934
+ declare function ServerStatusIndicator({ healthCheck, healthUrl, pollMs, requestTimeoutMs, user, version, }: ServerStatusIndicatorProps): react.JSX.Element;
1936
1935
 
1937
1936
  interface ChangePasswordFormProps {
1938
1937
  /**
@@ -1959,7 +1958,7 @@ interface ChangePasswordFormProps {
1959
1958
  * Product-agnostic change-password form. The host supplies `onSubmit` to do the
1960
1959
  * actual change (e.g. call an API then re-authenticate).
1961
1960
  */
1962
- declare function ChangePasswordForm({ onSubmit, onSuccess, confirmOnSuccess, minLength, submitLabel, doneLabel, }: ChangePasswordFormProps): react_jsx_runtime.JSX.Element;
1961
+ declare function ChangePasswordForm({ onSubmit, onSuccess, confirmOnSuccess, minLength, submitLabel, doneLabel, }: ChangePasswordFormProps): react.JSX.Element;
1963
1962
 
1964
1963
  interface PdfActionButtonProps {
1965
1964
  /**
@@ -2005,7 +2004,7 @@ interface PdfActionButtonProps {
2005
2004
  * recent-documents logging) are lifted to the optional `onEmail` /
2006
2005
  * `onPreviewOpened` callbacks.
2007
2006
  */
2008
- declare function PdfActionButton({ fetchPdf, filename, label, className, disabled, onEmail, onPreviewOpened, icon, }: PdfActionButtonProps): react_jsx_runtime.JSX.Element;
2007
+ declare function PdfActionButton({ fetchPdf, filename, label, className, disabled, onEmail, onPreviewOpened, icon, }: PdfActionButtonProps): react.JSX.Element;
2009
2008
 
2010
2009
  /** Visual category for a milestone. Drives shape + colour so the user can
2011
2010
  * tell different milestone types apart at a glance. */
@@ -2065,7 +2064,7 @@ interface MilestoneTimelineProps {
2065
2064
  * Product-agnostic: it takes generic `Milestone` data as props. Map your
2066
2065
  * domain records to the `Milestone` shape in a thin wrapper at the call site.
2067
2066
  */
2068
- declare function MilestoneTimeline({ title, milestones, summary, endDate, phaseLabels }: MilestoneTimelineProps): react_jsx_runtime.JSX.Element;
2067
+ declare function MilestoneTimeline({ title, milestones, summary, endDate, phaseLabels }: MilestoneTimelineProps): react.JSX.Element;
2069
2068
 
2070
2069
  /**
2071
2070
  * Shared chart types. The charts are dependency-free inline SVG/CSS — color
@@ -2118,35 +2117,35 @@ interface DonutChartProps {
2118
2117
  style?: CSSProperties;
2119
2118
  }
2120
2119
 
2121
- declare function Sparkline({ data, width, height, stroke, fill, strokeWidth, showDots, className, style, }: SparklineProps): react_jsx_runtime.JSX.Element | null;
2120
+ declare function Sparkline({ data, width, height, stroke, fill, strokeWidth, showDots, className, style, }: SparklineProps): react.JSX.Element | null;
2122
2121
 
2123
- declare function BarChart({ data, labels, height, color, colors, max, gap, className, style, }: BarChartProps): react_jsx_runtime.JSX.Element | null;
2122
+ declare function BarChart({ data, labels, height, color, colors, max, gap, className, style, }: BarChartProps): react.JSX.Element | null;
2124
2123
 
2125
- declare function DonutChart({ segments, size, thickness, centerLabel, className, style }: DonutChartProps): react_jsx_runtime.JSX.Element;
2124
+ declare function DonutChart({ segments, size, thickness, centerLabel, className, style }: DonutChartProps): react.JSX.Element;
2126
2125
 
2127
- declare function DashboardTemplate(): react_jsx_runtime.JSX.Element;
2126
+ declare function DashboardTemplate(): react.JSX.Element;
2128
2127
 
2129
- declare function DataTablePage(): react_jsx_runtime.JSX.Element;
2128
+ declare function DataTablePage(): react.JSX.Element;
2130
2129
 
2131
- declare function FormLayoutPage(): react_jsx_runtime.JSX.Element;
2130
+ declare function FormLayoutPage(): react.JSX.Element;
2132
2131
 
2133
- declare function CheckoutTemplate(): react_jsx_runtime.JSX.Element;
2132
+ declare function CheckoutTemplate(): react.JSX.Element;
2134
2133
 
2135
- declare function EmailTemplate(): react_jsx_runtime.JSX.Element;
2134
+ declare function EmailTemplate(): react.JSX.Element;
2136
2135
 
2137
- declare function ChatTemplate(): react_jsx_runtime.JSX.Element;
2136
+ declare function ChatTemplate(): react.JSX.Element;
2138
2137
 
2139
- declare function GalleryTemplate(): react_jsx_runtime.JSX.Element;
2138
+ declare function GalleryTemplate(): react.JSX.Element;
2140
2139
 
2141
2140
  interface AuthScreenProps {
2142
2141
  mode?: 'login' | 'register' | 'forgot';
2143
2142
  }
2144
- declare function AuthScreen({ mode }: AuthScreenProps): react_jsx_runtime.JSX.Element;
2143
+ declare function AuthScreen({ mode }: AuthScreenProps): react.JSX.Element;
2145
2144
 
2146
2145
  interface ErrorPageProps {
2147
2146
  code?: 403 | 404 | 500;
2148
2147
  }
2149
- declare function ErrorPage({ code }: ErrorPageProps): react_jsx_runtime.JSX.Element;
2148
+ declare function ErrorPage({ code }: ErrorPageProps): react.JSX.Element;
2150
2149
 
2151
2150
  /** Package version, injected by tsup at build time. Stays as an empty
2152
2151
  * string when the source is consumed without a build (e.g. tests). */
@@ -2159,7 +2158,7 @@ interface ShellAuth {
2159
2158
  declare function ShellAuthProvider({ value, children }: {
2160
2159
  value: ShellAuth;
2161
2160
  children: ReactNode;
2162
- }): react_jsx_runtime.JSX.Element;
2161
+ }): react.JSX.Element;
2163
2162
  declare function useShellAuth(): ShellAuth;
2164
2163
 
2165
2164
  interface ShellPrefsAdapter {
@@ -2172,7 +2171,7 @@ interface ShellPrefsAdapter {
2172
2171
  declare function ShellPrefsProvider({ value, children, }: {
2173
2172
  value: ShellPrefsAdapter;
2174
2173
  children: ReactNode;
2175
- }): react_jsx_runtime.JSX.Element;
2174
+ }): react.JSX.Element;
2176
2175
  /** Default localStorage-backed adapter — useful when the consumer doesn't
2177
2176
  * ship a backend. Pass the result into <ShellPrefsProvider value={…}>.
2178
2177
  *
@@ -2189,7 +2188,7 @@ type EntityFetcher = (endpoint: string, id: string) => Promise<any>;
2189
2188
  declare function ShellEntityFetcherProvider({ value, children, }: {
2190
2189
  value: EntityFetcher;
2191
2190
  children: ReactNode;
2192
- }): react_jsx_runtime.JSX.Element;
2191
+ }): react.JSX.Element;
2193
2192
  /** Returns the consumer-supplied entity fetcher, or a stub that throws
2194
2193
  * on call. Components that fetch entities call this hook eagerly so any
2195
2194
  * misconfiguration surfaces synchronously rather than at click-time. */
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  import { subscribePomo, getPomoSnapshot } from './chunk-F2KBTMSP.js';
2
2
  export { setShellTodoProvider } from './chunk-F2KBTMSP.js';
3
- import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-ZJ7WMV57.js';
4
- export { Breadcrumbs } from './chunk-ZJ7WMV57.js';
3
+ import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-OY6GC3ZI.js';
4
+ export { Breadcrumbs } from './chunk-OY6GC3ZI.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
- import { setPdfPreview } from './chunk-LP4C5UHL.js';
9
- export { ImageAnnotator_default as ImageAnnotator } from './chunk-LP4C5UHL.js';
8
+ import { setPdfPreview } from './chunk-S3ZVBCKK.js';
9
+ export { ImageAnnotator_default as ImageAnnotator } from './chunk-S3ZVBCKK.js';
10
10
  import { toast_default } from './chunk-VENYVK3L.js';
11
11
  export { toast_default as toast } from './chunk-VENYVK3L.js';
12
- import { EditableGrid } from './chunk-TG6RCJNY.js';
13
- export { EditableGrid } from './chunk-TG6RCJNY.js';
12
+ import { EditableGrid } from './chunk-3T75O6VR.js';
13
+ export { EditableGrid } from './chunk-3T75O6VR.js';
14
14
  import { useAuth, useShellAuth } from './chunk-ADJ3CERD.js';
15
15
  export { ShellAuthProvider, setShellAuthBridge, useShellAuth } from './chunk-ADJ3CERD.js';
16
- import { APP_VERSION, VERSION } from './chunk-4MTVCPZK.js';
17
- export { VERSION } from './chunk-4MTVCPZK.js';
16
+ import { APP_VERSION, VERSION } from './chunk-6FET2LA4.js';
17
+ export { VERSION } from './chunk-6FET2LA4.js';
18
18
  import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, CancelButton, setWindowPosition, ThumbCard, activateModal } from './chunk-HJ5ZNXPB.js';
19
19
  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-HJ5ZNXPB.js';
20
20
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
@@ -6150,7 +6150,14 @@ function useInfiniteScroll({
6150
6150
  observer.observe(el);
6151
6151
  return () => observer.disconnect();
6152
6152
  }, [handleObserver]);
6153
- const allItems = (query.data?.pages.flatMap((page) => page?.results ?? []) ?? []).filter((x) => x != null);
6153
+ const seenIds = /* @__PURE__ */ new Set();
6154
+ const allItems = (query.data?.pages.flatMap((page) => page?.results ?? []) ?? []).filter((x) => x != null).filter((x) => {
6155
+ const id = x.id;
6156
+ if (id == null) return true;
6157
+ if (seenIds.has(id)) return false;
6158
+ seenIds.add(id);
6159
+ return true;
6160
+ });
6154
6161
  const totalCount = query.data?.pages[0]?.count ?? 0;
6155
6162
  return {
6156
6163
  items: allItems,