@burdenoff/fe-libs 2026.1017.12 → 2026.1019.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 (59) hide show
  1. package/dist/chrome/AccountSwitcher.js +90 -89
  2. package/dist/chrome/Breadcrumbs.js +1 -1
  3. package/dist/chrome/CommandPalette.js +91 -90
  4. package/dist/chrome/Footer.js +31 -8
  5. package/dist/chrome/GlobalSearch.js +78 -77
  6. package/dist/chrome/HeaderBar.js +1 -1
  7. package/dist/chrome/HeaderThemeSwitcher.js +48 -47
  8. package/dist/chrome/LanguagePickerSheet.js +23 -22
  9. package/dist/chrome/NavCustomizeDialog.d.ts +0 -14
  10. package/dist/chrome/NavCustomizeDialog.js +114 -122
  11. package/dist/chrome/PanelTabs.js +45 -41
  12. package/dist/chrome/PersonaSurfaceControls.d.ts +0 -17
  13. package/dist/chrome/PersonaSurfaceControls.js +115 -118
  14. package/dist/chrome/PluginSettingsPage.js +29 -28
  15. package/dist/chrome/PluginWidgetGrid.js +19 -18
  16. package/dist/chrome/ProductPickerSheet.js +44 -47
  17. package/dist/chrome/ProductSwitcher.js +2 -6
  18. package/dist/chrome/ProfileSwitcher.js +6 -10
  19. package/dist/chrome/ShortcutHelpDialog.js +60 -65
  20. package/dist/chrome/SideNavigation.js +2 -2
  21. package/dist/chrome/Sidebar.js +44 -43
  22. package/dist/chrome/ThemePreferences.js +289 -267
  23. package/dist/chrome/contextSwitcher/EmptyState.js +31 -27
  24. package/dist/chrome/contextSwitcher/OrganizationList.js +40 -30
  25. package/dist/chrome/contextSwitcher/ProjectList.js +48 -44
  26. package/dist/chrome/contextSwitcher/SearchInput.js +44 -40
  27. package/dist/chrome/contextSwitcher/TriggerButton.js +2 -2
  28. package/dist/chrome/contextSwitcher/WorkspaceList.js +36 -32
  29. package/dist/chrome/globalSearch/AdvancedFiltersPanel.js +128 -126
  30. package/dist/chrome/globalSearch/ResultsList.js +25 -27
  31. package/dist/chrome/globalSearch/SearchInput.js +16 -14
  32. package/dist/chrome/notificationCenter/NotificationCardItem.js +58 -47
  33. package/dist/chrome/notificationCenter/NotificationFilters.js +76 -62
  34. package/dist/chrome/notificationCenter/NotificationFooter.js +21 -21
  35. package/dist/chrome/notificationCenter/NotificationHeader.js +67 -63
  36. package/dist/chrome/notificationCenter/NotificationList.js +75 -71
  37. package/dist/chrome/notificationCenter/NotificationPanel.js +37 -33
  38. package/dist/chrome/notificationCenter/PushOptInToggle.js +33 -32
  39. package/dist/chrome/notificationCenter/constants.d.ts +6 -1
  40. package/dist/chrome/notificationCenter/constants.js +12 -11
  41. package/dist/chrome/useThemeOptionLabels.d.ts +33 -0
  42. package/dist/chrome/useThemeOptionLabels.js +39 -0
  43. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +6 -6
  44. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +86 -85
  45. package/dist/shared/assistant/ui/AssistantMessageItem.js +101 -96
  46. package/dist/shared/assistant/ui/WorkflowAssistantPanel.js +152 -140
  47. package/dist/shared/events/sinks/RybbitSink.js +2 -2
  48. package/dist/shared/providers/shell/authProvider/useAuthActions.d.ts +19 -0
  49. package/dist/shared/providers/shell/authProvider/useAuthActions.js +97 -91
  50. package/dist/shared/providers/shell/interpolateShellLabel.d.ts +3 -0
  51. package/dist/shared/providers/shell/interpolateShellLabel.js +11 -0
  52. package/dist/shared/providers/shell/useAssistantShellLabels.d.ts +45 -0
  53. package/dist/shared/providers/shell/useAssistantShellLabels.js +54 -0
  54. package/dist/shared/tours/TourPlayer.js +33 -32
  55. package/dist/shared/tours/TourTooltip.js +108 -109
  56. package/dist/shared/tours/tourTrigger/MobileTourSheet.js +98 -85
  57. package/dist/shared/tours/tourTrigger/TourListItemDesktop.js +20 -18
  58. package/dist/shared/tours/tourTrigger/TourListItemMobile.js +23 -25
  59. package/package.json +3 -3
@@ -118,8 +118,31 @@ var u = [
118
118
  href: "https://discord.gg/burdenoff",
119
119
  icon: /* @__PURE__ */ s(a, { className: "size-5" })
120
120
  }
121
- ], f = ({ logo: i, productName: a = "Burdenoff Workspaces", tagline: o = "Enterprise collaboration made simple", columns: f = u, socialLinks: p = d, copyright: m, version: h, buildInfo: g, context: _, children: v, renderLink: y, hideOnInstalledApp: b = !0 }) => {
122
- let x = t(), S = (/* @__PURE__ */ new Date()).getFullYear(), C = m ?? x("footer.copyright", `${S} Burdenoff. All rights reserved.`).replace("{year}", String(S)), w = y ?? (({ href: e, external: t, children: n, className: r }) => /* @__PURE__ */ s("a", {
121
+ ], f = ({ logo: i, productName: a = "Burdenoff Workspaces", tagline: o, columns: f, socialLinks: p = d, copyright: m, version: h, buildInfo: g, context: _, children: v, renderLink: y, hideOnInstalledApp: b = !0 }) => {
122
+ let x = t(), S = (/* @__PURE__ */ new Date()).getFullYear(), C = o ?? x("chrome.footer.tagline", "Enterprise collaboration made simple"), w = {
123
+ products: x("footer.columns.products", "Products"),
124
+ resources: x("footer.columns.resources", "Resources"),
125
+ legal: x("footer.columns.legal", "Legal"),
126
+ docs: x("footer.links.docs", "Documentation"),
127
+ api: x("footer.links.api", "API Reference"),
128
+ status: x("footer.links.status", "Status Page"),
129
+ changelog: x("footer.links.changelog", "Changelog"),
130
+ terms: x("footer.links.terms", "Terms of Service"),
131
+ privacy: x("footer.links.privacy", "Privacy Policy"),
132
+ security: x("footer.links.security", "Security"),
133
+ compliance: x("footer.links.compliance", "Compliance")
134
+ }, T = [
135
+ w.products,
136
+ w.resources,
137
+ w.legal
138
+ ], E = f ?? u.map((e, t) => ({
139
+ ...e,
140
+ title: T[t] ?? e.title,
141
+ links: e.links.map((e) => ({
142
+ ...e,
143
+ label: e.brand ? e.label : Object.entries(w).find(([t]) => t === e.id)?.[1] ?? e.label
144
+ }))
145
+ })), D = m ?? x("footer.copyright", `${S} Burdenoff. All rights reserved.`).replace("{year}", String(S)), O = y ?? (({ href: e, external: t, children: n, className: r }) => /* @__PURE__ */ s("a", {
123
146
  href: e,
124
147
  target: t ? "_blank" : void 0,
125
148
  rel: t ? "noopener noreferrer" : void 0,
@@ -132,7 +155,7 @@ var u = [
132
155
  /* @__PURE__ */ s("div", {
133
156
  className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12",
134
157
  children: /* @__PURE__ */ c("div", {
135
- className: `grid grid-cols-2 ${l(f.length)} gap-8`,
158
+ className: `grid grid-cols-2 ${l(E.length)} gap-8`,
136
159
  children: [/* @__PURE__ */ c("div", {
137
160
  className: "col-span-2",
138
161
  children: [
@@ -148,7 +171,7 @@ var u = [
148
171
  }),
149
172
  /* @__PURE__ */ s("p", {
150
173
  className: "text-text-secondary text-sm mb-6 max-w-xs",
151
- children: o
174
+ children: C
152
175
  }),
153
176
  p.length > 0 && /* @__PURE__ */ s("div", {
154
177
  className: "flex items-center gap-4",
@@ -162,12 +185,12 @@ var u = [
162
185
  }, e.id))
163
186
  })
164
187
  ]
165
- }), f.map((e) => /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h3", {
188
+ }), E.map((e) => /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h3", {
166
189
  className: "text-sm font-semibold text-text-primary mb-4",
167
190
  children: e.title
168
191
  }), /* @__PURE__ */ s("ul", {
169
192
  className: "space-y-3",
170
- children: e.links.map((e) => /* @__PURE__ */ s("li", { children: /* @__PURE__ */ c(w, {
193
+ children: e.links.map((e) => /* @__PURE__ */ s("li", { children: /* @__PURE__ */ c(O, {
171
194
  href: e.href,
172
195
  external: e.external,
173
196
  className: "text-sm text-text-secondary hover:text-text-primary transition-colors inline-flex items-center gap-1",
@@ -190,7 +213,7 @@ var u = [
190
213
  children: [
191
214
  /* @__PURE__ */ s("div", {
192
215
  className: "flex items-center gap-2",
193
- children: /* @__PURE__ */ c("span", { children: ["© ", C] })
216
+ children: /* @__PURE__ */ c("span", { children: ["© ", D] })
194
217
  }),
195
218
  _ && Object.values(_).some(Boolean) && /* @__PURE__ */ s("div", {
196
219
  className: "flex items-center gap-3",
@@ -213,7 +236,7 @@ var u = [
213
236
  className: "text-border-subtle",
214
237
  children: "|"
215
238
  }),
216
- g && /* @__PURE__ */ c("span", { children: ["Build ", g] })
239
+ g && /* @__PURE__ */ s("span", { children: x("footer.buildInfo", "Build {{build}}", { build: g }) })
217
240
  ]
218
241
  })
219
242
  ]
@@ -1,109 +1,110 @@
1
- import { useGlobalUiOrNull as e } from "../shared/providers/shell/GlobalUiProvider.js";
2
- import { useAssistantControl as t } from "../shared/assistant/appControls/useAssistantControl.js";
3
- import { EscapeLayer as n } from "../shared/components/EscapeLayer.js";
4
- import { SHELL_OVERLAY_LAYER_CLASS as r } from "./shellOverlayLayer.js";
5
- import { cn as i } from "../utils/cn.js";
1
+ import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
2
+ import { useGlobalUiOrNull as t } from "../shared/providers/shell/GlobalUiProvider.js";
3
+ import { useAssistantControl as n } from "../shared/assistant/appControls/useAssistantControl.js";
4
+ import { EscapeLayer as r } from "../shared/components/EscapeLayer.js";
5
+ import { SHELL_OVERLAY_LAYER_CLASS as i } from "./shellOverlayLayer.js";
6
+ import { cn as a } from "../utils/cn.js";
6
7
  import "../utils/index.js";
7
- import { debounce as a, isSearchResults as o } from "./globalSearch/utils.js";
8
- import { SearchInput as s } from "./globalSearch/SearchInput.js";
9
- import { CategoryTabs as c } from "./globalSearch/CategoryTabs.js";
10
- import { SearchModeBar as l } from "./globalSearch/SearchModeBar.js";
11
- import { AdvancedFiltersPanel as u } from "./globalSearch/AdvancedFiltersPanel.js";
12
- import { ResultsList as d } from "./globalSearch/ResultsList.js";
13
- import { useAdvancedFilters as f } from "./globalSearch/useAdvancedFilters.js";
14
- import { useCallback as p, useEffect as m, useMemo as h, useState as g } from "react";
15
- import { ExternalLink as _ } from "lucide-react";
16
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
8
+ import { debounce as o, isSearchResults as s } from "./globalSearch/utils.js";
9
+ import { SearchInput as c } from "./globalSearch/SearchInput.js";
10
+ import { CategoryTabs as l } from "./globalSearch/CategoryTabs.js";
11
+ import { SearchModeBar as u } from "./globalSearch/SearchModeBar.js";
12
+ import { AdvancedFiltersPanel as d } from "./globalSearch/AdvancedFiltersPanel.js";
13
+ import { ResultsList as f } from "./globalSearch/ResultsList.js";
14
+ import { useAdvancedFilters as p } from "./globalSearch/useAdvancedFilters.js";
15
+ import { useCallback as m, useEffect as h, useMemo as g, useState as _ } from "react";
16
+ import { ExternalLink as v } from "lucide-react";
17
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
17
18
  //#region src/chrome/GlobalSearch.tsx
18
- function b({ open: b, onClose: x, categories: S = [], placeholder: C = "Search everything...", recentSearches: w = [], onSearch: T, onSelect: E, onViewAllResults: D, className: O }) {
19
- let [k, A] = g(""), [j, M] = g(void 0), [N, P] = g([]), [F, I] = g(!1), [L, R] = g(null), [z, B] = g(!1), V = f(), { buildFilters: H, reset: U, searchMode: W, setSearchMode: G } = V, K = e()?.openGlobalSearch, [q, J] = g(null);
20
- t("header.search", h(() => K ? { run: ({ query: e }) => (J(e === null ? null : { query: e }), K(), { status: "done" }) } : null, [K])), m(() => {
21
- !b || !q || (A(q.query), J(null));
22
- }, [b, q]), m(() => {
23
- b || (A(""), M(void 0), P([]), R(null), B(!1), U());
24
- }, [b, U]);
25
- let Y = h(() => a(async (e, t, n) => {
19
+ function x({ open: x, onClose: S, categories: C = [], placeholder: w, recentSearches: T = [], onSearch: E, onSelect: D, onViewAllResults: O, className: k }) {
20
+ let A = e(), [j, M] = _(""), [N, P] = _(void 0), [F, I] = _([]), [L, R] = _(!1), [z, B] = _(null), [V, H] = _(!1), U = p(), { buildFilters: W, reset: G, searchMode: K, setSearchMode: q } = U, J = t()?.openGlobalSearch, [Y, X] = _(null);
21
+ n("header.search", g(() => J ? { run: ({ query: e }) => (X(e === null ? null : { query: e }), J(), { status: "done" }) } : null, [J])), h(() => {
22
+ !x || !Y || (M(Y.query), X(null));
23
+ }, [x, Y]), h(() => {
24
+ x || (M(""), P(void 0), I([]), B(null), H(!1), G());
25
+ }, [x, G]);
26
+ let Z = g(() => o(async (e, t, n) => {
26
27
  if (!e.trim()) {
27
- P([]), R(null);
28
+ I([]), B(null);
28
29
  return;
29
30
  }
30
- I(!0), R(null);
31
+ R(!0), B(null);
31
32
  try {
32
- let r = await T(e, t, n);
33
- if (!o(r)) throw TypeError("Invalid search results format");
34
- P(r);
33
+ let r = await E(e, t, n);
34
+ if (!s(r)) throw TypeError(A("search.invalidResults", "Invalid search results format"));
35
+ I(r);
35
36
  } catch (e) {
36
- R(e instanceof Error ? e.message : "Search failed"), P([]), console.error("Search error:", e);
37
+ B(e instanceof Error ? e.message : A("search.failed", "Search failed")), I([]), console.error("Search error:", e);
37
38
  } finally {
38
- I(!1);
39
+ R(!1);
39
40
  }
40
- }, 300), [T]);
41
- m(() => {
42
- Y(k, j, H());
41
+ }, 300), [E, A]);
42
+ h(() => {
43
+ Z(j, N, W());
43
44
  }, [
44
- k,
45
45
  j,
46
- Y,
47
- H
46
+ N,
47
+ Z,
48
+ W
48
49
  ]);
49
- let X = h(() => N.reduce((e, t) => {
50
+ let Q = g(() => F.reduce((e, t) => {
50
51
  let n = t.category;
51
52
  return e[n] || (e[n] = []), e[n].push(t), e;
52
- }, {}), [N]), Z = p((e) => {
53
- E(e), x();
54
- }, [E, x]);
55
- return b ? /* @__PURE__ */ v(n, {
53
+ }, {}), [F]), $ = m((e) => {
54
+ D(e), S();
55
+ }, [D, S]);
56
+ return x ? /* @__PURE__ */ y(r, {
56
57
  modal: !0,
57
- onDismiss: x,
58
- children: /* @__PURE__ */ v("div", {
59
- className: i("fixed inset-0 flex items-center justify-center bg-bg-overlay backdrop-blur-md", r, "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", O),
60
- onClick: x,
61
- "data-state": b ? "open" : "closed",
58
+ onDismiss: S,
59
+ children: /* @__PURE__ */ y("div", {
60
+ className: a("fixed inset-0 flex items-center justify-center bg-bg-overlay backdrop-blur-md", i, "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", k),
61
+ onClick: S,
62
+ "data-state": x ? "open" : "closed",
62
63
  role: "dialog",
63
64
  "aria-modal": "true",
64
- children: /* @__PURE__ */ v("div", {
65
+ children: /* @__PURE__ */ y("div", {
65
66
  className: "w-full max-w-lg mx-4 max-h-[85dvh] overflow-hidden",
66
67
  onClick: (e) => e.stopPropagation(),
67
- children: /* @__PURE__ */ y("div", {
68
+ children: /* @__PURE__ */ b("div", {
68
69
  className: "overflow-hidden rounded-2xl border border-border-subtle bg-bg-elevated shadow-[var(--shadow-elevation-5)]",
69
70
  children: [
70
- /* @__PURE__ */ v(s, {
71
- value: k,
72
- placeholder: C,
73
- onChange: A,
74
- onClear: () => A("")
71
+ /* @__PURE__ */ y(c, {
72
+ value: j,
73
+ placeholder: w ?? A("search.globalPlaceholder", "Search everything..."),
74
+ onChange: M,
75
+ onClear: () => M("")
75
76
  }),
76
- /* @__PURE__ */ v(c, {
77
- categories: S,
78
- selectedCategory: j,
79
- onSelect: M
77
+ /* @__PURE__ */ y(l, {
78
+ categories: C,
79
+ selectedCategory: N,
80
+ onSelect: P
80
81
  }),
81
- /* @__PURE__ */ v(l, {
82
- searchMode: W,
83
- onSearchModeChange: G,
84
- showAdvanced: z,
85
- onToggleAdvanced: () => B((e) => !e)
82
+ /* @__PURE__ */ y(u, {
83
+ searchMode: K,
84
+ onSearchModeChange: q,
85
+ showAdvanced: V,
86
+ onToggleAdvanced: () => H((e) => !e)
86
87
  }),
87
- z && /* @__PURE__ */ v(u, { filters: V }),
88
- /* @__PURE__ */ v(d, {
89
- loading: F,
90
- error: L,
91
- query: k,
92
- results: N,
93
- groupedResults: X,
94
- recentSearches: w,
95
- onRecentSelect: A,
96
- onResultSelect: Z
88
+ V && /* @__PURE__ */ y(d, { filters: U }),
89
+ /* @__PURE__ */ y(f, {
90
+ loading: L,
91
+ error: z,
92
+ query: j,
93
+ results: F,
94
+ groupedResults: Q,
95
+ recentSearches: T,
96
+ onRecentSelect: M,
97
+ onResultSelect: $
97
98
  }),
98
- k && N.length > 0 && D && /* @__PURE__ */ v("div", {
99
+ j && F.length > 0 && O && /* @__PURE__ */ y("div", {
99
100
  className: "border-t border-border-subtle p-2",
100
- children: /* @__PURE__ */ y("button", {
101
+ children: /* @__PURE__ */ b("button", {
101
102
  type: "button",
102
103
  onClick: () => {
103
- D(k, H(), j), x();
104
+ O(j, W(), N), S();
104
105
  },
105
106
  className: "w-full flex items-center justify-center gap-2 py-2 text-sm font-medium text-text-link hover:bg-bg-sunken rounded-button transition-colors",
106
- children: [/* @__PURE__ */ v(_, { className: "size-4" }), "View all results"]
107
+ children: [/* @__PURE__ */ y(v, { className: "size-4" }), A("search.viewAllResults", "View all results")]
107
108
  })
108
109
  })
109
110
  ]
@@ -113,4 +114,4 @@ function b({ open: b, onClose: x, categories: S = [], placeholder: C = "Search e
113
114
  }) : null;
114
115
  }
115
116
  //#endregion
116
- export { b as GlobalSearch };
117
+ export { x as GlobalSearch };
@@ -37,7 +37,7 @@ var a = ({ logo: a, appName: o, onLogoClick: s, onMenuToggle: c, onSearchClick:
37
37
  onKeyDown: s ? (e) => {
38
38
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), s());
39
39
  } : void 0,
40
- "aria-label": s ? "Go to home" : void 0,
40
+ "aria-label": s ? D("nav.goHome", "Go to home") : void 0,
41
41
  children: typeof a == "string" ? /* @__PURE__ */ r("span", {
42
42
  className: "text-action-primary-text font-bold text-sm",
43
43
  children: a
@@ -2,20 +2,21 @@ import { DropdownMenu as e, DropdownMenuContent as t, DropdownMenuItem as n, Dro
2
2
  import { useTheme as o } from "../shared/providers/shell/ThemeProvider.js";
3
3
  import { useShellLabel as s } from "../shared/providers/shell/useShellLabel.js";
4
4
  import { useExclusiveMenu as c } from "../shared/hooks/useExclusiveMenu.js";
5
- import { cn as l } from "../utils/cn.js";
5
+ import { useThemeOptionLabels as l } from "./useThemeOptionLabels.js";
6
+ import { cn as u } from "../utils/cn.js";
6
7
  import "../utils/index.js";
7
- import { useCallback as u, useState as d } from "react";
8
- import { Check as f, Contrast as p, Monitor as m, Moon as h, Palette as g, Sun as _, Sunset as v, Trees as y, Waves as b } from "lucide-react";
9
- import { jsx as x, jsxs as S } from "react/jsx-runtime";
8
+ import { useCallback as d, useState as f } from "react";
9
+ import { Check as p, Contrast as m, Monitor as h, Moon as g, Palette as _, Sun as v, Sunset as y, Trees as b, Waves as x } from "lucide-react";
10
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
10
11
  //#region src/chrome/HeaderThemeSwitcher.tsx
11
- var C = {
12
- light: _,
13
- dark: h,
14
- forest: y,
15
- ocean: b,
16
- sunset: v,
17
- "high-contrast": p
18
- }, w = [
12
+ var w = {
13
+ light: v,
14
+ dark: g,
15
+ forest: b,
16
+ ocean: x,
17
+ sunset: y,
18
+ "high-contrast": m
19
+ }, T = [
19
20
  {
20
21
  value: "light",
21
22
  label: "Light"
@@ -41,67 +42,67 @@ var C = {
41
42
  label: "High contrast"
42
43
  }
43
44
  ];
44
- function T({ mobileOptimized: n = !0 }) {
45
- let [f, p] = d(!1);
46
- c("header-theme", f, u(() => p(!1), []));
47
- let { mode: v, setMode: y, resolvedTheme: b } = o(), T = s()("themeSwitcher.label", "Theme"), D = b === "dark" ? h : _, O = u((e) => y(e), [y]);
48
- return /* @__PURE__ */ S(e, {
49
- open: f,
50
- onOpenChange: p,
51
- children: [/* @__PURE__ */ x(a, {
45
+ function E({ mobileOptimized: n = !0 }) {
46
+ let [p, m] = f(!1);
47
+ c("header-theme", p, d(() => m(!1), []));
48
+ let { mode: y, setMode: b, resolvedTheme: x } = o(), E = s(), O = l(), k = E("themeSwitcher.label", "Theme"), A = x === "dark" ? g : v, j = d((e) => b(e), [b]);
49
+ return /* @__PURE__ */ C(e, {
50
+ open: p,
51
+ onOpenChange: m,
52
+ children: [/* @__PURE__ */ S(a, {
52
53
  asChild: !0,
53
- children: /* @__PURE__ */ x("button", {
54
+ children: /* @__PURE__ */ S("button", {
54
55
  type: "button",
55
- "aria-label": T,
56
- title: T,
57
- className: l("flex size-9 items-center justify-center rounded-button text-text-primary transition-colors", "hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", n ? "hidden md:flex" : ""),
58
- children: /* @__PURE__ */ x(D, {
56
+ "aria-label": k,
57
+ title: k,
58
+ className: u("flex size-9 items-center justify-center rounded-button text-text-primary transition-colors", "hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", n ? "hidden md:flex" : ""),
59
+ children: /* @__PURE__ */ S(A, {
59
60
  className: "size-5",
60
61
  "aria-hidden": "true"
61
62
  })
62
63
  })
63
- }), /* @__PURE__ */ S(t, {
64
+ }), /* @__PURE__ */ C(t, {
64
65
  align: "end",
65
66
  className: "w-56",
66
67
  children: [
67
- /* @__PURE__ */ S(r, {
68
+ /* @__PURE__ */ C(r, {
68
69
  className: "flex items-center gap-2 text-text-secondary",
69
- children: [/* @__PURE__ */ x(g, {
70
+ children: [/* @__PURE__ */ S(_, {
70
71
  className: "size-4",
71
72
  "aria-hidden": "true"
72
- }), "Appearance"]
73
+ }), E("themeSwitcher.heading", "Appearance")]
73
74
  }),
74
- /* @__PURE__ */ x(i, {}),
75
- /* @__PURE__ */ x(E, {
76
- active: v === "system",
77
- icon: m,
78
- label: "System",
79
- onSelect: () => O("system")
75
+ /* @__PURE__ */ S(i, {}),
76
+ /* @__PURE__ */ S(D, {
77
+ active: y === "system",
78
+ icon: h,
79
+ label: E("themeSwitcher.system", "System"),
80
+ onSelect: () => j("system")
80
81
  }),
81
- w.map((e) => /* @__PURE__ */ x(E, {
82
- active: v === e.value,
83
- icon: C[e.value],
84
- label: e.label,
85
- onSelect: () => O(e.value)
82
+ T.map((e) => /* @__PURE__ */ S(D, {
83
+ active: y === e.value,
84
+ icon: w[e.value],
85
+ label: e.value === "high-contrast" ? O.highContrastMenu : O.themes[e.value],
86
+ onSelect: () => j(e.value)
86
87
  }, e.value))
87
88
  ]
88
89
  })]
89
90
  });
90
91
  }
91
- function E({ active: e, icon: t, label: r, onSelect: i }) {
92
- return /* @__PURE__ */ S(n, {
92
+ function D({ active: e, icon: t, label: r, onSelect: i }) {
93
+ return /* @__PURE__ */ C(n, {
93
94
  onSelect: i,
94
- className: l("gap-2", e && "bg-[var(--color-accent-soft)] text-text-primary"),
95
+ className: u("gap-2", e && "bg-[var(--color-accent-soft)] text-text-primary"),
95
96
  children: [
96
- /* @__PURE__ */ x(t, {
97
+ /* @__PURE__ */ S(t, {
97
98
  className: "size-4 text-text-secondary",
98
99
  "aria-hidden": "true"
99
100
  }),
100
- /* @__PURE__ */ x("span", {
101
+ /* @__PURE__ */ S("span", {
101
102
  className: "flex-1",
102
103
  children: r
103
104
  }),
104
- e && /* @__PURE__ */ x(f, {
105
+ e && /* @__PURE__ */ S(p, {
105
106
  className: "size-4 text-action-primary-bg",
106
107
  "aria-hidden": "true"
107
108
  })
@@ -109,4 +110,4 @@ function E({ active: e, icon: t, label: r, onSelect: i }) {
109
110
  });
110
111
  }
111
112
  //#endregion
112
- export { T as HeaderThemeSwitcher };
113
+ export { E as HeaderThemeSwitcher };
@@ -1,47 +1,48 @@
1
1
  import { Sheet as e, SheetContent as t, SheetHeader as n, SheetTitle as r } from "../ui/sheet.js";
2
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
2
+ import { useShellLabel as i } from "../shared/providers/shell/useShellLabel.js";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
4
  //#region src/chrome/LanguagePickerSheet.tsx
4
- var o = ({ open: o, onOpenChange: s, languages: c, currentLanguage: l, onLanguageChange: u }) => {
5
- let d = (e) => {
6
- u && u(e), s(!1);
5
+ var s = ({ open: s, onOpenChange: c, languages: l, currentLanguage: u, onLanguageChange: d }) => {
6
+ let f = i(), p = (e) => {
7
+ d && d(e), c(!1);
7
8
  };
8
- return /* @__PURE__ */ i(e, {
9
- open: o,
10
- onOpenChange: s,
11
- children: /* @__PURE__ */ a(t, {
9
+ return /* @__PURE__ */ a(e, {
10
+ open: s,
11
+ onOpenChange: c,
12
+ children: /* @__PURE__ */ o(t, {
12
13
  side: "bottom",
13
14
  className: "h-[60vh] flex flex-col p-0",
14
- children: [/* @__PURE__ */ i(n, {
15
+ children: [/* @__PURE__ */ a(n, {
15
16
  className: "px-4 pt-4 pb-2 border-b border-border-subtle",
16
- children: /* @__PURE__ */ i(r, {
17
+ children: /* @__PURE__ */ a(r, {
17
18
  className: "text-text-primary",
18
- children: "Select Language"
19
+ children: f("languageSwitcher.title", "Select Language")
19
20
  })
20
- }), /* @__PURE__ */ i("div", {
21
+ }), /* @__PURE__ */ a("div", {
21
22
  className: "flex-1 overflow-y-auto py-2",
22
- children: c.map((e) => /* @__PURE__ */ a("button", {
23
- onClick: () => d(e),
24
- className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e.code === l ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
23
+ children: l.map((e) => /* @__PURE__ */ o("button", {
24
+ onClick: () => p(e),
25
+ className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e.code === u ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
25
26
  children: [
26
- e.flag && /* @__PURE__ */ i("span", {
27
+ e.flag && /* @__PURE__ */ a("span", {
27
28
  className: "text-2xl flex-shrink-0",
28
29
  children: e.flag
29
30
  }),
30
- /* @__PURE__ */ a("div", {
31
+ /* @__PURE__ */ o("div", {
31
32
  className: "flex-1 text-left min-w-0",
32
- children: [/* @__PURE__ */ i("p", {
33
+ children: [/* @__PURE__ */ a("p", {
33
34
  className: "font-medium text-text-primary",
34
35
  children: e.name
35
- }), /* @__PURE__ */ i("p", {
36
+ }), /* @__PURE__ */ a("p", {
36
37
  className: "text-xs text-text-secondary",
37
38
  children: e.nativeName
38
39
  })]
39
40
  }),
40
- e.code === l && /* @__PURE__ */ i("svg", {
41
+ e.code === u && /* @__PURE__ */ a("svg", {
41
42
  className: "size-5 text-action-primary-bg flex-shrink-0",
42
43
  fill: "currentColor",
43
44
  viewBox: "0 0 20 20",
44
- children: /* @__PURE__ */ i("path", {
45
+ children: /* @__PURE__ */ a("path", {
45
46
  fillRule: "evenodd",
46
47
  d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z",
47
48
  clipRule: "evenodd"
@@ -54,4 +55,4 @@ var o = ({ open: o, onOpenChange: s, languages: c, currentLanguage: l, onLanguag
54
55
  });
55
56
  };
56
57
  //#endregion
57
- export { o as LanguagePickerSheet };
58
+ export { s as LanguagePickerSheet };
@@ -1,17 +1,3 @@
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
1
  export interface NavCustomizeDialogProps {
16
2
  /** Group labels, reused from the sidebar so sections read identically. */
17
3
  groupLabels?: Record<string, string>;