@burdenoff/website-sdk 2026.1026.1 → 2026.1027.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.
@@ -176,6 +176,9 @@ interface ExploreAnswerBodyProps {
176
176
  */
177
177
  declare function ExploreAnswerBody({ children, strings, imageOrigins, videoOrigins, productSlugs, enabled, components, className, }: ExploreAnswerBodyProps): react.JSX.Element;
178
178
 
179
+ /** Whose assistant this is: the portfolio's (the default, on every site), or one product's own. */
180
+ type ExploreScope = "portfolio" | "product";
181
+
179
182
  interface ExplorePageProps {
180
183
  /**
181
184
  * SEO metadata. Every field is optional and each one falls back to a default
@@ -200,6 +203,12 @@ interface ExplorePageProps {
200
203
  /**
201
204
  * Example prompts shown when `exploreCatalog` supplies none. Resolution
202
205
  * order: catalog → this prop → the SDK's built-in list.
206
+ *
207
+ * BOFF-9796: with `scope="product"` these are the ONLY prompts shown (each once, blanks dropped), whatever the
208
+ * catalog has, under an `ExploreChatProvider` too. Only when none are passed does the view fall back to the
209
+ * catalog's, less any that name another product and the SDK's "Which of your products fits a problem like mine?".
210
+ * A product-scoped site should pass its own: the catalog's are written for every site at once, and even those that
211
+ * name no product describe other sites' problems.
203
212
  */
204
213
  examplePrompts?: string[];
205
214
  /** Extra classes for the page root. */
@@ -252,6 +261,40 @@ interface ExplorePageProps {
252
261
  active?: boolean;
253
262
  /** BOFF-9697. The site's Explore route, for share links made from the panel. Default `/explore`. */
254
263
  explorePath?: string;
264
+ /**
265
+ * BOFF-9796. Whose assistant this is. `portfolio` (default) is the assistant every site has had, unchanged: every
266
+ * product in a "Focus on a product" picker, every product's concept illustrations, the catalog's welcome copy.
267
+ *
268
+ * `product` makes it ONE product's own, for a product site that wants no other product in it. It needs
269
+ * `productSlug` (without one it stays `portfolio`, and a development build warns once). Then:
270
+ *
271
+ * - the focus is pinned to `productSlug`: there is no product picker, and every new question is asked about this
272
+ * product (`productSlug` on the request, as always), also in a conversation stored or shared with another focus;
273
+ * - only this product's concept illustrations show, and no strip at all when it has none;
274
+ * - the example prompts are `examplePrompts` alone; only without any, the catalog's, less any that name another
275
+ * product and the SDK's built-in "Which of your products fits a problem like mine?";
276
+ * - the welcome body, unless `welcomeBody` is passed, invites a problem or a question about this product, never
277
+ * the catalog's invitation to compare it with other products; a catalog title naming another product is
278
+ * replaced by the built-in one;
279
+ * - the welcome has no capability tile that invites other products ("Compare across the ecosystem");
280
+ * - the composer's placeholder, a shorter "Ask about {product}…", and the conversation's header name this product.
281
+ * The composer itself is the published one, unchanged (its classes, and its fit to the draft alone), so on a phone
282
+ * its field stays one line tall: the English placeholder fits that line at 320px and wider, and a longer
283
+ * locale's (Spanish, Tamil) may still wrap at 320px and narrower and lose its second line;
284
+ * - the page head's description promises this product's answers alone, never "and every other product we build";
285
+ * - a question that needs more searches than a turn allows (`TOOL_BUDGET`) is asked to be narrowed to one part of
286
+ * it, not to "two or three specific products".
287
+ *
288
+ * Answers come from the backend and are shown as they come: an answer, and the sources under it, can still name
289
+ * another product when the visitor asks about one.
290
+ */
291
+ scope?: ExploreScope;
292
+ /**
293
+ * BOFF-9796. The product's display name in the `product` scope ("Healthy Bowl"): the welcome body, the placeholder
294
+ * and, on `ExplorePanel`, the title. Default: the catalog's name for `productSlug`. Pass it to show the name the way
295
+ * the site writes it, before the catalog has loaded too. Unused in the `portfolio` scope.
296
+ */
297
+ productName?: string;
255
298
  }
256
299
  /**
257
300
  * The product's own logo, derived from the reference's origin.
@@ -325,4 +368,4 @@ declare function exploreQuestionHref(question: string, base?: string): string;
325
368
  */
326
369
  declare function ExplorePage(props: ExplorePageProps): react.JSX.Element;
327
370
 
328
- export { type AnswerRendererStrings as A, EXPLORE_PREFILL_MAX_LENGTH as E, ExploreAnswerBody as a, type ExploreAnswerBodyProps as b, ExploreAnswerStyles as c, ExplorePage as d, type ExplorePageProps as e, answerPlainText as f, answerSpeechText as g, exploreQuestionHref as h, inlineImageOrigins as i, isInlineImageAllowed as j, isInlineVideoAllowed as k, type ExploreProvenance as l, type ExploreReferenceKind as m, logoUrlOf as n, productNamesByOrigin as o, productSlugsByOrigin as p, referenceKindOf as r, summariseReferences as s };
371
+ export { type AnswerRendererStrings as A, type ExploreScope as E, EXPLORE_PREFILL_MAX_LENGTH as a, ExploreAnswerBody as b, type ExploreAnswerBodyProps as c, ExploreAnswerStyles as d, ExplorePage as e, type ExplorePageProps as f, answerPlainText as g, answerSpeechText as h, exploreQuestionHref as i, inlineImageOrigins as j, isInlineImageAllowed as k, isInlineVideoAllowed as l, type ExploreProvenance as m, type ExploreReferenceKind as n, logoUrlOf as o, productSlugsByOrigin as p, productNamesByOrigin as q, referenceKindOf as r, summariseReferences as s };
@@ -176,6 +176,9 @@ interface ExploreAnswerBodyProps {
176
176
  */
177
177
  declare function ExploreAnswerBody({ children, strings, imageOrigins, videoOrigins, productSlugs, enabled, components, className, }: ExploreAnswerBodyProps): react.JSX.Element;
178
178
 
179
+ /** Whose assistant this is: the portfolio's (the default, on every site), or one product's own. */
180
+ type ExploreScope = "portfolio" | "product";
181
+
179
182
  interface ExplorePageProps {
180
183
  /**
181
184
  * SEO metadata. Every field is optional and each one falls back to a default
@@ -200,6 +203,12 @@ interface ExplorePageProps {
200
203
  /**
201
204
  * Example prompts shown when `exploreCatalog` supplies none. Resolution
202
205
  * order: catalog → this prop → the SDK's built-in list.
206
+ *
207
+ * BOFF-9796: with `scope="product"` these are the ONLY prompts shown (each once, blanks dropped), whatever the
208
+ * catalog has, under an `ExploreChatProvider` too. Only when none are passed does the view fall back to the
209
+ * catalog's, less any that name another product and the SDK's "Which of your products fits a problem like mine?".
210
+ * A product-scoped site should pass its own: the catalog's are written for every site at once, and even those that
211
+ * name no product describe other sites' problems.
203
212
  */
204
213
  examplePrompts?: string[];
205
214
  /** Extra classes for the page root. */
@@ -252,6 +261,40 @@ interface ExplorePageProps {
252
261
  active?: boolean;
253
262
  /** BOFF-9697. The site's Explore route, for share links made from the panel. Default `/explore`. */
254
263
  explorePath?: string;
264
+ /**
265
+ * BOFF-9796. Whose assistant this is. `portfolio` (default) is the assistant every site has had, unchanged: every
266
+ * product in a "Focus on a product" picker, every product's concept illustrations, the catalog's welcome copy.
267
+ *
268
+ * `product` makes it ONE product's own, for a product site that wants no other product in it. It needs
269
+ * `productSlug` (without one it stays `portfolio`, and a development build warns once). Then:
270
+ *
271
+ * - the focus is pinned to `productSlug`: there is no product picker, and every new question is asked about this
272
+ * product (`productSlug` on the request, as always), also in a conversation stored or shared with another focus;
273
+ * - only this product's concept illustrations show, and no strip at all when it has none;
274
+ * - the example prompts are `examplePrompts` alone; only without any, the catalog's, less any that name another
275
+ * product and the SDK's built-in "Which of your products fits a problem like mine?";
276
+ * - the welcome body, unless `welcomeBody` is passed, invites a problem or a question about this product, never
277
+ * the catalog's invitation to compare it with other products; a catalog title naming another product is
278
+ * replaced by the built-in one;
279
+ * - the welcome has no capability tile that invites other products ("Compare across the ecosystem");
280
+ * - the composer's placeholder, a shorter "Ask about {product}…", and the conversation's header name this product.
281
+ * The composer itself is the published one, unchanged (its classes, and its fit to the draft alone), so on a phone
282
+ * its field stays one line tall: the English placeholder fits that line at 320px and wider, and a longer
283
+ * locale's (Spanish, Tamil) may still wrap at 320px and narrower and lose its second line;
284
+ * - the page head's description promises this product's answers alone, never "and every other product we build";
285
+ * - a question that needs more searches than a turn allows (`TOOL_BUDGET`) is asked to be narrowed to one part of
286
+ * it, not to "two or three specific products".
287
+ *
288
+ * Answers come from the backend and are shown as they come: an answer, and the sources under it, can still name
289
+ * another product when the visitor asks about one.
290
+ */
291
+ scope?: ExploreScope;
292
+ /**
293
+ * BOFF-9796. The product's display name in the `product` scope ("Healthy Bowl"): the welcome body, the placeholder
294
+ * and, on `ExplorePanel`, the title. Default: the catalog's name for `productSlug`. Pass it to show the name the way
295
+ * the site writes it, before the catalog has loaded too. Unused in the `portfolio` scope.
296
+ */
297
+ productName?: string;
255
298
  }
256
299
  /**
257
300
  * The product's own logo, derived from the reference's origin.
@@ -325,4 +368,4 @@ declare function exploreQuestionHref(question: string, base?: string): string;
325
368
  */
326
369
  declare function ExplorePage(props: ExplorePageProps): react.JSX.Element;
327
370
 
328
- export { type AnswerRendererStrings as A, EXPLORE_PREFILL_MAX_LENGTH as E, ExploreAnswerBody as a, type ExploreAnswerBodyProps as b, ExploreAnswerStyles as c, ExplorePage as d, type ExplorePageProps as e, answerPlainText as f, answerSpeechText as g, exploreQuestionHref as h, inlineImageOrigins as i, isInlineImageAllowed as j, isInlineVideoAllowed as k, type ExploreProvenance as l, type ExploreReferenceKind as m, logoUrlOf as n, productNamesByOrigin as o, productSlugsByOrigin as p, referenceKindOf as r, summariseReferences as s };
371
+ export { type AnswerRendererStrings as A, type ExploreScope as E, EXPLORE_PREFILL_MAX_LENGTH as a, ExploreAnswerBody as b, type ExploreAnswerBodyProps as c, ExploreAnswerStyles as d, ExplorePage as e, type ExplorePageProps as f, answerPlainText as g, answerSpeechText as h, exploreQuestionHref as i, inlineImageOrigins as j, isInlineImageAllowed as k, isInlineVideoAllowed as l, type ExploreProvenance as m, type ExploreReferenceKind as n, logoUrlOf as o, productSlugsByOrigin as p, productNamesByOrigin as q, referenceKindOf as r, summariseReferences as s };
package/dist/index.d.mts CHANGED
@@ -18,8 +18,8 @@ export { LaunchCountdown, LaunchCountdownProps } from './components/launch-count
18
18
  export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from './components/problems-solved.mjs';
19
19
  export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.mjs';
20
20
  import { Components } from 'react-markdown';
21
- import { A as AnswerRendererStrings } from './explore-BRfKFfvI.mjs';
22
- export { E as EXPLORE_PREFILL_MAX_LENGTH, a as ExploreAnswerBody, b as ExploreAnswerBodyProps, c as ExploreAnswerStyles, d as ExplorePage, e as ExplorePageProps, f as answerPlainText, g as answerSpeechText, h as exploreQuestionHref, i as inlineImageOrigins, j as isInlineImageAllowed, k as isInlineVideoAllowed, p as productSlugsByOrigin } from './explore-BRfKFfvI.mjs';
21
+ import { A as AnswerRendererStrings, E as ExploreScope } from './explore-BEgq1_0O.mjs';
22
+ export { a as EXPLORE_PREFILL_MAX_LENGTH, b as ExploreAnswerBody, c as ExploreAnswerBodyProps, d as ExploreAnswerStyles, e as ExplorePage, f as ExplorePageProps, g as answerPlainText, h as answerSpeechText, i as exploreQuestionHref, j as inlineImageOrigins, k as isInlineImageAllowed, l as isInlineVideoAllowed, p as productSlugsByOrigin } from './explore-BEgq1_0O.mjs';
23
23
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.mjs';
24
24
  import { e as UseExploreChatResult, S as StagedAttachment } from './use-progressive-reveal-BFPWbEXy.mjs';
25
25
  export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, c as ExploreEscalateOutcome, d as ExploreEscalateResult, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, f as UseSpeechOutputOptions, g as UseSpeechOutputResult, h as classifyExploreError, s as stopSpeaking, u as useExploreChat, i as useProgressiveReveal, j as useSpeechOutput } from './use-progressive-reveal-BFPWbEXy.mjs';
@@ -514,6 +514,18 @@ interface ExploreStrings {
514
514
  badge: string;
515
515
  welcomeTitle: string;
516
516
  welcomeBody: string;
517
+ /**
518
+ * BOFF-9796: the welcome body of ONE product's own assistant (`scope="product"`) when the host passes none. Takes
519
+ * `{product}`. Problem-first like `welcomeBody`, and unlike the catalog's copy for a product site it offers nothing
520
+ * beyond that product: no "compare it with anything else we build".
521
+ */
522
+ welcomeBodyProduct: string;
523
+ /**
524
+ * BOFF-9796: the product scope's welcome body when no product name is known (a slug no catalog lists, and no
525
+ * `productName`). Like `welcomeBodyProduct` without the name, so it never falls back to the portfolio's invitation
526
+ * to "ask about a specific product or compare a few".
527
+ */
528
+ welcomeBodyScoped: string;
517
529
  tryAsking: string;
518
530
  focusProduct: string;
519
531
  allProducts: string;
@@ -523,6 +535,16 @@ interface ExploreStrings {
523
535
  nextYouCouldAsk: string;
524
536
  placeholder: string;
525
537
  placeholderProduct: string;
538
+ /**
539
+ * BOFF-9796: the composer's placeholder on ONE product's own assistant (`scope="product"`). Takes `{product}`.
540
+ * Short on purpose, and the one thing about the composer that the product scope changes: the field is the published
541
+ * one, one line tall on a phone, where a placeholder that wraps loses its second line. `placeholderProduct`
542
+ * ("Describe a problem, or ask about Healthy Bowl…") wraps there at 390px and under; the English "Ask about Healthy
543
+ * Bowl…" fits one line at 320px and wider. Spanish and Tamil, the longest here, may still wrap at 320px and
544
+ * narrower: a follow-up (HealthyBowl, the site this was made for, is English-only). The welcome above the composer
545
+ * already asks for the problem.
546
+ */
547
+ placeholderScoped: string;
526
548
  send: string;
527
549
  stop: string;
528
550
  newChat: string;
@@ -544,6 +566,12 @@ interface ExploreStrings {
544
566
  attachmentTooMany: string;
545
567
  noAnswer: string;
546
568
  answerDidNotArrive: string;
569
+ /**
570
+ * BOFF-9796: what a turn that ran out of searches (`TOOL_BUDGET`) says on ONE product's own assistant
571
+ * (`scope="product"`). The default message asks for "two or three specific products", an invitation to other
572
+ * products that a product's own assistant must not make; here the narrowing offered is to one part of the question.
573
+ */
574
+ toolBudgetScoped: string;
547
575
  askHuman: string;
548
576
  feedbackPrompt: string;
549
577
  feedbackHelpful: string;
@@ -658,6 +686,11 @@ interface ExploreStrings {
658
686
  * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
659
687
  */
660
688
  panelTitle: string;
689
+ /**
690
+ * BOFF-9796: the panel's title on one product's own assistant (`scope="product"`), "{product} assistant" in each
691
+ * language's own word order. Takes `{product}`. `panelTitle` stays the title wherever no product name is known.
692
+ */
693
+ panelTitleProduct: string;
661
694
  panelViews: string;
662
695
  tabChat: string;
663
696
  tabAvatar: string;
@@ -690,6 +723,11 @@ interface ExploreStrings {
690
723
  seoDescription: string;
691
724
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
692
725
  seoDescriptionProduct: string;
726
+ /**
727
+ * BOFF-9796: the meta description of ONE product's own `/explore` (`scope="product"`). Takes `{product}`. Unlike
728
+ * `seoDescriptionProduct`, it promises nothing beyond that product: no "and every other product we build".
729
+ */
730
+ seoDescriptionScoped: string;
693
731
  capabilities: [string, string, string];
694
732
  prompts: string[];
695
733
  }
@@ -899,6 +937,23 @@ interface ExplorePanelProps {
899
937
  /** Passed to the chat view (`ExplorePage`). */
900
938
  productSlug?: string;
901
939
  locale?: string;
940
+ /**
941
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.scope`. `product` (with `productSlug`) makes the panel
942
+ * one product's own assistant and titles it "{product} assistant"; given `examplePrompts`, those are then its only
943
+ * example prompts. Default `portfolio`: the panel as it was.
944
+ */
945
+ scope?: ExploreScope;
946
+ /**
947
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.productName`. In the `product` scope it is also the
948
+ * panel's title, at once, before any catalog. Default: the catalog's name for `productSlug`.
949
+ */
950
+ productName?: string;
951
+ /**
952
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.examplePrompts`. In the `product` scope they are the only
953
+ * prompts the panel shows, whatever the catalog has; without them it falls back to the catalog's, less any that name
954
+ * another product and the SDK's portfolio prompt. A product site should pass its own.
955
+ */
956
+ examplePrompts?: string[];
902
957
  /**
903
958
  * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
904
959
  * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
@@ -922,11 +977,11 @@ interface ExplorePanelProps {
922
977
  /** Extra classes for the panel. */
923
978
  className?: string;
924
979
  }
925
- declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
980
+ declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, scope, productName, examplePrompts, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
926
981
 
927
982
  declare const buttonVariants: (props?: ({
928
983
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
929
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
984
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
930
985
  } & class_variance_authority_types.ClassProp) | undefined) => string;
931
986
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
932
987
  asChild?: boolean;
@@ -950,4 +1005,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
950
1005
  */
951
1006
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
952
1007
 
953
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, type ExploreLocale, ExplorePanel, type ExplorePanelAvatar, type ExplorePanelProps, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, UseExploreChatResult, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf, useExploreConversation };
1008
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, type ExploreLocale, ExplorePanel, type ExplorePanelAvatar, type ExplorePanelProps, ExploreScope, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, UseExploreChatResult, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf, useExploreConversation };
package/dist/index.d.ts CHANGED
@@ -18,8 +18,8 @@ export { LaunchCountdown, LaunchCountdownProps } from './components/launch-count
18
18
  export { ProblemSolved, ProblemsSolvedSection, ProblemsSolvedSectionProps } from './components/problems-solved.js';
19
19
  export { DetectedPlatform, ElectronDownloadLink, ElectronDownloadLinkProps, detectElectronPlatform } from './components/electron-download.js';
20
20
  import { Components } from 'react-markdown';
21
- import { A as AnswerRendererStrings } from './explore-DkfcKgp6.js';
22
- export { E as EXPLORE_PREFILL_MAX_LENGTH, a as ExploreAnswerBody, b as ExploreAnswerBodyProps, c as ExploreAnswerStyles, d as ExplorePage, e as ExplorePageProps, f as answerPlainText, g as answerSpeechText, h as exploreQuestionHref, i as inlineImageOrigins, j as isInlineImageAllowed, k as isInlineVideoAllowed, p as productSlugsByOrigin } from './explore-DkfcKgp6.js';
21
+ import { A as AnswerRendererStrings, E as ExploreScope } from './explore-CHiP9u-4.js';
22
+ export { a as EXPLORE_PREFILL_MAX_LENGTH, b as ExploreAnswerBody, c as ExploreAnswerBodyProps, d as ExploreAnswerStyles, e as ExplorePage, f as ExplorePageProps, g as answerPlainText, h as answerSpeechText, i as exploreQuestionHref, j as inlineImageOrigins, k as isInlineImageAllowed, l as isInlineVideoAllowed, p as productSlugsByOrigin } from './explore-CHiP9u-4.js';
23
23
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.js';
24
24
  import { e as UseExploreChatResult, S as StagedAttachment } from './use-progressive-reveal-C0hkdu_i.js';
25
25
  export { D as DEFAULT_EXPLORE_EXAMPLE_PROMPTS, E as ExploreChatError, a as ExploreChatErrorKind, b as ExploreChatPhase, c as ExploreEscalateOutcome, d as ExploreEscalateResult, F as FALLBACK_EXPLORE_LIMITS, U as UseExploreChatOptions, f as UseSpeechOutputOptions, g as UseSpeechOutputResult, h as classifyExploreError, s as stopSpeaking, u as useExploreChat, i as useProgressiveReveal, j as useSpeechOutput } from './use-progressive-reveal-C0hkdu_i.js';
@@ -514,6 +514,18 @@ interface ExploreStrings {
514
514
  badge: string;
515
515
  welcomeTitle: string;
516
516
  welcomeBody: string;
517
+ /**
518
+ * BOFF-9796: the welcome body of ONE product's own assistant (`scope="product"`) when the host passes none. Takes
519
+ * `{product}`. Problem-first like `welcomeBody`, and unlike the catalog's copy for a product site it offers nothing
520
+ * beyond that product: no "compare it with anything else we build".
521
+ */
522
+ welcomeBodyProduct: string;
523
+ /**
524
+ * BOFF-9796: the product scope's welcome body when no product name is known (a slug no catalog lists, and no
525
+ * `productName`). Like `welcomeBodyProduct` without the name, so it never falls back to the portfolio's invitation
526
+ * to "ask about a specific product or compare a few".
527
+ */
528
+ welcomeBodyScoped: string;
517
529
  tryAsking: string;
518
530
  focusProduct: string;
519
531
  allProducts: string;
@@ -523,6 +535,16 @@ interface ExploreStrings {
523
535
  nextYouCouldAsk: string;
524
536
  placeholder: string;
525
537
  placeholderProduct: string;
538
+ /**
539
+ * BOFF-9796: the composer's placeholder on ONE product's own assistant (`scope="product"`). Takes `{product}`.
540
+ * Short on purpose, and the one thing about the composer that the product scope changes: the field is the published
541
+ * one, one line tall on a phone, where a placeholder that wraps loses its second line. `placeholderProduct`
542
+ * ("Describe a problem, or ask about Healthy Bowl…") wraps there at 390px and under; the English "Ask about Healthy
543
+ * Bowl…" fits one line at 320px and wider. Spanish and Tamil, the longest here, may still wrap at 320px and
544
+ * narrower: a follow-up (HealthyBowl, the site this was made for, is English-only). The welcome above the composer
545
+ * already asks for the problem.
546
+ */
547
+ placeholderScoped: string;
526
548
  send: string;
527
549
  stop: string;
528
550
  newChat: string;
@@ -544,6 +566,12 @@ interface ExploreStrings {
544
566
  attachmentTooMany: string;
545
567
  noAnswer: string;
546
568
  answerDidNotArrive: string;
569
+ /**
570
+ * BOFF-9796: what a turn that ran out of searches (`TOOL_BUDGET`) says on ONE product's own assistant
571
+ * (`scope="product"`). The default message asks for "two or three specific products", an invitation to other
572
+ * products that a product's own assistant must not make; here the narrowing offered is to one part of the question.
573
+ */
574
+ toolBudgetScoped: string;
547
575
  askHuman: string;
548
576
  feedbackPrompt: string;
549
577
  feedbackHelpful: string;
@@ -658,6 +686,11 @@ interface ExploreStrings {
658
686
  * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
659
687
  */
660
688
  panelTitle: string;
689
+ /**
690
+ * BOFF-9796: the panel's title on one product's own assistant (`scope="product"`), "{product} assistant" in each
691
+ * language's own word order. Takes `{product}`. `panelTitle` stays the title wherever no product name is known.
692
+ */
693
+ panelTitleProduct: string;
661
694
  panelViews: string;
662
695
  tabChat: string;
663
696
  tabAvatar: string;
@@ -690,6 +723,11 @@ interface ExploreStrings {
690
723
  seoDescription: string;
691
724
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
692
725
  seoDescriptionProduct: string;
726
+ /**
727
+ * BOFF-9796: the meta description of ONE product's own `/explore` (`scope="product"`). Takes `{product}`. Unlike
728
+ * `seoDescriptionProduct`, it promises nothing beyond that product: no "and every other product we build".
729
+ */
730
+ seoDescriptionScoped: string;
693
731
  capabilities: [string, string, string];
694
732
  prompts: string[];
695
733
  }
@@ -899,6 +937,23 @@ interface ExplorePanelProps {
899
937
  /** Passed to the chat view (`ExplorePage`). */
900
938
  productSlug?: string;
901
939
  locale?: string;
940
+ /**
941
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.scope`. `product` (with `productSlug`) makes the panel
942
+ * one product's own assistant and titles it "{product} assistant"; given `examplePrompts`, those are then its only
943
+ * example prompts. Default `portfolio`: the panel as it was.
944
+ */
945
+ scope?: ExploreScope;
946
+ /**
947
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.productName`. In the `product` scope it is also the
948
+ * panel's title, at once, before any catalog. Default: the catalog's name for `productSlug`.
949
+ */
950
+ productName?: string;
951
+ /**
952
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.examplePrompts`. In the `product` scope they are the only
953
+ * prompts the panel shows, whatever the catalog has; without them it falls back to the catalog's, less any that name
954
+ * another product and the SDK's portfolio prompt. A product site should pass its own.
955
+ */
956
+ examplePrompts?: string[];
902
957
  /**
903
958
  * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
904
959
  * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
@@ -922,11 +977,11 @@ interface ExplorePanelProps {
922
977
  /** Extra classes for the panel. */
923
978
  className?: string;
924
979
  }
925
- declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
980
+ declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, scope, productName, examplePrompts, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
926
981
 
927
982
  declare const buttonVariants: (props?: ({
928
983
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
929
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
984
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
930
985
  } & class_variance_authority_types.ClassProp) | undefined) => string;
931
986
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
932
987
  asChild?: boolean;
@@ -950,4 +1005,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
950
1005
  */
951
1006
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
952
1007
 
953
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, type ExploreLocale, ExplorePanel, type ExplorePanelAvatar, type ExplorePanelProps, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, UseExploreChatResult, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf, useExploreConversation };
1008
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, type AnswerDetailPageProps, type AnswerLinkComponent, type AnswerLinkProps, AnswerRendererStrings, type AnswerStrings, AnswersPage, type AnswersPageProps, Button, type ButtonProps, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersPostingOption, CareersSubmissionForm, type CareersSubmissionFormProps, type Concept, type ConceptCategory, ConceptDetailPage, type ConceptDetailPageProps, type ConceptDevice, type ConceptImage, type ConceptLinkComponent, type ConceptLinkProps, type ConceptSolution, ConceptsPage, type ConceptsPageProps, DOMAINS_URL, ECOSYSTEM_PRODUCTS, EXPLORE_LOCALES, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, type ExploreLocale, ExplorePanel, type ExplorePanelAvatar, type ExplorePanelProps, ExploreScope, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, UseExploreChatResult, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf, useExploreConversation };