react-os-shell 4.21.1 → 4.41.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 (54) hide show
  1. package/dist/{Browser-2GQLOOS7.js → Browser-TKBH4DZ3.js} +6 -6
  2. package/dist/{Browser-2GQLOOS7.js.map → Browser-TKBH4DZ3.js.map} +1 -1
  3. package/dist/{Calculator-QCAJ6ITI.js → Calculator-XERXEV35.js} +5 -5
  4. package/dist/{Calculator-QCAJ6ITI.js.map → Calculator-XERXEV35.js.map} +1 -1
  5. package/dist/ConfirmDialog-EEH4CWSW.js +3 -0
  6. package/dist/{ConfirmDialog-WAM5OKAV.js.map → ConfirmDialog-EEH4CWSW.js.map} +1 -1
  7. package/dist/{CurrencyConverter-PCYC6RL5.js → CurrencyConverter-OSZISLHT.js} +5 -5
  8. package/dist/{CurrencyConverter-PCYC6RL5.js.map → CurrencyConverter-OSZISLHT.js.map} +1 -1
  9. package/dist/{Documents-MOQNF6HE.js → Documents-YRTLDTLX.js} +6 -6
  10. package/dist/{Documents-MOQNF6HE.js.map → Documents-YRTLDTLX.js.map} +1 -1
  11. package/dist/{Files-YBH6XKXE.js → Files-WHYCDRYU.js} +7 -7
  12. package/dist/{Files-YBH6XKXE.js.map → Files-WHYCDRYU.js.map} +1 -1
  13. package/dist/{Notepad-E3L6AOGU.js → Notepad-6UAWRNZH.js} +6 -6
  14. package/dist/{Notepad-E3L6AOGU.js.map → Notepad-6UAWRNZH.js.map} +1 -1
  15. package/dist/{PomodoroTimer-YABFEPEV.js → PomodoroTimer-5ZSIG7SQ.js} +5 -5
  16. package/dist/{PomodoroTimer-YABFEPEV.js.map → PomodoroTimer-5ZSIG7SQ.js.map} +1 -1
  17. package/dist/{Preview-SNPHS4PS.js → Preview-VBIWWJLK.js} +6 -6
  18. package/dist/{Preview-SNPHS4PS.js.map → Preview-VBIWWJLK.js.map} +1 -1
  19. package/dist/{Spreadsheet-JXQCWZES.js → Spreadsheet-GRD4P3OI.js} +6 -6
  20. package/dist/{Spreadsheet-JXQCWZES.js.map → Spreadsheet-GRD4P3OI.js.map} +1 -1
  21. package/dist/{Stock-IPLLRUOC.js → Stock-4BORXILI.js} +5 -5
  22. package/dist/{Stock-IPLLRUOC.js.map → Stock-4BORXILI.js.map} +1 -1
  23. package/dist/{Weather-SI5QN7X2.js → Weather-ZPPSEUIY.js} +5 -5
  24. package/dist/{Weather-SI5QN7X2.js.map → Weather-ZPPSEUIY.js.map} +1 -1
  25. package/dist/{WorldClock-WYDSMUWX.js → WorldClock-LBKYWDWE.js} +5 -5
  26. package/dist/{WorldClock-WYDSMUWX.js.map → WorldClock-LBKYWDWE.js.map} +1 -1
  27. package/dist/apps/index.js +16 -16
  28. package/dist/{chunk-XRBJARD7.js → chunk-COTCIYLS.js} +4 -4
  29. package/dist/{chunk-XRBJARD7.js.map → chunk-COTCIYLS.js.map} +1 -1
  30. package/dist/{chunk-XBV7NUZK.js → chunk-D4WFGAUW.js} +556 -131
  31. package/dist/chunk-D4WFGAUW.js.map +1 -0
  32. package/dist/{chunk-IGPSRRL7.js → chunk-GUWAKATU.js} +10 -7
  33. package/dist/chunk-GUWAKATU.js.map +1 -0
  34. package/dist/{chunk-HYAW6KIL.js → chunk-HNH7FOYB.js} +16 -4
  35. package/dist/chunk-HNH7FOYB.js.map +1 -0
  36. package/dist/{chunk-L2O6B5KT.js → chunk-OXLLRKBC.js} +24 -4
  37. package/dist/chunk-OXLLRKBC.js.map +1 -0
  38. package/dist/chunk-TQFUNASX.js +7 -0
  39. package/dist/{chunk-CM2NWGYZ.js.map → chunk-TQFUNASX.js.map} +1 -1
  40. package/dist/{chunk-Q3AOIJ7B.js → chunk-X6DOWIY2.js} +3 -3
  41. package/dist/{chunk-Q3AOIJ7B.js.map → chunk-X6DOWIY2.js.map} +1 -1
  42. package/dist/{index-Czn1re5M.d.ts → index-B4RRJ5bp.d.ts} +300 -64
  43. package/dist/index.d.ts +53 -29
  44. package/dist/index.js +54 -146
  45. package/dist/index.js.map +1 -1
  46. package/dist/ui/index.d.ts +1 -1
  47. package/dist/ui/index.js +4 -4
  48. package/package.json +1 -1
  49. package/dist/ConfirmDialog-WAM5OKAV.js +0 -3
  50. package/dist/chunk-CM2NWGYZ.js +0 -7
  51. package/dist/chunk-HYAW6KIL.js.map +0 -1
  52. package/dist/chunk-IGPSRRL7.js.map +0 -1
  53. package/dist/chunk-L2O6B5KT.js.map +0 -1
  54. package/dist/chunk-XBV7NUZK.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ColumnDef, S as SortState, P as PaginatedResponse } from './index-Czn1re5M.js';
2
- export { A as ALT, a as ALT_SHIFT_D, b as ALT_SHIFT_E, c as ALT_SHIFT_N, d as Accordion, e as AccordionItem, f as AccordionProps, g as Align, h as AuthScreen, i as AuthScreenProps, j as Avatar, k as AvatarGroup, l as AvatarGroupProps, m as AvatarProps, n as AvatarSize, o as AvatarStatus, B as Banner, p as BannerEmphasis, q as BannerProps, r as BannerTone, s as BarChart, t as BarChartProps, u as BreadcrumbItem, v as Breadcrumbs, w as BreadcrumbsProps, x as Button, y as ButtonProps, z as ButtonSize, D as ButtonVariant, E as CMD_A, F as CMD_DOT, G as CMD_ENTER, H as CMD_K, I as CMD_S, J as Card, K as CardPadding, L as CardProps, M as CellStyle, N as ChatTemplate, O as Checkbox, Q as CheckboxProps, R as CheckoutTemplate, T as ColoredBadge, U as ColoredBadgeProps, V as ConfirmProvider, W as ContainerFillChart, X as ContainerFillChartProps, Y as ContainerFillItem, Z as CountBadge, _ as CountBadgeProps, $ as CountBadgeTone, a0 as DashboardTemplate, a1 as DataTable, a2 as DataTableColumn, a3 as DataTablePage, a4 as DataTableProps, a5 as DateRangePicker, a6 as DateRangePickerProps, a7 as DescriptionColumns, a8 as DescriptionItem, a9 as DescriptionList, aa as DescriptionListProps, ab as Dialog, ac as DialogProps, ad as DialogSize, ae as Divider, af as DividerProps, ag as DividerSpacing, ah as DonutChart, ai as DonutChartProps, aj as DonutSegment, ak as Drawer, al as DrawerProps, am as DrawerSide, an as DrawerSize, ao as ENTER, ap as EditableGrid, aq as EditableGridProps, ar as EmailTemplate, as as EmptyState, at as EmptyStateProps, au as ErrorPage, av as ErrorPageProps, aw as FilePicker, ax as FilePickerProps, ay as FormField, az as FormFieldProps, aA as FormLayoutPage, aB as GLASS_DIVIDER, aC as GLASS_INPUT_BG, aD as GalleryTemplate, aE as Gap, aF as Grid, aG as GridCols, aH as GridColumn, aI as GridProps, aJ as HelpCenter, aK as HelpCenterDoc, aL as HelpCenterProps, aM as INPUT_BASE, aN as INPUT_SIZES, aO as Inline, aP as InlineProps, aQ as Input, aR as InputNumber, aS as InputNumberProps, aT as InputProps, aU as InputSize, aV as Justify, aW as Kanban, aX as KanbanColumn, aY as KanbanProps, aZ as Label, a_ as LabelProps, a$ as ListFooter, b0 as ListLoadError, b1 as ListLoadErrorProps, b2 as LoadingSpinner, b3 as LoadingSpinnerProps, b4 as MAX_FRACTION_DIGITS, b5 as MOD, b6 as Markdown, b7 as MarkdownProps, b8 as MediaUploadField, b9 as MediaUploadFieldProps, ba as MediaUploadGrid, bb as MediaUploadGridItem, bc as MediaUploadGridProps, bd as MetricBar, be as MetricBarProps, bf as Milestone, bg as MilestoneKind, bh as MilestoneTimeline, bi as MilestoneTimelineProps, bj as NativeSelect, bk as NumericKeypad, bl as NumericKeypadProps, bm as PageHeader, bn as PageHeaderProps, bo as Pagination, bp as PaginationProps, bq as Paragraph, br as ParagraphProps, bs as PopupMenu, bt as PopupMenuDivider, bu as PopupMenuItem, bv as PopupMenuLabel, bw as Radio, bx as RadioProps, by as Result, bz as ResultProps, bA as ResultStatus, bB as SHIFT, bC as SearchableOption, bD as SearchableSelect, bE as SearchableSelectProps, bF as Segmented, bG as SegmentedOption, bH as SegmentedProps, bI as SegmentedSize, bJ as Select, bK as SelectOption, bL as SelectProps, bM as SemanticGroup, bN as SeverityTone, bO as ShellPrefsAdapter, bP as ShellPrefsProvider, bQ as SidebarActionButton, bR as SidebarActionButtonProps, bS as SidebarGroupLabel, bT as SidebarLayout, bU as SidebarLayoutProps, bV as SidebarNavItem, bW as Skeleton, bX as SkeletonProps, bY as SkeletonVariant, bZ as Sparkline, b_ as SparklineProps, b$ as Stack, c0 as StackProps, c1 as StatCard, c2 as StatCardProps, c3 as Statistic, c4 as StatisticProps, c5 as StatisticSize, c6 as StatisticTone, c7 as StatusBadge, c8 as StatusBadgeProvider, c9 as Switch, ca as SwitchProps, cb as SwitchSize, cc as TabItem, cd as Tabs, ce as TabsProps, cf as Text, cg as TextProps, ch as TextSize, ci as TextTone, cj as TextWeight, ck as Textarea, cl as TextareaProps, cm as Theme, cn as TileButton, co as TileButtonProps, cp as TileSize, cq as Title, cr as TitleLevel, cs as TitleProps, ct as ToastOptions, cu as ToastPlacement, cv as Tooltip, cw as TooltipProps, cx as TopNav, cy as TopNavItem, cz as TopNavProps, cA as VERSION, cB as appendKey, cC as applyThemePrefs, cD as backspace, cE as confirm, cF as confirmDestructive, cG as formatDate, cH as glassStyle, cI as inputClasses, cJ as isMac, cK as isSeverityTone, cL as mediaFileName, cM as prompt, cN as resolveTheme, cO as severityOf, cP as toISODate, cQ as toast, cR as useClickOutside, cS as useConfirm, cT as useFocusTrap, cU as useIsMobile, cV as useLocalStoragePrefs, cW as useScrollLock, cX as useShellPrefs, cY as useTheme } from './index-Czn1re5M.js';
1
+ import { S as SearchConfig, C as ColumnDef, a as SortState, P as PaginatedResponse } from './index-B4RRJ5bp.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 Card, L as CardPadding, M as CardProps, N as CellStyle, O as ChatTemplate, Q as Checkbox, R as CheckboxProps, T as CheckoutTemplate, U as ColoredBadge, V as ColoredBadgeProps, W as ConfirmProvider, X as ContainerFillChart, Y as ContainerFillChartProps, Z as ContainerFillItem, _ as CountBadge, $ as CountBadgeProps, a0 as CountBadgeTone, a1 as DashboardTemplate, a2 as DataTable, a3 as DataTableColumn, a4 as DataTablePage, a5 as DataTableProps, a6 as DatePicker, a7 as DatePickerProps, a8 as DateRangePicker, a9 as DateRangePickerProps, aa as DescriptionColumns, ab as DescriptionItem, ac as DescriptionList, ad as DescriptionListProps, ae as Dialog, af as DialogProps, ag as DialogSize, ah as Divider, ai as DividerProps, aj as DividerSpacing, ak as DonutChart, al as DonutChartProps, am as DonutSegment, an as Drawer, ao as DrawerProps, ap as DrawerSide, aq as DrawerSize, ar as ENTER, as as EditableGrid, at as EditableGridProps, au as EmailTemplate, av as EmptyState, aw as EmptyStateProps, ax as ErrorPage, ay as ErrorPageProps, az as FilePicker, aA as FilePickerProps, aB as FormField, aC as FormFieldProps, aD as FormLayoutPage, aE as GLASS_DIVIDER, aF as GLASS_INPUT_BG, aG as GROUP_COLORS, aH as GalleryTemplate, aI as Gap, aJ as GlobalSearch, aK as GlobalSearchProps, aL as Grid, aM as GridCols, aN as GridColumn, aO as GridProps, aP as HelpCenter, aQ as HelpCenterDoc, aR as HelpCenterProps, aS as INPUT_BASE, aT as INPUT_SIZES, aU as IconButton, aV as IconButtonProps, aW as Inline, aX as InlineProps, aY as Input, aZ as InputNumber, a_ as InputNumberProps, a$ as InputProps, b0 as InputSize, b1 as Justify, b2 as Kanban, b3 as KanbanColumn, b4 as KanbanProps, b5 as Label, b6 as LabelProps, b7 as ListFooter, b8 as ListLoadError, b9 as ListLoadErrorProps, ba as LoadingSpinner, bb as LoadingSpinnerProps, bc as MAX_FRACTION_DIGITS, bd as MOD, be as Markdown, bf as MarkdownProps, bg as MediaUploadField, bh as MediaUploadFieldProps, bi as MediaUploadGrid, bj as MediaUploadGridItem, bk as MediaUploadGridProps, bl as MetricBar, bm as MetricBarProps, bn as Milestone, bo as MilestoneKind, bp as MilestoneTimeline, bq as MilestoneTimelineProps, br as NativeSelect, bs as NumericKeypad, bt as NumericKeypadProps, bu as PageHeader, bv as PageHeaderProps, bw as Pagination, bx as PaginationProps, by as Paragraph, bz as ParagraphProps, bA as PopupMenu, bB as PopupMenuDivider, bC as PopupMenuItem, bD as PopupMenuLabel, bE as Radio, bF as RadioProps, bG as Result, bH as ResultProps, bI as ResultStatus, bJ as SHIFT, bK as SearchProvider, bL as SearchResult, bM as SearchableOption, bN as SearchableSelect, bO as SearchableSelectProps, bP as Segmented, bQ as SegmentedOption, bR as SegmentedProps, bS as SegmentedSize, bT as Select, bU as SelectOption, bV as SelectProps, bW as SemanticGroup, bX as SeverityTone, bY as ShellPrefsAdapter, bZ as ShellPrefsProvider, b_ as SidebarActionButton, b$ as SidebarActionButtonProps, c0 as SidebarGroupLabel, c1 as SidebarLayout, c2 as SidebarLayoutProps, c3 as SidebarNavItem, c4 as Skeleton, c5 as SkeletonProps, c6 as SkeletonVariant, c7 as Sparkline, c8 as SparklineProps, c9 as Stack, ca as StackProps, cb as StatCard, cc as StatCardProps, cd as Statistic, ce as StatisticProps, cf as StatisticSize, cg as StatisticTone, ch as StatusBadge, ci as StatusBadgeProvider, cj as Switch, ck as SwitchProps, cl as SwitchSize, cm as TabItem, cn as Tabs, co as TabsProps, cp as Text, cq as TextProps, cr as TextSize, cs as TextTone, ct as TextWeight, cu as Textarea, cv as TextareaProps, cw as Theme, cx as TileButton, cy as TileButtonProps, cz as TileSize, cA as Title, cB as TitleLevel, cC as TitleProps, cD as ToastOptions, cE as ToastPlacement, cF as Tooltip, cG as TooltipProps, cH as TopNav, cI as TopNavItem, cJ as TopNavProps, cK as VERSION, cL as appendKey, cM as applyThemePrefs, cN as backspace, cO as confirm, cP as confirmDestructive, cQ as formatDate, cR as glassStyle, cS as inputClasses, cT as isMac, cU as isSeverityTone, cV as mediaFileName, cW as prompt, cX as resolveTheme, cY as severityOf, cZ as tabButtonId, c_ as tabPanelId, c$ as toISODate, d0 as toast, d1 as useClickOutside, d2 as useConfirm, d3 as useFocusTrap, d4 as useIsMobile, d5 as useLocalStoragePrefs, d6 as useScrollLock, d7 as useShellPrefs, d8 as useTheme } from './index-B4RRJ5bp.js';
3
3
  import { W as WindowRegistry } from './types-BHVq95fp.js';
4
4
  export { M as ModalRegistryEntry, P as PageRegistryEntry, a as WindowRegistryEntry, i as isEntityEntry, b as isPageEntry, s as setShellWindowRegistry } from './types-BHVq95fp.js';
5
5
  import * as react from 'react';
@@ -120,6 +120,20 @@ declare function useWindowTitle(_title: string): void;
120
120
  declare function CopyButton({ text }: {
121
121
  text: string;
122
122
  }): react_jsx_runtime.JSX.Element;
123
+ /**
124
+ * The id of the `<Modal>` this component is rendered inside, or `''` outside one.
125
+ *
126
+ * This is the PRIVATE per-mount id (`modal-xxxxxx`) that `activationOrder` and
127
+ * the window-scoped CustomEvents carry — not the caller-supplied `windowKey`.
128
+ * Same context `useWindowMenuItem` and `useWidgetSettings` already read, and it
129
+ * reaches portal window content the same way theirs does.
130
+ *
131
+ * Use it to answer "was this event meant for MY window?", which
132
+ * {@link useModalActive} cannot: that asks "is the frontmost modal mine", and
133
+ * every nested dialog a form opens pushes itself onto `activationOrder`, so a
134
+ * form with a child dialog open reads as inactive.
135
+ */
136
+ declare function useEnclosingModalId(): string;
123
137
  /** Hook to check if the current modal is active (frontmost) */
124
138
  declare function useModalActive(): boolean;
125
139
  declare function ModalActions({ children, position }: {
@@ -413,32 +427,6 @@ declare class WindowErrorBoundary extends Component<WindowErrorBoundaryProps, {
413
427
  render(): string | number | boolean | Iterable<ReactNode> | react_jsx_runtime.JSX.Element | null | undefined;
414
428
  }
415
429
 
416
- interface SearchResult {
417
- /** Category label, e.g. "Sales Order". */
418
- type: string;
419
- /** Primary text shown in the result row. */
420
- label: string;
421
- /** Optional secondary line. */
422
- sub?: string;
423
- /** Window-registry key passed to openEntity. */
424
- entity_type: string;
425
- entity_id: string;
426
- }
427
- /** A search provider — given a query, returns matching results. The shell
428
- * calls every provider in parallel and concatenates the responses. */
429
- type SearchProvider = (query: string) => Promise<SearchResult[]>;
430
- /** Bundle of search-related consumer config. */
431
- interface SearchConfig {
432
- providers: SearchProvider[];
433
- /** Per-result-type icon (SVG path `d` attribute). Unmatched types fall
434
- * back to a generic magnifier glyph. */
435
- typeIcons?: Record<string, string>;
436
- placeholder?: string;
437
- }
438
- interface GlobalSearchProps extends Partial<SearchConfig> {
439
- }
440
- declare function GlobalSearch({ providers, typeIcons, placeholder }?: GlobalSearchProps): react_jsx_runtime.JSX.Element | null;
441
-
442
430
  declare function ShortcutHelp(): react_jsx_runtime.JSX.Element;
443
431
 
444
432
  /** Generic notification shape consumed by the shell. Consumer-specific
@@ -1960,6 +1948,42 @@ declare function useNewHotkey(callback: () => void): void;
1960
1948
  */
1961
1949
  declare function useEditHotkey(callback: (() => void) | null): void;
1962
1950
 
1951
+ /**
1952
+ * Registers a handler for the Cmd+S "save and stay" event dispatched by Modal.
1953
+ * The callback should save the form data WITHOUT closing the modal.
1954
+ *
1955
+ * Fires ONLY for the window the keystroke was aimed at. Modal restricts the
1956
+ * dispatch to the topmost modal, but the event goes to `document`, so without
1957
+ * this match every mounted window's hook answered one keypress — and with two
1958
+ * forms open, a single Cmd+S saved both. Depending on each form's mode that
1959
+ * either PATCHed a background record or CREATEd a brand new one, each with its
1960
+ * own success toast, so the user saw the write and misread which window it came
1961
+ * from.
1962
+ *
1963
+ * The match is on the originating modal's id rather than on
1964
+ * {@link useModalActive}, which asks a different question: "is the frontmost
1965
+ * modal mine". Every nested dialog a form opens pushes itself onto the
1966
+ * activation order, so a form with a child dialog open would read as inactive
1967
+ * and Cmd+S would silently do nothing where it used to save.
1968
+ *
1969
+ * An event with no `detail.modalId` is treated as "for me", so a consumer on a
1970
+ * newer package than the shell that dispatched it keeps working exactly as
1971
+ * before rather than losing Cmd+S entirely.
1972
+ */
1973
+ declare function useModalSave(callback: (() => void) | null): void;
1974
+
1975
+ /**
1976
+ * Registers a handler for the Alt+Shift+D "save as new / duplicate" event
1977
+ * dispatched by Modal. The callback should save the form data as a NEW record
1978
+ * (ignoring the current ID).
1979
+ *
1980
+ * Window-scoped for the same reason as {@link useModalSave}, and the stakes are
1981
+ * higher here: an unscoped duplicate created a second record from every open
1982
+ * form at once, and one consumer closes its window on success, so a background
1983
+ * window vanished as well.
1984
+ */
1985
+ declare function useModalDuplicate(callback: (() => void) | null): void;
1986
+
1963
1987
  interface UndoProviderProps {
1964
1988
  children: React.ReactNode;
1965
1989
  /**
@@ -2140,4 +2164,4 @@ interface UndoState {
2140
2164
  future: UndoStep[];
2141
2165
  }
2142
2166
 
2143
- export { type ActivityKind, type AsyncEnvironment, BLOCKED_PCT_CPU, type BatteryInfo, BehaviorPanel, type BottleneckKind, type BulkColumn, type BulkColumnKind, BulkImportGrid, type BulkImportGridProps, type BulkRow, CancelButton, ChangePasswordForm, type ChangePasswordFormProps, type ChangelogEntry, type ClockCalendarConfig, ColumnDef, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, Desktop, type DesktopContextMenuItem, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, type DuplicateGroup, type EntityFetcher, EntityList, type EntityListColumn, type EntityListContextAction, type EntityListProps, FilterBar, type FilterOption, type FpsGroup, GlobalSearch, type HealthCheckResult, ImageAnnotator, type ImageAnnotatorHandle, type ImageAnnotatorProps, LOG_CAP, Layout, type LayoutProps, type LogSummary, MIN_EVENT_SAMPLES, MIN_GROUP_SAMPLES, type MenuLayer, type MergeBulkOptions, type MergeBulkResult, type MobileAppConfig, Modal, ModalActions, NotificationBell, type NotificationsConfig, PaginatedResponse, PdfActionButton, type PdfActionButtonProps, type PerfEnvironment, type PerfLogRecord, type PerfReading, type PerfReport, PerfStats, type PerfStatsProps, type PlatformHints, ResizableTable, SMOOTH_FPS, type SearchConfig, type SearchProvider, type SearchResult, ServerStatusIndicator, type ServerStatusIndicatorProps, type ServerStatusUser, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, ShortcutHelp, SortState, SoundsPanel, type StagedTarget, StartMenu, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TodoProvider, type TodoTask, UndoControls, type UndoControlsApi, type UndoControlsProps, UndoProvider, type UndoProviderProps, type UndoSnapshot, type UndoState, type UndoStep, type UndoableOptions, type Verdict, WidgetManager, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowRegistry, type WindowTarget, type WindowTargetOptions, WindowTitle, appendRecord as appendPerfRecord, applyDevTitle, beginWindowGesture, classifyActivity, classify as classifyPerf, commitExposeHighlight, createWindowRegistry, createWindowTarget, describeMachine, describePerfReport, exitExposeMode, findDuplicateKeys, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isDevEnv, isInteracting, markMenuOpen, mergeBulkItems, toCsv as perfLogToCsv, perfReportFile, readEnvironment as readPerfEnvironment, registerModalEscapeInterceptor, requestAsyncEnvironment, requestWindowFront, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, summariseFrames, summariseLog as summarisePerfLog, toggleExposeMode, useColumnConfig, useDesktopHost, useEditHotkey, useFilters, useInfiniteScroll, useIsActiveWindow, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useSort, useTableNav, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTarget, useWindowTitle };
2167
+ export { type ActivityKind, type AsyncEnvironment, BLOCKED_PCT_CPU, type BatteryInfo, BehaviorPanel, type BottleneckKind, type BulkColumn, type BulkColumnKind, BulkImportGrid, type BulkImportGridProps, type BulkRow, CancelButton, ChangePasswordForm, type ChangePasswordFormProps, type ChangelogEntry, type ClockCalendarConfig, ColumnDef, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, Desktop, type DesktopContextMenuItem, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, type DuplicateGroup, type EntityFetcher, EntityList, type EntityListColumn, type EntityListContextAction, type EntityListProps, FilterBar, type FilterOption, type FpsGroup, type HealthCheckResult, ImageAnnotator, type ImageAnnotatorHandle, type ImageAnnotatorProps, LOG_CAP, Layout, type LayoutProps, type LogSummary, MIN_EVENT_SAMPLES, MIN_GROUP_SAMPLES, type MenuLayer, type MergeBulkOptions, type MergeBulkResult, type MobileAppConfig, Modal, ModalActions, NotificationBell, type NotificationsConfig, PaginatedResponse, PdfActionButton, type PdfActionButtonProps, type PerfEnvironment, type PerfLogRecord, type PerfReading, type PerfReport, PerfStats, type PerfStatsProps, type PlatformHints, ResizableTable, SMOOTH_FPS, SearchConfig, ServerStatusIndicator, type ServerStatusIndicatorProps, type ServerStatusUser, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, ShortcutHelp, SortState, SoundsPanel, type StagedTarget, StartMenu, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TodoProvider, type TodoTask, UndoControls, type UndoControlsApi, type UndoControlsProps, UndoProvider, type UndoProviderProps, type UndoSnapshot, type UndoState, type UndoStep, type UndoableOptions, type Verdict, WidgetManager, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowRegistry, type WindowTarget, type WindowTargetOptions, WindowTitle, appendRecord as appendPerfRecord, applyDevTitle, beginWindowGesture, classifyActivity, classify as classifyPerf, commitExposeHighlight, createWindowRegistry, createWindowTarget, describeMachine, describePerfReport, exitExposeMode, findDuplicateKeys, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isDevEnv, isInteracting, markMenuOpen, mergeBulkItems, toCsv as perfLogToCsv, perfReportFile, readEnvironment as readPerfEnvironment, registerModalEscapeInterceptor, requestAsyncEnvironment, requestWindowFront, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, summariseFrames, summariseLog as summarisePerfLog, toggleExposeMode, useColumnConfig, useDesktopHost, useEditHotkey, useEnclosingModalId, useFilters, useInfiniteScroll, useIsActiveWindow, useModalActive, useModalDuplicate, useModalSave, useNewHotkey, useShellAuth, useShellEntityFetcher, useSort, useTableNav, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTarget, useWindowTitle };
package/dist/index.js CHANGED
@@ -5,33 +5,33 @@ export { ImageAnnotator_default as ImageAnnotator } from './chunk-X5PZYTAK.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, CMD_A, ALT_SHIFT_N, ALT_SHIFT_E, CMD_ENTER, CMD_S, ALT_SHIFT_D, CMD_Z, CMD_SHIFT_Z, formatDate, useTheme, resolveTheme, useClickOutside, ListLoadError, ListFooter, firstEnabledIndex, Button_default, FormField, Input_default, applyThemePrefs, lastEnabledIndex, nextEnabledIndex, matchTypeahead } from './chunk-XBV7NUZK.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, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DateRangePicker, DescriptionList, Divider, DonutChart, Drawer, ENTER, EmailTemplate, EmptyState, ErrorPage, FilePicker, FormField, FormLayoutPage, GalleryTemplate, Grid, HelpCenter, INPUT_BASE, INPUT_SIZES, Inline, Input_default as Input, InputNumber_default as InputNumber, Kanban, Label, 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, Switch, Tabs, Text, Textarea_default as Textarea, TileButton_default as TileButton, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, inputClasses, isMac, isSeverityTone, mediaFileName, resolveTheme, severityOf, toISODate, useClickOutside, useTheme } from './chunk-XBV7NUZK.js';
10
- export { Breadcrumbs } from './chunk-HYAW6KIL.js';
8
+ import { CMD_K, CMD_DOT, 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-D4WFGAUW.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, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DatePicker_default as DatePicker, DateRangePicker, DescriptionList, Divider, DonutChart, Drawer, ENTER, EmailTemplate, EmptyState, ErrorPage, FilePicker, 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, 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, Switch_default as Switch, Tabs, Text, Textarea_default as Textarea, TileButton_default as TileButton, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, inputClasses, isMac, isSeverityTone, mediaFileName, resolveTheme, severityOf, tabButtonId, tabPanelId, toISODate, useClickOutside, useTheme } from './chunk-D4WFGAUW.js';
10
+ export { Breadcrumbs } from './chunk-HNH7FOYB.js';
11
11
  import { withSpareRow, EditableGrid } from './chunk-DC6BYGZ6.js';
12
12
  export { EditableGrid } from './chunk-DC6BYGZ6.js';
13
13
  import { SidebarLayout } from './chunk-YG45DAUT.js';
14
14
  export { SidebarLayout } from './chunk-YG45DAUT.js';
15
15
  import { toast_default } from './chunk-4AKVHY4B.js';
16
16
  export { toast_default as toast } from './chunk-4AKVHY4B.js';
17
- import { APP_VERSION, VERSION } from './chunk-CM2NWGYZ.js';
18
- export { VERSION } from './chunk-CM2NWGYZ.js';
17
+ import { APP_VERSION, VERSION } from './chunk-TQFUNASX.js';
18
+ export { VERSION } from './chunk-TQFUNASX.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, CancelButton, setWindowPosition } from './chunk-IGPSRRL7.js';
23
- export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useIsActiveWindow, useModalActive, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-IGPSRRL7.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-GUWAKATU.js';
23
+ export { CancelButton, CopyButton, DocFavStar, 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-GUWAKATU.js';
24
24
  import { PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, useShellPrefs, useIsMobile } from './chunk-C22EFSND.js';
25
25
  export { PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, useIsMobile, useLocalStoragePrefs, useShellPrefs } from './chunk-C22EFSND.js';
26
- import { registerModalEscapeInterceptor } from './chunk-L2O6B5KT.js';
27
- export { ConfirmProvider, Dialog, confirm, confirmDestructive, prompt, registerModalEscapeInterceptor, useConfirm, useFocusTrap, useScrollLock } from './chunk-L2O6B5KT.js';
26
+ import { registerModalEscapeInterceptor } from './chunk-OXLLRKBC.js';
27
+ export { ConfirmProvider, Dialog, confirm, confirmDestructive, prompt, registerModalEscapeInterceptor, useConfirm, useFocusTrap, useScrollLock } from './chunk-OXLLRKBC.js';
28
28
  import { startMenuCategories, navVisible, navSections, isSection, navIcons, isReachable, sectionIcons, useShellAuth, visibleChildren } from './chunk-WNLPTLT6.js';
29
29
  export { ShellAuthProvider, setShellNavIcons, useShellAuth } from './chunk-WNLPTLT6.js';
30
- import { glassStyle, GLASS_INPUT_BG } from './chunk-3CUSBZWG.js';
30
+ import { GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
31
31
  export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
32
- import { createContext, lazy, useSyncExternalStore, useState, useRef, useEffect, useCallback, useLayoutEffect, useMemo, useContext, isValidElement, cloneElement, Suspense, useId } from 'react';
33
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
32
+ import { createContext, lazy, useSyncExternalStore, useState, useEffect, useRef, useCallback, useLayoutEffect, useMemo, useContext, isValidElement, cloneElement, Suspense, useId } from 'react';
34
33
  import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react';
34
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
35
35
  import { createPortal } from 'react-dom';
36
36
  import { useQueryClient, useQuery, useMutation, useInfiniteQuery } from '@tanstack/react-query';
37
37
  import 'react-router-dom';
@@ -75,138 +75,6 @@ function createWindowTarget(windowKey) {
75
75
  function useWindowTarget(target) {
76
76
  return useSyncExternalStore(target.subscribe, target.get, target.get);
77
77
  }
78
- var DEFAULT_MAGNIFIER = "M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z";
79
- function GlobalSearch({ providers, typeIcons, placeholder = "Search..." } = {}) {
80
- const [open, setOpen] = useState(false);
81
- const [query, setQuery] = useState("");
82
- const [results, setResults] = useState([]);
83
- const [loading, setLoading] = useState(false);
84
- const [activeIdx, setActiveIdx] = useState(0);
85
- const inputRef = useRef(null);
86
- const { openEntity } = useWindowManager();
87
- const debounceRef = useRef();
88
- useEffect(() => {
89
- const handler = (e) => {
90
- if ((e.ctrlKey || e.metaKey) && e.key === "k") {
91
- e.preventDefault();
92
- setOpen((prev) => !prev);
93
- }
94
- if (e.key === "Escape" && open) {
95
- setOpen(false);
96
- }
97
- };
98
- window.addEventListener("keydown", handler);
99
- return () => window.removeEventListener("keydown", handler);
100
- }, [open]);
101
- useEffect(() => {
102
- if (open) {
103
- setTimeout(() => inputRef.current?.focus(), 50);
104
- } else {
105
- setQuery("");
106
- setResults([]);
107
- }
108
- }, [open]);
109
- useEffect(() => {
110
- if (debounceRef.current) clearTimeout(debounceRef.current);
111
- if (query.length < 2) {
112
- setResults([]);
113
- return;
114
- }
115
- if (!providers || providers.length === 0) {
116
- setResults([]);
117
- return;
118
- }
119
- debounceRef.current = setTimeout(async () => {
120
- setLoading(true);
121
- try {
122
- const responses = await Promise.all(providers.map((p) => p(query).catch(() => [])));
123
- setResults(responses.flat());
124
- setActiveIdx(0);
125
- } catch {
126
- setResults([]);
127
- }
128
- setLoading(false);
129
- }, 250);
130
- return () => {
131
- if (debounceRef.current) clearTimeout(debounceRef.current);
132
- };
133
- }, [query, providers]);
134
- const handleSelect = useCallback((result) => {
135
- setOpen(false);
136
- openEntity(result.entity_type, result.entity_id, null, result.label);
137
- }, [openEntity]);
138
- const handleKeyDown = (e) => {
139
- if (e.key === "ArrowDown") {
140
- e.preventDefault();
141
- setActiveIdx((i) => Math.min(i + 1, results.length - 1));
142
- } else if (e.key === "ArrowUp") {
143
- e.preventDefault();
144
- setActiveIdx((i) => Math.max(i - 1, 0));
145
- } else if (e.key === "Enter" && results[activeIdx]) {
146
- handleSelect(results[activeIdx]);
147
- }
148
- };
149
- if (!open) return null;
150
- return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-[200] flex items-start justify-center pt-[15vh]", onClick: () => setOpen(false), children: [
151
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/50 backdrop-blur-sm" }),
152
- /* @__PURE__ */ jsxs("div", { className: "relative z-10 w-full max-w-xl rounded-2xl overflow-hidden", onClick: (e) => e.stopPropagation(), style: glassStyle(), children: [
153
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-3 border-b border-gray-200", children: [
154
- /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: DEFAULT_MAGNIFIER }) }),
155
- /* @__PURE__ */ jsx(
156
- "input",
157
- {
158
- ref: inputRef,
159
- type: "text",
160
- value: query,
161
- onChange: (e) => setQuery(e.target.value),
162
- onKeyDown: handleKeyDown,
163
- placeholder,
164
- className: "flex-1 text-sm bg-transparent border-0 outline-none placeholder-gray-400"
165
- }
166
- ),
167
- /* @__PURE__ */ jsx("kbd", { className: "hidden sm:inline-flex items-center rounded border border-gray-300 px-1.5 py-0.5 text-[10px] font-medium text-gray-400", children: "ESC" })
168
- ] }),
169
- /* @__PURE__ */ jsxs("div", { className: "max-h-[50vh] overflow-y-auto", children: [
170
- loading && /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-center text-sm text-gray-400", children: "Searching..." }),
171
- !loading && query.length >= 2 && results.length === 0 && /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-center text-sm text-gray-400", children: "No results found." }),
172
- !loading && results.length > 0 && /* @__PURE__ */ jsx("ul", { className: "py-2", children: results.map((r, i) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
173
- "button",
174
- {
175
- className: `flex items-center gap-3 w-full px-4 py-2.5 text-left transition-colors ${i === activeIdx ? "bg-blue-50" : "hover:bg-gray-50"}`,
176
- onClick: () => handleSelect(r),
177
- onMouseEnter: () => setActiveIdx(i),
178
- children: [
179
- /* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-gray-400 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: typeIcons?.[r.type] || DEFAULT_MAGNIFIER }) }),
180
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
181
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-gray-900 truncate", children: r.label }),
182
- r.sub && /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 truncate", children: r.sub })
183
- ] }),
184
- /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-500", children: r.type })
185
- ]
186
- }
187
- ) }, `${r.type}-${r.label}-${i}`)) }),
188
- !loading && query.length < 2 && /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-center text-sm text-gray-400", children: "Type at least 2 characters to search..." })
189
- ] }),
190
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-t border-gray-100 bg-gray-50 text-[11px] text-gray-400", children: [
191
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
192
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
193
- /* @__PURE__ */ jsx("kbd", { className: "rounded border border-gray-300 px-1 py-0.5 font-medium", children: "\u2191" }),
194
- /* @__PURE__ */ jsx("kbd", { className: "rounded border border-gray-300 px-1 py-0.5 font-medium", children: "\u2193" }),
195
- " navigate"
196
- ] }),
197
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
198
- /* @__PURE__ */ jsx("kbd", { className: "rounded border border-gray-300 px-1 py-0.5 font-medium", children: "Enter" }),
199
- " open"
200
- ] })
201
- ] }),
202
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
203
- /* @__PURE__ */ jsx("kbd", { className: "rounded border border-gray-300 px-1 py-0.5 font-medium", children: "Esc" }),
204
- " close"
205
- ] })
206
- ] })
207
- ] })
208
- ] });
209
- }
210
78
  var sections = [
211
79
  {
212
80
  title: "Global",
@@ -3946,7 +3814,13 @@ function Layout({
3946
3814
  onReportBug: host.onReportBug
3947
3815
  }
3948
3816
  ),
3949
- /* @__PURE__ */ jsx(GlobalSearch, { ...search }),
3817
+ /* @__PURE__ */ jsx(
3818
+ GlobalSearch,
3819
+ {
3820
+ ...search,
3821
+ onSelect: (result) => openEntity(result.entity_type, result.entity_id, null, result.label)
3822
+ }
3823
+ ),
3950
3824
  /* @__PURE__ */ jsx(ShortcutHelp, {})
3951
3825
  ] });
3952
3826
  }
@@ -6995,6 +6869,40 @@ function useEditHotkey(callback) {
6995
6869
  }, [callback, isActive]);
6996
6870
  }
6997
6871
 
6998
- export { BLOCKED_PCT_CPU, BehaviorPanel, BulkImportGrid, ChangePasswordForm, Customization, DEV_BANNER_TEXT, Desktop, DesktopHostProvider, DevIndicator, EntityList, FilterBar, GlobalSearch, LOG_CAP, Layout, MIN_EVENT_SAMPLES, MIN_GROUP_SAMPLES, NotificationBell, PdfActionButton, PerfStats, ResizableTable, SMOOTH_FPS, ServerStatusIndicator, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, StartMenu, SystemPreferences, UndoControls, WidgetManager, appendRecord as appendPerfRecord, applyDevTitle, classifyActivity, classify as classifyPerf, createWindowRegistry, createWindowTarget, describeMachine, describePerfReport, findDuplicateKeys, isDevEnv, isInteracting, mergeBulkItems, toCsv as perfLogToCsv, perfReportFile, readEnvironment as readPerfEnvironment, requestAsyncEnvironment, summariseFrames, summariseLog as summarisePerfLog, useColumnConfig, useDesktopHost, useEditHotkey, useFilters, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav, useWindowTarget };
6872
+ // src/shell/modalEventScope.ts
6873
+ function isEventForModal(detail, modalId) {
6874
+ const from = detail?.modalId;
6875
+ if (typeof from !== "string" || from === "") return true;
6876
+ if (!modalId) return true;
6877
+ return from === modalId;
6878
+ }
6879
+
6880
+ // src/hooks/useModalSave.ts
6881
+ function useModalSave(callback) {
6882
+ const modalId = useEnclosingModalId();
6883
+ useEffect(() => {
6884
+ if (!callback) return;
6885
+ const handler = (e) => {
6886
+ if (!isEventForModal(e.detail, modalId)) return;
6887
+ callback();
6888
+ };
6889
+ document.addEventListener("modal-save", handler);
6890
+ return () => document.removeEventListener("modal-save", handler);
6891
+ }, [callback, modalId]);
6892
+ }
6893
+ function useModalDuplicate(callback) {
6894
+ const modalId = useEnclosingModalId();
6895
+ useEffect(() => {
6896
+ if (!callback) return;
6897
+ const handler = (e) => {
6898
+ if (!isEventForModal(e.detail, modalId)) return;
6899
+ callback();
6900
+ };
6901
+ document.addEventListener("modal-duplicate", handler);
6902
+ return () => document.removeEventListener("modal-duplicate", handler);
6903
+ }, [callback, modalId]);
6904
+ }
6905
+
6906
+ export { BLOCKED_PCT_CPU, BehaviorPanel, BulkImportGrid, ChangePasswordForm, Customization, DEV_BANNER_TEXT, Desktop, DesktopHostProvider, DevIndicator, EntityList, FilterBar, LOG_CAP, Layout, MIN_EVENT_SAMPLES, MIN_GROUP_SAMPLES, NotificationBell, PdfActionButton, PerfStats, ResizableTable, SMOOTH_FPS, ServerStatusIndicator, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, StartMenu, SystemPreferences, UndoControls, WidgetManager, appendRecord as appendPerfRecord, applyDevTitle, classifyActivity, classify as classifyPerf, createWindowRegistry, createWindowTarget, describeMachine, describePerfReport, findDuplicateKeys, isDevEnv, isInteracting, mergeBulkItems, toCsv as perfLogToCsv, perfReportFile, readEnvironment as readPerfEnvironment, requestAsyncEnvironment, summariseFrames, summariseLog as summarisePerfLog, useColumnConfig, useDesktopHost, useEditHotkey, useFilters, useInfiniteScroll, useModalDuplicate, useModalSave, useNewHotkey, useShellEntityFetcher, useSort, useTableNav, useWindowTarget };
6999
6907
  //# sourceMappingURL=index.js.map
7000
6908
  //# sourceMappingURL=index.js.map