@burdenoff/website-sdk 2026.1026.1 → 2026.1028.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 };
@@ -45,6 +45,16 @@ interface CareersApplyFormProps {
45
45
  }
46
46
  declare function CareersApplyForm({ productName, recaptchaSiteKey, positions, postings, heroTitle, heroDescription, headingLevel, maxResumeBytes, className, seo, }: CareersApplyFormProps): react.JSX.Element;
47
47
 
48
+ /**
49
+ * A customer's written approval of a case study (BOFF-9971). Public callers
50
+ * receive only the approval date; who approved it and where the approval is
51
+ * filed stay with the people who manage content pages.
52
+ */
53
+ interface CustomerSignOffData {
54
+ signedAt: string;
55
+ signedBy?: string | null;
56
+ documentRef?: string | null;
57
+ }
48
58
  interface ContentPageData {
49
59
  id: string;
50
60
  title: string;
@@ -64,6 +74,7 @@ interface ContentPageData {
64
74
  readingTime?: number | null;
65
75
  featured?: boolean;
66
76
  category?: string | null;
77
+ customerSignOff?: CustomerSignOffData | null;
67
78
  }
68
79
  interface ContentPageListItem {
69
80
  id: string;
@@ -79,6 +90,7 @@ interface ContentPageListItem {
79
90
  featured?: boolean;
80
91
  category?: string | null;
81
92
  seoDescription?: string | null;
93
+ customerSignOff?: CustomerSignOffData | null;
82
94
  }
83
95
  interface ContentPageListData {
84
96
  items: ContentPageListItem[];
@@ -422,6 +434,19 @@ interface CaseStudyPageProps {
422
434
  contactLabel?: string;
423
435
  className?: string;
424
436
  }
437
+ /**
438
+ * True when the customer has approved the story in writing (BOFF-9971).
439
+ *
440
+ * The CMS already refuses to serve an unapproved case study; this check is the
441
+ * second lock, so no website renders one even against a CMS build that predates
442
+ * the gate. A case study states results on a customer's behalf, and we never
443
+ * publish numbers a customer has not signed off.
444
+ */
445
+ declare function hasCustomerSignOff(page: {
446
+ customerSignOff?: {
447
+ signedAt?: string | null;
448
+ } | null;
449
+ }): boolean;
425
450
  declare function CaseStudiesListPage(props: CaseStudiesListPageProps): react.JSX.Element;
426
451
  declare function CaseStudyPage(props: CaseStudyPageProps): react.JSX.Element;
427
452
 
@@ -534,4 +559,4 @@ interface ContractsPageProps {
534
559
  }
535
560
  declare function ContractsPage(props: ContractsPageProps): react.JSX.Element;
536
561
 
537
- export { type PressKitAssetCategory as A, BlogListPage as B, type CareersPostingOption as C, PressKitPage as D, type PressKitPageProps as E, type FetchLegalContentOptions as F, type PublicInterviewRoundConfig as G, type PublicJobPosting as H, type UsePublicJobPostingsOptions as I, fetchLegalContent as J, fetchLegalContentPage as K, LEGAL_DOCUMENTS as L, Markdown as M, fetchPublicJobPosting as N, fetchPublicJobPostings as O, type PressKitAsset as P, fetchPublicJobPostingsForSubmission as Q, findLegalDocument as R, formatLegalDate as S, splitLeadingHeading as T, type UsePublicJobPostingOptions as U, useContentPage as V, useContentPages as W, usePublicJobPosting as X, usePublicJobPostings as Y, usePublicJobPostingsForSubmission as Z, type UseContentPageOptions as _, type BlogListPageProps as a, BlogPostPage as b, type BlogPostPageProps as c, CareersApplyForm as d, type CareersApplyFormProps as e, CaseStudiesListPage as f, type CaseStudiesListPageProps as g, CaseStudyPage as h, type CaseStudyPageProps as i, type ChangelogEntry as j, ChangelogPage as k, type ChangelogPageProps as l, type ContentPageData as m, type ContentPageListData as n, type ContentPageListItem as o, ContentRenderer as p, type ContractAsset as q, ContractsPage as r, type ContractsPageProps as s, LEGAL_DOCUMENT_KEYS as t, type LegalContentEntry as u, type LegalDocument as v, type LegalDocumentKey as w, LegalPage as x, type LegalPageProps as y, type MarkdownProps as z };
562
+ export { usePublicJobPostingsForSubmission as $, type MarkdownProps as A, BlogListPage as B, type CareersPostingOption as C, type PressKitAssetCategory as D, PressKitPage as E, type FetchLegalContentOptions as F, type PressKitPageProps as G, type PublicInterviewRoundConfig as H, type PublicJobPosting as I, type UsePublicJobPostingsOptions as J, fetchLegalContent as K, LEGAL_DOCUMENTS as L, Markdown as M, fetchLegalContentPage as N, fetchPublicJobPosting as O, type PressKitAsset as P, fetchPublicJobPostings as Q, fetchPublicJobPostingsForSubmission as R, findLegalDocument as S, formatLegalDate as T, type UsePublicJobPostingOptions as U, hasCustomerSignOff as V, splitLeadingHeading as W, useContentPage as X, useContentPages as Y, usePublicJobPosting as Z, usePublicJobPostings as _, type BlogListPageProps as a, type UseContentPageOptions as a0, BlogPostPage as b, type BlogPostPageProps as c, CareersApplyForm as d, type CareersApplyFormProps as e, CaseStudiesListPage as f, type CaseStudiesListPageProps as g, CaseStudyPage as h, type CaseStudyPageProps as i, type ChangelogEntry as j, ChangelogPage as k, type ChangelogPageProps as l, type ContentPageData as m, type ContentPageListData as n, type ContentPageListItem as o, ContentRenderer as p, type ContractAsset as q, ContractsPage as r, type ContractsPageProps as s, type CustomerSignOffData as t, LEGAL_DOCUMENT_KEYS as u, type LegalContentEntry as v, type LegalDocument as w, type LegalDocumentKey as x, LegalPage as y, type LegalPageProps as z };
@@ -45,6 +45,16 @@ interface CareersApplyFormProps {
45
45
  }
46
46
  declare function CareersApplyForm({ productName, recaptchaSiteKey, positions, postings, heroTitle, heroDescription, headingLevel, maxResumeBytes, className, seo, }: CareersApplyFormProps): react.JSX.Element;
47
47
 
48
+ /**
49
+ * A customer's written approval of a case study (BOFF-9971). Public callers
50
+ * receive only the approval date; who approved it and where the approval is
51
+ * filed stay with the people who manage content pages.
52
+ */
53
+ interface CustomerSignOffData {
54
+ signedAt: string;
55
+ signedBy?: string | null;
56
+ documentRef?: string | null;
57
+ }
48
58
  interface ContentPageData {
49
59
  id: string;
50
60
  title: string;
@@ -64,6 +74,7 @@ interface ContentPageData {
64
74
  readingTime?: number | null;
65
75
  featured?: boolean;
66
76
  category?: string | null;
77
+ customerSignOff?: CustomerSignOffData | null;
67
78
  }
68
79
  interface ContentPageListItem {
69
80
  id: string;
@@ -79,6 +90,7 @@ interface ContentPageListItem {
79
90
  featured?: boolean;
80
91
  category?: string | null;
81
92
  seoDescription?: string | null;
93
+ customerSignOff?: CustomerSignOffData | null;
82
94
  }
83
95
  interface ContentPageListData {
84
96
  items: ContentPageListItem[];
@@ -422,6 +434,19 @@ interface CaseStudyPageProps {
422
434
  contactLabel?: string;
423
435
  className?: string;
424
436
  }
437
+ /**
438
+ * True when the customer has approved the story in writing (BOFF-9971).
439
+ *
440
+ * The CMS already refuses to serve an unapproved case study; this check is the
441
+ * second lock, so no website renders one even against a CMS build that predates
442
+ * the gate. A case study states results on a customer's behalf, and we never
443
+ * publish numbers a customer has not signed off.
444
+ */
445
+ declare function hasCustomerSignOff(page: {
446
+ customerSignOff?: {
447
+ signedAt?: string | null;
448
+ } | null;
449
+ }): boolean;
425
450
  declare function CaseStudiesListPage(props: CaseStudiesListPageProps): react.JSX.Element;
426
451
  declare function CaseStudyPage(props: CaseStudyPageProps): react.JSX.Element;
427
452
 
@@ -534,4 +559,4 @@ interface ContractsPageProps {
534
559
  }
535
560
  declare function ContractsPage(props: ContractsPageProps): react.JSX.Element;
536
561
 
537
- export { type PressKitAssetCategory as A, BlogListPage as B, type CareersPostingOption as C, PressKitPage as D, type PressKitPageProps as E, type FetchLegalContentOptions as F, type PublicInterviewRoundConfig as G, type PublicJobPosting as H, type UsePublicJobPostingsOptions as I, fetchLegalContent as J, fetchLegalContentPage as K, LEGAL_DOCUMENTS as L, Markdown as M, fetchPublicJobPosting as N, fetchPublicJobPostings as O, type PressKitAsset as P, fetchPublicJobPostingsForSubmission as Q, findLegalDocument as R, formatLegalDate as S, splitLeadingHeading as T, type UsePublicJobPostingOptions as U, useContentPage as V, useContentPages as W, usePublicJobPosting as X, usePublicJobPostings as Y, usePublicJobPostingsForSubmission as Z, type UseContentPageOptions as _, type BlogListPageProps as a, BlogPostPage as b, type BlogPostPageProps as c, CareersApplyForm as d, type CareersApplyFormProps as e, CaseStudiesListPage as f, type CaseStudiesListPageProps as g, CaseStudyPage as h, type CaseStudyPageProps as i, type ChangelogEntry as j, ChangelogPage as k, type ChangelogPageProps as l, type ContentPageData as m, type ContentPageListData as n, type ContentPageListItem as o, ContentRenderer as p, type ContractAsset as q, ContractsPage as r, type ContractsPageProps as s, LEGAL_DOCUMENT_KEYS as t, type LegalContentEntry as u, type LegalDocument as v, type LegalDocumentKey as w, LegalPage as x, type LegalPageProps as y, type MarkdownProps as z };
562
+ export { usePublicJobPostingsForSubmission as $, type MarkdownProps as A, BlogListPage as B, type CareersPostingOption as C, type PressKitAssetCategory as D, PressKitPage as E, type FetchLegalContentOptions as F, type PressKitPageProps as G, type PublicInterviewRoundConfig as H, type PublicJobPosting as I, type UsePublicJobPostingsOptions as J, fetchLegalContent as K, LEGAL_DOCUMENTS as L, Markdown as M, fetchLegalContentPage as N, fetchPublicJobPosting as O, type PressKitAsset as P, fetchPublicJobPostings as Q, fetchPublicJobPostingsForSubmission as R, findLegalDocument as S, formatLegalDate as T, type UsePublicJobPostingOptions as U, hasCustomerSignOff as V, splitLeadingHeading as W, useContentPage as X, useContentPages as Y, usePublicJobPosting as Z, usePublicJobPostings as _, type BlogListPageProps as a, type UseContentPageOptions as a0, BlogPostPage as b, type BlogPostPageProps as c, CareersApplyForm as d, type CareersApplyFormProps as e, CaseStudiesListPage as f, type CaseStudiesListPageProps as g, CaseStudyPage as h, type CaseStudyPageProps as i, type ChangelogEntry as j, ChangelogPage as k, type ChangelogPageProps as l, type ContentPageData as m, type ContentPageListData as n, type ContentPageListItem as o, ContentRenderer as p, type ContractAsset as q, ContractsPage as r, type ContractsPageProps as s, type CustomerSignOffData as t, LEGAL_DOCUMENT_KEYS as u, type LegalContentEntry as v, type LegalDocument as w, type LegalDocumentKey as x, LegalPage as y, type LegalPageProps as z };
package/dist/index.d.mts CHANGED
@@ -2,8 +2,8 @@ export { G as GraphQLResponse, W as WebSDKClient, a as WebSDKClientConfig, b as
2
2
  export { W as WebSDKProvider, a as WebSDKProviderProps, u as useWebSDK, b as useWebSDKConfig } from './provider-MFV1NVqZ.mjs';
3
3
  export { ContactCategory, ContactPage, ContactPageProps, DEFAULT_CONTACT_CATEGORIES } from './components/contact.mjs';
4
4
  export { PartnersPage, PartnersPageProps } from './components/partners.mjs';
5
- import { C as CareersPostingOption } from './index-Ctws7kGs.mjs';
6
- export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, F as FetchLegalContentOptions, L as LEGAL_DOCUMENTS, t as LEGAL_DOCUMENT_KEYS, u as LegalContentEntry, v as LegalDocument, w as LegalDocumentKey, x as LegalPage, y as LegalPageProps, M as Markdown, z as MarkdownProps, P as PressKitAsset, A as PressKitAssetCategory, D as PressKitPage, E as PressKitPageProps, G as PublicInterviewRoundConfig, H as PublicJobPosting, U as UsePublicJobPostingOptions, I as UsePublicJobPostingsOptions, J as fetchLegalContent, K as fetchLegalContentPage, N as fetchPublicJobPosting, O as fetchPublicJobPostings, Q as fetchPublicJobPostingsForSubmission, R as findLegalDocument, S as formatLegalDate, T as splitLeadingHeading, V as useContentPage, W as useContentPages, X as usePublicJobPosting, Y as usePublicJobPostings, Z as usePublicJobPostingsForSubmission } from './index-Ctws7kGs.mjs';
5
+ import { C as CareersPostingOption } from './index-Chw0pDXS.mjs';
6
+ export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, t as CustomerSignOffData, F as FetchLegalContentOptions, L as LEGAL_DOCUMENTS, u as LEGAL_DOCUMENT_KEYS, v as LegalContentEntry, w as LegalDocument, x as LegalDocumentKey, y as LegalPage, z as LegalPageProps, M as Markdown, A as MarkdownProps, P as PressKitAsset, D as PressKitAssetCategory, E as PressKitPage, G as PressKitPageProps, H as PublicInterviewRoundConfig, I as PublicJobPosting, U as UsePublicJobPostingOptions, J as UsePublicJobPostingsOptions, K as fetchLegalContent, N as fetchLegalContentPage, O as fetchPublicJobPosting, Q as fetchPublicJobPostings, R as fetchPublicJobPostingsForSubmission, S as findLegalDocument, T as formatLegalDate, V as hasCustomerSignOff, W as splitLeadingHeading, X as useContentPage, Y as useContentPages, Z as usePublicJobPosting, _ as usePublicJobPostings, $ as usePublicJobPostingsForSubmission } from './index-Chw0pDXS.mjs';
7
7
  import * as react from 'react';
8
8
  import { ComponentType, ReactNode, Dispatch, SetStateAction, RefObject } from 'react';
9
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.mjs';
@@ -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';
@@ -32,6 +32,7 @@ import { VariantProps } from 'class-variance-authority';
32
32
  import * as LabelPrimitive from '@radix-ui/react-label';
33
33
  export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from './product-card-CGxETsFa.mjs';
34
34
  export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, ProductSlugGeneration, ProductSlugRename, RecaptchaV3, cn, emitProductSlug, getRecaptchaV3Token, isFooterlessPath, isSameProductSlug, legacyProductSlug, loadRecaptchaV3, normalizeProductSlug, normalizeRoutePath, productSlugVariants, shouldRenderSiteFooter } from './utils/index.mjs';
35
+ export { ComparisonClaim, ComparisonSource, DEFAULT_COMPARISON_MAX_AGE_DAYS, FreshnessIssue, FreshnessOptions, FreshnessProblem, NonEmptySources, Sourced, checkComparisonFreshness, formatFreshnessReport, latestVerification, oldestVerification, parseVerifiedAt } from './comparison/index.mjs';
35
36
  import 'clsx';
36
37
 
37
38
  interface CareersSubmissionFormProps {
@@ -514,6 +515,18 @@ interface ExploreStrings {
514
515
  badge: string;
515
516
  welcomeTitle: string;
516
517
  welcomeBody: string;
518
+ /**
519
+ * BOFF-9796: the welcome body of ONE product's own assistant (`scope="product"`) when the host passes none. Takes
520
+ * `{product}`. Problem-first like `welcomeBody`, and unlike the catalog's copy for a product site it offers nothing
521
+ * beyond that product: no "compare it with anything else we build".
522
+ */
523
+ welcomeBodyProduct: string;
524
+ /**
525
+ * BOFF-9796: the product scope's welcome body when no product name is known (a slug no catalog lists, and no
526
+ * `productName`). Like `welcomeBodyProduct` without the name, so it never falls back to the portfolio's invitation
527
+ * to "ask about a specific product or compare a few".
528
+ */
529
+ welcomeBodyScoped: string;
517
530
  tryAsking: string;
518
531
  focusProduct: string;
519
532
  allProducts: string;
@@ -523,6 +536,16 @@ interface ExploreStrings {
523
536
  nextYouCouldAsk: string;
524
537
  placeholder: string;
525
538
  placeholderProduct: string;
539
+ /**
540
+ * BOFF-9796: the composer's placeholder on ONE product's own assistant (`scope="product"`). Takes `{product}`.
541
+ * Short on purpose, and the one thing about the composer that the product scope changes: the field is the published
542
+ * one, one line tall on a phone, where a placeholder that wraps loses its second line. `placeholderProduct`
543
+ * ("Describe a problem, or ask about Healthy Bowl…") wraps there at 390px and under; the English "Ask about Healthy
544
+ * Bowl…" fits one line at 320px and wider. Spanish and Tamil, the longest here, may still wrap at 320px and
545
+ * narrower: a follow-up (HealthyBowl, the site this was made for, is English-only). The welcome above the composer
546
+ * already asks for the problem.
547
+ */
548
+ placeholderScoped: string;
526
549
  send: string;
527
550
  stop: string;
528
551
  newChat: string;
@@ -544,6 +567,12 @@ interface ExploreStrings {
544
567
  attachmentTooMany: string;
545
568
  noAnswer: string;
546
569
  answerDidNotArrive: string;
570
+ /**
571
+ * BOFF-9796: what a turn that ran out of searches (`TOOL_BUDGET`) says on ONE product's own assistant
572
+ * (`scope="product"`). The default message asks for "two or three specific products", an invitation to other
573
+ * products that a product's own assistant must not make; here the narrowing offered is to one part of the question.
574
+ */
575
+ toolBudgetScoped: string;
547
576
  askHuman: string;
548
577
  feedbackPrompt: string;
549
578
  feedbackHelpful: string;
@@ -658,6 +687,11 @@ interface ExploreStrings {
658
687
  * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
659
688
  */
660
689
  panelTitle: string;
690
+ /**
691
+ * BOFF-9796: the panel's title on one product's own assistant (`scope="product"`), "{product} assistant" in each
692
+ * language's own word order. Takes `{product}`. `panelTitle` stays the title wherever no product name is known.
693
+ */
694
+ panelTitleProduct: string;
661
695
  panelViews: string;
662
696
  tabChat: string;
663
697
  tabAvatar: string;
@@ -690,6 +724,11 @@ interface ExploreStrings {
690
724
  seoDescription: string;
691
725
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
692
726
  seoDescriptionProduct: string;
727
+ /**
728
+ * BOFF-9796: the meta description of ONE product's own `/explore` (`scope="product"`). Takes `{product}`. Unlike
729
+ * `seoDescriptionProduct`, it promises nothing beyond that product: no "and every other product we build".
730
+ */
731
+ seoDescriptionScoped: string;
693
732
  capabilities: [string, string, string];
694
733
  prompts: string[];
695
734
  }
@@ -899,6 +938,23 @@ interface ExplorePanelProps {
899
938
  /** Passed to the chat view (`ExplorePage`). */
900
939
  productSlug?: string;
901
940
  locale?: string;
941
+ /**
942
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.scope`. `product` (with `productSlug`) makes the panel
943
+ * one product's own assistant and titles it "{product} assistant"; given `examplePrompts`, those are then its only
944
+ * example prompts. Default `portfolio`: the panel as it was.
945
+ */
946
+ scope?: ExploreScope;
947
+ /**
948
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.productName`. In the `product` scope it is also the
949
+ * panel's title, at once, before any catalog. Default: the catalog's name for `productSlug`.
950
+ */
951
+ productName?: string;
952
+ /**
953
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.examplePrompts`. In the `product` scope they are the only
954
+ * prompts the panel shows, whatever the catalog has; without them it falls back to the catalog's, less any that name
955
+ * another product and the SDK's portfolio prompt. A product site should pass its own.
956
+ */
957
+ examplePrompts?: string[];
902
958
  /**
903
959
  * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
904
960
  * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
@@ -922,11 +978,11 @@ interface ExplorePanelProps {
922
978
  /** Extra classes for the panel. */
923
979
  className?: string;
924
980
  }
925
- declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
981
+ 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
982
 
927
983
  declare const buttonVariants: (props?: ({
928
984
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
929
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
985
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
930
986
  } & class_variance_authority_types.ClassProp) | undefined) => string;
931
987
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
932
988
  asChild?: boolean;
@@ -950,4 +1006,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
950
1006
  */
951
1007
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
952
1008
 
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 };
1009
+ 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
@@ -2,8 +2,8 @@ export { G as GraphQLResponse, W as WebSDKClient, a as WebSDKClientConfig, b as
2
2
  export { W as WebSDKProvider, a as WebSDKProviderProps, u as useWebSDK, b as useWebSDKConfig } from './provider-Dwgz4d0r.js';
3
3
  export { ContactCategory, ContactPage, ContactPageProps, DEFAULT_CONTACT_CATEGORIES } from './components/contact.js';
4
4
  export { PartnersPage, PartnersPageProps } from './components/partners.js';
5
- import { C as CareersPostingOption } from './index-CB0Uw1xD.js';
6
- export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, F as FetchLegalContentOptions, L as LEGAL_DOCUMENTS, t as LEGAL_DOCUMENT_KEYS, u as LegalContentEntry, v as LegalDocument, w as LegalDocumentKey, x as LegalPage, y as LegalPageProps, M as Markdown, z as MarkdownProps, P as PressKitAsset, A as PressKitAssetCategory, D as PressKitPage, E as PressKitPageProps, G as PublicInterviewRoundConfig, H as PublicJobPosting, U as UsePublicJobPostingOptions, I as UsePublicJobPostingsOptions, J as fetchLegalContent, K as fetchLegalContentPage, N as fetchPublicJobPosting, O as fetchPublicJobPostings, Q as fetchPublicJobPostingsForSubmission, R as findLegalDocument, S as formatLegalDate, T as splitLeadingHeading, V as useContentPage, W as useContentPages, X as usePublicJobPosting, Y as usePublicJobPostings, Z as usePublicJobPostingsForSubmission } from './index-CB0Uw1xD.js';
5
+ import { C as CareersPostingOption } from './index-87BLB-Hj.js';
6
+ export { B as BlogListPage, a as BlogListPageProps, b as BlogPostPage, c as BlogPostPageProps, d as CareersApplyForm, e as CareersApplyFormProps, f as CaseStudiesListPage, g as CaseStudiesListPageProps, h as CaseStudyPage, i as CaseStudyPageProps, j as ChangelogEntry, k as ChangelogPage, l as ChangelogPageProps, m as ContentPageData, n as ContentPageListData, o as ContentPageListItem, p as ContentRenderer, q as ContractAsset, r as ContractsPage, s as ContractsPageProps, t as CustomerSignOffData, F as FetchLegalContentOptions, L as LEGAL_DOCUMENTS, u as LEGAL_DOCUMENT_KEYS, v as LegalContentEntry, w as LegalDocument, x as LegalDocumentKey, y as LegalPage, z as LegalPageProps, M as Markdown, A as MarkdownProps, P as PressKitAsset, D as PressKitAssetCategory, E as PressKitPage, G as PressKitPageProps, H as PublicInterviewRoundConfig, I as PublicJobPosting, U as UsePublicJobPostingOptions, J as UsePublicJobPostingsOptions, K as fetchLegalContent, N as fetchLegalContentPage, O as fetchPublicJobPosting, Q as fetchPublicJobPostings, R as fetchPublicJobPostingsForSubmission, S as findLegalDocument, T as formatLegalDate, V as hasCustomerSignOff, W as splitLeadingHeading, X as useContentPage, Y as useContentPages, Z as usePublicJobPosting, _ as usePublicJobPostings, $ as usePublicJobPostingsForSubmission } from './index-87BLB-Hj.js';
7
7
  import * as react from 'react';
8
8
  import { ComponentType, ReactNode, Dispatch, SetStateAction, RefObject } from 'react';
9
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.js';
@@ -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';
@@ -32,6 +32,7 @@ import { VariantProps } from 'class-variance-authority';
32
32
  import * as LabelPrimitive from '@radix-ui/react-label';
33
33
  export { B as BrowseStoreResult, G as GroupedStoreProducts, P as ProductCard, a as ProductCategory, R as RatingDistribution, S as SearchSuggestion, b as StarRating, c as StoreBrowsePage, d as StoreBrowsePageProps, e as StoreFacet, f as StoreFacets, g as StoreHomePage, h as StoreHomePageProps, i as StorePageProps, j as StoreProduct, k as StoreProductDetailPage, l as StoreProductDetailPageProps, m as StoreProductDetails, n as StorePublisher, o as StoreReview, p as StoreTerminology, q as StoreTypeFilter, T as TypeBadge, r as formatDownloads, s as formatPrice } from './product-card-CGxETsFa.js';
34
34
  export { EXPLORE_RECAPTCHA_ACTION, FOOTERLESS_ROUTES, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, ProductSlugGeneration, ProductSlugRename, RecaptchaV3, cn, emitProductSlug, getRecaptchaV3Token, isFooterlessPath, isSameProductSlug, legacyProductSlug, loadRecaptchaV3, normalizeProductSlug, normalizeRoutePath, productSlugVariants, shouldRenderSiteFooter } from './utils/index.js';
35
+ export { ComparisonClaim, ComparisonSource, DEFAULT_COMPARISON_MAX_AGE_DAYS, FreshnessIssue, FreshnessOptions, FreshnessProblem, NonEmptySources, Sourced, checkComparisonFreshness, formatFreshnessReport, latestVerification, oldestVerification, parseVerifiedAt } from './comparison/index.js';
35
36
  import 'clsx';
36
37
 
37
38
  interface CareersSubmissionFormProps {
@@ -514,6 +515,18 @@ interface ExploreStrings {
514
515
  badge: string;
515
516
  welcomeTitle: string;
516
517
  welcomeBody: string;
518
+ /**
519
+ * BOFF-9796: the welcome body of ONE product's own assistant (`scope="product"`) when the host passes none. Takes
520
+ * `{product}`. Problem-first like `welcomeBody`, and unlike the catalog's copy for a product site it offers nothing
521
+ * beyond that product: no "compare it with anything else we build".
522
+ */
523
+ welcomeBodyProduct: string;
524
+ /**
525
+ * BOFF-9796: the product scope's welcome body when no product name is known (a slug no catalog lists, and no
526
+ * `productName`). Like `welcomeBodyProduct` without the name, so it never falls back to the portfolio's invitation
527
+ * to "ask about a specific product or compare a few".
528
+ */
529
+ welcomeBodyScoped: string;
517
530
  tryAsking: string;
518
531
  focusProduct: string;
519
532
  allProducts: string;
@@ -523,6 +536,16 @@ interface ExploreStrings {
523
536
  nextYouCouldAsk: string;
524
537
  placeholder: string;
525
538
  placeholderProduct: string;
539
+ /**
540
+ * BOFF-9796: the composer's placeholder on ONE product's own assistant (`scope="product"`). Takes `{product}`.
541
+ * Short on purpose, and the one thing about the composer that the product scope changes: the field is the published
542
+ * one, one line tall on a phone, where a placeholder that wraps loses its second line. `placeholderProduct`
543
+ * ("Describe a problem, or ask about Healthy Bowl…") wraps there at 390px and under; the English "Ask about Healthy
544
+ * Bowl…" fits one line at 320px and wider. Spanish and Tamil, the longest here, may still wrap at 320px and
545
+ * narrower: a follow-up (HealthyBowl, the site this was made for, is English-only). The welcome above the composer
546
+ * already asks for the problem.
547
+ */
548
+ placeholderScoped: string;
526
549
  send: string;
527
550
  stop: string;
528
551
  newChat: string;
@@ -544,6 +567,12 @@ interface ExploreStrings {
544
567
  attachmentTooMany: string;
545
568
  noAnswer: string;
546
569
  answerDidNotArrive: string;
570
+ /**
571
+ * BOFF-9796: what a turn that ran out of searches (`TOOL_BUDGET`) says on ONE product's own assistant
572
+ * (`scope="product"`). The default message asks for "two or three specific products", an invitation to other
573
+ * products that a product's own assistant must not make; here the narrowing offered is to one part of the question.
574
+ */
575
+ toolBudgetScoped: string;
547
576
  askHuman: string;
548
577
  feedbackPrompt: string;
549
578
  feedbackHelpful: string;
@@ -658,6 +687,11 @@ interface ExploreStrings {
658
687
  * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
659
688
  */
660
689
  panelTitle: string;
690
+ /**
691
+ * BOFF-9796: the panel's title on one product's own assistant (`scope="product"`), "{product} assistant" in each
692
+ * language's own word order. Takes `{product}`. `panelTitle` stays the title wherever no product name is known.
693
+ */
694
+ panelTitleProduct: string;
661
695
  panelViews: string;
662
696
  tabChat: string;
663
697
  tabAvatar: string;
@@ -690,6 +724,11 @@ interface ExploreStrings {
690
724
  seoDescription: string;
691
725
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
692
726
  seoDescriptionProduct: string;
727
+ /**
728
+ * BOFF-9796: the meta description of ONE product's own `/explore` (`scope="product"`). Takes `{product}`. Unlike
729
+ * `seoDescriptionProduct`, it promises nothing beyond that product: no "and every other product we build".
730
+ */
731
+ seoDescriptionScoped: string;
693
732
  capabilities: [string, string, string];
694
733
  prompts: string[];
695
734
  }
@@ -899,6 +938,23 @@ interface ExplorePanelProps {
899
938
  /** Passed to the chat view (`ExplorePage`). */
900
939
  productSlug?: string;
901
940
  locale?: string;
941
+ /**
942
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.scope`. `product` (with `productSlug`) makes the panel
943
+ * one product's own assistant and titles it "{product} assistant"; given `examplePrompts`, those are then its only
944
+ * example prompts. Default `portfolio`: the panel as it was.
945
+ */
946
+ scope?: ExploreScope;
947
+ /**
948
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.productName`. In the `product` scope it is also the
949
+ * panel's title, at once, before any catalog. Default: the catalog's name for `productSlug`.
950
+ */
951
+ productName?: string;
952
+ /**
953
+ * BOFF-9796. Passed to the chat view: see `ExplorePageProps.examplePrompts`. In the `product` scope they are the only
954
+ * prompts the panel shows, whatever the catalog has; without them it falls back to the catalog's, less any that name
955
+ * another product and the SDK's portfolio prompt. A product site should pass its own.
956
+ */
957
+ examplePrompts?: string[];
902
958
  /**
903
959
  * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
904
960
  * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
@@ -922,11 +978,11 @@ interface ExplorePanelProps {
922
978
  /** Extra classes for the panel. */
923
979
  className?: string;
924
980
  }
925
- declare function ExplorePanel({ open, onOpenChange, id, productSlug, locale, onNavigate, welcomeTitle, welcomeBody, explorePath, avatar, bottomOffset, zIndex, returnFocusRef, className, }: ExplorePanelProps): react.JSX.Element | null;
981
+ 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
982
 
927
983
  declare const buttonVariants: (props?: ({
928
984
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
929
- size?: "default" | "sm" | "lg" | "icon" | null | undefined;
985
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
930
986
  } & class_variance_authority_types.ClassProp) | undefined) => string;
931
987
  interface ButtonProps extends react.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
932
988
  asChild?: boolean;
@@ -950,4 +1006,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
950
1006
  */
951
1007
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
952
1008
 
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 };
1009
+ 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 };