@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,23 @@
1
+ /**
2
+ * NavCustomizeDialog — "Customize menu" for persona surfaces.
3
+ *
4
+ * Shows the FULL RBAC-permitted nav tree with a visibility toggle per item.
5
+ * Hard-hidden (RBAC-removed) items never appear here — there is nothing
6
+ * usable to reveal. Toggles write sparse per-item overrides that win over
7
+ * the active surface's defaults; flipping an item back to its surface
8
+ * default clears its override so the item keeps following future surface
9
+ * improvements. Also hosts the surface picker and (for workspace admins /
10
+ * super admins) the role-simulation picker, so every control is reachable
11
+ * from the collapsed rail and from mobile.
12
+ *
13
+ * Rendered by ProductSideNav; opens via PersonaSurfaceControls.
14
+ */
15
+ export interface NavCustomizeDialogProps {
16
+ /** Group labels, reused from the sidebar so sections read identically. */
17
+ groupLabels?: Record<string, string>;
18
+ /** Group ordering, reused from the sidebar. */
19
+ groupOrder?: string[];
20
+ everythingLabel?: string;
21
+ }
22
+ export declare function NavCustomizeDialog({ groupLabels, groupOrder, everythingLabel, }: NavCustomizeDialogProps): import("react/jsx-runtime").JSX.Element | null;
23
+ //# sourceMappingURL=NavCustomizeDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavCustomizeDialog.d.ts","sourceRoot":"","sources":["../../src/chrome/NavCustomizeDialog.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwBH,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA6DD,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,UAAU,EACV,eAA8B,GAC/B,EAAE,uBAAuB,kDAuNzB"}
@@ -0,0 +1,188 @@
1
+ import { ResponsiveDialog as e, ResponsiveDialogContent as t, ResponsiveDialogDescription as n, ResponsiveDialogHeader as r, ResponsiveDialogTitle as i } from "../ui/responsive-dialog.js";
2
+ import { useNavRegistryStore as a } from "../shared/hooks/shell/useNavRegistry.js";
3
+ import { Switch as o } from "../ui/switch.js";
4
+ import { useSafePermissions as s } from "../shared/providers/shell/PermissionProvider.js";
5
+ import { useSafePersonaSurface as c } from "../shared/providers/shell/PersonaSurfaceProvider.js";
6
+ import { applyPermissionFilter as l, isItemEffectivelyShown as u } from "./sideNavigation/navVisibility.js";
7
+ import { useMemo as d } from "react";
8
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
9
+ //#region src/chrome/NavCustomizeDialog.tsx
10
+ function h({ item: e, depth: t, parentShown: n, surfaceVisibleItems: r, overrides: i, onToggle: a }) {
11
+ let s = u(e, n, r, i), c = s && (!r || r.includes(e.id) || i[e.id] === "shown");
12
+ return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ m("div", {
13
+ className: "flex items-center justify-between gap-3 py-1.5",
14
+ style: { paddingLeft: t * 16 },
15
+ children: [/* @__PURE__ */ p("span", {
16
+ className: `truncate text-body-sm ${s ? "text-text-primary" : "text-text-muted"}`,
17
+ children: e.label
18
+ }), /* @__PURE__ */ p(o, {
19
+ checked: s,
20
+ onCheckedChange: (t) => a(e, n, t === !0),
21
+ "aria-label": `Show ${e.label} in the menu`,
22
+ "data-testid": `persona-toggle-${e.id}`
23
+ })]
24
+ }), e.children?.map((e) => /* @__PURE__ */ p(h, {
25
+ item: e,
26
+ depth: t + 1,
27
+ parentShown: c,
28
+ surfaceVisibleItems: r,
29
+ overrides: i,
30
+ onToggle: a
31
+ }, e.id))] });
32
+ }
33
+ function g({ groupLabels: o, groupOrder: f, everythingLabel: g = "Everything" }) {
34
+ let _ = c(), v = s(), y = a((e) => e.items), b = v?.hasPermission, x = v?.isLoading ?? !1, S = d(() => {
35
+ let e = y.filter((e) => e.visible !== !1);
36
+ return !b || x ? e : l(e, b);
37
+ }, [
38
+ y,
39
+ b,
40
+ x
41
+ ]), C = d(() => {
42
+ let e = /* @__PURE__ */ new Map();
43
+ for (let t of S) {
44
+ let n = t.group ?? "__default__", r = e.get(n);
45
+ r ? r.push(t) : e.set(n, [t]);
46
+ }
47
+ return [...f ?? [], ...Array.from(e.keys()).filter((e) => !(f ?? []).includes(e))].filter((t) => (e.get(t)?.length ?? 0) > 0).map((t) => ({
48
+ key: t,
49
+ label: t === "__default__" ? null : o?.[t] ?? t,
50
+ items: e.get(t) ?? []
51
+ }));
52
+ }, [
53
+ S,
54
+ f,
55
+ o
56
+ ]);
57
+ if (!_) return null;
58
+ let { surfaces: w, activeSurfaceId: T, activeSurface: E, resolvedSurfaceId: D, availableSurfaceIds: O, setSurfaceId: k, overrides: A, setItemOverride: j, resetOverrides: M, customizeOpen: N, setCustomizeOpen: P, canSimulate: F, simulation: I, startSimulation: L, stopSimulation: R, simulatableRoles: z, simulatableRolesLoading: B, loadSimulatableRoles: V } = _, H = E ? E.visibleItems : null, U = (e, t, n) => {
59
+ let r = u(e, t, H, {});
60
+ j(e.id, n === r ? null : n ? "shown" : "hidden");
61
+ }, W = Object.keys(A).length, G = O.map((e) => ({
62
+ id: e,
63
+ label: e === "everything" ? g : w.find((t) => t.id === e)?.label ?? e
64
+ }));
65
+ return /* @__PURE__ */ p(e, {
66
+ open: N,
67
+ onOpenChange: P,
68
+ children: /* @__PURE__ */ m(t, {
69
+ className: "max-h-[85vh] overflow-y-auto sm:max-w-lg",
70
+ children: [/* @__PURE__ */ m(r, { children: [/* @__PURE__ */ p(i, { children: "Customize menu" }), /* @__PURE__ */ p(n, { children: "Choose which pages appear in your sidebar. Hidden pages stay one click away under “more” and in search — nothing is removed." })] }), /* @__PURE__ */ m("div", {
71
+ className: "space-y-5",
72
+ children: [
73
+ /* @__PURE__ */ m("section", {
74
+ className: "space-y-2",
75
+ children: [
76
+ /* @__PURE__ */ p("h3", {
77
+ className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
78
+ children: "Menu view"
79
+ }),
80
+ /* @__PURE__ */ m("select", {
81
+ value: T,
82
+ onChange: (e) => {
83
+ let t = e.target.value;
84
+ k(t === D ? null : t);
85
+ },
86
+ disabled: !!I,
87
+ className: "w-full rounded-button border border-border-subtle bg-bg-canvas px-3 py-2 text-body-sm text-text-primary disabled:opacity-60",
88
+ "data-testid": "persona-dialog-surface-select",
89
+ children: [G.map((e) => /* @__PURE__ */ p("option", {
90
+ value: e.id,
91
+ children: e.label
92
+ }, e.id)), !G.some((e) => e.id === T) && /* @__PURE__ */ p("option", {
93
+ value: T,
94
+ children: w.find((e) => e.id === T)?.label ?? T
95
+ })]
96
+ }),
97
+ T !== D && !I && /* @__PURE__ */ p("button", {
98
+ type: "button",
99
+ onClick: () => k(null),
100
+ className: "text-body-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
101
+ "data-testid": "persona-dialog-surface-reset",
102
+ children: "Reset to my role’s view"
103
+ })
104
+ ]
105
+ }),
106
+ F && /* @__PURE__ */ m("section", {
107
+ className: "space-y-2",
108
+ children: [
109
+ /* @__PURE__ */ p("h3", {
110
+ className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
111
+ children: "Simulate a role (admin preview)"
112
+ }),
113
+ /* @__PURE__ */ m("select", {
114
+ value: I?.roleId ?? "",
115
+ onFocus: V,
116
+ onChange: (e) => {
117
+ let t = e.target.value;
118
+ if (!t) {
119
+ R();
120
+ return;
121
+ }
122
+ let n = z.find((e) => e.id === t);
123
+ n && L(n);
124
+ },
125
+ className: "w-full rounded-button border border-border-subtle bg-bg-canvas px-3 py-2 text-body-sm text-text-primary",
126
+ "data-testid": "persona-dialog-simulate-select",
127
+ children: [/* @__PURE__ */ p("option", {
128
+ value: "",
129
+ children: B ? "Loading roles…" : "Not simulating"
130
+ }), z.map((e) => /* @__PURE__ */ p("option", {
131
+ value: e.id,
132
+ children: e.name
133
+ }, e.id))]
134
+ }),
135
+ /* @__PURE__ */ p("p", {
136
+ className: "text-body-sm text-text-muted",
137
+ children: "Preview the menu another role sees. Your own access is unchanged."
138
+ })
139
+ ]
140
+ }),
141
+ /* @__PURE__ */ m("section", {
142
+ className: "space-y-1",
143
+ "data-testid": "persona-dialog-items",
144
+ children: [/* @__PURE__ */ m("div", {
145
+ className: "flex items-center justify-between",
146
+ children: [/* @__PURE__ */ p("h3", {
147
+ className: "text-[11px] font-medium uppercase tracking-wider text-text-muted",
148
+ children: "Menu items"
149
+ }), W > 0 && /* @__PURE__ */ m("button", {
150
+ type: "button",
151
+ onClick: M,
152
+ className: "text-body-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
153
+ "data-testid": "persona-dialog-reset-overrides",
154
+ children: [
155
+ "Reset ",
156
+ W,
157
+ " change",
158
+ W === 1 ? "" : "s"
159
+ ]
160
+ })]
161
+ }), I ? /* @__PURE__ */ p("p", {
162
+ className: "py-2 text-body-sm text-text-muted",
163
+ children: "Exit role simulation to customize your own menu."
164
+ }) : C.map((e) => /* @__PURE__ */ m("div", {
165
+ className: "pt-2",
166
+ children: [e.label && /* @__PURE__ */ p("p", {
167
+ className: "pb-1 text-[11px] font-medium uppercase tracking-wider text-text-muted",
168
+ children: e.label
169
+ }), /* @__PURE__ */ p("div", {
170
+ className: "divide-y divide-border-subtle",
171
+ children: e.items.map((e) => /* @__PURE__ */ p(h, {
172
+ item: e,
173
+ depth: 0,
174
+ parentShown: !1,
175
+ surfaceVisibleItems: H,
176
+ overrides: A,
177
+ onToggle: U
178
+ }, e.id))
179
+ })]
180
+ }, e.key))]
181
+ })
182
+ ]
183
+ })]
184
+ })
185
+ });
186
+ }
187
+ //#endregion
188
+ export { g as NavCustomizeDialog };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * PersonaSurfaceControls — sidebar-footer widget for persona surfaces.
3
+ *
4
+ * Rendered automatically by ProductSideNav when a PersonaSurfaceProvider is
5
+ * mounted. Expanded sidebar: a compact "Viewing" select (the surfaces the
6
+ * user qualifies for + Everything) and a Customize button. Collapsed rail:
7
+ * a single Customize icon button. During role simulation the select is
8
+ * replaced with the simulated role and an Exit control; a viewport-fixed
9
+ * pill (rendered by ProductSideNav OUTSIDE the aside, so backdrop-filter
10
+ * doesn't trap the fixed positioning) mirrors the state on all breakpoints.
11
+ */
12
+ export interface PersonaSurfaceControlsProps {
13
+ /** Label for the built-in uncurated surface. @default "Everything" */
14
+ everythingLabel?: string;
15
+ /** Customize button label (a11y). @default "Customize menu" */
16
+ customizeLabel?: string;
17
+ }
18
+ export declare function PersonaSurfaceControls({ everythingLabel, customizeLabel, }: PersonaSurfaceControlsProps): import("react/jsx-runtime").JSX.Element | null;
19
+ /**
20
+ * Viewport-fixed simulation indicator. Must be rendered OUTSIDE the sidebar
21
+ * `aside` (its backdrop-filter creates a containing block that would trap
22
+ * `position: fixed`). ProductSideNav renders it next to the nav.
23
+ */
24
+ export declare function PersonaSimulationPill(): import("react/jsx-runtime").JSX.Element | null;
25
+ //# sourceMappingURL=PersonaSurfaceControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaSurfaceControls.d.ts","sourceRoot":"","sources":["../../src/chrome/PersonaSurfaceControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,eAA8B,EAC9B,cAAiC,GAClC,EAAE,2BAA2B,kDAyG7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,mDAyBpC"}
@@ -0,0 +1,110 @@
1
+ import { useShellUi as e } from "../shared/providers/shell/ShellUiProvider.js";
2
+ import { useSafePersonaSurface as t } from "../shared/providers/shell/PersonaSurfaceProvider.js";
3
+ import { Eye as n, SlidersHorizontal as r, X as i } from "lucide-react";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ //#region src/chrome/PersonaSurfaceControls.tsx
6
+ function s({ everythingLabel: s = "Everything", customizeLabel: c = "Customize menu" }) {
7
+ let l = t(), { sidebarCollapsed: u } = e();
8
+ if (!l) return null;
9
+ let { surfaces: d, activeSurfaceId: f, resolvedSurfaceId: p, availableSurfaceIds: m, setSurfaceId: h, setCustomizeOpen: g, simulation: _, stopSimulation: v } = l, y = /* @__PURE__ */ a("button", {
10
+ type: "button",
11
+ onClick: () => g(!0),
12
+ className: "p-2 rounded-button text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors flex-shrink-0",
13
+ "aria-label": c,
14
+ title: c,
15
+ "data-testid": "persona-customize-trigger",
16
+ children: /* @__PURE__ */ a(r, { className: "size-4" })
17
+ });
18
+ if (u) return /* @__PURE__ */ a("div", {
19
+ className: "hidden md:flex justify-center",
20
+ "data-testid": "persona-controls-collapsed",
21
+ children: y
22
+ });
23
+ if (_) return /* @__PURE__ */ o("div", {
24
+ className: "flex items-center gap-2 rounded-button bg-status-warning-bg-subtle px-2 py-1.5",
25
+ "data-testid": "persona-simulation-footer",
26
+ children: [
27
+ /* @__PURE__ */ a(n, { className: "size-4 flex-shrink-0 text-status-warning-text" }),
28
+ /* @__PURE__ */ o("div", {
29
+ className: "min-w-0 flex-1",
30
+ children: [/* @__PURE__ */ a("p", {
31
+ className: "text-[11px] uppercase tracking-wider text-status-warning-text",
32
+ children: "Simulating"
33
+ }), /* @__PURE__ */ a("p", {
34
+ className: "truncate text-body-sm font-medium text-text-primary",
35
+ children: _.roleName
36
+ })]
37
+ }),
38
+ /* @__PURE__ */ a("button", {
39
+ type: "button",
40
+ onClick: v,
41
+ className: "p-1.5 rounded-button text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors",
42
+ "aria-label": "Exit role simulation",
43
+ "data-testid": "persona-simulation-exit",
44
+ children: /* @__PURE__ */ a(i, { className: "size-4" })
45
+ })
46
+ ]
47
+ });
48
+ let b = m.map((e) => ({
49
+ id: e,
50
+ label: e === "everything" ? s : d.find((t) => t.id === e)?.label ?? e
51
+ }));
52
+ return /* @__PURE__ */ o("div", {
53
+ className: "flex items-center gap-1",
54
+ "data-testid": "persona-controls",
55
+ children: [/* @__PURE__ */ o("label", {
56
+ className: "min-w-0 flex-1",
57
+ children: [/* @__PURE__ */ a("span", {
58
+ className: "sr-only",
59
+ children: "Menu view"
60
+ }), /* @__PURE__ */ o("select", {
61
+ value: f,
62
+ onChange: (e) => {
63
+ let t = e.target.value;
64
+ h(t === p ? null : t);
65
+ },
66
+ className: "w-full truncate rounded-button border border-border-subtle bg-bg-canvas px-2 py-1.5 text-body-sm text-text-primary hover:bg-bg-sunken transition-colors",
67
+ "data-testid": "persona-surface-select",
68
+ children: [b.map((e) => /* @__PURE__ */ a("option", {
69
+ value: e.id,
70
+ children: e.label
71
+ }, e.id)), !b.some((e) => e.id === f) && /* @__PURE__ */ a("option", {
72
+ value: f,
73
+ children: d.find((e) => e.id === f)?.label ?? f
74
+ })]
75
+ })]
76
+ }), y]
77
+ });
78
+ }
79
+ function c() {
80
+ let e = t();
81
+ return e?.simulation ? /* @__PURE__ */ o("div", {
82
+ className: "fixed bottom-4 left-1/2 z-[120] -translate-x-1/2 flex max-w-[calc(100vw-2rem)] items-center gap-2 rounded-full border border-border-subtle bg-bg-canvas px-4 py-2 shadow-lg",
83
+ style: { marginBottom: "env(safe-area-inset-bottom)" },
84
+ role: "status",
85
+ "data-testid": "persona-simulation-pill",
86
+ children: [
87
+ /* @__PURE__ */ a(n, { className: "size-4 flex-shrink-0 text-status-warning-text" }),
88
+ /* @__PURE__ */ o("span", {
89
+ className: "truncate text-body-sm text-text-primary",
90
+ children: [
91
+ "Viewing as ",
92
+ /* @__PURE__ */ a("span", {
93
+ className: "font-semibold",
94
+ children: e.simulation.roleName
95
+ }),
96
+ " (simulated)"
97
+ ]
98
+ }),
99
+ /* @__PURE__ */ a("button", {
100
+ type: "button",
101
+ onClick: e.stopSimulation,
102
+ className: "rounded-full px-2 py-0.5 text-body-sm font-medium text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors",
103
+ "data-testid": "persona-simulation-pill-exit",
104
+ children: "Exit"
105
+ })
106
+ ]
107
+ }) : null;
108
+ }
109
+ //#endregion
110
+ export { c as PersonaSimulationPill, s as PersonaSurfaceControls };
@@ -1 +1 @@
1
- {"version":3,"file":"ProductSideNav.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSideNav.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQpD,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,IAAI,EAAE,SAAS,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,+BAA+B;IAC/B,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAiC,EACjC,aAA0B,GAC3B,EAAE,mBAAmB,2CAkErB"}
1
+ {"version":3,"file":"ProductSideNav.d.ts","sourceRoot":"","sources":["../../src/chrome/ProductSideNav.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgBpD,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,IAAI,EAAE,SAAS,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,+BAA+B;IAC/B,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAiC,EACjC,aAA0B,GAC3B,EAAE,mBAAmB,2CA2GrB"}
@@ -1,56 +1,89 @@
1
1
  import { useNavRegistryStore as e } from "../shared/hooks/shell/useNavRegistry.js";
2
- import { useShellUi as t } from "../shared/providers/shell/ShellUiProvider.js";
3
- import { appendContextToPath as n, useCurrentContextSearchParams as r } from "../shared/hooks/useCurrentContextSearchParams.js";
4
- import { SideNavigation as i } from "./SideNavigation.js";
5
- import { useMemo as a } from "react";
6
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
- import { useLocation as c, useNavigate as l } from "react-router-dom";
2
+ import { hasMatchingPermission as t, useSafePermissions as n } from "../shared/providers/shell/PermissionProvider.js";
3
+ import { useShellUi as r } from "../shared/providers/shell/ShellUiProvider.js";
4
+ import { useSafePersonaSurface as i } from "../shared/providers/shell/PersonaSurfaceProvider.js";
5
+ import { appendContextToPath as a, useCurrentContextSearchParams as o } from "../shared/hooks/useCurrentContextSearchParams.js";
6
+ import { SideNavigation as s } from "./SideNavigation.js";
7
+ import { applyNavVisibility as c } from "./sideNavigation/navVisibility.js";
8
+ import { NavCustomizeDialog as l } from "./NavCustomizeDialog.js";
9
+ import { PersonaSimulationPill as u, PersonaSurfaceControls as d } from "./PersonaSurfaceControls.js";
10
+ import { useMemo as f } from "react";
11
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
12
+ import { useLocation as g, useNavigate as _ } from "react-router-dom";
8
13
  //#region src/chrome/ProductSideNav.tsx
9
- function u({ logo: u, appName: d, groupOrder: f, groupLabels: p, mobileActions: m, customHeader: h, homeAriaLabel: g = "Go to dashboard", collapseLabel: _ = "Collapse" }) {
10
- let v = l(), y = c(), { sidebarCollapsed: b, toggleSidebar: x } = t(), S = r(), C = e((e) => e.items), w = a(() => C.filter((e) => e.visible !== !1).sort((e, t) => (e.order ?? 999) - (t.order ?? 999)), [C]), T = (e) => {
11
- v(n(e, S));
12
- }, E = () => {
13
- v(n("/", S));
14
- }, D = /* @__PURE__ */ s("div", {
14
+ function v({ logo: v, appName: y, groupOrder: b, groupLabels: x, mobileActions: S, customHeader: C, homeAriaLabel: w = "Go to dashboard", collapseLabel: T = "Collapse" }) {
15
+ let E = _(), D = g(), { sidebarCollapsed: O, toggleSidebar: k } = r(), A = o(), j = e((e) => e.items), M = n(), N = i(), P = N?.simulation ?? null, F = M?.hasPermission, I = !!M && !M.isLoading && !M.error, L = f(() => {
16
+ if (P) {
17
+ let e = P.permissionStrings;
18
+ return (n) => t(e, n);
19
+ }
20
+ if (I && F) return F;
21
+ }, [
22
+ P,
23
+ I,
24
+ F
25
+ ]), R = N?.activeSurface ?? null, z = N?.overrides, B = f(() => {
26
+ let { items: e } = c(j.filter((e) => e.visible !== !1).sort((e, t) => (e.order ?? 999) - (t.order ?? 999)), {
27
+ hasPermission: L,
28
+ surfaceVisibleItems: R ? R.visibleItems : null,
29
+ labelOverrides: R?.labelOverrides,
30
+ overrides: P ? {} : z
31
+ });
32
+ return e;
33
+ }, [
34
+ j,
35
+ L,
36
+ R,
37
+ z,
38
+ P
39
+ ]), V = (e) => {
40
+ E(a(e, A));
41
+ }, H = () => {
42
+ E(a("/", A));
43
+ }, U = /* @__PURE__ */ h("div", {
15
44
  className: "flex items-center gap-icon-gap cursor-pointer",
16
- onClick: E,
45
+ onClick: H,
17
46
  role: "button",
18
47
  tabIndex: 0,
19
48
  onKeyDown: (e) => {
20
- (e.key === "Enter" || e.key === " ") && (e.preventDefault(), E());
49
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), H());
21
50
  },
22
- "aria-label": g,
23
- children: [typeof u == "string" ? /* @__PURE__ */ o("div", {
51
+ "aria-label": w,
52
+ children: [typeof v == "string" ? /* @__PURE__ */ m("div", {
24
53
  className: "size-8 bg-action-primary-bg rounded-md flex items-center justify-center flex-shrink-0",
25
- children: /* @__PURE__ */ o("span", {
54
+ children: /* @__PURE__ */ m("span", {
26
55
  className: "text-action-primary-text font-bold text-sm",
27
- children: u
56
+ children: v
28
57
  })
29
- }) : /* @__PURE__ */ o("div", {
58
+ }) : /* @__PURE__ */ m("div", {
30
59
  className: "size-8 flex items-center justify-center flex-shrink-0",
31
- children: u
32
- }), !b && /* @__PURE__ */ o("h1", {
60
+ children: v
61
+ }), !O && /* @__PURE__ */ m("h1", {
33
62
  className: "text-heading-h4 font-semibold text-text-primary",
34
- children: d
63
+ children: y
35
64
  })]
36
65
  });
37
- return /* @__PURE__ */ o("div", {
66
+ return /* @__PURE__ */ h("div", {
38
67
  "data-tour": "sidenav",
39
68
  className: "h-full",
40
- children: /* @__PURE__ */ o(i, {
41
- items: w,
42
- currentPath: y.pathname,
43
- collapsed: b,
44
- groupOrder: f,
45
- groupLabels: p,
46
- onItemClick: T,
47
- onToggleCollapse: x,
48
- collapseLabel: _,
49
- mobileActions: m,
50
- header: h ?? D,
51
- contextSearchParams: S
52
- })
69
+ children: [/* @__PURE__ */ m(s, {
70
+ items: B,
71
+ currentPath: D.pathname,
72
+ collapsed: O,
73
+ groupOrder: b,
74
+ groupLabels: x,
75
+ onItemClick: V,
76
+ onToggleCollapse: k,
77
+ collapseLabel: T,
78
+ mobileActions: S,
79
+ header: C ?? U,
80
+ footer: N ? /* @__PURE__ */ m(d, {}) : void 0,
81
+ contextSearchParams: A
82
+ }), N && /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m(l, {
83
+ groupLabels: x,
84
+ groupOrder: b
85
+ }), /* @__PURE__ */ m(u, {})] })]
53
86
  });
54
87
  }
55
88
  //#endregion
56
- export { u as ProductSideNav };
89
+ export { v as ProductSideNav };
@@ -90,6 +90,12 @@ export type { ShortcutHelpDialogProps } from './ShortcutHelpDialog';
90
90
  export { AutoBreadcrumbs, registerBreadcrumbName, unregisterBreadcrumbName, } from './AutoBreadcrumbs';
91
91
  export { ProductSideNav } from './ProductSideNav';
92
92
  export type { ProductSideNavProps } from './ProductSideNav';
93
+ export { PersonaSurfaceControls, PersonaSimulationPill } from './PersonaSurfaceControls';
94
+ export type { PersonaSurfaceControlsProps } from './PersonaSurfaceControls';
95
+ export { NavCustomizeDialog } from './NavCustomizeDialog';
96
+ export type { NavCustomizeDialogProps } from './NavCustomizeDialog';
97
+ export { applyNavVisibility, applyPermissionFilter, applySurfaceVisibility, isItemEffectivelyShown, NAV_MORE_ID_PREFIX, } from './sideNavigation/navVisibility';
98
+ export type { ApplyNavVisibilityOptions, NavVisibilityResult, NavOverrideMap, } from './sideNavigation/navVisibility';
93
99
  export { DynamicFooter } from './DynamicFooter';
94
100
  export type { DynamicFooterProps } from './DynamicFooter';
95
101
  export { PanelContainer } from './PanelContainer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chrome/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chrome/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { NavItem } from './types';
2
+ export declare const NAV_MORE_ID_PREFIX = "__nav_more__:";
3
+ export type NavOverrideMap = Record<string, 'shown' | 'hidden'>;
4
+ export interface ApplyNavVisibilityOptions {
5
+ /**
6
+ * Layer-1 permission checker ("resource:action"). Omit to skip capability
7
+ * filtering (permissions still loading, or shell without RBAC).
8
+ */
9
+ hasPermission?: (permission: string) => boolean;
10
+ /**
11
+ * The active surface's default-visible item ids. `null`/`undefined` means
12
+ * no curation (Everything) — every permitted item is shown.
13
+ */
14
+ surfaceVisibleItems?: readonly string[] | null;
15
+ /** Per-item label overrides from the surface (persona vocabulary). */
16
+ labelOverrides?: Record<string, string>;
17
+ /** Per-item user overrides; win over the surface defaults. */
18
+ overrides?: NavOverrideMap;
19
+ /** Label factory for the "N more…" reveal rows. */
20
+ moreLabel?: (count: number) => string;
21
+ }
22
+ export interface NavVisibilityResult {
23
+ items: NavItem[];
24
+ /** Count of soft-hidden items (collapsed behind "N more…" rows). */
25
+ softHiddenCount: number;
26
+ /** Count of hard-hidden (RBAC-removed) items. */
27
+ hardHiddenCount: number;
28
+ }
29
+ /**
30
+ * Layer 1: recursively remove items the caller's role cannot use. A failing
31
+ * parent removes its whole subtree. A passing parent keeps rendering even if
32
+ * every child was removed, as long as it has its own destination.
33
+ */
34
+ export declare function applyPermissionFilter(items: NavItem[], hasPermission: ((permission: string) => boolean) | undefined, counter?: {
35
+ removed: number;
36
+ }): NavItem[];
37
+ /**
38
+ * Layers 2–3: apply the active surface's visibility defaults plus the user's
39
+ * per-item overrides. Soft-hidden top-level items collapse into one
40
+ * "N more…" row per nav group; soft-hidden children collapse into a nested
41
+ * "N more…" row inside their parent.
42
+ */
43
+ export declare function applySurfaceVisibility(items: NavItem[], options: Pick<ApplyNavVisibilityOptions, 'surfaceVisibleItems' | 'labelOverrides' | 'overrides' | 'moreLabel'>): {
44
+ items: NavItem[];
45
+ softHiddenCount: number;
46
+ };
47
+ /**
48
+ * Full pipeline: Layer 1 (hard) then Layers 2–3 (soft).
49
+ */
50
+ export declare function applyNavVisibility(items: NavItem[], options: ApplyNavVisibilityOptions): NavVisibilityResult;
51
+ /**
52
+ * Effective visibility of a single (permitted) item for the Customize dialog:
53
+ * what the user currently sees, combining surface defaults and overrides.
54
+ */
55
+ export declare function isItemEffectivelyShown(item: NavItem, parentShown: boolean, surfaceVisibleItems: readonly string[] | null | undefined, overrides: NavOverrideMap): boolean;
56
+ //# sourceMappingURL=navVisibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navVisibility.d.ts","sourceRoot":"","sources":["../../../src/chrome/sideNavigation/navVisibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;AAEhE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD;;;OAGG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/C,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,mDAAmD;IACnD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;CACzB;AAcD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EAAE,EAChB,aAAa,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,EAC5D,OAAO,GAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAmB,GAC5C,OAAO,EAAE,CAmBX;AAgDD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,EAAE,IAAI,CACX,yBAAyB,EACzB,qBAAqB,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,CACrE,GACA;IAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAgE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,CAKrB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,OAAO,EACpB,mBAAmB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EACzD,SAAS,EAAE,cAAc,GACxB,OAAO,CAGT"}