@burdenoff/website-sdk 2026.1102.3 → 2026.1104.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.
@@ -3115,23 +3115,29 @@ var ANSWER_ACTION_ACTIVE = "border-primary/40 bg-accent text-primary";
3115
3115
  function ReadAloudButton({
3116
3116
  strings: T,
3117
3117
  text,
3118
- lang
3118
+ lang,
3119
+ hold
3119
3120
  }) {
3120
3121
  const speech = chunkP5GMVPR6_js.useSpeechOutput({ lang });
3121
3122
  if (!speech.supported) return null;
3122
3123
  const label = speech.speaking ? T.stopReading : T.readAloud;
3124
+ const held = hold !== null && !speech.speaking;
3123
3125
  return /* @__PURE__ */ jsxRuntime.jsxs(
3124
3126
  "button",
3125
3127
  {
3126
3128
  "data-boff-explore": "read-aloud",
3127
3129
  "data-speaking": speech.speaking ? "true" : "false",
3128
3130
  type: "button",
3129
- title: label,
3131
+ title: held ? hold : label,
3130
3132
  "aria-pressed": speech.speaking,
3131
- onClick: () => speech.toggle(text),
3133
+ "aria-disabled": held ? "true" : void 0,
3134
+ onClick: () => {
3135
+ if (!held) speech.toggle(text);
3136
+ },
3132
3137
  className: chunkC6OJIHNO_js.cn(
3133
3138
  ANSWER_ACTION_PILL,
3134
- speech.speaking ? ANSWER_ACTION_ACTIVE : ANSWER_ACTION_IDLE
3139
+ speech.speaking ? ANSWER_ACTION_ACTIVE : ANSWER_ACTION_IDLE,
3140
+ held && "cursor-not-allowed opacity-50"
3135
3141
  ),
3136
3142
  children: [
3137
3143
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Volume2, { className: "h-3 w-3 shrink-0", "aria-hidden": "true" }),
@@ -3144,7 +3150,8 @@ function AnswerActions({
3144
3150
  strings: T,
3145
3151
  text,
3146
3152
  speechText,
3147
- speechLang
3153
+ speechLang,
3154
+ voiceHold
3148
3155
  }) {
3149
3156
  const [outcome, setOutcome] = react.useState("idle");
3150
3157
  const resetRef = react.useRef(null);
@@ -3196,7 +3203,15 @@ function AnswerActions({
3196
3203
  ]
3197
3204
  }
3198
3205
  ),
3199
- /* @__PURE__ */ jsxRuntime.jsx(ReadAloudButton, { strings: T, text: speechText, lang: speechLang }),
3206
+ /* @__PURE__ */ jsxRuntime.jsx(
3207
+ ReadAloudButton,
3208
+ {
3209
+ strings: T,
3210
+ text: speechText,
3211
+ lang: speechLang,
3212
+ hold: voiceHold
3213
+ }
3214
+ ),
3200
3215
  /* @__PURE__ */ jsxRuntime.jsx("span", { "data-boff-explore": "copy-status", role: "status", className: "sr-only", children: outcome === "idle" ? "" : label })
3201
3216
  ]
3202
3217
  }
@@ -3250,6 +3265,7 @@ function AssistantBubble({
3250
3265
  productSlugs,
3251
3266
  productNames,
3252
3267
  speechLang,
3268
+ voiceHold,
3253
3269
  onNavigate,
3254
3270
  anchorRef,
3255
3271
  onFollow,
@@ -3416,7 +3432,8 @@ function AssistantBubble({
3416
3432
  strings: T,
3417
3433
  text: copyText,
3418
3434
  speechText,
3419
- speechLang
3435
+ speechLang,
3436
+ voiceHold
3420
3437
  }
3421
3438
  ) : null,
3422
3439
  completed && onFeedback ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -4036,6 +4053,7 @@ function ExploreView({
4036
4053
  locale,
4037
4054
  presentation = "page",
4038
4055
  active = true,
4056
+ voiceHold = null,
4039
4057
  explorePath = "/explore",
4040
4058
  examplePrompts,
4041
4059
  scope,
@@ -4114,6 +4132,12 @@ function ExploreView({
4114
4132
  stopDictation();
4115
4133
  chunkP5GMVPR6_js.stopSpeaking();
4116
4134
  }, [active, stopDictation]);
4135
+ const voiceHeld = voiceHold !== null;
4136
+ react.useEffect(() => {
4137
+ if (!voiceHeld) return;
4138
+ stopDictation();
4139
+ chunkP5GMVPR6_js.stopSpeaking();
4140
+ }, [voiceHeld, stopDictation]);
4117
4141
  const [disclaimerOpen, setDisclaimerOpen] = react.useState(false);
4118
4142
  const [attachmentNotice, setAttachmentNotice] = react.useState(null);
4119
4143
  const fileInputRef = react.useRef(null);
@@ -4793,6 +4817,7 @@ function ExploreView({
4793
4817
  productSlugs,
4794
4818
  productNames,
4795
4819
  speechLang,
4820
+ voiceHold,
4796
4821
  onNavigate,
4797
4822
  anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
4798
4823
  onFollow: (kind, url) => recordClick(message.id, kind, url),
@@ -5003,9 +5028,16 @@ function ExploreView({
5003
5028
  disabled: composerDisabled,
5004
5029
  "aria-label": speech.listening ? T.stopDictating : T.dictate,
5005
5030
  "aria-pressed": speech.listening,
5006
- title: speech.listening ? T.stopDictating : T.dictate,
5007
- onClick: speech.toggle,
5008
- className: chunkC6OJIHNO_js.cn(speech.listening && "animate-pulse"),
5031
+ "aria-disabled": voiceHeld && !speech.listening ? "true" : void 0,
5032
+ title: speech.listening ? T.stopDictating : voiceHold ?? T.dictate,
5033
+ onClick: () => {
5034
+ if (voiceHeld && !speech.listening) return;
5035
+ speech.toggle();
5036
+ },
5037
+ className: chunkC6OJIHNO_js.cn(
5038
+ speech.listening && "animate-pulse",
5039
+ voiceHeld && !speech.listening && "cursor-not-allowed opacity-50"
5040
+ ),
5009
5041
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
5010
5042
  }
5011
5043
  ) : null,
@@ -5156,5 +5188,5 @@ exports.resolveExploreLocale = resolveExploreLocale;
5156
5188
  exports.speechLocaleOf = speechLocaleOf;
5157
5189
  exports.summariseReferences = summariseReferences;
5158
5190
  exports.useExploreConversation = useExploreConversation;
5159
- //# sourceMappingURL=chunk-DZLUZKOX.js.map
5160
- //# sourceMappingURL=chunk-DZLUZKOX.js.map
5191
+ //# sourceMappingURL=chunk-22OT6E26.js.map
5192
+ //# sourceMappingURL=chunk-22OT6E26.js.map