react-os-shell 3.6.0 → 3.7.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 (52) hide show
  1. package/dist/Browser-IYC3LJ5P.js +7 -0
  2. package/dist/{Browser-KMCFAQ6B.js.map → Browser-IYC3LJ5P.js.map} +1 -1
  3. package/dist/{Calculator-LGYXEZTY.js → Calculator-5PABMVXY.js} +4 -4
  4. package/dist/{Calculator-LGYXEZTY.js.map → Calculator-5PABMVXY.js.map} +1 -1
  5. package/dist/{CurrencyConverter-JI5ECSQA.js → CurrencyConverter-2DTZV4JC.js} +4 -4
  6. package/dist/{CurrencyConverter-JI5ECSQA.js.map → CurrencyConverter-2DTZV4JC.js.map} +1 -1
  7. package/dist/{Documents-Q3IGUDRC.js → Documents-YK7FB475.js} +4 -4
  8. package/dist/{Documents-Q3IGUDRC.js.map → Documents-YK7FB475.js.map} +1 -1
  9. package/dist/Files-FKLB5NV2.js +12 -0
  10. package/dist/{Files-JQMMXIM3.js.map → Files-FKLB5NV2.js.map} +1 -1
  11. package/dist/{Notepad-RGNFWBH7.js → Notepad-TXUDJ4TG.js} +4 -4
  12. package/dist/{Notepad-RGNFWBH7.js.map → Notepad-TXUDJ4TG.js.map} +1 -1
  13. package/dist/{PomodoroTimer-5WZ37PLI.js → PomodoroTimer-PFZVSP3I.js} +5 -5
  14. package/dist/{PomodoroTimer-5WZ37PLI.js.map → PomodoroTimer-PFZVSP3I.js.map} +1 -1
  15. package/dist/Preview-WIV5TUJU.js +8 -0
  16. package/dist/{Preview-6QVSOGRM.js.map → Preview-WIV5TUJU.js.map} +1 -1
  17. package/dist/Spreadsheet-MUIPMKMH.js +7 -0
  18. package/dist/{Spreadsheet-FHAQX6CU.js.map → Spreadsheet-MUIPMKMH.js.map} +1 -1
  19. package/dist/{Stock-ERDFTUOZ.js → Stock-OMLDYMWN.js} +4 -4
  20. package/dist/{Stock-ERDFTUOZ.js.map → Stock-OMLDYMWN.js.map} +1 -1
  21. package/dist/{Weather-6WBY4ANL.js → Weather-7QUTCZKH.js} +4 -4
  22. package/dist/{Weather-6WBY4ANL.js.map → Weather-7QUTCZKH.js.map} +1 -1
  23. package/dist/{WorldClock-ZOLBVSJC.js → WorldClock-M6IVJBYN.js} +4 -4
  24. package/dist/{WorldClock-ZOLBVSJC.js.map → WorldClock-M6IVJBYN.js.map} +1 -1
  25. package/dist/apps/index.js +19 -19
  26. package/dist/{chunk-65NSWQAT.js → chunk-6FKV2CQK.js} +4 -4
  27. package/dist/{chunk-65NSWQAT.js.map → chunk-6FKV2CQK.js.map} +1 -1
  28. package/dist/{chunk-2OONWKUI.js → chunk-ACJVFI6M.js} +4 -4
  29. package/dist/{chunk-2OONWKUI.js.map → chunk-ACJVFI6M.js.map} +1 -1
  30. package/dist/{chunk-CML7B3S4.js → chunk-AUQ74UJM.js} +4 -4
  31. package/dist/{chunk-CML7B3S4.js.map → chunk-AUQ74UJM.js.map} +1 -1
  32. package/dist/{chunk-TVSL5Y5H.js → chunk-K62Q5WNU.js} +4 -4
  33. package/dist/{chunk-TVSL5Y5H.js.map → chunk-K62Q5WNU.js.map} +1 -1
  34. package/dist/{chunk-6VMTAVUD.js → chunk-L7B66ALK.js} +3 -3
  35. package/dist/{chunk-6VMTAVUD.js.map → chunk-L7B66ALK.js.map} +1 -1
  36. package/dist/{chunk-JQGXIQVO.js → chunk-N3UIMOYF.js} +4 -4
  37. package/dist/{chunk-JQGXIQVO.js.map → chunk-N3UIMOYF.js.map} +1 -1
  38. package/dist/{chunk-L5TFGRBY.js → chunk-RTT4QFJ7.js} +5 -5
  39. package/dist/{chunk-L5TFGRBY.js.map → chunk-RTT4QFJ7.js.map} +1 -1
  40. package/dist/{chunk-6OWYD4O6.js → chunk-S22GZ4OQ.js} +31 -2
  41. package/dist/chunk-S22GZ4OQ.js.map +1 -0
  42. package/dist/{chunk-XRBSB7FX.js → chunk-WPZDC7HH.js} +3 -3
  43. package/dist/{chunk-XRBSB7FX.js.map → chunk-WPZDC7HH.js.map} +1 -1
  44. package/dist/index.d.ts +123 -1
  45. package/dist/index.js +196 -11
  46. package/dist/index.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/Browser-KMCFAQ6B.js +0 -7
  49. package/dist/Files-JQMMXIM3.js +0 -12
  50. package/dist/Preview-6QVSOGRM.js +0 -8
  51. package/dist/Spreadsheet-FHAQX6CU.js +0 -7
  52. package/dist/chunk-6OWYD4O6.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { Modal } from './chunk-6OWYD4O6.js';
1
+ import { Modal } from './chunk-S22GZ4OQ.js';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
3
 
4
4
  var DEFAULT_APPEARANCE = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };
@@ -138,5 +138,5 @@ function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceCha
138
138
  }
139
139
 
140
140
  export { WidgetSettingsModal, loadAppearance };
141
- //# sourceMappingURL=chunk-XRBSB7FX.js.map
142
- //# sourceMappingURL=chunk-XRBSB7FX.js.map
141
+ //# sourceMappingURL=chunk-WPZDC7HH.js.map
142
+ //# sourceMappingURL=chunk-WPZDC7HH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-XRBSB7FX.js","sourcesContent":["import Modal from './Modal';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n return (\n <div onPointerDown={e => e.stopPropagation()} onContextMenu={e => e.stopPropagation()}>\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/shell/WidgetSettingsModal.tsx"],"names":[],"mappings":"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","file":"chunk-WPZDC7HH.js","sourcesContent":["import Modal from './Modal';\n\nexport interface WidgetAppearance {\n activeOpacity: number;\n inactiveOpacity: number;\n activeBlur: number;\n inactiveBlur: number;\n}\n\nexport const DEFAULT_APPEARANCE: WidgetAppearance = { activeOpacity: 70, inactiveOpacity: 50, activeBlur: 0, inactiveBlur: 0 };\n\nexport function loadAppearance(key: string): WidgetAppearance {\n try {\n const saved = JSON.parse(localStorage.getItem(key) || '');\n // Migrate old single `blur` field to activeBlur/inactiveBlur\n if (saved.blur != null && saved.activeBlur == null) {\n saved.activeBlur = saved.blur;\n saved.inactiveBlur = saved.blur;\n delete saved.blur;\n }\n return { ...DEFAULT_APPEARANCE, ...saved };\n }\n catch { return DEFAULT_APPEARANCE; }\n}\n\n/** Reusable settings modal for widgets — renders appearance sliders + optional extra content above */\nexport default function WidgetSettingsModal({ open, onClose, title, appearance, onAppearanceChange, onSave, children }: {\n open: boolean;\n onClose: () => void;\n title: string;\n appearance: WidgetAppearance;\n onAppearanceChange: (a: WidgetAppearance) => void;\n onSave: () => void;\n children?: React.ReactNode;\n}) {\n if (!open) return null;\n\n const inp = 'w-full h-1.5 rounded-full appearance-none bg-gray-200 cursor-pointer accent-blue-500';\n const lbl = 'flex items-center justify-between text-xs text-gray-500';\n\n return (\n <div onPointerDown={e => e.stopPropagation()} onContextMenu={e => e.stopPropagation()}>\n <Modal open={open} onClose={onClose} title={title} size=\"sm\">\n <div className=\"space-y-4\">\n {children}\n\n {/* Appearance */}\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">Appearance</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Active</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.activeOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.activeOpacity}\n onChange={e => onAppearanceChange({ ...appearance, activeOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.activeBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.activeBlur}\n onChange={e => onAppearanceChange({ ...appearance, activeBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs font-medium text-gray-600 mb-2\">Inactive</div>\n <div className=\"space-y-2\">\n <div>\n <div className={lbl}><span>Opacity</span><span>{appearance.inactiveOpacity}%</span></div>\n <input type=\"range\" min={20} max={100} value={appearance.inactiveOpacity}\n onChange={e => onAppearanceChange({ ...appearance, inactiveOpacity: +e.target.value })} className={inp} />\n </div>\n <div>\n <div className={lbl}><span>Blur</span><span>{appearance.inactiveBlur}px</span></div>\n <input type=\"range\" min={0} max={20} value={appearance.inactiveBlur}\n onChange={e => onAppearanceChange({ ...appearance, inactiveBlur: +e.target.value })} className={inp} />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 pt-2\">\n <button onClick={onSave}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition\">Save</button>\n <button onClick={onClose}\n className=\"flex-1 text-sm font-medium py-2 rounded-lg border border-gray-300 text-gray-600 hover:bg-gray-50 transition\">Cancel</button>\n </div>\n </div>\n </Modal>\n </div>\n );\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1608,6 +1608,128 @@ interface TooltipProps {
1608
1608
  }
1609
1609
  declare function Tooltip({ content, side, delay, children }: TooltipProps): react_jsx_runtime.JSX.Element;
1610
1610
 
1611
+ interface ColoredBadgeProps {
1612
+ /** Tailwind classes for the badge color, e.g. `bg-green-100 text-green-800`.
1613
+ * Keep a per-app palette map rather than hardcoding colors at call sites. */
1614
+ colorClass: string;
1615
+ children: ReactNode;
1616
+ /** `xs` = 10px (dense list cells), `sm` = 12px / px-2 (default), `md` =
1617
+ * 12px / px-2.5 (matches StatusBadge). */
1618
+ size?: 'xs' | 'sm' | 'md';
1619
+ /** Capitalize each word — useful for raw status strings like `in_progress`
1620
+ * (rendered as `In Progress`). Default false. */
1621
+ capitalize?: boolean;
1622
+ }
1623
+ /**
1624
+ * ColoredBadge — a small rounded-full pill whose colors are supplied as a
1625
+ * Tailwind class string. Generic counterpart to StatusBadge (which maps status
1626
+ * strings to semantic groups); use this when the caller already knows the color.
1627
+ */
1628
+ declare function ColoredBadge({ colorClass, children, size, capitalize }: ColoredBadgeProps): react_jsx_runtime.JSX.Element;
1629
+
1630
+ interface EmptyStateProps {
1631
+ /** Bold heading, e.g. "No invoices yet". */
1632
+ title?: string;
1633
+ /** Muted primary line. Defaults to "Nothing here yet." when neither
1634
+ * `title` nor `message` is given. */
1635
+ message?: string;
1636
+ /** Secondary muted line. (`hint` is an accepted alias.) */
1637
+ description?: string;
1638
+ /** @deprecated alias for `description`. */
1639
+ hint?: string;
1640
+ /** Frame around the content: `dashed` (default), `card` (bordered surface),
1641
+ * or `none`. */
1642
+ variant?: 'dashed' | 'card' | 'none';
1643
+ /** @deprecated set `variant="none"` instead. */
1644
+ frameless?: boolean;
1645
+ /** Show the placeholder icon. Defaults to true (false for `variant="card"`). */
1646
+ icon?: boolean;
1647
+ /** Action(s) rendered under the text. */
1648
+ children?: ReactNode;
1649
+ }
1650
+ /**
1651
+ * EmptyState — placeholder for empty lists/panes. Supersedes the per-portal
1652
+ * copies: accepts both the `title`/`description` and `message`/`hint`/`frameless`
1653
+ * prop shapes, with a single unified look.
1654
+ */
1655
+ declare function EmptyState({ title, message, description, hint, variant, frameless, icon, children, }: EmptyStateProps): react_jsx_runtime.JSX.Element;
1656
+
1657
+ interface PageHeaderProps {
1658
+ title: string;
1659
+ /** Muted line under the title. (`subtitle` is an accepted alias.) */
1660
+ description?: string;
1661
+ /** @deprecated alias for `description`. */
1662
+ subtitle?: string;
1663
+ /** Right-aligned actions. (`children` is also accepted.) */
1664
+ actions?: ReactNode;
1665
+ children?: ReactNode;
1666
+ }
1667
+ /**
1668
+ * PageHeader — a page/section title with an optional muted description and a
1669
+ * right-aligned actions slot. Accepts both the `description`/`actions` and the
1670
+ * `subtitle`/`children` prop shapes the portals previously used locally.
1671
+ */
1672
+ declare function PageHeader({ title, description, subtitle, actions, children }: PageHeaderProps): react_jsx_runtime.JSX.Element;
1673
+
1674
+ interface LoadingSpinnerProps {
1675
+ /** Ring diameter: `sm` = 20px, `md` = 32px (default), `lg` = 48px. */
1676
+ size?: 'sm' | 'md' | 'lg';
1677
+ /** Wrapper padding utility (default `py-12`). Pass `''` to remove. */
1678
+ padding?: string;
1679
+ /** Extra classes on the centering wrapper. */
1680
+ className?: string;
1681
+ }
1682
+ /**
1683
+ * LoadingSpinner — a centered animated ring for pending/loading regions.
1684
+ * (Distinct from the shell's internal "Loading…" text used inside data grids.)
1685
+ */
1686
+ declare function LoadingSpinner({ size, padding, className }: LoadingSpinnerProps): react_jsx_runtime.JSX.Element;
1687
+
1688
+ interface FilterOption {
1689
+ label: string;
1690
+ field: string;
1691
+ options: {
1692
+ value: string;
1693
+ label: string;
1694
+ }[];
1695
+ searchable?: boolean;
1696
+ }
1697
+ interface FilterBarProps {
1698
+ filters: FilterOption[];
1699
+ values: Record<string, string>;
1700
+ onChange: (field: string, value: string) => void;
1701
+ onClear: () => void;
1702
+ children?: ReactNode;
1703
+ }
1704
+ /**
1705
+ * FilterBar — a horizontal row of filter controls. Each filter renders a native
1706
+ * `<select>` or, for long lists, a glass-styled searchable dropdown; a "Clear
1707
+ * filters" button appears when any filter is active. Pair with `useFilters`.
1708
+ */
1709
+ declare function FilterBar({ filters, values, onChange, onClear, children }: FilterBarProps): react_jsx_runtime.JSX.Element;
1710
+ /** Local filter-state helper: tracks active filter values + derived params. */
1711
+ declare function useFilters(): {
1712
+ filterValues: Record<string, string>;
1713
+ setFilter: (field: string, value: string) => void;
1714
+ clearFilters: () => void;
1715
+ filterParams: Record<string, string>;
1716
+ };
1717
+
1718
+ /**
1719
+ * Presentational building blocks for SidebarLayout filter sidebars (status
1720
+ * buckets, categories, …) — the same item + group-label markup every list
1721
+ * window renders. Data wiring (count fetching) stays in the consuming app.
1722
+ */
1723
+ declare function SidebarGroupLabel({ children }: {
1724
+ children: ReactNode;
1725
+ }): react_jsx_runtime.JSX.Element;
1726
+ declare function SidebarNavItem({ label, count, active, onClick }: {
1727
+ label: string;
1728
+ count?: number;
1729
+ active: boolean;
1730
+ onClick: () => void;
1731
+ }): react_jsx_runtime.JSX.Element;
1732
+
1611
1733
  /**
1612
1734
  * Shared chart types. The charts are dependency-free inline SVG/CSS — color
1613
1735
  * defaults to `currentColor` so a parent `text-*` class themes them, and
@@ -1846,4 +1968,4 @@ declare function useNewHotkey(callback: () => void): void;
1846
1968
  */
1847
1969
  declare function useEditHotkey(callback: (() => void) | null): void;
1848
1970
 
1849
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, type AccordionItem, type AccordionProps, AuthScreen, type AuthScreenProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize, type AvatarStatus, Banner, type BannerProps, type BannerTone, BarChart, type BarChartProps, BehaviorPanel, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, Card, type CardProps, type CellStyle, type ChangelogEntry, ChatTemplate, Checkbox, type CheckboxProps, CheckoutTemplate, type ClockCalendarConfig, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, DashboardTemplate, DataTablePage, Desktop, type DesktopContextMenuItem, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, DonutChart, type DonutChartProps, type DonutSegment, ENTER, EditableGrid, type EditableGridProps, EmailTemplate, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, ErrorPage, type ErrorPageProps, FormField, type FormFieldProps, FormLayoutPage, GLASS_DIVIDER, GLASS_INPUT_BG, GalleryTemplate, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, INPUT_BASE, ImageAnnotator, type ImageAnnotatorHandle, type ImageAnnotatorProps, Input, type InputProps, Kanban, type KanbanColumn, type KanbanProps, Label, type LabelProps, Layout, type LayoutProps, ListFooter, MOD, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, type PaginatedResponse, Pagination, type PaginationProps, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, Radio, type RadioProps, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SearchableOption, SearchableSelect, type SearchableSelectProps, Select, type SelectOption, type SelectProps, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, SidebarLayout, type SidebarLayoutProps, type SortState, SoundsPanel, Sparkline, type SparklineProps, StartMenu, StatCard, type StatCardProps, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TabItem, Tabs, type TabsProps, Textarea, type TextareaProps, type TodoProvider, type TodoTask, Tooltip, type TooltipProps, TopNav, type TopNavItem, type TopNavProps, VERSION, WidgetManager, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowRegistry, WindowTitle, applyDevTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, getWindowPosition, glassStyle, inputClasses, isDevEnv, isMac, prompt, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toast, toggleExposeMode, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useLocalStoragePrefs, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
1971
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, type AccordionItem, type AccordionProps, AuthScreen, type AuthScreenProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, type AvatarSize, type AvatarStatus, Banner, type BannerProps, type BannerTone, BarChart, type BarChartProps, BehaviorPanel, type BreadcrumbItem, Breadcrumbs, type BreadcrumbsProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, CancelButton, Card, type CardProps, type CellStyle, type ChangelogEntry, ChatTemplate, Checkbox, type CheckboxProps, CheckoutTemplate, type ClockCalendarConfig, ColoredBadge, type ColoredBadgeProps, type ColumnDef, ConfirmProvider, CopyButton, Customization, type CustomizationOmitSection, type CustomizationProps, type CustomizationSection, DEV_BANNER_TEXT, DashboardTemplate, DataTablePage, Desktop, type DesktopContextMenuItem, type DesktopHostConfig, DesktopHostProvider, DevIndicator, DocFavStar, DonutChart, type DonutChartProps, type DonutSegment, ENTER, EditableGrid, type EditableGridProps, EmailTemplate, EmptyState, type EmptyStateProps, type EntityFetcher, EntityList, type EntityListColumn, type EntityListProps, ErrorPage, type ErrorPageProps, FilterBar, type FilterOption, FormField, type FormFieldProps, FormLayoutPage, GLASS_DIVIDER, GLASS_INPUT_BG, GalleryTemplate, GlobalSearch, type GridColumn, HelpCenter, type HelpCenterDoc, type HelpCenterProps, INPUT_BASE, ImageAnnotator, type ImageAnnotatorHandle, type ImageAnnotatorProps, Input, type InputProps, Kanban, type KanbanColumn, type KanbanProps, Label, type LabelProps, Layout, type LayoutProps, ListFooter, LoadingSpinner, type LoadingSpinnerProps, MOD, Markdown, type MarkdownProps, Modal, ModalActions, NotificationBell, type NotificationsConfig, PageHeader, type PageHeaderProps, type PaginatedResponse, Pagination, type PaginationProps, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, Radio, type RadioProps, ResizableTable, SHIFT, type SearchConfig, type SearchProvider, type SearchResult, type SearchableOption, SearchableSelect, type SearchableSelectProps, Select, type SelectOption, type SelectProps, type SemanticGroup, type ShellAuth, ShellAuthProvider, ShellEntityFetcherProvider, type ShellNotification, type ShellPrefsAdapter, ShellPrefsProvider, ShortcutHelp, SidebarGroupLabel, SidebarLayout, type SidebarLayoutProps, SidebarNavItem, type SortState, SoundsPanel, Sparkline, type SparklineProps, StartMenu, StatCard, type StatCardProps, StatusBadge, StatusBadgeProvider, type StickyEntityRef, type StickyResolver, SystemPreferences, type SystemPreferencesProps, type SystemPreferencesSection, type TabItem, Tabs, type TabsProps, Textarea, type TextareaProps, type TodoProvider, type TodoTask, Tooltip, type TooltipProps, TopNav, type TopNavItem, type TopNavProps, VERSION, WidgetManager, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowRegistry, WindowTitle, applyDevTitle, commitExposeHighlight, confirm, confirmDestructive, createWindowRegistry, exitExposeMode, formatDate, getActiveWindowRoute, getExposeHighlight, getWindowPosition, glassStyle, inputClasses, isDevEnv, isMac, prompt, registerModalEscapeInterceptor, setExposeHighlight, setShellApiClient, setShellAuthBridge, setShellNavIcons, setShellTodoProvider, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toast, toggleExposeMode, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useFilters, useInfiniteScroll, useLocalStoragePrefs, useModalActive, useNewHotkey, useShellAuth, useShellEntityFetcher, useShellPrefs, useSort, useTableNav, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle };
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
- import { subscribePomo, getPomoSnapshot } from './chunk-6VMTAVUD.js';
2
- export { setShellTodoProvider } from './chunk-6VMTAVUD.js';
3
- import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-TVSL5Y5H.js';
4
- export { Breadcrumbs } from './chunk-TVSL5Y5H.js';
1
+ import { subscribePomo, getPomoSnapshot } from './chunk-L7B66ALK.js';
2
+ export { setShellTodoProvider } from './chunk-L7B66ALK.js';
3
+ import { PREVIEW_OPENED_EVENT, publishDesktopFolders, requestFilesTrashView, FolderGlyph, openPreviewFile, requestFilesDesktopFolderView, FileIconTile, hashGradient } from './chunk-K62Q5WNU.js';
4
+ export { Breadcrumbs } from './chunk-K62Q5WNU.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-CML7B3S4.js';
8
+ export { ImageAnnotator_default as ImageAnnotator } from './chunk-AUQ74UJM.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-JQGXIQVO.js';
11
+ export { EditableGrid } from './chunk-N3UIMOYF.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-65NSWQAT.js';
15
- export { VERSION } from './chunk-65NSWQAT.js';
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
- 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';
14
+ import { APP_VERSION } from './chunk-6FKV2CQK.js';
15
+ export { VERSION } from './chunk-6FKV2CQK.js';
16
+ import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, WINDOW_REGISTRY, isPageEntry, Modal, useShellPrefs, useIsMobile, ModalActions, useModalActive, client_default, LoadingSpinner, setWindowPosition, ThumbCard, activateModal } from './chunk-S22GZ4OQ.js';
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-S22GZ4OQ.js';
18
18
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-UBN4IUDE.js';
19
19
  import { glassStyle, startMenuCategories, navSections, isSection, GLASS_INPUT_BG, navIcons, sectionIcons } from './chunk-ZF6AYO4G.js';
20
20
  export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle, setShellNavIcons } from './chunk-ZF6AYO4G.js';
@@ -24,6 +24,7 @@ import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react';
24
24
  import { createPortal } from 'react-dom';
25
25
  import { useQueryClient, useQuery, useMutation, useInfiniteQuery } from '@tanstack/react-query';
26
26
  import 'react-router-dom';
27
+ import { XMarkIcon } from '@heroicons/react/20/solid';
27
28
 
28
29
  // src/windowRegistry/createWindowRegistry.ts
29
30
  function createWindowRegistry(...partials) {
@@ -6656,6 +6657,190 @@ function Tooltip({ content, side = "top", delay = 200, children }) {
6656
6657
  }
6657
6658
  );
6658
6659
  }
6660
+ function ColoredBadge({ colorClass, children, size = "sm", capitalize = false }) {
6661
+ const sizeCls = size === "xs" ? "px-2 py-0.5 text-[10px]" : size === "md" ? "px-2.5 py-0.5 text-xs" : "px-2 py-0.5 text-xs";
6662
+ const capCls = capitalize ? "capitalize" : "";
6663
+ return /* @__PURE__ */ jsx("span", { className: `inline-flex items-center rounded-full font-medium ${sizeCls} ${capCls} ${colorClass}`, children });
6664
+ }
6665
+ function EmptyState({
6666
+ title,
6667
+ message,
6668
+ description,
6669
+ hint,
6670
+ variant,
6671
+ frameless,
6672
+ icon,
6673
+ children
6674
+ }) {
6675
+ const v = frameless ? "none" : variant ?? "dashed";
6676
+ const showIcon = icon ?? v !== "card";
6677
+ const primary = message ?? (title ? void 0 : "Nothing here yet.");
6678
+ const secondary = description ?? hint;
6679
+ const frame = v === "card" ? "rounded-md border border-gray-200 bg-white px-6 py-12" : v === "none" ? "px-6 py-12" : "rounded-lg border-2 border-dashed border-gray-300 px-6 py-12";
6680
+ return /* @__PURE__ */ jsxs("div", { className: `flex flex-col items-center justify-center text-center ${frame}`, children: [
6681
+ showIcon && /* @__PURE__ */ jsx("svg", { className: "h-10 w-10 text-gray-300 mb-3", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" }) }),
6682
+ title && /* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-gray-900", children: title }),
6683
+ primary && /* @__PURE__ */ jsx("p", { className: `text-sm text-gray-500 ${title ? "mt-2" : ""}`, children: primary }),
6684
+ secondary && /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 mt-1", children: secondary }),
6685
+ children && /* @__PURE__ */ jsx("div", { className: "mt-4", children })
6686
+ ] });
6687
+ }
6688
+ function PageHeader({ title, description, subtitle, actions, children }) {
6689
+ const desc = description ?? subtitle;
6690
+ const right = actions ?? children;
6691
+ return /* @__PURE__ */ jsxs("div", { className: "mb-6 flex items-start justify-between gap-4", children: [
6692
+ /* @__PURE__ */ jsxs("div", { children: [
6693
+ /* @__PURE__ */ jsx("h1", { className: "text-xl font-semibold text-gray-900", children: title }),
6694
+ desc && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-gray-500", children: desc })
6695
+ ] }),
6696
+ right && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: right })
6697
+ ] });
6698
+ }
6699
+ function LoadingSpinner2({ size = "md", padding = "py-12", className = "" }) {
6700
+ const dim = size === "sm" ? "h-5 w-5" : size === "lg" ? "h-12 w-12" : "h-8 w-8";
6701
+ return /* @__PURE__ */ jsx("div", { className: `flex items-center justify-center ${padding} ${className}`, children: /* @__PURE__ */ jsx("div", { className: `${dim} animate-spin rounded-full border-2 border-gray-200 border-t-blue-600` }) });
6702
+ }
6703
+ function FilterBar({ filters, values, onChange, onClear, children }) {
6704
+ const activeCount = Object.values(values).filter(Boolean).length;
6705
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [
6706
+ filters.map((f) => {
6707
+ const isSearchable = f.searchable ?? f.options.length > 8;
6708
+ return isSearchable ? /* @__PURE__ */ jsx(
6709
+ SearchableFilter,
6710
+ {
6711
+ filter: f,
6712
+ value: values[f.field] || "",
6713
+ onChange: (v) => onChange(f.field, v)
6714
+ },
6715
+ f.field
6716
+ ) : /* @__PURE__ */ jsxs(
6717
+ "select",
6718
+ {
6719
+ value: values[f.field] || "",
6720
+ onChange: (e) => onChange(f.field, e.target.value),
6721
+ className: `border rounded-lg px-2.5 py-1.5 text-sm ${values[f.field] ? "border-blue-400 bg-blue-50 text-blue-700" : "border-gray-300 text-gray-600"}`,
6722
+ children: [
6723
+ /* @__PURE__ */ jsx("option", { value: "", children: f.label }),
6724
+ f.options.map((o) => /* @__PURE__ */ jsx("option", { value: o.value, children: o.label }, o.value))
6725
+ ]
6726
+ },
6727
+ f.field
6728
+ );
6729
+ }),
6730
+ children,
6731
+ activeCount > 0 && /* @__PURE__ */ jsxs("button", { onClick: onClear, className: "flex items-center gap-1 text-sm text-gray-500 hover:text-gray-700", children: [
6732
+ /* @__PURE__ */ jsx(XMarkIcon, { className: "h-4 w-4" }),
6733
+ "Clear filters"
6734
+ ] })
6735
+ ] });
6736
+ }
6737
+ function SearchableFilter({ filter, value, onChange }) {
6738
+ const [open, setOpen] = useState(false);
6739
+ const [search, setSearch] = useState("");
6740
+ const ref = useRef(null);
6741
+ const inputRef = useRef(null);
6742
+ const selectedLabel = value ? filter.options.find((o) => o.value === value)?.label : null;
6743
+ useClickOutside(ref, useCallback(() => {
6744
+ if (open) {
6745
+ setOpen(false);
6746
+ setSearch("");
6747
+ }
6748
+ }, [open]));
6749
+ useEffect(() => {
6750
+ if (open) setTimeout(() => inputRef.current?.focus(), 50);
6751
+ }, [open]);
6752
+ const filtered = search ? filter.options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase())) : filter.options;
6753
+ return /* @__PURE__ */ jsxs("div", { ref, className: "relative", children: [
6754
+ /* @__PURE__ */ jsxs(
6755
+ "button",
6756
+ {
6757
+ onClick: () => setOpen(!open),
6758
+ className: `flex items-center gap-1.5 border rounded-lg px-2.5 py-1.5 text-sm transition-colors ${value ? "border-blue-400 bg-blue-50 text-blue-700" : "border-gray-300 text-gray-600 hover:border-gray-400"}`,
6759
+ children: [
6760
+ /* @__PURE__ */ jsx("span", { className: "truncate max-w-[140px]", children: selectedLabel || filter.label }),
6761
+ value ? /* @__PURE__ */ jsx("button", { onClick: (e) => {
6762
+ e.stopPropagation();
6763
+ onChange("");
6764
+ setSearch("");
6765
+ }, className: "text-blue-400 hover:text-blue-600", children: /* @__PURE__ */ jsx(XMarkIcon, { className: "h-3.5 w-3.5" }) }) : /* @__PURE__ */ jsx("svg", { className: `h-3.5 w-3.5 text-gray-400 transition-transform ${open ? "rotate-180" : ""}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19.5 8.25l-7.5 7.5-7.5-7.5" }) })
6766
+ ]
6767
+ }
6768
+ ),
6769
+ open && /* @__PURE__ */ jsxs("div", { className: "absolute top-full left-0 mt-1 w-56 rounded-2xl z-[400] overflow-hidden", style: glassStyle(), children: [
6770
+ /* @__PURE__ */ jsx("div", { className: "p-1.5 border-b border-gray-100", children: /* @__PURE__ */ jsx(
6771
+ "input",
6772
+ {
6773
+ ref: inputRef,
6774
+ value: search,
6775
+ onChange: (e) => setSearch(e.target.value),
6776
+ placeholder: `Search ${filter.label.replace(/^All\s*/i, "").toLowerCase()}...`,
6777
+ className: "w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-sm focus:border-blue-400 focus:ring-0 outline-none"
6778
+ }
6779
+ ) }),
6780
+ /* @__PURE__ */ jsxs("div", { className: "max-h-52 overflow-y-auto", children: [
6781
+ /* @__PURE__ */ jsx(
6782
+ "button",
6783
+ {
6784
+ onClick: () => {
6785
+ onChange("");
6786
+ setOpen(false);
6787
+ setSearch("");
6788
+ },
6789
+ className: `w-full text-left px-3 py-1.5 text-sm hover:bg-gray-50 ${!value ? "text-blue-600 font-medium bg-blue-50/50" : "text-gray-600"}`,
6790
+ children: filter.label
6791
+ }
6792
+ ),
6793
+ filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-3 py-3 text-sm text-gray-400 text-center", children: "No matches" }) : filtered.map((o) => /* @__PURE__ */ jsx(
6794
+ "button",
6795
+ {
6796
+ onClick: () => {
6797
+ onChange(o.value);
6798
+ setOpen(false);
6799
+ setSearch("");
6800
+ },
6801
+ className: `w-full text-left px-3 py-1.5 text-sm hover:bg-gray-50 truncate ${value === o.value ? "text-blue-600 font-medium bg-blue-50/50" : "text-gray-700"}`,
6802
+ children: o.label
6803
+ },
6804
+ o.value
6805
+ ))
6806
+ ] })
6807
+ ] })
6808
+ ] });
6809
+ }
6810
+ function useFilters() {
6811
+ const [filterValues, setFilterValues] = useState({});
6812
+ const setFilter = (field, value) => {
6813
+ setFilterValues((prev) => {
6814
+ const next = { ...prev };
6815
+ if (value) next[field] = value;
6816
+ else delete next[field];
6817
+ return next;
6818
+ });
6819
+ };
6820
+ const clearFilters = () => setFilterValues({});
6821
+ const filterParams = {};
6822
+ for (const [k, v] of Object.entries(filterValues)) {
6823
+ if (v) filterParams[k] = v;
6824
+ }
6825
+ return { filterValues, setFilter, clearFilters, filterParams };
6826
+ }
6827
+ function SidebarGroupLabel({ children }) {
6828
+ return /* @__PURE__ */ jsx("p", { className: "px-2.5 pb-1 pt-1 text-[11px] font-semibold uppercase tracking-wide text-gray-400", children });
6829
+ }
6830
+ function SidebarNavItem({ label, count, active, onClick }) {
6831
+ return /* @__PURE__ */ jsxs(
6832
+ "button",
6833
+ {
6834
+ type: "button",
6835
+ onClick,
6836
+ className: `flex w-full items-center justify-between gap-2 rounded-lg px-2.5 py-1.5 text-sm text-left ${active ? "bg-blue-50 font-medium text-blue-700" : "text-gray-700 hover:bg-gray-100"}`,
6837
+ children: [
6838
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: label }),
6839
+ count != null && count > 0 && /* @__PURE__ */ jsx("span", { className: `shrink-0 inline-flex items-center justify-center min-w-[1.25rem] px-1.5 h-5 rounded-full text-[11px] font-medium ${active ? "bg-blue-100 text-blue-700" : "bg-gray-100 text-gray-600"}`, children: count })
6840
+ ]
6841
+ }
6842
+ );
6843
+ }
6659
6844
  function Sparkline({
6660
6845
  data,
6661
6846
  width = 120,
@@ -7376,6 +7561,6 @@ function useEditHotkey(callback) {
7376
7561
  }, [callback, isActive]);
7377
7562
  }
7378
7563
 
7379
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, BehaviorPanel, Button_default as Button, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, Customization, DEV_BANNER_TEXT, DashboardTemplate, DataTablePage, Desktop, DesktopHostProvider, DevIndicator, DonutChart, ENTER, EmailTemplate, EntityList, ErrorPage, FormField, FormLayoutPage, GalleryTemplate, GlobalSearch, HelpCenter, INPUT_BASE, Input_default as Input, Kanban, Label, Layout, ListFooter, MOD, Markdown, NotificationBell, Pagination, Radio_default as Radio, ResizableTable, SHIFT, SearchableSelect, Select_default as Select, ShellEntityFetcherProvider, ShortcutHelp, SoundsPanel, Sparkline, StartMenu, StatCard, StatusBadge, StatusBadgeProvider, SystemPreferences, Tabs, Textarea_default as Textarea, Tooltip, TopNav, WidgetManager, applyDevTitle, createWindowRegistry, formatDate, inputClasses, isDevEnv, isMac, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav };
7564
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, BehaviorPanel, Button_default as Button, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, Customization, DEV_BANNER_TEXT, DashboardTemplate, DataTablePage, Desktop, DesktopHostProvider, DevIndicator, DonutChart, ENTER, EmailTemplate, EmptyState, EntityList, ErrorPage, FilterBar, FormField, FormLayoutPage, GalleryTemplate, GlobalSearch, HelpCenter, INPUT_BASE, Input_default as Input, Kanban, Label, Layout, ListFooter, LoadingSpinner2 as LoadingSpinner, MOD, Markdown, NotificationBell, PageHeader, Pagination, Radio_default as Radio, ResizableTable, SHIFT, SearchableSelect, Select_default as Select, ShellEntityFetcherProvider, ShortcutHelp, SidebarGroupLabel, SidebarNavItem, SoundsPanel, Sparkline, StartMenu, StatCard, StatusBadge, StatusBadgeProvider, SystemPreferences, Tabs, Textarea_default as Textarea, Tooltip, TopNav, WidgetManager, applyDevTitle, createWindowRegistry, formatDate, inputClasses, isDevEnv, isMac, useClickOutside, useColumnConfig, useDesktopHost, useEditHotkey, useFilters, useInfiniteScroll, useNewHotkey, useShellEntityFetcher, useSort, useTableNav };
7380
7565
  //# sourceMappingURL=index.js.map
7381
7566
  //# sourceMappingURL=index.js.map