react-os-shell 4.79.3 → 4.82.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 (68) hide show
  1. package/README.md +18 -0
  2. package/dist/{Browser-2DFSZ3RP.js → Browser-5FNVWP3Q.js} +7 -7
  3. package/dist/{Browser-2DFSZ3RP.js.map → Browser-5FNVWP3Q.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-GIP67CHC.js → Documents-ZTK6SSDK.js} +7 -7
  9. package/dist/{Documents-GIP67CHC.js.map → Documents-ZTK6SSDK.js.map} +1 -1
  10. package/dist/{Files-JAE2LL65.js → Files-4PNE3MBV.js} +12 -12
  11. package/dist/{Files-JAE2LL65.js.map → Files-4PNE3MBV.js.map} +1 -1
  12. package/dist/{Notepad-SXHXJ6PC.js → Notepad-63JJ2WB5.js} +7 -7
  13. package/dist/{Notepad-SXHXJ6PC.js.map → Notepad-63JJ2WB5.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-5HFE6MCG.js → Preview-QZL2BXLP.js} +9 -9
  17. package/dist/Preview-QZL2BXLP.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-KZLORYAA.js → Spreadsheet-RCKDHL66.js} +8 -8
  21. package/dist/{Spreadsheet-KZLORYAA.js.map → Spreadsheet-RCKDHL66.js.map} +1 -1
  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-GO2LCDHS.js → chunk-26S2Q6GA.js} +3 -3
  30. package/dist/{chunk-GO2LCDHS.js.map → chunk-26S2Q6GA.js.map} +1 -1
  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-A42MTWLI.js → chunk-F54RMKRL.js} +5 -5
  42. package/dist/{chunk-A42MTWLI.js.map → chunk-F54RMKRL.js.map} +1 -1
  43. package/dist/{chunk-TT2WNTDS.js → chunk-IZ2FABWU.js} +3 -3
  44. package/dist/{chunk-TT2WNTDS.js.map → chunk-IZ2FABWU.js.map} +1 -1
  45. package/dist/chunk-KLSUJ46L.js +7 -0
  46. package/dist/{chunk-M2IJT4OA.js.map → chunk-KLSUJ46L.js.map} +1 -1
  47. package/dist/{chunk-YZVJCHXV.js → chunk-LEMEFL6U.js} +300 -194
  48. package/dist/chunk-LEMEFL6U.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-WNLPTLT6.js → chunk-ZESNO4TZ.js} +2 -2
  54. package/dist/chunk-ZESNO4TZ.js.map +1 -0
  55. package/dist/{index-BjEcKEsJ.d.ts → index-D9ZuIsBe.d.ts} +130 -1
  56. package/dist/index.d.ts +53 -3
  57. package/dist/index.js +157 -56
  58. package/dist/index.js.map +1 -1
  59. package/dist/ui/index.d.ts +1 -1
  60. package/dist/ui/index.js +4 -3
  61. package/package.json +1 -1
  62. package/dist/Preview-5HFE6MCG.js.map +0 -1
  63. package/dist/Sidebar-B3LY5T2U.js.map +0 -1
  64. package/dist/chunk-BLLINYDD.js.map +0 -1
  65. package/dist/chunk-EXSEW5F3.js.map +0 -1
  66. package/dist/chunk-M2IJT4OA.js +0 -7
  67. package/dist/chunk-WNLPTLT6.js.map +0 -1
  68. package/dist/chunk-YZVJCHXV.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,12 +1,9 @@
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';
1
+ import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-26S2Q6GA.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';
6
- import './chunk-CT3HVZRZ.js';
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';
5
+ 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';
6
+ 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
7
  export { Breadcrumbs } from './chunk-HNH7FOYB.js';
11
8
  import { withSpareRow, EditableGrid } from './chunk-DC6BYGZ6.js';
12
9
  export { EditableGrid } from './chunk-DC6BYGZ6.js';
@@ -14,19 +11,24 @@ import { SidebarLayout } from './chunk-YG45DAUT.js';
14
11
  export { SidebarLayout } from './chunk-YG45DAUT.js';
15
12
  import { toast_default } from './chunk-2VM2FRZJ.js';
16
13
  export { toast_default as toast } from './chunk-2VM2FRZJ.js';
17
- import { APP_VERSION, VERSION } from './chunk-M2IJT4OA.js';
18
- export { VERSION } from './chunk-M2IJT4OA.js';
14
+ import { publishDesktopFolders, requestFilesTrashView, FolderGlyph, requestFilesDesktopFolderView, FileIconTile } from './chunk-7RUYFI6O.js';
15
+ import './chunk-CT3HVZRZ.js';
16
+ import { setPdfPreview } from './chunk-3L463T5H.js';
17
+ import { APP_VERSION, VERSION } from './chunk-KLSUJ46L.js';
18
+ export { VERSION } from './chunk-KLSUJ46L.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
- 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';
20
+ import { useAuth } from './chunk-35RG2LD2.js';
21
+ export { setShellAuthBridge } from './chunk-35RG2LD2.js';
22
+ import { BrandMark } from './chunk-6XQHH7D2.js';
23
+ export { BrandMark, resolveBrandMarkTreatment } from './chunk-6XQHH7D2.js';
24
+ 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';
25
+ 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';
26
+ import { useShellStrings, useShellPrefs, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, useIsMobile, Button_default } from './chunk-5TLIIDRZ.js';
27
+ 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
28
  import { registerModalEscapeInterceptor } from './chunk-CDR2Q64Q.js';
27
29
  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';
30
+ import { startMenuCategories, navVisible, navSections, isSection, navIcons, isReachable, sectionIcons, useShellAuth, visibleChildren } from './chunk-ZESNO4TZ.js';
31
+ export { ShellAuthProvider, setShellNavIcons, useShellAuth } from './chunk-ZESNO4TZ.js';
30
32
  import { GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
31
33
  export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle } from './chunk-3CUSBZWG.js';
32
34
  import { createContext, lazy, useSyncExternalStore, useState, useEffect, useRef, useCallback, useLayoutEffect, useMemo, useContext, isValidElement, cloneElement, Suspense, useId } from 'react';
@@ -2502,7 +2504,7 @@ function Desktop({ profile }) {
2502
2504
  }
2503
2505
  );
2504
2506
  }
2505
- function StartupAnimation({ onComplete, ready = false, productName = "react-os-shell", subtitle, logo = "/favicon.svg" }) {
2507
+ function StartupAnimation({ onComplete, ready = false, productName = "react-os-shell", subtitle, logo = "/favicon.svg", adaptiveLogo = false, logoHasAlpha = null, logoIsLight = null }) {
2506
2508
  const [phase, setPhase] = useState("logo");
2507
2509
  const [minTimePassed, setMinTimePassed] = useState(false);
2508
2510
  const onCompleteRef = useRef(onComplete);
@@ -2546,11 +2548,18 @@ function StartupAnimation({ onComplete, ready = false, productName = "react-os-s
2546
2548
  }
2547
2549
  ) }),
2548
2550
  /* @__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",
2551
+ BrandMark,
2550
2552
  {
2551
2553
  src: logo,
2552
2554
  alt: "",
2553
- className: "h-20 w-20 drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]",
2555
+ slot: "compact",
2556
+ surface: "dark",
2557
+ size: 80,
2558
+ adaptive: adaptiveLogo,
2559
+ hasAlpha: logoHasAlpha,
2560
+ isLight: logoIsLight,
2561
+ decorative: true,
2562
+ className: "drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]",
2554
2563
  style: { animation: "spin-in 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards" }
2555
2564
  }
2556
2565
  ) }),
@@ -2596,7 +2605,7 @@ function StartupAnimation({ onComplete, ready = false, productName = "react-os-s
2596
2605
  }
2597
2606
  );
2598
2607
  }
2599
- function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg" }) {
2608
+ function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg", adaptiveLogo = false, logoHasAlpha = null, logoIsLight = null }) {
2600
2609
  const [phase, setPhase] = useState("show");
2601
2610
  const strings = useShellStrings();
2602
2611
  useEffect(() => {
@@ -2632,7 +2641,21 @@ function LogoutAnimation({ onComplete, subtitle, logo = "/favicon.svg" }) {
2632
2641
  {
2633
2642
  className: `relative transition-all duration-1000 ease-in ${phase === "out" ? "scale-0 opacity-0" : "scale-100 opacity-100"}`,
2634
2643
  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)]" })
2644
+ children: /* @__PURE__ */ jsx(
2645
+ BrandMark,
2646
+ {
2647
+ src: logo,
2648
+ alt: "",
2649
+ slot: "compact",
2650
+ surface: "dark",
2651
+ size: 80,
2652
+ adaptive: adaptiveLogo,
2653
+ hasAlpha: logoHasAlpha,
2654
+ isLight: logoIsLight,
2655
+ decorative: true,
2656
+ className: "drop-shadow-[0_0_30px_rgba(124,58,237,0.5)]"
2657
+ }
2658
+ )
2636
2659
  }
2637
2660
  ),
2638
2661
  /* @__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 +2759,23 @@ function menuPanelLeft(ownerLeft, ownerRight, width, viewportW, gap, preferLeft
2736
2759
  }
2737
2760
  var PANEL_GAP = 4;
2738
2761
  var CLOSE_DELAY = 200;
2762
+ var visibleMenuLabel = (entry) => entry.menuLabel ?? entry.label;
2763
+ var isAbbreviated = (entry) => Boolean(entry.menuLabel && entry.menuLabel !== entry.label);
2764
+ var menuAriaLabel = (entry) => isAbbreviated(entry) ? `${entry.menuLabel}, ${entry.label}` : void 0;
2765
+ function MenuLabel({ entry, className }) {
2766
+ const abbreviated = isAbbreviated(entry);
2767
+ const [titled, setTitled] = useState(abbreviated);
2768
+ return /* @__PURE__ */ jsx(
2769
+ "span",
2770
+ {
2771
+ className,
2772
+ title: titled ? entry.label : void 0,
2773
+ "data-menu-label": true,
2774
+ onMouseEnter: (e) => setTitled(abbreviated || e.currentTarget.scrollWidth > e.currentTarget.clientWidth),
2775
+ children: visibleMenuLabel(entry)
2776
+ }
2777
+ );
2778
+ }
2739
2779
  function MenuPanel({ left, anchorY, estHeight, minTop, maxBottom, flipped, className, style, onMouseEnter, onMouseLeave, children }) {
2740
2780
  const ref = useRef(null);
2741
2781
  useLayoutEffect(() => {
@@ -2866,17 +2906,18 @@ function StartMenu({
2866
2906
  )
2867
2907
  ] })
2868
2908
  ] }),
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) => {
2909
+ /* @__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
2910
  const icon = navIcons2[item.to];
2871
2911
  return /* @__PURE__ */ jsxs(
2872
2912
  "button",
2873
2913
  {
2874
2914
  onClick: () => handleClick(item.to),
2915
+ "aria-label": menuAriaLabel(item),
2875
2916
  className: "w-full flex items-center gap-3 px-4 py-3 active:bg-gray-100 border-b border-gray-100 text-left",
2876
2917
  children: [
2877
2918
  /* @__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
2919
  /* @__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 }),
2920
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: "block truncate text-sm font-medium text-gray-900" }),
2880
2921
  sectionLabel && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-gray-500 truncate", children: sectionLabel })
2881
2922
  ] })
2882
2923
  ]
@@ -2921,12 +2962,12 @@ function StartMenu({
2921
2962
  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
2963
  const iconEl = (path) => {
2923
2964
  const icon = navIcons2[path];
2924
- if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4" });
2965
+ if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4 shrink-0" });
2925
2966
  return null;
2926
2967
  };
2927
2968
  const secIcon = (label) => {
2928
2969
  const icon = sectionIcons2[label];
2929
- if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4" });
2970
+ if (icon && isValidElement(icon)) return cloneElement(icon, { className: "h-4 w-4 shrink-0" });
2930
2971
  return null;
2931
2972
  };
2932
2973
  const hoveredSection = openPath.length > 0 ? openPath[0].key : null;
@@ -2942,7 +2983,8 @@ function StartMenu({
2942
2983
  };
2943
2984
  const sizeConfig = sizeConfigByDensity[density][size];
2944
2985
  const menuGlass = glassStyle();
2945
- const itemCls = `w-full flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;
2986
+ const itemCls = `w-full min-w-0 overflow-hidden whitespace-nowrap flex items-center gap-2 rounded-lg ${sizeConfig.px} ${sizeConfig.py} ${sizeConfig.text}`;
2987
+ const itemLabelCls = "min-w-0 flex-1 truncate text-left";
2946
2988
  const viewportH = typeof window !== "undefined" ? window.innerHeight : 800;
2947
2989
  const viewportW = typeof window !== "undefined" ? window.innerWidth : 1280;
2948
2990
  const minTop = (taskbarPosition === "top" ? taskbarH : 0) + 8;
@@ -2969,29 +3011,43 @@ function StartMenu({
2969
3011
  cancelClose();
2970
3012
  closeTimer.current = setTimeout(() => setOpenPath((prev) => closeMenuBelow(prev, depth)), CLOSE_DELAY);
2971
3013
  };
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" }) });
3014
+ 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
3015
  const renderSection = (section, isErp) => {
2974
3016
  if (!navVisible(section, hasAnyPerm)) return null;
2975
3017
  const items = getVisibleItems(section);
2976
3018
  if (items.length === 0) return null;
2977
3019
  const isHovered = hoveredSection === section.label;
2978
3020
  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
- ] }),
3021
+ /* @__PURE__ */ jsxs(
3022
+ "button",
3023
+ {
3024
+ "aria-label": menuAriaLabel(section),
3025
+ className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3026
+ children: [
3027
+ secIcon(section.label),
3028
+ /* @__PURE__ */ jsx(MenuLabel, { entry: section, className: `${itemLabelCls} ${isErp ? "font-medium" : ""}` }),
3029
+ chevron
3030
+ ]
3031
+ }
3032
+ ),
2984
3033
  section.dividerAfter && /* @__PURE__ */ jsx("div", { className: "border-t border-white/20 my-1.5 mx-2" })
2985
3034
  ] }, section.label);
2986
3035
  };
2987
3036
  const renderVirtualSection = (v) => {
2988
3037
  if (v.items.length === 0) return null;
2989
3038
  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);
3039
+ return /* @__PURE__ */ jsx("div", { onMouseEnter: (e) => openSubmenu(0, v.label, e), children: /* @__PURE__ */ jsxs(
3040
+ "button",
3041
+ {
3042
+ "aria-label": menuAriaLabel(v),
3043
+ className: `${itemCls} transition-colors ${isHovered ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3044
+ children: [
3045
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", children: v.icon }),
3046
+ /* @__PURE__ */ jsx(MenuLabel, { entry: v, className: itemLabelCls }),
3047
+ chevron
3048
+ ]
3049
+ }
3050
+ ) }, v.label);
2995
3051
  };
2996
3052
  return (
2997
3053
  /* z-[1100]: sit above the entire window stack — normal windows climb to
@@ -3049,30 +3105,32 @@ function StartMenu({
3049
3105
  ] })
3050
3106
  }
3051
3107
  ),
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(
3108
+ 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
3109
  "button",
3054
3110
  {
3055
3111
  onClick: () => handleClick(r.to),
3056
3112
  onMouseEnter: () => setSearchIdx(i),
3113
+ "aria-label": menuAriaLabel(r),
3057
3114
  className: `${itemCls} transition-colors ${i === searchIdx ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3058
3115
  children: [
3059
3116
  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 })
3117
+ /* @__PURE__ */ jsx(MenuLabel, { entry: r, className: itemLabelCls }),
3118
+ r.section && /* @__PURE__ */ jsx("span", { className: "max-w-[40%] shrink-0 truncate text-[10px] text-gray-400 ml-auto", children: r.section })
3062
3119
  ]
3063
3120
  },
3064
3121
  i
3065
- )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto overflow-x-hidden wrap-anywhere px-1 pb-1 flex flex-col", children: [
3122
+ )) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto overflow-x-hidden px-1 pb-1 flex flex-col", children: [
3066
3123
  isVertical && /* @__PURE__ */ jsxs(Fragment, { children: [
3067
3124
  footerItems.map((item) => /* @__PURE__ */ jsxs(
3068
3125
  "button",
3069
3126
  {
3070
3127
  onClick: () => handleClick(item.to),
3071
3128
  onMouseEnter: () => scheduleClose(0),
3129
+ "aria-label": menuAriaLabel(item),
3072
3130
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3073
3131
  children: [
3074
3132
  iconEl(item.to),
3075
- /* @__PURE__ */ jsx("span", { children: item.label })
3133
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3076
3134
  ]
3077
3135
  },
3078
3136
  item.to
@@ -3086,10 +3144,11 @@ function StartMenu({
3086
3144
  "button",
3087
3145
  {
3088
3146
  onClick: () => handleClick(item.to),
3147
+ "aria-label": menuAriaLabel(item),
3089
3148
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3090
3149
  children: [
3091
3150
  iconEl(item.to),
3092
- /* @__PURE__ */ jsx("span", { children: item.label })
3151
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3093
3152
  ]
3094
3153
  }
3095
3154
  ),
@@ -3104,10 +3163,11 @@ function StartMenu({
3104
3163
  "button",
3105
3164
  {
3106
3165
  onClick: () => handleClick(item.to),
3166
+ "aria-label": menuAriaLabel(item),
3107
3167
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3108
3168
  children: [
3109
3169
  iconEl(item.to),
3110
- /* @__PURE__ */ jsx("span", { children: item.label })
3170
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3111
3171
  ]
3112
3172
  }
3113
3173
  ),
@@ -3124,10 +3184,11 @@ function StartMenu({
3124
3184
  {
3125
3185
  onClick: () => handleClick(item.to),
3126
3186
  onMouseEnter: () => scheduleClose(0),
3187
+ "aria-label": menuAriaLabel(item),
3127
3188
  className: `${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,
3128
3189
  children: [
3129
3190
  iconEl(item.to),
3130
- /* @__PURE__ */ jsx("span", { children: item.label })
3191
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls })
3131
3192
  ]
3132
3193
  },
3133
3194
  item.to
@@ -3174,7 +3235,7 @@ function StartMenu({
3174
3235
  style: menuGlass,
3175
3236
  onMouseEnter: () => scheduleClose(i + 1),
3176
3237
  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) => {
3238
+ 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
3239
  const kids = submenuItems(item);
3179
3240
  const isOpen = openPath[i + 1]?.key === item.to;
3180
3241
  return /* @__PURE__ */ jsxs(
@@ -3186,10 +3247,11 @@ function StartMenu({
3186
3247
  "button",
3187
3248
  {
3188
3249
  onClick: kids.length > 0 ? (e) => openSubmenu(i + 1, item.to, e) : () => handleClick(item.to),
3250
+ "aria-label": menuAriaLabel(item),
3189
3251
  className: `${itemCls} transition-colors ${isOpen ? "bg-blue-50 text-blue-700" : "text-gray-700 hover:bg-blue-50 hover:text-blue-700"}`,
3190
3252
  children: [
3191
3253
  iconEl(item.to),
3192
- /* @__PURE__ */ jsx("span", { children: item.label }),
3254
+ /* @__PURE__ */ jsx(MenuLabel, { entry: item, className: itemLabelCls }),
3193
3255
  kids.length > 0 && chevron
3194
3256
  ]
3195
3257
  }
@@ -3215,6 +3277,9 @@ function StartMenu({
3215
3277
  function MobileAppLanding({
3216
3278
  productName,
3217
3279
  productIcon,
3280
+ adaptiveLogo = false,
3281
+ logoHasAlpha = null,
3282
+ logoIsLight = null,
3218
3283
  config,
3219
3284
  wallpaperStyle
3220
3285
  }) {
@@ -3233,7 +3298,20 @@ function MobileAppLanding({
3233
3298
  className: "w-full max-w-sm rounded-3xl p-8 flex flex-col items-center text-center",
3234
3299
  style: glassStyle(),
3235
3300
  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" }) }),
3301
+ /* @__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(
3302
+ BrandMark,
3303
+ {
3304
+ src: productIcon,
3305
+ alt: "",
3306
+ slot: "compact",
3307
+ surface: "light",
3308
+ size: 56,
3309
+ adaptive: adaptiveLogo,
3310
+ hasAlpha: logoHasAlpha,
3311
+ isLight: logoIsLight,
3312
+ decorative: true
3313
+ }
3314
+ ) }),
3237
3315
  /* @__PURE__ */ jsx("h1", { className: "text-xl font-semibold text-gray-900 leading-snug", children: heading }),
3238
3316
  /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600 leading-relaxed", children: description }),
3239
3317
  hasLink && /* @__PURE__ */ jsxs(
@@ -3254,7 +3332,7 @@ function MobileAppLanding({
3254
3332
  }
3255
3333
  );
3256
3334
  }
3257
- var Sidebar = lazy(() => import('./Sidebar-B3LY5T2U.js'));
3335
+ var Sidebar = lazy(() => import('./Sidebar-GFDPPC4X.js'));
3258
3336
  function useFavorites(wallpapers) {
3259
3337
  const { prefs, save } = useShellPrefs();
3260
3338
  const favorites = prefs.favorite_pages || [];
@@ -3541,6 +3619,9 @@ function Layout({
3541
3619
  const brandName = branding?.productName ?? productName;
3542
3620
  const brandIcon = branding?.logo ?? productIcon;
3543
3621
  const brandTagline = branding?.tagline;
3622
+ const brandAdaptive = branding?.adaptiveLogo ?? false;
3623
+ const brandHasAlpha = branding?.logoHasAlpha ?? null;
3624
+ const brandIsLight = branding?.logoIsLight ?? null;
3544
3625
  const host = useDesktopHost();
3545
3626
  const { user, logout, hasAnyPerm } = useAuth();
3546
3627
  const { openPage, openEntity, openWindows } = useWindowManager();
@@ -3695,11 +3776,11 @@ function Layout({
3695
3776
  }, [toggleFullscreen]);
3696
3777
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-screen", children: [
3697
3778
  /* @__PURE__ */ jsx(SessionWindowRestore, {}),
3698
- showStartup && /* @__PURE__ */ jsx(StartupAnimation, { onComplete: () => setShowStartup(false), ready: !!profile, productName: brandName, logo: brandIcon, subtitle: brandTagline }),
3779
+ showStartup && /* @__PURE__ */ jsx(StartupAnimation, { onComplete: () => setShowStartup(false), ready: !!profile, productName: brandName, logo: brandIcon, subtitle: brandTagline, adaptiveLogo: brandAdaptive, logoHasAlpha: brandHasAlpha, logoIsLight: brandIsLight }),
3699
3780
  showLogout && /* @__PURE__ */ jsx(LogoutAnimation, { onComplete: () => {
3700
3781
  sessionStorage.removeItem("erp_startup_shown");
3701
3782
  logout();
3702
- }, logo: brandIcon, subtitle: brandTagline }),
3783
+ }, logo: brandIcon, subtitle: brandTagline, adaptiveLogo: brandAdaptive, logoHasAlpha: brandHasAlpha, logoIsLight: brandIsLight }),
3703
3784
  !sidebarMode && /* @__PURE__ */ jsx(
3704
3785
  StartMenu,
3705
3786
  {
@@ -3742,7 +3823,10 @@ function Layout({
3742
3823
  sectionIcons: sectionIcons2,
3743
3824
  categories,
3744
3825
  productName: brandName,
3745
- productIcon: brandIcon
3826
+ productIcon: brandIcon,
3827
+ adaptiveLogo: brandAdaptive,
3828
+ logoHasAlpha: brandHasAlpha,
3829
+ logoIsLight: brandIsLight
3746
3830
  }
3747
3831
  ) }),
3748
3832
  (() => {
@@ -3765,6 +3849,9 @@ function Layout({
3765
3849
  {
3766
3850
  productName: brandName,
3767
3851
  productIcon: brandIcon,
3852
+ adaptiveLogo: brandAdaptive,
3853
+ logoHasAlpha: brandHasAlpha,
3854
+ logoIsLight: brandIsLight,
3768
3855
  config: mobileApp,
3769
3856
  wallpaperStyle
3770
3857
  }
@@ -3850,7 +3937,21 @@ function Layout({
3850
3937
  style: { background: "radial-gradient(circle 60px at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,0.25) 0%, transparent 100%)" }
3851
3938
  }
3852
3939
  ),
3853
- brandIcon && /* @__PURE__ */ jsx("img", { src: brandIcon, alt: "", className: "relative z-10 h-3.5 w-3.5 shrink-0 opacity-60" }),
3940
+ brandIcon && /* @__PURE__ */ jsx(
3941
+ BrandMark,
3942
+ {
3943
+ src: brandIcon,
3944
+ alt: "",
3945
+ slot: "compact",
3946
+ surface: "light",
3947
+ adaptive: brandAdaptive,
3948
+ hasAlpha: brandHasAlpha,
3949
+ isLight: brandIsLight,
3950
+ size: 14,
3951
+ decorative: true,
3952
+ className: "relative z-10 opacity-60"
3953
+ }
3954
+ ),
3854
3955
  /* @__PURE__ */ jsx("span", { className: "relative z-10 truncate", children: brandName })
3855
3956
  ]
3856
3957
  }
@@ -3916,7 +4017,7 @@ function Layout({
3916
4017
  GlobalSearch,
3917
4018
  {
3918
4019
  ...search,
3919
- onSelect: (result) => openEntity(result.entity_type, result.entity_id, null, result.label)
4020
+ onSelect: (result) => openEntity(result.entity_type, result.entity_id, void 0, result.label)
3920
4021
  }
3921
4022
  ),
3922
4023
  /* @__PURE__ */ jsx(ShortcutHelp, {})