react-os-shell 4.15.0 → 4.21.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.
- package/README.md +46 -0
- package/dist/{Browser-XV34CJFP.js → Browser-6ACRB3XK.js} +9 -6
- package/dist/Browser-6ACRB3XK.js.map +1 -0
- package/dist/{Calculator-FFCYNYU3.js → Calculator-QCAJ6ITI.js} +8 -5
- package/dist/Calculator-QCAJ6ITI.js.map +1 -0
- package/dist/ConfirmDialog-WAM5OKAV.js +3 -0
- package/dist/{ConfirmDialog-CXHJCDUL.js.map → ConfirmDialog-WAM5OKAV.js.map} +1 -1
- package/dist/{CurrencyConverter-3NCK7WY6.js → CurrencyConverter-PCYC6RL5.js} +8 -5
- package/dist/CurrencyConverter-PCYC6RL5.js.map +1 -0
- package/dist/{Documents-S6EQOLUF.js → Documents-XME7555L.js} +10 -7
- package/dist/Documents-XME7555L.js.map +1 -0
- package/dist/{Files-TFZNYXAH.js → Files-6Q4HZKZD.js} +16 -12
- package/dist/Files-6Q4HZKZD.js.map +1 -0
- package/dist/{Notepad-EAA6CXZX.js → Notepad-W6LXMKWD.js} +10 -7
- package/dist/Notepad-W6LXMKWD.js.map +1 -0
- package/dist/{PomodoroTimer-BXI752XM.js → PomodoroTimer-YABFEPEV.js} +10 -7
- package/dist/PomodoroTimer-YABFEPEV.js.map +1 -0
- package/dist/{Preview-ZKYM7A5X.js → Preview-TYJQ6ASR.js} +11 -8
- package/dist/Preview-TYJQ6ASR.js.map +1 -0
- package/dist/{Sidebar-IMACKSHS.js → Sidebar-B3LY5T2U.js} +5 -4
- package/dist/Sidebar-B3LY5T2U.js.map +1 -0
- package/dist/{Spreadsheet-BXOPROMB.js → Spreadsheet-TAO2PWRL.js} +10 -7
- package/dist/Spreadsheet-TAO2PWRL.js.map +1 -0
- package/dist/{Stock-BEQCSYNT.js → Stock-IPLLRUOC.js} +8 -5
- package/dist/Stock-IPLLRUOC.js.map +1 -0
- package/dist/{Weather-QPV6G7UN.js → Weather-SI5QN7X2.js} +8 -5
- package/dist/Weather-SI5QN7X2.js.map +1 -0
- package/dist/{WorldClock-I3ZE57V4.js → WorldClock-WYDSMUWX.js} +8 -5
- package/dist/WorldClock-WYDSMUWX.js.map +1 -0
- package/dist/apps/index.js +22 -19
- package/dist/apps/index.js.map +1 -1
- package/dist/chunk-22BNPLM4.js +46 -0
- package/dist/chunk-22BNPLM4.js.map +1 -0
- package/dist/{chunk-IVLDAUYM.js → chunk-3CUSBZWG.js} +3 -56
- package/dist/chunk-3CUSBZWG.js.map +1 -0
- package/dist/{chunk-VENYVK3L.js → chunk-4AKVHY4B.js} +48 -12
- package/dist/chunk-4AKVHY4B.js.map +1 -0
- package/dist/chunk-4OPGKWMT.js +7 -0
- package/dist/{chunk-F562QDVS.js.map → chunk-4OPGKWMT.js.map} +1 -1
- package/dist/chunk-C22EFSND.js +188 -0
- package/dist/chunk-C22EFSND.js.map +1 -0
- package/dist/{chunk-H4IEH6FK.js → chunk-EWDYCO65.js} +3 -3
- package/dist/{chunk-H4IEH6FK.js.map → chunk-EWDYCO65.js.map} +1 -1
- package/dist/{chunk-DINNWYVB.js → chunk-HYAW6KIL.js} +4 -45
- package/dist/chunk-HYAW6KIL.js.map +1 -0
- package/dist/{chunk-H3HFM4JQ.js → chunk-IGPSRRL7.js} +262 -712
- package/dist/chunk-IGPSRRL7.js.map +1 -0
- package/dist/chunk-L2O6B5KT.js +394 -0
- package/dist/chunk-L2O6B5KT.js.map +1 -0
- package/dist/{chunk-YS4ZW2P7.js → chunk-OI253GOA.js} +4 -4
- package/dist/{chunk-YS4ZW2P7.js.map → chunk-OI253GOA.js.map} +1 -1
- package/dist/{chunk-ZPCGIR62.js → chunk-OQ7GRU7G.js} +3 -3
- package/dist/{chunk-ZPCGIR62.js.map → chunk-OQ7GRU7G.js.map} +1 -1
- package/dist/{chunk-7J3HTJJ3.js → chunk-Q3AOIJ7B.js} +3 -3
- package/dist/{chunk-7J3HTJJ3.js.map → chunk-Q3AOIJ7B.js.map} +1 -1
- package/dist/{chunk-N2UW3CAS.js → chunk-QJS6RBH4.js} +3 -3
- package/dist/{chunk-N2UW3CAS.js.map → chunk-QJS6RBH4.js.map} +1 -1
- package/dist/chunk-UPGCISED.js +5015 -0
- package/dist/chunk-UPGCISED.js.map +1 -0
- package/dist/{chunk-LFTHOYKW.js → chunk-VX634UB2.js} +5 -5
- package/dist/{chunk-LFTHOYKW.js.map → chunk-VX634UB2.js.map} +1 -1
- package/dist/chunk-WNLPTLT6.js +56 -0
- package/dist/chunk-WNLPTLT6.js.map +1 -0
- package/dist/{chunk-QU5L5ZYM.js → chunk-X5PZYTAK.js} +3 -3
- package/dist/{chunk-QU5L5ZYM.js.map → chunk-X5PZYTAK.js.map} +1 -1
- package/dist/index-Czn1re5M.d.ts +1939 -0
- package/dist/index.d.ts +7 -1375
- package/dist/index.js +159 -4082
- package/dist/index.js.map +1 -1
- package/dist/shell.css +105 -0
- package/dist/styles.css +12 -501
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.js +11 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui.css +425 -0
- package/package.json +7 -2
- package/dist/Browser-XV34CJFP.js.map +0 -1
- package/dist/Calculator-FFCYNYU3.js.map +0 -1
- package/dist/ConfirmDialog-CXHJCDUL.js +0 -4
- package/dist/CurrencyConverter-3NCK7WY6.js.map +0 -1
- package/dist/Documents-S6EQOLUF.js.map +0 -1
- package/dist/Files-TFZNYXAH.js.map +0 -1
- package/dist/Notepad-EAA6CXZX.js.map +0 -1
- package/dist/PomodoroTimer-BXI752XM.js.map +0 -1
- package/dist/Preview-ZKYM7A5X.js.map +0 -1
- package/dist/Sidebar-IMACKSHS.js.map +0 -1
- package/dist/Spreadsheet-BXOPROMB.js.map +0 -1
- package/dist/Stock-BEQCSYNT.js.map +0 -1
- package/dist/Weather-QPV6G7UN.js.map +0 -1
- package/dist/WorldClock-I3ZE57V4.js.map +0 -1
- package/dist/chunk-DINNWYVB.js.map +0 -1
- package/dist/chunk-F562QDVS.js +0 -7
- package/dist/chunk-H3HFM4JQ.js.map +0 -1
- package/dist/chunk-IVLDAUYM.js.map +0 -1
- package/dist/chunk-VENYVK3L.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { VERSION } from './chunk-
|
|
2
|
-
import { useWindowMenuItem, Modal } from './chunk-
|
|
3
|
-
import { navIcons } from './chunk-
|
|
1
|
+
import { VERSION } from './chunk-4OPGKWMT.js';
|
|
2
|
+
import { useWindowMenuItem, Modal } from './chunk-IGPSRRL7.js';
|
|
3
|
+
import { navIcons } from './chunk-WNLPTLT6.js';
|
|
4
4
|
import { useState, useCallback, isValidElement, cloneElement } from 'react';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
6
|
|
|
@@ -75,5 +75,5 @@ function AboutApp({ app }) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
export { AboutApp, BUILTIN_APP_INFO };
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-VX634UB2.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-VX634UB2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/apps/_about.tsx"],"names":[],"mappings":"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","file":"chunk-VX634UB2.js","sourcesContent":["/**\n * Shared \"About\" dialog for the bundled apps.\n *\n * Each bundled app carries its own version (independent of the package\n * version) so app-level changes can be tracked without bumping every app at\n * once. `<AboutApp app=\"…\" />` registers an \"About <Name>\" item in the\n * window title menu and renders the dialog: app icon, name, app version and\n * the react-os-shell attribution + shell version.\n *\n * Bump an app's version in `BUILTIN_APP_INFO` whenever that app's behaviour\n * changes, alongside the package-level CHANGELOG entry.\n */\nimport { useCallback, useState, isValidElement, cloneElement, type ReactElement } from 'react';\nimport Modal, { useWindowMenuItem } from '../shell/Modal';\nimport { navIcons } from '../shell-config/nav';\nimport { VERSION } from '../version';\n\nexport interface BuiltinAppInfo {\n /** Display name — matches the window-registry label. */\n name: string;\n /** App version, independent of the package version. */\n version: string;\n /** One-line summary shown in the About dialog. */\n description: string;\n /** Registry route — used to look up the consumer-registered nav icon. */\n route: string;\n}\n\nexport const BUILTIN_APP_INFO = {\n spreadsheet: {\n name: 'Spreadsheets',\n version: '1.1.1',\n route: '/spreadsheet',\n description: 'Multi-sheet spreadsheet editor with CSV / TSV import and export.',\n },\n notepad: {\n name: 'Notepad',\n version: '1.0.0',\n route: '/notepad',\n description: 'Color-coded notes with checklists, desktop stickies and entity autolinking.',\n },\n documents: {\n name: 'Documents',\n version: '1.1.0',\n route: '/documents',\n description: 'Letter-page editor for Word documents and plain-text files — images, lists, alignment.',\n },\n preview: {\n name: 'Preview',\n version: '1.2.1',\n route: '/preview',\n description: 'Viewer for PDF documents, images, DXF drawings and 3D models — CAD-style measuring with object snap and an AutoCAD-like command bar.',\n },\n files: {\n name: 'Files',\n version: '1.1.0',\n route: '/files',\n description: 'Personal file manager with folders, uploads, quota, trash and desktop shortcut folders.',\n },\n browser: {\n name: 'Browser',\n version: '1.0.1',\n route: '/browser',\n description: 'Minimal web browser with bookmarks, history and navigation bar.',\n },\n} satisfies Record<string, BuiltinAppInfo>;\n\nexport type BuiltinAppId = keyof typeof BUILTIN_APP_INFO;\n\nconst ABOUT_MENU_ICON = (\n <svg className=\"h-4 w-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n);\n\n// Generic window glyph shown when the consumer hasn't registered a nav icon\n// for the app's route (same fallback shape as the Modal title bar).\nconst FALLBACK_APP_ICON = (\n <svg className=\"h-9 w-9\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6.75A2.25 2.25 0 016 4.5h12a2.25 2.25 0 012.25 2.25v10.5A2.25 2.25 0 0118 19.5H6a2.25 2.25 0 01-2.25-2.25V6.75z M3.75 9h16.5\" />\n </svg>\n);\n\n/** Registers \"About <Name>\" in the window title menu and renders the dialog.\n * Render anywhere inside the app's window. */\nexport default function AboutApp({ app }: { app: BuiltinAppId }) {\n const info = BUILTIN_APP_INFO[app];\n const [open, setOpen] = useState(false);\n const openDialog = useCallback(() => setOpen(true), []);\n useWindowMenuItem(`About ${info.name}`, openDialog, ABOUT_MENU_ICON);\n\n if (!open) return null;\n\n const registered = navIcons[info.route];\n const appIcon = isValidElement(registered)\n ? cloneElement(registered as ReactElement, { className: 'h-9 w-9' } as any)\n : FALLBACK_APP_ICON;\n\n return (\n <Modal open onClose={() => setOpen(false)} title={`About ${info.name}`} size=\"sm\" compact bodyScroll={false} autoHeight dimensions={[320, 320]}>\n <div className=\"flex flex-col items-center text-center px-5 pt-5 pb-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-2xl bg-gray-100 text-gray-600 shrink-0\">\n {appIcon}\n </div>\n <h2 className=\"mt-3 text-lg font-bold text-gray-900\">{info.name}</h2>\n <p className=\"text-[11px] font-mono text-gray-400\">Version {info.version}</p>\n <p className=\"mt-2 text-xs text-gray-500 leading-relaxed\">{info.description}</p>\n <div className=\"mt-4 pt-3 border-t border-gray-200 w-full\">\n <p className=\"text-[11px] text-gray-500\">\n Part of the <span className=\"font-medium text-gray-700\">react-os-shell</span> desktop environment\n </p>\n {VERSION && <p className=\"mt-0.5 text-[10px] font-mono text-gray-400\">shell v{VERSION}</p>}\n </div>\n </div>\n </Modal>\n );\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/shell/nav-types.ts
|
|
5
|
+
function isSection(item) {
|
|
6
|
+
return "items" in item;
|
|
7
|
+
}
|
|
8
|
+
function navVisible(entry, hasAnyPerm) {
|
|
9
|
+
if (entry.perms?.length && !hasAnyPerm(entry.perms)) return false;
|
|
10
|
+
if (entry.allPerms?.length && !entry.allPerms.every((p) => hasAnyPerm([p]))) return false;
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
function visibleChildren(item, hasAnyPerm) {
|
|
14
|
+
return (item.children ?? []).filter((c) => navVisible(c, hasAnyPerm));
|
|
15
|
+
}
|
|
16
|
+
function isReachable(item, hasAnyPerm) {
|
|
17
|
+
if (!item.children?.length) return true;
|
|
18
|
+
return visibleChildren(item, hasAnyPerm).some((child) => isReachable(child, hasAnyPerm));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/shell-config/nav.tsx
|
|
22
|
+
var _navIcons = {};
|
|
23
|
+
var navIcons = new Proxy(_navIcons, {
|
|
24
|
+
get(_t, k) {
|
|
25
|
+
return _navIcons[k];
|
|
26
|
+
},
|
|
27
|
+
has(_t, k) {
|
|
28
|
+
return k in _navIcons;
|
|
29
|
+
},
|
|
30
|
+
ownKeys() {
|
|
31
|
+
return Object.keys(_navIcons);
|
|
32
|
+
},
|
|
33
|
+
getOwnPropertyDescriptor(_t, k) {
|
|
34
|
+
if (k in _navIcons) return { configurable: true, enumerable: true, value: _navIcons[k] };
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
function setShellNavIcons(icons) {
|
|
39
|
+
for (const k of Object.keys(_navIcons)) delete _navIcons[k];
|
|
40
|
+
Object.assign(_navIcons, icons);
|
|
41
|
+
}
|
|
42
|
+
var sectionIcons = {};
|
|
43
|
+
var navSections = [];
|
|
44
|
+
var startMenuCategories = { erp: [], system: [], virtual: [], footer: [] };
|
|
45
|
+
var DEFAULT = { hasAnyPerm: () => true };
|
|
46
|
+
var ShellAuthContext = createContext(DEFAULT);
|
|
47
|
+
function ShellAuthProvider({ value, children }) {
|
|
48
|
+
return /* @__PURE__ */ jsx(ShellAuthContext.Provider, { value, children });
|
|
49
|
+
}
|
|
50
|
+
function useShellAuth() {
|
|
51
|
+
return useContext(ShellAuthContext);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { ShellAuthProvider, isReachable, isSection, navIcons, navSections, navVisible, sectionIcons, setShellNavIcons, startMenuCategories, useShellAuth, visibleChildren };
|
|
55
|
+
//# sourceMappingURL=chunk-WNLPTLT6.js.map
|
|
56
|
+
//# sourceMappingURL=chunk-WNLPTLT6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/nav-types.ts","../src/shell-config/nav.tsx","../src/shell/ShellAuth.tsx"],"names":[],"mappings":";;;;AAgEO,SAAS,UAAU,IAAA,EAAgD;AACxE,EAAA,OAAO,OAAA,IAAW,IAAA;AACpB;AAoBO,SAAS,UAAA,CACd,OACA,UAAA,EACS;AACT,EAAA,IAAI,KAAA,CAAM,OAAO,MAAA,IAAU,CAAC,WAAW,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,IAAU,CAAC,MAAM,QAAA,CAAS,KAAA,CAAM,CAAA,CAAA,KAAK,UAAA,CAAW,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAA;AAClF,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,eAAA,CAAgB,MAAe,UAAA,EAAmC;AAChF,EAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,EAAC,EAAG,OAAO,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,UAAU,CAAC,CAAA;AACpE;AAcO,SAAS,WAAA,CAAY,MAAe,UAAA,EAAiC;AAC1E,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,MAAA,EAAQ,OAAO,IAAA;AACnC,EAAA,OAAO,eAAA,CAAgB,MAAM,UAAU,CAAA,CAAE,KAAK,CAAA,KAAA,KAAS,WAAA,CAAY,KAAA,EAAO,UAAU,CAAC,CAAA;AACvF;;;AC3GA,IAAM,YAAuC,EAAC;AACvC,IAAM,QAAA,GAAsC,IAAI,KAAA,CAAM,SAAA,EAAW;AAAA,EACtE,GAAA,CAAI,IAAI,CAAA,EAAW;AAAE,IAAA,OAAO,UAAU,CAAC,CAAA;AAAA,EAAG,CAAA;AAAA,EAC1C,GAAA,CAAI,IAAI,CAAA,EAAW;AAAE,IAAA,OAAO,CAAA,IAAK,SAAA;AAAA,EAAW,CAAA;AAAA,EAC5C,OAAA,GAAU;AAAE,IAAA,OAAO,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,EAAG,CAAA;AAAA,EAC3C,wBAAA,CAAyB,IAAI,CAAA,EAAW;AACtC,IAAA,IAAI,CAAA,IAAK,SAAA,EAAW,OAAO,EAAE,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAE;AACvF,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAC;AACM,SAAS,iBAAiB,KAAA,EAAwC;AACvE,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG,OAAO,UAAU,CAAC,CAAA;AAC1D,EAAA,MAAA,CAAO,MAAA,CAAO,WAAW,KAAK,CAAA;AAChC;AAEO,IAAM,eAA0C;AAChD,IAAM,cAAwC;AAC9C,IAAM,mBAAA,GAA2C,EAAE,GAAA,EAAK,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC;ACZrG,IAAM,OAAA,GAAqB,EAAE,UAAA,EAAY,MAAM,IAAA,EAAK;AAEpD,IAAM,gBAAA,GAAmB,cAAyB,OAAO,CAAA;AAElD,SAAS,iBAAA,CAAkB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA8C;AAChG,EAAA,uBAAO,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAe,QAAA,EAAS,CAAA;AAC5D;AAEO,SAAS,YAAA,GAA0B;AACxC,EAAA,OAAO,WAAW,gBAAgB,CAAA;AACpC","file":"chunk-WNLPTLT6.js","sourcesContent":["/**\n * Nav data types used by <Layout> + <StartMenu>. The actual sections, icons,\n * and categories are consumer-supplied via Layout props — the package never\n * ships nav DATA, only the shape it expects.\n */\nimport type { ReactNode } from 'react';\n\nexport interface NavItem {\n to: string;\n label: string;\n perms?: string[];\n /** Permissions the user must hold EVERY one of, unlike `perms` which needs\n * only one. For an entry whose page is gated on a narrower permission than\n * the one that puts it in the menu: listing both in `perms` would widen the\n * audience (it's an OR), so the extra one goes here instead. */\n allPerms?: string[];\n dividerAfter?: boolean;\n /** Optional sub-items, to any depth — a child may have children of its own.\n * Hovering the parent in <StartMenu> opens a nested flyout; in <Sidebar>\n * the parent becomes an inline sub-accordion. */\n children?: NavItem[];\n}\n\nexport interface NavSection {\n label: string;\n items: NavItem[];\n perms?: string[];\n /** Same all-of rule as `NavItem.allPerms`, for a whole section. */\n allPerms?: string[];\n /** Optional landing route for clicks on the section title itself\n * (e.g. R&D's `/rd` dashboard). */\n to?: string;\n /** Draw a divider under this section's row, so a consumer can split one\n * flat group into visual bands (e.g. an operator console pinned above the\n * ERP sections). Same knob as `NavItem.dividerAfter`, and drawn INSIDE the\n * section's wrapper so it stays below the row in the `flex-col-reverse`\n * Start menu a side/top taskbar renders. */\n dividerAfter?: boolean;\n}\n\nexport interface VirtualSection {\n label: string;\n items: NavItem[];\n icon?: ReactNode;\n}\n\nexport interface StartMenuCategories {\n /** Section labels rendered in the \"ERP\" group (bold, with section icon). */\n erp: string[];\n /** Section labels rendered in the \"system\" group. */\n system: string[];\n /** Optional virtual flyouts (e.g. a \"Utilities\" tray). */\n virtual?: VirtualSection[];\n /** Optional section labels pinned to the bottom of the menu, next to the user\n * profile, separated from the ERP group by a divider. */\n footer?: string[];\n /** Optional flat top-level items pinned to the bottom of the menu, next to\n * the user profile, separated from the ERP group by a divider. Unlike\n * `footer` (section labels rendered as flyouts), these render as direct\n * clickable rows — use for standalone destinations like System Preferences\n * or a bug-report link. */\n footerItems?: NavItem[];\n}\n\nexport function isSection(item: NavSection | NavItem): item is NavSection {\n return 'items' in item;\n}\n\n/** The host app's permission predicate — `useAuth().hasAnyPerm`. */\ntype HasAnyPerm = (perms: string[]) => boolean;\n\n/**\n * Whether this user may see a nav entry, honouring BOTH permission rules.\n *\n * Every visibility test in the shell goes through here. It used to be an inline\n * `!x.perms || hasAnyPerm(x.perms)` repeated at nine call sites, which made the\n * all-of rule impossible to add without missing one — and a missed site shows a\n * row that refuses on click (SG#00214: a price-blind supplier role kept the\n * Price Sheets entry, because the entry is gated on the permission that lists\n * price sheets while the page is gated on the narrower one that reveals prices).\n *\n * `perms` keeps its any-of meaning, so existing nav data is untouched.\n * `allPerms` requires every entry, and is tested one permission at a time\n * because `hasAnyPerm` is the only predicate a host supplies — asking for all\n * of them in one call would be an OR and quietly grant the row.\n */\nexport function navVisible(\n entry: { perms?: string[]; allPerms?: string[] },\n hasAnyPerm: HasAnyPerm,\n): boolean {\n if (entry.perms?.length && !hasAnyPerm(entry.perms)) return false;\n if (entry.allPerms?.length && !entry.allPerms.every(p => hasAnyPerm([p]))) return false;\n return true;\n}\n\n/**\n * The sub-items of `item` this user may actually see.\n *\n * Every affordance for a nested group has to be derived from THIS list — the\n * chevron that advertises it, the hover handler that opens it, and the flyout\n * itself. Reading the raw `item.children` for the chevron while filtering only\n * for the flyout put an arrow on groups whose children were all\n * permission-hidden: hovering one highlighted the row and opened nothing.\n */\nexport function visibleChildren(item: NavItem, hasAnyPerm: HasAnyPerm): NavItem[] {\n return (item.children ?? []).filter(c => navVisible(c, hasAnyPerm));\n}\n\n/**\n * Whether a nav row leads anywhere for this user: either it's a plain\n * destination, or it's a group with at least one child that itself leads\n * somewhere. A group whose children are all hidden has nothing to open — and\n * by convention a group's `to` is a synthetic key that never navigates, so\n * there is nothing to fall back to either. Such a row is dropped rather than\n * rendered inert.\n *\n * The test recurses because nesting does: a group holding one sub-group whose\n * own children are all permission-hidden is just as inert as a group holding\n * nothing, and at four levels deep that shape is easy to build by accident.\n */\nexport function isReachable(item: NavItem, hasAnyPerm: HasAnyPerm): boolean {\n if (!item.children?.length) return true;\n return visibleChildren(item, hasAnyPerm).some(child => isReachable(child, hasAnyPerm));\n}\n","/**\n * INTERNAL stub — package-side compatibility for files that legacy-imported\n * default nav data from `shell-config/nav`. The package never ships nav\n * DATA; consumers always supply `navSections` / `navIcons` / `sectionIcons` /\n * `categories` as Layout props.\n *\n * Empty defaults exported here so the copied files compile during the\n * extraction transition. Each consumer-facing field is also re-exported as\n * a TYPE alias for code that only needed the shape.\n */\nimport type { ReactNode } from 'react';\nimport type { NavItem, NavSection, StartMenuCategories, VirtualSection } from '../shell/nav-types';\n\n// Live proxy: WindowManager reads window-title icons from this module-level\n// map. Consumers register their full icon set once at app startup so the\n// title bars show the same glyphs as the start menu.\nconst _navIcons: Record<string, ReactNode> = {};\nexport const navIcons: Record<string, ReactNode> = new Proxy(_navIcons, {\n get(_t, k: string) { return _navIcons[k]; },\n has(_t, k: string) { return k in _navIcons; },\n ownKeys() { return Object.keys(_navIcons); },\n getOwnPropertyDescriptor(_t, k: string) {\n if (k in _navIcons) return { configurable: true, enumerable: true, value: _navIcons[k] };\n return undefined;\n },\n});\nexport function setShellNavIcons(icons: Record<string, ReactNode>): void {\n for (const k of Object.keys(_navIcons)) delete _navIcons[k];\n Object.assign(_navIcons, icons);\n}\n\nexport const sectionIcons: Record<string, ReactNode> = {};\nexport const navSections: (NavSection | NavItem)[] = [];\nexport const startMenuCategories: StartMenuCategories = { erp: [], system: [], virtual: [], footer: [] };\n\nexport { isSection } from '../shell/nav-types';\nexport type { NavItem, NavSection, StartMenuCategories, VirtualSection };\n","/**\n * Shell-side auth surface — JUST permission checking. The shell never\n * authenticates anyone or holds tokens; it only asks \"is the current user\n * allowed to see this nav item?\".\n *\n * Consumer wraps the app:\n *\n * <ShellAuthProvider value={{ hasAnyPerm: (perms) => myAuth.has(...perms) }}>\n * <Layout ... />\n * </ShellAuthProvider>\n *\n * When no provider is mounted, every permission check returns true — useful\n * for demos and consumers that don't gate their UI.\n */\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport interface ShellAuth {\n /** Returns true if the current user has any of the listed permission codes. */\n hasAnyPerm: (perms: string[]) => boolean;\n}\n\nconst DEFAULT: ShellAuth = { hasAnyPerm: () => true };\n\nconst ShellAuthContext = createContext<ShellAuth>(DEFAULT);\n\nexport function ShellAuthProvider({ value, children }: { value: ShellAuth; children: ReactNode }) {\n return <ShellAuthContext.Provider value={value}>{children}</ShellAuthContext.Provider>;\n}\n\nexport function useShellAuth(): ShellAuth {\n return useContext(ShellAuthContext);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toast_default } from './chunk-
|
|
1
|
+
import { toast_default } from './chunk-4AKVHY4B.js';
|
|
2
2
|
import { forwardRef, useRef, useState, useMemo, useEffect, useImperativeHandle } from 'react';
|
|
3
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
|
|
@@ -1099,5 +1099,5 @@ function applyMosaic(ctx, rect) {
|
|
|
1099
1099
|
}
|
|
1100
1100
|
|
|
1101
1101
|
export { ImageAnnotator_default };
|
|
1102
|
-
//# sourceMappingURL=chunk-
|
|
1103
|
-
//# sourceMappingURL=chunk-
|
|
1102
|
+
//# sourceMappingURL=chunk-X5PZYTAK.js.map
|
|
1103
|
+
//# sourceMappingURL=chunk-X5PZYTAK.js.map
|