@burdenoff/website-sdk 2026.1021.4 → 2026.1026.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 (69) hide show
  1. package/dist/components/contact.js +2 -1
  2. package/dist/components/contact.js.map +1 -1
  3. package/dist/components/contact.mjs +2 -1
  4. package/dist/components/contact.mjs.map +1 -1
  5. package/dist/components/explore-cta.d.mts +10 -1
  6. package/dist/components/explore-cta.d.ts +10 -1
  7. package/dist/components/explore-cta.js +82 -74
  8. package/dist/components/explore-cta.js.map +1 -1
  9. package/dist/components/explore-cta.mjs +83 -75
  10. package/dist/components/explore-cta.mjs.map +1 -1
  11. package/dist/components/explore.d.mts +2 -2
  12. package/dist/components/explore.d.ts +2 -2
  13. package/dist/components/explore.js +592 -464
  14. package/dist/components/explore.js.map +1 -1
  15. package/dist/components/explore.mjs +593 -465
  16. package/dist/components/explore.mjs.map +1 -1
  17. package/dist/components/newsletter.js +2 -1
  18. package/dist/components/newsletter.js.map +1 -1
  19. package/dist/components/newsletter.mjs +2 -1
  20. package/dist/components/newsletter.mjs.map +1 -1
  21. package/dist/components/partners.js +2 -1
  22. package/dist/components/partners.js.map +1 -1
  23. package/dist/components/partners.mjs +2 -1
  24. package/dist/components/partners.mjs.map +1 -1
  25. package/dist/components/pricing.js +2 -1
  26. package/dist/components/pricing.js.map +1 -1
  27. package/dist/components/pricing.mjs +2 -1
  28. package/dist/components/pricing.mjs.map +1 -1
  29. package/dist/components/unsubscribe.js +2 -1
  30. package/dist/components/unsubscribe.js.map +1 -1
  31. package/dist/components/unsubscribe.mjs +2 -1
  32. package/dist/components/unsubscribe.mjs.map +1 -1
  33. package/dist/components/waitlist.js +2 -1
  34. package/dist/components/waitlist.js.map +1 -1
  35. package/dist/components/waitlist.mjs +2 -1
  36. package/dist/components/waitlist.mjs.map +1 -1
  37. package/dist/content/index.js +2 -1
  38. package/dist/content/index.js.map +1 -1
  39. package/dist/content/index.mjs +2 -1
  40. package/dist/content/index.mjs.map +1 -1
  41. package/dist/{explore-POqE7J8r.d.mts → explore-BRfKFfvI.d.mts} +21 -2
  42. package/dist/{explore-D6kon7uz.d.ts → explore-DkfcKgp6.d.ts} +21 -2
  43. package/dist/{explore-types-BB8HNFzX.d.mts → explore-types-_9UJu6EA.d.mts} +1 -1
  44. package/dist/{explore-types-BB8HNFzX.d.ts → explore-types-_9UJu6EA.d.ts} +1 -1
  45. package/dist/hooks/index.d.mts +2 -2
  46. package/dist/hooks/index.d.ts +2 -2
  47. package/dist/hooks/index.js +15 -9
  48. package/dist/hooks/index.js.map +1 -1
  49. package/dist/hooks/index.mjs +15 -9
  50. package/dist/hooks/index.mjs.map +1 -1
  51. package/dist/index.d.mts +123 -7
  52. package/dist/index.d.ts +123 -7
  53. package/dist/index.js +924 -118
  54. package/dist/index.js.map +1 -1
  55. package/dist/index.mjs +924 -121
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/seo/index.d.mts +11 -1
  58. package/dist/seo/index.d.ts +11 -1
  59. package/dist/seo/index.js +2 -1
  60. package/dist/seo/index.js.map +1 -1
  61. package/dist/seo/index.mjs +2 -1
  62. package/dist/seo/index.mjs.map +1 -1
  63. package/dist/store/index.js +2 -1
  64. package/dist/store/index.js.map +1 -1
  65. package/dist/store/index.mjs +2 -1
  66. package/dist/store/index.mjs.map +1 -1
  67. package/dist/{use-progressive-reveal-Kr6DwGXG.d.mts → use-progressive-reveal-BFPWbEXy.d.mts} +25 -2
  68. package/dist/{use-progressive-reveal-BVJn9NIr.d.ts → use-progressive-reveal-C0hkdu_i.d.ts} +25 -2
  69. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { createContext, useMemo, useState, useRef, useEffect, useCallback, useContext, Children, isValidElement, cloneElement, useId } from 'react';
2
+ import { createContext, useContext, useMemo, useRef, useEffect, useState, useCallback, Children, isValidElement, cloneElement, useId } from 'react';
3
3
  import { Sparkles, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, BookOpenText, Layers, TriangleAlert, ChevronLeft, ChevronRight, ExternalLink, Check, Copy, ThumbsUp, ThumbsDown, Volume2, Film, Play, Minimize, Maximize, VideoOff } from 'lucide-react';
4
4
  import { createPortal } from 'react-dom';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -109,6 +109,14 @@ var EN = {
109
109
  closeVideo: "Close video",
110
110
  enterFullScreen: "Full screen",
111
111
  exitFullScreen: "Exit full screen",
112
+ panelTitle: "AI assistant",
113
+ panelViews: "Assistant views",
114
+ tabChat: "Chat",
115
+ tabAvatar: "Avatar",
116
+ closePanel: "Close",
117
+ liveAvatar: "Live avatar",
118
+ avatarComingSoon: "Live avatar coming soon",
119
+ continueInChat: "Continue in Chat",
112
120
  videoUnavailable: "This video can't be played right now.",
113
121
  groundedIn: "What this answer is based on",
114
122
  sourceCountOne: "1 source",
@@ -217,6 +225,14 @@ var ZH = {
217
225
  closeVideo: "\u5173\u95ED\u89C6\u9891",
218
226
  enterFullScreen: "\u5168\u5C4F",
219
227
  exitFullScreen: "\u9000\u51FA\u5168\u5C4F",
228
+ panelTitle: "AI \u52A9\u624B",
229
+ panelViews: "\u52A9\u624B\u89C6\u56FE",
230
+ tabChat: "\u804A\u5929",
231
+ tabAvatar: "\u865A\u62DF\u5F62\u8C61",
232
+ closePanel: "\u5173\u95ED",
233
+ liveAvatar: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61",
234
+ avatarComingSoon: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61\u5373\u5C06\u63A8\u51FA",
235
+ continueInChat: "\u5728\u804A\u5929\u4E2D\u7EE7\u7EED",
220
236
  videoUnavailable: "\u6682\u65F6\u65E0\u6CD5\u64AD\u653E\u6B64\u89C6\u9891\u3002",
221
237
  groundedIn: "\u8FD9\u4E2A\u56DE\u7B54\u7684\u4F9D\u636E",
222
238
  sourceCountOne: "1 \u4E2A\u6765\u6E90",
@@ -321,6 +337,14 @@ var HI = {
321
337
  closeVideo: "\u0935\u0940\u0921\u093F\u092F\u094B \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
322
338
  enterFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928",
323
339
  exitFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u0938\u0947 \u092C\u093E\u0939\u0930 \u0928\u093F\u0915\u0932\u0947\u0902",
340
+ panelTitle: "AI \u0938\u0939\u093E\u092F\u0915",
341
+ panelViews: "\u0938\u0939\u093E\u092F\u0915 \u0926\u0943\u0936\u094D\u092F",
342
+ tabChat: "\u091A\u0948\u091F",
343
+ tabAvatar: "\u0905\u0935\u0924\u093E\u0930",
344
+ closePanel: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
345
+ liveAvatar: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930",
346
+ avatarComingSoon: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930 \u091C\u0932\u094D\u0926 \u0906 \u0930\u0939\u093E \u0939\u0948",
347
+ continueInChat: "\u091A\u0948\u091F \u092E\u0947\u0902 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902",
324
348
  videoUnavailable: "\u092F\u0939 \u0935\u0940\u0921\u093F\u092F\u094B \u0905\u092D\u0940 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u0924\u093E\u0964",
325
349
  groundedIn: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948",
326
350
  sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
@@ -429,6 +453,14 @@ var ES = {
429
453
  closeVideo: "Cerrar v\xEDdeo",
430
454
  enterFullScreen: "Pantalla completa",
431
455
  exitFullScreen: "Salir de pantalla completa",
456
+ panelTitle: "Asistente de IA",
457
+ panelViews: "Vistas del asistente",
458
+ tabChat: "Chat",
459
+ tabAvatar: "Avatar",
460
+ closePanel: "Cerrar",
461
+ liveAvatar: "Avatar en vivo",
462
+ avatarComingSoon: "Avatar en vivo: pr\xF3ximamente",
463
+ continueInChat: "Continuar en el chat",
432
464
  videoUnavailable: "Ahora mismo no se puede reproducir este v\xEDdeo.",
433
465
  groundedIn: "En qu\xE9 se basa esta respuesta",
434
466
  sourceCountOne: "1 fuente",
@@ -537,6 +569,14 @@ var AR = {
537
569
  closeVideo: "\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
538
570
  enterFullScreen: "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
539
571
  exitFullScreen: "\u0627\u0644\u062E\u0631\u0648\u062C \u0645\u0646 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
572
+ panelTitle: "\u0645\u0633\u0627\u0639\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
573
+ panelViews: "\u0637\u0631\u0642 \u0639\u0631\u0636 \u0627\u0644\u0645\u0633\u0627\u0639\u062F",
574
+ tabChat: "\u062F\u0631\u062F\u0634\u0629",
575
+ tabAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631",
576
+ closePanel: "\u0625\u063A\u0644\u0627\u0642",
577
+ liveAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631",
578
+ avatarComingSoon: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0642\u0631\u064A\u0628\u064B\u0627",
579
+ continueInChat: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0641\u064A \u0627\u0644\u062F\u0631\u062F\u0634\u0629",
540
580
  videoUnavailable: "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0622\u0646.",
541
581
  groundedIn: "\u0639\u0644\u0649 \u0645\u0627\u0630\u0627 \u062A\u0633\u062A\u0646\u062F \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
542
582
  sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
@@ -645,6 +685,14 @@ var TA = {
645
685
  closeVideo: "\u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0BAE\u0BC2\u0B9F\u0BC1",
646
686
  enterFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8",
647
687
  exitFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8\u0BAF\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BC7\u0BB1\u0BC1",
688
+ panelTitle: "AI \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD",
689
+ panelViews: "\u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9A\u0BBF\u0B95\u0BB3\u0BCD",
690
+ tabChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8",
691
+ tabAvatar: "\u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
692
+ closePanel: "\u0BAE\u0BC2\u0B9F\u0BC1",
693
+ liveAvatar: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
694
+ avatarComingSoon: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD \u0BB5\u0BBF\u0BB0\u0BC8\u0BB5\u0BBF\u0BB2\u0BCD",
695
+ continueInChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BB5\u0BC1\u0BAE\u0BCD",
648
696
  videoUnavailable: "\u0B87\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0B87\u0BAA\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1 \u0B87\u0BAF\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
649
697
  groundedIn: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B8E\u0BA4\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BA4\u0BC1",
650
698
  sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
@@ -1661,392 +1709,6 @@ function ExploreAnswerBody({
1661
1709
  return /* @__PURE__ */ jsx("div", { className: cn("boff-prose boff-explore-body min-w-0", className), children: /* @__PURE__ */ jsx(AnswerScopeContext.Provider, { value: scope, children: /* @__PURE__ */ jsx(Markdown, { components: overrides, rehypePlugins, children }) }) });
1662
1710
  }
1663
1711
 
1664
- // src/components/explore-types.ts
1665
- var EXPLORE_FEEDBACK_REASONS = [
1666
- "INACCURATE",
1667
- "INCOMPLETE",
1668
- "OFF_TOPIC",
1669
- "HARD_TO_FOLLOW",
1670
- "OTHER"
1671
- ];
1672
- var EXPLORE_MESSAGE_FIELDS = (
1673
- /* GraphQL */
1674
- `
1675
- id
1676
- conversationId
1677
- role
1678
- status
1679
- content
1680
- partialContent
1681
- activity
1682
- references {
1683
- url
1684
- title
1685
- description
1686
- product
1687
- imageUrl
1688
- index
1689
- }
1690
- ctas {
1691
- kind
1692
- label
1693
- url
1694
- product
1695
- }
1696
- followUps
1697
- answered
1698
- attachments {
1699
- name
1700
- mimeType
1701
- size
1702
- textExtracted
1703
- }
1704
- errorCode
1705
- createdAt
1706
- completedAt
1707
- `
1708
- );
1709
- var EXPLORE_OWN_MESSAGE_FIELDS = (
1710
- /* GraphQL */
1711
- `
1712
- ${EXPLORE_MESSAGE_FIELDS}
1713
- feedback {
1714
- rating
1715
- reason
1716
- comment
1717
- createdAt
1718
- }
1719
- `
1720
- );
1721
- var EXPLORE_CATALOG_ESTABLISHED_FIELDS = (
1722
- /* GraphQL */
1723
- `
1724
- enabled
1725
- products {
1726
- slug
1727
- name
1728
- tagline
1729
- website
1730
- }
1731
- examplePrompts
1732
- welcomeTitle
1733
- welcomeBody
1734
- limits {
1735
- maxMessageLength
1736
- maxTurnsPerConversation
1737
- messagesPerDay
1738
- historyTurns
1739
- }
1740
- captchaRequired
1741
- recaptchaSiteKey`
1742
- );
1743
- var EXPLORE_CATALOG_HIGHLIGHT_FIELD = (
1744
- /* GraphQL */
1745
- `
1746
- conceptHighlights {
1747
- product
1748
- productName
1749
- title
1750
- url
1751
- imageUrl
1752
- alt
1753
- }`
1754
- );
1755
- function exploreCatalogDocument(extraFields) {
1756
- return (
1757
- /* GraphQL */
1758
- `
1759
- query ExploreCatalog($productSlug: String) {
1760
- exploreCatalog(productSlug: $productSlug) {${EXPLORE_CATALOG_ESTABLISHED_FIELDS}${extraFields}
1761
- }
1762
- }
1763
- `
1764
- );
1765
- }
1766
- var EXPLORE_CATALOG_QUERY = exploreCatalogDocument(
1767
- EXPLORE_CATALOG_HIGHLIGHT_FIELD
1768
- );
1769
- var EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS = exploreCatalogDocument("");
1770
- var EXPLORE_MESSAGE_QUERY = (
1771
- /* GraphQL */
1772
- `
1773
- query ExploreMessage($conversationToken: String!, $id: ID!) {
1774
- exploreMessage(conversationToken: $conversationToken, id: $id) {
1775
- ${EXPLORE_OWN_MESSAGE_FIELDS}
1776
- }
1777
- }
1778
- `
1779
- );
1780
- var SEND_EXPLORE_MESSAGE_MUTATION = (
1781
- /* GraphQL */
1782
- `
1783
- mutation SendExploreMessage($input: SendExploreMessageInput!) {
1784
- sendExploreMessage(input: $input) {
1785
- conversation {
1786
- id
1787
- token
1788
- productSlug
1789
- turnCount
1790
- createdAt
1791
- }
1792
- userMessage {
1793
- ${EXPLORE_OWN_MESSAGE_FIELDS}
1794
- }
1795
- assistantMessage {
1796
- ${EXPLORE_OWN_MESSAGE_FIELDS}
1797
- }
1798
- remainingToday
1799
- }
1800
- }
1801
- `
1802
- );
1803
- var RECORD_EXPLORE_CLICK_MUTATION = (
1804
- /* GraphQL */
1805
- `
1806
- mutation RecordExploreClick($input: RecordExploreClickInput!) {
1807
- recordExploreClick(input: $input) {
1808
- recorded
1809
- }
1810
- }
1811
- `
1812
- );
1813
- var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
1814
- /* GraphQL */
1815
- `
1816
- mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
1817
- submitExploreFeedback(input: $input) {
1818
- recorded
1819
- feedback {
1820
- rating
1821
- reason
1822
- comment
1823
- createdAt
1824
- }
1825
- }
1826
- }
1827
- `
1828
- );
1829
- var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
1830
- var ESCALATE_EXPLORE_CONVERSATION_MUTATION = (
1831
- /* GraphQL */
1832
- `
1833
- mutation EscalateExploreConversation(
1834
- $input: EscalateExploreConversationInput!
1835
- ) {
1836
- escalateExploreConversation(input: $input) {
1837
- created
1838
- escalation {
1839
- email
1840
- createdAt
1841
- }
1842
- }
1843
- }
1844
- `
1845
- );
1846
- var EXPLORE_ESCALATION_NOTE_SOFT_MAX = 2e3;
1847
- var DELIVERABLE_EMAIL = /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/;
1848
- function looksLikeDeliverableEmail(value) {
1849
- const trimmed = value.trim();
1850
- if (trimmed.length === 0 || trimmed.length > 254) return false;
1851
- return DELIVERABLE_EMAIL.test(trimmed);
1852
- }
1853
- var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
1854
- /* GraphQL */
1855
- `
1856
- mutation CreateExploreShareLink($conversationToken: String!) {
1857
- createExploreShareLink(conversationToken: $conversationToken) {
1858
- shareToken
1859
- }
1860
- }
1861
- `
1862
- );
1863
- var EXPLORE_SHARED_CONVERSATION_QUERY = (
1864
- /* GraphQL */
1865
- `
1866
- query ExploreSharedConversation($shareToken: String!) {
1867
- exploreSharedConversation(shareToken: $shareToken) {
1868
- ${EXPLORE_MESSAGE_FIELDS}
1869
- }
1870
- }
1871
- `
1872
- );
1873
- var PROSE_CSS = `
1874
- .boff-prose {
1875
- max-width: none;
1876
- }
1877
-
1878
- .boff-prose h1 {
1879
- font-size: 2.25rem;
1880
- font-weight: 800;
1881
- line-height: 1.2;
1882
- margin-top: 0;
1883
- margin-bottom: 1rem;
1884
- color: hsl(var(--foreground));
1885
- }
1886
-
1887
- .boff-prose h2 {
1888
- font-size: 1.75rem;
1889
- font-weight: 700;
1890
- line-height: 1.3;
1891
- margin-top: 2rem;
1892
- margin-bottom: 1rem;
1893
- color: hsl(var(--foreground));
1894
- }
1895
-
1896
- .boff-prose h3 {
1897
- font-size: 1.5rem;
1898
- font-weight: 600;
1899
- line-height: 1.4;
1900
- margin-top: 1.5rem;
1901
- margin-bottom: 0.75rem;
1902
- color: hsl(var(--foreground));
1903
- }
1904
-
1905
- .boff-prose h4 {
1906
- font-size: 1.25rem;
1907
- font-weight: 600;
1908
- line-height: 1.5;
1909
- margin-top: 1.25rem;
1910
- margin-bottom: 0.5rem;
1911
- color: hsl(var(--foreground));
1912
- }
1913
-
1914
- .boff-prose p {
1915
- margin-bottom: 1rem;
1916
- line-height: 1.75;
1917
- color: hsl(var(--foreground));
1918
- }
1919
-
1920
- .boff-prose ul,
1921
- .boff-prose ol {
1922
- margin-bottom: 1rem;
1923
- padding-left: 1.5rem;
1924
- }
1925
-
1926
- .boff-prose ul {
1927
- list-style-type: disc;
1928
- }
1929
-
1930
- .boff-prose ol {
1931
- list-style-type: decimal;
1932
- }
1933
-
1934
- .boff-prose li {
1935
- margin-bottom: 0.25rem;
1936
- line-height: 1.75;
1937
- color: hsl(var(--foreground));
1938
- }
1939
-
1940
- .boff-prose li > ul,
1941
- .boff-prose li > ol {
1942
- margin-top: 0.25rem;
1943
- margin-bottom: 0.25rem;
1944
- }
1945
-
1946
- .boff-prose a {
1947
- color: hsl(var(--primary));
1948
- text-decoration: underline;
1949
- text-underline-offset: 2px;
1950
- }
1951
-
1952
- .boff-prose a:hover {
1953
- opacity: 0.8;
1954
- }
1955
-
1956
- .boff-prose hr {
1957
- border: none;
1958
- height: 1px;
1959
- background-color: hsl(var(--border));
1960
- margin: 2rem 0;
1961
- }
1962
-
1963
- .boff-prose blockquote {
1964
- border-left: 4px solid hsl(var(--border));
1965
- padding-left: 1rem;
1966
- margin: 1.5rem 0;
1967
- font-style: italic;
1968
- color: hsl(var(--muted-foreground));
1969
- }
1970
-
1971
- .boff-prose strong {
1972
- font-weight: 700;
1973
- color: hsl(var(--foreground));
1974
- }
1975
-
1976
- .boff-prose code {
1977
- background-color: hsl(var(--muted));
1978
- padding: 0.125rem 0.25rem;
1979
- border-radius: 0.25rem;
1980
- font-size: 0.875em;
1981
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1982
- }
1983
-
1984
- .boff-prose pre {
1985
- background-color: hsl(var(--muted));
1986
- padding: 1rem;
1987
- border-radius: 0.5rem;
1988
- overflow-x: auto;
1989
- margin-bottom: 1rem;
1990
- }
1991
-
1992
- .boff-prose pre code {
1993
- background-color: transparent;
1994
- padding: 0;
1995
- }
1996
-
1997
- .boff-prose img {
1998
- max-width: 100%;
1999
- height: auto;
2000
- }
2001
-
2002
- .boff-prose table {
2003
- width: 100%;
2004
- border-collapse: collapse;
2005
- margin-bottom: 1rem;
2006
- }
2007
-
2008
- .boff-prose th,
2009
- .boff-prose td {
2010
- border: 1px solid hsl(var(--border));
2011
- padding: 0.5rem;
2012
- text-align: left;
2013
- }
2014
-
2015
- .boff-prose th {
2016
- font-weight: 600;
2017
- background-color: hsl(var(--muted));
2018
- }
2019
-
2020
- /* Smaller variant used inside cards and compact panels */
2021
- .boff-prose-sm {
2022
- font-size: 0.875rem;
2023
- }
2024
-
2025
- .boff-prose-sm h1 {
2026
- font-size: 1.75rem;
2027
- }
2028
-
2029
- .boff-prose-sm h2 {
2030
- font-size: 1.5rem;
2031
- }
2032
-
2033
- .boff-prose-sm h3 {
2034
- font-size: 1.25rem;
2035
- }
2036
-
2037
- .boff-prose-sm h4 {
2038
- font-size: 1.125rem;
2039
- }
2040
-
2041
- .boff-prose-sm p,
2042
- .boff-prose-sm li {
2043
- line-height: 1.625;
2044
- }
2045
- `;
2046
- function ProseStyles() {
2047
- return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PROSE_CSS } });
2048
- }
2049
-
2050
1712
  // src/client/security.ts
2051
1713
  var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
2052
1714
  var RESERVED_HEADERS = /* @__PURE__ */ new Set([
@@ -2249,27 +1911,237 @@ var _WebSDKClient = class _WebSDKClient {
2249
1911
  _WebSDKClient.RETRY_BASE_DELAY_MS * (i + 1) + Math.random() * 200
2250
1912
  );
2251
1913
  }
2252
- return last;
1914
+ return last;
1915
+ }
1916
+ };
1917
+ __publicField(_WebSDKClient, "CACHE_TTL", 5 * 60 * 1e3);
1918
+ // 5 minutes
1919
+ __publicField(_WebSDKClient, "MAX_CACHE_ENTRIES", 100);
1920
+ __publicField(_WebSDKClient, "DEFAULT_TIMEOUT_MS", 12e3);
1921
+ __publicField(_WebSDKClient, "DEFAULT_MAX_RETRIES", 1);
1922
+ __publicField(_WebSDKClient, "RETRY_BASE_DELAY_MS", 400);
1923
+ var WebSDKContext = createContext(null);
1924
+ function useWebSDK() {
1925
+ const client = useContext(WebSDKContext);
1926
+ if (!client) {
1927
+ throw new Error("useWebSDK must be used within a WebSDKProvider");
1928
+ }
1929
+ return client;
1930
+ }
1931
+ function useWebSDKConfig() {
1932
+ const client = useWebSDK();
1933
+ return client.getConfig();
1934
+ }
1935
+
1936
+ // src/components/explore-types.ts
1937
+ var EXPLORE_FEEDBACK_REASONS = [
1938
+ "INACCURATE",
1939
+ "INCOMPLETE",
1940
+ "OFF_TOPIC",
1941
+ "HARD_TO_FOLLOW",
1942
+ "OTHER"
1943
+ ];
1944
+ var EXPLORE_MESSAGE_FIELDS = (
1945
+ /* GraphQL */
1946
+ `
1947
+ id
1948
+ conversationId
1949
+ role
1950
+ status
1951
+ content
1952
+ partialContent
1953
+ activity
1954
+ references {
1955
+ url
1956
+ title
1957
+ description
1958
+ product
1959
+ imageUrl
1960
+ index
1961
+ }
1962
+ ctas {
1963
+ kind
1964
+ label
1965
+ url
1966
+ product
1967
+ }
1968
+ followUps
1969
+ answered
1970
+ attachments {
1971
+ name
1972
+ mimeType
1973
+ size
1974
+ textExtracted
1975
+ }
1976
+ errorCode
1977
+ createdAt
1978
+ completedAt
1979
+ `
1980
+ );
1981
+ var EXPLORE_OWN_MESSAGE_FIELDS = (
1982
+ /* GraphQL */
1983
+ `
1984
+ ${EXPLORE_MESSAGE_FIELDS}
1985
+ feedback {
1986
+ rating
1987
+ reason
1988
+ comment
1989
+ createdAt
1990
+ }
1991
+ `
1992
+ );
1993
+ var EXPLORE_CATALOG_ESTABLISHED_FIELDS = (
1994
+ /* GraphQL */
1995
+ `
1996
+ enabled
1997
+ products {
1998
+ slug
1999
+ name
2000
+ tagline
2001
+ website
2002
+ }
2003
+ examplePrompts
2004
+ welcomeTitle
2005
+ welcomeBody
2006
+ limits {
2007
+ maxMessageLength
2008
+ maxTurnsPerConversation
2009
+ messagesPerDay
2010
+ historyTurns
2011
+ }
2012
+ captchaRequired
2013
+ recaptchaSiteKey`
2014
+ );
2015
+ var EXPLORE_CATALOG_HIGHLIGHT_FIELD = (
2016
+ /* GraphQL */
2017
+ `
2018
+ conceptHighlights {
2019
+ product
2020
+ productName
2021
+ title
2022
+ url
2023
+ imageUrl
2024
+ alt
2025
+ }`
2026
+ );
2027
+ function exploreCatalogDocument(extraFields) {
2028
+ return (
2029
+ /* GraphQL */
2030
+ `
2031
+ query ExploreCatalog($productSlug: String) {
2032
+ exploreCatalog(productSlug: $productSlug) {${EXPLORE_CATALOG_ESTABLISHED_FIELDS}${extraFields}
2033
+ }
2034
+ }
2035
+ `
2036
+ );
2037
+ }
2038
+ var EXPLORE_CATALOG_QUERY = exploreCatalogDocument(
2039
+ EXPLORE_CATALOG_HIGHLIGHT_FIELD
2040
+ );
2041
+ var EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS = exploreCatalogDocument("");
2042
+ var EXPLORE_MESSAGE_QUERY = (
2043
+ /* GraphQL */
2044
+ `
2045
+ query ExploreMessage($conversationToken: String!, $id: ID!) {
2046
+ exploreMessage(conversationToken: $conversationToken, id: $id) {
2047
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
2048
+ }
2049
+ }
2050
+ `
2051
+ );
2052
+ var SEND_EXPLORE_MESSAGE_MUTATION = (
2053
+ /* GraphQL */
2054
+ `
2055
+ mutation SendExploreMessage($input: SendExploreMessageInput!) {
2056
+ sendExploreMessage(input: $input) {
2057
+ conversation {
2058
+ id
2059
+ token
2060
+ productSlug
2061
+ turnCount
2062
+ createdAt
2063
+ }
2064
+ userMessage {
2065
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
2066
+ }
2067
+ assistantMessage {
2068
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
2069
+ }
2070
+ remainingToday
2071
+ }
2072
+ }
2073
+ `
2074
+ );
2075
+ var RECORD_EXPLORE_CLICK_MUTATION = (
2076
+ /* GraphQL */
2077
+ `
2078
+ mutation RecordExploreClick($input: RecordExploreClickInput!) {
2079
+ recordExploreClick(input: $input) {
2080
+ recorded
2081
+ }
2082
+ }
2083
+ `
2084
+ );
2085
+ var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
2086
+ /* GraphQL */
2087
+ `
2088
+ mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
2089
+ submitExploreFeedback(input: $input) {
2090
+ recorded
2091
+ feedback {
2092
+ rating
2093
+ reason
2094
+ comment
2095
+ createdAt
2096
+ }
2097
+ }
2098
+ }
2099
+ `
2100
+ );
2101
+ var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
2102
+ var ESCALATE_EXPLORE_CONVERSATION_MUTATION = (
2103
+ /* GraphQL */
2104
+ `
2105
+ mutation EscalateExploreConversation(
2106
+ $input: EscalateExploreConversationInput!
2107
+ ) {
2108
+ escalateExploreConversation(input: $input) {
2109
+ created
2110
+ escalation {
2111
+ email
2112
+ createdAt
2113
+ }
2114
+ }
2115
+ }
2116
+ `
2117
+ );
2118
+ var EXPLORE_ESCALATION_NOTE_SOFT_MAX = 2e3;
2119
+ var DELIVERABLE_EMAIL = /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/;
2120
+ function looksLikeDeliverableEmail(value) {
2121
+ const trimmed = value.trim();
2122
+ if (trimmed.length === 0 || trimmed.length > 254) return false;
2123
+ return DELIVERABLE_EMAIL.test(trimmed);
2124
+ }
2125
+ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
2126
+ /* GraphQL */
2127
+ `
2128
+ mutation CreateExploreShareLink($conversationToken: String!) {
2129
+ createExploreShareLink(conversationToken: $conversationToken) {
2130
+ shareToken
2131
+ }
2253
2132
  }
2254
- };
2255
- __publicField(_WebSDKClient, "CACHE_TTL", 5 * 60 * 1e3);
2256
- // 5 minutes
2257
- __publicField(_WebSDKClient, "MAX_CACHE_ENTRIES", 100);
2258
- __publicField(_WebSDKClient, "DEFAULT_TIMEOUT_MS", 12e3);
2259
- __publicField(_WebSDKClient, "DEFAULT_MAX_RETRIES", 1);
2260
- __publicField(_WebSDKClient, "RETRY_BASE_DELAY_MS", 400);
2261
- var WebSDKContext = createContext(null);
2262
- function useWebSDK() {
2263
- const client = useContext(WebSDKContext);
2264
- if (!client) {
2265
- throw new Error("useWebSDK must be used within a WebSDKProvider");
2133
+ `
2134
+ );
2135
+ var EXPLORE_SHARED_CONVERSATION_QUERY = (
2136
+ /* GraphQL */
2137
+ `
2138
+ query ExploreSharedConversation($shareToken: String!) {
2139
+ exploreSharedConversation(shareToken: $shareToken) {
2140
+ ${EXPLORE_MESSAGE_FIELDS}
2141
+ }
2266
2142
  }
2267
- return client;
2268
- }
2269
- function useWebSDKConfig() {
2270
- const client = useWebSDK();
2271
- return client.getConfig();
2272
- }
2143
+ `
2144
+ );
2273
2145
 
2274
2146
  // src/utils/product-slug.ts
2275
2147
  var PRODUCT_SLUG_RENAMES = Object.freeze(
@@ -2872,7 +2744,9 @@ function useExploreChat(options = {}) {
2872
2744
  pollTimeoutMs = DEFAULT_POLL_TIMEOUT_MS,
2873
2745
  storageKey = DEFAULT_STORAGE_KEY,
2874
2746
  persist = true,
2875
- onSend
2747
+ onSend,
2748
+ enabled = true,
2749
+ shareToken: shareTokenOption
2876
2750
  } = options;
2877
2751
  const client = useWebSDK();
2878
2752
  const { productId } = useWebSDKConfig();
@@ -2910,7 +2784,7 @@ function useExploreChat(options = {}) {
2910
2784
  const [hasConversation, setHasConversation] = useState(false);
2911
2785
  const shareTokenRef = useRef(void 0);
2912
2786
  if (shareTokenRef.current === void 0) {
2913
- shareTokenRef.current = readShareToken();
2787
+ shareTokenRef.current = shareTokenOption === void 0 ? readShareToken() : shareTokenOption;
2914
2788
  }
2915
2789
  const isSharedView = shareTokenRef.current !== null;
2916
2790
  const catalogRef = useRef(catalog);
@@ -2948,6 +2822,7 @@ function useExploreChat(options = {}) {
2948
2822
  };
2949
2823
  }, []);
2950
2824
  useEffect(() => {
2825
+ if (!enabled) return;
2951
2826
  const shareToken = shareTokenRef.current;
2952
2827
  if (!shareToken) return;
2953
2828
  let cancelled = false;
@@ -2982,8 +2857,9 @@ function useExploreChat(options = {}) {
2982
2857
  return () => {
2983
2858
  cancelled = true;
2984
2859
  };
2985
- }, [client]);
2860
+ }, [client, enabled]);
2986
2861
  useEffect(() => {
2862
+ if (!enabled) return;
2987
2863
  if (shareTokenRef.current !== null) return;
2988
2864
  if (!persist) {
2989
2865
  setHydrated(true);
@@ -3008,9 +2884,10 @@ function useExploreChat(options = {}) {
3008
2884
  setTurnCount(turns);
3009
2885
  }
3010
2886
  setHydrated(true);
3011
- }, [persist, rememberConversationToken, storageKey]);
2887
+ }, [persist, rememberConversationToken, storageKey, enabled]);
3012
2888
  useEffect(() => {
3013
- if (!persist || !hydrated || typeof window === "undefined") return;
2889
+ if (!persist || !hydrated || isSharedView || typeof window === "undefined")
2890
+ return;
3014
2891
  try {
3015
2892
  const payload = {
3016
2893
  conversationToken: conversationTokenRef.current,
@@ -3024,10 +2901,10 @@ function useExploreChat(options = {}) {
3024
2901
  window.localStorage.setItem(storageKey, JSON.stringify(payload));
3025
2902
  } catch {
3026
2903
  }
3027
- }, [persist, hydrated, storageKey, messages, focusProduct]);
2904
+ }, [persist, hydrated, isSharedView, storageKey, messages, focusProduct]);
3028
2905
  useEffect(() => {
3029
2906
  messagesRef.current = messages;
3030
- if (!persist || !hydrated) return;
2907
+ if (!persist || !hydrated || isSharedView) return;
3031
2908
  const settled = messages.some(
3032
2909
  (m) => m.role === "ASSISTANT" && (m.status === "COMPLETED" || m.status === "FAILED")
3033
2910
  );
@@ -3039,8 +2916,9 @@ function useExploreChat(options = {}) {
3039
2916
  focusProduct: focusProductRef.current
3040
2917
  })
3041
2918
  );
3042
- }, [messages, persist, hydrated, storageKey]);
2919
+ }, [messages, persist, hydrated, isSharedView, storageKey]);
3043
2920
  useEffect(() => {
2921
+ if (!enabled) return;
3044
2922
  let cancelled = false;
3045
2923
  const load = async () => {
3046
2924
  const variables = { productSlug: productSlug ?? null };
@@ -3081,7 +2959,7 @@ function useExploreChat(options = {}) {
3081
2959
  return () => {
3082
2960
  cancelled = true;
3083
2961
  };
3084
- }, [client, productSlug, fallbackCatalog, bakedRaw]);
2962
+ }, [client, productSlug, fallbackCatalog, bakedRaw, enabled]);
3085
2963
  const startPolling = useCallback(
3086
2964
  (conversationToken, messageId) => {
3087
2965
  pollGenerationRef.current += 1;
@@ -3578,6 +3456,218 @@ function makeOptimisticId() {
3578
3456
  optimisticCounter += 1;
3579
3457
  return `boff-explore-local-${Date.now()}-${optimisticCounter}`;
3580
3458
  }
3459
+ var ExploreConversationContext = createContext(null);
3460
+ function useExploreConversation(options = {}) {
3461
+ const {
3462
+ productSlug,
3463
+ locale,
3464
+ examplePrompts,
3465
+ onSend,
3466
+ pageUrl,
3467
+ enabled,
3468
+ shareToken
3469
+ } = options;
3470
+ const urlAtMount = useMemo(
3471
+ () => typeof window === "undefined" ? void 0 : window.location.href,
3472
+ []
3473
+ );
3474
+ const T = useMemo(
3475
+ () => exploreStrings(resolveExploreLocale(locale)),
3476
+ [locale]
3477
+ );
3478
+ const chat = useExploreChat({
3479
+ productSlug,
3480
+ pageUrl: pageUrl ?? urlAtMount,
3481
+ onSend,
3482
+ // Locale-aware, so a catalog outage degrades to a translated welcome rather than an English one.
3483
+ examplePrompts: examplePrompts ?? T.prompts,
3484
+ fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody },
3485
+ ...enabled === void 0 ? {} : { enabled },
3486
+ ...shareToken === void 0 ? {} : { shareToken }
3487
+ });
3488
+ const [draft, setDraft] = useState("");
3489
+ const [staged, setStaged] = useState([]);
3490
+ return useMemo(
3491
+ () => ({ ...chat, draft, setDraft, staged, setStaged }),
3492
+ [chat, draft, staged]
3493
+ );
3494
+ }
3495
+ var PROSE_CSS = `
3496
+ .boff-prose {
3497
+ max-width: none;
3498
+ }
3499
+
3500
+ .boff-prose h1 {
3501
+ font-size: 2.25rem;
3502
+ font-weight: 800;
3503
+ line-height: 1.2;
3504
+ margin-top: 0;
3505
+ margin-bottom: 1rem;
3506
+ color: hsl(var(--foreground));
3507
+ }
3508
+
3509
+ .boff-prose h2 {
3510
+ font-size: 1.75rem;
3511
+ font-weight: 700;
3512
+ line-height: 1.3;
3513
+ margin-top: 2rem;
3514
+ margin-bottom: 1rem;
3515
+ color: hsl(var(--foreground));
3516
+ }
3517
+
3518
+ .boff-prose h3 {
3519
+ font-size: 1.5rem;
3520
+ font-weight: 600;
3521
+ line-height: 1.4;
3522
+ margin-top: 1.5rem;
3523
+ margin-bottom: 0.75rem;
3524
+ color: hsl(var(--foreground));
3525
+ }
3526
+
3527
+ .boff-prose h4 {
3528
+ font-size: 1.25rem;
3529
+ font-weight: 600;
3530
+ line-height: 1.5;
3531
+ margin-top: 1.25rem;
3532
+ margin-bottom: 0.5rem;
3533
+ color: hsl(var(--foreground));
3534
+ }
3535
+
3536
+ .boff-prose p {
3537
+ margin-bottom: 1rem;
3538
+ line-height: 1.75;
3539
+ color: hsl(var(--foreground));
3540
+ }
3541
+
3542
+ .boff-prose ul,
3543
+ .boff-prose ol {
3544
+ margin-bottom: 1rem;
3545
+ padding-left: 1.5rem;
3546
+ }
3547
+
3548
+ .boff-prose ul {
3549
+ list-style-type: disc;
3550
+ }
3551
+
3552
+ .boff-prose ol {
3553
+ list-style-type: decimal;
3554
+ }
3555
+
3556
+ .boff-prose li {
3557
+ margin-bottom: 0.25rem;
3558
+ line-height: 1.75;
3559
+ color: hsl(var(--foreground));
3560
+ }
3561
+
3562
+ .boff-prose li > ul,
3563
+ .boff-prose li > ol {
3564
+ margin-top: 0.25rem;
3565
+ margin-bottom: 0.25rem;
3566
+ }
3567
+
3568
+ .boff-prose a {
3569
+ color: hsl(var(--primary));
3570
+ text-decoration: underline;
3571
+ text-underline-offset: 2px;
3572
+ }
3573
+
3574
+ .boff-prose a:hover {
3575
+ opacity: 0.8;
3576
+ }
3577
+
3578
+ .boff-prose hr {
3579
+ border: none;
3580
+ height: 1px;
3581
+ background-color: hsl(var(--border));
3582
+ margin: 2rem 0;
3583
+ }
3584
+
3585
+ .boff-prose blockquote {
3586
+ border-left: 4px solid hsl(var(--border));
3587
+ padding-left: 1rem;
3588
+ margin: 1.5rem 0;
3589
+ font-style: italic;
3590
+ color: hsl(var(--muted-foreground));
3591
+ }
3592
+
3593
+ .boff-prose strong {
3594
+ font-weight: 700;
3595
+ color: hsl(var(--foreground));
3596
+ }
3597
+
3598
+ .boff-prose code {
3599
+ background-color: hsl(var(--muted));
3600
+ padding: 0.125rem 0.25rem;
3601
+ border-radius: 0.25rem;
3602
+ font-size: 0.875em;
3603
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
3604
+ }
3605
+
3606
+ .boff-prose pre {
3607
+ background-color: hsl(var(--muted));
3608
+ padding: 1rem;
3609
+ border-radius: 0.5rem;
3610
+ overflow-x: auto;
3611
+ margin-bottom: 1rem;
3612
+ }
3613
+
3614
+ .boff-prose pre code {
3615
+ background-color: transparent;
3616
+ padding: 0;
3617
+ }
3618
+
3619
+ .boff-prose img {
3620
+ max-width: 100%;
3621
+ height: auto;
3622
+ }
3623
+
3624
+ .boff-prose table {
3625
+ width: 100%;
3626
+ border-collapse: collapse;
3627
+ margin-bottom: 1rem;
3628
+ }
3629
+
3630
+ .boff-prose th,
3631
+ .boff-prose td {
3632
+ border: 1px solid hsl(var(--border));
3633
+ padding: 0.5rem;
3634
+ text-align: left;
3635
+ }
3636
+
3637
+ .boff-prose th {
3638
+ font-weight: 600;
3639
+ background-color: hsl(var(--muted));
3640
+ }
3641
+
3642
+ /* Smaller variant used inside cards and compact panels */
3643
+ .boff-prose-sm {
3644
+ font-size: 0.875rem;
3645
+ }
3646
+
3647
+ .boff-prose-sm h1 {
3648
+ font-size: 1.75rem;
3649
+ }
3650
+
3651
+ .boff-prose-sm h2 {
3652
+ font-size: 1.5rem;
3653
+ }
3654
+
3655
+ .boff-prose-sm h3 {
3656
+ font-size: 1.25rem;
3657
+ }
3658
+
3659
+ .boff-prose-sm h4 {
3660
+ font-size: 1.125rem;
3661
+ }
3662
+
3663
+ .boff-prose-sm p,
3664
+ .boff-prose-sm li {
3665
+ line-height: 1.625;
3666
+ }
3667
+ `;
3668
+ function ProseStyles() {
3669
+ return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PROSE_CSS } });
3670
+ }
3581
3671
  var DRAIN_TARGET_MS = 1200;
3582
3672
  var MIN_CHARS_PER_SECOND = 90;
3583
3673
  var MAX_CHARS_PER_SECOND = 2200;
@@ -4222,6 +4312,7 @@ function PageHead({
4222
4312
  locale = "en_US",
4223
4313
  twitterHandle,
4224
4314
  themeColor = "#000000",
4315
+ author,
4225
4316
  structuredData,
4226
4317
  additionalMeta
4227
4318
  }) {
@@ -4234,7 +4325,7 @@ function PageHead({
4234
4325
  /* @__PURE__ */ jsx("meta", { name: "title", content: fullTitle }),
4235
4326
  description && /* @__PURE__ */ jsx("meta", { name: "description", content: description }),
4236
4327
  keywords && /* @__PURE__ */ jsx("meta", { name: "keywords", content: keywords }),
4237
- /* @__PURE__ */ jsx("meta", { name: "author", content: "Burdenoff Consultancy Services Pvt Ltd" }),
4328
+ author && /* @__PURE__ */ jsx("meta", { name: "author", content: author }),
4238
4329
  /* @__PURE__ */ jsx("meta", { name: "robots", content: robots }),
4239
4330
  resolvedUrl && /* @__PURE__ */ jsx("link", { rel: "canonical", href: resolvedUrl }),
4240
4331
  favicon && /* @__PURE__ */ jsx("link", { rel: "icon", href: favicon }),
@@ -6347,15 +6438,17 @@ function WelcomeState({
6347
6438
  focusProduct,
6348
6439
  onPrompt,
6349
6440
  onFocus,
6350
- disabled
6441
+ disabled,
6442
+ heading = "h1"
6351
6443
  }) {
6444
+ const Heading = heading;
6352
6445
  return /* @__PURE__ */ jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-4 sm:py-5", children: [
6353
6446
  /* @__PURE__ */ jsxs("div", { className: "boff-explore-rise text-center", children: [
6354
6447
  /* @__PURE__ */ jsxs("span", { className: "boff-explore-hero-badge inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-3 py-1 text-xs font-medium text-muted-foreground", children: [
6355
6448
  /* @__PURE__ */ jsx(Sparkles, { className: "h-3.5 w-3.5" }),
6356
6449
  T.badge
6357
6450
  ] }),
6358
- /* @__PURE__ */ jsx("h1", { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
6451
+ /* @__PURE__ */ jsx(Heading, { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
6359
6452
  /* @__PURE__ */ jsx("p", { className: "mx-auto mt-2 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground", children: body })
6360
6453
  ] }),
6361
6454
  /* @__PURE__ */ jsx("ul", { className: "boff-explore-capabilities boff-explore-rise boff-explore-rise-1 mt-4 grid grid-cols-3 gap-2 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxs(
@@ -6410,19 +6503,36 @@ function exploreQuestionHref(question, base = "/explore") {
6410
6503
  const joiner = base.includes("?") ? "&" : "?";
6411
6504
  return `${base}${joiner}q=${encodeURIComponent(trimmed)}`;
6412
6505
  }
6413
- function ExplorePage({
6506
+ function ExplorePage(props) {
6507
+ const shared = useContext(ExploreConversationContext);
6508
+ return shared ? /* @__PURE__ */ jsx(ExploreView, { ...props, conversation: shared }) : /* @__PURE__ */ jsx(StandaloneExplorePage, { ...props });
6509
+ }
6510
+ function StandaloneExplorePage(props) {
6511
+ const conversation = useExploreConversation({
6512
+ productSlug: props.productSlug,
6513
+ locale: props.locale,
6514
+ examplePrompts: props.examplePrompts,
6515
+ onSend: props.onSend
6516
+ });
6517
+ return /* @__PURE__ */ jsx(ExploreView, { ...props, conversation });
6518
+ }
6519
+ function ExploreView({
6414
6520
  seo,
6415
6521
  productSlug,
6416
- examplePrompts,
6417
6522
  className,
6418
6523
  heightMode = "viewport",
6419
6524
  viewportOffset,
6420
6525
  onNavigate,
6421
- onSend,
6422
6526
  welcomeTitle,
6423
6527
  welcomeBody,
6424
- locale
6528
+ locale,
6529
+ presentation = "page",
6530
+ active = true,
6531
+ explorePath = "/explore",
6532
+ conversation
6425
6533
  }) {
6534
+ const panel = presentation === "panel";
6535
+ const viewportPage = !panel && heightMode === "viewport";
6426
6536
  const pageUrl = useMemo(
6427
6537
  () => typeof window === "undefined" ? void 0 : window.location.href,
6428
6538
  []
@@ -6458,26 +6568,21 @@ function ExplorePage({
6458
6568
  escalate,
6459
6569
  canEscalate,
6460
6570
  createShareLink,
6461
- isSharedView
6462
- } = useExploreChat({
6463
- productSlug,
6464
- pageUrl,
6465
- onSend,
6466
- // Locale-aware, so a catalog outage degrades to a translated welcome rather than an
6467
- // English one. `T.prompts` seeds the chips the same way.
6468
- examplePrompts: examplePrompts ?? T.prompts,
6469
- fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody }
6470
- });
6471
- const [draft, setDraft] = useState("");
6571
+ isSharedView,
6572
+ draft,
6573
+ setDraft,
6574
+ staged,
6575
+ setStaged
6576
+ } = conversation;
6472
6577
  const textareaRef = useRef(null);
6473
6578
  useEffect(() => {
6474
- if (typeof window === "undefined") return;
6579
+ if (typeof window === "undefined" || panel) return;
6475
6580
  const params = new URLSearchParams(window.location.search);
6476
6581
  if (params.has("c")) return;
6477
6582
  const question = params.get("q")?.trim();
6478
6583
  if (!question) return;
6479
6584
  setDraft(question.slice(0, EXPLORE_PREFILL_MAX_LENGTH));
6480
- }, []);
6585
+ }, [panel, setDraft]);
6481
6586
  const [historyOpen, setHistoryOpen] = useState(false);
6482
6587
  const speechStopRef = useRef(() => void 0);
6483
6588
  const stopDictation = useCallback(() => {
@@ -6493,8 +6598,12 @@ function ExplorePage({
6493
6598
  }
6494
6599
  });
6495
6600
  speechStopRef.current = speech.stop;
6601
+ useEffect(() => {
6602
+ if (active) return;
6603
+ stopDictation();
6604
+ stopSpeaking();
6605
+ }, [active, stopDictation]);
6496
6606
  const [disclaimerOpen, setDisclaimerOpen] = useState(false);
6497
- const [staged, setStaged] = useState([]);
6498
6607
  const [attachmentNotice, setAttachmentNotice] = useState(null);
6499
6608
  const fileInputRef = useRef(null);
6500
6609
  const stagedRef = useRef([]);
@@ -6547,7 +6656,7 @@ function ExplorePage({
6547
6656
  const [bottomInset, setBottomInset] = useState(0);
6548
6657
  const paneOffsetRef = useRef(0);
6549
6658
  const measurePane = useCallback(() => {
6550
- if (heightMode !== "viewport") return;
6659
+ if (!viewportPage) return;
6551
6660
  const el = rootRef.current;
6552
6661
  if (!el) return;
6553
6662
  const layoutHeight = window.innerHeight;
@@ -6566,7 +6675,7 @@ function ExplorePage({
6566
6675
  paneOffsetRef.current = top;
6567
6676
  setPaneOffset((current) => current === top ? current : top);
6568
6677
  setBottomInset((current) => current === inset ? current : inset);
6569
- }, [heightMode]);
6678
+ }, [viewportPage]);
6570
6679
  const [chromeOverlap, setChromeOverlap] = useState(0);
6571
6680
  const measureChrome = useCallback(() => {
6572
6681
  const root = rootRef.current;
@@ -6591,7 +6700,7 @@ function ExplorePage({
6591
6700
  measureChrome();
6592
6701
  }, [measurePane, measureChrome]);
6593
6702
  useEffect(() => {
6594
- if (typeof window === "undefined") return;
6703
+ if (typeof window === "undefined" || panel) return;
6595
6704
  let frame = 0;
6596
6705
  const run = () => {
6597
6706
  frame = 0;
@@ -6629,12 +6738,12 @@ function ExplorePage({
6629
6738
  setBottomInset(0);
6630
6739
  setChromeOverlap(0);
6631
6740
  };
6632
- }, [remeasure]);
6741
+ }, [remeasure, panel]);
6633
6742
  useEffect(() => {
6634
6743
  measureChrome();
6635
6744
  }, [measureChrome, paneOffset, bottomInset]);
6636
6745
  useEffect(() => {
6637
- if (heightMode !== "viewport" || typeof window === "undefined") return;
6746
+ if (!viewportPage || typeof window === "undefined") return;
6638
6747
  const { history: browserHistory } = window;
6639
6748
  const previousRestoration = "scrollRestoration" in browserHistory ? browserHistory.scrollRestoration : null;
6640
6749
  if (previousRestoration !== null)
@@ -6702,14 +6811,14 @@ function ExplorePage({
6702
6811
  if (previousRestoration !== null)
6703
6812
  browserHistory.scrollRestoration = previousRestoration;
6704
6813
  };
6705
- }, [heightMode, remeasure]);
6814
+ }, [viewportPage, remeasure]);
6706
6815
  const handleScroll = useCallback(() => {
6707
6816
  const el = scrollRef.current;
6708
6817
  if (!el) return;
6709
6818
  stickToBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
6710
6819
  }, []);
6711
6820
  useEffect(() => {
6712
- if (typeof window === "undefined") return;
6821
+ if (typeof window === "undefined" || panel) return;
6713
6822
  let frame = 0;
6714
6823
  const run = () => {
6715
6824
  frame = 0;
@@ -6732,7 +6841,7 @@ function ExplorePage({
6732
6841
  if (frame) window.cancelAnimationFrame(frame);
6733
6842
  window.removeEventListener("scroll", schedule);
6734
6843
  };
6735
- }, []);
6844
+ }, [panel]);
6736
6845
  const latestAssistantId = useMemo(() => {
6737
6846
  for (let i = messages.length - 1; i >= 0; i -= 1) {
6738
6847
  const message = messages[i];
@@ -6748,7 +6857,7 @@ function ExplorePage({
6748
6857
  if (!stickToBottomRef.current) return;
6749
6858
  if (anchor.offsetHeight === 0) return;
6750
6859
  alignedForRef.current = latestAssistantId;
6751
- if (!pageOwnsScrolling(el)) {
6860
+ if (panel || !pageOwnsScrolling(el)) {
6752
6861
  const delta2 = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
6753
6862
  el.scrollTop = Math.max(0, el.scrollTop + delta2 - 12);
6754
6863
  return;
@@ -6757,7 +6866,7 @@ function ExplorePage({
6757
6866
  anchor.getBoundingClientRect().top - paneOffsetRef.current - 12
6758
6867
  );
6759
6868
  if (delta !== 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
6760
- }, [latestAssistantId, messages]);
6869
+ }, [latestAssistantId, messages, panel]);
6761
6870
  useEffect(() => {
6762
6871
  if (messages.length === 0) return;
6763
6872
  if (!stickToBottomRef.current) return;
@@ -6765,7 +6874,7 @@ function ExplorePage({
6765
6874
  return;
6766
6875
  const el = scrollRef.current;
6767
6876
  if (!el) return;
6768
- if (!pageOwnsScrolling(el)) {
6877
+ if (panel || !pageOwnsScrolling(el)) {
6769
6878
  el.scrollTop = el.scrollHeight;
6770
6879
  return;
6771
6880
  }
@@ -6774,7 +6883,7 @@ function ExplorePage({
6774
6883
  dock.getBoundingClientRect().bottom - visualViewportHeight()
6775
6884
  );
6776
6885
  if (delta > 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
6777
- }, [activity, latestAssistantId, messages]);
6886
+ }, [activity, latestAssistantId, messages, panel]);
6778
6887
  const handleShare = useCallback(async () => {
6779
6888
  setShareLabel(T.copying);
6780
6889
  setShareUrl(null);
@@ -6784,7 +6893,7 @@ function ExplorePage({
6784
6893
  setTimeout(() => setShareLabel(T.share), 2500);
6785
6894
  return;
6786
6895
  }
6787
- const url = new URL(pageUrl ?? window.location.href);
6896
+ const url = panel ? new URL(explorePath, window.location.href) : new URL(pageUrl ?? window.location.href);
6788
6897
  url.search = "";
6789
6898
  url.hash = "";
6790
6899
  url.searchParams.set("c", token);
@@ -6800,6 +6909,8 @@ function ExplorePage({
6800
6909
  }, [
6801
6910
  createShareLink,
6802
6911
  pageUrl,
6912
+ panel,
6913
+ explorePath,
6803
6914
  T.copied,
6804
6915
  T.copying,
6805
6916
  T.share,
@@ -6828,12 +6939,15 @@ function ExplorePage({
6828
6939
  });
6829
6940
  return pickQueueRef.current;
6830
6941
  },
6831
- [T]
6942
+ [T, setStaged]
6943
+ );
6944
+ const removeAttachment = useCallback(
6945
+ (id) => {
6946
+ setStaged((prev) => prev.filter((entry) => entry.id !== id));
6947
+ setAttachmentNotice(null);
6948
+ },
6949
+ [setStaged]
6832
6950
  );
6833
- const removeAttachment = useCallback((id) => {
6834
- setStaged((prev) => prev.filter((entry) => entry.id !== id));
6835
- setAttachmentNotice(null);
6836
- }, []);
6837
6951
  const submitDraft = useCallback(() => {
6838
6952
  const text = draft.trim();
6839
6953
  if (!text || overLimit || busy || !canSend) return;
@@ -6845,7 +6959,16 @@ function ExplorePage({
6845
6959
  setStaged([]);
6846
6960
  setAttachmentNotice(null);
6847
6961
  textareaRef.current?.focus();
6848
- }, [busy, canSend, draft, overLimit, send, stopDictation]);
6962
+ }, [
6963
+ busy,
6964
+ canSend,
6965
+ draft,
6966
+ overLimit,
6967
+ send,
6968
+ setDraft,
6969
+ setStaged,
6970
+ stopDictation
6971
+ ]);
6849
6972
  const sendPrompt = useCallback(
6850
6973
  (prompt) => {
6851
6974
  if (!canSend || busy) return;
@@ -6856,7 +6979,7 @@ function ExplorePage({
6856
6979
  setStaged([]);
6857
6980
  setAttachmentNotice(null);
6858
6981
  },
6859
- [busy, canSend, send]
6982
+ [busy, canSend, send, setDraft, setStaged]
6860
6983
  );
6861
6984
  const handleKeyDown = useCallback(
6862
6985
  (event) => {
@@ -6878,7 +7001,7 @@ function ExplorePage({
6878
7001
  [serverCatalogRaw]
6879
7002
  );
6880
7003
  const rootStyle = {};
6881
- if (heightMode === "viewport") {
7004
+ if (viewportPage) {
6882
7005
  rootStyle["--boff-explore-offset"] = paneOffset === null ? normalizeOffset(viewportOffset) : `${paneOffset}px`;
6883
7006
  if (bottomInset > 0) {
6884
7007
  rootStyle["--boff-explore-inset"] = `${bottomInset}px`;
@@ -6891,19 +7014,19 @@ function ExplorePage({
6891
7014
  "div",
6892
7015
  {
6893
7016
  ref: rootRef,
6894
- "data-boff-explore": "page",
7017
+ "data-boff-explore": panel ? "panel" : "page",
6895
7018
  "data-phase": phase,
6896
7019
  "data-locale": activeLocale,
6897
7020
  dir: rtl ? "rtl" : void 0,
6898
7021
  className: cn(
6899
- "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
6900
- heightMode === "viewport" && "boff-explore-viewport",
6901
- heightMode === "auto" && "min-h-[70vh]",
7022
+ panel ? "boff-explore-panel flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden bg-background text-foreground" : "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
7023
+ viewportPage && "boff-explore-viewport",
7024
+ !panel && heightMode === "auto" && "min-h-[70vh]",
6902
7025
  className
6903
7026
  ),
6904
- style: rootStyle,
7027
+ style: panel ? void 0 : rootStyle,
6905
7028
  children: [
6906
- /* @__PURE__ */ jsx(
7029
+ panel ? null : /* @__PURE__ */ jsx(
6907
7030
  PageHead,
6908
7031
  {
6909
7032
  title: seo?.title ?? T.seoTitle,
@@ -6916,7 +7039,11 @@ function ExplorePage({
6916
7039
  ),
6917
7040
  /* @__PURE__ */ jsx(ProseStyles, {}),
6918
7041
  /* @__PURE__ */ jsx(ExploreStyles, {}),
6919
- bakedCatalogJson ? /* @__PURE__ */ jsx(
7042
+ panel ? /* @__PURE__ */ jsx("style", { children: `.boff-explore-panel .boff-explore-scroll { container: boff-explore-pane / size; }
7043
+ @container boff-explore-pane (width < ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) {
7044
+ .boff-explore-panel .boff-explore-scroll .boff-explore-capabilities { display: none; }
7045
+ }` }) : null,
7046
+ !panel && bakedCatalogJson ? /* @__PURE__ */ jsx(
6920
7047
  "script",
6921
7048
  {
6922
7049
  id: BAKED_CATALOG_ELEMENT_ID,
@@ -6936,7 +7063,7 @@ function ExplorePage({
6936
7063
  children: /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4" })
6937
7064
  }
6938
7065
  ),
6939
- /* @__PURE__ */ jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
7066
+ panel ? /* @__PURE__ */ jsx("h2", { className: "truncate text-sm font-semibold", children: resolvedTitle }) : /* @__PURE__ */ jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
6940
7067
  focusedProductName ? /* @__PURE__ */ jsx("span", { className: "hidden shrink-0 rounded-full bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground sm:inline", children: focusedProductName }) : null,
6941
7068
  /* @__PURE__ */ jsxs(
6942
7069
  Button,
@@ -7080,6 +7207,7 @@ function ExplorePage({
7080
7207
  children: showWelcome ? /* @__PURE__ */ jsx(
7081
7208
  WelcomeState,
7082
7209
  {
7210
+ heading: panel ? "h2" : "h1",
7083
7211
  strings: T,
7084
7212
  title: resolvedTitle,
7085
7213
  body: resolvedBody,