@burdenoff/fe-libs 2026.720.4 → 2026.722.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 (30) hide show
  1. package/dist/chrome/NavCustomizeDialog.d.ts +23 -0
  2. package/dist/chrome/NavCustomizeDialog.d.ts.map +1 -0
  3. package/dist/chrome/NavCustomizeDialog.js +188 -0
  4. package/dist/chrome/PersonaSurfaceControls.d.ts +25 -0
  5. package/dist/chrome/PersonaSurfaceControls.d.ts.map +1 -0
  6. package/dist/chrome/PersonaSurfaceControls.js +110 -0
  7. package/dist/chrome/ProductSideNav.d.ts.map +1 -1
  8. package/dist/chrome/ProductSideNav.js +70 -37
  9. package/dist/chrome/index.d.ts +6 -0
  10. package/dist/chrome/index.d.ts.map +1 -1
  11. package/dist/chrome/sideNavigation/navVisibility.d.ts +56 -0
  12. package/dist/chrome/sideNavigation/navVisibility.d.ts.map +1 -0
  13. package/dist/chrome/sideNavigation/navVisibility.js +94 -0
  14. package/dist/chrome/sideNavigation/types.d.ts +6 -0
  15. package/dist/chrome/sideNavigation/types.d.ts.map +1 -1
  16. package/dist/chrome.js +16 -13
  17. package/dist/shared/components/assistantWidget/AssistantWidget.d.ts.map +1 -1
  18. package/dist/shared/components/assistantWidget/AssistantWidget.js +5 -5
  19. package/dist/shared/hooks/shell/useNavRegistry.d.ts +9 -0
  20. package/dist/shared/hooks/shell/useNavRegistry.d.ts.map +1 -1
  21. package/dist/shared/providers/shell/PermissionProvider.d.ts +13 -0
  22. package/dist/shared/providers/shell/PermissionProvider.d.ts.map +1 -1
  23. package/dist/shared/providers/shell/PermissionProvider.js +9 -5
  24. package/dist/shared/providers/shell/PersonaSurfaceProvider.d.ts +119 -0
  25. package/dist/shared/providers/shell/PersonaSurfaceProvider.d.ts.map +1 -0
  26. package/dist/shared/providers/shell/PersonaSurfaceProvider.js +207 -0
  27. package/dist/shared/providers/shell/index.d.ts +3 -1
  28. package/dist/shared/providers/shell/index.d.ts.map +1 -1
  29. package/dist/shared-providers-shell.js +19 -18
  30. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ //#region src/chrome/sideNavigation/navVisibility.ts
2
+ var e = "__nav_more__:";
3
+ function t(e, t) {
4
+ if (!t || !e.requiredPermission) return !0;
5
+ let n = Array.isArray(e.requiredPermission) ? e.requiredPermission : [e.requiredPermission];
6
+ return n.length === 0 ? !0 : n.some((e) => t(e));
7
+ }
8
+ function n(e, i, a = { removed: 0 }) {
9
+ let o = [];
10
+ for (let s of e) {
11
+ if (!t(s, i)) {
12
+ a.removed += 1 + r(s.children ?? []);
13
+ continue;
14
+ }
15
+ if (!s.children || s.children.length === 0) {
16
+ o.push(s);
17
+ continue;
18
+ }
19
+ let e = n(s.children, i, a);
20
+ e.length === 0 && !s.path && !s.homePath || o.push({
21
+ ...s,
22
+ children: e
23
+ });
24
+ }
25
+ return o;
26
+ }
27
+ function r(e) {
28
+ return e.reduce((e, t) => e + 1 + r(t.children ?? []), 0);
29
+ }
30
+ function i(e, t, n, r) {
31
+ return r[e.id] || (!n || t || n.has(e.id) || e.children?.some((e) => i(e, !1, n, r) === "shown") ? "shown" : "hidden");
32
+ }
33
+ function a(e, t) {
34
+ let n = t?.[e.id];
35
+ return n ? {
36
+ ...e,
37
+ label: n
38
+ } : e;
39
+ }
40
+ function o(t, n, r, i) {
41
+ let a = r.length;
42
+ return {
43
+ id: `${e}${t}`,
44
+ label: i(a),
45
+ path: "",
46
+ group: n,
47
+ order: 9995,
48
+ children: r
49
+ };
50
+ }
51
+ var s = (e) => `${e} more…`;
52
+ function c(e, t) {
53
+ let n = t.surfaceVisibleItems ? new Set(t.surfaceVisibleItems) : null, r = t.overrides ?? {}, c = t.moreLabel ?? s, l = t.labelOverrides, u = 0, d = (e, t) => {
54
+ if (!e.children || e.children.length === 0) return a(e, l);
55
+ let s = [], f = [];
56
+ for (let a of e.children) {
57
+ let e = i(a, t, n, r), o = d(a, e === "shown" && (t || !n || n.has(a.id) || r[a.id] === "shown"));
58
+ e === "shown" ? s.push(o) : f.push(o);
59
+ }
60
+ u += f.length;
61
+ let p = f.length > 0 ? [...s, o(e.id, void 0, f, c)] : s;
62
+ return {
63
+ ...a(e, l),
64
+ children: p
65
+ };
66
+ }, f = [], p = /* @__PURE__ */ new Map();
67
+ for (let t of e) {
68
+ let e = i(t, !1, n, r), a = d(t, e === "shown" && (!n || n.has(t.id) || r[t.id] === "shown"));
69
+ if (e === "shown") f.push(a);
70
+ else {
71
+ let e = t.group ?? "__default__", n = p.get(e);
72
+ n ? n.push(a) : p.set(e, [a]);
73
+ }
74
+ }
75
+ let m = [...f];
76
+ for (let [e, t] of p) u += t.length, m.push(o(e, e === "__default__" ? void 0 : e, t, c));
77
+ return {
78
+ items: m,
79
+ softHiddenCount: u
80
+ };
81
+ }
82
+ function l(e, t) {
83
+ let r = { removed: 0 }, { items: i, softHiddenCount: a } = c(n(e, t.hasPermission, r), t);
84
+ return {
85
+ items: i,
86
+ softHiddenCount: a,
87
+ hardHiddenCount: r.removed
88
+ };
89
+ }
90
+ function u(e, t, n, r) {
91
+ return i(e, t, n ? new Set(n) : null, r) === "shown";
92
+ }
93
+ //#endregion
94
+ export { e as NAV_MORE_ID_PREFIX, l as applyNavVisibility, n as applyPermissionFilter, c as applySurfaceVisibility, u as isItemEffectivelyShown };
@@ -29,5 +29,11 @@ export interface NavItem {
29
29
  * If not specified, defaults to the first child's path (if children exist).
30
30
  */
31
31
  homePath?: string;
32
+ /**
33
+ * RBAC permission(s) required to see this item ("resource:action" form).
34
+ * An array means ANY match shows the item. Mirrors the registry NavItem
35
+ * field (see shared/hooks/shell/useNavRegistry.ts).
36
+ */
37
+ requiredPermission?: string | string[];
32
38
  }
33
39
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chrome/sideNavigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAErB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/chrome/sideNavigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,mCAAmC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAErB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC"}
package/dist/chrome.js CHANGED
@@ -22,16 +22,19 @@ import { LanguagePickerSheet as S } from "./chrome/LanguagePickerSheet.js";
22
22
  import { ProductPickerSheet as C } from "./chrome/ProductPickerSheet.js";
23
23
  import { AccountSwitcher as w } from "./chrome/AccountSwitcher.js";
24
24
  import { AutoBreadcrumbs as T, registerBreadcrumbName as E, unregisterBreadcrumbName as D } from "./chrome/AutoBreadcrumbs.js";
25
- import { ProductSideNav as O } from "./chrome/ProductSideNav.js";
26
- import { BrandMark as k } from "./chrome/BrandMark.js";
27
- import { DynamicFooter as A } from "./chrome/DynamicFooter.js";
28
- import { PanelTabs as j } from "./chrome/PanelTabs.js";
29
- import { PanelContainer as M } from "./chrome/PanelContainer.js";
30
- import { StatusBar as N } from "./chrome/StatusBar.js";
31
- import { PluginRoutes as P } from "./chrome/PluginRoutes.js";
32
- import { PluginSettingsPage as F } from "./chrome/PluginSettingsPage.js";
33
- import { PluginToolbar as I } from "./chrome/PluginToolbar.js";
34
- import { PluginWidgetGrid as L } from "./chrome/PluginWidgetGrid.js";
35
- import { PluginContextMenuTarget as R } from "./chrome/PluginContextMenuTarget.js";
36
- import { ThemePreferences as z } from "./chrome/ThemePreferences.js";
37
- export { w as AccountSwitcher, t as AppShellLayout, T as AutoBreadcrumbs, k as BrandMark, f as Breadcrumbs, d as CommandPalette, y as ContextSwitcher, o as DEFAULT_FOOTER_COLUMNS, s as DEFAULT_SOCIAL_LINKS, A as DynamicFooter, c as Footer, i as FooterBar, b as GeographySwitcher, u as GlobalSearch, r as HeaderBar, S as LanguagePickerSheet, v as LanguageSwitcher, p as NavLink, x as NotificationCenter, n as PageHeader, M as PanelContainer, j as PanelTabs, R as PluginContextMenuTarget, a as PluginFooterStrip, P as PluginRoutes, F as PluginSettingsPage, I as PluginToolbar, L as PluginWidgetGrid, C as ProductPickerSheet, O as ProductSideNav, _ as ProductSwitcher, g as ProfileSwitcher, e as ShortcutHelpDialog, l as SideNavigation, h as Sidebar, N as StatusBar, m as Tabs, z as ThemePreferences, E as registerBreadcrumbName, D as unregisterBreadcrumbName };
25
+ import { NAV_MORE_ID_PREFIX as O, applyNavVisibility as k, applyPermissionFilter as A, applySurfaceVisibility as j, isItemEffectivelyShown as M } from "./chrome/sideNavigation/navVisibility.js";
26
+ import { NavCustomizeDialog as N } from "./chrome/NavCustomizeDialog.js";
27
+ import { PersonaSimulationPill as P, PersonaSurfaceControls as F } from "./chrome/PersonaSurfaceControls.js";
28
+ import { ProductSideNav as I } from "./chrome/ProductSideNav.js";
29
+ import { BrandMark as L } from "./chrome/BrandMark.js";
30
+ import { DynamicFooter as R } from "./chrome/DynamicFooter.js";
31
+ import { PanelTabs as z } from "./chrome/PanelTabs.js";
32
+ import { PanelContainer as B } from "./chrome/PanelContainer.js";
33
+ import { StatusBar as V } from "./chrome/StatusBar.js";
34
+ import { PluginRoutes as H } from "./chrome/PluginRoutes.js";
35
+ import { PluginSettingsPage as U } from "./chrome/PluginSettingsPage.js";
36
+ import { PluginToolbar as W } from "./chrome/PluginToolbar.js";
37
+ import { PluginWidgetGrid as G } from "./chrome/PluginWidgetGrid.js";
38
+ import { PluginContextMenuTarget as K } from "./chrome/PluginContextMenuTarget.js";
39
+ import { ThemePreferences as q } from "./chrome/ThemePreferences.js";
40
+ export { w as AccountSwitcher, t as AppShellLayout, T as AutoBreadcrumbs, L as BrandMark, f as Breadcrumbs, d as CommandPalette, y as ContextSwitcher, o as DEFAULT_FOOTER_COLUMNS, s as DEFAULT_SOCIAL_LINKS, R as DynamicFooter, c as Footer, i as FooterBar, b as GeographySwitcher, u as GlobalSearch, r as HeaderBar, S as LanguagePickerSheet, v as LanguageSwitcher, O as NAV_MORE_ID_PREFIX, N as NavCustomizeDialog, p as NavLink, x as NotificationCenter, n as PageHeader, B as PanelContainer, z as PanelTabs, P as PersonaSimulationPill, F as PersonaSurfaceControls, K as PluginContextMenuTarget, a as PluginFooterStrip, H as PluginRoutes, U as PluginSettingsPage, W as PluginToolbar, G as PluginWidgetGrid, C as ProductPickerSheet, I as ProductSideNav, _ as ProductSwitcher, g as ProfileSwitcher, e as ShortcutHelpDialog, l as SideNavigation, h as Sidebar, V as StatusBar, m as Tabs, q as ThemePreferences, k as applyNavVisibility, A as applyPermissionFilter, j as applySurfaceVisibility, M as isItemEffectivelyShown, E as registerBreadcrumbName, D as unregisterBreadcrumbName };
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAmBf,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AA0D1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CA+xBpD,CAAC"}
1
+ {"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAmBf,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AA0D1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAoyBpD,CAAC"}
@@ -332,10 +332,10 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
332
332
  }) : null
333
333
  ]
334
334
  }) : null, /* @__PURE__ */ l("div", {
335
- className: "flex min-w-0 flex-1 flex-col",
335
+ className: "flex min-h-0 min-w-0 flex-1 flex-col",
336
336
  children: [
337
337
  /* @__PURE__ */ l("div", {
338
- className: "flex items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
338
+ className: "flex shrink-0 items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
339
339
  children: [/* @__PURE__ */ l("div", {
340
340
  className: "flex min-w-0 items-center gap-2",
341
341
  children: [G && K && !Ae ? /* @__PURE__ */ l("button", {
@@ -367,7 +367,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
367
367
  role: "tablist",
368
368
  "aria-label": "Assistant mode",
369
369
  "data-testid": "assistant-mode-switcher",
370
- className: "flex items-center gap-1 border-b border-border-subtle bg-bg-surface px-3 py-2",
370
+ className: "flex shrink-0 items-center gap-1 border-b border-border-subtle bg-bg-surface px-3 py-2",
371
371
  children: y.map((t) => {
372
372
  let n = t.id === b;
373
373
  return /* @__PURE__ */ c("button", {
@@ -422,7 +422,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
422
422
  }),
423
423
  S.downloadArtifact && Me.length > 0 ? /* @__PURE__ */ c("div", {
424
424
  "data-testid": "assistant-widget-artifacts",
425
- className: "flex flex-wrap gap-1.5 border-t border-border-subtle bg-bg-sunken px-3 py-2",
425
+ className: "flex shrink-0 flex-wrap gap-1.5 border-t border-border-subtle bg-bg-sunken px-3 py-2",
426
426
  children: Me.map((e) => {
427
427
  let t = z === e.path;
428
428
  return /* @__PURE__ */ l("button", {
@@ -440,7 +440,7 @@ var m = ({ transport: d, modes: f, defaultModeId: m, title: h = "AI Assistant",
440
440
  })
441
441
  }) : null,
442
442
  /* @__PURE__ */ l("div", {
443
- className: "flex items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
443
+ className: "flex shrink-0 items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
444
444
  children: [
445
445
  q.isSupported ? /* @__PURE__ */ c("button", {
446
446
  type: "button",
@@ -13,6 +13,15 @@ export interface NavItem {
13
13
  exact?: boolean;
14
14
  /** Plugin that registered this item. Set automatically by the plugin runtime. */
15
15
  pluginId?: string;
16
+ /**
17
+ * RBAC permission(s) required to see this item ("resource:action" form,
18
+ * e.g. "healthybowl_farm:read"). An array means ANY match shows the item.
19
+ * When the caller's effective permissions are loaded and none match, the
20
+ * item is hard-hidden (no user toggle — the backend would reject the page
21
+ * anyway). Omit for items visible to every authenticated user.
22
+ * UI shaping only: the gateway `@rbac` layer stays the enforcement point.
23
+ */
24
+ requiredPermission?: string | string[];
16
25
  }
17
26
  interface NavRegistryStore {
18
27
  items: NavItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"useNavRegistry.d.ts","sourceRoot":"","sources":["../../../../src/shared/hooks/shell/useNavRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,+EAa7B,CAAC"}
1
+ {"version":3,"file":"useNavRegistry.d.ts","sourceRoot":"","sources":["../../../../src/shared/hooks/shell/useNavRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxC;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,+EAa7B,CAAC"}
@@ -69,6 +69,13 @@ export interface PermissionContextValue {
69
69
  invalidatePermissions: () => Promise<void>;
70
70
  /** Current scope ID */
71
71
  scopeId: string | null;
72
+ /**
73
+ * True when the authenticated actor is a platform super admin and every
74
+ * check above short-circuits to `true`. Consumers that need to know the
75
+ * difference between "allowed by role" and "allowed by bypass" (e.g. the
76
+ * persona-surface role simulator) read this instead of re-deriving it.
77
+ */
78
+ isSuperAdmin: boolean;
72
79
  /** Raw query result for advanced usage */
73
80
  query: UseQueryResult<EffectivePermissions, Error>;
74
81
  }
@@ -200,6 +207,12 @@ debug, }: PermissionProviderProps): import("react/jsx-runtime").JSX.Element;
200
207
  * ```
201
208
  */
202
209
  export declare function usePermissions(): PermissionContextValue;
210
+ /**
211
+ * Like `usePermissions`, but returns `null` outside a PermissionProvider
212
+ * instead of throwing. For chrome components (e.g. ProductSideNav) that must
213
+ * keep working in shells that haven't mounted RBAC yet.
214
+ */
215
+ export declare function useSafePermissions(): PermissionContextValue | null;
203
216
  /**
204
217
  * Hook to check a single permission
205
218
  *
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PermissionProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PermissionProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PermissionProvider.tsx"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { createContext as n, use as r, useCallback as i, useEffect as a, useMemo
4
4
  import { jsx as s } from "react/jsx-runtime";
5
5
  import { useQuery as c, useQueryClient as l } from "@tanstack/react-query";
6
6
  //#region src/shared/providers/shell/PermissionProvider.tsx
7
- var u = n(null), d = "SUPER_ADMIN", f = "super_admin", p = "\n query MyPermissions($scopeId: String!) {\n myPermissions(scopeId: $scopeId) {\n actorId\n scopeId\n permissions {\n resourceType\n level\n allowedActions\n }\n }\n }\n";
7
+ var u = n(null), d = "SUPER_ADMIN", f = "super_admin", p = "\n query MyPermissions($scopeId: String!) {\n myPermissions(scopeId: $scopeId) {\n actorId\n scopeId\n roles\n permissions {\n resourceType\n level\n allowedActions\n }\n }\n }\n";
8
8
  function m(e) {
9
9
  let t = e.permissionStrings ?? e.permissions.flatMap((e) => {
10
10
  let t = [];
@@ -131,6 +131,7 @@ function y({ children: n, scopeId: r, gateway: d = "workspace", staleTime: f = 3
131
131
  refreshPermissions: H,
132
132
  invalidatePermissions: U,
133
133
  scopeId: r,
134
+ isSuperAdmin: E,
134
135
  query: j
135
136
  }), [
136
137
  I,
@@ -157,17 +158,20 @@ function b() {
157
158
  if (!e) throw Error("usePermissions must be used within a PermissionProvider");
158
159
  return e;
159
160
  }
160
- function x(e) {
161
+ function x() {
162
+ return r(u);
163
+ }
164
+ function S(e) {
161
165
  let { hasPermission: t, isLoading: n } = b();
162
166
  return n ? !1 : t(e);
163
167
  }
164
- function S(e) {
168
+ function C(e) {
165
169
  let { hasRole: t, isLoading: n } = b();
166
170
  return n ? !1 : t(e);
167
171
  }
168
- function C() {
172
+ function w() {
169
173
  let { isLoading: e } = b();
170
174
  return e;
171
175
  }
172
176
  //#endregion
173
- export { y as PermissionProvider, f as SUPER_ADMIN_ACTOR_TYPE, d as SUPER_ADMIN_ROLE, g as hasMatchingPermission, _ as isSuperAdminBypass, h as matchPermission, x as usePermission, C as usePermissionLoading, b as usePermissions, S as useRole };
177
+ export { y as PermissionProvider, f as SUPER_ADMIN_ACTOR_TYPE, d as SUPER_ADMIN_ROLE, g as hasMatchingPermission, _ as isSuperAdminBypass, h as matchPermission, S as usePermission, w as usePermissionLoading, b as usePermissions, C as useRole, x as useSafePermissions };
@@ -0,0 +1,119 @@
1
+ import { ReactNode } from 'react';
2
+ export interface PersonaSurfaceDefinition {
3
+ /** Stable surface id, e.g. "farmer". Must not be "everything" (reserved). */
4
+ id: string;
5
+ /** Display label, e.g. "Farmer". */
6
+ label: string;
7
+ /** One-line description shown in pickers. */
8
+ description?: string;
9
+ /**
10
+ * Managed role template keys this surface represents
11
+ * (e.g. "product.healthybowl.farmer"). Used to match simulated roles,
12
+ * whose templateKey is known; also serves as documentation of identity.
13
+ */
14
+ templateKeys?: string[];
15
+ /**
16
+ * Role display names this surface matches against the caller's
17
+ * `myPermissions.roles` (the RBAC API exposes role NAMES to members, not
18
+ * template keys). List every managed role name that should get this
19
+ * surface, e.g. ["HealthyBowl Farmer"].
20
+ */
21
+ roleNames: string[];
22
+ /** Landing path for this persona (used by shells for post-login redirect). */
23
+ homePath?: string;
24
+ /**
25
+ * Nav item ids shown BY DEFAULT for this surface. Listing a parent/group id
26
+ * shows the parent and all of its children; a child id can be listed alone
27
+ * to show it under a soft-hidden parent. Every permitted item NOT covered
28
+ * here is soft-hidden (collapsed behind "N more…", user-toggleable) —
29
+ * never removed.
30
+ */
31
+ visibleItems: string[];
32
+ /** Optional per-item label overrides (persona vocabulary), keyed by item id. */
33
+ labelOverrides?: Record<string, string>;
34
+ }
35
+ /** Reserved surface id meaning "no curation — show everything permitted". */
36
+ export declare const EVERYTHING_SURFACE_ID = "everything";
37
+ export type NavItemOverrideState = 'shown' | 'hidden';
38
+ export interface SimulatableRole {
39
+ id: string;
40
+ name: string;
41
+ templateKey: string | null;
42
+ priority: number;
43
+ defaultPermissions: Array<{
44
+ resourceType: string;
45
+ level: 'ADMIN' | 'EDITOR' | 'VIEWER' | 'NONE';
46
+ }>;
47
+ }
48
+ export interface SimulationState {
49
+ roleId: string;
50
+ roleName: string;
51
+ templateKey: string | null;
52
+ /**
53
+ * Permission strings synthesized from the role's default permission levels
54
+ * using the fleet default action matrix. A UI approximation for nav
55
+ * preview — per-resource action overrides are not reflected.
56
+ */
57
+ permissionStrings: string[];
58
+ }
59
+ export interface PersonaSurfaceContextValue {
60
+ /** All surfaces the product defines (excluding the built-in Everything). */
61
+ surfaces: PersonaSurfaceDefinition[];
62
+ /** The surface currently applied ("everything" when uncurated). */
63
+ activeSurfaceId: string;
64
+ /** Definition of the applied surface; null when Everything. */
65
+ activeSurface: PersonaSurfaceDefinition | null;
66
+ /** What the user's roles resolve to before any manual override. */
67
+ resolvedSurfaceId: string;
68
+ /** Surface ids the current user qualifies for (own roles), for the picker. */
69
+ availableSurfaceIds: string[];
70
+ /** Pick a surface manually; null clears the override (back to resolved). */
71
+ setSurfaceId: (id: string | null) => void;
72
+ /** Per-item user visibility overrides (sparse; wins over surface defaults). */
73
+ overrides: Record<string, NavItemOverrideState>;
74
+ setItemOverride: (itemId: string, state: NavItemOverrideState | null) => void;
75
+ resetOverrides: () => void;
76
+ /** Customize-menu dialog open state (rendered by ProductSideNav). */
77
+ customizeOpen: boolean;
78
+ setCustomizeOpen: (open: boolean) => void;
79
+ /** Role simulation (admins / super admins only). */
80
+ canSimulate: boolean;
81
+ simulation: SimulationState | null;
82
+ startSimulation: (role: SimulatableRole) => void;
83
+ stopSimulation: () => void;
84
+ simulatableRoles: SimulatableRole[];
85
+ simulatableRolesLoading: boolean;
86
+ /** Lazily fetch the workspace role catalog for the simulation picker. */
87
+ loadSimulatableRoles: () => void;
88
+ }
89
+ export declare function synthesizeSimulatedPermissionStrings(role: SimulatableRole): string[];
90
+ /**
91
+ * Resolve which surface the user's role names map to. Surfaces are checked in
92
+ * array order — list the most privileged surface first so a user holding
93
+ * several product roles lands on the broader one.
94
+ */
95
+ export declare function resolveSurfaceForRoles(surfaces: PersonaSurfaceDefinition[], roleNames: string[]): string;
96
+ export interface PersonaSurfaceProviderProps {
97
+ children: ReactNode;
98
+ /** The product's surface definitions, most privileged first. */
99
+ surfaces: PersonaSurfaceDefinition[];
100
+ /**
101
+ * Stable product key used to namespace persisted preferences
102
+ * (e.g. "healthybowl").
103
+ */
104
+ productKey: string;
105
+ /**
106
+ * Gateway used to fetch simulatable roles.
107
+ * @default 'workspace'
108
+ */
109
+ gateway?: 'workspace' | 'global';
110
+ }
111
+ export declare function PersonaSurfaceProvider({ children, surfaces, productKey, gateway, }: PersonaSurfaceProviderProps): import("react/jsx-runtime").JSX.Element;
112
+ /** Access the persona surface context; throws outside the provider. */
113
+ export declare function usePersonaSurface(): PersonaSurfaceContextValue;
114
+ /**
115
+ * Like `usePersonaSurface` but returns `null` outside the provider, so chrome
116
+ * components degrade gracefully in shells that haven't adopted surfaces yet.
117
+ */
118
+ export declare function useSafePersonaSurface(): PersonaSurfaceContextValue | null;
119
+ //# sourceMappingURL=PersonaSurfaceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaSurfaceProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/PersonaSurfaceProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ import { graphqlFetch as e } from "../../graphql/fetch.js";
2
+ import { useSafePermissions as t } from "./PermissionProvider.js";
3
+ import { createContext as n, use as r, useCallback as i, useEffect as a, useMemo as o, useState as s } from "react";
4
+ import { jsx as c } from "react/jsx-runtime";
5
+ import { useQuery as l } from "@tanstack/react-query";
6
+ //#region src/shared/providers/shell/PersonaSurfaceProvider.tsx
7
+ var u = "everything", d = n(null), f = [
8
+ "read",
9
+ "list",
10
+ "download",
11
+ "join",
12
+ "leave",
13
+ "vote"
14
+ ], p = [
15
+ ...f,
16
+ "create",
17
+ "update",
18
+ "share",
19
+ "execute",
20
+ "export",
21
+ "clone",
22
+ "import",
23
+ "archive",
24
+ "assign",
25
+ "cancel",
26
+ "upload",
27
+ "sync"
28
+ ];
29
+ function m(e) {
30
+ let t = [];
31
+ for (let n of e.defaultPermissions) {
32
+ if (n.level === "NONE") continue;
33
+ if (n.level === "ADMIN") {
34
+ t.push(`${n.resourceType}:*`);
35
+ continue;
36
+ }
37
+ let e = n.level === "EDITOR" ? p : f;
38
+ for (let r of e) t.push(`${n.resourceType}:${r}`);
39
+ }
40
+ return t;
41
+ }
42
+ function h(e, t) {
43
+ if (t.length === 0) return u;
44
+ let n = new Set(t);
45
+ for (let t of e) if (t.roleNames.some((e) => n.has(e))) return t.id;
46
+ return u;
47
+ }
48
+ function g(e, t) {
49
+ if (t.templateKey) {
50
+ for (let n of e) if (n.templateKeys?.includes(t.templateKey)) return n.id;
51
+ }
52
+ return h(e, [t.roleName]);
53
+ }
54
+ function _(e, t) {
55
+ return `boff-persona:${e}:${t ?? "no-scope"}`;
56
+ }
57
+ function v(e) {
58
+ if (typeof window > "u") return {};
59
+ try {
60
+ let t = window.localStorage.getItem(e);
61
+ if (!t) return {};
62
+ let n = JSON.parse(t);
63
+ return !n || typeof n != "object" ? {} : n;
64
+ } catch {
65
+ return {};
66
+ }
67
+ }
68
+ function y(e, t) {
69
+ if (!(typeof window > "u")) try {
70
+ !t.surfaceId && Object.keys(t.overrides ?? {}).length === 0 ? window.localStorage.removeItem(e) : window.localStorage.setItem(e, JSON.stringify(t));
71
+ } catch {}
72
+ }
73
+ var b = "\n query NavSimulatableRoles($scopeId: String!) {\n roles(scopeId: $scopeId) {\n id\n name\n templateKey\n priority\n defaultPermissions {\n resourceType\n level\n }\n }\n }\n";
74
+ function x({ children: n, surfaces: r, productKey: f, gateway: p = "workspace" }) {
75
+ let x = t(), S = x?.scopeId ?? null, C = _(f, S), [w, T] = s(() => v(C));
76
+ a(() => {
77
+ T(v(C));
78
+ }, [C]);
79
+ let E = i((e) => {
80
+ T((t) => {
81
+ let n = e(t);
82
+ return y(C, n), n;
83
+ });
84
+ }, [C]), [D, O] = s(null), [k, A] = s(!1);
85
+ a(() => {
86
+ O(null), A(!1);
87
+ }, [S]);
88
+ let j = x?.isSuperAdmin ?? !1, M = !!x && (j || x.hasPermission("rbac:read")), N = l({
89
+ queryKey: [
90
+ "persona-simulatable-roles",
91
+ p,
92
+ S
93
+ ],
94
+ queryFn: async () => {
95
+ let t = await e({
96
+ query: b,
97
+ variables: { scopeId: S },
98
+ gateway: p
99
+ });
100
+ if (t.errors?.length) throw Error(t.errors[0].message);
101
+ return [...t.data?.roles ?? []].sort((e, t) => t.priority - e.priority);
102
+ },
103
+ enabled: k && M && !!S,
104
+ staleTime: 300 * 1e3
105
+ }), P = i(() => {
106
+ A(!0);
107
+ }, []), F = i((e) => {
108
+ O({
109
+ roleId: e.id,
110
+ roleName: e.name,
111
+ templateKey: e.templateKey,
112
+ permissionStrings: m(e)
113
+ });
114
+ }, []), I = i(() => {
115
+ O(null);
116
+ }, []), L = o(() => x?.permissions?.roles ?? [], [x?.permissions?.roles]), R = o(() => D ? g(r, D) : h(r, L), [
117
+ r,
118
+ D,
119
+ L
120
+ ]), z = o(() => {
121
+ if (D) return R;
122
+ let e = w.surfaceId;
123
+ return e && (e === "everything" || r.some((t) => t.id === e)) ? e : R;
124
+ }, [
125
+ D,
126
+ R,
127
+ w.surfaceId,
128
+ r
129
+ ]), B = o(() => r.find((e) => e.id === z) ?? null, [r, z]), V = o(() => {
130
+ let e = new Set(L);
131
+ return [...r.filter((t) => j || t.roleNames.some((t) => e.has(t))).map((e) => e.id), u];
132
+ }, [
133
+ r,
134
+ j,
135
+ L
136
+ ]), H = i((e) => {
137
+ E((t) => ({
138
+ ...t,
139
+ surfaceId: e ?? void 0
140
+ }));
141
+ }, [E]), U = o(() => w.overrides ?? {}, [w.overrides]), W = i((e, t) => {
142
+ E((n) => {
143
+ let r = { ...n.overrides ?? {} };
144
+ return t === null ? delete r[e] : r[e] = t, {
145
+ ...n,
146
+ overrides: r
147
+ };
148
+ });
149
+ }, [E]), G = i(() => {
150
+ E((e) => ({
151
+ ...e,
152
+ overrides: {}
153
+ }));
154
+ }, [E]), [K, q] = s(!1), J = o(() => ({
155
+ surfaces: r,
156
+ activeSurfaceId: z,
157
+ activeSurface: B,
158
+ resolvedSurfaceId: R,
159
+ availableSurfaceIds: V,
160
+ setSurfaceId: H,
161
+ overrides: U,
162
+ setItemOverride: W,
163
+ resetOverrides: G,
164
+ customizeOpen: K,
165
+ setCustomizeOpen: q,
166
+ canSimulate: M,
167
+ simulation: D,
168
+ startSimulation: F,
169
+ stopSimulation: I,
170
+ simulatableRoles: N.data ?? [],
171
+ simulatableRolesLoading: N.isLoading && k,
172
+ loadSimulatableRoles: P
173
+ }), [
174
+ r,
175
+ z,
176
+ B,
177
+ R,
178
+ V,
179
+ H,
180
+ U,
181
+ W,
182
+ G,
183
+ K,
184
+ M,
185
+ D,
186
+ F,
187
+ I,
188
+ N.data,
189
+ N.isLoading,
190
+ k,
191
+ P
192
+ ]);
193
+ return /* @__PURE__ */ c(d.Provider, {
194
+ value: J,
195
+ children: n
196
+ });
197
+ }
198
+ function S() {
199
+ let e = r(d);
200
+ if (!e) throw Error("usePersonaSurface must be used within a PersonaSurfaceProvider");
201
+ return e;
202
+ }
203
+ function C() {
204
+ return r(d);
205
+ }
206
+ //#endregion
207
+ export { u as EVERYTHING_SURFACE_ID, x as PersonaSurfaceProvider, h as resolveSurfaceForRoles, m as synthesizeSimulatedPermissionStrings, S as usePersonaSurface, C as useSafePersonaSurface };
@@ -23,8 +23,10 @@ export { ContextManagerProvider, useContextManager } from './ContextManagerProvi
23
23
  export type { ContextManagerValue, ContextManagerProviderProps } from './ContextManagerProvider';
24
24
  export { GeographyProvider, useGeography } from '../../geography/GeographyProvider';
25
25
  export type { GeographyContextValue, GeographyProviderProps, } from '../../geography/GeographyProvider';
26
- export { PermissionProvider, usePermissions, usePermission, useRole, usePermissionLoading, matchPermission, hasMatchingPermission, isSuperAdminBypass, SUPER_ADMIN_ROLE, SUPER_ADMIN_ACTOR_TYPE, } from './PermissionProvider';
26
+ export { PermissionProvider, usePermissions, useSafePermissions, usePermission, useRole, usePermissionLoading, matchPermission, hasMatchingPermission, isSuperAdminBypass, SUPER_ADMIN_ROLE, SUPER_ADMIN_ACTOR_TYPE, } from './PermissionProvider';
27
27
  export type { EffectivePermissions, EffectiveResourcePermission, MyRolesResult, RoleInfo, PermissionCheckOptions, PermissionContextValue, PermissionProviderProps, } from './PermissionProvider';
28
+ export { PersonaSurfaceProvider, usePersonaSurface, useSafePersonaSurface, resolveSurfaceForRoles, synthesizeSimulatedPermissionStrings, EVERYTHING_SURFACE_ID, } from './PersonaSurfaceProvider';
29
+ export type { PersonaSurfaceDefinition, PersonaSurfaceContextValue, PersonaSurfaceProviderProps, NavItemOverrideState, SimulatableRole, SimulationState, } from './PersonaSurfaceProvider';
28
30
  export { AuthTokenProvider, useAuthToken } from './AuthTokenProvider';
29
31
  export type { AuthTokenContextValue, AuthTokenProviderProps } from './AuthTokenProvider';
30
32
  export { MultiGatewayProvider } from './MultiGatewayProvider';