@burdenoff/website-sdk 2026.1028.1 → 2026.1029.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 (44) hide show
  1. package/README.md +159 -1
  2. package/dist/avatar-live/index.d.mts +11 -0
  3. package/dist/avatar-live/index.d.ts +11 -0
  4. package/dist/avatar-live/index.js +120 -0
  5. package/dist/avatar-live/index.js.map +1 -0
  6. package/dist/avatar-live/index.mjs +118 -0
  7. package/dist/avatar-live/index.mjs.map +1 -0
  8. package/dist/avatar-live-view/index.d.mts +42 -0
  9. package/dist/avatar-live-view/index.d.ts +42 -0
  10. package/dist/avatar-live-view/index.js +1422 -0
  11. package/dist/avatar-live-view/index.js.map +1 -0
  12. package/dist/avatar-live-view/index.mjs +1420 -0
  13. package/dist/avatar-live-view/index.mjs.map +1 -0
  14. package/dist/components/explore.d.mts +2 -2
  15. package/dist/components/explore.d.ts +2 -2
  16. package/dist/components/explore.js +11 -4
  17. package/dist/components/explore.js.map +1 -1
  18. package/dist/components/explore.mjs +11 -4
  19. package/dist/components/explore.mjs.map +1 -1
  20. package/dist/{explore-BEgq1_0O.d.mts → explore-DUTNYUOm.d.mts} +1 -1
  21. package/dist/{explore-CHiP9u-4.d.ts → explore-DjQE7Xia.d.ts} +1 -1
  22. package/dist/explore-avatar-live-config-B171o1Yo.d.ts +283 -0
  23. package/dist/explore-avatar-live-config-BGsGwbcq.d.mts +283 -0
  24. package/dist/{explore-types-_9UJu6EA.d.mts → explore-types-Bb2Ih3d8.d.mts} +1 -1
  25. package/dist/{explore-types-_9UJu6EA.d.ts → explore-types-Bb2Ih3d8.d.ts} +1 -1
  26. package/dist/hooks/index.d.mts +3 -2
  27. package/dist/hooks/index.d.ts +3 -2
  28. package/dist/hooks/index.js +6 -1
  29. package/dist/hooks/index.js.map +1 -1
  30. package/dist/hooks/index.mjs +6 -1
  31. package/dist/hooks/index.mjs.map +1 -1
  32. package/dist/index.d.mts +16 -253
  33. package/dist/index.d.ts +16 -253
  34. package/dist/index.js +214 -36
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +214 -36
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/types-CndbmBK-.d.mts +68 -0
  39. package/dist/types-CndbmBK-.d.ts +68 -0
  40. package/dist/{use-progressive-reveal-C0hkdu_i.d.ts → use-explore-chat-DunjG-3p.d.ts} +10 -36
  41. package/dist/{use-progressive-reveal-BFPWbEXy.d.mts → use-explore-chat-zRuoAin6.d.mts} +10 -36
  42. package/dist/use-progressive-reveal-ppicEgzZ.d.mts +35 -0
  43. package/dist/use-progressive-reveal-ppicEgzZ.d.ts +35 -0
  44. package/package.json +15 -3
package/dist/index.d.mts CHANGED
@@ -18,12 +18,15 @@ 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, 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';
21
+ import { a as ExploreLocale, E as ExplorePanelAvatarLive } from './explore-avatar-live-config-BGsGwbcq.mjs';
22
+ export { b as EXPLORE_LOCALES, c as ExploreStrings, s as speechLocaleOf } from './explore-avatar-live-config-BGsGwbcq.mjs';
23
+ import { A as AnswerRendererStrings, E as ExploreScope } from './explore-DUTNYUOm.mjs';
24
+ 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-DUTNYUOm.mjs';
23
25
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.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
+ import { e as UseExploreChatResult, S as StagedAttachment } from './use-explore-chat-zRuoAin6.mjs';
27
+ 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 classifyExploreError, u as useExploreChat } from './use-explore-chat-zRuoAin6.mjs';
28
+ 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, E as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, d as ExploreLimits, a as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, e as ExploreProduct, f as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-Bb2Ih3d8.mjs';
29
+ export { U as UseSpeechOutputOptions, a as UseSpeechOutputResult, s as stopSpeaking, u as useProgressiveReveal, b as useSpeechOutput } from './use-progressive-reveal-ppicEgzZ.mjs';
27
30
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.mjs';
28
31
  export { PageHead, PageHeadProps } from './seo/index.mjs';
29
32
  export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.mjs';
@@ -33,6 +36,7 @@ import * as LabelPrimitive from '@radix-ui/react-label';
33
36
  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
37
  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
38
  export { ComparisonClaim, ComparisonSource, DEFAULT_COMPARISON_MAX_AGE_DAYS, FreshnessIssue, FreshnessOptions, FreshnessProblem, NonEmptySources, Sourced, checkComparisonFreshness, formatFreshnessReport, latestVerification, oldestVerification, parseVerifiedAt } from './comparison/index.mjs';
39
+ import './types-CndbmBK-.mjs';
36
40
  import 'clsx';
37
41
 
38
42
  interface CareersSubmissionFormProps {
@@ -487,253 +491,6 @@ declare function AnswersPage({ productName, siteUrl, answers, topics, cta, linkC
487
491
  */
488
492
  declare function AnswerDetailPage(props: AnswerDetailPageProps): react.JSX.Element;
489
493
 
490
- /**
491
- * Localisation for the `/explore` chat surface.
492
- *
493
- * ## Why this is self-contained
494
- *
495
- * The app shells localise through `useI18n()` from `@burdenoff/fe-libs`, which is mounted by
496
- * `AppShellProvider` and fetches translations at runtime from `global-i18n-svc`. None of that
497
- * exists on a marketing website: no provider, no dictionary, no locale routing, and no
498
- * translation files in any of the 39 site repos. Pulling that machinery in would mean adding
499
- * a runtime translation fetch to a static prerendered page — a network round-trip in front of
500
- * the first paint, on pages whose whole point is that they are prerendered.
501
- *
502
- * So the strings are bundled. There are few enough of them that the cost is bytes rather than
503
- * a request, and a prerendered page stays fully rendered.
504
- *
505
- * ## Locales
506
- *
507
- * The six the products actually ship, taken from `{product}-app/src/components/chrome/
508
- * languages.ts` (FALLBACK_LANGUAGES). Deliberately NOT the wider `Locale` union in fe-libs,
509
- * which also lists fr/de/ja that no product ships, and deliberately not the backend's BCP-47
510
- * set, which has fr/de/ja but lacks ta and ar.
511
- */
512
- declare const EXPLORE_LOCALES: readonly ["en", "zh", "hi", "es", "ar", "ta"];
513
- type ExploreLocale = (typeof EXPLORE_LOCALES)[number];
514
- interface ExploreStrings {
515
- badge: string;
516
- welcomeTitle: string;
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;
530
- tryAsking: string;
531
- focusProduct: string;
532
- allProducts: string;
533
- showAll: string;
534
- showLess: string;
535
- sources: string;
536
- nextYouCouldAsk: string;
537
- placeholder: string;
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;
549
- send: string;
550
- stop: string;
551
- newChat: string;
552
- history: string;
553
- clearHistory: string;
554
- share: string;
555
- copied: string;
556
- copying: string;
557
- shareUnavailable: string;
558
- disclaimer: string;
559
- disclaimerShort: string;
560
- dictate: string;
561
- stopDictating: string;
562
- attach: string;
563
- attachHint: string;
564
- removeAttachment: string;
565
- attachmentNameOnly: string;
566
- attachmentTooLarge: string;
567
- attachmentTooMany: string;
568
- noAnswer: string;
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;
576
- askHuman: string;
577
- feedbackPrompt: string;
578
- feedbackHelpful: string;
579
- feedbackNotHelpful: string;
580
- feedbackReasonTitle: string;
581
- feedbackReasonInaccurate: string;
582
- feedbackReasonIncomplete: string;
583
- feedbackReasonOffTopic: string;
584
- feedbackReasonHardToFollow: string;
585
- feedbackReasonOther: string;
586
- feedbackCommentPlaceholder: string;
587
- feedbackSend: string;
588
- feedbackDismiss: string;
589
- feedbackThanks: string;
590
- feedbackNotSent: string;
591
- /**
592
- * The trigger, in its two homes: `escalateOpen` is the quiet one under an answer we DID
593
- * give, and the amber "we could not find this" banner reuses `askHuman` so that sentence
594
- * keeps reading as one sentence.
595
- */
596
- escalateOpen: string;
597
- escalateTitle: string;
598
- escalateBody: string;
599
- escalateEmailLabel: string;
600
- escalateEmailPlaceholder: string;
601
- escalateNoteLabel: string;
602
- escalateSubmit: string;
603
- escalateSending: string;
604
- escalateCancel: string;
605
- /**
606
- * Shown for BOTH the client's own pre-flight and the server's `INVALID_EMAIL`. The two
607
- * disagree about what is deliverable and the server is right, but the visitor's next
608
- * action is identical either way: check the address.
609
- */
610
- escalateInvalidEmail: string;
611
- /**
612
- * The success line. Takes `{email}` — and it is filled with the address the SERVER
613
- * returned, not the one in the box, because on a repeat handover the reply goes to
614
- * whichever address the first one used.
615
- *
616
- * Used for `created: false` as well: a visitor asking for help is not told "you already
617
- * did that".
618
- */
619
- escalateSent: string;
620
- escalateRateLimited: string;
621
- escalateCaptcha: string;
622
- escalateFailed: string;
623
- prevSuggestion: string;
624
- nextSuggestion: string;
625
- /**
626
- * The label every concept picture carries, wherever one is shown — inside an answer and on
627
- * the welcome strip alike.
628
- *
629
- * These images are published mockups, so the page has to say so; it says it in ONE wording,
630
- * because two phrasings for the same caveat read as two different caveats.
631
- */
632
- conceptIllustration: string;
633
- /** Rail arrows on the concept strip — pointer devices only. */
634
- conceptScrollPrev: string;
635
- conceptScrollNext: string;
636
- opensInNewTab: string;
637
- /** Heading over the concept strip on the welcome screen. */
638
- conceptStripTitle: string;
639
- /** Accessible name of the strip itself. */
640
- conceptStripLabel: string;
641
- /** Accessible name of one card. Takes `{title}` and `{product}`. */
642
- conceptAsk: string;
643
- /**
644
- * The question a card actually SENDS. Takes `{title}` and `{product}`.
645
- *
646
- * Localised because it becomes the visitor's own message in the transcript — an English
647
- * sentence appearing above an Arabic answer would read as the page talking to itself.
648
- */
649
- conceptAskQuestion: string;
650
- /** Label of the per-answer copy control, and its failure state. */
651
- copyAnswer: string;
652
- copyFailed: string;
653
- /**
654
- * Label of the per-answer read-aloud control, in its two states.
655
- *
656
- * A toggle, exactly like the composer's dictation button: one control whose label says
657
- * what pressing it does NOW, never a second button that appears while it is speaking.
658
- */
659
- readAloud: string;
660
- stopReading: string;
661
- /**
662
- * Accessible name of the scrollable box a table in an answer sits in.
663
- *
664
- * A scrollable region needs a name and a tab stop, or a keyboard visitor cannot reach the
665
- * columns that are off the edge. The `<table>` inside it keeps its own semantics.
666
- */
667
- answerTable: string;
668
- /**
669
- * The product-video card in an answer (CONTRACT.md §7) and the player it opens.
670
- *
671
- * `productVideo` is the card's badge — the video counterpart of `conceptIllustration` —
672
- * and names a video the answer gave no title. `productVideoTitle` names the video in this
673
- * language and takes `{product}`: the harness always writes the line's text as the English
674
- * "<Name> product video", so the card keeps only the name from it. `playVideo` is the
675
- * card's accessible name and takes `{title}`, which is that name. The last four belong to
676
- * the player: its Close button, the two states of its full-screen toggle, and the line
677
- * shown in place of a video that cannot be played.
678
- */
679
- productVideo: string;
680
- productVideoTitle: string;
681
- playVideo: string;
682
- closeVideo: string;
683
- enterFullScreen: string;
684
- exitFullScreen: string;
685
- /**
686
- * BOFF-9697: the site-wide assistant panel (`ExplorePanel`). The tab, view and avatar words are the ones the product
687
- * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
688
- */
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;
695
- panelViews: string;
696
- tabChat: string;
697
- tabAvatar: string;
698
- closePanel: string;
699
- liveAvatar: string;
700
- avatarComingSoon: string;
701
- continueInChat: string;
702
- videoUnavailable: string;
703
- /** Accessible name of the provenance row under an answer. */
704
- groundedIn: string;
705
- /** How many sources the answer cites. `sourceCountMany` takes `{count}`. */
706
- sourceCountOne: string;
707
- sourceCountMany: string;
708
- /** What KIND of page a source is, inferred from its URL. */
709
- sourceKindConcept: string;
710
- sourceKindDocs: string;
711
- sourceKindPricing: string;
712
- sourceKindUseCase: string;
713
- sourceKindPage: string;
714
- /**
715
- * The page's <title> and <meta description>.
716
- *
717
- * These are the surface a search result and a browser tab are built from, and they are
718
- * the LAST place the old product-first framing survived: all 38 sites hard-coded
719
- * "Explore Burdenoff products with AI" inline, so the tab announced our catalogue on a
720
- * page that asks the visitor about their problem — and named the wrong brand on 37 of
721
- * them. `seoTitle` carries no brand: PageHead appends "| {productName}" itself.
722
- */
723
- seoTitle: string;
724
- seoDescription: string;
725
- /** Used when the page belongs to a specific product's site. Takes `{product}`. */
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;
732
- capabilities: [string, string, string];
733
- prompts: string[];
734
- }
735
- declare function speechLocaleOf(locale: ExploreLocale): string;
736
-
737
494
  /**
738
495
  * Localisation for the published answer pages.
739
496
  *
@@ -924,6 +681,12 @@ interface ExplorePanelAvatar {
924
681
  src: string;
925
682
  /** The avatar's name, for the picture's text alternative. */
926
683
  name?: string;
684
+ /**
685
+ * BOFF-9797. Opt in to the receive-only live avatar in the Avatar view, for this site. Absent (the default): the
686
+ * Avatar view is the picture, "Live avatar coming soon" and "Continue in Chat", exactly as before, and nothing is
687
+ * asked of any server. Needs the panel under an `ExploreChatProvider`. See the README's "Live avatar".
688
+ */
689
+ live?: ExplorePanelAvatarLive;
927
690
  }
928
691
  interface ExplorePanelProps {
929
692
  /** Whether the panel shows. The host owns it (its floating button opens the panel). */
@@ -1006,4 +769,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
1006
769
  */
1007
770
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
1008
771
 
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 };
772
+ 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, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, ExploreLocale, ExplorePanel, type ExplorePanelAvatar, ExplorePanelAvatarLive, type ExplorePanelProps, ExploreScope, 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, useExploreConversation };
package/dist/index.d.ts CHANGED
@@ -18,12 +18,15 @@ 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, 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';
21
+ import { a as ExploreLocale, E as ExplorePanelAvatarLive } from './explore-avatar-live-config-B171o1Yo.js';
22
+ export { b as EXPLORE_LOCALES, c as ExploreStrings, s as speechLocaleOf } from './explore-avatar-live-config-B171o1Yo.js';
23
+ import { A as AnswerRendererStrings, E as ExploreScope } from './explore-DjQE7Xia.js';
24
+ 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-DjQE7Xia.js';
23
25
  export { ExploreCta, ExploreCtaProps } from './components/explore-cta.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
+ import { e as UseExploreChatResult, S as StagedAttachment } from './use-explore-chat-DunjG-3p.js';
27
+ 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 classifyExploreError, u as useExploreChat } from './use-explore-chat-DunjG-3p.js';
28
+ 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, E as ExploreCatalog, n as ExploreCatalogQueryData, o as ExploreConceptHighlight, p as ExploreConversation, q as ExploreCtaKind, r as ExploreCtaLink, s as ExploreErrorCode, t as ExploreEscalation, d as ExploreLimits, a as ExploreMessage, u as ExploreMessageQueryData, v as ExploreMessageRole, w as ExploreMessageStatus, e as ExploreProduct, f as ExploreReference, S as SEND_EXPLORE_MESSAGE_MUTATION, x as SendExploreMessageInput, y as SendExploreMessageMutationData, z as SendExploreMessageResult, A as looksLikeDeliverableEmail } from './explore-types-Bb2Ih3d8.js';
29
+ export { U as UseSpeechOutputOptions, a as UseSpeechOutputResult, s as stopSpeaking, u as useProgressiveReveal, b as useSpeechOutput } from './use-progressive-reveal-ppicEgzZ.js';
27
30
  export { RybbitAnalytics, RybbitAnalyticsProps } from './analytics/index.js';
28
31
  export { PageHead, PageHeadProps } from './seo/index.js';
29
32
  export { ProductData, ProductProvider, ProductProviderProps, PublicProductFetchResult, fetchPublicProduct, useProduct, useProductConfig } from './product/index.js';
@@ -33,6 +36,7 @@ import * as LabelPrimitive from '@radix-ui/react-label';
33
36
  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
37
  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
38
  export { ComparisonClaim, ComparisonSource, DEFAULT_COMPARISON_MAX_AGE_DAYS, FreshnessIssue, FreshnessOptions, FreshnessProblem, NonEmptySources, Sourced, checkComparisonFreshness, formatFreshnessReport, latestVerification, oldestVerification, parseVerifiedAt } from './comparison/index.js';
39
+ import './types-CndbmBK-.js';
36
40
  import 'clsx';
37
41
 
38
42
  interface CareersSubmissionFormProps {
@@ -487,253 +491,6 @@ declare function AnswersPage({ productName, siteUrl, answers, topics, cta, linkC
487
491
  */
488
492
  declare function AnswerDetailPage(props: AnswerDetailPageProps): react.JSX.Element;
489
493
 
490
- /**
491
- * Localisation for the `/explore` chat surface.
492
- *
493
- * ## Why this is self-contained
494
- *
495
- * The app shells localise through `useI18n()` from `@burdenoff/fe-libs`, which is mounted by
496
- * `AppShellProvider` and fetches translations at runtime from `global-i18n-svc`. None of that
497
- * exists on a marketing website: no provider, no dictionary, no locale routing, and no
498
- * translation files in any of the 39 site repos. Pulling that machinery in would mean adding
499
- * a runtime translation fetch to a static prerendered page — a network round-trip in front of
500
- * the first paint, on pages whose whole point is that they are prerendered.
501
- *
502
- * So the strings are bundled. There are few enough of them that the cost is bytes rather than
503
- * a request, and a prerendered page stays fully rendered.
504
- *
505
- * ## Locales
506
- *
507
- * The six the products actually ship, taken from `{product}-app/src/components/chrome/
508
- * languages.ts` (FALLBACK_LANGUAGES). Deliberately NOT the wider `Locale` union in fe-libs,
509
- * which also lists fr/de/ja that no product ships, and deliberately not the backend's BCP-47
510
- * set, which has fr/de/ja but lacks ta and ar.
511
- */
512
- declare const EXPLORE_LOCALES: readonly ["en", "zh", "hi", "es", "ar", "ta"];
513
- type ExploreLocale = (typeof EXPLORE_LOCALES)[number];
514
- interface ExploreStrings {
515
- badge: string;
516
- welcomeTitle: string;
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;
530
- tryAsking: string;
531
- focusProduct: string;
532
- allProducts: string;
533
- showAll: string;
534
- showLess: string;
535
- sources: string;
536
- nextYouCouldAsk: string;
537
- placeholder: string;
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;
549
- send: string;
550
- stop: string;
551
- newChat: string;
552
- history: string;
553
- clearHistory: string;
554
- share: string;
555
- copied: string;
556
- copying: string;
557
- shareUnavailable: string;
558
- disclaimer: string;
559
- disclaimerShort: string;
560
- dictate: string;
561
- stopDictating: string;
562
- attach: string;
563
- attachHint: string;
564
- removeAttachment: string;
565
- attachmentNameOnly: string;
566
- attachmentTooLarge: string;
567
- attachmentTooMany: string;
568
- noAnswer: string;
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;
576
- askHuman: string;
577
- feedbackPrompt: string;
578
- feedbackHelpful: string;
579
- feedbackNotHelpful: string;
580
- feedbackReasonTitle: string;
581
- feedbackReasonInaccurate: string;
582
- feedbackReasonIncomplete: string;
583
- feedbackReasonOffTopic: string;
584
- feedbackReasonHardToFollow: string;
585
- feedbackReasonOther: string;
586
- feedbackCommentPlaceholder: string;
587
- feedbackSend: string;
588
- feedbackDismiss: string;
589
- feedbackThanks: string;
590
- feedbackNotSent: string;
591
- /**
592
- * The trigger, in its two homes: `escalateOpen` is the quiet one under an answer we DID
593
- * give, and the amber "we could not find this" banner reuses `askHuman` so that sentence
594
- * keeps reading as one sentence.
595
- */
596
- escalateOpen: string;
597
- escalateTitle: string;
598
- escalateBody: string;
599
- escalateEmailLabel: string;
600
- escalateEmailPlaceholder: string;
601
- escalateNoteLabel: string;
602
- escalateSubmit: string;
603
- escalateSending: string;
604
- escalateCancel: string;
605
- /**
606
- * Shown for BOTH the client's own pre-flight and the server's `INVALID_EMAIL`. The two
607
- * disagree about what is deliverable and the server is right, but the visitor's next
608
- * action is identical either way: check the address.
609
- */
610
- escalateInvalidEmail: string;
611
- /**
612
- * The success line. Takes `{email}` — and it is filled with the address the SERVER
613
- * returned, not the one in the box, because on a repeat handover the reply goes to
614
- * whichever address the first one used.
615
- *
616
- * Used for `created: false` as well: a visitor asking for help is not told "you already
617
- * did that".
618
- */
619
- escalateSent: string;
620
- escalateRateLimited: string;
621
- escalateCaptcha: string;
622
- escalateFailed: string;
623
- prevSuggestion: string;
624
- nextSuggestion: string;
625
- /**
626
- * The label every concept picture carries, wherever one is shown — inside an answer and on
627
- * the welcome strip alike.
628
- *
629
- * These images are published mockups, so the page has to say so; it says it in ONE wording,
630
- * because two phrasings for the same caveat read as two different caveats.
631
- */
632
- conceptIllustration: string;
633
- /** Rail arrows on the concept strip — pointer devices only. */
634
- conceptScrollPrev: string;
635
- conceptScrollNext: string;
636
- opensInNewTab: string;
637
- /** Heading over the concept strip on the welcome screen. */
638
- conceptStripTitle: string;
639
- /** Accessible name of the strip itself. */
640
- conceptStripLabel: string;
641
- /** Accessible name of one card. Takes `{title}` and `{product}`. */
642
- conceptAsk: string;
643
- /**
644
- * The question a card actually SENDS. Takes `{title}` and `{product}`.
645
- *
646
- * Localised because it becomes the visitor's own message in the transcript — an English
647
- * sentence appearing above an Arabic answer would read as the page talking to itself.
648
- */
649
- conceptAskQuestion: string;
650
- /** Label of the per-answer copy control, and its failure state. */
651
- copyAnswer: string;
652
- copyFailed: string;
653
- /**
654
- * Label of the per-answer read-aloud control, in its two states.
655
- *
656
- * A toggle, exactly like the composer's dictation button: one control whose label says
657
- * what pressing it does NOW, never a second button that appears while it is speaking.
658
- */
659
- readAloud: string;
660
- stopReading: string;
661
- /**
662
- * Accessible name of the scrollable box a table in an answer sits in.
663
- *
664
- * A scrollable region needs a name and a tab stop, or a keyboard visitor cannot reach the
665
- * columns that are off the edge. The `<table>` inside it keeps its own semantics.
666
- */
667
- answerTable: string;
668
- /**
669
- * The product-video card in an answer (CONTRACT.md §7) and the player it opens.
670
- *
671
- * `productVideo` is the card's badge — the video counterpart of `conceptIllustration` —
672
- * and names a video the answer gave no title. `productVideoTitle` names the video in this
673
- * language and takes `{product}`: the harness always writes the line's text as the English
674
- * "<Name> product video", so the card keeps only the name from it. `playVideo` is the
675
- * card's accessible name and takes `{title}`, which is that name. The last four belong to
676
- * the player: its Close button, the two states of its full-screen toggle, and the line
677
- * shown in place of a video that cannot be played.
678
- */
679
- productVideo: string;
680
- productVideoTitle: string;
681
- playVideo: string;
682
- closeVideo: string;
683
- enterFullScreen: string;
684
- exitFullScreen: string;
685
- /**
686
- * BOFF-9697: the site-wide assistant panel (`ExplorePanel`). The tab, view and avatar words are the ones the product
687
- * apps' assistant already ships in all six locales (Chat, Avatar, Live avatar, Assistant views).
688
- */
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;
695
- panelViews: string;
696
- tabChat: string;
697
- tabAvatar: string;
698
- closePanel: string;
699
- liveAvatar: string;
700
- avatarComingSoon: string;
701
- continueInChat: string;
702
- videoUnavailable: string;
703
- /** Accessible name of the provenance row under an answer. */
704
- groundedIn: string;
705
- /** How many sources the answer cites. `sourceCountMany` takes `{count}`. */
706
- sourceCountOne: string;
707
- sourceCountMany: string;
708
- /** What KIND of page a source is, inferred from its URL. */
709
- sourceKindConcept: string;
710
- sourceKindDocs: string;
711
- sourceKindPricing: string;
712
- sourceKindUseCase: string;
713
- sourceKindPage: string;
714
- /**
715
- * The page's <title> and <meta description>.
716
- *
717
- * These are the surface a search result and a browser tab are built from, and they are
718
- * the LAST place the old product-first framing survived: all 38 sites hard-coded
719
- * "Explore Burdenoff products with AI" inline, so the tab announced our catalogue on a
720
- * page that asks the visitor about their problem — and named the wrong brand on 37 of
721
- * them. `seoTitle` carries no brand: PageHead appends "| {productName}" itself.
722
- */
723
- seoTitle: string;
724
- seoDescription: string;
725
- /** Used when the page belongs to a specific product's site. Takes `{product}`. */
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;
732
- capabilities: [string, string, string];
733
- prompts: string[];
734
- }
735
- declare function speechLocaleOf(locale: ExploreLocale): string;
736
-
737
494
  /**
738
495
  * Localisation for the published answer pages.
739
496
  *
@@ -924,6 +681,12 @@ interface ExplorePanelAvatar {
924
681
  src: string;
925
682
  /** The avatar's name, for the picture's text alternative. */
926
683
  name?: string;
684
+ /**
685
+ * BOFF-9797. Opt in to the receive-only live avatar in the Avatar view, for this site. Absent (the default): the
686
+ * Avatar view is the picture, "Live avatar coming soon" and "Continue in Chat", exactly as before, and nothing is
687
+ * asked of any server. Needs the panel under an `ExploreChatProvider`. See the README's "Live avatar".
688
+ */
689
+ live?: ExplorePanelAvatarLive;
927
690
  }
928
691
  interface ExplorePanelProps {
929
692
  /** Whether the panel shows. The host owns it (its floating button opens the panel). */
@@ -1006,4 +769,4 @@ declare const Textarea: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLP
1006
769
  */
1007
770
  declare const ECOSYSTEM_PRODUCTS: WebsiteSwitcherProduct[];
1008
771
 
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 };
772
+ 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, ExploreChatProvider, type ExploreChatProviderProps, type ExploreConversationOptions, type ExploreConversationState, ExploreLocale, ExplorePanel, type ExplorePanelAvatar, ExplorePanelAvatarLive, type ExplorePanelProps, ExploreScope, 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, useExploreConversation };