react-os-shell 4.79.4 → 4.83.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +38 -0
  2. package/dist/{Browser-3Z6IC25F.js → Browser-TGOOIGEP.js} +7 -7
  3. package/dist/{Browser-3Z6IC25F.js.map → Browser-TGOOIGEP.js.map} +1 -1
  4. package/dist/{Calculator-PAPSDNSJ.js → Calculator-2FCNKTPN.js} +6 -6
  5. package/dist/{Calculator-PAPSDNSJ.js.map → Calculator-2FCNKTPN.js.map} +1 -1
  6. package/dist/{CurrencyConverter-VJQI2XVV.js → CurrencyConverter-KZU7MTWE.js} +6 -6
  7. package/dist/{CurrencyConverter-VJQI2XVV.js.map → CurrencyConverter-KZU7MTWE.js.map} +1 -1
  8. package/dist/{Documents-6LSU5BZL.js → Documents-TRV2LWMG.js} +8 -16
  9. package/dist/Documents-TRV2LWMG.js.map +1 -0
  10. package/dist/{Files-6WCC7TQO.js → Files-PFVZJYRV.js} +9 -9
  11. package/dist/{Files-6WCC7TQO.js.map → Files-PFVZJYRV.js.map} +1 -1
  12. package/dist/{Notepad-NOA4XZBK.js → Notepad-UBDMMVLB.js} +7 -7
  13. package/dist/{Notepad-NOA4XZBK.js.map → Notepad-UBDMMVLB.js.map} +1 -1
  14. package/dist/{PomodoroTimer-GFL4L3XS.js → PomodoroTimer-SL372V3I.js} +7 -7
  15. package/dist/{PomodoroTimer-GFL4L3XS.js.map → PomodoroTimer-SL372V3I.js.map} +1 -1
  16. package/dist/{Preview-GEDTZPMG.js → Preview-7QUDHTDN.js} +35 -8
  17. package/dist/Preview-7QUDHTDN.js.map +1 -0
  18. package/dist/{Sidebar-B3LY5T2U.js → Sidebar-GFDPPC4X.js} +24 -6
  19. package/dist/Sidebar-GFDPPC4X.js.map +1 -0
  20. package/dist/{Spreadsheet-664SZSSQ.js → Spreadsheet-F24CHTRL.js} +9 -8
  21. package/dist/Spreadsheet-F24CHTRL.js.map +1 -0
  22. package/dist/{Stock-WZXVQX3G.js → Stock-YDCHLKSV.js} +6 -6
  23. package/dist/{Stock-WZXVQX3G.js.map → Stock-YDCHLKSV.js.map} +1 -1
  24. package/dist/{Weather-FQ7ZVXVR.js → Weather-HM3Y5LMI.js} +6 -6
  25. package/dist/{Weather-FQ7ZVXVR.js.map → Weather-HM3Y5LMI.js.map} +1 -1
  26. package/dist/{WorldClock-XAFQ5ZQF.js → WorldClock-RXKMY3YJ.js} +6 -6
  27. package/dist/{WorldClock-XAFQ5ZQF.js.map → WorldClock-RXKMY3YJ.js.map} +1 -1
  28. package/dist/apps/index.js +19 -19
  29. package/dist/{chunk-DC6BYGZ6.js → chunk-2P6CJAR5.js} +4 -4
  30. package/dist/chunk-2P6CJAR5.js.map +1 -0
  31. package/dist/{chunk-EWDYCO65.js → chunk-35RG2LD2.js} +3 -3
  32. package/dist/{chunk-EWDYCO65.js.map → chunk-35RG2LD2.js.map} +1 -1
  33. package/dist/{chunk-ZO4XGUZQ.js → chunk-3TSIRZUW.js} +3 -3
  34. package/dist/{chunk-ZO4XGUZQ.js.map → chunk-3TSIRZUW.js.map} +1 -1
  35. package/dist/{chunk-BLLINYDD.js → chunk-5TLIIDRZ.js} +186 -5
  36. package/dist/chunk-5TLIIDRZ.js.map +1 -0
  37. package/dist/chunk-6XQHH7D2.js +105 -0
  38. package/dist/chunk-6XQHH7D2.js.map +1 -0
  39. package/dist/{chunk-OQ7GRU7G.js → chunk-7RUYFI6O.js} +3 -3
  40. package/dist/{chunk-OQ7GRU7G.js.map → chunk-7RUYFI6O.js.map} +1 -1
  41. package/dist/{chunk-TT2WNTDS.js → chunk-IZ2FABWU.js} +3 -3
  42. package/dist/{chunk-TT2WNTDS.js.map → chunk-IZ2FABWU.js.map} +1 -1
  43. package/dist/{chunk-YZVJCHXV.js → chunk-LEMEFL6U.js} +300 -194
  44. package/dist/chunk-LEMEFL6U.js.map +1 -0
  45. package/dist/chunk-LZJW4FMH.js +7 -0
  46. package/dist/{chunk-QKVUOX5N.js.map → chunk-LZJW4FMH.js.map} +1 -1
  47. package/dist/chunk-MGGY74RY.js +14 -0
  48. package/dist/chunk-MGGY74RY.js.map +1 -0
  49. package/dist/{chunk-EXSEW5F3.js → chunk-MHUVU7ZX.js} +102 -16
  50. package/dist/chunk-MHUVU7ZX.js.map +1 -0
  51. package/dist/{chunk-QJS6RBH4.js → chunk-XWLEA4B7.js} +3 -3
  52. package/dist/{chunk-QJS6RBH4.js.map → chunk-XWLEA4B7.js.map} +1 -1
  53. package/dist/{chunk-J46YHNHL.js → chunk-Y2F2RTXM.js} +6 -6
  54. package/dist/{chunk-J46YHNHL.js.map → chunk-Y2F2RTXM.js.map} +1 -1
  55. package/dist/{chunk-WNLPTLT6.js → chunk-ZESNO4TZ.js} +2 -2
  56. package/dist/chunk-ZESNO4TZ.js.map +1 -0
  57. package/dist/{index-BjEcKEsJ.d.ts → index-D9ZuIsBe.d.ts} +130 -1
  58. package/dist/index.d.ts +53 -3
  59. package/dist/index.js +157 -55
  60. package/dist/index.js.map +1 -1
  61. package/dist/ui/index.d.ts +1 -1
  62. package/dist/ui/index.js +6 -4
  63. package/package.json +4 -4
  64. package/dist/Documents-6LSU5BZL.js.map +0 -1
  65. package/dist/Preview-GEDTZPMG.js.map +0 -1
  66. package/dist/Sidebar-B3LY5T2U.js.map +0 -1
  67. package/dist/Spreadsheet-664SZSSQ.js.map +0 -1
  68. package/dist/chunk-BLLINYDD.js.map +0 -1
  69. package/dist/chunk-DC6BYGZ6.js.map +0 -1
  70. package/dist/chunk-EXSEW5F3.js.map +0 -1
  71. package/dist/chunk-QKVUOX5N.js +0 -7
  72. package/dist/chunk-WNLPTLT6.js.map +0 -1
  73. package/dist/chunk-YZVJCHXV.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,32 +1,35 @@
1
1
  import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-GO2LCDHS.js';
2
- import { subscribePomo, getPomoSnapshot } from './chunk-TT2WNTDS.js';
3
- export { setShellTodoProvider } from './chunk-TT2WNTDS.js';
2
+ import { subscribePomo, getPomoSnapshot } from './chunk-IZ2FABWU.js';
3
+ export { setShellTodoProvider } from './chunk-IZ2FABWU.js';
4
4
  export { ImageAnnotator_default as ImageAnnotator } from './chunk-AXWC3332.js';
5
- import { publishDesktopFolders, requestFilesTrashView, FolderGlyph, requestFilesDesktopFolderView, FileIconTile } from './chunk-OQ7GRU7G.js';
5
+ import { publishDesktopFolders, requestFilesTrashView, FolderGlyph, requestFilesDesktopFolderView, FileIconTile } from './chunk-7RUYFI6O.js';
6
6
  import './chunk-CT3HVZRZ.js';
7
7
  import { setPdfPreview } from './chunk-3L463T5H.js';
8
- import { CMD_K, CMD_DOT, SHIFT, MOD, ENTER, CMD_A, ALT_SHIFT_N, ALT_SHIFT_E, CMD_ENTER, CMD_S, ALT_SHIFT_D, CMD_Z, CMD_SHIFT_Z, formatDate, useTheme, GlobalSearch, resolveTheme, useClickOutside, ListLoadError, ListFooter, firstEnabledIndex, Button_default, FormField, Input_default, applyThemePrefs, lastEnabledIndex, nextEnabledIndex, matchTypeahead } from './chunk-YZVJCHXV.js';
9
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, Button_default as Button, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Calendar, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DatePicker_default as DatePicker, DateRangePicker, DateTimePicker_default as DateTimePicker, DescriptionList, Divider, DonutChart, Drawer, DropdownMenu, ENTER, EmailTemplate, EmptyState, ErrorBoundary, ErrorPage, FilePicker, FormErrorSummary, FormField, FormLayoutPage, GROUP_COLORS, GalleryTemplate, GlobalSearch, Grid, HelpCenter, INPUT_BASE, INPUT_SIZES, IconButton_default as IconButton, Inline, Input_default as Input, InputNumber_default as InputNumber, Kanban, Label, LineChart, ListFooter, ListLoadError, LoadingSpinner, MAX_FRACTION_DIGITS, MOD, Markdown, MediaUploadField, MediaUploadGrid, MetricBar, MilestoneTimeline, NativeSelect, NumericKeypad, PageHeader, Pagination, Paragraph, Radio_default as Radio, Result, SHIFT, SearchableSelect, Segmented, Select_default as Select, SidebarActionButton, SidebarGroupLabel, SidebarNavItem, Skeleton, Sparkline, Stack, StatCard, Statistic, StatusBadge, StatusBadgeProvider, Stepper, Switch_default as Switch, Tabs, TagInput, Text, Textarea_default as Textarea, TileButton_default as TileButton, TimePicker_default as TimePicker, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, fromKey as fromDateKey, inputClasses, isMac, isSeverityTone, mediaFileName, resolveTheme, severityOf, tabButtonId, tabPanelId, toKey as toDateKey, toISODate, useClickOutside, useTheme } from './chunk-YZVJCHXV.js';
8
+ import { CMD_K, CMD_DOT, SHIFT, MOD, ENTER, CMD_A, ALT_SHIFT_N, ALT_SHIFT_E, CMD_ENTER, CMD_S, ALT_SHIFT_D, CMD_Z, CMD_SHIFT_Z, formatDate, useTheme, GlobalSearch, resolveTheme, useClickOutside, ListLoadError, ListFooter, firstEnabledIndex, FormField, Input_default, applyThemePrefs, lastEnabledIndex, nextEnabledIndex, matchTypeahead } from './chunk-LEMEFL6U.js';
9
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, Accordion, AuthScreen, Avatar, AvatarGroup, Banner, BarChart, BrandAssetEditor, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Calendar, Card, ChatTemplate, Checkbox_default as Checkbox, CheckoutTemplate, ColoredBadge, ContainerFillChart, CountBadge, DashboardTemplate, DataTable, DataTablePage, DatePicker_default as DatePicker, DateRangePicker, DateTimePicker_default as DateTimePicker, DescriptionList, Divider, DonutChart, Drawer, DropdownMenu, ENTER, EmailTemplate, EmptyState, ErrorBoundary, ErrorPage, FilePicker, FormErrorSummary, FormField, FormLayoutPage, GROUP_COLORS, GalleryTemplate, GlobalSearch, Grid, HelpCenter, INPUT_BASE, INPUT_SIZES, IconButton_default as IconButton, Inline, Input_default as Input, InputNumber_default as InputNumber, Kanban, Label, LineChart, ListFooter, ListLoadError, MAX_FRACTION_DIGITS, MOD, Markdown, MediaUploadField, MediaUploadGrid, MetricBar, MilestoneTimeline, NativeSelect, NumericKeypad, PageHeader, Pagination, Paragraph, PortalBrandingProvider, Radio_default as Radio, SHIFT, SearchableSelect, Segmented, Select_default as Select, SidebarActionButton, SidebarGroupLabel, SidebarNavItem, Skeleton, Sparkline, Stack, StatCard, Statistic, StatusBadge, StatusBadgeProvider, Stepper, Switch_default as Switch, Tabs, TagInput, Text, Textarea_default as Textarea, TileButton_default as TileButton, TimePicker_default as TimePicker, Title, Tooltip, TopNav, appendKey, applyThemePrefs, backspace, formatDate, fromKey as fromDateKey, inputClasses, isMac, isSeverityTone, mediaFileName, resolvePortalBrandAsset, resolveTheme, severityOf, tabButtonId, tabPanelId, toKey as toDateKey, toISODate, useClickOutside, usePortalBranding, useTheme } from './chunk-LEMEFL6U.js';
10
10
  export { Breadcrumbs } from './chunk-HNH7FOYB.js';
11
- import { withSpareRow, EditableGrid } from './chunk-DC6BYGZ6.js';
12
- export { EditableGrid } from './chunk-DC6BYGZ6.js';
11
+ import { withSpareRow, EditableGrid } from './chunk-2P6CJAR5.js';
12
+ export { EditableGrid } from './chunk-2P6CJAR5.js';
13
+ import './chunk-MGGY74RY.js';
13
14
  import { SidebarLayout } from './chunk-YG45DAUT.js';
14
15
  export { SidebarLayout } from './chunk-YG45DAUT.js';
15
16
  import { toast_default } from './chunk-2VM2FRZJ.js';
16
17
  export { toast_default as toast } from './chunk-2VM2FRZJ.js';
17
- import { APP_VERSION, VERSION } from './chunk-QKVUOX5N.js';
18
- export { VERSION } from './chunk-QKVUOX5N.js';
18
+ import { APP_VERSION, VERSION } from './chunk-LZJW4FMH.js';
19
+ export { VERSION } from './chunk-LZJW4FMH.js';
19
20
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, setSoundForType, previewSound, setAllSounds, playLogout } from './chunk-D7PYW2QS.js';
20
- import { useAuth } from './chunk-EWDYCO65.js';
21
- export { setShellAuthBridge } from './chunk-EWDYCO65.js';
22
- import { cancelWindowFront, requestWindowFront, useWindowManager, WINDOW_REGISTRY, isPageEntry, Modal, setPerfCollecting, drainPerfEvents, markMenuOpen, SIDEBAR_STRIP_W, forgetMaximizedWindowBoxes, ModalActions, useModalActive, client_default, LoadingSpinner, isShellApiClientConfigured, useUndo, useEnclosingModalId, CancelButton, setWindowPosition } from './chunk-EXSEW5F3.js';
23
- export { CancelButton, CopyButton, DocFavStar, MODAL_SUBMIT_SELECTOR, Modal, ModalActions, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useEnclosingModalId, useIsActiveWindow, useModalActive, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-EXSEW5F3.js';
24
- import { useShellStrings, useShellPrefs, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, useIsMobile } from './chunk-BLLINYDD.js';
25
- export { DEFAULT_SHELL_STRINGS, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, ShellPrefsProvider, ShellStringsProvider, useIsMobile, useLocalStoragePrefs, useShellPrefs, useShellStrings } from './chunk-BLLINYDD.js';
21
+ import { useAuth } from './chunk-35RG2LD2.js';
22
+ export { setShellAuthBridge } from './chunk-35RG2LD2.js';
23
+ import { BrandMark } from './chunk-6XQHH7D2.js';
24
+ export { BrandMark, resolveBrandMarkTreatment } from './chunk-6XQHH7D2.js';
25
+ 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-MHUVU7ZX.js';
26
+ export { CancelButton, CopyButton, DocFavStar, EntityWindowFallback, EntityWindowLoading, EntityWindowState, MODAL_SUBMIT_SELECTOR, Modal, ModalActions, UndoProvider, WindowCrashedFallback, WindowErrorBoundary, WindowManagerProvider, WindowTitle, beginWindowGesture, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, getWindowPosition, isEntityEntry, isPageEntry, markMenuOpen, requestWindowFront, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, setWindowPosition, subscribeExposeHighlight, toggleExposeMode, useEnclosingModalId, useIsActiveWindow, useModalActive, useUndo, useUndoable, useUndoableState, useWidgetSettings, useWindowDirty, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-MHUVU7ZX.js';
27
+ import { useShellStrings, useShellPrefs, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, useIsMobile, Button_default } from './chunk-5TLIIDRZ.js';
28
+ export { Button_default as Button, DEFAULT_SHELL_STRINGS, LoadingSpinner, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, Result, ShellPrefsProvider, ShellStringsProvider, useIsMobile, useLocalStoragePrefs, useShellPrefs, useShellStrings } from './chunk-5TLIIDRZ.js';
26
29
  import { registerModalEscapeInterceptor } from './chunk-CDR2Q64Q.js';
27
30
  export { ConfirmProvider, Dialog, confirm, confirmDestructive, prompt, registerModalEscapeInterceptor, useConfirm, useFocusTrap, useScrollLock } from './chunk-CDR2Q64Q.js';
28
- import { startMenuCategories, navVisible, navSections, isSection, navIcons, isReachable, sectionIcons, useShellAuth, visibleChildren } from './chunk-WNLPTLT6.js';
29
- export { ShellAuthProvider, setShellNavIcons, useShellAuth } from './chunk-WNLPTLT6.js';
31
+ import { startMenuCategories, navVisible, navSections, isSection, navIcons, isReachable, sectionIcons, useShellAuth, visibleChildren } from './chunk-ZESNO4TZ.js';
32
+ export { ShellAuthProvider, setShellNavIcons, useShellAuth } from './chunk-ZESNO4TZ.js';
30
33
  import { GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
31
34
  export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
32
35
  import { createContext, lazy, useSyncExternalStore, useState, useEffect, useRef, useCallback, useLayoutEffect, useMemo, useContext, isValidElement, cloneElement, Suspense, useId } from 'react';
@@ -2502,7 +2505,7 @@ function Desktop({ profile }) {
2502
2505
  }
2503
2506
  );
2504
2507
  }
2505
- function StartupAnimation({ onComplete, ready = false, productName = "react-os-shell", subtitle, logo = "/favicon.svg" }) {
2508
+ function StartupAnimation({ onComplete, ready = false, productName = "react-os-shell", subtitle, logo = "/favicon.svg", adaptiveLogo = false, logoHasAlpha = null, logoIsLight = null }) {
2506
2509
  const [phase, setPhase] = useState("logo");
2507
2510
  const [minTimePassed, setMinTimePassed] = useState(false);
2508
2511
  const onCompleteRef = useRef(onComplete);
@@ -2546,11 +2549,18 @@ function StartupAnimation({ onComplete, ready = false, productName = "react-os-s
2546
2549
  }
2547
2550
  ) }),
2548
2551
  /* @__PURE__ */ jsx("div", { className: `relative transition-all duration-700 ease-out ${phase === "logo" ? "scale-75 opacity-0" : "scale-100 opacity-100"}`, children: /* @__PURE__ */ jsx(
2549
- "img",
2552
+ BrandMark,
2550
2553
  {
2551
2554
  src: logo,
2552
2555
  alt: "",
2553
- className: "h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]",
2556
+ slot: "compact",
2557
+ surface: "dark",
2558
+ size: 80,
2559
+ adaptive: adaptiveLogo,
2560
+ hasAlpha: logoHasAlpha,
2561
+ isLight: logoIsLight,
2562
+ decorative: true,
2563
+ className: "drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]",
2554
2564
  style: { animation: "spin-in 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards" }
2555
2565
  }
2556
2566
  ) }),
@@ -2596,7 +2606,7 @@ function StartupAnimation({ onComplete, ready = false, productName = "react-os-s
2596
2606
  }
2597
2607
  );
2598
2608
  }
2599
- function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg" }) {
2609
+ function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg", adaptiveLogo = false, logoHasAlpha = null, logoIsLight = null }) {
2600
2610
  const [phase, setPhase] = useState("show");
2601
2611
  const strings = useShellStrings();
2602
2612
  useEffect(() => {
@@ -2632,7 +2642,21 @@ function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg" }) {
2632
2642
  {
2633
2643
  className: `relative transition-all duration-1000 ease-in ${phase === "out" ? "scale-0 opacity-0" : "scale-100 opacity-100"}`,
2634
2644
  style: phase === "out" ? { transform: "scale(0) rotate(180deg)" } : void 0,
2635
- children: /* @__PURE__ */ jsx("img", { src: logo, alt: "", className: "h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]" })
2645
+ children: /* @__PURE__ */ jsx(
2646
+ BrandMark,
2647
+ {
2648
+ src: logo,
2649
+ alt: "",
2650
+ slot: "compact",
2651
+ surface: "dark",
2652
+ size: 80,
2653
+ adaptive: adaptiveLogo,
2654
+ hasAlpha: logoHasAlpha,
2655
+ isLight: logoIsLight,
2656
+ decorative: true,
2657
+ className: "drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]"
2658
+ }
2659
+ )
2636
2660
  }
2637
2661
  ),
2638
2662
  /* @__PURE__ */ jsxs("div", { className: `mt-6 text-center transition-all duration-700 ${phase === "show" ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"}`, children: [
@@ -2736,6 +2760,23 @@ function menuPanelLeft(ownerLeft, ownerRight, width, viewportW, gap, preferLeft
2736
2760
  }
2737
2761
  var PANEL_GAP = 4;
2738
2762
  var CLOSE_DELAY = 200;
2763
+ var visibleMenuLabel = (entry) => entry.menuLabel ?? entry.label;
2764
+ var isAbbreviated = (entry) => Boolean(entry.menuLabel && entry.menuLabel !== entry.label);
2765
+ var menuAriaLabel = (entry) => isAbbreviated(entry) ? `${entry.menuLabel}, ${entry.label}` : void 0;
2766
+ function MenuLabel({ entry, className }) {
2767
+ const abbreviated = isAbbreviated(entry);
2768
+ const [titled, setTitled] = useState(abbreviated);
2769
+ return /* @__PURE__ */ jsx(
2770
+ "span",
2771
+ {
2772
+ className,
2773
+ title: titled ? entry.label : void 0,
2774
+ "data-menu-label": true,
2775
+ onMouseEnter: (e) => setTitled(abbreviated || e.currentTarget.scrollWidth > e.currentTarget.clientWidth),
2776
+ children: visibleMenuLabel(entry)
2777
+ }
2778
+ );
2779
+ }
2739
2780
  function MenuPanel({ left, anchorY, estHeight, minTop, maxBottom, flipped, className, style, onMouseEnter, onMouseLeave, children }) {
2740
2781
  const ref = useRef(null);
2741
2782
  useLayoutEffect(() => {
@@ -2866,17 +2907,18 @@ function StartMenu({
2866
2907
  )
2867
2908
  ] })
2868
2909
  ] }),
2869
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere", children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400 text-center py-12", children: "No matching apps" }) : filtered.map(({ item, sectionLabel }, i) => {
2910
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden", children: filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-400 text-center py-12", children: "No matching apps" }) : filtered.map(({ item, sectionLabel }, i) => {
2870
2911
  const icon = navIcons2[item.to];
2871
2912
  return /* @__PURE__ */ jsxs(
2872
2913
  "button",
2873
2914
  {
2874
2915
  onClick: () => handleClick(item.to),
2916
+ "aria-label": menuAriaLabel(item),
2875
2917
  className: "w-full flex items-center gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left",
2876
2918
  children: [
2877
2919
  /* @__PURE__ */ jsx("span", { className: "h-8 w-8 rounded-lg bg-gray-100 flex items-center justify-center text-gray-600 shrink-0", children: icon && isValidElement(icon) ? cloneElement(icon, { className: "h-5 w-5" }) : null }),
2878
2920
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
2879
- /* @__PURE__ */ jsx("div", { className: "text-sm font-medium text-gray-900 truncate", children: item.label }),
2921
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: "block truncate text-sm font-medium text-gray-900" }),
2880
2922
  sectionLabel && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-gray-500 truncate", children: sectionLabel })
2881
2923
  ] })
2882
2924
  ]
@@ -2921,12 +2963,12 @@ function StartMenu({
2921
2963
  const posStyle = taskbarPosition === "top" ? { top: taskbarH + taskbarGap, left: 8 } : taskbarPosition === "left" ? { top: 8, left: taskbarW + taskbarGap } : taskbarPosition === "right" ? { top: 8, right: taskbarW + taskbarGap } : { bottom: taskbarH + taskbarGap, left: 8 };
2922
2964
  const iconEl = (path) => {
2923
2965
  const icon = navIcons2[path];
2924
- if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4" });
2966
+ if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4 shrink-0" });
2925
2967
  return null;
2926
2968
  };
2927
2969
  const secIcon = (label) => {
2928
2970
  const icon = sectionIcons2[label];
2929
- if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4" });
2971
+ if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4 shrink-0" });
2930
2972
  return null;
2931
2973
  };
2932
2974
  const hoveredSection = openPath.length > 0 ? openPath[0].key : null;
@@ -2942,7 +2984,8 @@ function StartMenu({
2942
2984
  };
2943
2985
  const sizeConfig = sizeConfigByDensity[density][size];
2944
2986
  const menuGlass = glassStyle();
2945
- const itemCls = `w-full flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;
2987
+ const itemCls = `w-full min-w-0 overflow-hidden whitespace-nowrap flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;
2988
+ const itemLabelCls = "min-w-0 flex-1 truncate text-left";
2946
2989
  const viewportH = typeof window !== "undefined" ? window.innerHeight : 800;
2947
2990
  const viewportW = typeof window !== "undefined" ? window.innerWidth : 1280;
2948
2991
  const minTop = (taskbarPosition === "top" ? taskbarH : 0) + 8;
@@ -2969,29 +3012,43 @@ function StartMenu({
2969
3012
  cancelClose();
2970
3013
  closeTimer.current = setTimeout(() => setOpenPath((prev) => closeMenuBelow(prev, depth)), CLOSE_DELAY);
2971
3014
  };
2972
- const chevron = /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5 ml-auto text-gray-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 4.5l7.5 7.5-7.5 7.5" }) });
3015
+ const chevron = /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5 shrink-0 ml-auto text-gray-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 4.5l7.5 7.5-7.5 7.5" }) });
2973
3016
  const renderSection = (section, isErp) => {
2974
3017
  if (!navVisible(section, hasAnyPerm)) return null;
2975
3018
  const items = getVisibleItems(section);
2976
3019
  if (items.length === 0) return null;
2977
3020
  const isHovered = hoveredSection === section.label;
2978
3021
  return /* @__PURE__ */ jsxs("div", { onMouseEnter: (e) => openSubmenu(0, section.label, e), children: [
2979
- /* @__PURE__ */ jsxs("button", { className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`, children: [
2980
- secIcon(section.label),
2981
- /* @__PURE__ */ jsx("span", { className: isErp ? "font-medium" : "", children: section.label }),
2982
- chevron
2983
- ] }),
3022
+ /* @__PURE__ */ jsxs(
3023
+ "button",
3024
+ {
3025
+ "aria-label": menuAriaLabel(section),
3026
+ className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3027
+ children: [
3028
+ secIcon(section.label),
3029
+ /* @__PURE__ */ jsx(MenuLabel, { entry: section, className: `${itemLabelCls} ${isErp ? "font-medium" : ""}` }),
3030
+ chevron
3031
+ ]
3032
+ }
3033
+ ),
2984
3034
  section.dividerAfter && /* @__PURE__ */ jsx("div", { className: "border-t border-white/20 my-1.5 mx-2" })
2985
3035
  ] }, section.label);
2986
3036
  };
2987
3037
  const renderVirtualSection = (v) => {
2988
3038
  if (v.items.length === 0) return null;
2989
3039
  const isHovered = hoveredSection === v.label;
2990
- return /* @__PURE__ */ jsx("div", { onMouseEnter: (e) => openSubmenu(0, v.label, e), children: /* @__PURE__ */ jsxs("button", { className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`, children: [
2991
- v.icon,
2992
- /* @__PURE__ */ jsx("span", { children: v.label }),
2993
- chevron
2994
- ] }) }, v.label);
3040
+ return /* @__PURE__ */ jsx("div", { onMouseEnter: (e) => openSubmenu(0, v.label, e), children: /* @__PURE__ */ jsxs(
3041
+ "button",
3042
+ {
3043
+ "aria-label": menuAriaLabel(v),
3044
+ className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3045
+ children: [
3046
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", children: v.icon }),
3047
+ /* @__PURE__ */ jsx(MenuLabel, { entry: v, className: itemLabelCls }),
3048
+ chevron
3049
+ ]
3050
+ }
3051
+ ) }, v.label);
2995
3052
  };
2996
3053
  return (
2997
3054
  /* z-[1100]: sit above the entire window stack — normal windows climb to
@@ -3049,30 +3106,32 @@ function StartMenu({
3049
3106
  ] })
3050
3107
  }
3051
3108
  ),
3052
- search.length >= 2 ? /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere px-1 pb-2 max-h-[400px]", children: searchResults.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 text-center py-4", children: "No results" }) : searchResults.map((r, i) => /* @__PURE__ */ jsxs(
3109
+ search.length >= 2 ? /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto overflow-x-hidden px-1 pb-2 max-h-[400px]", children: searchResults.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400 text-center py-4", children: "No results" }) : searchResults.map((r, i) => /* @__PURE__ */ jsxs(
3053
3110
  "button",
3054
3111
  {
3055
3112
  onClick: () => handleClick(r.to),
3056
3113
  onMouseEnter: () => setSearchIdx(i),
3114
+ "aria-label": menuAriaLabel(r),
3057
3115
  className: `${itemCls} transition-colors ${i === searchIdx ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3058
3116
  children: [
3059
3117
  iconEl(r.to),
3060
- /* @__PURE__ */ jsx("span", { children: r.label }),
3061
- r.section && /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-400 ml-auto", children: r.section })
3118
+ /* @__PURE__ */ jsx(MenuLabel, { entry: r, className: itemLabelCls }),
3119
+ r.section && /* @__PURE__ */ jsx("span", { className: "max-w-[40%] shrink-0 truncate text-[10px] text-gray-400 ml-auto", children: r.section })
3062
3120
  ]
3063
3121
  },
3064
3122
  i
3065
- )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere px-1 pb-1 flex flex-col", children: [
3123
+ )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto overflow-x-hidden px-1 pb-1 flex flex-col", children: [
3066
3124
  isVertical && /* @__PURE__ */ jsxs(Fragment, { children: [
3067
3125
  footerItems.map((item) => /* @__PURE__ */ jsxs(
3068
3126
  "button",
3069
3127
  {
3070
3128
  onClick: () => handleClick(item.to),
3071
3129
  onMouseEnter: () => scheduleClose(0),
3130
+ "aria-label": menuAriaLabel(item),
3072
3131
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3073
3132
  children: [
3074
3133
  iconEl(item.to),
3075
- /* @__PURE__ */ jsx("span", { children: item.label })
3134
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3076
3135
  ]
3077
3136
  },
3078
3137
  item.to
@@ -3086,10 +3145,11 @@ function StartMenu({
3086
3145
  "button",
3087
3146
  {
3088
3147
  onClick: () => handleClick(item.to),
3148
+ "aria-label": menuAriaLabel(item),
3089
3149
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3090
3150
  children: [
3091
3151
  iconEl(item.to),
3092
- /* @__PURE__ */ jsx("span", { children: item.label })
3152
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3093
3153
  ]
3094
3154
  }
3095
3155
  ),
@@ -3104,10 +3164,11 @@ function StartMenu({
3104
3164
  "button",
3105
3165
  {
3106
3166
  onClick: () => handleClick(item.to),
3167
+ "aria-label": menuAriaLabel(item),
3107
3168
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3108
3169
  children: [
3109
3170
  iconEl(item.to),
3110
- /* @__PURE__ */ jsx("span", { children: item.label })
3171
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3111
3172
  ]
3112
3173
  }
3113
3174
  ),
@@ -3124,10 +3185,11 @@ function StartMenu({
3124
3185
  {
3125
3186
  onClick: () => handleClick(item.to),
3126
3187
  onMouseEnter: () => scheduleClose(0),
3188
+ "aria-label": menuAriaLabel(item),
3127
3189
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3128
3190
  children: [
3129
3191
  iconEl(item.to),
3130
- /* @__PURE__ */ jsx("span", { children: item.label })
3192
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3131
3193
  ]
3132
3194
  },
3133
3195
  item.to
@@ -3174,7 +3236,7 @@ function StartMenu({
3174
3236
  style: menuGlass,
3175
3237
  onMouseEnter: () => scheduleClose(i + 1),
3176
3238
  onMouseLeave: () => scheduleClose(i),
3177
- children: /* @__PURE__ */ jsx("div", { className: "py-1 px-1 overflow-y-auto overflow-x-hidden wrap-anywhere overscroll-contain", style: { maxHeight: availH }, children: items.map((item) => {
3239
+ children: /* @__PURE__ */ jsx("div", { className: "py-1 px-1 overflow-y-auto overflow-x-hidden overscroll-contain", style: { maxHeight: availH }, children: items.map((item) => {
3178
3240
  const kids = submenuItems(item);
3179
3241
  const isOpen = openPath[i + 1]?.key === item.to;
3180
3242
  return /* @__PURE__ */ jsxs(
@@ -3186,10 +3248,11 @@ function StartMenu({
3186
3248
  "button",
3187
3249
  {
3188
3250
  onClick: kids.length > 0 ? (e) => openSubmenu(i + 1, item.to, e) : () => handleClick(item.to),
3251
+ "aria-label": menuAriaLabel(item),
3189
3252
  className: `${itemCls} transition-colors ${isOpen ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3190
3253
  children: [
3191
3254
  iconEl(item.to),
3192
- /* @__PURE__ */ jsx("span", { children: item.label }),
3255
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls }),
3193
3256
  kids.length > 0 && chevron
3194
3257
  ]
3195
3258
  }
@@ -3215,6 +3278,9 @@ function StartMenu({
3215
3278
  function MobileAppLanding({
3216
3279
  productName,
3217
3280
  productIcon,
3281
+ adaptiveLogo = false,
3282
+ logoHasAlpha = null,
3283
+ logoIsLight = null,
3218
3284
  config,
3219
3285
  wallpaperStyle
3220
3286
  }) {
@@ -3233,7 +3299,20 @@ function MobileAppLanding({
3233
3299
  className: "w-full max-w-sm rounded-3xl p-8 flex flex-col items-center text-center",
3234
3300
  style: glassStyle(),
3235
3301
  children: [
3236
- /* @__PURE__ */ jsx("div", { className: "h-20 w-20 rounded-2xl overflow-hidden bg-white/60 flex items-center justify-center shadow-sm mb-5", children: /* @__PURE__ */ jsx("img", { src: productIcon, alt: "", className: "h-full w-full object-contain p-3" }) }),
3302
+ /* @__PURE__ */ jsx("div", { className: "h-20 w-20 rounded-2xl overflow-hidden bg-white/60 flex items-center justify-center shadow-sm mb-5", children: /* @__PURE__ */ jsx(
3303
+ BrandMark,
3304
+ {
3305
+ src: productIcon,
3306
+ alt: "",
3307
+ slot: "compact",
3308
+ surface: "light",
3309
+ size: 56,
3310
+ adaptive: adaptiveLogo,
3311
+ hasAlpha: logoHasAlpha,
3312
+ isLight: logoIsLight,
3313
+ decorative: true
3314
+ }
3315
+ ) }),
3237
3316
  /* @__PURE__ */ jsx("h1", { className: "text-xl font-semibold text-gray-900 leading-snug", children: heading }),
3238
3317
  /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600 leading-relaxed", children: description }),
3239
3318
  hasLink && /* @__PURE__ */ jsxs(
@@ -3254,7 +3333,7 @@ function MobileAppLanding({
3254
3333
  }
3255
3334
  );
3256
3335
  }
3257
- var Sidebar = lazy(() => import('./Sidebar-B3LY5T2U.js'));
3336
+ var Sidebar = lazy(() => import('./Sidebar-GFDPPC4X.js'));
3258
3337
  function useFavorites(wallpapers) {
3259
3338
  const { prefs, save } = useShellPrefs();
3260
3339
  const favorites = prefs.favorite_pages || [];
@@ -3541,6 +3620,9 @@ function Layout({
3541
3620
  const brandName = branding?.productName ?? productName;
3542
3621
  const brandIcon = branding?.logo ?? productIcon;
3543
3622
  const brandTagline = branding?.tagline;
3623
+ const brandAdaptive = branding?.adaptiveLogo ?? false;
3624
+ const brandHasAlpha = branding?.logoHasAlpha ?? null;
3625
+ const brandIsLight = branding?.logoIsLight ?? null;
3544
3626
  const host = useDesktopHost();
3545
3627
  const { user, logout, hasAnyPerm } = useAuth();
3546
3628
  const { openPage, openEntity, openWindows } = useWindowManager();
@@ -3695,11 +3777,11 @@ function Layout({
3695
3777
  }, [toggleFullscreen]);
3696
3778
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-screen", children: [
3697
3779
  /* @__PURE__ */ jsx(SessionWindowRestore, {}),
3698
- showStartup && /* @__PURE__ */ jsx(StartupAnimation, { onComplete: () => setShowStartup(false), ready: !!profile, productName: brandName, logo: brandIcon, subtitle: brandTagline }),
3780
+ showStartup && /* @__PURE__ */ jsx(StartupAnimation, { onComplete: () => setShowStartup(false), ready: !!profile, productName: brandName, logo: brandIcon, subtitle: brandTagline, adaptiveLogo: brandAdaptive, logoHasAlpha: brandHasAlpha, logoIsLight: brandIsLight }),
3699
3781
  showLogout && /* @__PURE__ */ jsx(LogoutAnimation, { onComplete: () => {
3700
3782
  sessionStorage.removeItem("erp_startup_shown");
3701
3783
  logout();
3702
- }, logo: brandIcon, subtitle: brandTagline }),
3784
+ }, logo: brandIcon, subtitle: brandTagline, adaptiveLogo: brandAdaptive, logoHasAlpha: brandHasAlpha, logoIsLight: brandIsLight }),
3703
3785
  !sidebarMode && /* @__PURE__ */ jsx(
3704
3786
  StartMenu,
3705
3787
  {
@@ -3742,7 +3824,10 @@ function Layout({
3742
3824
  sectionIcons: sectionIcons2,
3743
3825
  categories,
3744
3826
  productName: brandName,
3745
- productIcon: brandIcon
3827
+ productIcon: brandIcon,
3828
+ adaptiveLogo: brandAdaptive,
3829
+ logoHasAlpha: brandHasAlpha,
3830
+ logoIsLight: brandIsLight
3746
3831
  }
3747
3832
  ) }),
3748
3833
  (() => {
@@ -3765,6 +3850,9 @@ function Layout({
3765
3850
  {
3766
3851
  productName: brandName,
3767
3852
  productIcon: brandIcon,
3853
+ adaptiveLogo: brandAdaptive,
3854
+ logoHasAlpha: brandHasAlpha,
3855
+ logoIsLight: brandIsLight,
3768
3856
  config: mobileApp,
3769
3857
  wallpaperStyle
3770
3858
  }
@@ -3850,7 +3938,21 @@ function Layout({
3850
3938
  style: { background: "radial-gradient(circle 60px at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,0.25) 0%, transparent 100%)" }
3851
3939
  }
3852
3940
  ),
3853
- brandIcon && /* @__PURE__ */ jsx("img", { src: brandIcon, alt: "", className: "relative z-10 h-3.5 w-3.5 shrink-0 opacity-60" }),
3941
+ brandIcon && /* @__PURE__ */ jsx(
3942
+ BrandMark,
3943
+ {
3944
+ src: brandIcon,
3945
+ alt: "",
3946
+ slot: "compact",
3947
+ surface: "light",
3948
+ adaptive: brandAdaptive,
3949
+ hasAlpha: brandHasAlpha,
3950
+ isLight: brandIsLight,
3951
+ size: 14,
3952
+ decorative: true,
3953
+ className: "relative z-10 opacity-60"
3954
+ }
3955
+ ),
3854
3956
  /* @__PURE__ */ jsx("span", { className: "relative z-10 truncate", children: brandName })
3855
3957
  ]
3856
3958
  }
@@ -3916,7 +4018,7 @@ function Layout({
3916
4018
  GlobalSearch,
3917
4019
  {
3918
4020
  ...search,
3919
- onSelect: (result) => openEntity(result.entity_type, result.entity_id, null, result.label)
4021
+ onSelect: (result) => openEntity(result.entity_type, result.entity_id, void 0, result.label)
3920
4022
  }
3921
4023
  ),
3922
4024
  /* @__PURE__ */ jsx(ShortcutHelp, {})