@burdenoff/fe-libs 2026.1024.1 → 2026.1024.3

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 (132) hide show
  1. package/dist/chrome/FooterBar.d.ts +1 -1
  2. package/dist/chrome/NativePageTransition.d.ts +1 -1
  3. package/dist/chrome/ProductPickerSheet.js +42 -42
  4. package/dist/chrome/ProductSwitcher.d.ts +8 -0
  5. package/dist/chrome/ProductSwitcher.js +83 -72
  6. package/dist/chrome/index.d.ts +9 -9
  7. package/dist/chrome/swipe/swipeMath.d.ts +1 -1
  8. package/dist/shared/assistant/api.d.ts +3 -3
  9. package/dist/shared/assistant/appControls/grammar.d.ts +21 -21
  10. package/dist/shared/assistant/appControls/languageReply.d.ts +1 -1
  11. package/dist/shared/assistant/appControls/names.d.ts +3 -3
  12. package/dist/shared/assistant/appControls/pageAdapters.d.ts +5 -5
  13. package/dist/shared/assistant/appControls/plan.d.ts +38 -38
  14. package/dist/shared/assistant/appControls/types.d.ts +15 -15
  15. package/dist/shared/assistant/appControls/useAssistantControl.d.ts +1 -1
  16. package/dist/shared/assistant/attachmentSources.d.ts +2 -2
  17. package/dist/shared/assistant/attachments.d.ts +5 -5
  18. package/dist/shared/assistant/autoRouting.d.ts +6 -6
  19. package/dist/shared/assistant/avatar/live/LiveAvatarStage.js +5 -1
  20. package/dist/shared/assistant/avatar/live/LiveAvatarTabView.js +28 -25
  21. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.d.ts +1 -1
  22. package/dist/shared/assistant/avatar/live/createLiveAvatarSeam.js +61 -50
  23. package/dist/shared/assistant/avatar/live/liveAvatarController.d.ts +19 -4
  24. package/dist/shared/assistant/avatar/live/liveAvatarController.js +163 -155
  25. package/dist/shared/assistant/avatar/live/liveAvatarStatus.d.ts +5 -3
  26. package/dist/shared/assistant/avatar/live/liveAvatarStatus.js +2 -2
  27. package/dist/shared/assistant/conversation.d.ts +20 -20
  28. package/dist/shared/assistant/displayContent.d.ts +4 -4
  29. package/dist/shared/assistant/documentText.d.ts +3 -3
  30. package/dist/shared/assistant/exportConversation.d.ts +1 -1
  31. package/dist/shared/assistant/history/historyControls.d.ts +4 -4
  32. package/dist/shared/assistant/history/historyErrors.d.ts +3 -3
  33. package/dist/shared/assistant/history/historyList.d.ts +5 -5
  34. package/dist/shared/assistant/history/historyMerge.d.ts +4 -4
  35. package/dist/shared/assistant/history/historyOperations.d.ts +1 -1
  36. package/dist/shared/assistant/history/historySearch.d.ts +5 -5
  37. package/dist/shared/assistant/history/historyStatus.d.ts +1 -1
  38. package/dist/shared/assistant/history/historyTypes.d.ts +12 -12
  39. package/dist/shared/assistant/history/profileBoundStorage.d.ts +2 -2
  40. package/dist/shared/assistant/i18n.d.ts +1 -1
  41. package/dist/shared/assistant/i18nManifest.d.ts +534 -534
  42. package/dist/shared/assistant/liveDeltas.d.ts +1 -1
  43. package/dist/shared/assistant/liveOverlay.d.ts +1 -1
  44. package/dist/shared/assistant/localUiCommandCopy.d.ts +1 -1
  45. package/dist/shared/assistant/localUiCommands.d.ts +22 -22
  46. package/dist/shared/assistant/localeCommands/engine.d.ts +5 -5
  47. package/dist/shared/assistant/localeCommands/evaluate.d.ts +8 -8
  48. package/dist/shared/assistant/localeCommands/fold.d.ts +2 -2
  49. package/dist/shared/assistant/localeCommands/frames.d.ts +3 -3
  50. package/dist/shared/assistant/localeCommands/gate.d.ts +3 -3
  51. package/dist/shared/assistant/localeCommands/languageNames.d.ts +1 -1
  52. package/dist/shared/assistant/localeCommands/normalise.d.ts +1 -1
  53. package/dist/shared/assistant/localeCommands/types.d.ts +4 -4
  54. package/dist/shared/assistant/modeCapabilities.d.ts +1 -1
  55. package/dist/shared/assistant/modeCopy.d.ts +2 -2
  56. package/dist/shared/assistant/permissionError.d.ts +2 -2
  57. package/dist/shared/assistant/preview/surfaceState.d.ts +1 -1
  58. package/dist/shared/assistant/preview/types.d.ts +5 -5
  59. package/dist/shared/assistant/preview/writeActionResults.d.ts +1 -1
  60. package/dist/shared/assistant/prewarm.d.ts +5 -5
  61. package/dist/shared/assistant/quota.d.ts +2 -2
  62. package/dist/shared/assistant/sandboxReadiness.d.ts +2 -2
  63. package/dist/shared/assistant/speech/speechFeed.d.ts +3 -3
  64. package/dist/shared/assistant/turnOutcome.d.ts +2 -2
  65. package/dist/shared/assistant/turnProgress.d.ts +1 -1
  66. package/dist/shared/assistant/turnState.d.ts +1 -1
  67. package/dist/shared/assistant/turnStream.d.ts +3 -3
  68. package/dist/shared/assistant/turnTimeline.d.ts +13 -13
  69. package/dist/shared/assistant/turnTimingReport.d.ts +1 -1
  70. package/dist/shared/assistant/turnTimingReporter.d.ts +3 -3
  71. package/dist/shared/assistant/ui/AssistantAvatarTabs.d.ts +1 -1
  72. package/dist/shared/assistant/ui/AssistantHistoryNotices.d.ts +1 -1
  73. package/dist/shared/assistant/ui/AssistantToolActivity.d.ts +1 -1
  74. package/dist/shared/assistant/ui/AssistantUiOfferLink.d.ts +2 -2
  75. package/dist/shared/assistant/ui/AssistantWriteConfirmDialog.d.ts +3 -3
  76. package/dist/shared/assistant/ui/composer/AssistantAttachmentButton.d.ts +1 -1
  77. package/dist/shared/assistant/ui/composer/AssistantConnectSourceItem.d.ts +1 -1
  78. package/dist/shared/assistant/ui/leaveConfirmFocus.d.ts +1 -1
  79. package/dist/shared/assistant/ui/leaveConfirmNavigate.d.ts +3 -3
  80. package/dist/shared/assistant/ui/panelOverlays.d.ts +5 -5
  81. package/dist/shared/assistant/ui/useVoiceSession.d.ts +5 -5
  82. package/dist/shared/assistant/ui/useWriteProposalConfirm.d.ts +4 -4
  83. package/dist/shared/assistant/ui/useWriteProposals.d.ts +2 -2
  84. package/dist/shared/assistant/ui/voice/AssistantVoiceSession.d.ts +1 -1
  85. package/dist/shared/assistant/ui/voice/VoiceCaption.d.ts +1 -1
  86. package/dist/shared/assistant/ui/voice/VoiceWaveform.d.ts +1 -1
  87. package/dist/shared/assistant/ui/voice/voiceSessionEscape.d.ts +2 -2
  88. package/dist/shared/assistant/ui/voice/voiceStartGate.d.ts +6 -6
  89. package/dist/shared/assistant/ui/writeProposalPresentation.d.ts +1 -1
  90. package/dist/shared/assistant/uiActions/actOnResolve.d.ts +5 -5
  91. package/dist/shared/assistant/uiActions/assistantHref.d.ts +2 -2
  92. package/dist/shared/assistant/uiActions/backStack.d.ts +1 -1
  93. package/dist/shared/assistant/uiActions/deixis.d.ts +3 -3
  94. package/dist/shared/assistant/uiActions/entityRoutes.d.ts +1 -1
  95. package/dist/shared/assistant/uiActions/navigationOutcome.d.ts +8 -8
  96. package/dist/shared/assistant/uiActions/offerYesOnSurface.d.ts +1 -1
  97. package/dist/shared/assistant/uiActions/resolveTarget.d.ts +2 -2
  98. package/dist/shared/assistant/uiActions/uiOffers.d.ts +5 -5
  99. package/dist/shared/assistant/usageReporting.d.ts +2 -2
  100. package/dist/shared/assistant/useWorkspaceWriteAccess.d.ts +1 -1
  101. package/dist/shared/assistant/voice/affirmations.d.ts +1 -1
  102. package/dist/shared/assistant/voice/handsFree.d.ts +3 -3
  103. package/dist/shared/assistant/voice/handsfree/bargeIn.d.ts +5 -5
  104. package/dist/shared/assistant/voice/handsfree/echoGate.d.ts +6 -6
  105. package/dist/shared/assistant/voice/handsfree/handsFreeController.d.ts +7 -7
  106. package/dist/shared/assistant/voice/handsfree/handsFreeSetting.d.ts +2 -2
  107. package/dist/shared/assistant/voice/handsfree/micCapture.d.ts +1 -1
  108. package/dist/shared/assistant/voice/handsfree/playbackReference.d.ts +1 -1
  109. package/dist/shared/assistant/voice/handsfree/sttTransport.d.ts +3 -3
  110. package/dist/shared/assistant/voice/handsfree/useHandsFreeInterrupt.d.ts +4 -4
  111. package/dist/shared/assistant/voice/handsfree/vad.d.ts +1 -1
  112. package/dist/shared/assistant/voice/speechPlayback.d.ts +7 -7
  113. package/dist/shared/assistant/voice/useVoiceInput.d.ts +1 -1
  114. package/dist/shared/assistant/voice/voiceReopen.d.ts +8 -8
  115. package/dist/shared/assistant/writeConfirmSeam.d.ts +1 -1
  116. package/dist/shared/assistant/writeModeConsent.d.ts +7 -7
  117. package/dist/shared/assistant/writeProposalDiscovery.d.ts +3 -3
  118. package/dist/shared/assistant/writeProposalErrorCopy.d.ts +1 -1
  119. package/dist/shared/assistant/writeProposals.d.ts +23 -23
  120. package/dist/shared/assistant/writeReplyBinder.d.ts +11 -11
  121. package/dist/shared/assistant/writeReplySend.d.ts +7 -7
  122. package/dist/shared/components/LandingOrDashboardRedirect.d.ts +18 -3
  123. package/dist/shared/components/LandingOrDashboardRedirect.js +58 -28
  124. package/dist/shared/components/index.d.ts +2 -1
  125. package/dist/shared/hooks/shell/globalSearchError.d.ts +2 -2
  126. package/dist/shared/navigation/productSwitchHandoff.d.ts +45 -0
  127. package/dist/shared/navigation/productSwitchHandoff.js +27 -0
  128. package/dist/shared/navigation/unsavedChanges.d.ts +1 -1
  129. package/dist/shared/utils/index.d.ts +3 -3
  130. package/dist/shared-components.js +7 -6
  131. package/dist/shared.js +71 -70
  132. package/package.json +3 -2
@@ -12,7 +12,7 @@ export interface FooterItem {
12
12
  /** Click handler */
13
13
  onClick?: () => void;
14
14
  /** Item type */
15
- type?: "status" | "action" | "info";
15
+ type?: 'status' | 'action' | 'info';
16
16
  /** Badge or indicator text */
17
17
  badge?: string;
18
18
  }
@@ -6,4 +6,4 @@ export interface NativePageTransitionProps {
6
6
  /** Override the animation duration (ms). Default: CSS (280 iOS / 210 Android). */
7
7
  durationMs?: number;
8
8
  }
9
- export declare function NativePageTransition({ children, enabled, durationMs, }: NativePageTransitionProps): import('react/jsx-runtime').JSX.Element;
9
+ export declare function NativePageTransition({ children, enabled, durationMs }: NativePageTransitionProps): import('react/jsx-runtime').JSX.Element;
@@ -1,108 +1,108 @@
1
1
  import { isSameProductSlug as e } from "../shared/config/productSlug.js";
2
2
  import { useShellLabel as t } from "../shared/providers/shell/useShellLabel.js";
3
3
  import { Sheet as n, SheetContent as r, SheetHeader as i, SheetTitle as a } from "../ui/sheet.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";
4
+ import { filterProducts as o, resolveProductLogo as s, toSwitchTarget as c } from "./ProductSwitcher.js";
5
+ import { useMemo as l, useState as u } from "react";
6
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
7
  //#region src/chrome/ProductPickerSheet.tsx
8
- var f = 6, p = ({ product: e }) => {
9
- let [t, n] = l(!1), r = s(e);
10
- return r && !t ? /* @__PURE__ */ u("div", {
8
+ var p = 6, m = ({ product: e }) => {
9
+ let [t, n] = u(!1), r = s(e);
10
+ return r && !t ? /* @__PURE__ */ d("div", {
11
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",
12
- children: /* @__PURE__ */ u("img", {
12
+ children: /* @__PURE__ */ d("img", {
13
13
  src: r,
14
14
  alt: e.name,
15
15
  className: "size-full object-contain",
16
16
  onError: () => n(!0)
17
17
  })
18
- }) : e.icon ? /* @__PURE__ */ u("div", {
18
+ }) : e.icon ? /* @__PURE__ */ d("div", {
19
19
  className: "size-10 rounded-lg bg-[var(--color-accent-soft)] flex items-center justify-center flex-shrink-0",
20
20
  children: e.icon
21
- }) : /* @__PURE__ */ u("div", {
21
+ }) : /* @__PURE__ */ d("div", {
22
22
  className: "size-10 rounded-lg bg-action-primary-bg flex items-center justify-center flex-shrink-0",
23
- children: /* @__PURE__ */ u("span", {
23
+ children: /* @__PURE__ */ d("span", {
24
24
  className: "text-action-primary-text font-bold text-sm",
25
25
  children: e.name.substring(0, 2).toUpperCase()
26
26
  })
27
27
  });
28
- }, m = ({ open: s, onOpenChange: m, products: h, currentProductId: g, onProductChange: _ }) => {
29
- let v = t(), [y, b] = l(""), x = h.length > f, S = c(() => o(h, y), [h, y]), C = (e) => {
30
- _ && _(e), m(!1);
28
+ }, h = ({ open: s, onOpenChange: h, products: g, currentProductId: _, onProductChange: v }) => {
29
+ let y = t(), [b, x] = u(""), S = g.length > p, C = l(() => o(g, b), [g, b]), w = (e) => {
30
+ v && v(c(e)), h(!1);
31
31
  };
32
- return /* @__PURE__ */ u(n, {
32
+ return /* @__PURE__ */ d(n, {
33
33
  open: s,
34
34
  onOpenChange: (e) => {
35
- e || b(""), m(e);
35
+ e || x(""), h(e);
36
36
  },
37
- children: /* @__PURE__ */ d(r, {
37
+ children: /* @__PURE__ */ f(r, {
38
38
  side: "bottom",
39
39
  className: "h-[60vh] flex flex-col p-0",
40
40
  children: [
41
- /* @__PURE__ */ u(i, {
41
+ /* @__PURE__ */ d(i, {
42
42
  className: "px-4 pt-4 pb-2 border-b border-border-subtle",
43
- children: /* @__PURE__ */ u(a, {
43
+ children: /* @__PURE__ */ d(a, {
44
44
  className: "text-text-primary",
45
- children: v("productSwitcher.title", "Switch Product")
45
+ children: y("productSwitcher.title", "Switch Product")
46
46
  })
47
47
  }),
48
- x && /* @__PURE__ */ d("div", {
48
+ S && /* @__PURE__ */ f("div", {
49
49
  className: "relative px-4 py-2 border-b border-border-subtle",
50
- children: [/* @__PURE__ */ u("svg", {
50
+ children: [/* @__PURE__ */ d("svg", {
51
51
  className: "pointer-events-none absolute left-7 top-1/2 -translate-y-1/2 size-4 text-text-muted",
52
52
  fill: "none",
53
53
  stroke: "currentColor",
54
54
  viewBox: "0 0 24 24",
55
- children: /* @__PURE__ */ u("path", {
55
+ children: /* @__PURE__ */ d("path", {
56
56
  strokeLinecap: "round",
57
57
  strokeLinejoin: "round",
58
58
  strokeWidth: 2,
59
59
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
60
60
  })
61
- }), /* @__PURE__ */ u("input", {
61
+ }), /* @__PURE__ */ d("input", {
62
62
  type: "text",
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"),
63
+ value: b,
64
+ onChange: (e) => x(e.target.value),
65
+ placeholder: y("productSwitcher.searchPlaceholder", "Search products…"),
66
+ "aria-label": y("productSwitcher.searchAria", "Search products"),
67
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)]"
68
68
  })]
69
69
  }),
70
- /* @__PURE__ */ d("div", {
70
+ /* @__PURE__ */ f("div", {
71
71
  className: "flex-1 overflow-y-auto py-2",
72
- children: [S.length === 0 && /* @__PURE__ */ u("p", {
72
+ children: [C.length === 0 && /* @__PURE__ */ d("p", {
73
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"}`,
74
+ children: y("productSwitcher.noMatches", "No products match “{{query}}”", { query: b })
75
+ }), C.map((t) => /* @__PURE__ */ f("button", {
76
+ onClick: () => w(t),
77
+ className: `w-full flex items-center gap-4 px-4 py-3.5 text-body-sm transition-colors ${e(t.id, _) ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"}`,
78
78
  children: [
79
- /* @__PURE__ */ u(p, { product: t }),
80
- /* @__PURE__ */ d("div", {
79
+ /* @__PURE__ */ d(m, { product: t }),
80
+ /* @__PURE__ */ f("div", {
81
81
  className: "flex-1 text-left min-w-0",
82
- children: [/* @__PURE__ */ u("p", {
82
+ children: [/* @__PURE__ */ d("p", {
83
83
  className: "font-medium text-text-primary",
84
84
  children: t.name
85
- }), t.description && /* @__PURE__ */ u("p", {
85
+ }), t.description && /* @__PURE__ */ d("p", {
86
86
  className: "text-xs text-text-secondary truncate",
87
87
  children: t.description
88
88
  })]
89
89
  }),
90
- e(t.id, g) && /* @__PURE__ */ u("svg", {
90
+ e(t.id, _) && /* @__PURE__ */ d("svg", {
91
91
  className: "size-5 text-action-primary-bg flex-shrink-0",
92
92
  fill: "currentColor",
93
93
  viewBox: "0 0 20 20",
94
- children: /* @__PURE__ */ u("path", {
94
+ children: /* @__PURE__ */ d("path", {
95
95
  fillRule: "evenodd",
96
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",
97
97
  clipRule: "evenodd"
98
98
  })
99
99
  }),
100
- t.url && !e(t.id, g) && /* @__PURE__ */ u("svg", {
100
+ t.url && !e(t.id, _) && /* @__PURE__ */ d("svg", {
101
101
  className: "size-4 text-text-muted flex-shrink-0",
102
102
  fill: "none",
103
103
  stroke: "currentColor",
104
104
  viewBox: "0 0 24 24",
105
- children: /* @__PURE__ */ u("path", {
105
+ children: /* @__PURE__ */ d("path", {
106
106
  strokeLinecap: "round",
107
107
  strokeLinejoin: "round",
108
108
  strokeWidth: 2,
@@ -117,4 +117,4 @@ var f = 6, p = ({ product: e }) => {
117
117
  });
118
118
  };
119
119
  //#endregion
120
- export { m as ProductPickerSheet };
120
+ export { h as ProductPickerSheet };
@@ -26,6 +26,14 @@ export declare function resolveProductLogo(product?: {
26
26
  * query returns the list unchanged. Shared by the desktop `ProductSwitcher` and
27
27
  * the mobile `ProductPickerSheet` so both filter identically.
28
28
  */
29
+ /**
30
+ * The product a switcher click hands to navigation: the same entry with the
31
+ * product-switch handoff marker on its URL (see `productSwitchHandoff`).
32
+ * Entries without a URL, or with a placeholder one, are returned unchanged.
33
+ */
34
+ export declare function toSwitchTarget<T extends {
35
+ url?: string;
36
+ }>(product: T): T;
29
37
  export declare function filterProducts<T extends {
30
38
  id: string;
31
39
  name: string;
@@ -1,21 +1,22 @@
1
1
  import { isSameProductSlug as e } from "../shared/config/productSlug.js";
2
2
  import { getProductsWithUrls as t } from "../shared/config/products.js";
3
3
  import { useShellLabel as n } from "../shared/providers/shell/useShellLabel.js";
4
- import { useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
5
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
4
+ import { withProductSwitchHandoff as r } from "../shared/navigation/productSwitchHandoff.js";
5
+ import { useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
6
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
7
  //#region src/chrome/ProductSwitcher.tsx
7
- var l = 6;
8
- function u(e) {
8
+ var u = 6;
9
+ function d(e) {
9
10
  if (e?.logoUrl) return e.logoUrl;
10
11
  let t = e?.url;
11
12
  if (!(!t || t === "#")) return `${t.replace(/\/+$/, "")}/icons/icon.svg`;
12
13
  }
13
- var d = ({ product: e, sizeClass: t, textClass: n }) => {
14
- let [r, i] = o(!1), a = u(e), c = !!a && !r;
15
- return /* @__PURE__ */ s("div", {
16
- className: `${t} rounded-md flex items-center justify-center flex-shrink-0 overflow-hidden ${c ? "bg-white p-0.5 ring-1 ring-border-default dark:ring-border-strong" : `text-text-inverse font-semibold ${n}`}`,
17
- style: c ? void 0 : { backgroundColor: e?.color || "var(--color-action-primary-bg)" },
18
- children: c ? /* @__PURE__ */ s("img", {
14
+ var f = ({ product: e, sizeClass: t, textClass: n }) => {
15
+ let [r, i] = s(!1), a = d(e), o = !!a && !r;
16
+ return /* @__PURE__ */ c("div", {
17
+ className: `${t} rounded-md flex items-center justify-center flex-shrink-0 overflow-hidden ${o ? "bg-white p-0.5 ring-1 ring-border-default dark:ring-border-strong" : `text-text-inverse font-semibold ${n}`}`,
18
+ style: o ? void 0 : { backgroundColor: e?.color || "var(--color-action-primary-bg)" },
19
+ children: o ? /* @__PURE__ */ c("img", {
19
20
  src: a,
20
21
  alt: e?.name ?? "",
21
22
  className: "size-full object-contain",
@@ -23,61 +24,71 @@ var d = ({ product: e, sizeClass: t, textClass: n }) => {
23
24
  }) : e?.icon || e?.name.charAt(0)
24
25
  });
25
26
  };
26
- function f(e, t) {
27
+ function p(e) {
28
+ if (!e.url) return e;
29
+ let t = r(e.url);
30
+ return t === e.url ? e : {
31
+ ...e,
32
+ url: t
33
+ };
34
+ }
35
+ function m(e, t) {
27
36
  let n = t.trim().toLowerCase();
28
37
  return n ? e.filter((e) => e.name.toLowerCase().includes(n) || e.id.toLowerCase().includes(n) || (e.description ? e.description.toLowerCase().includes(n) : !1)) : e;
29
38
  }
30
- function p(n, r) {
39
+ function h(n, r) {
31
40
  return n.find((t) => e(t.id, r)) || (r ? t().find((t) => e(t.id, r)) || {
32
41
  id: r,
33
42
  name: r,
34
43
  url: "#"
35
44
  } : n[0]);
36
45
  }
37
- var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1 }) => {
38
- let g = n(), [_, v] = o(!1), [y, b] = o(""), x = a(null), S = a(null), C = p(t, u), w = t.length > l, T = i(() => f(t, y), [t, y]);
39
- r(() => {
46
+ var g = ({ products: t, currentProductId: r, onProductChange: d, compact: g = !1 }) => {
47
+ let _ = n(), [v, y] = s(!1), [b, x] = s(""), S = o(null), C = o(null), w = h(t, r), T = t.length > u, E = a(() => m(t, b), [t, b]);
48
+ i(() => {
40
49
  let e = (e) => {
41
- x.current && !x.current.contains(e.target) && v(!1);
50
+ S.current && !S.current.contains(e.target) && y(!1);
42
51
  };
43
- if (_) return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
44
- }, [_]), r(() => {
45
- if (!_) {
46
- b("");
52
+ if (v) return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
53
+ }, [v]), i(() => {
54
+ if (!v) {
55
+ x("");
47
56
  return;
48
57
  }
49
- if (w) {
50
- let e = setTimeout(() => S.current?.focus(), 60);
58
+ if (T) {
59
+ let e = setTimeout(() => C.current?.focus(), 60);
51
60
  return () => clearTimeout(e);
52
61
  }
53
- }, [_, w]);
54
- let E = (e) => {
55
- e.comingSoon || (m ? m(e) : window.location.href = e.url, v(!1));
62
+ }, [v, T]);
63
+ let D = (e) => {
64
+ if (e.comingSoon) return;
65
+ let t = p(e);
66
+ d ? d(t) : window.location.href = t.url, y(!1);
56
67
  };
57
- return /* @__PURE__ */ c("div", {
68
+ return /* @__PURE__ */ l("div", {
58
69
  className: "relative",
59
- ref: x,
60
- children: [/* @__PURE__ */ c("button", {
61
- onClick: () => v(!_),
62
- className: `flex items-center gap-2 px-3 py-2 rounded-button hover:bg-bg-sunken transition-colors ${_ ? "bg-bg-sunken" : ""}`,
63
- "aria-label": g("productSwitcher.title", "Switch product"),
64
- "aria-expanded": _,
70
+ ref: S,
71
+ children: [/* @__PURE__ */ l("button", {
72
+ onClick: () => y(!v),
73
+ className: `flex items-center gap-2 px-3 py-2 rounded-button hover:bg-bg-sunken transition-colors ${v ? "bg-bg-sunken" : ""}`,
74
+ "aria-label": _("productSwitcher.title", "Switch product"),
75
+ "aria-expanded": v,
65
76
  children: [
66
- /* @__PURE__ */ s(d, {
67
- product: C,
77
+ /* @__PURE__ */ c(f, {
78
+ product: w,
68
79
  sizeClass: "size-6",
69
80
  textClass: "text-xs"
70
81
  }),
71
- !h && /* @__PURE__ */ s("span", {
82
+ !g && /* @__PURE__ */ c("span", {
72
83
  className: "text-body-sm font-medium text-text-primary",
73
- children: C?.name
84
+ children: w?.name
74
85
  }),
75
- !h && /* @__PURE__ */ s("svg", {
76
- className: `w-4 h-4 text-text-secondary transition-transform ${_ ? "rotate-180" : ""}`,
86
+ !g && /* @__PURE__ */ c("svg", {
87
+ className: `w-4 h-4 text-text-secondary transition-transform ${v ? "rotate-180" : ""}`,
77
88
  fill: "none",
78
89
  stroke: "currentColor",
79
90
  viewBox: "0 0 24 24",
80
- children: /* @__PURE__ */ s("path", {
91
+ children: /* @__PURE__ */ c("path", {
81
92
  strokeLinecap: "round",
82
93
  strokeLinejoin: "round",
83
94
  strokeWidth: 2,
@@ -85,54 +96,54 @@ var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1
85
96
  })
86
97
  })
87
98
  ]
88
- }), _ && /* @__PURE__ */ c("div", {
99
+ }), v && /* @__PURE__ */ l("div", {
89
100
  className: "absolute right-0 mt-2 w-[calc(100vw-1.5rem)] sm:w-72 max-w-72 bg-bg-elevated border border-border-subtle rounded-card shadow-[var(--shadow-elevation-4)] z-50 py-2 overflow-hidden animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-200",
90
101
  children: [
91
- /* @__PURE__ */ s("div", {
102
+ /* @__PURE__ */ c("div", {
92
103
  className: "px-4 py-2 border-b border-border-subtle",
93
- children: /* @__PURE__ */ s("p", {
104
+ children: /* @__PURE__ */ c("p", {
94
105
  className: "text-[11px] font-medium text-text-muted uppercase tracking-wider",
95
- children: g("productSwitcher.title", "Switch Product")
106
+ children: _("productSwitcher.title", "Switch Product")
96
107
  })
97
108
  }),
98
- w && /* @__PURE__ */ c("div", {
109
+ T && /* @__PURE__ */ l("div", {
99
110
  className: "relative px-3 py-2 border-b border-border-subtle",
100
111
  children: [
101
- /* @__PURE__ */ s("svg", {
112
+ /* @__PURE__ */ c("svg", {
102
113
  className: "pointer-events-none absolute left-6 top-1/2 -translate-y-1/2 size-4 text-text-muted",
103
114
  fill: "none",
104
115
  stroke: "currentColor",
105
116
  viewBox: "0 0 24 24",
106
- children: /* @__PURE__ */ s("path", {
117
+ children: /* @__PURE__ */ c("path", {
107
118
  strokeLinecap: "round",
108
119
  strokeLinejoin: "round",
109
120
  strokeWidth: 2,
110
121
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
111
122
  })
112
123
  }),
113
- /* @__PURE__ */ s("input", {
114
- ref: S,
124
+ /* @__PURE__ */ c("input", {
125
+ ref: C,
115
126
  type: "text",
116
- value: y,
117
- onChange: (e) => b(e.target.value),
127
+ value: b,
128
+ onChange: (e) => x(e.target.value),
118
129
  onKeyDown: (e) => {
119
- e.key === "Escape" && (y ? (e.stopPropagation(), b("")) : v(!1));
130
+ e.key === "Escape" && (b ? (e.stopPropagation(), x("")) : y(!1));
120
131
  },
121
- placeholder: g("productSwitcher.searchPlaceholder", "Search products…"),
122
- "aria-label": g("productSwitcher.searchAria", "Search products"),
132
+ placeholder: _("productSwitcher.searchPlaceholder", "Search products…"),
133
+ "aria-label": _("productSwitcher.searchAria", "Search products"),
123
134
  className: "w-full rounded-md border border-border-subtle bg-bg-surface py-2 pl-9 pr-8 text-sm text-text-primary placeholder:text-text-muted transition-all duration-200 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-[var(--color-action-primary-border)]"
124
135
  }),
125
- y && /* @__PURE__ */ s("button", {
136
+ b && /* @__PURE__ */ c("button", {
126
137
  type: "button",
127
- onClick: () => b(""),
128
- "aria-label": g("common.clearSearch", "Clear search"),
138
+ onClick: () => x(""),
139
+ "aria-label": _("common.clearSearch", "Clear search"),
129
140
  className: "absolute right-5 top-1/2 -translate-y-1/2 rounded-button p-1 text-text-muted transition-colors hover:bg-bg-sunken hover:text-text-primary",
130
- children: /* @__PURE__ */ s("svg", {
141
+ children: /* @__PURE__ */ c("svg", {
131
142
  className: "size-4",
132
143
  fill: "none",
133
144
  stroke: "currentColor",
134
145
  viewBox: "0 0 24 24",
135
- children: /* @__PURE__ */ s("path", {
146
+ children: /* @__PURE__ */ c("path", {
136
147
  strokeLinecap: "round",
137
148
  strokeLinejoin: "round",
138
149
  strokeWidth: 2,
@@ -142,35 +153,35 @@ var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1
142
153
  })
143
154
  ]
144
155
  }),
145
- /* @__PURE__ */ c("div", {
156
+ /* @__PURE__ */ l("div", {
146
157
  className: "py-1 max-h-96 overflow-y-auto",
147
- children: [T.length === 0 && /* @__PURE__ */ s("p", {
158
+ children: [E.length === 0 && /* @__PURE__ */ c("p", {
148
159
  className: "px-4 py-6 text-center text-body-sm text-text-muted",
149
- children: g("productSwitcher.noMatches", "No products match “{{query}}”", { query: y })
150
- }), T.map((t) => /* @__PURE__ */ c("button", {
151
- onClick: () => E(t),
160
+ children: _("productSwitcher.noMatches", "No products match “{{query}}”", { query: b })
161
+ }), E.map((t) => /* @__PURE__ */ l("button", {
162
+ onClick: () => D(t),
152
163
  disabled: t.comingSoon,
153
164
  "aria-disabled": t.comingSoon,
154
- title: t.comingSoon ? g("productSwitcher.soon", "Soon") : t.name,
155
- className: `w-full flex items-center gap-3 px-4 py-2.5 text-body-sm transition-colors ${t.comingSoon ? "text-text-muted cursor-not-allowed opacity-60" : e(t.id, u) ? "bg-[var(--color-accent-soft)] text-text-primary font-medium" : "text-text-primary hover:bg-bg-sunken"}`,
165
+ title: t.comingSoon ? _("productSwitcher.soon", "Soon") : t.name,
166
+ className: `w-full flex items-center gap-3 px-4 py-2.5 text-body-sm transition-colors ${t.comingSoon ? "text-text-muted cursor-not-allowed opacity-60" : e(t.id, r) ? "bg-[var(--color-accent-soft)] text-text-primary font-medium" : "text-text-primary hover:bg-bg-sunken"}`,
156
167
  children: [
157
- /* @__PURE__ */ s(d, {
168
+ /* @__PURE__ */ c(f, {
158
169
  product: t,
159
170
  sizeClass: "size-8",
160
171
  textClass: "text-sm"
161
172
  }),
162
- /* @__PURE__ */ s("span", {
173
+ /* @__PURE__ */ c("span", {
163
174
  className: "flex-1 text-left leading-tight",
164
175
  children: t.name
165
176
  }),
166
- t.comingSoon ? /* @__PURE__ */ s("span", {
177
+ t.comingSoon ? /* @__PURE__ */ c("span", {
167
178
  className: "shrink-0 whitespace-nowrap rounded-full border border-border-subtle bg-bg-sunken px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-text-secondary",
168
- children: g("productSwitcher.soon", "Soon")
169
- }) : e(t.id, u) && /* @__PURE__ */ s("svg", {
179
+ children: _("productSwitcher.soon", "Soon")
180
+ }) : e(t.id, r) && /* @__PURE__ */ c("svg", {
170
181
  className: "size-5 text-action-primary-bg",
171
182
  fill: "currentColor",
172
183
  viewBox: "0 0 20 20",
173
- children: /* @__PURE__ */ s("path", {
184
+ children: /* @__PURE__ */ c("path", {
174
185
  fillRule: "evenodd",
175
186
  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",
176
187
  clipRule: "evenodd"
@@ -184,4 +195,4 @@ var m = ({ products: t, currentProductId: u, onProductChange: m, compact: h = !1
184
195
  });
185
196
  };
186
197
  //#endregion
187
- export { m as ProductSwitcher, f as filterProducts, u as resolveProductLogo };
198
+ export { g as ProductSwitcher, m as filterProducts, d as resolveProductLogo, p as toSwitchTarget };
@@ -70,25 +70,25 @@ export { ShortcutHelpDialog } from './ShortcutHelpDialog';
70
70
  export type { AppShellLayoutProps } from './AppShellLayout';
71
71
  export type { HeaderBarProps, MobileActionItem } from './HeaderBar';
72
72
  export type { FooterBarProps, FooterItem, FooterSections } from './FooterBar';
73
- export type { FooterProps, FooterColumn, FooterLink, SocialLink, } from './Footer';
73
+ export type { FooterProps, FooterColumn, FooterLink, SocialLink } from './Footer';
74
74
  export type { SideNavigationProps, NavItem } from './SideNavigation';
75
- export type { GlobalSearchProps, SearchResult, SearchCategory, } from './GlobalSearch';
76
- export type { CommandPaletteProps, CommandAction, KeyboardShortcut, } from './CommandPalette';
75
+ export type { GlobalSearchProps, SearchResult, SearchCategory } from './GlobalSearch';
76
+ export type { CommandPaletteProps, CommandAction, KeyboardShortcut } from './CommandPalette';
77
77
  export type { BreadcrumbsProps, BreadcrumbItem } from './Breadcrumbs';
78
78
  export type { NavLinkProps } from './NavLink';
79
79
  export type { TabsProps, TabItem } from './Tabs';
80
80
  export type { SidebarProps, SidebarSection, SidebarItem } from './Sidebar';
81
- export type { ProfileSwitcherProps, Account as ProfileAccount, } from './ProfileSwitcher';
81
+ export type { ProfileSwitcherProps, Account as ProfileAccount } from './ProfileSwitcher';
82
82
  export type { ProductSwitcherProps, Product } from './ProductSwitcher';
83
83
  export type { LanguageSwitcherProps, Language } from './LanguageSwitcher';
84
84
  export type { GeographySwitcherProps } from './GeographySwitcher';
85
85
  export type { NotificationCenterProps } from './NotificationCenter';
86
- export type { ContextSwitcherProps, Organization, Workspace, Project, } from './ContextSwitcher';
86
+ export type { ContextSwitcherProps, Organization, Workspace, Project } from './ContextSwitcher';
87
87
  export { useContextSwitchController } from './contextSwitcher/useContextSwitchController';
88
88
  export type { ContextSwitchController, ContextSwitchEvent, ContextSwitchKind, UseContextSwitchControllerOptions, } from './contextSwitcher/useContextSwitchController';
89
89
  export { firstProjectOfWorkspace, switchOrganization, switchWorkspace, } from './contextSwitcher/contextSwitch';
90
90
  export type { ContextSwitchDeps, ContextSwitchOutcome, SwitchableOrganization, SwitchableProject, SwitchableWorkspace, WorkspaceSelection, } from './contextSwitcher/contextSwitch';
91
- export { resolveSwitchTarget, sectionLandingRule, } from './contextSwitcher/resolveSwitchTarget';
91
+ export { resolveSwitchTarget, sectionLandingRule } from './contextSwitcher/resolveSwitchTarget';
92
92
  export type { ContextSwitchRedirectRule } from './contextSwitcher/resolveSwitchTarget';
93
93
  export type { LanguagePickerSheetProps } from './LanguagePickerSheet';
94
94
  export type { ProductPickerSheetProps } from './ProductPickerSheet';
@@ -97,7 +97,7 @@ export type { ShortcutHelpDialogProps } from './ShortcutHelpDialog';
97
97
  export { AutoBreadcrumbs, registerBreadcrumbName, unregisterBreadcrumbName, } from './AutoBreadcrumbs';
98
98
  export { ProductSideNav } from './ProductSideNav';
99
99
  export type { ProductSideNavProps } from './ProductSideNav';
100
- export { PersonaSurfaceControls, PersonaSimulationPill, } from './PersonaSurfaceControls';
100
+ export { PersonaSurfaceControls, PersonaSimulationPill } from './PersonaSurfaceControls';
101
101
  export type { PersonaSurfaceControlsProps } from './PersonaSurfaceControls';
102
102
  export { NavCustomizeDialog } from './NavCustomizeDialog';
103
103
  export type { NavCustomizeDialogProps } from './NavCustomizeDialog';
@@ -120,12 +120,12 @@ export type { PluginWidgetGridProps } from './PluginWidgetGrid';
120
120
  export { PluginContextMenuTarget } from './PluginContextMenuTarget';
121
121
  export type { PluginContextMenuTargetProps } from './PluginContextMenuTarget';
122
122
  export { PluginFooterStrip } from './PluginFooterStrip';
123
- export { ThemePreferences, type ThemePreferencesProps, } from './ThemePreferences';
123
+ export { ThemePreferences, type ThemePreferencesProps } from './ThemePreferences';
124
124
  export { BrandMark, type BrandMarkProps } from './BrandMark';
125
125
  export { MobileTabBar, type MobileTabBarProps } from './MobileTabBar';
126
126
  export { useMobileTabBarVisible } from './mobileTabBar/useMobileTabBarVisible';
127
127
  export { selectMobileTabs } from './mobileTabBar/selectTabs';
128
128
  export { NativeTopBar, type NativeTopBarProps } from './NativeTopBar';
129
129
  export { SwipeNavigation, type SwipeNavigationProps } from './SwipeNavigation';
130
- export { NativePageTransition, type NativePageTransitionProps, } from './NativePageTransition';
130
+ export { NativePageTransition, type NativePageTransitionProps } from './NativePageTransition';
131
131
  export { findNavTitle, useNativeTopBarTitle } from './nativeTopBarTitle';
@@ -2,7 +2,7 @@
2
2
  * Pure math for edge-swipe navigation. No DOM, no React — unit-tested in
3
3
  * `src/chrome/__tests__/swipeMath.test.ts`.
4
4
  */
5
- export type SwipeDirection = "back" | "forward";
5
+ export type SwipeDirection = 'back' | 'forward';
6
6
  /**
7
7
  * Decide whether a touch at `x` starts an edge swipe, and in which direction.
8
8
  * `back` = left edge, `forward` = right edge (iOS only — pass
@@ -91,7 +91,7 @@ export interface ExistingAssistantSandbox {
91
91
  createdBy: string;
92
92
  }
93
93
  /** Pure reuse selector, kept separate so quarantine behavior is regression-testable. */
94
- export declare function selectExistingAssistantSandbox(sandboxes: ExistingAssistantSandbox[], product: string, mode: AssistantMode, _isProd: boolean, authContext: Pick<AssistantSandboxAuthContext, "userId">, excludedSandboxIds?: ReadonlySet<string>,
94
+ export declare function selectExistingAssistantSandbox(sandboxes: ExistingAssistantSandbox[], product: string, mode: AssistantMode, _isProd: boolean, authContext: Pick<AssistantSandboxAuthContext, 'userId'>, excludedSandboxIds?: ReadonlySet<string>,
95
95
  /**
96
96
  * The write-approval flow the panel can get (BOFF-7803 5a): the flow a
97
97
  * Take-action sandbox must run, and — at `proposal-v1` — the provisioning
@@ -172,7 +172,7 @@ export declare function modeRequiresConfirmWrites(mode: AssistantMode): boolean;
172
172
  * a mode that can write must arrive with its brake on, and that invariant is
173
173
  * too easy to break silently from inside an async network call.
174
174
  */
175
- export declare function buildAssistantSandboxEnv(product: string, mode: AssistantMode, workspaceId: string, authContext: Pick<AssistantSandboxAuthContext, "accessToken" | "workspaceToken">): Array<{
175
+ export declare function buildAssistantSandboxEnv(product: string, mode: AssistantMode, workspaceId: string, authContext: Pick<AssistantSandboxAuthContext, 'accessToken' | 'workspaceToken'>): Array<{
176
176
  name: string;
177
177
  value: string;
178
178
  }>;
@@ -219,7 +219,7 @@ export declare function isAssistantProvisioningUnavailable(error: unknown): bool
219
219
  * writes (the service gives it the read-only Ask plan whatever is sent), and
220
220
  * leaving it out keeps the field at its schema default.
221
221
  */
222
- export declare function buildProvisionAssistantSandboxInput(product: string, mode: AssistantMode, workspaceId: string, isProd: boolean, ttlSeconds: number, authContext: Pick<AssistantSandboxAuthContext, "organizationId">): Record<string, unknown>;
222
+ export declare function buildProvisionAssistantSandboxInput(product: string, mode: AssistantMode, workspaceId: string, isProd: boolean, ttlSeconds: number, authContext: Pick<AssistantSandboxAuthContext, 'organizationId'>): Record<string, unknown>;
223
223
  /**
224
224
  * Create an assistant sandbox, and return its id.
225
225
  *
@@ -26,60 +26,60 @@ import { SortDirection, UiLanguageCode } from './types';
26
26
  * sidebar names; an explicit one ("open the notification bell") does not.
27
27
  */
28
28
  export type AppControlRequest = {
29
- control: "header.notifications";
29
+ control: 'header.notifications';
30
30
  } | {
31
- control: "header.search";
31
+ control: 'header.search';
32
32
  query: string | null;
33
33
  } | {
34
- control: "header.help";
34
+ control: 'header.help';
35
35
  } | {
36
- control: "header.context";
36
+ control: 'header.context';
37
37
  } | {
38
- control: "header.workspace";
38
+ control: 'header.workspace';
39
39
  target: string;
40
40
  } | {
41
- control: "account.logout";
41
+ control: 'account.logout';
42
42
  } | {
43
- control: "sidebar";
43
+ control: 'sidebar';
44
44
  collapsed: boolean;
45
45
  } | {
46
- control: "sidebar.entry";
46
+ control: 'sidebar.entry';
47
47
  name: string;
48
48
  expanded: boolean;
49
49
  } | {
50
- control: "language";
50
+ control: 'language';
51
51
  code: UiLanguageCode;
52
52
  } | {
53
- control: "assistant.history";
53
+ control: 'assistant.history';
54
54
  } | {
55
- control: "assistant.transcript";
55
+ control: 'assistant.transcript';
56
56
  } | {
57
- control: "assistant.preview";
57
+ control: 'assistant.preview';
58
58
  } | {
59
- control: "assistant.preview.close";
59
+ control: 'assistant.preview.close';
60
60
  } | {
61
- control: "assistant.conversation.new";
61
+ control: 'assistant.conversation.new';
62
62
  } | {
63
- control: "page.tab";
63
+ control: 'page.tab';
64
64
  name: string;
65
65
  } | {
66
- control: "page.filter";
66
+ control: 'page.filter';
67
67
  filter: string | null;
68
68
  option: string;
69
69
  } | {
70
- control: "page.filter.clear";
70
+ control: 'page.filter.clear';
71
71
  filter: string | null;
72
72
  } | {
73
- control: "page.sort";
73
+ control: 'page.sort';
74
74
  field: string | null;
75
75
  direction: SortDirection | null;
76
76
  } | {
77
- control: "page.search";
77
+ control: 'page.search';
78
78
  query: string;
79
79
  } | {
80
- control: "page.search.clear";
80
+ control: 'page.search.clear';
81
81
  } | {
82
- control: "page.open";
82
+ control: 'page.open';
83
83
  name: string;
84
84
  };
85
85
  export interface AppControlMatch {