@burdenoff/fe-libs 2026.1018.1 → 2026.1019.2

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 (65) 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/conversation.d.ts +8 -0
  44. package/dist/shared/assistant/history/historyMapping.js +1 -1
  45. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.d.ts +6 -6
  46. package/dist/shared/assistant/ui/AssistantMarkdownRenderer.js +86 -85
  47. package/dist/shared/assistant/ui/AssistantMessageItem.js +101 -96
  48. package/dist/shared/assistant/ui/AssistantWriteProposalCard.d.ts +2 -0
  49. package/dist/shared/assistant/ui/AssistantWriteProposalCard.js +93 -89
  50. package/dist/shared/assistant/ui/WorkflowAssistantPanel.js +152 -140
  51. package/dist/shared/assistant/ui/useWriteProposals.js +122 -85
  52. package/dist/shared/assistant/writeProposalDiscovery.d.ts +3 -1
  53. package/dist/shared/assistant/writeProposalDiscovery.js +2 -2
  54. package/dist/shared/events/sinks/RybbitSink.js +2 -2
  55. package/dist/shared/providers/shell/interpolateShellLabel.d.ts +3 -0
  56. package/dist/shared/providers/shell/interpolateShellLabel.js +11 -0
  57. package/dist/shared/providers/shell/useAssistantShellLabels.d.ts +45 -0
  58. package/dist/shared/providers/shell/useAssistantShellLabels.js +54 -0
  59. package/dist/shared/tours/TourPlayer.js +33 -32
  60. package/dist/shared/tours/TourTooltip.js +108 -109
  61. package/dist/shared/tours/tourTrigger/MobileTourSheet.js +98 -85
  62. package/dist/shared/tours/tourTrigger/TourListItemDesktop.js +20 -18
  63. package/dist/shared/tours/tourTrigger/TourListItemMobile.js +23 -25
  64. package/dist/shared-assistant.js +188 -188
  65. package/package.json +2 -2
@@ -1,111 +1,108 @@
1
1
  import { isSameProductSlug as e } from "../shared/config/productSlug.js";
2
2
  import { Sheet as t, SheetContent as n, SheetHeader as r, SheetTitle as i } from "../ui/sheet.js";
3
- import { filterProducts as a, resolveProductLogo as o } from "./ProductSwitcher.js";
4
- import { useMemo as s, useState as c } from "react";
5
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
3
+ import { useShellLabel as a } from "../shared/providers/shell/useShellLabel.js";
4
+ import { filterProducts as o, resolveProductLogo as s } from "./ProductSwitcher.js";
5
+ import { useMemo as c, useState as l } from "react";
6
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
7
  //#region src/chrome/ProductPickerSheet.tsx
7
- var d = 6, f = ({ product: e }) => {
8
- let [t, n] = c(!1), r = o(e);
9
- return r && !t ? /* @__PURE__ */ l("div", {
8
+ var f = 6, p = ({ product: e }) => {
9
+ let [t, n] = l(!1), r = s(e);
10
+ return r && !t ? /* @__PURE__ */ u("div", {
10
11
  className: "size-10 rounded-lg bg-white p-1 ring-1 ring-border-default dark:ring-border-strong flex items-center justify-center flex-shrink-0 overflow-hidden",
11
- children: /* @__PURE__ */ l("img", {
12
+ children: /* @__PURE__ */ u("img", {
12
13
  src: r,
13
14
  alt: e.name,
14
15
  className: "size-full object-contain",
15
16
  onError: () => n(!0)
16
17
  })
17
- }) : e.icon ? /* @__PURE__ */ l("div", {
18
+ }) : e.icon ? /* @__PURE__ */ u("div", {
18
19
  className: "size-10 rounded-lg bg-[var(--color-accent-soft)] flex items-center justify-center flex-shrink-0",
19
20
  children: e.icon
20
- }) : /* @__PURE__ */ l("div", {
21
+ }) : /* @__PURE__ */ u("div", {
21
22
  className: "size-10 rounded-lg bg-action-primary-bg flex items-center justify-center flex-shrink-0",
22
- children: /* @__PURE__ */ l("span", {
23
+ children: /* @__PURE__ */ u("span", {
23
24
  className: "text-action-primary-text font-bold text-sm",
24
25
  children: e.name.substring(0, 2).toUpperCase()
25
26
  })
26
27
  });
27
- }, p = ({ open: o, onOpenChange: p, products: m, currentProductId: h, onProductChange: g }) => {
28
- let [_, v] = c(""), y = m.length > d, b = s(() => a(m, _), [m, _]), x = (e) => {
29
- g && g(e), p(!1);
28
+ }, m = ({ open: s, onOpenChange: m, products: h, currentProductId: g, onProductChange: _ }) => {
29
+ let v = a(), [y, b] = l(""), x = h.length > f, S = c(() => o(h, y), [h, y]), C = (e) => {
30
+ _ && _(e), m(!1);
30
31
  };
31
- return /* @__PURE__ */ l(t, {
32
- open: o,
32
+ return /* @__PURE__ */ u(t, {
33
+ open: s,
33
34
  onOpenChange: (e) => {
34
- e || v(""), p(e);
35
+ e || b(""), m(e);
35
36
  },
36
- children: /* @__PURE__ */ u(n, {
37
+ children: /* @__PURE__ */ d(n, {
37
38
  side: "bottom",
38
39
  className: "h-[60vh] flex flex-col p-0",
39
40
  children: [
40
- /* @__PURE__ */ l(r, {
41
+ /* @__PURE__ */ u(r, {
41
42
  className: "px-4 pt-4 pb-2 border-b border-border-subtle",
42
- children: /* @__PURE__ */ l(i, {
43
+ children: /* @__PURE__ */ u(i, {
43
44
  className: "text-text-primary",
44
- children: "Switch Product"
45
+ children: v("productSwitcher.title", "Switch Product")
45
46
  })
46
47
  }),
47
- y && /* @__PURE__ */ u("div", {
48
+ x && /* @__PURE__ */ d("div", {
48
49
  className: "relative px-4 py-2 border-b border-border-subtle",
49
- children: [/* @__PURE__ */ l("svg", {
50
+ children: [/* @__PURE__ */ u("svg", {
50
51
  className: "pointer-events-none absolute left-7 top-1/2 -translate-y-1/2 size-4 text-text-muted",
51
52
  fill: "none",
52
53
  stroke: "currentColor",
53
54
  viewBox: "0 0 24 24",
54
- children: /* @__PURE__ */ l("path", {
55
+ children: /* @__PURE__ */ u("path", {
55
56
  strokeLinecap: "round",
56
57
  strokeLinejoin: "round",
57
58
  strokeWidth: 2,
58
59
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
59
60
  })
60
- }), /* @__PURE__ */ l("input", {
61
+ }), /* @__PURE__ */ u("input", {
61
62
  type: "text",
62
- value: _,
63
- onChange: (e) => v(e.target.value),
64
- placeholder: "Search products…",
65
- "aria-label": "Search products",
63
+ value: y,
64
+ onChange: (e) => b(e.target.value),
65
+ placeholder: v("productSwitcher.searchPlaceholder", "Search products…"),
66
+ "aria-label": v("productSwitcher.searchAria", "Search products"),
66
67
  className: "w-full rounded-md border border-border-subtle bg-bg-surface py-2.5 pl-9 pr-3 text-sm text-text-primary placeholder:text-text-muted focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[var(--color-action-primary-border)]"
67
68
  })]
68
69
  }),
69
- /* @__PURE__ */ u("div", {
70
+ /* @__PURE__ */ d("div", {
70
71
  className: "flex-1 overflow-y-auto py-2",
71
- children: [b.length === 0 && /* @__PURE__ */ u("p", {
72
+ children: [S.length === 0 && /* @__PURE__ */ u("p", {
72
73
  className: "px-4 py-6 text-center text-body-sm text-text-muted",
74
+ children: v("productSwitcher.noMatches", "No products match “{{query}}”", { query: y })
75
+ }), S.map((t) => /* @__PURE__ */ d("button", {
76
+ onClick: () => C(t),
77
+ className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e(t.id, g) ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
73
78
  children: [
74
- "No products match “",
75
- _,
76
- "”"
77
- ]
78
- }), b.map((t) => /* @__PURE__ */ u("button", {
79
- onClick: () => x(t),
80
- className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e(t.id, h) ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
81
- children: [
82
- /* @__PURE__ */ l(f, { product: t }),
83
- /* @__PURE__ */ u("div", {
79
+ /* @__PURE__ */ u(p, { product: t }),
80
+ /* @__PURE__ */ d("div", {
84
81
  className: "flex-1 text-left min-w-0",
85
- children: [/* @__PURE__ */ l("p", {
82
+ children: [/* @__PURE__ */ u("p", {
86
83
  className: "font-medium text-text-primary",
87
84
  children: t.name
88
- }), t.description && /* @__PURE__ */ l("p", {
85
+ }), t.description && /* @__PURE__ */ u("p", {
89
86
  className: "text-xs text-text-secondary truncate",
90
87
  children: t.description
91
88
  })]
92
89
  }),
93
- e(t.id, h) && /* @__PURE__ */ l("svg", {
90
+ e(t.id, g) && /* @__PURE__ */ u("svg", {
94
91
  className: "size-5 text-action-primary-bg flex-shrink-0",
95
92
  fill: "currentColor",
96
93
  viewBox: "0 0 20 20",
97
- children: /* @__PURE__ */ l("path", {
94
+ children: /* @__PURE__ */ u("path", {
98
95
  fillRule: "evenodd",
99
96
  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",
100
97
  clipRule: "evenodd"
101
98
  })
102
99
  }),
103
- t.url && !e(t.id, h) && /* @__PURE__ */ l("svg", {
100
+ t.url && !e(t.id, g) && /* @__PURE__ */ u("svg", {
104
101
  className: "size-4 text-text-muted flex-shrink-0",
105
102
  fill: "none",
106
103
  stroke: "currentColor",
107
104
  viewBox: "0 0 24 24",
108
- children: /* @__PURE__ */ l("path", {
105
+ children: /* @__PURE__ */ u("path", {
109
106
  strokeLinecap: "round",
110
107
  strokeLinejoin: "round",
111
108
  strokeWidth: 2,
@@ -120,4 +117,4 @@ var d = 6, f = ({ product: e }) => {
120
117
  });
121
118
  };
122
119
  //#endregion
123
- export { p as ProductPickerSheet };
120
+ export { m as ProductPickerSheet };
@@ -144,13 +144,9 @@ var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1
144
144
  }),
145
145
  /* @__PURE__ */ c("div", {
146
146
  className: "py-1 max-h-96 overflow-y-auto",
147
- children: [T.length === 0 && /* @__PURE__ */ c("p", {
147
+ children: [T.length === 0 && /* @__PURE__ */ s("p", {
148
148
  className: "px-4 py-6 text-center text-body-sm text-text-muted",
149
- children: [
150
- "No products match “",
151
- y,
152
- "”"
153
- ]
149
+ children: g("productSwitcher.noMatches", "No products match “{{query}}”", { query: y })
154
150
  }), T.map((t) => /* @__PURE__ */ c("button", {
155
151
  onClick: () => E(t),
156
152
  disabled: t.comingSoon,
@@ -79,13 +79,9 @@ var l = ({ user: l, accounts: u = [], activeAccountId: d, onViewProfile: f, onLo
79
79
  children: w
80
80
  })
81
81
  }),
82
- /* @__PURE__ */ c("h3", {
82
+ /* @__PURE__ */ s("h3", {
83
83
  className: "text-base font-semibold text-text-primary mb-1",
84
- children: [
85
- "Hi, ",
86
- l.firstName,
87
- "!"
88
- ]
84
+ children: x("userMenu.greeting", "Hi, {{name}}!", { name: l.firstName })
89
85
  }),
90
86
  l.email && /* @__PURE__ */ s("p", {
91
87
  className: "text-body-sm text-text-secondary truncate",
@@ -115,14 +111,14 @@ var l = ({ user: l, accounts: u = [], activeAccountId: d, onViewProfile: f, onLo
115
111
  f(), y(!1);
116
112
  },
117
113
  className: "w-full px-4 py-2.5 text-body-sm font-medium text-text-primary bg-bg-surface hover:bg-bg-sunken rounded-button border border-border-subtle transition-colors",
118
- children: "View Profile"
114
+ children: x("userMenu.viewProfile", "View Profile")
119
115
  })
120
116
  }),
121
117
  T && D.length > 0 && /* @__PURE__ */ c(o, { children: [/* @__PURE__ */ s("div", {
122
118
  className: "px-4 pt-2 pb-1",
123
119
  children: /* @__PURE__ */ s("p", {
124
120
  className: "text-[11px] font-medium text-text-muted uppercase tracking-wider",
125
- children: "Switch Account"
121
+ children: x("auth.security.switchAccount", "Switch Account")
126
122
  })
127
123
  }), /* @__PURE__ */ s("div", {
128
124
  className: `${D.length >= 3 ? "max-h-48 overflow-y-auto" : ""}`,
@@ -208,7 +204,7 @@ var l = ({ user: l, accounts: u = [], activeAccountId: d, onViewProfile: f, onLo
208
204
  strokeWidth: 2,
209
205
  d: "M12 4v16m8-8H4"
210
206
  })
211
- }), /* @__PURE__ */ s("span", { children: "Add account" })]
207
+ }), /* @__PURE__ */ s("span", { children: x("auth.profileMenu.addAccount", "Add account") })]
212
208
  }), p && /* @__PURE__ */ c("button", {
213
209
  type: "button",
214
210
  onClick: () => {
@@ -226,7 +222,7 @@ var l = ({ user: l, accounts: u = [], activeAccountId: d, onViewProfile: f, onLo
226
222
  strokeWidth: 2,
227
223
  d: "M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"
228
224
  })
229
- }), /* @__PURE__ */ s("span", { children: "Sign out" })]
225
+ }), /* @__PURE__ */ s("span", { children: x("auth.security.signOutDialogConfirm", "Sign out") })]
230
226
  })]
231
227
  })
232
228
  })
@@ -1,122 +1,117 @@
1
- import { detectPlatform as e, getDisplayKeysForPlatform as t } from "../shared/keyboard/utils.js";
2
- import { EscapeLayer as n } from "../shared/components/EscapeLayer.js";
3
- import { SHELL_OVERLAY_LAYER_CLASS as r } from "./shellOverlayLayer.js";
4
- import { useEffect as i, useRef as a } from "react";
5
- import { X as o } from "lucide-react";
6
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
1
+ import { useShellLabel as e } from "../shared/providers/shell/useShellLabel.js";
2
+ import { interpolateShellLabel as t } from "../shared/providers/shell/interpolateShellLabel.js";
3
+ import { detectPlatform as n, getDisplayKeysForPlatform as r } from "../shared/keyboard/utils.js";
4
+ import { EscapeLayer as i } from "../shared/components/EscapeLayer.js";
5
+ import { SHELL_OVERLAY_LAYER_CLASS as a } from "./shellOverlayLayer.js";
6
+ import { useEffect as o, useRef as s } from "react";
7
+ import { X as c } from "lucide-react";
8
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
9
  //#region src/chrome/ShortcutHelpDialog.tsx
8
- var l = ({ isOpen: l, onClose: u, shortcuts: d }) => {
9
- let f = a(null), p = a(u);
10
- if (i(() => {
11
- p.current = u;
12
- }), i(() => {
13
- if (!l) return;
10
+ var d = ({ isOpen: d, onClose: f, shortcuts: p }) => {
11
+ let m = e(), h = s(null), g = s(f);
12
+ if (o(() => {
13
+ g.current = f;
14
+ }), o(() => {
15
+ if (!d) return;
14
16
  let e = setTimeout(() => {
15
17
  let e = (e) => {
16
- e.key === "?" && (e.preventDefault(), e.stopPropagation(), p.current());
18
+ e.key === "?" && (e.preventDefault(), e.stopPropagation(), g.current());
17
19
  };
18
- f.current = e, document.addEventListener("keydown", e);
20
+ h.current = e, document.addEventListener("keydown", e);
19
21
  }, 100);
20
22
  return () => {
21
- clearTimeout(e), f.current &&= (document.removeEventListener("keydown", f.current), null);
23
+ clearTimeout(e), h.current &&= (document.removeEventListener("keydown", h.current), null);
22
24
  };
23
- }, [l]), i(() => {
24
- if (l) return document.body.style.overflow = "hidden", () => {
25
+ }, [d]), o(() => {
26
+ if (d) return document.body.style.overflow = "hidden", () => {
25
27
  document.body.style.overflow = "";
26
28
  };
27
- }, [l]), !l) return null;
28
- let m = d.reduce((e, t) => {
29
- let n = t.category || "Other";
29
+ }, [d]), !d) return null;
30
+ let _ = p.reduce((e, t) => {
31
+ let n = t.category || m("appShell.otherShortcuts", "Other");
30
32
  return e[n] || (e[n] = []), e[n].push(t), e;
31
- }, {}), h = Object.keys(m).sort((e, t) => {
33
+ }, {}), v = Object.keys(_).sort((e, t) => {
32
34
  let n = {
33
35
  Navigation: 0,
34
36
  Actions: 1,
35
37
  UI: 2
36
38
  }, r = n[e] ?? 99, i = n[t] ?? 99;
37
39
  return r === i ? e.localeCompare(t) : r - i;
38
- }), g = e(), _ = g === "mac" ? "macOS" : g === "windows" ? "Windows" : "Linux";
39
- return /* @__PURE__ */ s(n, {
40
+ }), y = n(), b = y === "mac" ? "macOS" : y === "windows" ? "Windows" : "Linux";
41
+ return /* @__PURE__ */ l(i, {
40
42
  modal: !0,
41
- onDismiss: u,
42
- children: /* @__PURE__ */ c("div", {
43
- className: `fixed inset-0 ${r} flex items-center justify-center animate-in fade-in duration-200`,
43
+ onDismiss: f,
44
+ children: /* @__PURE__ */ u("div", {
45
+ className: `fixed inset-0 ${a} flex items-center justify-center animate-in fade-in duration-200`,
44
46
  role: "dialog",
45
47
  "aria-modal": "true",
46
48
  "aria-labelledby": "shortcut-dialog-title",
47
- children: [/* @__PURE__ */ s("div", {
49
+ children: [/* @__PURE__ */ l("div", {
48
50
  className: "absolute inset-0 bg-bg-overlay backdrop-blur-sm",
49
- onClick: u,
51
+ onClick: f,
50
52
  "aria-hidden": "true"
51
- }), /* @__PURE__ */ c("div", {
53
+ }), /* @__PURE__ */ u("div", {
52
54
  className: "relative bg-bg-elevated border border-border-subtle rounded-card shadow-[var(--shadow-elevation-4)] max-w-2xl w-full mx-4 max-h-[85dvh] flex flex-col animate-in fade-in-0 zoom-in-95 slide-in-from-bottom-4 duration-300",
53
55
  children: [
54
- /* @__PURE__ */ c("div", {
56
+ /* @__PURE__ */ u("div", {
55
57
  className: "flex items-center justify-between p-6 border-b border-border-subtle",
56
- children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h2", {
58
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h2", {
57
59
  id: "shortcut-dialog-title",
58
60
  className: "text-lg font-semibold text-text-primary",
59
- children: "Keyboard Shortcuts"
60
- }), /* @__PURE__ */ s("p", {
61
+ children: m("shortcuts.title", "Keyboard Shortcuts")
62
+ }), /* @__PURE__ */ l("p", {
61
63
  className: "text-text-secondary text-sm mt-1",
62
- children: "Quickly navigate and perform actions using your keyboard"
63
- })] }), /* @__PURE__ */ s("button", {
64
+ children: m("appShell.shortcutsDescription", "Quickly navigate and perform actions using your keyboard")
65
+ })] }), /* @__PURE__ */ l("button", {
64
66
  type: "button",
65
- onClick: u,
67
+ onClick: f,
66
68
  className: "p-2 hover:bg-bg-sunken rounded-button text-text-secondary transition-colors",
67
- "aria-label": "Close",
68
- children: /* @__PURE__ */ s(o, { className: "size-5" })
69
+ "aria-label": m("common.close", "Close"),
70
+ children: /* @__PURE__ */ l(c, { className: "size-5" })
69
71
  })]
70
72
  }),
71
- /* @__PURE__ */ s("div", {
73
+ /* @__PURE__ */ l("div", {
72
74
  className: "flex-1 overflow-y-auto p-6",
73
- children: /* @__PURE__ */ s("div", {
75
+ children: /* @__PURE__ */ l("div", {
74
76
  className: "grid grid-cols-1 md:grid-cols-2 gap-8",
75
- children: h.map((e) => /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h3", {
77
+ children: v.map((e) => /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h3", {
76
78
  className: "text-sm font-semibold text-text-primary mb-3",
77
79
  children: e
78
- }), /* @__PURE__ */ s("div", {
80
+ }), /* @__PURE__ */ l("div", {
79
81
  className: "space-y-1",
80
- children: m[e].map((e, n) => /* @__PURE__ */ c("div", {
82
+ children: _[e].map((e, t) => /* @__PURE__ */ u("div", {
81
83
  className: "flex items-center justify-between py-2 px-3 rounded-button hover:bg-bg-sunken transition-all duration-200 hover:translate-x-0.5",
82
- style: { animationDelay: `${n * 30}ms` },
83
- children: [/* @__PURE__ */ s("span", {
84
+ style: { animationDelay: `${t * 30}ms` },
85
+ children: [/* @__PURE__ */ l("span", {
84
86
  className: "text-text-primary text-sm",
85
87
  children: e.description
86
- }), /* @__PURE__ */ s("kbd", {
88
+ }), /* @__PURE__ */ l("kbd", {
87
89
  className: "ml-4 px-2.5 py-1 bg-bg-sunken border border-border-subtle rounded text-text-secondary text-xs font-mono whitespace-nowrap transition-all duration-200 hover:scale-105",
88
- children: t(e.keys)
90
+ children: r(e.keys)
89
91
  })]
90
92
  }, e.id))
91
93
  })] }, e))
92
94
  })
93
95
  }),
94
- /* @__PURE__ */ s("div", {
96
+ /* @__PURE__ */ l("div", {
95
97
  className: "p-4 border-t border-border-subtle bg-bg-sunken/50 rounded-b-card",
96
- children: /* @__PURE__ */ c("div", {
98
+ children: /* @__PURE__ */ u("div", {
97
99
  className: "flex items-center justify-between text-xs",
98
- children: [/* @__PURE__ */ c("p", {
100
+ children: [/* @__PURE__ */ l("p", {
99
101
  className: "text-text-muted",
100
- children: [_, " shortcuts"]
101
- }), /* @__PURE__ */ c("p", {
102
+ children: m("appShell.platformShortcuts", "{{platform}} shortcuts", { platform: b })
103
+ }), /* @__PURE__ */ l("p", {
102
104
  className: "text-text-secondary",
103
- children: [
104
- "Press",
105
- " ",
106
- /* @__PURE__ */ s("kbd", {
105
+ children: t(m("appShell.closeShortcutsHint", "Press {{question}} or {{escape}} to close"), {
106
+ question: /* @__PURE__ */ l("kbd", {
107
107
  className: "px-1.5 py-0.5 bg-bg-surface border border-border-subtle rounded font-mono",
108
108
  children: "?"
109
109
  }),
110
- " ",
111
- "or",
112
- " ",
113
- /* @__PURE__ */ s("kbd", {
110
+ escape: /* @__PURE__ */ l("kbd", {
114
111
  className: "px-1.5 py-0.5 bg-bg-surface border border-border-subtle rounded font-mono",
115
112
  children: "Esc"
116
- }),
117
- " ",
118
- "to close"
119
- ]
113
+ })
114
+ })
120
115
  })]
121
116
  })
122
117
  })
@@ -126,4 +121,4 @@ var l = ({ isOpen: l, onClose: u, shortcuts: d }) => {
126
121
  });
127
122
  };
128
123
  //#endregion
129
- export { l as ShortcutHelpDialog };
124
+ export { d as ShortcutHelpDialog };
@@ -82,7 +82,7 @@ var h = ({ items: h, currentPath: g, collapsed: _ = !1, onItemClick: v, onToggle
82
82
  type: "button",
83
83
  className: "fixed inset-y-0 right-0 left-64 z-[112] md:hidden cursor-pointer",
84
84
  onClick: y,
85
- "aria-label": "Close sidebar"
85
+ "aria-label": P("appShell.closeSidebar", "Close sidebar")
86
86
  })] }), /* @__PURE__ */ m("aside", {
87
87
  ref: O,
88
88
  className: `
@@ -110,7 +110,7 @@ var h = ({ items: h, currentPath: g, collapsed: _ = !1, onItemClick: v, onToggle
110
110
  type: "button",
111
111
  onClick: y,
112
112
  className: "p-2 rounded-button hover:bg-bg-sunken text-text-secondary hover:text-text-primary transition-colors",
113
- "aria-label": "Close sidebar",
113
+ "aria-label": P("appShell.closeSidebar", "Close sidebar"),
114
114
  children: /* @__PURE__ */ p("svg", {
115
115
  className: "size-5",
116
116
  fill: "none",
@@ -1,72 +1,73 @@
1
1
  import { cn as e } from "../shared-utils.js";
2
- import { useState as t } from "react";
3
- import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
2
+ import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
3
+ import { useState as n } from "react";
4
+ import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
5
  //#region src/chrome/Sidebar.tsx
5
- var a = ({ sections: a, isCollapsed: o = !1, onToggleCollapse: s, header: c, footer: l, className: u, width: d = "280px", collapsedWidth: f = "64px" }) => {
6
- let [p, m] = t(new Set(a.filter((e) => e.defaultCollapsed).map((e) => e.title))), h = (e) => {
7
- m((t) => {
6
+ var o = ({ sections: o, isCollapsed: s = !1, onToggleCollapse: c, header: l, footer: u, className: d, width: f = "280px", collapsedWidth: p = "64px" }) => {
7
+ let m = t(), [h, g] = n(new Set(o.filter((e) => e.defaultCollapsed).map((e) => e.title))), _ = (e) => {
8
+ g((t) => {
8
9
  let n = new Set(t);
9
10
  return n.has(e) ? n.delete(e) : n.add(e), n;
10
11
  });
11
12
  };
12
- return /* @__PURE__ */ i("aside", {
13
- className: e("flex flex-col bg-bg-surface border-r border-border-subtle transition-all duration-300", u),
14
- style: { width: o ? f : d },
13
+ return /* @__PURE__ */ a("aside", {
14
+ className: e("flex flex-col bg-bg-surface border-r border-border-subtle transition-all duration-300", d),
15
+ style: { width: s ? p : f },
15
16
  children: [
16
- c && /* @__PURE__ */ r("div", {
17
- className: e("flex items-center border-b border-border-subtle", o ? "justify-center p-4" : "px-card-padding py-4"),
18
- children: c
17
+ l && /* @__PURE__ */ i("div", {
18
+ className: e("flex items-center border-b border-border-subtle", s ? "justify-center p-4" : "px-card-padding py-4"),
19
+ children: l
19
20
  }),
20
- /* @__PURE__ */ r("nav", {
21
+ /* @__PURE__ */ i("nav", {
21
22
  className: "scrollbar-slim scrollbar-hover-only flex-1 overflow-y-auto py-section-gap",
22
- children: a.map((t) => {
23
- let a = p.has(t.title);
24
- return /* @__PURE__ */ i("div", {
23
+ children: o.map((t) => {
24
+ let n = h.has(t.title);
25
+ return /* @__PURE__ */ a("div", {
25
26
  className: "mb-section-gap",
26
- children: [!o && /* @__PURE__ */ r("div", {
27
+ children: [!s && /* @__PURE__ */ i("div", {
27
28
  className: "px-card-padding mb-2",
28
- children: t.collapsible ? /* @__PURE__ */ i("button", {
29
+ children: t.collapsible ? /* @__PURE__ */ a("button", {
29
30
  type: "button",
30
- onClick: () => h(t.title),
31
+ onClick: () => _(t.title),
31
32
  className: "flex items-center justify-between w-full text-text-muted text-[11px] font-medium uppercase tracking-wider hover:text-text-secondary transition-colors",
32
- "aria-expanded": !a,
33
- children: [/* @__PURE__ */ r("span", { children: t.title }), /* @__PURE__ */ r("svg", {
34
- className: e("w-4 h-4 transition-transform", a && "rotate-180"),
33
+ "aria-expanded": !n,
34
+ children: [/* @__PURE__ */ i("span", { children: t.title }), /* @__PURE__ */ i("svg", {
35
+ className: e("w-4 h-4 transition-transform", n && "rotate-180"),
35
36
  fill: "none",
36
37
  stroke: "currentColor",
37
38
  viewBox: "0 0 24 24",
38
- children: /* @__PURE__ */ r("path", {
39
+ children: /* @__PURE__ */ i("path", {
39
40
  strokeLinecap: "round",
40
41
  strokeLinejoin: "round",
41
42
  strokeWidth: 2,
42
43
  d: "M19 9l-7 7-7-7"
43
44
  })
44
45
  })]
45
- }) : /* @__PURE__ */ r("div", {
46
+ }) : /* @__PURE__ */ i("div", {
46
47
  className: "text-text-muted text-[11px] font-medium uppercase tracking-wider",
47
48
  children: t.title
48
49
  })
49
- }), (!t.collapsible || !a) && /* @__PURE__ */ r("ul", {
50
+ }), (!t.collapsible || !n) && /* @__PURE__ */ i("ul", {
50
51
  className: "space-y-1 px-2",
51
- children: t.items.map((t) => /* @__PURE__ */ r("li", { children: /* @__PURE__ */ i("button", {
52
+ children: t.items.map((t) => /* @__PURE__ */ i("li", { children: /* @__PURE__ */ a("button", {
52
53
  onClick: t.onClick,
53
54
  disabled: t.disabled,
54
- className: e("w-full flex items-center gap-3 rounded-button text-sm transition-all duration-200 ease-[var(--motion-easing-out)]", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border", o ? "justify-center p-3" : "px-3 py-2", {
55
+ className: e("w-full flex items-center gap-3 rounded-button text-sm transition-all duration-200 ease-[var(--motion-easing-out)]", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border", s ? "justify-center p-3" : "px-3 py-2", {
55
56
  "bg-[var(--color-accent-soft)] text-text-primary font-medium": t.isActive && !t.disabled,
56
57
  "text-text-secondary hover:text-text-primary hover:bg-bg-sunken": !t.isActive && !t.disabled,
57
58
  "text-text-disabled cursor-not-allowed opacity-50": t.disabled
58
59
  }),
59
- "aria-label": o ? t.label : void 0,
60
+ "aria-label": s ? t.label : void 0,
60
61
  "aria-current": t.isActive ? "page" : void 0,
61
- title: o ? t.label : void 0,
62
+ title: s ? t.label : void 0,
62
63
  type: "button",
63
- children: [t.icon && /* @__PURE__ */ r("span", {
64
+ children: [t.icon && /* @__PURE__ */ i("span", {
64
65
  className: "flex items-center flex-shrink-0",
65
66
  children: t.icon
66
- }), !o && /* @__PURE__ */ i(n, { children: [/* @__PURE__ */ r("span", {
67
+ }), !s && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("span", {
67
68
  className: "flex-1 text-left truncate",
68
69
  children: t.label
69
- }), t.badge !== void 0 && /* @__PURE__ */ r("span", {
70
+ }), t.badge !== void 0 && /* @__PURE__ */ i("span", {
70
71
  className: e("flex items-center justify-center min-w-[20px] h-5 px-1.5 rounded-full text-xs font-medium tabular-nums", t.isActive ? "bg-action-primary-bg text-action-primary-text" : "bg-status-info-bg-subtle text-status-info-text"),
71
72
  children: typeof t.badge == "number" && t.badge > 99 ? "99+" : t.badge
72
73
  })] })]
@@ -75,22 +76,22 @@ var a = ({ sections: a, isCollapsed: o = !1, onToggleCollapse: s, header: c, foo
75
76
  }, t.title);
76
77
  })
77
78
  }),
78
- l && /* @__PURE__ */ r("div", {
79
- className: e("border-t border-border-subtle", o ? "flex justify-center p-4" : "px-card-padding py-4"),
80
- children: l
79
+ u && /* @__PURE__ */ i("div", {
80
+ className: e("border-t border-border-subtle", s ? "flex justify-center p-4" : "px-card-padding py-4"),
81
+ children: u
81
82
  }),
82
- s && /* @__PURE__ */ r("button", {
83
- onClick: s,
84
- className: e("border-t border-border-subtle p-4 text-text-secondary hover:text-text-primary hover:bg-bg-sunken transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border", o && "flex justify-center"),
85
- "aria-label": o ? "Expand sidebar" : "Collapse sidebar",
86
- title: o ? "Expand sidebar" : "Collapse sidebar",
83
+ c && /* @__PURE__ */ i("button", {
84
+ onClick: c,
85
+ className: e("border-t border-border-subtle p-4 text-text-secondary hover:text-text-primary hover:bg-bg-sunken transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border", s && "flex justify-center"),
86
+ "aria-label": s ? m("nav.expandSidebar", "Expand sidebar") : m("nav.collapseSidebar", "Collapse sidebar"),
87
+ title: s ? m("nav.expandSidebar", "Expand sidebar") : m("nav.collapseSidebar", "Collapse sidebar"),
87
88
  type: "button",
88
- children: /* @__PURE__ */ r("svg", {
89
- className: e("w-5 h-5 transition-transform", o && "rotate-180"),
89
+ children: /* @__PURE__ */ i("svg", {
90
+ className: e("w-5 h-5 transition-transform", s && "rotate-180"),
90
91
  fill: "none",
91
92
  stroke: "currentColor",
92
93
  viewBox: "0 0 24 24",
93
- children: /* @__PURE__ */ r("path", {
94
+ children: /* @__PURE__ */ i("path", {
94
95
  strokeLinecap: "round",
95
96
  strokeLinejoin: "round",
96
97
  strokeWidth: 2,
@@ -102,4 +103,4 @@ var a = ({ sections: a, isCollapsed: o = !1, onToggleCollapse: s, header: c, foo
102
103
  });
103
104
  };
104
105
  //#endregion
105
- export { a as Sidebar };
106
+ export { o as Sidebar };