@burdenoff/website-sdk 2026.1024.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.
Files changed (32) hide show
  1. package/README.md +77 -1
  2. package/dist/components/explore-cta.d.mts +10 -1
  3. package/dist/components/explore-cta.d.ts +10 -1
  4. package/dist/components/explore-cta.js +82 -74
  5. package/dist/components/explore-cta.js.map +1 -1
  6. package/dist/components/explore-cta.mjs +83 -75
  7. package/dist/components/explore-cta.mjs.map +1 -1
  8. package/dist/components/explore.d.mts +2 -2
  9. package/dist/components/explore.d.ts +2 -2
  10. package/dist/components/explore.js +876 -510
  11. package/dist/components/explore.js.map +1 -1
  12. package/dist/components/explore.mjs +877 -511
  13. package/dist/components/explore.mjs.map +1 -1
  14. package/dist/{explore-POqE7J8r.d.mts → explore-BEgq1_0O.d.mts} +65 -3
  15. package/dist/{explore-D6kon7uz.d.ts → explore-CHiP9u-4.d.ts} +65 -3
  16. package/dist/{explore-types-BB8HNFzX.d.mts → explore-types-_9UJu6EA.d.mts} +1 -1
  17. package/dist/{explore-types-BB8HNFzX.d.ts → explore-types-_9UJu6EA.d.ts} +1 -1
  18. package/dist/hooks/index.d.mts +2 -2
  19. package/dist/hooks/index.d.ts +2 -2
  20. package/dist/hooks/index.js +15 -9
  21. package/dist/hooks/index.js.map +1 -1
  22. package/dist/hooks/index.mjs +15 -9
  23. package/dist/hooks/index.mjs.map +1 -1
  24. package/dist/index.d.mts +177 -6
  25. package/dist/index.d.ts +177 -6
  26. package/dist/index.js +1236 -152
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1236 -155
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/{use-progressive-reveal-Kr6DwGXG.d.mts → use-progressive-reveal-BFPWbEXy.d.mts} +25 -2
  31. package/dist/{use-progressive-reveal-BVJn9NIr.d.ts → use-progressive-reveal-C0hkdu_i.d.ts} +25 -2
  32. package/package.json +1 -1
package/dist/index.d.mts CHANGED
@@ -5,7 +5,7 @@ export { PartnersPage, PartnersPageProps } from './components/partners.mjs';
5
5
  import { C as CareersPostingOption } from './index-Ctws7kGs.mjs';
6
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';
7
7
  import * as react from 'react';
8
- import { ComponentType, ReactNode } from 'react';
8
+ import { ComponentType, ReactNode, Dispatch, SetStateAction, RefObject } from 'react';
9
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.mjs';
10
10
  export { PlanCard, PricingPage, PricingProductKeyError, PricingProps, PricingSection, availablePlanCurrencies, cleanPlanDisplayName, isUuidLike, planPriceIn, resolvePricingProductKey } from './components/pricing.mjs';
11
11
  export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from './components/waitlist.mjs';
@@ -18,11 +18,12 @@ 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-POqE7J8r.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-POqE7J8r.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
- export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY, i as EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, j as EXPLORE_ESCALATION_NOTE_SOFT_MAX, k as EXPLORE_MESSAGE_QUERY, l as EscalateExploreConversationInput, m as EscalateExploreConversationResult, c as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, b as ExploreLimits, d as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, E as ExploreProduct, a as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-BB8HNFzX.mjs';
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, e as UseExploreChatResult, 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-Kr6DwGXG.mjs';
24
+ import { e as UseExploreChatResult, S as StagedAttachment } from './use-progressive-reveal-BFPWbEXy.mjs';
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';
26
+ export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY, i as EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, j as EXPLORE_ESCALATION_NOTE_SOFT_MAX, k as EXPLORE_MESSAGE_QUERY, l as EscalateExploreConversationInput, m as EscalateExploreConversationResult, b as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, f as ExploreLimits, c as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, E as ExploreProduct, a as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-_9UJu6EA.mjs';
26
27
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.mjs';
27
28
  export { PageHead, PageHeadProps } from './seo/index.mjs';
28
29
  export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.mjs';
@@ -513,6 +514,18 @@ interface ExploreStrings {
513
514
  badge: string;
514
515
  welcomeTitle: string;
515
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;
516
529
  tryAsking: string;
517
530
  focusProduct: string;
518
531
  allProducts: string;
@@ -522,6 +535,16 @@ interface ExploreStrings {
522
535
  nextYouCouldAsk: string;
523
536
  placeholder: string;
524
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;
525
548
  send: string;
526
549
  stop: string;
527
550
  newChat: string;
@@ -543,6 +566,12 @@ interface ExploreStrings {
543
566
  attachmentTooMany: string;
544
567
  noAnswer: string;
545
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;
546
575
  askHuman: string;
547
576
  feedbackPrompt: string;
548
577
  feedbackHelpful: string;
@@ -652,6 +681,23 @@ interface ExploreStrings {
652
681
  closeVideo: string;
653
682
  enterFullScreen: string;
654
683
  exitFullScreen: string;
684
+ /**
685
+ * BOFF-9697: the site-wide assistant panel (`ExplorePanel`). The tab, view and avatar words are the ones the product
686
+ * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
687
+ */
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;
694
+ panelViews: string;
695
+ tabChat: string;
696
+ tabAvatar: string;
697
+ closePanel: string;
698
+ liveAvatar: string;
699
+ avatarComingSoon: string;
700
+ continueInChat: string;
655
701
  videoUnavailable: string;
656
702
  /** Accessible name of the provenance row under an answer. */
657
703
  groundedIn: string;
@@ -677,6 +723,11 @@ interface ExploreStrings {
677
723
  seoDescription: string;
678
724
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
679
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;
680
731
  capabilities: [string, string, string];
681
732
  prompts: string[];
682
733
  }
@@ -808,6 +859,126 @@ declare function answerStrings(locale: ExploreLocale): AnswerStrings;
808
859
  */
809
860
  declare function formatAnswerDate(value: string, locale: ExploreLocale): string;
810
861
 
862
+ /** One conversation and the composer state that belongs to it: what a page and a panel share. */
863
+ interface ExploreConversationState extends UseExploreChatResult {
864
+ /** The composer's text, kept with the conversation so it survives Expand, Restore and a route change. */
865
+ readonly draft: string;
866
+ readonly setDraft: Dispatch<SetStateAction<string>>;
867
+ /** Files staged for the next question, kept the same way. */
868
+ readonly staged: StagedAttachment[];
869
+ readonly setStaged: Dispatch<SetStateAction<StagedAttachment[]>>;
870
+ }
871
+ interface ExploreConversationOptions {
872
+ /** Slug of the product site — a soft hint to the harness. */
873
+ productSlug?: string;
874
+ /** BCP-47 locale for the fallback welcome and example prompts (the six product locales). */
875
+ locale?: string;
876
+ /** Example prompts when `exploreCatalog` supplies none. */
877
+ examplePrompts?: string[];
878
+ /** Fired with the message text every time a send is accepted. */
879
+ onSend?: (message: string) => void;
880
+ /**
881
+ * The page the visitor is on, forwarded with each question. Default: the URL when the conversation was set up
882
+ * (what `ExplorePage` has always sent). A site-wide provider passes the current one.
883
+ */
884
+ pageUrl?: string;
885
+ /** See `UseExploreChatOptions.enabled`. Default `true`. */
886
+ enabled?: boolean;
887
+ /**
888
+ * See `UseExploreChatOptions.shareToken`. Unset: read from the URL, as `ExplorePage` always has. A site-wide
889
+ * provider passes the `?c=` token of the route showing `/explore` (`null` elsewhere), and is given that token as its
890
+ * `key`, so a different shared link starts its own conversation.
891
+ */
892
+ shareToken?: string | null;
893
+ }
894
+ /**
895
+ * The conversation exactly as `ExplorePage` sets it up for itself: the same `useExploreChat` options (the locale's
896
+ * fallback welcome and prompts, the URL at mount), plus the composer's draft and staged files.
897
+ */
898
+ declare function useExploreConversation(options?: ExploreConversationOptions): ExploreConversationState;
899
+ interface ExploreChatProviderProps extends Omit<ExploreConversationOptions, "enabled" | "shareToken"> {
900
+ /**
901
+ * Start the conversation. Pass `true` from the visitor's first opening of the assistant, or while the `/explore`
902
+ * route is shown; until then the provider asks nothing (no catalog request, no restore). Latched: once it has been
903
+ * `true` the conversation stays live, so a running answer is never cut by the host flipping it back.
904
+ */
905
+ enabled: boolean;
906
+ /**
907
+ * The `?c=` share token of the route showing `/explore`, from the host's router, and `null` on every other route.
908
+ * Required: the provider outlives every page, so reading `?c=` from whatever page it first mounted on would turn an
909
+ * unrelated `?c=` into a "shared conversation not found", and keep a real one for the rest of the visit.
910
+ */
911
+ shareToken: string | null;
912
+ children?: ReactNode;
913
+ }
914
+ /**
915
+ * ONE conversation for the whole site (BOFF-9697). Mount it once, above the routes (inside the router, so the host
916
+ * can pass the current `pageUrl` and `shareToken`), and put the `ExplorePanel` and every `ExplorePage` under it.
917
+ * Key it by `shareToken`: a shared link is its own read-only conversation, and leaving it returns to the visitor's.
918
+ */
919
+ declare function ExploreChatProvider({ enabled, children, ...options }: ExploreChatProviderProps): react.JSX.Element;
920
+
921
+ interface ExplorePanelAvatar {
922
+ /** The approved picture: a URL the page may load. */
923
+ src: string;
924
+ /** The avatar's name, for the picture's text alternative. */
925
+ name?: string;
926
+ }
927
+ interface ExplorePanelProps {
928
+ /** Whether the panel shows. The host owns it (its floating button opens the panel). */
929
+ open: boolean;
930
+ /**
931
+ * Called with `false` when the visitor closes the panel: the close button, Escape, the phone's Back, or following a
932
+ * link from the conversation on a phone.
933
+ */
934
+ onOpenChange: (open: boolean) => void;
935
+ /** The panel's id, for the button's `controls`. Default `boff-explore-panel`. */
936
+ id?: string;
937
+ /** Passed to the chat view (`ExplorePage`). */
938
+ productSlug?: string;
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[];
957
+ /**
958
+ * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
959
+ * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
960
+ */
961
+ onNavigate?: (path: string) => void;
962
+ welcomeTitle?: string;
963
+ welcomeBody?: string;
964
+ /** The site's Explore route, for share links made in the panel. Default `/explore`. */
965
+ explorePath?: string;
966
+ /** The Avatar view's picture. Absent: the panel has no Avatar view and no tabs. */
967
+ avatar?: ExplorePanelAvatar;
968
+ /**
969
+ * A CSS length the panel keeps clear at the bottom of the window in both sizes: the host's own bottom bar, such as a
970
+ * consent banner (`var(--site-consent-banner-height, 0px)`). Default `0px`.
971
+ */
972
+ bottomOffset?: string;
973
+ /** The panel's `z-index`. Default 50: with the header and the banner both at 50, DOM order decides (see above). */
974
+ zIndex?: number;
975
+ /** Where focus goes back when the panel closes: the button that opened it. */
976
+ returnFocusRef?: RefObject<HTMLElement | null>;
977
+ /** Extra classes for the panel. */
978
+ className?: string;
979
+ }
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;
981
+
811
982
  declare const buttonVariants: (props?: ({
812
983
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
813
984
  size?: "icon" | "default" | "sm" | "lg" | null | undefined;
@@ -834,4 +1005,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
834
1005
  */
835
1006
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
836
1007
 
837
- 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, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
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
@@ -5,7 +5,7 @@ export { PartnersPage, PartnersPageProps } from './components/partners.js';
5
5
  import { C as CareersPostingOption } from './index-CB0Uw1xD.js';
6
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';
7
7
  import * as react from 'react';
8
- import { ComponentType, ReactNode } from 'react';
8
+ import { ComponentType, ReactNode, Dispatch, SetStateAction, RefObject } from 'react';
9
9
  export { NewsletterForm, NewsletterFormProps, NewsletterPage, NewsletterPageProps } from './components/newsletter.js';
10
10
  export { PlanCard, PricingPage, PricingProductKeyError, PricingProps, PricingSection, availablePlanCurrencies, cleanPlanDisplayName, isUuidLike, planPriceIn, resolvePricingProductKey } from './components/pricing.js';
11
11
  export { WaitlistForm, WaitlistFormProps, WaitlistPage, WaitlistPageProps } from './components/waitlist.js';
@@ -18,11 +18,12 @@ 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-D6kon7uz.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-D6kon7uz.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
- export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY, i as EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, j as EXPLORE_ESCALATION_NOTE_SOFT_MAX, k as EXPLORE_MESSAGE_QUERY, l as EscalateExploreConversationInput, m as EscalateExploreConversationResult, c as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, b as ExploreLimits, d as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, E as ExploreProduct, a as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-BB8HNFzX.js';
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, e as UseExploreChatResult, 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-BVJn9NIr.js';
24
+ import { e as UseExploreChatResult, S as StagedAttachment } from './use-progressive-reveal-C0hkdu_i.js';
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';
26
+ export { g as ESCALATE_EXPLORE_CONVERSATION_MUTATION, h as EXPLORE_CATALOG_QUERY, i as EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, j as EXPLORE_ESCALATION_NOTE_SOFT_MAX, k as EXPLORE_MESSAGE_QUERY, l as EscalateExploreConversationInput, m as EscalateExploreConversationResult, b as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, f as ExploreLimits, c as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, E as ExploreProduct, a as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-_9UJu6EA.js';
26
27
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.js';
27
28
  export { PageHead, PageHeadProps } from './seo/index.js';
28
29
  export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.js';
@@ -513,6 +514,18 @@ interface ExploreStrings {
513
514
  badge: string;
514
515
  welcomeTitle: string;
515
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;
516
529
  tryAsking: string;
517
530
  focusProduct: string;
518
531
  allProducts: string;
@@ -522,6 +535,16 @@ interface ExploreStrings {
522
535
  nextYouCouldAsk: string;
523
536
  placeholder: string;
524
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;
525
548
  send: string;
526
549
  stop: string;
527
550
  newChat: string;
@@ -543,6 +566,12 @@ interface ExploreStrings {
543
566
  attachmentTooMany: string;
544
567
  noAnswer: string;
545
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;
546
575
  askHuman: string;
547
576
  feedbackPrompt: string;
548
577
  feedbackHelpful: string;
@@ -652,6 +681,23 @@ interface ExploreStrings {
652
681
  closeVideo: string;
653
682
  enterFullScreen: string;
654
683
  exitFullScreen: string;
684
+ /**
685
+ * BOFF-9697: the site-wide assistant panel (`ExplorePanel`). The tab, view and avatar words are the ones the product
686
+ * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
687
+ */
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;
694
+ panelViews: string;
695
+ tabChat: string;
696
+ tabAvatar: string;
697
+ closePanel: string;
698
+ liveAvatar: string;
699
+ avatarComingSoon: string;
700
+ continueInChat: string;
655
701
  videoUnavailable: string;
656
702
  /** Accessible name of the provenance row under an answer. */
657
703
  groundedIn: string;
@@ -677,6 +723,11 @@ interface ExploreStrings {
677
723
  seoDescription: string;
678
724
  /** Used when the page belongs to a specific product's site. Takes `{product}`. */
679
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;
680
731
  capabilities: [string, string, string];
681
732
  prompts: string[];
682
733
  }
@@ -808,6 +859,126 @@ declare function answerStrings(locale: ExploreLocale): AnswerStrings;
808
859
  */
809
860
  declare function formatAnswerDate(value: string, locale: ExploreLocale): string;
810
861
 
862
+ /** One conversation and the composer state that belongs to it: what a page and a panel share. */
863
+ interface ExploreConversationState extends UseExploreChatResult {
864
+ /** The composer's text, kept with the conversation so it survives Expand, Restore and a route change. */
865
+ readonly draft: string;
866
+ readonly setDraft: Dispatch<SetStateAction<string>>;
867
+ /** Files staged for the next question, kept the same way. */
868
+ readonly staged: StagedAttachment[];
869
+ readonly setStaged: Dispatch<SetStateAction<StagedAttachment[]>>;
870
+ }
871
+ interface ExploreConversationOptions {
872
+ /** Slug of the product site — a soft hint to the harness. */
873
+ productSlug?: string;
874
+ /** BCP-47 locale for the fallback welcome and example prompts (the six product locales). */
875
+ locale?: string;
876
+ /** Example prompts when `exploreCatalog` supplies none. */
877
+ examplePrompts?: string[];
878
+ /** Fired with the message text every time a send is accepted. */
879
+ onSend?: (message: string) => void;
880
+ /**
881
+ * The page the visitor is on, forwarded with each question. Default: the URL when the conversation was set up
882
+ * (what `ExplorePage` has always sent). A site-wide provider passes the current one.
883
+ */
884
+ pageUrl?: string;
885
+ /** See `UseExploreChatOptions.enabled`. Default `true`. */
886
+ enabled?: boolean;
887
+ /**
888
+ * See `UseExploreChatOptions.shareToken`. Unset: read from the URL, as `ExplorePage` always has. A site-wide
889
+ * provider passes the `?c=` token of the route showing `/explore` (`null` elsewhere), and is given that token as its
890
+ * `key`, so a different shared link starts its own conversation.
891
+ */
892
+ shareToken?: string | null;
893
+ }
894
+ /**
895
+ * The conversation exactly as `ExplorePage` sets it up for itself: the same `useExploreChat` options (the locale's
896
+ * fallback welcome and prompts, the URL at mount), plus the composer's draft and staged files.
897
+ */
898
+ declare function useExploreConversation(options?: ExploreConversationOptions): ExploreConversationState;
899
+ interface ExploreChatProviderProps extends Omit<ExploreConversationOptions, "enabled" | "shareToken"> {
900
+ /**
901
+ * Start the conversation. Pass `true` from the visitor's first opening of the assistant, or while the `/explore`
902
+ * route is shown; until then the provider asks nothing (no catalog request, no restore). Latched: once it has been
903
+ * `true` the conversation stays live, so a running answer is never cut by the host flipping it back.
904
+ */
905
+ enabled: boolean;
906
+ /**
907
+ * The `?c=` share token of the route showing `/explore`, from the host's router, and `null` on every other route.
908
+ * Required: the provider outlives every page, so reading `?c=` from whatever page it first mounted on would turn an
909
+ * unrelated `?c=` into a "shared conversation not found", and keep a real one for the rest of the visit.
910
+ */
911
+ shareToken: string | null;
912
+ children?: ReactNode;
913
+ }
914
+ /**
915
+ * ONE conversation for the whole site (BOFF-9697). Mount it once, above the routes (inside the router, so the host
916
+ * can pass the current `pageUrl` and `shareToken`), and put the `ExplorePanel` and every `ExplorePage` under it.
917
+ * Key it by `shareToken`: a shared link is its own read-only conversation, and leaving it returns to the visitor's.
918
+ */
919
+ declare function ExploreChatProvider({ enabled, children, ...options }: ExploreChatProviderProps): react.JSX.Element;
920
+
921
+ interface ExplorePanelAvatar {
922
+ /** The approved picture: a URL the page may load. */
923
+ src: string;
924
+ /** The avatar's name, for the picture's text alternative. */
925
+ name?: string;
926
+ }
927
+ interface ExplorePanelProps {
928
+ /** Whether the panel shows. The host owns it (its floating button opens the panel). */
929
+ open: boolean;
930
+ /**
931
+ * Called with `false` when the visitor closes the panel: the close button, Escape, the phone's Back, or following a
932
+ * link from the conversation on a phone.
933
+ */
934
+ onOpenChange: (open: boolean) => void;
935
+ /** The panel's id, for the button's `controls`. Default `boff-explore-panel`. */
936
+ id?: string;
937
+ /** Passed to the chat view (`ExplorePage`). */
938
+ productSlug?: string;
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[];
957
+ /**
958
+ * The host router's navigate, for links in the conversation. On a phone the panel closes first (the sheet would
959
+ * cover the page); on a wider screen it stays open beside the page. Absent: links load the page normally.
960
+ */
961
+ onNavigate?: (path: string) => void;
962
+ welcomeTitle?: string;
963
+ welcomeBody?: string;
964
+ /** The site's Explore route, for share links made in the panel. Default `/explore`. */
965
+ explorePath?: string;
966
+ /** The Avatar view's picture. Absent: the panel has no Avatar view and no tabs. */
967
+ avatar?: ExplorePanelAvatar;
968
+ /**
969
+ * A CSS length the panel keeps clear at the bottom of the window in both sizes: the host's own bottom bar, such as a
970
+ * consent banner (`var(--site-consent-banner-height, 0px)`). Default `0px`.
971
+ */
972
+ bottomOffset?: string;
973
+ /** The panel's `z-index`. Default 50: with the header and the banner both at 50, DOM order decides (see above). */
974
+ zIndex?: number;
975
+ /** Where focus goes back when the panel closes: the button that opened it. */
976
+ returnFocusRef?: RefObject<HTMLElement | null>;
977
+ /** Extra classes for the panel. */
978
+ className?: string;
979
+ }
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;
981
+
811
982
  declare const buttonVariants: (props?: ({
812
983
  variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
813
984
  size?: "icon" | "default" | "sm" | "lg" | null | undefined;
@@ -834,4 +1005,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
834
1005
  */
835
1006
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
836
1007
 
837
- 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, type ExploreLocale, type ExploreStrings, Input, Label, PUBLISHED_ANSWER_FIELDS, type PublishedAnswer, type PublishedAnswerSource, type PublishedAnswerTopic, Select, Textarea, WebsiteSwitcherProduct, answerPath, answerSourceHost, answerStrings, buttonVariants, conceptPath, formatAnswerDate, getAnswerBySlug, getConceptBySlug, isPublishedSourceUrl, isValidUrl, speechLocaleOf };
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 };