@burdenoff/website-sdk 2026.1024.1 → 2026.1027.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +77 -1
  2. package/dist/components/explore-cta.d.mts +10 -1
  3. package/dist/components/explore-cta.d.ts +10 -1
  4. package/dist/components/explore-cta.js +82 -74
  5. package/dist/components/explore-cta.js.map +1 -1
  6. package/dist/components/explore-cta.mjs +83 -75
  7. package/dist/components/explore-cta.mjs.map +1 -1
  8. package/dist/components/explore.d.mts +2 -2
  9. package/dist/components/explore.d.ts +2 -2
  10. package/dist/components/explore.js +876 -510
  11. package/dist/components/explore.js.map +1 -1
  12. package/dist/components/explore.mjs +877 -511
  13. package/dist/components/explore.mjs.map +1 -1
  14. package/dist/{explore-POqE7J8r.d.mts → explore-BEgq1_0O.d.mts} +65 -3
  15. package/dist/{explore-D6kon7uz.d.ts → explore-CHiP9u-4.d.ts} +65 -3
  16. package/dist/{explore-types-BB8HNFzX.d.mts → explore-types-_9UJu6EA.d.mts} +1 -1
  17. package/dist/{explore-types-BB8HNFzX.d.ts → explore-types-_9UJu6EA.d.ts} +1 -1
  18. package/dist/hooks/index.d.mts +2 -2
  19. package/dist/hooks/index.d.ts +2 -2
  20. package/dist/hooks/index.js +15 -9
  21. package/dist/hooks/index.js.map +1 -1
  22. package/dist/hooks/index.mjs +15 -9
  23. package/dist/hooks/index.mjs.map +1 -1
  24. package/dist/index.d.mts +177 -6
  25. package/dist/index.d.ts +177 -6
  26. package/dist/index.js +1236 -152
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1236 -155
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/{use-progressive-reveal-Kr6DwGXG.d.mts → use-progressive-reveal-BFPWbEXy.d.mts} +25 -2
  31. package/dist/{use-progressive-reveal-BVJn9NIr.d.ts → use-progressive-reveal-C0hkdu_i.d.ts} +25 -2
  32. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6474,10 +6474,26 @@ var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
6474
6474
  function isRtlLocale(locale) {
6475
6475
  return RTL_LOCALES.has(locale);
6476
6476
  }
6477
+ var PORTFOLIO_PROMPT = {
6478
+ en: "Which of your products fits a problem like mine?",
6479
+ zh: "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F",
6480
+ hi: "\u092E\u0947\u0930\u0940 \u091C\u0948\u0938\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?",
6481
+ es: "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?",
6482
+ ar: "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0645\u0634\u0643\u0644\u0629 \u0645\u062B\u0644 \u0645\u0634\u0643\u0644\u062A\u064A\u061F",
6483
+ ta: "\u0B8E\u0BA9\u0BCD \u0BAA\u0BBF\u0BB0\u0B9A\u0BCD\u0B9A\u0BBF\u0BA9\u0BC8\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD?"
6484
+ };
6485
+ var PORTFOLIO_PROMPTS = new Set(
6486
+ Object.values(PORTFOLIO_PROMPT)
6487
+ );
6488
+ function isPortfolioPrompt(prompt) {
6489
+ return PORTFOLIO_PROMPTS.has(prompt);
6490
+ }
6477
6491
  var EN = {
6478
6492
  badge: "AI answers, grounded in our documentation",
6479
6493
  welcomeTitle: "What problem are you trying to solve?",
6480
6494
  welcomeBody: "Describe the problem, in your own words. You can also ask about a specific product or compare a few. Every answer comes straight from our documentation.",
6495
+ welcomeBodyProduct: "Describe the problem in your own words, or ask what {product} does. Every answer comes straight from our documentation.",
6496
+ welcomeBodyScoped: "Describe the problem in your own words. Every answer comes straight from our documentation.",
6481
6497
  tryAsking: "Try asking",
6482
6498
  focusProduct: "Focus on a product",
6483
6499
  allProducts: "All products",
@@ -6487,6 +6503,7 @@ var EN = {
6487
6503
  nextYouCouldAsk: "Next you could ask",
6488
6504
  placeholder: "Describe the problem\u2026",
6489
6505
  placeholderProduct: "Describe a problem, or ask about {product}\u2026",
6506
+ placeholderScoped: "Ask about {product}\u2026",
6490
6507
  send: "Send",
6491
6508
  stop: "Stop",
6492
6509
  newChat: "New chat",
@@ -6508,6 +6525,7 @@ var EN = {
6508
6525
  attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
6509
6526
  noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
6510
6527
  answerDidNotArrive: "That answer didn't come through. Try asking again.",
6528
+ toolBudgetScoped: "That question covers more than I can look through in one go. Try asking about one part of it.",
6511
6529
  askHuman: "ask a human",
6512
6530
  // An offer, not a demand: this row sits under every answer on 38 marketing sites, so the
6513
6531
  // wording has to be shruggable. "Was this helpful?" invites; "Please rate this answer"
@@ -6561,6 +6579,15 @@ var EN = {
6561
6579
  closeVideo: "Close video",
6562
6580
  enterFullScreen: "Full screen",
6563
6581
  exitFullScreen: "Exit full screen",
6582
+ panelTitle: "AI assistant",
6583
+ panelTitleProduct: "{product} assistant",
6584
+ panelViews: "Assistant views",
6585
+ tabChat: "Chat",
6586
+ tabAvatar: "Avatar",
6587
+ closePanel: "Close",
6588
+ liveAvatar: "Live avatar",
6589
+ avatarComingSoon: "Live avatar coming soon",
6590
+ continueInChat: "Continue in Chat",
6564
6591
  videoUnavailable: "This video can't be played right now.",
6565
6592
  groundedIn: "What this answer is based on",
6566
6593
  sourceCountOne: "1 source",
@@ -6573,6 +6600,7 @@ var EN = {
6573
6600
  seoTitle: "Describe a problem, get an answer",
6574
6601
  seoDescription: "Describe the problem in your own words and get an answer drawn from our product documentation, with links to the exact pages it came from.",
6575
6602
  seoDescriptionProduct: "Describe the problem in your own words and get an answer drawn from {product}'s documentation \u2014 and every other product we build \u2014 with links to the exact pages it came from.",
6603
+ seoDescriptionScoped: "Answers about {product}, drawn from {product}'s documentation, with links to the exact pages they came from.",
6576
6604
  capabilities: [
6577
6605
  "Grounded in our own docs",
6578
6606
  "Compare across the ecosystem",
@@ -6582,13 +6610,15 @@ var EN = {
6582
6610
  "Every course we run lives in a different spreadsheet.",
6583
6611
  "We only hear a machine is down after the line has stopped.",
6584
6612
  "Members quietly stop showing up and we never know why.",
6585
- "Which of your products fits a problem like mine?"
6613
+ PORTFOLIO_PROMPT.en
6586
6614
  ]
6587
6615
  };
6588
6616
  var ZH = {
6589
6617
  badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
6590
6618
  welcomeTitle: "\u4F60\u60F3\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\uFF1F",
6591
6619
  welcomeBody: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u95EE\u9898\u3002\u4F60\u4E5F\u53EF\u4EE5\u8BE2\u95EE\u67D0\u4E00\u6B3E\u4EA7\u54C1\uFF0C\u6216\u6BD4\u8F83\u51E0\u6B3E\u4EA7\u54C1\u3002\u6240\u6709\u56DE\u7B54\u90FD\u76F4\u63A5\u6765\u81EA\u6211\u4EEC\u7684\u6587\u6863\u3002",
6620
+ welcomeBodyProduct: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8005\u95EE\u95EE {product} \u662F\u505A\u4EC0\u4E48\u7684\u3002\u6240\u6709\u56DE\u7B54\u90FD\u76F4\u63A5\u6765\u81EA\u6211\u4EEC\u7684\u6587\u6863\u3002",
6621
+ welcomeBodyScoped: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u95EE\u9898\u3002\u6240\u6709\u56DE\u7B54\u90FD\u76F4\u63A5\u6765\u81EA\u6211\u4EEC\u7684\u6587\u6863\u3002",
6592
6622
  tryAsking: "\u8BD5\u7740\u95EE",
6593
6623
  focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
6594
6624
  allProducts: "\u5168\u90E8\u4EA7\u54C1",
@@ -6598,6 +6628,7 @@ var ZH = {
6598
6628
  nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
6599
6629
  placeholder: "\u63CF\u8FF0\u4F60\u7684\u95EE\u9898\u2026",
6600
6630
  placeholderProduct: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8BE2\u95EE {product}\u2026",
6631
+ placeholderScoped: "\u5C31 {product} \u63D0\u95EE\u2026",
6601
6632
  send: "\u53D1\u9001",
6602
6633
  stop: "\u505C\u6B62",
6603
6634
  newChat: "\u65B0\u5BF9\u8BDD",
@@ -6619,6 +6650,7 @@ var ZH = {
6619
6650
  attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
6620
6651
  noAnswer: "\u6211\u5728\u6587\u6863\u4E2D\u6CA1\u6709\u627E\u5230\u76F8\u5173\u5185\u5BB9\uFF0C\u4E0B\u9762\u7684\u56DE\u7B54\u6CA1\u6709\u6765\u6E90\u652F\u6301\u3002\u8BF7\u6362\u4E2A\u8BF4\u6CD5\uFF0C\u6216",
6621
6652
  answerDidNotArrive: "\u8FD9\u6761\u56DE\u7B54\u6CA1\u6709\u8FD4\u56DE\u3002\u8BF7\u518D\u95EE\u4E00\u6B21\u3002",
6653
+ toolBudgetScoped: "\u8FD9\u4E2A\u95EE\u9898\u6D89\u53CA\u7684\u5185\u5BB9\u592A\u591A\uFF0C\u6211\u6CA1\u6CD5\u4E00\u6B21\u67E5\u5B8C\u3002\u8BD5\u7740\u53EA\u95EE\u5176\u4E2D\u7684\u4E00\u90E8\u5206\u3002",
6622
6654
  askHuman: "\u8054\u7CFB\u6211\u4EEC",
6623
6655
  feedbackPrompt: "\u8FD9\u4E2A\u56DE\u7B54\u6709\u5E2E\u52A9\u5417\uFF1F",
6624
6656
  feedbackHelpful: "\u6709\u5E2E\u52A9",
@@ -6669,6 +6701,15 @@ var ZH = {
6669
6701
  closeVideo: "\u5173\u95ED\u89C6\u9891",
6670
6702
  enterFullScreen: "\u5168\u5C4F",
6671
6703
  exitFullScreen: "\u9000\u51FA\u5168\u5C4F",
6704
+ panelTitle: "AI \u52A9\u624B",
6705
+ panelTitleProduct: "{product} \u52A9\u624B",
6706
+ panelViews: "\u52A9\u624B\u89C6\u56FE",
6707
+ tabChat: "\u804A\u5929",
6708
+ tabAvatar: "\u865A\u62DF\u5F62\u8C61",
6709
+ closePanel: "\u5173\u95ED",
6710
+ liveAvatar: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61",
6711
+ avatarComingSoon: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61\u5373\u5C06\u63A8\u51FA",
6712
+ continueInChat: "\u5728\u804A\u5929\u4E2D\u7EE7\u7EED",
6672
6713
  videoUnavailable: "\u6682\u65F6\u65E0\u6CD5\u64AD\u653E\u6B64\u89C6\u9891\u3002",
6673
6714
  groundedIn: "\u8FD9\u4E2A\u56DE\u7B54\u7684\u4F9D\u636E",
6674
6715
  sourceCountOne: "1 \u4E2A\u6765\u6E90",
@@ -6681,18 +6722,21 @@ var ZH = {
6681
6722
  seoTitle: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u83B7\u5F97\u7B54\u6848",
6682
6723
  seoDescription: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA\u6211\u4EEC\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
6683
6724
  seoDescriptionProduct: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA {product} \u53CA\u6211\u4EEC\u5176\u4ED6\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
6725
+ seoDescriptionScoped: "\u6709\u5173 {product} \u7684\u56DE\u7B54\uFF0C\u5747\u6765\u81EA {product} \u7684\u6587\u6863\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
6684
6726
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
6685
6727
  prompts: [
6686
6728
  "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
6687
6729
  "\u673A\u5668\u505C\u4E86\uFF0C\u8981\u7B49\u6574\u6761\u7EBF\u505C\u4E0B\u6765\u624D\u77E5\u9053\u3002",
6688
6730
  "\u4F1A\u5458\u6162\u6162\u5C31\u4E0D\u6765\u4E86\uFF0C\u6211\u4EEC\u4E5F\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\u3002",
6689
- "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F"
6731
+ PORTFOLIO_PROMPT.zh
6690
6732
  ]
6691
6733
  };
6692
6734
  var HI = {
6693
6735
  badge: "\u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 AI \u0909\u0924\u094D\u0924\u0930",
6694
6736
  welcomeTitle: "\u0906\u092A \u0915\u094C\u0928 \u0938\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0939\u0932 \u0915\u0930\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902?",
6695
6737
  welcomeBody: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902\u0964 \u0906\u092A \u0915\u093F\u0938\u0940 \u090F\u0915 \u0909\u0924\u094D\u092A\u093E\u0926 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092D\u0940 \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902 \u092F\u093E \u0915\u0941\u091B \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u0939\u0930 \u0909\u0924\u094D\u0924\u0930 \u0938\u0940\u0927\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C \u0938\u0947 \u0906\u0924\u093E \u0939\u0948\u0964",
6738
+ welcomeBodyProduct: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902, \u092F\u093E \u092A\u0942\u091B\u0947\u0902 \u0915\u093F {product} \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948\u0964 \u0939\u0930 \u0909\u0924\u094D\u0924\u0930 \u0938\u0940\u0927\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C \u0938\u0947 \u0906\u0924\u093E \u0939\u0948\u0964",
6739
+ welcomeBodyScoped: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902\u0964 \u0939\u0930 \u0909\u0924\u094D\u0924\u0930 \u0938\u0940\u0927\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C \u0938\u0947 \u0906\u0924\u093E \u0939\u0948\u0964",
6696
6740
  tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
6697
6741
  focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
6698
6742
  allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
@@ -6702,6 +6746,7 @@ var HI = {
6702
6746
  nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
6703
6747
  placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902\u2026",
6704
6748
  placeholderProduct: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u092F\u093E {product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6749
+ placeholderScoped: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6705
6750
  send: "\u092D\u0947\u091C\u0947\u0902",
6706
6751
  stop: "\u0930\u094B\u0915\u0947\u0902",
6707
6752
  newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
@@ -6723,6 +6768,7 @@ var HI = {
6723
6768
  attachmentTooMany: "\u0915\u0947\u0935\u0932 {{max}} \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0940 \u091C\u093E \u0938\u0915\u0924\u0940 \u0939\u0948\u0902, \u0907\u0938\u0932\u093F\u090F {{name}} \u091B\u094B\u0921\u093C \u0926\u0940 \u0917\u0908\u0964",
6724
6769
  noAnswer: "\u092F\u0939 \u092E\u0941\u091D\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092E\u0947\u0902 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E, \u0907\u0938\u0932\u093F\u090F \u0928\u0940\u091A\u0947 \u0926\u093F\u092F\u093E \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938\u0940 \u0938\u094D\u0930\u094B\u0924 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0926\u0942\u0938\u0930\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902, \u092F\u093E",
6725
6770
  answerDidNotArrive: "\u0935\u0939 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0906 \u0938\u0915\u093E\u0964 \u0915\u0943\u092A\u092F\u093E \u0926\u094B\u092C\u093E\u0930\u093E \u092A\u0942\u091B\u0947\u0902\u0964",
6771
+ toolBudgetScoped: "\u0907\u0938 \u0938\u0935\u093E\u0932 \u092E\u0947\u0902 \u0907\u0924\u0928\u093E \u0915\u0941\u091B \u0939\u0948 \u0915\u093F \u090F\u0915 \u092C\u093E\u0930 \u092E\u0947\u0902 \u0938\u092C \u0928\u0939\u0940\u0902 \u0926\u0947\u0916\u093E \u091C\u093E \u0938\u0915\u0924\u093E\u0964 \u0907\u0938\u0915\u0947 \u0915\u093F\u0938\u0940 \u090F\u0915 \u0939\u093F\u0938\u094D\u0938\u0947 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902\u0964",
6726
6772
  askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
6727
6773
  feedbackPrompt: "\u0915\u094D\u092F\u093E \u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u092E\u0926\u0926\u0917\u093E\u0930 \u0925\u093E?",
6728
6774
  feedbackHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930",
@@ -6773,6 +6819,15 @@ var HI = {
6773
6819
  closeVideo: "\u0935\u0940\u0921\u093F\u092F\u094B \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6774
6820
  enterFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928",
6775
6821
  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",
6822
+ panelTitle: "AI \u0938\u0939\u093E\u092F\u0915",
6823
+ panelTitleProduct: "{product} \u0938\u0939\u093E\u092F\u0915",
6824
+ panelViews: "\u0938\u0939\u093E\u092F\u0915 \u0926\u0943\u0936\u094D\u092F",
6825
+ tabChat: "\u091A\u0948\u091F",
6826
+ tabAvatar: "\u0905\u0935\u0924\u093E\u0930",
6827
+ closePanel: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6828
+ liveAvatar: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930",
6829
+ avatarComingSoon: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930 \u091C\u0932\u094D\u0926 \u0906 \u0930\u0939\u093E \u0939\u0948",
6830
+ continueInChat: "\u091A\u0948\u091F \u092E\u0947\u0902 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902",
6776
6831
  videoUnavailable: "\u092F\u0939 \u0935\u0940\u0921\u093F\u092F\u094B \u0905\u092D\u0940 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u0924\u093E\u0964",
6777
6832
  groundedIn: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948",
6778
6833
  sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
@@ -6785,6 +6840,7 @@ var HI = {
6785
6840
  seoTitle: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902",
6786
6841
  seoDescription: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 \u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
6787
6842
  seoDescriptionProduct: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 {product} \u0924\u0925\u093E \u0939\u092E\u093E\u0930\u0947 \u092C\u093E\u0915\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
6843
+ seoDescriptionScoped: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u091C\u094B {product} \u0915\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u090F \u0917\u090F \u0939\u0948\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0947 \u0906\u090F \u0939\u0948\u0902\u0964",
6788
6844
  capabilities: [
6789
6845
  "\u0939\u092E\u093E\u0930\u0947 \u0905\u092A\u0928\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924",
6790
6846
  "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
@@ -6794,13 +6850,15 @@ var HI = {
6794
6850
  "\u0939\u0930 \u0915\u094B\u0930\u094D\u0938 \u0915\u093E \u0939\u093F\u0938\u093E\u092C \u0905\u0932\u0917 \u0936\u0940\u091F \u092E\u0947\u0902 \u0930\u0916\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
6795
6851
  "\u092E\u0936\u0940\u0928 \u092C\u0902\u0926 \u0939\u094B\u0928\u0947 \u0915\u093E \u092A\u0924\u093E \u0924\u092D\u0940 \u091A\u0932\u0924\u093E \u0939\u0948 \u091C\u092C \u0932\u093E\u0907\u0928 \u0930\u0941\u0915 \u091C\u093E\u090F\u0964",
6796
6852
  "\u0938\u0926\u0938\u094D\u092F \u0927\u0940\u0930\u0947-\u0927\u0940\u0930\u0947 \u0906\u0928\u093E \u092C\u0902\u0926 \u0915\u0930 \u0926\u0947\u0924\u0947 \u0939\u0948\u0902, \u0935\u091C\u0939 \u092A\u0924\u093E \u0928\u0939\u0940\u0902 \u091A\u0932\u0924\u0940\u0964",
6797
- "\u092E\u0947\u0930\u0940 \u091C\u0948\u0938\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?"
6853
+ PORTFOLIO_PROMPT.hi
6798
6854
  ]
6799
6855
  };
6800
6856
  var ES = {
6801
6857
  badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
6802
6858
  welcomeTitle: "\xBFQu\xE9 problema quieres resolver?",
6803
6859
  welcomeBody: "Describe el problema con tus propias palabras. Tambi\xE9n puedes preguntar por un producto concreto o comparar varios. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6860
+ welcomeBodyProduct: "Describe el problema con tus propias palabras o pregunta qu\xE9 hace {product}. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6861
+ welcomeBodyScoped: "Describe el problema con tus propias palabras. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6804
6862
  tryAsking: "Prueba a preguntar",
6805
6863
  focusProduct: "Centrarse en un producto",
6806
6864
  allProducts: "Todos los productos",
@@ -6810,6 +6868,7 @@ var ES = {
6810
6868
  nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
6811
6869
  placeholder: "Describe el problema\u2026",
6812
6870
  placeholderProduct: "Describe un problema o pregunta por {product}\u2026",
6871
+ placeholderScoped: "Pregunta sobre {product}\u2026",
6813
6872
  send: "Enviar",
6814
6873
  stop: "Detener",
6815
6874
  newChat: "Nueva conversaci\xF3n",
@@ -6831,6 +6890,7 @@ var ES = {
6831
6890
  attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
6832
6891
  noAnswer: "No he encontrado esto en nuestra documentaci\xF3n, as\xED que la respuesta de abajo no se apoya en ninguna fuente. Prueba a reformularla, o",
6833
6892
  answerDidNotArrive: "Esa respuesta no lleg\xF3. Int\xE9ntalo de nuevo.",
6893
+ toolBudgetScoped: "Esa pregunta abarca m\xE1s de lo que puedo revisar de una vez. Prueba a preguntar por una parte de ella.",
6834
6894
  askHuman: "habla con una persona",
6835
6895
  feedbackPrompt: "\xBFTe ha servido?",
6836
6896
  feedbackHelpful: "Me sirve",
@@ -6881,6 +6941,15 @@ var ES = {
6881
6941
  closeVideo: "Cerrar v\xEDdeo",
6882
6942
  enterFullScreen: "Pantalla completa",
6883
6943
  exitFullScreen: "Salir de pantalla completa",
6944
+ panelTitle: "Asistente de IA",
6945
+ panelTitleProduct: "Asistente de {product}",
6946
+ panelViews: "Vistas del asistente",
6947
+ tabChat: "Chat",
6948
+ tabAvatar: "Avatar",
6949
+ closePanel: "Cerrar",
6950
+ liveAvatar: "Avatar en vivo",
6951
+ avatarComingSoon: "Avatar en vivo: pr\xF3ximamente",
6952
+ continueInChat: "Continuar en el chat",
6884
6953
  videoUnavailable: "Ahora mismo no se puede reproducir este v\xEDdeo.",
6885
6954
  groundedIn: "En qu\xE9 se basa esta respuesta",
6886
6955
  sourceCountOne: "1 fuente",
@@ -6893,6 +6962,7 @@ var ES = {
6893
6962
  seoTitle: "Describe un problema y obt\xE9n una respuesta",
6894
6963
  seoDescription: "Describe el problema con tus palabras y recibe una respuesta extra\xEDda de la documentaci\xF3n de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
6895
6964
  seoDescriptionProduct: "Describe el problema con tus palabras y recibe una respuesta extra\xEDda de la documentaci\xF3n de {product} y del resto de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
6965
+ seoDescriptionScoped: "Respuestas sobre {product}, extra\xEDdas de la documentaci\xF3n de {product}, con enlaces a las p\xE1ginas exactas de las que proceden.",
6896
6966
  capabilities: [
6897
6967
  "Basado en nuestra documentaci\xF3n",
6898
6968
  "Compara todo el ecosistema",
@@ -6902,13 +6972,15 @@ var ES = {
6902
6972
  "Cada curso que damos est\xE1 en una hoja de c\xE1lculo distinta.",
6903
6973
  "Nos enteramos de que una m\xE1quina falla cuando para la l\xEDnea.",
6904
6974
  "Los socios dejan de venir poco a poco y nunca sabemos por qu\xE9.",
6905
- "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?"
6975
+ PORTFOLIO_PROMPT.es
6906
6976
  ]
6907
6977
  };
6908
6978
  var AR = {
6909
6979
  badge: "\u0625\u062C\u0627\u0628\u0627\u062A \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0645\u0628\u0646\u064A\u0629 \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
6910
6980
  welcomeTitle: "\u0645\u0627 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u062D\u0627\u0648\u0644 \u062D\u0644\u0647\u0627\u061F",
6911
6981
  welcomeBody: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0623\u0646\u062A. \u064A\u0645\u0643\u0646\u0643 \u0623\u064A\u0636\u064B\u0627 \u0627\u0644\u0633\u0624\u0627\u0644 \u0639\u0646 \u0645\u0646\u062A\u062C \u0628\u0639\u064A\u0646\u0647 \u0623\u0648 \u0627\u0644\u0645\u0642\u0627\u0631\u0646\u0629 \u0628\u064A\u0646 \u0639\u062F\u0629 \u0645\u0646\u062A\u062C\u0627\u062A. \u062A\u0623\u062A\u064A \u0643\u0644 \u0625\u062C\u0627\u0628\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642\u0646\u0627.",
6982
+ welcomeBodyProduct: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0623\u0646\u062A\u060C \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0645\u0651\u0627 \u064A\u0641\u0639\u0644\u0647 {product}. \u062A\u0623\u062A\u064A \u0643\u0644 \u0625\u062C\u0627\u0628\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642\u0646\u0627.",
6983
+ welcomeBodyScoped: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0623\u0646\u062A. \u062A\u0623\u062A\u064A \u0643\u0644 \u0625\u062C\u0627\u0628\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642\u0646\u0627.",
6912
6984
  tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
6913
6985
  focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
6914
6986
  allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
@@ -6918,6 +6990,7 @@ var AR = {
6918
6990
  nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
6919
6991
  placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u2026",
6920
6992
  placeholderProduct: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6993
+ placeholderScoped: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6921
6994
  send: "\u0625\u0631\u0633\u0627\u0644",
6922
6995
  stop: "\u0625\u064A\u0642\u0627\u0641",
6923
6996
  newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
@@ -6939,6 +7012,7 @@ var AR = {
6939
7012
  attachmentTooMany: "\u064A\u0645\u0643\u0646 \u0625\u0631\u0641\u0627\u0642 {{max}} \u0645\u0644\u0641\u0627\u062A \u0641\u0642\u0637\u060C \u0644\u0630\u0627 \u062A\u0645 \u062A\u062E\u0637\u064A {{name}}.",
6940
7013
  noAnswer: "\u0644\u0645 \u0623\u062C\u062F \u0647\u0630\u0627 \u0641\u064A \u0648\u062B\u0627\u0626\u0642\u0646\u0627\u060C \u0644\u0630\u0627 \u0641\u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0623\u062F\u0646\u0627\u0647 \u063A\u064A\u0631 \u0645\u0633\u062A\u0646\u062F\u0629 \u0625\u0644\u0649 \u0645\u0635\u062F\u0631. \u062D\u0627\u0648\u0644 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0635\u064A\u0627\u063A\u0629\u060C \u0623\u0648",
6941
7014
  answerDidNotArrive: "\u0644\u0645 \u062A\u0635\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
7015
+ toolBudgetScoped: "\u0647\u0630\u0627 \u0627\u0644\u0633\u0624\u0627\u0644 \u064A\u0634\u0645\u0644 \u0623\u0643\u062B\u0631 \u0645\u0645\u0627 \u0623\u0633\u062A\u0637\u064A\u0639 \u0627\u0644\u0628\u062D\u062B \u0641\u064A\u0647 \u062F\u0641\u0639\u0629 \u0648\u0627\u062D\u062F\u0629. \u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0639\u0646 \u062C\u0632\u0621 \u0648\u0627\u062D\u062F \u0645\u0646\u0647.",
6942
7016
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
6943
7017
  feedbackPrompt: "\u0647\u0644 \u0643\u0627\u0646\u062A \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0645\u0641\u064A\u062F\u0629\u061F",
6944
7018
  feedbackHelpful: "\u0645\u0641\u064A\u062F\u0629",
@@ -6989,6 +7063,15 @@ var AR = {
6989
7063
  closeVideo: "\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
6990
7064
  enterFullScreen: "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
6991
7065
  exitFullScreen: "\u0627\u0644\u062E\u0631\u0648\u062C \u0645\u0646 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
7066
+ panelTitle: "\u0645\u0633\u0627\u0639\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
7067
+ panelTitleProduct: "\u0645\u0633\u0627\u0639\u062F {product}",
7068
+ panelViews: "\u0637\u0631\u0642 \u0639\u0631\u0636 \u0627\u0644\u0645\u0633\u0627\u0639\u062F",
7069
+ tabChat: "\u062F\u0631\u062F\u0634\u0629",
7070
+ tabAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631",
7071
+ closePanel: "\u0625\u063A\u0644\u0627\u0642",
7072
+ liveAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631",
7073
+ avatarComingSoon: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0642\u0631\u064A\u0628\u064B\u0627",
7074
+ continueInChat: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0641\u064A \u0627\u0644\u062F\u0631\u062F\u0634\u0629",
6992
7075
  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.",
6993
7076
  groundedIn: "\u0639\u0644\u0649 \u0645\u0627\u0630\u0627 \u062A\u0633\u062A\u0646\u062F \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
6994
7077
  sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
@@ -7001,6 +7084,7 @@ var AR = {
7001
7084
  seoTitle: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629",
7002
7085
  seoDescription: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
7003
7086
  seoDescriptionProduct: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 {product} \u0648\u0628\u0642\u064A\u0629 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
7087
+ seoDescriptionScoped: "\u0625\u062C\u0627\u0628\u0627\u062A \u0639\u0646 {product} \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 {product}\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
7004
7088
  capabilities: [
7005
7089
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
7006
7090
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -7010,13 +7094,15 @@ var AR = {
7010
7094
  "\u0643\u0644 \u062F\u0648\u0631\u0629 \u062A\u062F\u0631\u064A\u0628\u064A\u0629 \u0644\u062F\u064A\u0646\u0627 \u0641\u064A \u062C\u062F\u0648\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062E\u062A\u0644\u0641.",
7011
7095
  "\u0644\u0627 \u0646\u0639\u0644\u0645 \u0628\u062A\u0639\u0637\u0644 \u0627\u0644\u0645\u0627\u0643\u064A\u0646\u0629 \u0625\u0644\u0627 \u0628\u0639\u062F \u062A\u0648\u0642\u0641 \u062E\u0637 \u0627\u0644\u0625\u0646\u062A\u0627\u062C.",
7012
7096
  "\u0623\u0639\u0636\u0627\u0624\u0646\u0627 \u064A\u062A\u0648\u0642\u0641\u0648\u0646 \u0639\u0646 \u0627\u0644\u062D\u0636\u0648\u0631 \u062A\u062F\u0631\u064A\u062C\u064A\u064B\u0627 \u062F\u0648\u0646 \u0623\u0646 \u0646\u0639\u0631\u0641 \u0627\u0644\u0633\u0628\u0628.",
7013
- "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0645\u0634\u0643\u0644\u0629 \u0645\u062B\u0644 \u0645\u0634\u0643\u0644\u062A\u064A\u061F"
7097
+ PORTFOLIO_PROMPT.ar
7014
7098
  ]
7015
7099
  };
7016
7100
  var TA = {
7017
7101
  badge: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F AI \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",
7018
7102
  welcomeTitle: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA8\u0BCD\u0BA4\u0B9A\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8\u0BA4\u0BCD \u0BA4\u0BC0\u0BB0\u0BCD\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0BAF\u0BB2\u0BCD\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD?",
7019
7103
  welcomeBody: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD. \u0B92\u0BB0\u0BC1 \u0B95\u0BC1\u0BB1\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BCD\u0B9F \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD, \u0B9A\u0BBF\u0BB2\u0BB5\u0BB1\u0BCD\u0BB1\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BB5\u0BC1\u0BAE\u0BCD \u0B9A\u0BC6\u0BAF\u0BCD\u0BAF\u0BB2\u0BBE\u0BAE\u0BCD. \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC7\u0BB0\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
7104
+ welcomeBodyProduct: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 {product} \u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BC6\u0BAF\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1 \u0B8E\u0BA9\u0BCD\u0BB1\u0BC1 \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD. \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC7\u0BB0\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
7105
+ welcomeBodyScoped: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD. \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC7\u0BB0\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
7020
7106
  tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
7021
7107
  focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
7022
7108
  allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
@@ -7026,6 +7112,7 @@ var TA = {
7026
7112
  nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
7027
7113
  placeholder: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
7028
7114
  placeholderProduct: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 {product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
7115
+ placeholderScoped: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
7029
7116
  send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
7030
7117
  stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
7031
7118
  newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
@@ -7047,6 +7134,7 @@ var TA = {
7047
7134
  attachmentTooMany: "{{max}} \u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BC7 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BC1\u0BAE\u0BCD, \u0B8E\u0BA9\u0BB5\u0BC7 {{name}} \u0BA4\u0BB5\u0BBF\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1.",
7048
7135
  noAnswer: "\u0B87\u0BA4\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8, \u0B8E\u0BA9\u0BB5\u0BC7 \u0B95\u0BC0\u0BB4\u0BC7 \u0B89\u0BB3\u0BCD\u0BB3 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8. \u0BB5\u0BC7\u0BB1\u0BC1 \u0BB5\u0B95\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1",
7049
7136
  answerDidNotArrive: "\u0B85\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BB5\u0BB0\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
7137
+ toolBudgetScoped: "\u0B87\u0BA8\u0BCD\u0BA4\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0BAF\u0BBF\u0BB2\u0BCD \u0B92\u0BB0\u0BC7 \u0BAE\u0BC1\u0BB1\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9\u0BBE\u0BB2\u0BCD \u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BA4\u0BC8 \u0BB5\u0BBF\u0B9F \u0B85\u0BA4\u0BBF\u0B95\u0BAE\u0BCD \u0B89\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1. \u0B85\u0BA4\u0BA9\u0BCD \u0B92\u0BB0\u0BC1 \u0BAA\u0B95\u0BC1\u0BA4\u0BBF\u0BAF\u0BC8\u0BAA\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
7050
7138
  askHuman: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BCD\u0BAA\u0BC1 \u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
7051
7139
  feedbackPrompt: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BA4\u0BBE?",
7052
7140
  feedbackHelpful: "\u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1",
@@ -7097,6 +7185,15 @@ var TA = {
7097
7185
  closeVideo: "\u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0BAE\u0BC2\u0B9F\u0BC1",
7098
7186
  enterFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8",
7099
7187
  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",
7188
+ panelTitle: "AI \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD",
7189
+ panelTitleProduct: "{product} \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD",
7190
+ panelViews: "\u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9A\u0BBF\u0B95\u0BB3\u0BCD",
7191
+ tabChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8",
7192
+ tabAvatar: "\u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
7193
+ closePanel: "\u0BAE\u0BC2\u0B9F\u0BC1",
7194
+ liveAvatar: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
7195
+ avatarComingSoon: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD \u0BB5\u0BBF\u0BB0\u0BC8\u0BB5\u0BBF\u0BB2\u0BCD",
7196
+ continueInChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BB5\u0BC1\u0BAE\u0BCD",
7100
7197
  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.",
7101
7198
  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",
7102
7199
  sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
@@ -7109,6 +7206,7 @@ var TA = {
7109
7206
  seoTitle: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
7110
7207
  seoDescription: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD; \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD, \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
7111
7208
  seoDescriptionProduct: "{product} \u0BAE\u0BB1\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BBF\u0BB1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1, \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u2014 \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
7209
+ seoDescriptionScoped: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0BAF \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD, {product} \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1, \u0B85\u0BB5\u0BC8 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
7112
7210
  capabilities: [
7113
7211
  "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD",
7114
7212
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -7118,7 +7216,7 @@ var TA = {
7118
7216
  "\u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BAF\u0BBF\u0BB1\u0BCD\u0B9A\u0BBF \u0BB5\u0B95\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BAE\u0BCD \u0BB5\u0BC6\u0BB5\u0BCD\u0BB5\u0BC7\u0BB1\u0BC1 \u0BB5\u0BBF\u0BB0\u0BBF\u0BA4\u0BBE\u0BB3\u0BBF\u0BB2\u0BCD \u0B89\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1.",
7119
7217
  "\u0B87\u0BAF\u0BA8\u0BCD\u0BA4\u0BBF\u0BB0\u0BAE\u0BCD \u0BA8\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1 \u0BB2\u0BC8\u0BA9\u0BCD \u0BA8\u0BBF\u0BB1\u0BCD\u0B95\u0BC1\u0BAE\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1\u0BA4\u0BBE\u0BA9\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
7120
7218
  "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BBF\u0BA9\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0BAE\u0BC6\u0BB2\u0BCD\u0BB2 \u0BB5\u0BB0\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BBF\u0BB1\u0BBE\u0BB0\u0BCD\u0B95\u0BB3\u0BCD, \u0B95\u0BBE\u0BB0\u0BA3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4\u0BC1.",
7121
- "\u0B8E\u0BA9\u0BCD \u0BAA\u0BBF\u0BB0\u0B9A\u0BCD\u0B9A\u0BBF\u0BA9\u0BC8\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD?"
7219
+ PORTFOLIO_PROMPT.ta
7122
7220
  ]
7123
7221
  };
7124
7222
  var STRINGS = {
@@ -10253,7 +10351,9 @@ function useExploreChat(options = {}) {
10253
10351
  pollTimeoutMs = DEFAULT_POLL_TIMEOUT_MS,
10254
10352
  storageKey = DEFAULT_STORAGE_KEY,
10255
10353
  persist = true,
10256
- onSend
10354
+ onSend,
10355
+ enabled = true,
10356
+ shareToken: shareTokenOption
10257
10357
  } = options;
10258
10358
  const client = useWebSDK();
10259
10359
  const { productId } = useWebSDKConfig();
@@ -10291,7 +10391,7 @@ function useExploreChat(options = {}) {
10291
10391
  const [hasConversation, setHasConversation] = React.useState(false);
10292
10392
  const shareTokenRef = React.useRef(void 0);
10293
10393
  if (shareTokenRef.current === void 0) {
10294
- shareTokenRef.current = readShareToken();
10394
+ shareTokenRef.current = shareTokenOption === void 0 ? readShareToken() : shareTokenOption;
10295
10395
  }
10296
10396
  const isSharedView = shareTokenRef.current !== null;
10297
10397
  const catalogRef = React.useRef(catalog);
@@ -10329,6 +10429,7 @@ function useExploreChat(options = {}) {
10329
10429
  };
10330
10430
  }, []);
10331
10431
  React.useEffect(() => {
10432
+ if (!enabled) return;
10332
10433
  const shareToken = shareTokenRef.current;
10333
10434
  if (!shareToken) return;
10334
10435
  let cancelled = false;
@@ -10363,8 +10464,9 @@ function useExploreChat(options = {}) {
10363
10464
  return () => {
10364
10465
  cancelled = true;
10365
10466
  };
10366
- }, [client]);
10467
+ }, [client, enabled]);
10367
10468
  React.useEffect(() => {
10469
+ if (!enabled) return;
10368
10470
  if (shareTokenRef.current !== null) return;
10369
10471
  if (!persist) {
10370
10472
  setHydrated(true);
@@ -10389,9 +10491,10 @@ function useExploreChat(options = {}) {
10389
10491
  setTurnCount(turns);
10390
10492
  }
10391
10493
  setHydrated(true);
10392
- }, [persist, rememberConversationToken, storageKey]);
10494
+ }, [persist, rememberConversationToken, storageKey, enabled]);
10393
10495
  React.useEffect(() => {
10394
- if (!persist || !hydrated || typeof window === "undefined") return;
10496
+ if (!persist || !hydrated || isSharedView || typeof window === "undefined")
10497
+ return;
10395
10498
  try {
10396
10499
  const payload = {
10397
10500
  conversationToken: conversationTokenRef.current,
@@ -10405,10 +10508,10 @@ function useExploreChat(options = {}) {
10405
10508
  window.localStorage.setItem(storageKey, JSON.stringify(payload));
10406
10509
  } catch {
10407
10510
  }
10408
- }, [persist, hydrated, storageKey, messages, focusProduct]);
10511
+ }, [persist, hydrated, isSharedView, storageKey, messages, focusProduct]);
10409
10512
  React.useEffect(() => {
10410
10513
  messagesRef.current = messages;
10411
- if (!persist || !hydrated) return;
10514
+ if (!persist || !hydrated || isSharedView) return;
10412
10515
  const settled = messages.some(
10413
10516
  (m) => m.role === "ASSISTANT" && (m.status === "COMPLETED" || m.status === "FAILED")
10414
10517
  );
@@ -10420,8 +10523,9 @@ function useExploreChat(options = {}) {
10420
10523
  focusProduct: focusProductRef.current
10421
10524
  })
10422
10525
  );
10423
- }, [messages, persist, hydrated, storageKey]);
10526
+ }, [messages, persist, hydrated, isSharedView, storageKey]);
10424
10527
  React.useEffect(() => {
10528
+ if (!enabled) return;
10425
10529
  let cancelled = false;
10426
10530
  const load = async () => {
10427
10531
  const variables = { productSlug: productSlug ?? null };
@@ -10462,7 +10566,7 @@ function useExploreChat(options = {}) {
10462
10566
  return () => {
10463
10567
  cancelled = true;
10464
10568
  };
10465
- }, [client, productSlug, fallbackCatalog, bakedRaw]);
10569
+ }, [client, productSlug, fallbackCatalog, bakedRaw, enabled]);
10466
10570
  const startPolling = React.useCallback(
10467
10571
  (conversationToken, messageId) => {
10468
10572
  pollGenerationRef.current += 1;
@@ -10959,6 +11063,166 @@ function makeOptimisticId() {
10959
11063
  optimisticCounter += 1;
10960
11064
  return `boff-explore-local-${Date.now()}-${optimisticCounter}`;
10961
11065
  }
11066
+ var ExploreConversationContext = React.createContext(null);
11067
+ var ExploreCatalogProductsContext = React.createContext(null);
11068
+ function useExploreConversation(options = {}) {
11069
+ const {
11070
+ productSlug,
11071
+ locale,
11072
+ examplePrompts,
11073
+ onSend,
11074
+ pageUrl,
11075
+ enabled,
11076
+ shareToken
11077
+ } = options;
11078
+ const urlAtMount = React.useMemo(
11079
+ () => typeof window === "undefined" ? void 0 : window.location.href,
11080
+ []
11081
+ );
11082
+ const T = React.useMemo(
11083
+ () => exploreStrings(resolveExploreLocale(locale)),
11084
+ [locale]
11085
+ );
11086
+ const chat = useExploreChat({
11087
+ productSlug,
11088
+ pageUrl: pageUrl ?? urlAtMount,
11089
+ onSend,
11090
+ // Locale-aware, so a catalog outage degrades to a translated welcome rather than an English one.
11091
+ examplePrompts: examplePrompts ?? T.prompts,
11092
+ fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody },
11093
+ ...enabled === void 0 ? {} : { enabled },
11094
+ ...shareToken === void 0 ? {} : { shareToken }
11095
+ });
11096
+ const [draft, setDraft] = React.useState("");
11097
+ const [staged, setStaged] = React.useState([]);
11098
+ return React.useMemo(
11099
+ () => ({ ...chat, draft, setDraft, staged, setStaged }),
11100
+ [chat, draft, staged]
11101
+ );
11102
+ }
11103
+ function ExploreChatProvider({
11104
+ enabled,
11105
+ children,
11106
+ ...options
11107
+ }) {
11108
+ const [started, setStarted] = React.useState(enabled);
11109
+ if (enabled && !started) setStarted(true);
11110
+ const conversation = useExploreConversation({
11111
+ ...options,
11112
+ // `enabled` as well as `started`: on the render that first sees `enabled`, the latch above has only been queued.
11113
+ enabled: enabled || started
11114
+ });
11115
+ return /* @__PURE__ */ jsxRuntime.jsx(ExploreConversationContext.Provider, { value: conversation, children: /* @__PURE__ */ jsxRuntime.jsx(
11116
+ ExploreCatalogProductsContext.Provider,
11117
+ {
11118
+ value: conversation.catalog.products,
11119
+ children
11120
+ }
11121
+ ) });
11122
+ }
11123
+
11124
+ // src/components/explore-scope.ts
11125
+ function pinnedProductSlug(scope, productSlug) {
11126
+ if (scope !== "product" || productSlug === void 0) return null;
11127
+ return productSlug.trim() === "" ? null : productSlug;
11128
+ }
11129
+ function productNameFor(products, slug, given) {
11130
+ const own = given?.trim();
11131
+ if (own) return own;
11132
+ return products.find((product) => isSameProductSlug(product.slug, slug))?.name ?? null;
11133
+ }
11134
+ var NAME_CHARACTER = /[a-z0-9]/;
11135
+ var MIN_SPELLING_LENGTH = 3;
11136
+ function siteNameOf(website) {
11137
+ if (!website) return "";
11138
+ try {
11139
+ const labels = new URL(website).hostname.split(".");
11140
+ return labels.length >= 2 ? labels[labels.length - 2] ?? "" : "";
11141
+ } catch {
11142
+ return "";
11143
+ }
11144
+ }
11145
+ function spellingsOf(product) {
11146
+ const spellings = [
11147
+ product.name,
11148
+ product.name.replace(/\s+/g, ""),
11149
+ ...productSlugVariants(product.slug),
11150
+ siteNameOf(product.website)
11151
+ ].map((spelling) => spelling.trim().toLowerCase()).filter((spelling) => spelling.length >= MIN_SPELLING_LENGTH);
11152
+ return [...new Set(spellings)];
11153
+ }
11154
+ function wordAt(text, spelling, from = 0) {
11155
+ for (let at = text.indexOf(spelling, from); at !== -1; at = text.indexOf(spelling, at + 1)) {
11156
+ const before = text[at - 1];
11157
+ const after = text[at + spelling.length];
11158
+ const bounded = (before === void 0 || !NAME_CHARACTER.test(before)) && (after === void 0 || !NAME_CHARACTER.test(after));
11159
+ if (bounded) return at;
11160
+ }
11161
+ return -1;
11162
+ }
11163
+ function withoutWord(text, spelling) {
11164
+ let result = text;
11165
+ for (let at = wordAt(result, spelling); at !== -1; at = wordAt(result, spelling, at + spelling.length)) {
11166
+ result = `${result.slice(0, at)}${" ".repeat(spelling.length)}${result.slice(at + spelling.length)}`;
11167
+ }
11168
+ return result;
11169
+ }
11170
+ function anotherProductMatcher(products, pinnedSlug) {
11171
+ const own = productSlugVariants(pinnedSlug).map((slug) => slug.toLowerCase());
11172
+ const others = [];
11173
+ for (const product of products) {
11174
+ if (isSameProductSlug(product.slug, pinnedSlug)) {
11175
+ own.push(...spellingsOf(product));
11176
+ } else {
11177
+ others.push(...spellingsOf(product));
11178
+ }
11179
+ }
11180
+ const ownSpellings = [...new Set(own)].sort((a, b) => b.length - a.length);
11181
+ const otherSpellings = [...new Set(others)].filter(
11182
+ (spelling) => !ownSpellings.includes(spelling)
11183
+ );
11184
+ return (text) => {
11185
+ let rest = text.toLowerCase();
11186
+ for (const spelling of ownSpellings) rest = withoutWord(rest, spelling);
11187
+ return otherSpellings.some((spelling) => wordAt(rest, spelling) !== -1);
11188
+ };
11189
+ }
11190
+ function distinctPrompts(prompts) {
11191
+ return [...new Set(prompts.filter((prompt) => prompt.trim() !== ""))];
11192
+ }
11193
+ function productScopedPrompts(hostPrompts, catalogPrompts, namesAnotherProduct) {
11194
+ const own = distinctPrompts(hostPrompts ?? []);
11195
+ if (own.length > 0) return own;
11196
+ return distinctPrompts(
11197
+ catalogPrompts.filter(
11198
+ (prompt) => !isPortfolioPrompt(prompt) && !namesAnotherProduct(prompt)
11199
+ )
11200
+ );
11201
+ }
11202
+ function productScopedHighlights(highlights, pinnedSlug, namesAnotherProduct) {
11203
+ return highlights.filter(
11204
+ (highlight) => isSameProductSlug(highlight.product, pinnedSlug) && !namesAnotherProduct(`${highlight.title}
11205
+ ${highlight.alt}`)
11206
+ );
11207
+ }
11208
+ function productScopedError(error, toolBudgetMessage) {
11209
+ return error.code === "TOOL_BUDGET" ? { ...error, message: toolBudgetMessage } : error;
11210
+ }
11211
+ function isDevelopmentBuild() {
11212
+ try {
11213
+ return process.env.NODE_ENV !== "production";
11214
+ } catch {
11215
+ return false;
11216
+ }
11217
+ }
11218
+ var warnedWithoutSlug = false;
11219
+ function warnProductScopeWithoutSlug() {
11220
+ if (warnedWithoutSlug || !isDevelopmentBuild()) return;
11221
+ warnedWithoutSlug = true;
11222
+ console.warn(
11223
+ `[WebSDK] Explore scope="product" needs a productSlug. Without one the assistant stays the portfolio's: every product, and a product picker.`
11224
+ );
11225
+ }
10962
11226
  var DRAIN_TARGET_MS = 1200;
10963
11227
  var MIN_CHARS_PER_SECOND = 90;
10964
11228
  var MAX_CHARS_PER_SECOND = 2200;
@@ -12040,21 +12304,25 @@ var CAPABILITIES = [
12040
12304
  {
12041
12305
  icon: lucideReact.BookOpenText,
12042
12306
  title: "Grounded in our own docs",
12043
- body: "Every answer comes from published product pages and documentation \u2014 never invented."
12307
+ body: "Every answer comes from published product pages and documentation \u2014 never invented.",
12308
+ invitesOtherProducts: false
12044
12309
  },
12045
12310
  {
12046
12311
  icon: lucideReact.Layers,
12047
12312
  title: "Compare across the ecosystem",
12048
- body: "Ask which product fits your team, or how two of them work together."
12313
+ body: "Ask which product fits your team, or how two of them work together.",
12314
+ invitesOtherProducts: true
12049
12315
  },
12050
12316
  {
12051
12317
  icon: lucideReact.Link2,
12052
12318
  title: "Straight to the right page",
12053
- body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
12319
+ body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting.",
12320
+ invitesOtherProducts: false
12054
12321
  }
12055
12322
  ];
12056
12323
  var MIN_VISIBLE_FRACTION = 0.25;
12057
12324
  var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
12325
+ var NO_PRODUCTS = [];
12058
12326
  var CTA_VARIANTS = {
12059
12327
  CONTACT: "default",
12060
12328
  WAITLIST: "default",
@@ -13603,29 +13871,40 @@ function WelcomeState({
13603
13871
  focusProduct,
13604
13872
  onPrompt,
13605
13873
  onFocus,
13606
- disabled
13874
+ disabled,
13875
+ heading = "h1",
13876
+ productScoped = false
13607
13877
  }) {
13878
+ const Heading = heading;
13608
13879
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-4 sm:py-5", children: [
13609
13880
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise text-center", children: [
13610
13881
  /* @__PURE__ */ jsxRuntime.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: [
13611
13882
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }),
13612
13883
  T.badge
13613
13884
  ] }),
13614
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
13885
+ /* @__PURE__ */ jsxRuntime.jsx(Heading, { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
13615
13886
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-2 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground", children: body })
13616
13887
  ] }),
13617
- /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsxs(
13618
- "li",
13888
+ /* @__PURE__ */ jsxRuntime.jsx(
13889
+ "ul",
13619
13890
  {
13620
- className: "rounded-xl border border-border/70 bg-card/60 p-2.5 text-center transition-colors hover:border-border sm:p-2.5 sm:text-left",
13621
- children: [
13622
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-auto mb-1.5 flex h-7 w-7 items-center justify-center rounded-lg bg-primary/10 text-primary sm:mx-0 sm:mb-2 sm:h-8 sm:w-8", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
13623
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-snug", children: T.capabilities[i] ?? "" }),
13624
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 hidden text-xs leading-snug text-muted-foreground lg:block", children: capBody })
13625
- ]
13626
- },
13627
- i
13628
- )) }),
13891
+ className: `boff-explore-capabilities boff-explore-rise boff-explore-rise-1 mt-4 grid ${productScoped ? "grid-cols-2" : "grid-cols-3"} gap-2 sm:gap-2.5`,
13892
+ children: CAPABILITIES.map(
13893
+ ({ icon: Icon, body: capBody, invitesOtherProducts }, i) => productScoped && invitesOtherProducts ? null : /* @__PURE__ */ jsxRuntime.jsxs(
13894
+ "li",
13895
+ {
13896
+ className: "rounded-xl border border-border/70 bg-card/60 p-2.5 text-center transition-colors hover:border-border sm:p-2.5 sm:text-left",
13897
+ children: [
13898
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-auto mb-1.5 flex h-7 w-7 items-center justify-center rounded-lg bg-primary/10 text-primary sm:mx-0 sm:mb-2 sm:h-8 sm:w-8", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
13899
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-snug", children: T.capabilities[i] ?? "" }),
13900
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 hidden text-xs leading-snug text-muted-foreground lg:block", children: capBody })
13901
+ ]
13902
+ },
13903
+ i
13904
+ )
13905
+ )
13906
+ }
13907
+ ),
13629
13908
  prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "boff-explore-rise boff-explore-rise-2 mt-4", children: /* @__PURE__ */ jsxRuntime.jsx(
13630
13909
  PromptCarousel,
13631
13910
  {
@@ -13666,19 +13945,39 @@ function exploreQuestionHref(question, base = "/explore") {
13666
13945
  const joiner = base.includes("?") ? "&" : "?";
13667
13946
  return `${base}${joiner}q=${encodeURIComponent(trimmed)}`;
13668
13947
  }
13669
- function ExplorePage({
13948
+ function ExplorePage(props) {
13949
+ const shared = React.useContext(ExploreConversationContext);
13950
+ return shared ? /* @__PURE__ */ jsxRuntime.jsx(ExploreView, { ...props, conversation: shared }) : /* @__PURE__ */ jsxRuntime.jsx(StandaloneExplorePage, { ...props });
13951
+ }
13952
+ function StandaloneExplorePage(props) {
13953
+ const conversation = useExploreConversation({
13954
+ productSlug: props.productSlug,
13955
+ locale: props.locale,
13956
+ examplePrompts: props.examplePrompts,
13957
+ onSend: props.onSend
13958
+ });
13959
+ return /* @__PURE__ */ jsxRuntime.jsx(ExploreView, { ...props, conversation });
13960
+ }
13961
+ function ExploreView({
13670
13962
  seo,
13671
13963
  productSlug,
13672
- examplePrompts,
13673
13964
  className,
13674
13965
  heightMode = "viewport",
13675
13966
  viewportOffset,
13676
13967
  onNavigate,
13677
- onSend,
13678
13968
  welcomeTitle,
13679
13969
  welcomeBody,
13680
- locale
13970
+ locale,
13971
+ presentation = "page",
13972
+ active = true,
13973
+ explorePath = "/explore",
13974
+ examplePrompts,
13975
+ scope,
13976
+ productName,
13977
+ conversation
13681
13978
  }) {
13979
+ const panel = presentation === "panel";
13980
+ const viewportPage = !panel && heightMode === "viewport";
13682
13981
  const pageUrl = React.useMemo(
13683
13982
  () => typeof window === "undefined" ? void 0 : window.location.href,
13684
13983
  []
@@ -13714,26 +14013,21 @@ function ExplorePage({
13714
14013
  escalate,
13715
14014
  canEscalate,
13716
14015
  createShareLink,
13717
- isSharedView
13718
- } = useExploreChat({
13719
- productSlug,
13720
- pageUrl,
13721
- onSend,
13722
- // Locale-aware, so a catalog outage degrades to a translated welcome rather than an
13723
- // English one. `T.prompts` seeds the chips the same way.
13724
- examplePrompts: examplePrompts ?? T.prompts,
13725
- fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody }
13726
- });
13727
- const [draft, setDraft] = React.useState("");
14016
+ isSharedView,
14017
+ draft,
14018
+ setDraft,
14019
+ staged,
14020
+ setStaged
14021
+ } = conversation;
13728
14022
  const textareaRef = React.useRef(null);
13729
14023
  React.useEffect(() => {
13730
- if (typeof window === "undefined") return;
14024
+ if (typeof window === "undefined" || panel) return;
13731
14025
  const params = new URLSearchParams(window.location.search);
13732
14026
  if (params.has("c")) return;
13733
14027
  const question = params.get("q")?.trim();
13734
14028
  if (!question) return;
13735
14029
  setDraft(question.slice(0, EXPLORE_PREFILL_MAX_LENGTH));
13736
- }, []);
14030
+ }, [panel, setDraft]);
13737
14031
  const [historyOpen, setHistoryOpen] = React.useState(false);
13738
14032
  const speechStopRef = React.useRef(() => void 0);
13739
14033
  const stopDictation = React.useCallback(() => {
@@ -13749,8 +14043,12 @@ function ExplorePage({
13749
14043
  }
13750
14044
  });
13751
14045
  speechStopRef.current = speech.stop;
14046
+ React.useEffect(() => {
14047
+ if (active) return;
14048
+ stopDictation();
14049
+ stopSpeaking();
14050
+ }, [active, stopDictation]);
13752
14051
  const [disclaimerOpen, setDisclaimerOpen] = React.useState(false);
13753
- const [staged, setStaged] = React.useState([]);
13754
14052
  const [attachmentNotice, setAttachmentNotice] = React.useState(null);
13755
14053
  const fileInputRef = React.useRef(null);
13756
14054
  const stagedRef = React.useRef([]);
@@ -13770,16 +14068,47 @@ function ExplorePage({
13770
14068
  const maxLength = catalog.limits.maxMessageLength;
13771
14069
  const overLimit = draft.length > maxLength;
13772
14070
  const canSubmit = canSend && draft.trim().length > 0 && !overLimit && !busy;
13773
- const resolvedTitle = welcomeTitle ?? catalog.welcomeTitle;
13774
- const resolvedBody = welcomeBody ?? catalog.welcomeBody;
13775
- const prompts = catalog.examplePrompts;
14071
+ const pinnedSlug = pinnedProductSlug(scope, productSlug);
14072
+ React.useEffect(() => {
14073
+ if (scope === "product" && pinnedSlug === null) {
14074
+ warnProductScopeWithoutSlug();
14075
+ }
14076
+ }, [pinnedSlug, scope]);
14077
+ const pinnedName = React.useMemo(
14078
+ () => pinnedSlug === null ? null : productNameFor(catalog.products, pinnedSlug, productName),
14079
+ [catalog.products, pinnedSlug, productName]
14080
+ );
14081
+ const namesAnotherProduct = React.useMemo(
14082
+ () => pinnedSlug === null ? null : anotherProductMatcher(catalog.products, pinnedSlug),
14083
+ [catalog.products, pinnedSlug]
14084
+ );
14085
+ const resolvedTitle = welcomeTitle ?? (namesAnotherProduct?.(catalog.welcomeTitle) ? T.welcomeTitle : catalog.welcomeTitle);
14086
+ const resolvedBody = welcomeBody ?? (pinnedSlug === null ? catalog.welcomeBody : pinnedName === null ? T.welcomeBodyScoped : fill(T.welcomeBodyProduct, { product: pinnedName }));
14087
+ const prompts = React.useMemo(
14088
+ () => namesAnotherProduct === null ? catalog.examplePrompts : productScopedPrompts(
14089
+ examplePrompts,
14090
+ catalog.examplePrompts,
14091
+ namesAnotherProduct
14092
+ ),
14093
+ [catalog.examplePrompts, examplePrompts, namesAnotherProduct]
14094
+ );
14095
+ const conceptHighlights = React.useMemo(
14096
+ () => pinnedSlug === null || namesAnotherProduct === null ? catalog.conceptHighlights : productScopedHighlights(
14097
+ catalog.conceptHighlights,
14098
+ pinnedSlug,
14099
+ namesAnotherProduct
14100
+ ),
14101
+ [catalog.conceptHighlights, namesAnotherProduct, pinnedSlug]
14102
+ );
13776
14103
  const focusedProductName = React.useMemo(
13777
- () => catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
13778
- [catalog.products, focusProduct]
14104
+ () => pinnedSlug !== null ? pinnedName : catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
14105
+ [catalog.products, focusProduct, pinnedName, pinnedSlug]
13779
14106
  );
13780
14107
  const headProductName = React.useMemo(
13781
- () => productSlug ? catalog.products.find((p) => isSameProductSlug(p.slug, productSlug))?.name ?? null : null,
13782
- [catalog.products, productSlug]
14108
+ () => pinnedSlug !== null ? pinnedName : productSlug ? catalog.products.find(
14109
+ (p) => isSameProductSlug(p.slug, productSlug)
14110
+ )?.name ?? null : null,
14111
+ [catalog.products, pinnedName, pinnedSlug, productSlug]
13783
14112
  );
13784
14113
  const imageOrigins = React.useMemo(
13785
14114
  () => inlineImageOrigins(catalog.products),
@@ -13803,7 +14132,7 @@ function ExplorePage({
13803
14132
  const [bottomInset, setBottomInset] = React.useState(0);
13804
14133
  const paneOffsetRef = React.useRef(0);
13805
14134
  const measurePane = React.useCallback(() => {
13806
- if (heightMode !== "viewport") return;
14135
+ if (!viewportPage) return;
13807
14136
  const el = rootRef.current;
13808
14137
  if (!el) return;
13809
14138
  const layoutHeight = window.innerHeight;
@@ -13822,7 +14151,7 @@ function ExplorePage({
13822
14151
  paneOffsetRef.current = top;
13823
14152
  setPaneOffset((current) => current === top ? current : top);
13824
14153
  setBottomInset((current) => current === inset ? current : inset);
13825
- }, [heightMode]);
14154
+ }, [viewportPage]);
13826
14155
  const [chromeOverlap, setChromeOverlap] = React.useState(0);
13827
14156
  const measureChrome = React.useCallback(() => {
13828
14157
  const root = rootRef.current;
@@ -13847,7 +14176,7 @@ function ExplorePage({
13847
14176
  measureChrome();
13848
14177
  }, [measurePane, measureChrome]);
13849
14178
  React.useEffect(() => {
13850
- if (typeof window === "undefined") return;
14179
+ if (typeof window === "undefined" || panel) return;
13851
14180
  let frame = 0;
13852
14181
  const run = () => {
13853
14182
  frame = 0;
@@ -13885,12 +14214,12 @@ function ExplorePage({
13885
14214
  setBottomInset(0);
13886
14215
  setChromeOverlap(0);
13887
14216
  };
13888
- }, [remeasure]);
14217
+ }, [remeasure, panel]);
13889
14218
  React.useEffect(() => {
13890
14219
  measureChrome();
13891
14220
  }, [measureChrome, paneOffset, bottomInset]);
13892
14221
  React.useEffect(() => {
13893
- if (heightMode !== "viewport" || typeof window === "undefined") return;
14222
+ if (!viewportPage || typeof window === "undefined") return;
13894
14223
  const { history: browserHistory } = window;
13895
14224
  const previousRestoration = "scrollRestoration" in browserHistory ? browserHistory.scrollRestoration : null;
13896
14225
  if (previousRestoration !== null)
@@ -13958,14 +14287,14 @@ function ExplorePage({
13958
14287
  if (previousRestoration !== null)
13959
14288
  browserHistory.scrollRestoration = previousRestoration;
13960
14289
  };
13961
- }, [heightMode, remeasure]);
14290
+ }, [viewportPage, remeasure]);
13962
14291
  const handleScroll = React.useCallback(() => {
13963
14292
  const el = scrollRef.current;
13964
14293
  if (!el) return;
13965
14294
  stickToBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
13966
14295
  }, []);
13967
14296
  React.useEffect(() => {
13968
- if (typeof window === "undefined") return;
14297
+ if (typeof window === "undefined" || panel) return;
13969
14298
  let frame = 0;
13970
14299
  const run = () => {
13971
14300
  frame = 0;
@@ -13988,7 +14317,7 @@ function ExplorePage({
13988
14317
  if (frame) window.cancelAnimationFrame(frame);
13989
14318
  window.removeEventListener("scroll", schedule);
13990
14319
  };
13991
- }, []);
14320
+ }, [panel]);
13992
14321
  const latestAssistantId = React.useMemo(() => {
13993
14322
  for (let i = messages.length - 1; i >= 0; i -= 1) {
13994
14323
  const message = messages[i];
@@ -14004,7 +14333,7 @@ function ExplorePage({
14004
14333
  if (!stickToBottomRef.current) return;
14005
14334
  if (anchor.offsetHeight === 0) return;
14006
14335
  alignedForRef.current = latestAssistantId;
14007
- if (!pageOwnsScrolling(el)) {
14336
+ if (panel || !pageOwnsScrolling(el)) {
14008
14337
  const delta2 = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
14009
14338
  el.scrollTop = Math.max(0, el.scrollTop + delta2 - 12);
14010
14339
  return;
@@ -14013,7 +14342,7 @@ function ExplorePage({
14013
14342
  anchor.getBoundingClientRect().top - paneOffsetRef.current - 12
14014
14343
  );
14015
14344
  if (delta !== 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
14016
- }, [latestAssistantId, messages]);
14345
+ }, [latestAssistantId, messages, panel]);
14017
14346
  React.useEffect(() => {
14018
14347
  if (messages.length === 0) return;
14019
14348
  if (!stickToBottomRef.current) return;
@@ -14021,7 +14350,7 @@ function ExplorePage({
14021
14350
  return;
14022
14351
  const el = scrollRef.current;
14023
14352
  if (!el) return;
14024
- if (!pageOwnsScrolling(el)) {
14353
+ if (panel || !pageOwnsScrolling(el)) {
14025
14354
  el.scrollTop = el.scrollHeight;
14026
14355
  return;
14027
14356
  }
@@ -14030,7 +14359,7 @@ function ExplorePage({
14030
14359
  dock.getBoundingClientRect().bottom - visualViewportHeight()
14031
14360
  );
14032
14361
  if (delta > 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
14033
- }, [activity, latestAssistantId, messages]);
14362
+ }, [activity, latestAssistantId, messages, panel]);
14034
14363
  const handleShare = React.useCallback(async () => {
14035
14364
  setShareLabel(T.copying);
14036
14365
  setShareUrl(null);
@@ -14040,7 +14369,7 @@ function ExplorePage({
14040
14369
  setTimeout(() => setShareLabel(T.share), 2500);
14041
14370
  return;
14042
14371
  }
14043
- const url = new URL(pageUrl ?? window.location.href);
14372
+ const url = panel ? new URL(explorePath, window.location.href) : new URL(pageUrl ?? window.location.href);
14044
14373
  url.search = "";
14045
14374
  url.hash = "";
14046
14375
  url.searchParams.set("c", token);
@@ -14056,6 +14385,8 @@ function ExplorePage({
14056
14385
  }, [
14057
14386
  createShareLink,
14058
14387
  pageUrl,
14388
+ panel,
14389
+ explorePath,
14059
14390
  T.copied,
14060
14391
  T.copying,
14061
14392
  T.share,
@@ -14084,12 +14415,26 @@ function ExplorePage({
14084
14415
  });
14085
14416
  return pickQueueRef.current;
14086
14417
  },
14087
- [T]
14418
+ [T, setStaged]
14419
+ );
14420
+ const removeAttachment = React.useCallback(
14421
+ (id) => {
14422
+ setStaged((prev) => prev.filter((entry) => entry.id !== id));
14423
+ setAttachmentNotice(null);
14424
+ },
14425
+ [setStaged]
14426
+ );
14427
+ const pinFocus = React.useCallback(() => {
14428
+ if (pinnedSlug !== null) setFocusProduct(pinnedSlug);
14429
+ }, [pinnedSlug, setFocusProduct]);
14430
+ const retryTurn = React.useCallback(() => {
14431
+ pinFocus();
14432
+ retry();
14433
+ }, [pinFocus, retry]);
14434
+ const shownError = React.useMemo(
14435
+ () => error !== null && pinnedSlug !== null ? productScopedError(error, T.toolBudgetScoped) : error,
14436
+ [T, error, pinnedSlug]
14088
14437
  );
14089
- const removeAttachment = React.useCallback((id) => {
14090
- setStaged((prev) => prev.filter((entry) => entry.id !== id));
14091
- setAttachmentNotice(null);
14092
- }, []);
14093
14438
  const submitDraft = React.useCallback(() => {
14094
14439
  const text = draft.trim();
14095
14440
  if (!text || overLimit || busy || !canSend) return;
@@ -14097,22 +14442,34 @@ function ExplorePage({
14097
14442
  stopSpeaking();
14098
14443
  setDraft("");
14099
14444
  stickToBottomRef.current = true;
14445
+ pinFocus();
14100
14446
  void send(text, toPayload(stagedRef.current));
14101
14447
  setStaged([]);
14102
14448
  setAttachmentNotice(null);
14103
14449
  textareaRef.current?.focus();
14104
- }, [busy, canSend, draft, overLimit, send, stopDictation]);
14450
+ }, [
14451
+ busy,
14452
+ canSend,
14453
+ draft,
14454
+ overLimit,
14455
+ pinFocus,
14456
+ send,
14457
+ setDraft,
14458
+ setStaged,
14459
+ stopDictation
14460
+ ]);
14105
14461
  const sendPrompt = React.useCallback(
14106
14462
  (prompt) => {
14107
14463
  if (!canSend || busy) return;
14108
14464
  stopSpeaking();
14109
14465
  setDraft("");
14110
14466
  stickToBottomRef.current = true;
14467
+ pinFocus();
14111
14468
  void send(prompt, toPayload(stagedRef.current));
14112
14469
  setStaged([]);
14113
14470
  setAttachmentNotice(null);
14114
14471
  },
14115
- [busy, canSend, send]
14472
+ [busy, canSend, pinFocus, send, setDraft, setStaged]
14116
14473
  );
14117
14474
  const handleKeyDown = React.useCallback(
14118
14475
  (event) => {
@@ -14134,7 +14491,7 @@ function ExplorePage({
14134
14491
  [serverCatalogRaw]
14135
14492
  );
14136
14493
  const rootStyle = {};
14137
- if (heightMode === "viewport") {
14494
+ if (viewportPage) {
14138
14495
  rootStyle["--boff-explore-offset"] = paneOffset === null ? normalizeOffset(viewportOffset) : `${paneOffset}px`;
14139
14496
  if (bottomInset > 0) {
14140
14497
  rootStyle["--boff-explore-inset"] = `${bottomInset}px`;
@@ -14147,23 +14504,29 @@ function ExplorePage({
14147
14504
  "div",
14148
14505
  {
14149
14506
  ref: rootRef,
14150
- "data-boff-explore": "page",
14507
+ "data-boff-explore": panel ? "panel" : "page",
14151
14508
  "data-phase": phase,
14152
14509
  "data-locale": activeLocale,
14153
14510
  dir: rtl ? "rtl" : void 0,
14154
14511
  className: cn(
14155
- "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
14156
- heightMode === "viewport" && "boff-explore-viewport",
14157
- heightMode === "auto" && "min-h-[70vh]",
14512
+ 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",
14513
+ viewportPage && "boff-explore-viewport",
14514
+ !panel && heightMode === "auto" && "min-h-[70vh]",
14158
14515
  className
14159
14516
  ),
14160
- style: rootStyle,
14517
+ style: panel ? void 0 : rootStyle,
14161
14518
  children: [
14162
- /* @__PURE__ */ jsxRuntime.jsx(
14519
+ panel ? null : /* @__PURE__ */ jsxRuntime.jsx(
14163
14520
  PageHead,
14164
14521
  {
14165
14522
  title: seo?.title ?? T.seoTitle,
14166
- description: seo?.description ?? (headProductName ? fill(T.seoDescriptionProduct, { product: headProductName }) : T.seoDescription),
14523
+ description: seo?.description ?? (headProductName ? fill(
14524
+ // BOFF-9796: one product's own page promises that product's answers alone, never "and every
14525
+ // other product we build". The title ("Describe a problem, get an answer | {product}") and the
14526
+ // site name already name this product only, and the og:/twitter: tags repeat these two.
14527
+ pinnedSlug === null ? T.seoDescriptionProduct : T.seoDescriptionScoped,
14528
+ { product: headProductName }
14529
+ ) : T.seoDescription),
14167
14530
  productName: seo?.title ? void 0 : headProductName ?? void 0,
14168
14531
  keywords: seo?.keywords,
14169
14532
  image: seo?.image,
@@ -14172,7 +14535,11 @@ function ExplorePage({
14172
14535
  ),
14173
14536
  /* @__PURE__ */ jsxRuntime.jsx(ProseStyles, {}),
14174
14537
  /* @__PURE__ */ jsxRuntime.jsx(ExploreStyles, {}),
14175
- bakedCatalogJson ? /* @__PURE__ */ jsxRuntime.jsx(
14538
+ panel ? /* @__PURE__ */ jsxRuntime.jsx("style", { children: `.boff-explore-panel .boff-explore-scroll { container: boff-explore-pane / size; }
14539
+ @container boff-explore-pane (width < ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) {
14540
+ .boff-explore-panel .boff-explore-scroll .boff-explore-capabilities { display: none; }
14541
+ }` }) : null,
14542
+ !panel && bakedCatalogJson ? /* @__PURE__ */ jsxRuntime.jsx(
14176
14543
  "script",
14177
14544
  {
14178
14545
  id: BAKED_CATALOG_ELEMENT_ID,
@@ -14192,7 +14559,7 @@ function ExplorePage({
14192
14559
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-4 w-4" })
14193
14560
  }
14194
14561
  ),
14195
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
14562
+ panel ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "truncate text-sm font-semibold", children: resolvedTitle }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
14196
14563
  focusedProductName ? /* @__PURE__ */ jsxRuntime.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,
14197
14564
  /* @__PURE__ */ jsxRuntime.jsxs(
14198
14565
  Button,
@@ -14336,16 +14703,18 @@ function ExplorePage({
14336
14703
  children: showWelcome ? /* @__PURE__ */ jsxRuntime.jsx(
14337
14704
  WelcomeState,
14338
14705
  {
14706
+ heading: panel ? "h2" : "h1",
14339
14707
  strings: T,
14340
14708
  title: resolvedTitle,
14341
14709
  body: resolvedBody,
14342
14710
  prompts,
14343
- products: catalog.products,
14344
- conceptHighlights: catalog.conceptHighlights,
14711
+ products: pinnedSlug === null ? catalog.products : NO_PRODUCTS,
14712
+ conceptHighlights,
14345
14713
  focusProduct,
14346
14714
  onPrompt: sendPrompt,
14347
14715
  onFocus: setFocusProduct,
14348
- disabled: !canSend || busy
14716
+ disabled: !canSend || busy,
14717
+ productScoped: pinnedSlug !== null
14349
14718
  }
14350
14719
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full min-w-0 max-w-3xl space-y-6 px-4 py-6", children: messages.map(
14351
14720
  (message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -14422,7 +14791,14 @@ function ExplorePage({
14422
14791
  submitDraft();
14423
14792
  },
14424
14793
  children: [
14425
- error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
14794
+ shownError ? /* @__PURE__ */ jsxRuntime.jsx(
14795
+ ErrorBanner,
14796
+ {
14797
+ error: shownError,
14798
+ onRetry: retryTurn,
14799
+ onReset: reset
14800
+ }
14801
+ ) : null,
14426
14802
  staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
14427
14803
  "ul",
14428
14804
  {
@@ -14508,9 +14884,14 @@ function ExplorePage({
14508
14884
  composingRef.current = false;
14509
14885
  },
14510
14886
  "aria-label": "Ask a question",
14511
- placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
14512
- product: focusedProductName
14513
- }) : T.placeholder,
14887
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(
14888
+ // BOFF-9796: one product's own assistant keeps this field exactly as every site has it, its
14889
+ // classes and its fit to the draft alone; only its placeholder says less. On a phone the
14890
+ // field is one line tall and cuts off a placeholder that wraps: in English, "Ask about
14891
+ // {product}…" fits that line at 320px and wider.
14892
+ pinnedSlug === null ? T.placeholderProduct : T.placeholderScoped,
14893
+ { product: focusedProductName }
14894
+ ) : T.placeholder,
14514
14895
  className: "max-h-[200px] min-h-[44px] w-full min-w-0 flex-1 resize-none border-0 bg-transparent px-2 py-2.5 text-base shadow-none focus-visible:ring-0 sm:text-sm"
14515
14896
  }
14516
14897
  ),
@@ -14698,77 +15079,777 @@ function samePath(a, b) {
14698
15079
  const norm = (v) => v.length > 1 ? v.replace(/\/+$/, "") : v;
14699
15080
  return norm(a) === norm(b);
14700
15081
  }
14701
- function ExploreCta({
14702
- variant,
14703
- href = "/explore",
14704
- label = "Ask AI",
14705
- className,
15082
+ var ExploreCta = React.forwardRef(
15083
+ function ExploreCta2({
15084
+ variant,
15085
+ href = "/explore",
15086
+ label = "Ask AI",
15087
+ className,
15088
+ onNavigate,
15089
+ onClick,
15090
+ currentPath,
15091
+ expanded,
15092
+ controls
15093
+ }, ref) {
15094
+ const path = useCurrentPath(currentPath);
15095
+ const isActive = samePath(path, href);
15096
+ if (variant === "floating" && isActive) return null;
15097
+ const handleClick = (event) => {
15098
+ onClick?.();
15099
+ if (!onNavigate) return;
15100
+ if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {
15101
+ return;
15102
+ }
15103
+ event.preventDefault();
15104
+ onNavigate(href);
15105
+ };
15106
+ const classes = {
15107
+ // A quiet icon control, deliberately NOT a second gradient pill: a header should carry one
15108
+ // primary CTA ("Get started"), and a competing coloured button next to it reads as clutter.
15109
+ // This matches the theme toggle's visual weight, so the row scans as [utilities] [CTA].
15110
+ // The prominent, labelled entry point to /explore is the floating bubble, which is visible
15111
+ // on every page without scrolling. `shrink-0` keeps it from squeezing the nav.
15112
+ header: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
15113
+ mobile: "inline-flex w-full items-center gap-2 rounded-lg border border-border bg-card px-3 py-2 text-sm font-medium text-card-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
15114
+ floating: "fixed bottom-5 right-5 z-40 inline-flex items-center gap-2 rounded-full bg-gradient-to-r from-primary to-primary/70 px-4 py-3 text-sm font-medium text-primary-foreground shadow-lg transition-opacity hover:opacity-90"
15115
+ };
15116
+ const hooks = {
15117
+ header: "cta-header",
15118
+ mobile: "cta-mobile",
15119
+ floating: "cta-floating"
15120
+ };
15121
+ return /* @__PURE__ */ jsxRuntime.jsxs(
15122
+ "a",
15123
+ {
15124
+ ref,
15125
+ "data-boff-explore": hooks[variant],
15126
+ href,
15127
+ onClick: handleClick,
15128
+ "aria-label": label,
15129
+ "aria-current": isActive ? "page" : void 0,
15130
+ "aria-expanded": expanded,
15131
+ "aria-haspopup": expanded === void 0 ? void 0 : "dialog",
15132
+ "aria-controls": expanded === void 0 ? void 0 : controls,
15133
+ className: cn(
15134
+ classes[variant],
15135
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
15136
+ className
15137
+ ),
15138
+ children: [
15139
+ /* @__PURE__ */ jsxRuntime.jsx(
15140
+ lucideReact.Sparkles,
15141
+ {
15142
+ className: cn(
15143
+ "shrink-0",
15144
+ variant === "floating" ? "h-4 w-4" : variant === "header" ? "h-5 w-5" : "h-3.5 w-3.5"
15145
+ ),
15146
+ "aria-hidden": "true"
15147
+ }
15148
+ ),
15149
+ /* @__PURE__ */ jsxRuntime.jsx(
15150
+ "span",
15151
+ {
15152
+ className: cn(
15153
+ variant === "floating" && "hidden sm:inline",
15154
+ // Never labelled in the header — see the class comment above.
15155
+ variant === "header" && "hidden"
15156
+ ),
15157
+ children: label
15158
+ }
15159
+ )
15160
+ ]
15161
+ }
15162
+ );
15163
+ }
15164
+ );
15165
+ var MARK_KEY = "boffExplorePanel";
15166
+ var POS_KEY = "boffExplorePanelPos";
15167
+ var DOC_KEY = "boffExplorePanelDoc";
15168
+ var DOC_ID = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
15169
+ var lastPos = 0;
15170
+ var hostMode = null;
15171
+ var NARROW_QUERY = "(max-width: 639px)";
15172
+ var TOUCH_FIRST_QUERY = "(hover: none) and (pointer: coarse)";
15173
+ var COMPOSER_FOCUS_TRIES = 15;
15174
+ var PANEL_CSS = `
15175
+ .boff-explore-shell {
15176
+ --boff-explore-shell-lift-at: max(var(--boff-explore-shell-lift, 0px), var(--boff-explore-shell-bottom, 0px));
15177
+ --boff-explore-shell-room-at: var(--boff-explore-shell-room, calc(100vh - var(--boff-explore-shell-bottom, 0px)));
15178
+ position: fixed;
15179
+ z-index: var(--boff-explore-shell-z, 50);
15180
+ display: flex;
15181
+ flex-direction: column;
15182
+ overflow: hidden;
15183
+ overscroll-behavior: contain;
15184
+ inset-inline-end: 1rem;
15185
+ bottom: calc(1rem + var(--boff-explore-shell-lift-at));
15186
+ width: min(26rem, calc(100vw - 2rem));
15187
+ height: min(40rem, calc(var(--boff-explore-shell-room-at) - 6rem));
15188
+ border-width: 1px;
15189
+ border-style: solid;
15190
+ border-radius: 1rem;
15191
+ }
15192
+ @supports (height: 100dvh) {
15193
+ .boff-explore-shell {
15194
+ --boff-explore-shell-room-at: var(--boff-explore-shell-room, calc(100dvh - var(--boff-explore-shell-bottom, 0px)));
15195
+ }
15196
+ }
15197
+ @media (max-width: 639px) {
15198
+ .boff-explore-shell[data-size="compact"] {
15199
+ inset-inline: 0;
15200
+ bottom: var(--boff-explore-shell-lift-at);
15201
+ width: auto;
15202
+ height: min(75vh, calc(var(--boff-explore-shell-room-at) - 4rem));
15203
+ border-width: 1px 0 0;
15204
+ border-radius: 1rem 1rem 0 0;
15205
+ }
15206
+ @supports (height: 100dvh) {
15207
+ .boff-explore-shell[data-size="compact"] {
15208
+ height: min(75dvh, calc(var(--boff-explore-shell-room-at) - 4rem));
15209
+ }
15210
+ }
15211
+ }
15212
+ .boff-explore-shell[data-size="expanded"] {
15213
+ inset: var(--boff-explore-shell-top, 0px) 0 var(--boff-explore-shell-lift-at) 0;
15214
+ width: auto;
15215
+ height: auto;
15216
+ border-width: 0;
15217
+ border-radius: 0;
15218
+ box-shadow: none;
15219
+ }
15220
+ .boff-explore-shell[data-open="false"] {
15221
+ visibility: hidden;
15222
+ content-visibility: hidden;
15223
+ }
15224
+ .boff-explore-shell:focus { outline: none; }
15225
+ `;
15226
+ var PRODUCT_TITLE_CSS = `
15227
+ .boff-explore-shell .boff-explore-shell-title { container-type: inline-size; }
15228
+ .boff-explore-shell .boff-explore-shell-title-text {
15229
+ display: -webkit-box;
15230
+ -webkit-box-orient: vertical;
15231
+ -webkit-line-clamp: 2;
15232
+ overflow: hidden;
15233
+ overflow-wrap: break-word;
15234
+ line-height: 1.125rem;
15235
+ }
15236
+ @container (max-width: 6rem) {
15237
+ .boff-explore-shell .boff-explore-shell-title-text { font-size: 0.75rem; line-height: 1rem; }
15238
+ }
15239
+ `;
15240
+ function stateRecord() {
15241
+ const state = window.history.state;
15242
+ return state !== null && typeof state === "object" ? state : {};
15243
+ }
15244
+ function stampedHere() {
15245
+ return stateRecord()[DOC_KEY] === DOC_ID;
15246
+ }
15247
+ function readMark() {
15248
+ if (typeof window === "undefined" || !stampedHere()) return null;
15249
+ const mark = stateRecord()[MARK_KEY];
15250
+ return mark === "open" || mark === "expanded" ? mark : null;
15251
+ }
15252
+ function readPos() {
15253
+ if (typeof window === "undefined" || !stampedHere()) return null;
15254
+ const pos = stateRecord()[POS_KEY];
15255
+ return typeof pos === "number" ? pos : null;
15256
+ }
15257
+ function stamp() {
15258
+ if (typeof window === "undefined" || readPos() !== null) return;
15259
+ const rest = { ...stateRecord() };
15260
+ delete rest[MARK_KEY];
15261
+ delete rest[POS_KEY];
15262
+ delete rest[DOC_KEY];
15263
+ lastPos += 1;
15264
+ try {
15265
+ window.history.replaceState(
15266
+ { ...rest, [POS_KEY]: lastPos, [DOC_KEY]: DOC_ID },
15267
+ ""
15268
+ );
15269
+ } catch {
15270
+ }
15271
+ }
15272
+ function pushMark(mark) {
15273
+ const { history } = window;
15274
+ const mode = "scrollRestoration" in history ? history.scrollRestoration : null;
15275
+ try {
15276
+ if (mode !== null) history.scrollRestoration = "manual";
15277
+ lastPos += 1;
15278
+ history.pushState(
15279
+ {
15280
+ ...stateRecord(),
15281
+ [MARK_KEY]: mark,
15282
+ [POS_KEY]: lastPos,
15283
+ [DOC_KEY]: DOC_ID
15284
+ },
15285
+ ""
15286
+ );
15287
+ return true;
15288
+ } catch {
15289
+ return false;
15290
+ } finally {
15291
+ if (mode !== null) history.scrollRestoration = mode;
15292
+ }
15293
+ }
15294
+ function restoreScrollMode(mode, then) {
15295
+ const { history } = window;
15296
+ const put = () => {
15297
+ if (history.scrollRestoration === "manual")
15298
+ history.scrollRestoration = mode;
15299
+ then?.();
15300
+ };
15301
+ if (typeof window.requestAnimationFrame !== "function") {
15302
+ window.setTimeout(put, 50);
15303
+ return;
15304
+ }
15305
+ window.requestAnimationFrame(() => window.requestAnimationFrame(put));
15306
+ }
15307
+ function closeInnerDialogs(shell) {
15308
+ let closed = false;
15309
+ document.querySelectorAll(
15310
+ 'dialog[data-boff-explore="video-dialog"]'
15311
+ ).forEach((dialog) => {
15312
+ if (!dialog.open) return;
15313
+ dialog.close();
15314
+ closed = true;
15315
+ });
15316
+ const disclaimer = shell?.querySelector(
15317
+ '[data-boff-explore="disclaimer-dialog"]'
15318
+ );
15319
+ if (disclaimer) {
15320
+ disclaimer.click();
15321
+ closed = true;
15322
+ }
15323
+ return closed;
15324
+ }
15325
+ function marksOnTop(mark) {
15326
+ if (mark === "expanded") return 2;
15327
+ return mark === "open" ? 1 : 0;
15328
+ }
15329
+ function matches(query) {
15330
+ return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia(query).matches;
15331
+ }
15332
+ function ExplorePanel({
15333
+ open,
15334
+ onOpenChange,
15335
+ id = "boff-explore-panel",
15336
+ productSlug,
15337
+ locale,
15338
+ scope,
15339
+ productName,
15340
+ examplePrompts,
14706
15341
  onNavigate,
14707
- onClick,
14708
- currentPath
15342
+ welcomeTitle,
15343
+ welcomeBody,
15344
+ explorePath,
15345
+ avatar,
15346
+ bottomOffset,
15347
+ zIndex,
15348
+ returnFocusRef,
15349
+ className
14709
15350
  }) {
14710
- const path = useCurrentPath(currentPath);
14711
- const isActive = samePath(path, href);
14712
- if (variant === "floating" && isActive) return null;
14713
- const handleClick = (event) => {
14714
- onClick?.();
14715
- if (!onNavigate) return;
14716
- if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {
15351
+ const resolvedLocale = resolveExploreLocale(locale);
15352
+ const T = React.useMemo(() => exploreStrings(resolvedLocale), [resolvedLocale]);
15353
+ const rtl = isRtlLocale(resolvedLocale);
15354
+ const catalogProducts = React.useContext(ExploreCatalogProductsContext);
15355
+ const pinnedSlug = pinnedProductSlug(scope, productSlug);
15356
+ const title = React.useMemo(() => {
15357
+ if (pinnedSlug === null) return T.panelTitle;
15358
+ const name = productNameFor(
15359
+ catalogProducts ?? ECOSYSTEM_PRODUCTS,
15360
+ pinnedSlug,
15361
+ productName
15362
+ );
15363
+ return name === null ? T.panelTitle : fill(T.panelTitleProduct, { product: name });
15364
+ }, [T, catalogProducts, pinnedSlug, productName]);
15365
+ const uid = React.useId();
15366
+ const titleId = `${uid}-title`;
15367
+ const chatTabId = `${uid}-chat-tab`;
15368
+ const avatarTabId = `${uid}-avatar-tab`;
15369
+ const chatPaneId = `${uid}-chat`;
15370
+ const avatarPaneId = `${uid}-avatar`;
15371
+ const [mounted, setMounted] = React.useState(open);
15372
+ const [size, setSize] = React.useState("compact");
15373
+ const [view, setView] = React.useState("chat");
15374
+ const [focusRequest, setFocusRequest] = React.useState(
15375
+ open ? "in" : null
15376
+ );
15377
+ const [wasOpen, setWasOpen] = React.useState(open);
15378
+ if (open !== wasOpen) {
15379
+ setWasOpen(open);
15380
+ if (open) {
15381
+ setMounted(true);
15382
+ setFocusRequest("in");
15383
+ } else {
15384
+ setSize("compact");
15385
+ setFocusRequest("back");
15386
+ }
15387
+ }
15388
+ const shellRef = React.useRef(null);
15389
+ const chatPaneRef = React.useRef(null);
15390
+ const chatTabRef = React.useRef(null);
15391
+ const avatarTabRef = React.useRef(null);
15392
+ const ownPopsRef = React.useRef(0);
15393
+ const settlingRef = React.useRef(false);
15394
+ const afterPopRef = React.useRef([]);
15395
+ const markRef = React.useRef(null);
15396
+ const posRef = React.useRef(null);
15397
+ const hrefRef = React.useRef(null);
15398
+ const openRef = React.useRef(open);
15399
+ const onOpenChangeRef = React.useRef(onOpenChange);
15400
+ const lookedRef = React.useRef(false);
15401
+ const traverse = React.useCallback((delta) => {
15402
+ ownPopsRef.current += 1;
15403
+ window.history.go(delta);
15404
+ }, []);
15405
+ const push = React.useCallback((mark) => {
15406
+ const { history } = window;
15407
+ if ("scrollRestoration" in history && history.scrollRestoration !== "manual") {
15408
+ hostMode = history.scrollRestoration;
15409
+ }
15410
+ stamp();
15411
+ if (!pushMark(mark)) return false;
15412
+ markRef.current = mark;
15413
+ posRef.current = readPos();
15414
+ hrefRef.current = window.location.href;
15415
+ return true;
15416
+ }, []);
15417
+ const whenSettled = React.useCallback((work) => {
15418
+ if (ownPopsRef.current > 0 || settlingRef.current) {
15419
+ afterPopRef.current.push(work);
15420
+ } else {
15421
+ work();
15422
+ }
15423
+ }, []);
15424
+ const flush = React.useCallback(() => {
15425
+ settlingRef.current = false;
15426
+ while (afterPopRef.current.length > 0 && ownPopsRef.current === 0 && !settlingRef.current) {
15427
+ afterPopRef.current.shift()?.();
15428
+ }
15429
+ }, []);
15430
+ React.useEffect(() => {
15431
+ openRef.current = open;
15432
+ onOpenChangeRef.current = onOpenChange;
15433
+ });
15434
+ React.useEffect(() => {
15435
+ if (typeof window === "undefined") return;
15436
+ if (ownPopsRef.current > 0 || settlingRef.current) return;
15437
+ const pos = readPos();
15438
+ if (lookedRef.current && pos !== null && pos !== posRef.current) return;
15439
+ lookedRef.current = true;
15440
+ stamp();
15441
+ markRef.current = readMark();
15442
+ posRef.current = readPos();
15443
+ hrefRef.current = window.location.href;
15444
+ });
15445
+ React.useEffect(() => {
15446
+ if (typeof window === "undefined") return;
15447
+ whenSettled(() => {
15448
+ if (openRef.current) {
15449
+ if (readMark() === null) push("open");
15450
+ return;
15451
+ }
15452
+ closeInnerDialogs(shellRef.current);
15453
+ const count = marksOnTop(readMark());
15454
+ if (count > 0) traverse(-count);
15455
+ });
15456
+ }, [open, push, traverse, whenSettled]);
15457
+ React.useEffect(() => {
15458
+ if (typeof window === "undefined") return;
15459
+ const onPopState = () => {
15460
+ const open2 = openRef.current;
15461
+ const onOpenChange2 = onOpenChangeRef.current;
15462
+ const leftMark = markRef.current;
15463
+ const leftPos = posRef.current;
15464
+ const leftHref = hrefRef.current;
15465
+ const mark = readMark();
15466
+ const pos = readPos();
15467
+ markRef.current = mark;
15468
+ posRef.current = pos;
15469
+ hrefRef.current = window.location.href;
15470
+ const forward = pos !== null && leftPos !== null && pos > leftPos;
15471
+ const mode = hostMode;
15472
+ const restoring = leftMark !== null && mode !== null;
15473
+ if (ownPopsRef.current > 0) {
15474
+ ownPopsRef.current -= 1;
15475
+ if (ownPopsRef.current > 0) return;
15476
+ if (restoring) {
15477
+ settlingRef.current = true;
15478
+ restoreScrollMode(mode, flush);
15479
+ } else {
15480
+ flush();
15481
+ }
15482
+ return;
15483
+ }
15484
+ if (restoring) restoreScrollMode(mode);
15485
+ if (leftMark !== null && !forward) {
15486
+ if (open2 && closeInnerDialogs(shellRef.current)) {
15487
+ if (readMark() === null) push("open");
15488
+ if (leftMark === "expanded" && readMark() === "open") {
15489
+ push("expanded");
15490
+ }
15491
+ return;
15492
+ }
15493
+ setSize("compact");
15494
+ if (mark === null && open2) onOpenChange2(false);
15495
+ return;
15496
+ }
15497
+ if (leftHref !== null && window.location.href !== leftHref) {
15498
+ closeInnerDialogs(shellRef.current);
15499
+ }
15500
+ if (mark === null) return;
15501
+ if (forward) {
15502
+ setSize(mark === "expanded" ? "expanded" : "compact");
15503
+ if (!open2) onOpenChange2(true);
15504
+ return;
15505
+ }
15506
+ if (!open2) {
15507
+ traverse(-marksOnTop(mark));
15508
+ return;
15509
+ }
15510
+ setSize(mark === "expanded" ? "expanded" : "compact");
15511
+ };
15512
+ window.addEventListener("popstate", onPopState);
15513
+ return () => window.removeEventListener("popstate", onPopState);
15514
+ }, [flush, push, traverse]);
15515
+ React.useEffect(() => {
15516
+ if (!open || typeof window === "undefined") return;
15517
+ const viewport = window.visualViewport;
15518
+ const shell = shellRef.current;
15519
+ if (!viewport || !shell) return;
15520
+ const clear = () => {
15521
+ shell.style.removeProperty("--boff-explore-shell-lift");
15522
+ shell.style.removeProperty("--boff-explore-shell-room");
15523
+ shell.style.removeProperty("--boff-explore-shell-top");
15524
+ };
15525
+ const apply = () => {
15526
+ const covered = Math.max(
15527
+ 0,
15528
+ Math.round(window.innerHeight - viewport.height - viewport.offsetTop)
15529
+ );
15530
+ const panned = viewport.offsetTop > 1;
15531
+ if (covered <= 1 && !panned) {
15532
+ clear();
15533
+ return;
15534
+ }
15535
+ shell.style.setProperty("--boff-explore-shell-lift", `${covered}px`);
15536
+ shell.style.setProperty(
15537
+ "--boff-explore-shell-room",
15538
+ `calc(${Math.round(viewport.height)}px - max(0px, var(--boff-explore-shell-bottom, 0px) - ${covered}px))`
15539
+ );
15540
+ shell.style.setProperty(
15541
+ "--boff-explore-shell-top",
15542
+ `${Math.max(0, Math.round(viewport.offsetTop))}px`
15543
+ );
15544
+ };
15545
+ apply();
15546
+ viewport.addEventListener("resize", apply);
15547
+ viewport.addEventListener("scroll", apply);
15548
+ return () => {
15549
+ viewport.removeEventListener("resize", apply);
15550
+ viewport.removeEventListener("scroll", apply);
15551
+ clear();
15552
+ };
15553
+ }, [open]);
15554
+ const focusComposerSoon = React.useCallback((from) => {
15555
+ let tries = 0;
15556
+ const next = (attempt2) => {
15557
+ if (typeof window.requestAnimationFrame === "function") {
15558
+ window.requestAnimationFrame(attempt2);
15559
+ } else {
15560
+ window.setTimeout(attempt2, 16);
15561
+ }
15562
+ };
15563
+ const attempt = () => {
15564
+ if (document.activeElement !== from) return;
15565
+ const composer = chatPaneRef.current?.querySelector(
15566
+ "textarea:not(:disabled)"
15567
+ );
15568
+ if (!composer) return;
15569
+ composer.focus();
15570
+ tries += 1;
15571
+ if (document.activeElement !== composer && tries < COMPOSER_FOCUS_TRIES) {
15572
+ next(attempt);
15573
+ }
15574
+ };
15575
+ next(attempt);
15576
+ }, []);
15577
+ React.useEffect(() => {
15578
+ if (focusRequest === null) return;
15579
+ setFocusRequest(null);
15580
+ const shell = shellRef.current;
15581
+ if (focusRequest === "back") {
15582
+ const active = document.activeElement;
15583
+ if (active === null || active === document.body || shell?.contains(active)) {
15584
+ returnFocusRef?.current?.focus();
15585
+ }
14717
15586
  return;
14718
15587
  }
14719
- event.preventDefault();
14720
- onNavigate(href);
14721
- };
14722
- const classes = {
14723
- // A quiet icon control, deliberately NOT a second gradient pill: a header should carry one
14724
- // primary CTA ("Get started"), and a competing coloured button next to it reads as clutter.
14725
- // This matches the theme toggle's visual weight, so the row scans as [utilities] [CTA].
14726
- // The prominent, labelled entry point to /explore is the floating bubble, which is visible
14727
- // on every page without scrolling. `shrink-0` keeps it from squeezing the nav.
14728
- header: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
14729
- mobile: "inline-flex w-full items-center gap-2 rounded-lg border border-border bg-card px-3 py-2 text-sm font-medium text-card-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
14730
- floating: "fixed bottom-5 right-5 z-40 inline-flex items-center gap-2 rounded-full bg-gradient-to-r from-primary to-primary/70 px-4 py-3 text-sm font-medium text-primary-foreground shadow-lg transition-opacity hover:opacity-90"
14731
- };
14732
- const hooks = {
14733
- header: "cta-header",
14734
- mobile: "cta-mobile",
14735
- floating: "cta-floating"
15588
+ if (!shell) return;
15589
+ shell.focus();
15590
+ if (view === "chat" && !matches(TOUCH_FIRST_QUERY)) {
15591
+ focusComposerSoon(shell);
15592
+ }
15593
+ }, [focusComposerSoon, focusRequest, returnFocusRef, view]);
15594
+ const close = React.useCallback(() => onOpenChange(false), [onOpenChange]);
15595
+ const expand = React.useCallback(() => {
15596
+ setSize("expanded");
15597
+ whenSettled(() => {
15598
+ if (!openRef.current) return;
15599
+ if (readMark() === null) push("open");
15600
+ if (readMark() === "open") push("expanded");
15601
+ });
15602
+ }, [push, whenSettled]);
15603
+ const restore = React.useCallback(() => {
15604
+ setSize("compact");
15605
+ whenSettled(() => {
15606
+ if (readMark() === "expanded") traverse(-1);
15607
+ });
15608
+ }, [traverse, whenSettled]);
15609
+ const onKeyDown = React.useCallback(
15610
+ (event) => {
15611
+ if (event.key !== "Escape" || event.defaultPrevented) return;
15612
+ if (event.nativeEvent.isComposing || event.keyCode === 229) return;
15613
+ const shell = shellRef.current;
15614
+ if (!shell || !(event.target instanceof Node) || !shell.contains(event.target)) {
15615
+ return;
15616
+ }
15617
+ if (shell.querySelector('dialog[open], [role="dialog"][aria-modal="true"]')) {
15618
+ return;
15619
+ }
15620
+ event.preventDefault();
15621
+ if (size === "expanded") restore();
15622
+ else close();
15623
+ },
15624
+ [close, restore, size]
15625
+ );
15626
+ const navigate = React.useCallback(
15627
+ (path) => {
15628
+ if (!onNavigate) return;
15629
+ setSize("compact");
15630
+ const stayOpen = !matches(NARROW_QUERY);
15631
+ if (!stayOpen) onOpenChange(false);
15632
+ whenSettled(() => {
15633
+ const go = () => {
15634
+ onNavigate(path);
15635
+ if (stayOpen && openRef.current && readMark() === null) {
15636
+ push("open");
15637
+ }
15638
+ };
15639
+ const count = marksOnTop(readMark());
15640
+ if (count === 0) {
15641
+ go();
15642
+ return;
15643
+ }
15644
+ afterPopRef.current.push(go);
15645
+ traverse(-count);
15646
+ });
15647
+ },
15648
+ [onNavigate, onOpenChange, push, traverse, whenSettled]
15649
+ );
15650
+ const selectView = React.useCallback((next) => {
15651
+ setView(next);
15652
+ (next === "chat" ? chatTabRef : avatarTabRef).current?.focus();
15653
+ }, []);
15654
+ const continueInChat = React.useCallback(() => {
15655
+ setView("chat");
15656
+ const tab = chatTabRef.current;
15657
+ tab?.focus();
15658
+ focusComposerSoon(tab);
15659
+ }, [focusComposerSoon]);
15660
+ const onTabKeyDown = React.useCallback(
15661
+ (event) => {
15662
+ const other = view === "chat" ? "avatar" : "chat";
15663
+ const next = {
15664
+ ArrowLeft: other,
15665
+ ArrowRight: other,
15666
+ Home: "chat",
15667
+ End: "avatar"
15668
+ };
15669
+ const target = next[event.key];
15670
+ if (!target) return;
15671
+ event.preventDefault();
15672
+ selectView(target);
15673
+ },
15674
+ [selectView, view]
15675
+ );
15676
+ if (!mounted) return null;
15677
+ const style = {
15678
+ "--boff-explore-shell-bottom": bottomOffset ?? "0px",
15679
+ ...zIndex === void 0 ? {} : { "--boff-explore-shell-z": String(zIndex) }
14736
15680
  };
15681
+ const iconButton = "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
15682
+ const tabButton = "rounded-md px-3 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
15683
+ const expanded = size === "expanded";
15684
+ const sizeLabel = expanded ? T.exitFullScreen : T.enterFullScreen;
15685
+ const tabs = [
15686
+ { key: "chat", id: chatTabId, pane: chatPaneId, label: T.tabChat },
15687
+ { key: "avatar", id: avatarTabId, pane: avatarPaneId, label: T.tabAvatar }
15688
+ ];
14737
15689
  return /* @__PURE__ */ jsxRuntime.jsxs(
14738
- "a",
15690
+ "div",
14739
15691
  {
14740
- "data-boff-explore": hooks[variant],
14741
- href,
14742
- onClick: handleClick,
14743
- "aria-label": label,
14744
- "aria-current": isActive ? "page" : void 0,
15692
+ ref: shellRef,
15693
+ id,
15694
+ role: "dialog",
15695
+ "aria-modal": "false",
15696
+ "aria-labelledby": titleId,
15697
+ tabIndex: -1,
15698
+ "data-boff-explore": "panel-shell",
15699
+ "data-open": open ? "true" : "false",
15700
+ "data-size": size,
15701
+ dir: rtl ? "rtl" : void 0,
14745
15702
  className: cn(
14746
- classes[variant],
14747
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
15703
+ "boff-explore-shell border-border bg-background text-foreground shadow-2xl",
14748
15704
  className
14749
15705
  ),
15706
+ style,
15707
+ onKeyDown,
14750
15708
  children: [
14751
- /* @__PURE__ */ jsxRuntime.jsx(
14752
- lucideReact.Sparkles,
14753
- {
14754
- className: cn(
14755
- "shrink-0",
14756
- variant === "floating" ? "h-4 w-4" : variant === "header" ? "h-5 w-5" : "h-3.5 w-3.5"
14757
- ),
14758
- "aria-hidden": "true"
14759
- }
14760
- ),
14761
- /* @__PURE__ */ jsxRuntime.jsx(
14762
- "span",
14763
- {
14764
- className: cn(
14765
- variant === "floating" && "hidden sm:inline",
14766
- // Never labelled in the header — see the class comment above.
14767
- variant === "header" && "hidden"
15709
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: PANEL_CSS }),
15710
+ pinnedSlug === null ? null : /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: PRODUCT_TITLE_CSS } }),
15711
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-border px-3 py-2", children: [
15712
+ pinnedSlug === null ? /* @__PURE__ */ jsxRuntime.jsx(
15713
+ "span",
15714
+ {
15715
+ id: titleId,
15716
+ className: "min-w-0 flex-1 truncate text-sm font-semibold",
15717
+ children: title
15718
+ }
15719
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
15720
+ "span",
15721
+ {
15722
+ id: titleId,
15723
+ className: "boff-explore-shell-title min-w-0 flex-1",
15724
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "boff-explore-shell-title-text text-sm font-semibold", children: title })
15725
+ }
15726
+ ),
15727
+ avatar ? /* @__PURE__ */ jsxRuntime.jsx(
15728
+ "div",
15729
+ {
15730
+ role: "tablist",
15731
+ "aria-label": T.panelViews,
15732
+ className: "inline-flex shrink-0 rounded-lg bg-muted p-0.5",
15733
+ children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
15734
+ "button",
15735
+ {
15736
+ ref: tab.key === "chat" ? chatTabRef : avatarTabRef,
15737
+ type: "button",
15738
+ role: "tab",
15739
+ id: tab.id,
15740
+ "aria-selected": view === tab.key,
15741
+ "aria-controls": tab.pane,
15742
+ tabIndex: view === tab.key ? 0 : -1,
15743
+ "data-boff-explore": `panel-tab-${tab.key}`,
15744
+ className: cn(
15745
+ tabButton,
15746
+ view === tab.key ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
15747
+ ),
15748
+ onClick: () => selectView(tab.key),
15749
+ onKeyDown: onTabKeyDown,
15750
+ children: tab.label
15751
+ },
15752
+ tab.key
15753
+ ))
15754
+ }
15755
+ ) : null,
15756
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
15757
+ /* @__PURE__ */ jsxRuntime.jsx(
15758
+ "button",
15759
+ {
15760
+ type: "button",
15761
+ "data-boff-explore": expanded ? "panel-restore" : "panel-expand",
15762
+ "aria-label": sizeLabel,
15763
+ title: sizeLabel,
15764
+ className: iconButton,
15765
+ onClick: expanded ? restore : expand,
15766
+ children: expanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { className: "h-4 w-4", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "h-4 w-4", "aria-hidden": "true" })
15767
+ }
14768
15768
  ),
14769
- children: label
14770
- }
14771
- )
15769
+ /* @__PURE__ */ jsxRuntime.jsx(
15770
+ "button",
15771
+ {
15772
+ type: "button",
15773
+ "data-boff-explore": "panel-close",
15774
+ "aria-label": T.closePanel,
15775
+ title: T.closePanel,
15776
+ className: iconButton,
15777
+ onClick: close,
15778
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4", "aria-hidden": "true" })
15779
+ }
15780
+ )
15781
+ ] })
15782
+ ] }),
15783
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex min-h-0 flex-1 flex-col", children: [
15784
+ /* @__PURE__ */ jsxRuntime.jsx(
15785
+ "div",
15786
+ {
15787
+ ref: chatPaneRef,
15788
+ id: chatPaneId,
15789
+ role: avatar ? "tabpanel" : void 0,
15790
+ "aria-labelledby": avatar ? chatTabId : void 0,
15791
+ "data-boff-explore": "panel-chat",
15792
+ className: cn(
15793
+ "flex min-h-0 flex-1 flex-col",
15794
+ view === "avatar" && "invisible"
15795
+ ),
15796
+ children: /* @__PURE__ */ jsxRuntime.jsx(
15797
+ ExplorePage,
15798
+ {
15799
+ presentation: "panel",
15800
+ active: open && view === "chat",
15801
+ productSlug,
15802
+ locale,
15803
+ scope,
15804
+ productName,
15805
+ examplePrompts,
15806
+ onNavigate: onNavigate ? navigate : void 0,
15807
+ welcomeTitle,
15808
+ welcomeBody,
15809
+ explorePath
15810
+ }
15811
+ )
15812
+ }
15813
+ ),
15814
+ avatar ? /* @__PURE__ */ jsxRuntime.jsxs(
15815
+ "div",
15816
+ {
15817
+ id: avatarPaneId,
15818
+ role: "tabpanel",
15819
+ "aria-labelledby": avatarTabId,
15820
+ "data-boff-explore": "panel-avatar",
15821
+ className: cn(
15822
+ "absolute inset-0 flex-col items-center justify-center gap-4 overflow-y-auto bg-background p-6 text-center",
15823
+ view === "avatar" ? "flex" : "hidden"
15824
+ ),
15825
+ children: [
15826
+ /* @__PURE__ */ jsxRuntime.jsx(
15827
+ "img",
15828
+ {
15829
+ src: avatar.src,
15830
+ alt: avatar.name ? `${avatar.name}, ${T.liveAvatar}` : T.liveAvatar,
15831
+ loading: "lazy",
15832
+ decoding: "async",
15833
+ width: 128,
15834
+ height: 128,
15835
+ className: "h-32 w-32 rounded-full border border-border object-cover shadow-sm"
15836
+ }
15837
+ ),
15838
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-semibold", children: T.avatarComingSoon }),
15839
+ /* @__PURE__ */ jsxRuntime.jsx(
15840
+ "button",
15841
+ {
15842
+ type: "button",
15843
+ "data-boff-explore": "panel-continue-chat",
15844
+ className: "inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
15845
+ onClick: continueInChat,
15846
+ children: T.continueInChat
15847
+ }
15848
+ )
15849
+ ]
15850
+ }
15851
+ ) : null
15852
+ ] })
14772
15853
  ]
14773
15854
  }
14774
15855
  );
@@ -19593,8 +20674,10 @@ exports.EXPLORE_RECAPTCHA_ACTION = EXPLORE_RECAPTCHA_ACTION;
19593
20674
  exports.ElectronDownloadLink = ElectronDownloadLink;
19594
20675
  exports.ExploreAnswerBody = ExploreAnswerBody;
19595
20676
  exports.ExploreAnswerStyles = ExploreAnswerStyles;
20677
+ exports.ExploreChatProvider = ExploreChatProvider;
19596
20678
  exports.ExploreCta = ExploreCta;
19597
20679
  exports.ExplorePage = ExplorePage;
20680
+ exports.ExplorePanel = ExplorePanel;
19598
20681
  exports.FALLBACK_EXPLORE_LIMITS = FALLBACK_EXPLORE_LIMITS;
19599
20682
  exports.FOOTERLESS_ROUTES = FOOTERLESS_ROUTES;
19600
20683
  exports.Input = Input;
@@ -19688,6 +20771,7 @@ exports.stopSpeaking = stopSpeaking;
19688
20771
  exports.useContentPage = useContentPage;
19689
20772
  exports.useContentPages = useContentPages;
19690
20773
  exports.useExploreChat = useExploreChat;
20774
+ exports.useExploreConversation = useExploreConversation;
19691
20775
  exports.useProduct = useProduct;
19692
20776
  exports.useProductConfig = useProductConfig;
19693
20777
  exports.useProgressiveReveal = useProgressiveReveal;