@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.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
- import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect, useId, version, Children, isValidElement, cloneElement } from 'react';
2
+ import { createContext, forwardRef, useState, useEffect, useMemo, useContext, useCallback, useLayoutEffect, useRef, useId, version, Children, isValidElement, cloneElement } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, Globe, ChevronDown, Search, Rocket, ArrowRight, Download, ImageIcon, ChevronRight, Maximize2, Check, ArrowLeft, Sparkles, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, Info, ExternalLink, ChevronLeft, BookOpenText, Layers, TriangleAlert, FileText, Film, Play, Copy, ThumbsUp, ThumbsDown, Minimize, Maximize, VideoOff, Volume2 } from 'lucide-react';
4
+ import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Sparkles, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, Globe, ChevronDown, Search, Rocket, ArrowRight, Download, ImageIcon, ChevronRight, Maximize2, Check, ArrowLeft, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, Minimize2, Info, ExternalLink, ChevronLeft, BookOpenText, Layers, TriangleAlert, FileText, Film, Play, Copy, ThumbsUp, ThumbsDown, Minimize, Maximize, VideoOff, Volume2 } from 'lucide-react';
5
5
  import ReCAPTCHA4 from 'react-google-recaptcha';
6
6
  import { toast } from 'sonner';
7
7
  import { Helmet } from 'react-helmet-async';
@@ -6444,10 +6444,26 @@ var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
6444
6444
  function isRtlLocale(locale) {
6445
6445
  return RTL_LOCALES.has(locale);
6446
6446
  }
6447
+ var PORTFOLIO_PROMPT = {
6448
+ en: "Which of your products fits a problem like mine?",
6449
+ zh: "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F",
6450
+ 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?",
6451
+ es: "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?",
6452
+ 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",
6453
+ 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?"
6454
+ };
6455
+ var PORTFOLIO_PROMPTS = new Set(
6456
+ Object.values(PORTFOLIO_PROMPT)
6457
+ );
6458
+ function isPortfolioPrompt(prompt) {
6459
+ return PORTFOLIO_PROMPTS.has(prompt);
6460
+ }
6447
6461
  var EN = {
6448
6462
  badge: "AI answers, grounded in our documentation",
6449
6463
  welcomeTitle: "What problem are you trying to solve?",
6450
6464
  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.",
6465
+ welcomeBodyProduct: "Describe the problem in your own words, or ask what {product} does. Every answer comes straight from our documentation.",
6466
+ welcomeBodyScoped: "Describe the problem in your own words. Every answer comes straight from our documentation.",
6451
6467
  tryAsking: "Try asking",
6452
6468
  focusProduct: "Focus on a product",
6453
6469
  allProducts: "All products",
@@ -6457,6 +6473,7 @@ var EN = {
6457
6473
  nextYouCouldAsk: "Next you could ask",
6458
6474
  placeholder: "Describe the problem\u2026",
6459
6475
  placeholderProduct: "Describe a problem, or ask about {product}\u2026",
6476
+ placeholderScoped: "Ask about {product}\u2026",
6460
6477
  send: "Send",
6461
6478
  stop: "Stop",
6462
6479
  newChat: "New chat",
@@ -6478,6 +6495,7 @@ var EN = {
6478
6495
  attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
6479
6496
  noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
6480
6497
  answerDidNotArrive: "That answer didn't come through. Try asking again.",
6498
+ toolBudgetScoped: "That question covers more than I can look through in one go. Try asking about one part of it.",
6481
6499
  askHuman: "ask a human",
6482
6500
  // An offer, not a demand: this row sits under every answer on 38 marketing sites, so the
6483
6501
  // wording has to be shruggable. "Was this helpful?" invites; "Please rate this answer"
@@ -6531,6 +6549,15 @@ var EN = {
6531
6549
  closeVideo: "Close video",
6532
6550
  enterFullScreen: "Full screen",
6533
6551
  exitFullScreen: "Exit full screen",
6552
+ panelTitle: "AI assistant",
6553
+ panelTitleProduct: "{product} assistant",
6554
+ panelViews: "Assistant views",
6555
+ tabChat: "Chat",
6556
+ tabAvatar: "Avatar",
6557
+ closePanel: "Close",
6558
+ liveAvatar: "Live avatar",
6559
+ avatarComingSoon: "Live avatar coming soon",
6560
+ continueInChat: "Continue in Chat",
6534
6561
  videoUnavailable: "This video can't be played right now.",
6535
6562
  groundedIn: "What this answer is based on",
6536
6563
  sourceCountOne: "1 source",
@@ -6543,6 +6570,7 @@ var EN = {
6543
6570
  seoTitle: "Describe a problem, get an answer",
6544
6571
  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.",
6545
6572
  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.",
6573
+ seoDescriptionScoped: "Answers about {product}, drawn from {product}'s documentation, with links to the exact pages they came from.",
6546
6574
  capabilities: [
6547
6575
  "Grounded in our own docs",
6548
6576
  "Compare across the ecosystem",
@@ -6552,13 +6580,15 @@ var EN = {
6552
6580
  "Every course we run lives in a different spreadsheet.",
6553
6581
  "We only hear a machine is down after the line has stopped.",
6554
6582
  "Members quietly stop showing up and we never know why.",
6555
- "Which of your products fits a problem like mine?"
6583
+ PORTFOLIO_PROMPT.en
6556
6584
  ]
6557
6585
  };
6558
6586
  var ZH = {
6559
6587
  badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
6560
6588
  welcomeTitle: "\u4F60\u60F3\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\uFF1F",
6561
6589
  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",
6590
+ 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",
6591
+ 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",
6562
6592
  tryAsking: "\u8BD5\u7740\u95EE",
6563
6593
  focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
6564
6594
  allProducts: "\u5168\u90E8\u4EA7\u54C1",
@@ -6568,6 +6598,7 @@ var ZH = {
6568
6598
  nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
6569
6599
  placeholder: "\u63CF\u8FF0\u4F60\u7684\u95EE\u9898\u2026",
6570
6600
  placeholderProduct: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8BE2\u95EE {product}\u2026",
6601
+ placeholderScoped: "\u5C31 {product} \u63D0\u95EE\u2026",
6571
6602
  send: "\u53D1\u9001",
6572
6603
  stop: "\u505C\u6B62",
6573
6604
  newChat: "\u65B0\u5BF9\u8BDD",
@@ -6589,6 +6620,7 @@ var ZH = {
6589
6620
  attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
6590
6621
  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",
6591
6622
  answerDidNotArrive: "\u8FD9\u6761\u56DE\u7B54\u6CA1\u6709\u8FD4\u56DE\u3002\u8BF7\u518D\u95EE\u4E00\u6B21\u3002",
6623
+ 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",
6592
6624
  askHuman: "\u8054\u7CFB\u6211\u4EEC",
6593
6625
  feedbackPrompt: "\u8FD9\u4E2A\u56DE\u7B54\u6709\u5E2E\u52A9\u5417\uFF1F",
6594
6626
  feedbackHelpful: "\u6709\u5E2E\u52A9",
@@ -6639,6 +6671,15 @@ var ZH = {
6639
6671
  closeVideo: "\u5173\u95ED\u89C6\u9891",
6640
6672
  enterFullScreen: "\u5168\u5C4F",
6641
6673
  exitFullScreen: "\u9000\u51FA\u5168\u5C4F",
6674
+ panelTitle: "AI \u52A9\u624B",
6675
+ panelTitleProduct: "{product} \u52A9\u624B",
6676
+ panelViews: "\u52A9\u624B\u89C6\u56FE",
6677
+ tabChat: "\u804A\u5929",
6678
+ tabAvatar: "\u865A\u62DF\u5F62\u8C61",
6679
+ closePanel: "\u5173\u95ED",
6680
+ liveAvatar: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61",
6681
+ avatarComingSoon: "\u5B9E\u65F6\u865A\u62DF\u5F62\u8C61\u5373\u5C06\u63A8\u51FA",
6682
+ continueInChat: "\u5728\u804A\u5929\u4E2D\u7EE7\u7EED",
6642
6683
  videoUnavailable: "\u6682\u65F6\u65E0\u6CD5\u64AD\u653E\u6B64\u89C6\u9891\u3002",
6643
6684
  groundedIn: "\u8FD9\u4E2A\u56DE\u7B54\u7684\u4F9D\u636E",
6644
6685
  sourceCountOne: "1 \u4E2A\u6765\u6E90",
@@ -6651,18 +6692,21 @@ var ZH = {
6651
6692
  seoTitle: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u83B7\u5F97\u7B54\u6848",
6652
6693
  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",
6653
6694
  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",
6695
+ 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",
6654
6696
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
6655
6697
  prompts: [
6656
6698
  "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
6657
6699
  "\u673A\u5668\u505C\u4E86\uFF0C\u8981\u7B49\u6574\u6761\u7EBF\u505C\u4E0B\u6765\u624D\u77E5\u9053\u3002",
6658
6700
  "\u4F1A\u5458\u6162\u6162\u5C31\u4E0D\u6765\u4E86\uFF0C\u6211\u4EEC\u4E5F\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\u3002",
6659
- "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F"
6701
+ PORTFOLIO_PROMPT.zh
6660
6702
  ]
6661
6703
  };
6662
6704
  var HI = {
6663
6705
  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",
6664
6706
  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?",
6665
6707
  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",
6708
+ 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",
6709
+ 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",
6666
6710
  tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
6667
6711
  focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
6668
6712
  allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
@@ -6672,6 +6716,7 @@ var HI = {
6672
6716
  nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
6673
6717
  placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902\u2026",
6674
6718
  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",
6719
+ placeholderScoped: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6675
6720
  send: "\u092D\u0947\u091C\u0947\u0902",
6676
6721
  stop: "\u0930\u094B\u0915\u0947\u0902",
6677
6722
  newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
@@ -6693,6 +6738,7 @@ var HI = {
6693
6738
  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",
6694
6739
  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",
6695
6740
  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",
6741
+ 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",
6696
6742
  askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
6697
6743
  feedbackPrompt: "\u0915\u094D\u092F\u093E \u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u092E\u0926\u0926\u0917\u093E\u0930 \u0925\u093E?",
6698
6744
  feedbackHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930",
@@ -6743,6 +6789,15 @@ var HI = {
6743
6789
  closeVideo: "\u0935\u0940\u0921\u093F\u092F\u094B \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6744
6790
  enterFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928",
6745
6791
  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",
6792
+ panelTitle: "AI \u0938\u0939\u093E\u092F\u0915",
6793
+ panelTitleProduct: "{product} \u0938\u0939\u093E\u092F\u0915",
6794
+ panelViews: "\u0938\u0939\u093E\u092F\u0915 \u0926\u0943\u0936\u094D\u092F",
6795
+ tabChat: "\u091A\u0948\u091F",
6796
+ tabAvatar: "\u0905\u0935\u0924\u093E\u0930",
6797
+ closePanel: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6798
+ liveAvatar: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930",
6799
+ avatarComingSoon: "\u0932\u093E\u0907\u0935 \u0905\u0935\u0924\u093E\u0930 \u091C\u0932\u094D\u0926 \u0906 \u0930\u0939\u093E \u0939\u0948",
6800
+ continueInChat: "\u091A\u0948\u091F \u092E\u0947\u0902 \u091C\u093E\u0930\u0940 \u0930\u0916\u0947\u0902",
6746
6801
  videoUnavailable: "\u092F\u0939 \u0935\u0940\u0921\u093F\u092F\u094B \u0905\u092D\u0940 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u0924\u093E\u0964",
6747
6802
  groundedIn: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948",
6748
6803
  sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
@@ -6755,6 +6810,7 @@ var HI = {
6755
6810
  seoTitle: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902",
6756
6811
  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",
6757
6812
  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",
6813
+ 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",
6758
6814
  capabilities: [
6759
6815
  "\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",
6760
6816
  "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
@@ -6764,13 +6820,15 @@ var HI = {
6764
6820
  "\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",
6765
6821
  "\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",
6766
6822
  "\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",
6767
- "\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?"
6823
+ PORTFOLIO_PROMPT.hi
6768
6824
  ]
6769
6825
  };
6770
6826
  var ES = {
6771
6827
  badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
6772
6828
  welcomeTitle: "\xBFQu\xE9 problema quieres resolver?",
6773
6829
  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.",
6830
+ welcomeBodyProduct: "Describe el problema con tus propias palabras o pregunta qu\xE9 hace {product}. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6831
+ welcomeBodyScoped: "Describe el problema con tus propias palabras. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6774
6832
  tryAsking: "Prueba a preguntar",
6775
6833
  focusProduct: "Centrarse en un producto",
6776
6834
  allProducts: "Todos los productos",
@@ -6780,6 +6838,7 @@ var ES = {
6780
6838
  nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
6781
6839
  placeholder: "Describe el problema\u2026",
6782
6840
  placeholderProduct: "Describe un problema o pregunta por {product}\u2026",
6841
+ placeholderScoped: "Pregunta sobre {product}\u2026",
6783
6842
  send: "Enviar",
6784
6843
  stop: "Detener",
6785
6844
  newChat: "Nueva conversaci\xF3n",
@@ -6801,6 +6860,7 @@ var ES = {
6801
6860
  attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
6802
6861
  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",
6803
6862
  answerDidNotArrive: "Esa respuesta no lleg\xF3. Int\xE9ntalo de nuevo.",
6863
+ toolBudgetScoped: "Esa pregunta abarca m\xE1s de lo que puedo revisar de una vez. Prueba a preguntar por una parte de ella.",
6804
6864
  askHuman: "habla con una persona",
6805
6865
  feedbackPrompt: "\xBFTe ha servido?",
6806
6866
  feedbackHelpful: "Me sirve",
@@ -6851,6 +6911,15 @@ var ES = {
6851
6911
  closeVideo: "Cerrar v\xEDdeo",
6852
6912
  enterFullScreen: "Pantalla completa",
6853
6913
  exitFullScreen: "Salir de pantalla completa",
6914
+ panelTitle: "Asistente de IA",
6915
+ panelTitleProduct: "Asistente de {product}",
6916
+ panelViews: "Vistas del asistente",
6917
+ tabChat: "Chat",
6918
+ tabAvatar: "Avatar",
6919
+ closePanel: "Cerrar",
6920
+ liveAvatar: "Avatar en vivo",
6921
+ avatarComingSoon: "Avatar en vivo: pr\xF3ximamente",
6922
+ continueInChat: "Continuar en el chat",
6854
6923
  videoUnavailable: "Ahora mismo no se puede reproducir este v\xEDdeo.",
6855
6924
  groundedIn: "En qu\xE9 se basa esta respuesta",
6856
6925
  sourceCountOne: "1 fuente",
@@ -6863,6 +6932,7 @@ var ES = {
6863
6932
  seoTitle: "Describe un problema y obt\xE9n una respuesta",
6864
6933
  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.",
6865
6934
  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.",
6935
+ seoDescriptionScoped: "Respuestas sobre {product}, extra\xEDdas de la documentaci\xF3n de {product}, con enlaces a las p\xE1ginas exactas de las que proceden.",
6866
6936
  capabilities: [
6867
6937
  "Basado en nuestra documentaci\xF3n",
6868
6938
  "Compara todo el ecosistema",
@@ -6872,13 +6942,15 @@ var ES = {
6872
6942
  "Cada curso que damos est\xE1 en una hoja de c\xE1lculo distinta.",
6873
6943
  "Nos enteramos de que una m\xE1quina falla cuando para la l\xEDnea.",
6874
6944
  "Los socios dejan de venir poco a poco y nunca sabemos por qu\xE9.",
6875
- "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?"
6945
+ PORTFOLIO_PROMPT.es
6876
6946
  ]
6877
6947
  };
6878
6948
  var AR = {
6879
6949
  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",
6880
6950
  welcomeTitle: "\u0645\u0627 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u062D\u0627\u0648\u0644 \u062D\u0644\u0647\u0627\u061F",
6881
6951
  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.",
6952
+ 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.",
6953
+ 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.",
6882
6954
  tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
6883
6955
  focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
6884
6956
  allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
@@ -6888,6 +6960,7 @@ var AR = {
6888
6960
  nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
6889
6961
  placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u2026",
6890
6962
  placeholderProduct: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6963
+ placeholderScoped: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6891
6964
  send: "\u0625\u0631\u0633\u0627\u0644",
6892
6965
  stop: "\u0625\u064A\u0642\u0627\u0641",
6893
6966
  newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
@@ -6909,6 +6982,7 @@ var AR = {
6909
6982
  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}}.",
6910
6983
  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",
6911
6984
  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.",
6985
+ 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.",
6912
6986
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
6913
6987
  feedbackPrompt: "\u0647\u0644 \u0643\u0627\u0646\u062A \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0645\u0641\u064A\u062F\u0629\u061F",
6914
6988
  feedbackHelpful: "\u0645\u0641\u064A\u062F\u0629",
@@ -6959,6 +7033,15 @@ var AR = {
6959
7033
  closeVideo: "\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
6960
7034
  enterFullScreen: "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
6961
7035
  exitFullScreen: "\u0627\u0644\u062E\u0631\u0648\u062C \u0645\u0646 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
7036
+ panelTitle: "\u0645\u0633\u0627\u0639\u062F \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
7037
+ panelTitleProduct: "\u0645\u0633\u0627\u0639\u062F {product}",
7038
+ panelViews: "\u0637\u0631\u0642 \u0639\u0631\u0636 \u0627\u0644\u0645\u0633\u0627\u0639\u062F",
7039
+ tabChat: "\u062F\u0631\u062F\u0634\u0629",
7040
+ tabAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631",
7041
+ closePanel: "\u0625\u063A\u0644\u0627\u0642",
7042
+ liveAvatar: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631",
7043
+ avatarComingSoon: "\u0627\u0644\u0623\u0641\u0627\u062A\u0627\u0631 \u0627\u0644\u0645\u0628\u0627\u0634\u0631 \u0642\u0631\u064A\u0628\u064B\u0627",
7044
+ continueInChat: "\u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629 \u0641\u064A \u0627\u0644\u062F\u0631\u062F\u0634\u0629",
6962
7045
  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.",
6963
7046
  groundedIn: "\u0639\u0644\u0649 \u0645\u0627\u0630\u0627 \u062A\u0633\u062A\u0646\u062F \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
6964
7047
  sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
@@ -6971,6 +7054,7 @@ var AR = {
6971
7054
  seoTitle: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629",
6972
7055
  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.",
6973
7056
  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.",
7057
+ 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.",
6974
7058
  capabilities: [
6975
7059
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
6976
7060
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -6980,13 +7064,15 @@ var AR = {
6980
7064
  "\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.",
6981
7065
  "\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.",
6982
7066
  "\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.",
6983
- "\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"
7067
+ PORTFOLIO_PROMPT.ar
6984
7068
  ]
6985
7069
  };
6986
7070
  var TA = {
6987
7071
  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",
6988
7072
  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?",
6989
7073
  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.",
7074
+ 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.",
7075
+ 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.",
6990
7076
  tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6991
7077
  focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
6992
7078
  allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
@@ -6996,6 +7082,7 @@ var TA = {
6996
7082
  nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
6997
7083
  placeholder: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6998
7084
  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",
7085
+ placeholderScoped: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6999
7086
  send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
7000
7087
  stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
7001
7088
  newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
@@ -7017,6 +7104,7 @@ var TA = {
7017
7104
  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.",
7018
7105
  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",
7019
7106
  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.",
7107
+ 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.",
7020
7108
  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",
7021
7109
  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?",
7022
7110
  feedbackHelpful: "\u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1",
@@ -7067,6 +7155,15 @@ var TA = {
7067
7155
  closeVideo: "\u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0BAE\u0BC2\u0B9F\u0BC1",
7068
7156
  enterFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8",
7069
7157
  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",
7158
+ panelTitle: "AI \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD",
7159
+ panelTitleProduct: "{product} \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD",
7160
+ panelViews: "\u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9A\u0BBF\u0B95\u0BB3\u0BCD",
7161
+ tabChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8",
7162
+ tabAvatar: "\u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
7163
+ closePanel: "\u0BAE\u0BC2\u0B9F\u0BC1",
7164
+ liveAvatar: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD",
7165
+ avatarComingSoon: "\u0BA8\u0BC7\u0BB0\u0BB2\u0BC8 \u0B85\u0BB5\u0BA4\u0BBE\u0BB0\u0BCD \u0BB5\u0BBF\u0BB0\u0BC8\u0BB5\u0BBF\u0BB2\u0BCD",
7166
+ continueInChat: "\u0B85\u0BB0\u0B9F\u0BCD\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BB5\u0BC1\u0BAE\u0BCD",
7070
7167
  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.",
7071
7168
  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",
7072
7169
  sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
@@ -7079,6 +7176,7 @@ var TA = {
7079
7176
  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",
7080
7177
  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.",
7081
7178
  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.",
7179
+ 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.",
7082
7180
  capabilities: [
7083
7181
  "\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",
7084
7182
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -7088,7 +7186,7 @@ var TA = {
7088
7186
  "\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.",
7089
7187
  "\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.",
7090
7188
  "\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.",
7091
- "\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?"
7189
+ PORTFOLIO_PROMPT.ta
7092
7190
  ]
7093
7191
  };
7094
7192
  var STRINGS = {
@@ -10223,7 +10321,9 @@ function useExploreChat(options = {}) {
10223
10321
  pollTimeoutMs = DEFAULT_POLL_TIMEOUT_MS,
10224
10322
  storageKey = DEFAULT_STORAGE_KEY,
10225
10323
  persist = true,
10226
- onSend
10324
+ onSend,
10325
+ enabled = true,
10326
+ shareToken: shareTokenOption
10227
10327
  } = options;
10228
10328
  const client = useWebSDK();
10229
10329
  const { productId } = useWebSDKConfig();
@@ -10261,7 +10361,7 @@ function useExploreChat(options = {}) {
10261
10361
  const [hasConversation, setHasConversation] = useState(false);
10262
10362
  const shareTokenRef = useRef(void 0);
10263
10363
  if (shareTokenRef.current === void 0) {
10264
- shareTokenRef.current = readShareToken();
10364
+ shareTokenRef.current = shareTokenOption === void 0 ? readShareToken() : shareTokenOption;
10265
10365
  }
10266
10366
  const isSharedView = shareTokenRef.current !== null;
10267
10367
  const catalogRef = useRef(catalog);
@@ -10299,6 +10399,7 @@ function useExploreChat(options = {}) {
10299
10399
  };
10300
10400
  }, []);
10301
10401
  useEffect(() => {
10402
+ if (!enabled) return;
10302
10403
  const shareToken = shareTokenRef.current;
10303
10404
  if (!shareToken) return;
10304
10405
  let cancelled = false;
@@ -10333,8 +10434,9 @@ function useExploreChat(options = {}) {
10333
10434
  return () => {
10334
10435
  cancelled = true;
10335
10436
  };
10336
- }, [client]);
10437
+ }, [client, enabled]);
10337
10438
  useEffect(() => {
10439
+ if (!enabled) return;
10338
10440
  if (shareTokenRef.current !== null) return;
10339
10441
  if (!persist) {
10340
10442
  setHydrated(true);
@@ -10359,9 +10461,10 @@ function useExploreChat(options = {}) {
10359
10461
  setTurnCount(turns);
10360
10462
  }
10361
10463
  setHydrated(true);
10362
- }, [persist, rememberConversationToken, storageKey]);
10464
+ }, [persist, rememberConversationToken, storageKey, enabled]);
10363
10465
  useEffect(() => {
10364
- if (!persist || !hydrated || typeof window === "undefined") return;
10466
+ if (!persist || !hydrated || isSharedView || typeof window === "undefined")
10467
+ return;
10365
10468
  try {
10366
10469
  const payload = {
10367
10470
  conversationToken: conversationTokenRef.current,
@@ -10375,10 +10478,10 @@ function useExploreChat(options = {}) {
10375
10478
  window.localStorage.setItem(storageKey, JSON.stringify(payload));
10376
10479
  } catch {
10377
10480
  }
10378
- }, [persist, hydrated, storageKey, messages, focusProduct]);
10481
+ }, [persist, hydrated, isSharedView, storageKey, messages, focusProduct]);
10379
10482
  useEffect(() => {
10380
10483
  messagesRef.current = messages;
10381
- if (!persist || !hydrated) return;
10484
+ if (!persist || !hydrated || isSharedView) return;
10382
10485
  const settled = messages.some(
10383
10486
  (m) => m.role === "ASSISTANT" && (m.status === "COMPLETED" || m.status === "FAILED")
10384
10487
  );
@@ -10390,8 +10493,9 @@ function useExploreChat(options = {}) {
10390
10493
  focusProduct: focusProductRef.current
10391
10494
  })
10392
10495
  );
10393
- }, [messages, persist, hydrated, storageKey]);
10496
+ }, [messages, persist, hydrated, isSharedView, storageKey]);
10394
10497
  useEffect(() => {
10498
+ if (!enabled) return;
10395
10499
  let cancelled = false;
10396
10500
  const load = async () => {
10397
10501
  const variables = { productSlug: productSlug ?? null };
@@ -10432,7 +10536,7 @@ function useExploreChat(options = {}) {
10432
10536
  return () => {
10433
10537
  cancelled = true;
10434
10538
  };
10435
- }, [client, productSlug, fallbackCatalog, bakedRaw]);
10539
+ }, [client, productSlug, fallbackCatalog, bakedRaw, enabled]);
10436
10540
  const startPolling = useCallback(
10437
10541
  (conversationToken, messageId) => {
10438
10542
  pollGenerationRef.current += 1;
@@ -10929,6 +11033,166 @@ function makeOptimisticId() {
10929
11033
  optimisticCounter += 1;
10930
11034
  return `boff-explore-local-${Date.now()}-${optimisticCounter}`;
10931
11035
  }
11036
+ var ExploreConversationContext = createContext(null);
11037
+ var ExploreCatalogProductsContext = createContext(null);
11038
+ function useExploreConversation(options = {}) {
11039
+ const {
11040
+ productSlug,
11041
+ locale,
11042
+ examplePrompts,
11043
+ onSend,
11044
+ pageUrl,
11045
+ enabled,
11046
+ shareToken
11047
+ } = options;
11048
+ const urlAtMount = useMemo(
11049
+ () => typeof window === "undefined" ? void 0 : window.location.href,
11050
+ []
11051
+ );
11052
+ const T = useMemo(
11053
+ () => exploreStrings(resolveExploreLocale(locale)),
11054
+ [locale]
11055
+ );
11056
+ const chat = useExploreChat({
11057
+ productSlug,
11058
+ pageUrl: pageUrl ?? urlAtMount,
11059
+ onSend,
11060
+ // Locale-aware, so a catalog outage degrades to a translated welcome rather than an English one.
11061
+ examplePrompts: examplePrompts ?? T.prompts,
11062
+ fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody },
11063
+ ...enabled === void 0 ? {} : { enabled },
11064
+ ...shareToken === void 0 ? {} : { shareToken }
11065
+ });
11066
+ const [draft, setDraft] = useState("");
11067
+ const [staged, setStaged] = useState([]);
11068
+ return useMemo(
11069
+ () => ({ ...chat, draft, setDraft, staged, setStaged }),
11070
+ [chat, draft, staged]
11071
+ );
11072
+ }
11073
+ function ExploreChatProvider({
11074
+ enabled,
11075
+ children,
11076
+ ...options
11077
+ }) {
11078
+ const [started, setStarted] = useState(enabled);
11079
+ if (enabled && !started) setStarted(true);
11080
+ const conversation = useExploreConversation({
11081
+ ...options,
11082
+ // `enabled` as well as `started`: on the render that first sees `enabled`, the latch above has only been queued.
11083
+ enabled: enabled || started
11084
+ });
11085
+ return /* @__PURE__ */ jsx(ExploreConversationContext.Provider, { value: conversation, children: /* @__PURE__ */ jsx(
11086
+ ExploreCatalogProductsContext.Provider,
11087
+ {
11088
+ value: conversation.catalog.products,
11089
+ children
11090
+ }
11091
+ ) });
11092
+ }
11093
+
11094
+ // src/components/explore-scope.ts
11095
+ function pinnedProductSlug(scope, productSlug) {
11096
+ if (scope !== "product" || productSlug === void 0) return null;
11097
+ return productSlug.trim() === "" ? null : productSlug;
11098
+ }
11099
+ function productNameFor(products, slug, given) {
11100
+ const own = given?.trim();
11101
+ if (own) return own;
11102
+ return products.find((product) => isSameProductSlug(product.slug, slug))?.name ?? null;
11103
+ }
11104
+ var NAME_CHARACTER = /[a-z0-9]/;
11105
+ var MIN_SPELLING_LENGTH = 3;
11106
+ function siteNameOf(website) {
11107
+ if (!website) return "";
11108
+ try {
11109
+ const labels = new URL(website).hostname.split(".");
11110
+ return labels.length >= 2 ? labels[labels.length - 2] ?? "" : "";
11111
+ } catch {
11112
+ return "";
11113
+ }
11114
+ }
11115
+ function spellingsOf(product) {
11116
+ const spellings = [
11117
+ product.name,
11118
+ product.name.replace(/\s+/g, ""),
11119
+ ...productSlugVariants(product.slug),
11120
+ siteNameOf(product.website)
11121
+ ].map((spelling) => spelling.trim().toLowerCase()).filter((spelling) => spelling.length >= MIN_SPELLING_LENGTH);
11122
+ return [...new Set(spellings)];
11123
+ }
11124
+ function wordAt(text, spelling, from = 0) {
11125
+ for (let at = text.indexOf(spelling, from); at !== -1; at = text.indexOf(spelling, at + 1)) {
11126
+ const before = text[at - 1];
11127
+ const after = text[at + spelling.length];
11128
+ const bounded = (before === void 0 || !NAME_CHARACTER.test(before)) && (after === void 0 || !NAME_CHARACTER.test(after));
11129
+ if (bounded) return at;
11130
+ }
11131
+ return -1;
11132
+ }
11133
+ function withoutWord(text, spelling) {
11134
+ let result = text;
11135
+ for (let at = wordAt(result, spelling); at !== -1; at = wordAt(result, spelling, at + spelling.length)) {
11136
+ result = `${result.slice(0, at)}${" ".repeat(spelling.length)}${result.slice(at + spelling.length)}`;
11137
+ }
11138
+ return result;
11139
+ }
11140
+ function anotherProductMatcher(products, pinnedSlug) {
11141
+ const own = productSlugVariants(pinnedSlug).map((slug) => slug.toLowerCase());
11142
+ const others = [];
11143
+ for (const product of products) {
11144
+ if (isSameProductSlug(product.slug, pinnedSlug)) {
11145
+ own.push(...spellingsOf(product));
11146
+ } else {
11147
+ others.push(...spellingsOf(product));
11148
+ }
11149
+ }
11150
+ const ownSpellings = [...new Set(own)].sort((a, b) => b.length - a.length);
11151
+ const otherSpellings = [...new Set(others)].filter(
11152
+ (spelling) => !ownSpellings.includes(spelling)
11153
+ );
11154
+ return (text) => {
11155
+ let rest = text.toLowerCase();
11156
+ for (const spelling of ownSpellings) rest = withoutWord(rest, spelling);
11157
+ return otherSpellings.some((spelling) => wordAt(rest, spelling) !== -1);
11158
+ };
11159
+ }
11160
+ function distinctPrompts(prompts) {
11161
+ return [...new Set(prompts.filter((prompt) => prompt.trim() !== ""))];
11162
+ }
11163
+ function productScopedPrompts(hostPrompts, catalogPrompts, namesAnotherProduct) {
11164
+ const own = distinctPrompts(hostPrompts ?? []);
11165
+ if (own.length > 0) return own;
11166
+ return distinctPrompts(
11167
+ catalogPrompts.filter(
11168
+ (prompt) => !isPortfolioPrompt(prompt) && !namesAnotherProduct(prompt)
11169
+ )
11170
+ );
11171
+ }
11172
+ function productScopedHighlights(highlights, pinnedSlug, namesAnotherProduct) {
11173
+ return highlights.filter(
11174
+ (highlight) => isSameProductSlug(highlight.product, pinnedSlug) && !namesAnotherProduct(`${highlight.title}
11175
+ ${highlight.alt}`)
11176
+ );
11177
+ }
11178
+ function productScopedError(error, toolBudgetMessage) {
11179
+ return error.code === "TOOL_BUDGET" ? { ...error, message: toolBudgetMessage } : error;
11180
+ }
11181
+ function isDevelopmentBuild() {
11182
+ try {
11183
+ return process.env.NODE_ENV !== "production";
11184
+ } catch {
11185
+ return false;
11186
+ }
11187
+ }
11188
+ var warnedWithoutSlug = false;
11189
+ function warnProductScopeWithoutSlug() {
11190
+ if (warnedWithoutSlug || !isDevelopmentBuild()) return;
11191
+ warnedWithoutSlug = true;
11192
+ console.warn(
11193
+ `[WebSDK] Explore scope="product" needs a productSlug. Without one the assistant stays the portfolio's: every product, and a product picker.`
11194
+ );
11195
+ }
10932
11196
  var DRAIN_TARGET_MS = 1200;
10933
11197
  var MIN_CHARS_PER_SECOND = 90;
10934
11198
  var MAX_CHARS_PER_SECOND = 2200;
@@ -12010,21 +12274,25 @@ var CAPABILITIES = [
12010
12274
  {
12011
12275
  icon: BookOpenText,
12012
12276
  title: "Grounded in our own docs",
12013
- body: "Every answer comes from published product pages and documentation \u2014 never invented."
12277
+ body: "Every answer comes from published product pages and documentation \u2014 never invented.",
12278
+ invitesOtherProducts: false
12014
12279
  },
12015
12280
  {
12016
12281
  icon: Layers,
12017
12282
  title: "Compare across the ecosystem",
12018
- body: "Ask which product fits your team, or how two of them work together."
12283
+ body: "Ask which product fits your team, or how two of them work together.",
12284
+ invitesOtherProducts: true
12019
12285
  },
12020
12286
  {
12021
12287
  icon: Link2,
12022
12288
  title: "Straight to the right page",
12023
- body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
12289
+ body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting.",
12290
+ invitesOtherProducts: false
12024
12291
  }
12025
12292
  ];
12026
12293
  var MIN_VISIBLE_FRACTION = 0.25;
12027
12294
  var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
12295
+ var NO_PRODUCTS = [];
12028
12296
  var CTA_VARIANTS = {
12029
12297
  CONTACT: "default",
12030
12298
  WAITLIST: "default",
@@ -13573,29 +13841,40 @@ function WelcomeState({
13573
13841
  focusProduct,
13574
13842
  onPrompt,
13575
13843
  onFocus,
13576
- disabled
13844
+ disabled,
13845
+ heading = "h1",
13846
+ productScoped = false
13577
13847
  }) {
13848
+ const Heading = heading;
13578
13849
  return /* @__PURE__ */ jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-4 sm:py-5", children: [
13579
13850
  /* @__PURE__ */ jsxs("div", { className: "boff-explore-rise text-center", children: [
13580
13851
  /* @__PURE__ */ jsxs("span", { className: "boff-explore-hero-badge inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-3 py-1 text-xs font-medium text-muted-foreground", children: [
13581
13852
  /* @__PURE__ */ jsx(Sparkles, { className: "h-3.5 w-3.5" }),
13582
13853
  T.badge
13583
13854
  ] }),
13584
- /* @__PURE__ */ jsx("h1", { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
13855
+ /* @__PURE__ */ jsx(Heading, { className: "mt-2 text-balance break-words text-2xl font-bold tracking-tight sm:text-3xl", children: title }),
13585
13856
  /* @__PURE__ */ jsx("p", { className: "mx-auto mt-2 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground", children: body })
13586
13857
  ] }),
13587
- /* @__PURE__ */ jsx("ul", { className: "boff-explore-capabilities boff-explore-rise boff-explore-rise-1 mt-4 grid grid-cols-3 gap-2 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxs(
13588
- "li",
13858
+ /* @__PURE__ */ jsx(
13859
+ "ul",
13589
13860
  {
13590
- 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",
13591
- children: [
13592
- /* @__PURE__ */ 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__ */ jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
13593
- /* @__PURE__ */ jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-snug", children: T.capabilities[i] ?? "" }),
13594
- /* @__PURE__ */ jsx("p", { className: "mt-1 hidden text-xs leading-snug text-muted-foreground lg:block", children: capBody })
13595
- ]
13596
- },
13597
- i
13598
- )) }),
13861
+ 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`,
13862
+ children: CAPABILITIES.map(
13863
+ ({ icon: Icon, body: capBody, invitesOtherProducts }, i) => productScoped && invitesOtherProducts ? null : /* @__PURE__ */ jsxs(
13864
+ "li",
13865
+ {
13866
+ 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",
13867
+ children: [
13868
+ /* @__PURE__ */ 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__ */ jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
13869
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-snug", children: T.capabilities[i] ?? "" }),
13870
+ /* @__PURE__ */ jsx("p", { className: "mt-1 hidden text-xs leading-snug text-muted-foreground lg:block", children: capBody })
13871
+ ]
13872
+ },
13873
+ i
13874
+ )
13875
+ )
13876
+ }
13877
+ ),
13599
13878
  prompts.length > 0 ? /* @__PURE__ */ jsx("div", { className: "boff-explore-rise boff-explore-rise-2 mt-4", children: /* @__PURE__ */ jsx(
13600
13879
  PromptCarousel,
13601
13880
  {
@@ -13636,19 +13915,39 @@ function exploreQuestionHref(question, base = "/explore") {
13636
13915
  const joiner = base.includes("?") ? "&" : "?";
13637
13916
  return `${base}${joiner}q=${encodeURIComponent(trimmed)}`;
13638
13917
  }
13639
- function ExplorePage({
13918
+ function ExplorePage(props) {
13919
+ const shared = useContext(ExploreConversationContext);
13920
+ return shared ? /* @__PURE__ */ jsx(ExploreView, { ...props, conversation: shared }) : /* @__PURE__ */ jsx(StandaloneExplorePage, { ...props });
13921
+ }
13922
+ function StandaloneExplorePage(props) {
13923
+ const conversation = useExploreConversation({
13924
+ productSlug: props.productSlug,
13925
+ locale: props.locale,
13926
+ examplePrompts: props.examplePrompts,
13927
+ onSend: props.onSend
13928
+ });
13929
+ return /* @__PURE__ */ jsx(ExploreView, { ...props, conversation });
13930
+ }
13931
+ function ExploreView({
13640
13932
  seo,
13641
13933
  productSlug,
13642
- examplePrompts,
13643
13934
  className,
13644
13935
  heightMode = "viewport",
13645
13936
  viewportOffset,
13646
13937
  onNavigate,
13647
- onSend,
13648
13938
  welcomeTitle,
13649
13939
  welcomeBody,
13650
- locale
13940
+ locale,
13941
+ presentation = "page",
13942
+ active = true,
13943
+ explorePath = "/explore",
13944
+ examplePrompts,
13945
+ scope,
13946
+ productName,
13947
+ conversation
13651
13948
  }) {
13949
+ const panel = presentation === "panel";
13950
+ const viewportPage = !panel && heightMode === "viewport";
13652
13951
  const pageUrl = useMemo(
13653
13952
  () => typeof window === "undefined" ? void 0 : window.location.href,
13654
13953
  []
@@ -13684,26 +13983,21 @@ function ExplorePage({
13684
13983
  escalate,
13685
13984
  canEscalate,
13686
13985
  createShareLink,
13687
- isSharedView
13688
- } = useExploreChat({
13689
- productSlug,
13690
- pageUrl,
13691
- onSend,
13692
- // Locale-aware, so a catalog outage degrades to a translated welcome rather than an
13693
- // English one. `T.prompts` seeds the chips the same way.
13694
- examplePrompts: examplePrompts ?? T.prompts,
13695
- fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody }
13696
- });
13697
- const [draft, setDraft] = useState("");
13986
+ isSharedView,
13987
+ draft,
13988
+ setDraft,
13989
+ staged,
13990
+ setStaged
13991
+ } = conversation;
13698
13992
  const textareaRef = useRef(null);
13699
13993
  useEffect(() => {
13700
- if (typeof window === "undefined") return;
13994
+ if (typeof window === "undefined" || panel) return;
13701
13995
  const params = new URLSearchParams(window.location.search);
13702
13996
  if (params.has("c")) return;
13703
13997
  const question = params.get("q")?.trim();
13704
13998
  if (!question) return;
13705
13999
  setDraft(question.slice(0, EXPLORE_PREFILL_MAX_LENGTH));
13706
- }, []);
14000
+ }, [panel, setDraft]);
13707
14001
  const [historyOpen, setHistoryOpen] = useState(false);
13708
14002
  const speechStopRef = useRef(() => void 0);
13709
14003
  const stopDictation = useCallback(() => {
@@ -13719,8 +14013,12 @@ function ExplorePage({
13719
14013
  }
13720
14014
  });
13721
14015
  speechStopRef.current = speech.stop;
14016
+ useEffect(() => {
14017
+ if (active) return;
14018
+ stopDictation();
14019
+ stopSpeaking();
14020
+ }, [active, stopDictation]);
13722
14021
  const [disclaimerOpen, setDisclaimerOpen] = useState(false);
13723
- const [staged, setStaged] = useState([]);
13724
14022
  const [attachmentNotice, setAttachmentNotice] = useState(null);
13725
14023
  const fileInputRef = useRef(null);
13726
14024
  const stagedRef = useRef([]);
@@ -13740,16 +14038,47 @@ function ExplorePage({
13740
14038
  const maxLength = catalog.limits.maxMessageLength;
13741
14039
  const overLimit = draft.length > maxLength;
13742
14040
  const canSubmit = canSend && draft.trim().length > 0 && !overLimit && !busy;
13743
- const resolvedTitle = welcomeTitle ?? catalog.welcomeTitle;
13744
- const resolvedBody = welcomeBody ?? catalog.welcomeBody;
13745
- const prompts = catalog.examplePrompts;
14041
+ const pinnedSlug = pinnedProductSlug(scope, productSlug);
14042
+ useEffect(() => {
14043
+ if (scope === "product" && pinnedSlug === null) {
14044
+ warnProductScopeWithoutSlug();
14045
+ }
14046
+ }, [pinnedSlug, scope]);
14047
+ const pinnedName = useMemo(
14048
+ () => pinnedSlug === null ? null : productNameFor(catalog.products, pinnedSlug, productName),
14049
+ [catalog.products, pinnedSlug, productName]
14050
+ );
14051
+ const namesAnotherProduct = useMemo(
14052
+ () => pinnedSlug === null ? null : anotherProductMatcher(catalog.products, pinnedSlug),
14053
+ [catalog.products, pinnedSlug]
14054
+ );
14055
+ const resolvedTitle = welcomeTitle ?? (namesAnotherProduct?.(catalog.welcomeTitle) ? T.welcomeTitle : catalog.welcomeTitle);
14056
+ const resolvedBody = welcomeBody ?? (pinnedSlug === null ? catalog.welcomeBody : pinnedName === null ? T.welcomeBodyScoped : fill(T.welcomeBodyProduct, { product: pinnedName }));
14057
+ const prompts = useMemo(
14058
+ () => namesAnotherProduct === null ? catalog.examplePrompts : productScopedPrompts(
14059
+ examplePrompts,
14060
+ catalog.examplePrompts,
14061
+ namesAnotherProduct
14062
+ ),
14063
+ [catalog.examplePrompts, examplePrompts, namesAnotherProduct]
14064
+ );
14065
+ const conceptHighlights = useMemo(
14066
+ () => pinnedSlug === null || namesAnotherProduct === null ? catalog.conceptHighlights : productScopedHighlights(
14067
+ catalog.conceptHighlights,
14068
+ pinnedSlug,
14069
+ namesAnotherProduct
14070
+ ),
14071
+ [catalog.conceptHighlights, namesAnotherProduct, pinnedSlug]
14072
+ );
13746
14073
  const focusedProductName = useMemo(
13747
- () => catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
13748
- [catalog.products, focusProduct]
14074
+ () => pinnedSlug !== null ? pinnedName : catalog.products.find((p) => isSameProductSlug(p.slug, focusProduct))?.name ?? null,
14075
+ [catalog.products, focusProduct, pinnedName, pinnedSlug]
13749
14076
  );
13750
14077
  const headProductName = useMemo(
13751
- () => productSlug ? catalog.products.find((p) => isSameProductSlug(p.slug, productSlug))?.name ?? null : null,
13752
- [catalog.products, productSlug]
14078
+ () => pinnedSlug !== null ? pinnedName : productSlug ? catalog.products.find(
14079
+ (p) => isSameProductSlug(p.slug, productSlug)
14080
+ )?.name ?? null : null,
14081
+ [catalog.products, pinnedName, pinnedSlug, productSlug]
13753
14082
  );
13754
14083
  const imageOrigins = useMemo(
13755
14084
  () => inlineImageOrigins(catalog.products),
@@ -13773,7 +14102,7 @@ function ExplorePage({
13773
14102
  const [bottomInset, setBottomInset] = useState(0);
13774
14103
  const paneOffsetRef = useRef(0);
13775
14104
  const measurePane = useCallback(() => {
13776
- if (heightMode !== "viewport") return;
14105
+ if (!viewportPage) return;
13777
14106
  const el = rootRef.current;
13778
14107
  if (!el) return;
13779
14108
  const layoutHeight = window.innerHeight;
@@ -13792,7 +14121,7 @@ function ExplorePage({
13792
14121
  paneOffsetRef.current = top;
13793
14122
  setPaneOffset((current) => current === top ? current : top);
13794
14123
  setBottomInset((current) => current === inset ? current : inset);
13795
- }, [heightMode]);
14124
+ }, [viewportPage]);
13796
14125
  const [chromeOverlap, setChromeOverlap] = useState(0);
13797
14126
  const measureChrome = useCallback(() => {
13798
14127
  const root = rootRef.current;
@@ -13817,7 +14146,7 @@ function ExplorePage({
13817
14146
  measureChrome();
13818
14147
  }, [measurePane, measureChrome]);
13819
14148
  useEffect(() => {
13820
- if (typeof window === "undefined") return;
14149
+ if (typeof window === "undefined" || panel) return;
13821
14150
  let frame = 0;
13822
14151
  const run = () => {
13823
14152
  frame = 0;
@@ -13855,12 +14184,12 @@ function ExplorePage({
13855
14184
  setBottomInset(0);
13856
14185
  setChromeOverlap(0);
13857
14186
  };
13858
- }, [remeasure]);
14187
+ }, [remeasure, panel]);
13859
14188
  useEffect(() => {
13860
14189
  measureChrome();
13861
14190
  }, [measureChrome, paneOffset, bottomInset]);
13862
14191
  useEffect(() => {
13863
- if (heightMode !== "viewport" || typeof window === "undefined") return;
14192
+ if (!viewportPage || typeof window === "undefined") return;
13864
14193
  const { history: browserHistory } = window;
13865
14194
  const previousRestoration = "scrollRestoration" in browserHistory ? browserHistory.scrollRestoration : null;
13866
14195
  if (previousRestoration !== null)
@@ -13928,14 +14257,14 @@ function ExplorePage({
13928
14257
  if (previousRestoration !== null)
13929
14258
  browserHistory.scrollRestoration = previousRestoration;
13930
14259
  };
13931
- }, [heightMode, remeasure]);
14260
+ }, [viewportPage, remeasure]);
13932
14261
  const handleScroll = useCallback(() => {
13933
14262
  const el = scrollRef.current;
13934
14263
  if (!el) return;
13935
14264
  stickToBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
13936
14265
  }, []);
13937
14266
  useEffect(() => {
13938
- if (typeof window === "undefined") return;
14267
+ if (typeof window === "undefined" || panel) return;
13939
14268
  let frame = 0;
13940
14269
  const run = () => {
13941
14270
  frame = 0;
@@ -13958,7 +14287,7 @@ function ExplorePage({
13958
14287
  if (frame) window.cancelAnimationFrame(frame);
13959
14288
  window.removeEventListener("scroll", schedule);
13960
14289
  };
13961
- }, []);
14290
+ }, [panel]);
13962
14291
  const latestAssistantId = useMemo(() => {
13963
14292
  for (let i = messages.length - 1; i >= 0; i -= 1) {
13964
14293
  const message = messages[i];
@@ -13974,7 +14303,7 @@ function ExplorePage({
13974
14303
  if (!stickToBottomRef.current) return;
13975
14304
  if (anchor.offsetHeight === 0) return;
13976
14305
  alignedForRef.current = latestAssistantId;
13977
- if (!pageOwnsScrolling(el)) {
14306
+ if (panel || !pageOwnsScrolling(el)) {
13978
14307
  const delta2 = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
13979
14308
  el.scrollTop = Math.max(0, el.scrollTop + delta2 - 12);
13980
14309
  return;
@@ -13983,7 +14312,7 @@ function ExplorePage({
13983
14312
  anchor.getBoundingClientRect().top - paneOffsetRef.current - 12
13984
14313
  );
13985
14314
  if (delta !== 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
13986
- }, [latestAssistantId, messages]);
14315
+ }, [latestAssistantId, messages, panel]);
13987
14316
  useEffect(() => {
13988
14317
  if (messages.length === 0) return;
13989
14318
  if (!stickToBottomRef.current) return;
@@ -13991,7 +14320,7 @@ function ExplorePage({
13991
14320
  return;
13992
14321
  const el = scrollRef.current;
13993
14322
  if (!el) return;
13994
- if (!pageOwnsScrolling(el)) {
14323
+ if (panel || !pageOwnsScrolling(el)) {
13995
14324
  el.scrollTop = el.scrollHeight;
13996
14325
  return;
13997
14326
  }
@@ -14000,7 +14329,7 @@ function ExplorePage({
14000
14329
  dock.getBoundingClientRect().bottom - visualViewportHeight()
14001
14330
  );
14002
14331
  if (delta > 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
14003
- }, [activity, latestAssistantId, messages]);
14332
+ }, [activity, latestAssistantId, messages, panel]);
14004
14333
  const handleShare = useCallback(async () => {
14005
14334
  setShareLabel(T.copying);
14006
14335
  setShareUrl(null);
@@ -14010,7 +14339,7 @@ function ExplorePage({
14010
14339
  setTimeout(() => setShareLabel(T.share), 2500);
14011
14340
  return;
14012
14341
  }
14013
- const url = new URL(pageUrl ?? window.location.href);
14342
+ const url = panel ? new URL(explorePath, window.location.href) : new URL(pageUrl ?? window.location.href);
14014
14343
  url.search = "";
14015
14344
  url.hash = "";
14016
14345
  url.searchParams.set("c", token);
@@ -14026,6 +14355,8 @@ function ExplorePage({
14026
14355
  }, [
14027
14356
  createShareLink,
14028
14357
  pageUrl,
14358
+ panel,
14359
+ explorePath,
14029
14360
  T.copied,
14030
14361
  T.copying,
14031
14362
  T.share,
@@ -14054,12 +14385,26 @@ function ExplorePage({
14054
14385
  });
14055
14386
  return pickQueueRef.current;
14056
14387
  },
14057
- [T]
14388
+ [T, setStaged]
14389
+ );
14390
+ const removeAttachment = useCallback(
14391
+ (id) => {
14392
+ setStaged((prev) => prev.filter((entry) => entry.id !== id));
14393
+ setAttachmentNotice(null);
14394
+ },
14395
+ [setStaged]
14396
+ );
14397
+ const pinFocus = useCallback(() => {
14398
+ if (pinnedSlug !== null) setFocusProduct(pinnedSlug);
14399
+ }, [pinnedSlug, setFocusProduct]);
14400
+ const retryTurn = useCallback(() => {
14401
+ pinFocus();
14402
+ retry();
14403
+ }, [pinFocus, retry]);
14404
+ const shownError = useMemo(
14405
+ () => error !== null && pinnedSlug !== null ? productScopedError(error, T.toolBudgetScoped) : error,
14406
+ [T, error, pinnedSlug]
14058
14407
  );
14059
- const removeAttachment = useCallback((id) => {
14060
- setStaged((prev) => prev.filter((entry) => entry.id !== id));
14061
- setAttachmentNotice(null);
14062
- }, []);
14063
14408
  const submitDraft = useCallback(() => {
14064
14409
  const text = draft.trim();
14065
14410
  if (!text || overLimit || busy || !canSend) return;
@@ -14067,22 +14412,34 @@ function ExplorePage({
14067
14412
  stopSpeaking();
14068
14413
  setDraft("");
14069
14414
  stickToBottomRef.current = true;
14415
+ pinFocus();
14070
14416
  void send(text, toPayload(stagedRef.current));
14071
14417
  setStaged([]);
14072
14418
  setAttachmentNotice(null);
14073
14419
  textareaRef.current?.focus();
14074
- }, [busy, canSend, draft, overLimit, send, stopDictation]);
14420
+ }, [
14421
+ busy,
14422
+ canSend,
14423
+ draft,
14424
+ overLimit,
14425
+ pinFocus,
14426
+ send,
14427
+ setDraft,
14428
+ setStaged,
14429
+ stopDictation
14430
+ ]);
14075
14431
  const sendPrompt = useCallback(
14076
14432
  (prompt) => {
14077
14433
  if (!canSend || busy) return;
14078
14434
  stopSpeaking();
14079
14435
  setDraft("");
14080
14436
  stickToBottomRef.current = true;
14437
+ pinFocus();
14081
14438
  void send(prompt, toPayload(stagedRef.current));
14082
14439
  setStaged([]);
14083
14440
  setAttachmentNotice(null);
14084
14441
  },
14085
- [busy, canSend, send]
14442
+ [busy, canSend, pinFocus, send, setDraft, setStaged]
14086
14443
  );
14087
14444
  const handleKeyDown = useCallback(
14088
14445
  (event) => {
@@ -14104,7 +14461,7 @@ function ExplorePage({
14104
14461
  [serverCatalogRaw]
14105
14462
  );
14106
14463
  const rootStyle = {};
14107
- if (heightMode === "viewport") {
14464
+ if (viewportPage) {
14108
14465
  rootStyle["--boff-explore-offset"] = paneOffset === null ? normalizeOffset(viewportOffset) : `${paneOffset}px`;
14109
14466
  if (bottomInset > 0) {
14110
14467
  rootStyle["--boff-explore-inset"] = `${bottomInset}px`;
@@ -14117,23 +14474,29 @@ function ExplorePage({
14117
14474
  "div",
14118
14475
  {
14119
14476
  ref: rootRef,
14120
- "data-boff-explore": "page",
14477
+ "data-boff-explore": panel ? "panel" : "page",
14121
14478
  "data-phase": phase,
14122
14479
  "data-locale": activeLocale,
14123
14480
  dir: rtl ? "rtl" : void 0,
14124
14481
  className: cn(
14125
- "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
14126
- heightMode === "viewport" && "boff-explore-viewport",
14127
- heightMode === "auto" && "min-h-[70vh]",
14482
+ 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",
14483
+ viewportPage && "boff-explore-viewport",
14484
+ !panel && heightMode === "auto" && "min-h-[70vh]",
14128
14485
  className
14129
14486
  ),
14130
- style: rootStyle,
14487
+ style: panel ? void 0 : rootStyle,
14131
14488
  children: [
14132
- /* @__PURE__ */ jsx(
14489
+ panel ? null : /* @__PURE__ */ jsx(
14133
14490
  PageHead,
14134
14491
  {
14135
14492
  title: seo?.title ?? T.seoTitle,
14136
- description: seo?.description ?? (headProductName ? fill(T.seoDescriptionProduct, { product: headProductName }) : T.seoDescription),
14493
+ description: seo?.description ?? (headProductName ? fill(
14494
+ // BOFF-9796: one product's own page promises that product's answers alone, never "and every
14495
+ // other product we build". The title ("Describe a problem, get an answer | {product}") and the
14496
+ // site name already name this product only, and the og:/twitter: tags repeat these two.
14497
+ pinnedSlug === null ? T.seoDescriptionProduct : T.seoDescriptionScoped,
14498
+ { product: headProductName }
14499
+ ) : T.seoDescription),
14137
14500
  productName: seo?.title ? void 0 : headProductName ?? void 0,
14138
14501
  keywords: seo?.keywords,
14139
14502
  image: seo?.image,
@@ -14142,7 +14505,11 @@ function ExplorePage({
14142
14505
  ),
14143
14506
  /* @__PURE__ */ jsx(ProseStyles, {}),
14144
14507
  /* @__PURE__ */ jsx(ExploreStyles, {}),
14145
- bakedCatalogJson ? /* @__PURE__ */ jsx(
14508
+ panel ? /* @__PURE__ */ jsx("style", { children: `.boff-explore-panel .boff-explore-scroll { container: boff-explore-pane / size; }
14509
+ @container boff-explore-pane (width < ${toRem(WELCOME_FIT_MIN_WIDTH_PX)}) {
14510
+ .boff-explore-panel .boff-explore-scroll .boff-explore-capabilities { display: none; }
14511
+ }` }) : null,
14512
+ !panel && bakedCatalogJson ? /* @__PURE__ */ jsx(
14146
14513
  "script",
14147
14514
  {
14148
14515
  id: BAKED_CATALOG_ELEMENT_ID,
@@ -14162,7 +14529,7 @@ function ExplorePage({
14162
14529
  children: /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4" })
14163
14530
  }
14164
14531
  ),
14165
- /* @__PURE__ */ jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
14532
+ panel ? /* @__PURE__ */ jsx("h2", { className: "truncate text-sm font-semibold", children: resolvedTitle }) : /* @__PURE__ */ jsx("h1", { className: "truncate text-sm font-semibold", children: resolvedTitle }),
14166
14533
  focusedProductName ? /* @__PURE__ */ jsx("span", { className: "hidden shrink-0 rounded-full bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground sm:inline", children: focusedProductName }) : null,
14167
14534
  /* @__PURE__ */ jsxs(
14168
14535
  Button,
@@ -14306,16 +14673,18 @@ function ExplorePage({
14306
14673
  children: showWelcome ? /* @__PURE__ */ jsx(
14307
14674
  WelcomeState,
14308
14675
  {
14676
+ heading: panel ? "h2" : "h1",
14309
14677
  strings: T,
14310
14678
  title: resolvedTitle,
14311
14679
  body: resolvedBody,
14312
14680
  prompts,
14313
- products: catalog.products,
14314
- conceptHighlights: catalog.conceptHighlights,
14681
+ products: pinnedSlug === null ? catalog.products : NO_PRODUCTS,
14682
+ conceptHighlights,
14315
14683
  focusProduct,
14316
14684
  onPrompt: sendPrompt,
14317
14685
  onFocus: setFocusProduct,
14318
- disabled: !canSend || busy
14686
+ disabled: !canSend || busy,
14687
+ productScoped: pinnedSlug !== null
14319
14688
  }
14320
14689
  ) : /* @__PURE__ */ jsx("div", { className: "mx-auto w-full min-w-0 max-w-3xl space-y-6 px-4 py-6", children: messages.map(
14321
14690
  (message) => message.role === "USER" ? /* @__PURE__ */ jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsx(
@@ -14392,7 +14761,14 @@ function ExplorePage({
14392
14761
  submitDraft();
14393
14762
  },
14394
14763
  children: [
14395
- error ? /* @__PURE__ */ jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
14764
+ shownError ? /* @__PURE__ */ jsx(
14765
+ ErrorBanner,
14766
+ {
14767
+ error: shownError,
14768
+ onRetry: retryTurn,
14769
+ onReset: reset
14770
+ }
14771
+ ) : null,
14396
14772
  staged.length > 0 ? /* @__PURE__ */ jsx(
14397
14773
  "ul",
14398
14774
  {
@@ -14478,9 +14854,14 @@ function ExplorePage({
14478
14854
  composingRef.current = false;
14479
14855
  },
14480
14856
  "aria-label": "Ask a question",
14481
- placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
14482
- product: focusedProductName
14483
- }) : T.placeholder,
14857
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(
14858
+ // BOFF-9796: one product's own assistant keeps this field exactly as every site has it, its
14859
+ // classes and its fit to the draft alone; only its placeholder says less. On a phone the
14860
+ // field is one line tall and cuts off a placeholder that wraps: in English, "Ask about
14861
+ // {product}…" fits that line at 320px and wider.
14862
+ pinnedSlug === null ? T.placeholderProduct : T.placeholderScoped,
14863
+ { product: focusedProductName }
14864
+ ) : T.placeholder,
14484
14865
  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"
14485
14866
  }
14486
14867
  ),
@@ -14668,77 +15049,777 @@ function samePath(a, b) {
14668
15049
  const norm = (v) => v.length > 1 ? v.replace(/\/+$/, "") : v;
14669
15050
  return norm(a) === norm(b);
14670
15051
  }
14671
- function ExploreCta({
14672
- variant,
14673
- href = "/explore",
14674
- label = "Ask AI",
14675
- className,
15052
+ var ExploreCta = forwardRef(
15053
+ function ExploreCta2({
15054
+ variant,
15055
+ href = "/explore",
15056
+ label = "Ask AI",
15057
+ className,
15058
+ onNavigate,
15059
+ onClick,
15060
+ currentPath,
15061
+ expanded,
15062
+ controls
15063
+ }, ref) {
15064
+ const path = useCurrentPath(currentPath);
15065
+ const isActive = samePath(path, href);
15066
+ if (variant === "floating" && isActive) return null;
15067
+ const handleClick = (event) => {
15068
+ onClick?.();
15069
+ if (!onNavigate) return;
15070
+ if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {
15071
+ return;
15072
+ }
15073
+ event.preventDefault();
15074
+ onNavigate(href);
15075
+ };
15076
+ const classes = {
15077
+ // A quiet icon control, deliberately NOT a second gradient pill: a header should carry one
15078
+ // primary CTA ("Get started"), and a competing coloured button next to it reads as clutter.
15079
+ // This matches the theme toggle's visual weight, so the row scans as [utilities] [CTA].
15080
+ // The prominent, labelled entry point to /explore is the floating bubble, which is visible
15081
+ // on every page without scrolling. `shrink-0` keeps it from squeezing the nav.
15082
+ 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",
15083
+ 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",
15084
+ 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"
15085
+ };
15086
+ const hooks = {
15087
+ header: "cta-header",
15088
+ mobile: "cta-mobile",
15089
+ floating: "cta-floating"
15090
+ };
15091
+ return /* @__PURE__ */ jsxs(
15092
+ "a",
15093
+ {
15094
+ ref,
15095
+ "data-boff-explore": hooks[variant],
15096
+ href,
15097
+ onClick: handleClick,
15098
+ "aria-label": label,
15099
+ "aria-current": isActive ? "page" : void 0,
15100
+ "aria-expanded": expanded,
15101
+ "aria-haspopup": expanded === void 0 ? void 0 : "dialog",
15102
+ "aria-controls": expanded === void 0 ? void 0 : controls,
15103
+ className: cn(
15104
+ classes[variant],
15105
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
15106
+ className
15107
+ ),
15108
+ children: [
15109
+ /* @__PURE__ */ jsx(
15110
+ Sparkles,
15111
+ {
15112
+ className: cn(
15113
+ "shrink-0",
15114
+ variant === "floating" ? "h-4 w-4" : variant === "header" ? "h-5 w-5" : "h-3.5 w-3.5"
15115
+ ),
15116
+ "aria-hidden": "true"
15117
+ }
15118
+ ),
15119
+ /* @__PURE__ */ jsx(
15120
+ "span",
15121
+ {
15122
+ className: cn(
15123
+ variant === "floating" && "hidden sm:inline",
15124
+ // Never labelled in the header — see the class comment above.
15125
+ variant === "header" && "hidden"
15126
+ ),
15127
+ children: label
15128
+ }
15129
+ )
15130
+ ]
15131
+ }
15132
+ );
15133
+ }
15134
+ );
15135
+ var MARK_KEY = "boffExplorePanel";
15136
+ var POS_KEY = "boffExplorePanelPos";
15137
+ var DOC_KEY = "boffExplorePanelDoc";
15138
+ var DOC_ID = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
15139
+ var lastPos = 0;
15140
+ var hostMode = null;
15141
+ var NARROW_QUERY = "(max-width: 639px)";
15142
+ var TOUCH_FIRST_QUERY = "(hover: none) and (pointer: coarse)";
15143
+ var COMPOSER_FOCUS_TRIES = 15;
15144
+ var PANEL_CSS = `
15145
+ .boff-explore-shell {
15146
+ --boff-explore-shell-lift-at: max(var(--boff-explore-shell-lift, 0px), var(--boff-explore-shell-bottom, 0px));
15147
+ --boff-explore-shell-room-at: var(--boff-explore-shell-room, calc(100vh - var(--boff-explore-shell-bottom, 0px)));
15148
+ position: fixed;
15149
+ z-index: var(--boff-explore-shell-z, 50);
15150
+ display: flex;
15151
+ flex-direction: column;
15152
+ overflow: hidden;
15153
+ overscroll-behavior: contain;
15154
+ inset-inline-end: 1rem;
15155
+ bottom: calc(1rem + var(--boff-explore-shell-lift-at));
15156
+ width: min(26rem, calc(100vw - 2rem));
15157
+ height: min(40rem, calc(var(--boff-explore-shell-room-at) - 6rem));
15158
+ border-width: 1px;
15159
+ border-style: solid;
15160
+ border-radius: 1rem;
15161
+ }
15162
+ @supports (height: 100dvh) {
15163
+ .boff-explore-shell {
15164
+ --boff-explore-shell-room-at: var(--boff-explore-shell-room, calc(100dvh - var(--boff-explore-shell-bottom, 0px)));
15165
+ }
15166
+ }
15167
+ @media (max-width: 639px) {
15168
+ .boff-explore-shell[data-size="compact"] {
15169
+ inset-inline: 0;
15170
+ bottom: var(--boff-explore-shell-lift-at);
15171
+ width: auto;
15172
+ height: min(75vh, calc(var(--boff-explore-shell-room-at) - 4rem));
15173
+ border-width: 1px 0 0;
15174
+ border-radius: 1rem 1rem 0 0;
15175
+ }
15176
+ @supports (height: 100dvh) {
15177
+ .boff-explore-shell[data-size="compact"] {
15178
+ height: min(75dvh, calc(var(--boff-explore-shell-room-at) - 4rem));
15179
+ }
15180
+ }
15181
+ }
15182
+ .boff-explore-shell[data-size="expanded"] {
15183
+ inset: var(--boff-explore-shell-top, 0px) 0 var(--boff-explore-shell-lift-at) 0;
15184
+ width: auto;
15185
+ height: auto;
15186
+ border-width: 0;
15187
+ border-radius: 0;
15188
+ box-shadow: none;
15189
+ }
15190
+ .boff-explore-shell[data-open="false"] {
15191
+ visibility: hidden;
15192
+ content-visibility: hidden;
15193
+ }
15194
+ .boff-explore-shell:focus { outline: none; }
15195
+ `;
15196
+ var PRODUCT_TITLE_CSS = `
15197
+ .boff-explore-shell .boff-explore-shell-title { container-type: inline-size; }
15198
+ .boff-explore-shell .boff-explore-shell-title-text {
15199
+ display: -webkit-box;
15200
+ -webkit-box-orient: vertical;
15201
+ -webkit-line-clamp: 2;
15202
+ overflow: hidden;
15203
+ overflow-wrap: break-word;
15204
+ line-height: 1.125rem;
15205
+ }
15206
+ @container (max-width: 6rem) {
15207
+ .boff-explore-shell .boff-explore-shell-title-text { font-size: 0.75rem; line-height: 1rem; }
15208
+ }
15209
+ `;
15210
+ function stateRecord() {
15211
+ const state = window.history.state;
15212
+ return state !== null && typeof state === "object" ? state : {};
15213
+ }
15214
+ function stampedHere() {
15215
+ return stateRecord()[DOC_KEY] === DOC_ID;
15216
+ }
15217
+ function readMark() {
15218
+ if (typeof window === "undefined" || !stampedHere()) return null;
15219
+ const mark = stateRecord()[MARK_KEY];
15220
+ return mark === "open" || mark === "expanded" ? mark : null;
15221
+ }
15222
+ function readPos() {
15223
+ if (typeof window === "undefined" || !stampedHere()) return null;
15224
+ const pos = stateRecord()[POS_KEY];
15225
+ return typeof pos === "number" ? pos : null;
15226
+ }
15227
+ function stamp() {
15228
+ if (typeof window === "undefined" || readPos() !== null) return;
15229
+ const rest = { ...stateRecord() };
15230
+ delete rest[MARK_KEY];
15231
+ delete rest[POS_KEY];
15232
+ delete rest[DOC_KEY];
15233
+ lastPos += 1;
15234
+ try {
15235
+ window.history.replaceState(
15236
+ { ...rest, [POS_KEY]: lastPos, [DOC_KEY]: DOC_ID },
15237
+ ""
15238
+ );
15239
+ } catch {
15240
+ }
15241
+ }
15242
+ function pushMark(mark) {
15243
+ const { history } = window;
15244
+ const mode = "scrollRestoration" in history ? history.scrollRestoration : null;
15245
+ try {
15246
+ if (mode !== null) history.scrollRestoration = "manual";
15247
+ lastPos += 1;
15248
+ history.pushState(
15249
+ {
15250
+ ...stateRecord(),
15251
+ [MARK_KEY]: mark,
15252
+ [POS_KEY]: lastPos,
15253
+ [DOC_KEY]: DOC_ID
15254
+ },
15255
+ ""
15256
+ );
15257
+ return true;
15258
+ } catch {
15259
+ return false;
15260
+ } finally {
15261
+ if (mode !== null) history.scrollRestoration = mode;
15262
+ }
15263
+ }
15264
+ function restoreScrollMode(mode, then) {
15265
+ const { history } = window;
15266
+ const put = () => {
15267
+ if (history.scrollRestoration === "manual")
15268
+ history.scrollRestoration = mode;
15269
+ then?.();
15270
+ };
15271
+ if (typeof window.requestAnimationFrame !== "function") {
15272
+ window.setTimeout(put, 50);
15273
+ return;
15274
+ }
15275
+ window.requestAnimationFrame(() => window.requestAnimationFrame(put));
15276
+ }
15277
+ function closeInnerDialogs(shell) {
15278
+ let closed = false;
15279
+ document.querySelectorAll(
15280
+ 'dialog[data-boff-explore="video-dialog"]'
15281
+ ).forEach((dialog) => {
15282
+ if (!dialog.open) return;
15283
+ dialog.close();
15284
+ closed = true;
15285
+ });
15286
+ const disclaimer = shell?.querySelector(
15287
+ '[data-boff-explore="disclaimer-dialog"]'
15288
+ );
15289
+ if (disclaimer) {
15290
+ disclaimer.click();
15291
+ closed = true;
15292
+ }
15293
+ return closed;
15294
+ }
15295
+ function marksOnTop(mark) {
15296
+ if (mark === "expanded") return 2;
15297
+ return mark === "open" ? 1 : 0;
15298
+ }
15299
+ function matches(query) {
15300
+ return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia(query).matches;
15301
+ }
15302
+ function ExplorePanel({
15303
+ open,
15304
+ onOpenChange,
15305
+ id = "boff-explore-panel",
15306
+ productSlug,
15307
+ locale,
15308
+ scope,
15309
+ productName,
15310
+ examplePrompts,
14676
15311
  onNavigate,
14677
- onClick,
14678
- currentPath
15312
+ welcomeTitle,
15313
+ welcomeBody,
15314
+ explorePath,
15315
+ avatar,
15316
+ bottomOffset,
15317
+ zIndex,
15318
+ returnFocusRef,
15319
+ className
14679
15320
  }) {
14680
- const path = useCurrentPath(currentPath);
14681
- const isActive = samePath(path, href);
14682
- if (variant === "floating" && isActive) return null;
14683
- const handleClick = (event) => {
14684
- onClick?.();
14685
- if (!onNavigate) return;
14686
- if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {
15321
+ const resolvedLocale = resolveExploreLocale(locale);
15322
+ const T = useMemo(() => exploreStrings(resolvedLocale), [resolvedLocale]);
15323
+ const rtl = isRtlLocale(resolvedLocale);
15324
+ const catalogProducts = useContext(ExploreCatalogProductsContext);
15325
+ const pinnedSlug = pinnedProductSlug(scope, productSlug);
15326
+ const title = useMemo(() => {
15327
+ if (pinnedSlug === null) return T.panelTitle;
15328
+ const name = productNameFor(
15329
+ catalogProducts ?? ECOSYSTEM_PRODUCTS,
15330
+ pinnedSlug,
15331
+ productName
15332
+ );
15333
+ return name === null ? T.panelTitle : fill(T.panelTitleProduct, { product: name });
15334
+ }, [T, catalogProducts, pinnedSlug, productName]);
15335
+ const uid = useId();
15336
+ const titleId = `${uid}-title`;
15337
+ const chatTabId = `${uid}-chat-tab`;
15338
+ const avatarTabId = `${uid}-avatar-tab`;
15339
+ const chatPaneId = `${uid}-chat`;
15340
+ const avatarPaneId = `${uid}-avatar`;
15341
+ const [mounted, setMounted] = useState(open);
15342
+ const [size, setSize] = useState("compact");
15343
+ const [view, setView] = useState("chat");
15344
+ const [focusRequest, setFocusRequest] = useState(
15345
+ open ? "in" : null
15346
+ );
15347
+ const [wasOpen, setWasOpen] = useState(open);
15348
+ if (open !== wasOpen) {
15349
+ setWasOpen(open);
15350
+ if (open) {
15351
+ setMounted(true);
15352
+ setFocusRequest("in");
15353
+ } else {
15354
+ setSize("compact");
15355
+ setFocusRequest("back");
15356
+ }
15357
+ }
15358
+ const shellRef = useRef(null);
15359
+ const chatPaneRef = useRef(null);
15360
+ const chatTabRef = useRef(null);
15361
+ const avatarTabRef = useRef(null);
15362
+ const ownPopsRef = useRef(0);
15363
+ const settlingRef = useRef(false);
15364
+ const afterPopRef = useRef([]);
15365
+ const markRef = useRef(null);
15366
+ const posRef = useRef(null);
15367
+ const hrefRef = useRef(null);
15368
+ const openRef = useRef(open);
15369
+ const onOpenChangeRef = useRef(onOpenChange);
15370
+ const lookedRef = useRef(false);
15371
+ const traverse = useCallback((delta) => {
15372
+ ownPopsRef.current += 1;
15373
+ window.history.go(delta);
15374
+ }, []);
15375
+ const push = useCallback((mark) => {
15376
+ const { history } = window;
15377
+ if ("scrollRestoration" in history && history.scrollRestoration !== "manual") {
15378
+ hostMode = history.scrollRestoration;
15379
+ }
15380
+ stamp();
15381
+ if (!pushMark(mark)) return false;
15382
+ markRef.current = mark;
15383
+ posRef.current = readPos();
15384
+ hrefRef.current = window.location.href;
15385
+ return true;
15386
+ }, []);
15387
+ const whenSettled = useCallback((work) => {
15388
+ if (ownPopsRef.current > 0 || settlingRef.current) {
15389
+ afterPopRef.current.push(work);
15390
+ } else {
15391
+ work();
15392
+ }
15393
+ }, []);
15394
+ const flush = useCallback(() => {
15395
+ settlingRef.current = false;
15396
+ while (afterPopRef.current.length > 0 && ownPopsRef.current === 0 && !settlingRef.current) {
15397
+ afterPopRef.current.shift()?.();
15398
+ }
15399
+ }, []);
15400
+ useEffect(() => {
15401
+ openRef.current = open;
15402
+ onOpenChangeRef.current = onOpenChange;
15403
+ });
15404
+ useEffect(() => {
15405
+ if (typeof window === "undefined") return;
15406
+ if (ownPopsRef.current > 0 || settlingRef.current) return;
15407
+ const pos = readPos();
15408
+ if (lookedRef.current && pos !== null && pos !== posRef.current) return;
15409
+ lookedRef.current = true;
15410
+ stamp();
15411
+ markRef.current = readMark();
15412
+ posRef.current = readPos();
15413
+ hrefRef.current = window.location.href;
15414
+ });
15415
+ useEffect(() => {
15416
+ if (typeof window === "undefined") return;
15417
+ whenSettled(() => {
15418
+ if (openRef.current) {
15419
+ if (readMark() === null) push("open");
15420
+ return;
15421
+ }
15422
+ closeInnerDialogs(shellRef.current);
15423
+ const count = marksOnTop(readMark());
15424
+ if (count > 0) traverse(-count);
15425
+ });
15426
+ }, [open, push, traverse, whenSettled]);
15427
+ useEffect(() => {
15428
+ if (typeof window === "undefined") return;
15429
+ const onPopState = () => {
15430
+ const open2 = openRef.current;
15431
+ const onOpenChange2 = onOpenChangeRef.current;
15432
+ const leftMark = markRef.current;
15433
+ const leftPos = posRef.current;
15434
+ const leftHref = hrefRef.current;
15435
+ const mark = readMark();
15436
+ const pos = readPos();
15437
+ markRef.current = mark;
15438
+ posRef.current = pos;
15439
+ hrefRef.current = window.location.href;
15440
+ const forward = pos !== null && leftPos !== null && pos > leftPos;
15441
+ const mode = hostMode;
15442
+ const restoring = leftMark !== null && mode !== null;
15443
+ if (ownPopsRef.current > 0) {
15444
+ ownPopsRef.current -= 1;
15445
+ if (ownPopsRef.current > 0) return;
15446
+ if (restoring) {
15447
+ settlingRef.current = true;
15448
+ restoreScrollMode(mode, flush);
15449
+ } else {
15450
+ flush();
15451
+ }
15452
+ return;
15453
+ }
15454
+ if (restoring) restoreScrollMode(mode);
15455
+ if (leftMark !== null && !forward) {
15456
+ if (open2 && closeInnerDialogs(shellRef.current)) {
15457
+ if (readMark() === null) push("open");
15458
+ if (leftMark === "expanded" && readMark() === "open") {
15459
+ push("expanded");
15460
+ }
15461
+ return;
15462
+ }
15463
+ setSize("compact");
15464
+ if (mark === null && open2) onOpenChange2(false);
15465
+ return;
15466
+ }
15467
+ if (leftHref !== null && window.location.href !== leftHref) {
15468
+ closeInnerDialogs(shellRef.current);
15469
+ }
15470
+ if (mark === null) return;
15471
+ if (forward) {
15472
+ setSize(mark === "expanded" ? "expanded" : "compact");
15473
+ if (!open2) onOpenChange2(true);
15474
+ return;
15475
+ }
15476
+ if (!open2) {
15477
+ traverse(-marksOnTop(mark));
15478
+ return;
15479
+ }
15480
+ setSize(mark === "expanded" ? "expanded" : "compact");
15481
+ };
15482
+ window.addEventListener("popstate", onPopState);
15483
+ return () => window.removeEventListener("popstate", onPopState);
15484
+ }, [flush, push, traverse]);
15485
+ useEffect(() => {
15486
+ if (!open || typeof window === "undefined") return;
15487
+ const viewport = window.visualViewport;
15488
+ const shell = shellRef.current;
15489
+ if (!viewport || !shell) return;
15490
+ const clear = () => {
15491
+ shell.style.removeProperty("--boff-explore-shell-lift");
15492
+ shell.style.removeProperty("--boff-explore-shell-room");
15493
+ shell.style.removeProperty("--boff-explore-shell-top");
15494
+ };
15495
+ const apply = () => {
15496
+ const covered = Math.max(
15497
+ 0,
15498
+ Math.round(window.innerHeight - viewport.height - viewport.offsetTop)
15499
+ );
15500
+ const panned = viewport.offsetTop > 1;
15501
+ if (covered <= 1 && !panned) {
15502
+ clear();
15503
+ return;
15504
+ }
15505
+ shell.style.setProperty("--boff-explore-shell-lift", `${covered}px`);
15506
+ shell.style.setProperty(
15507
+ "--boff-explore-shell-room",
15508
+ `calc(${Math.round(viewport.height)}px - max(0px, var(--boff-explore-shell-bottom, 0px) - ${covered}px))`
15509
+ );
15510
+ shell.style.setProperty(
15511
+ "--boff-explore-shell-top",
15512
+ `${Math.max(0, Math.round(viewport.offsetTop))}px`
15513
+ );
15514
+ };
15515
+ apply();
15516
+ viewport.addEventListener("resize", apply);
15517
+ viewport.addEventListener("scroll", apply);
15518
+ return () => {
15519
+ viewport.removeEventListener("resize", apply);
15520
+ viewport.removeEventListener("scroll", apply);
15521
+ clear();
15522
+ };
15523
+ }, [open]);
15524
+ const focusComposerSoon = useCallback((from) => {
15525
+ let tries = 0;
15526
+ const next = (attempt2) => {
15527
+ if (typeof window.requestAnimationFrame === "function") {
15528
+ window.requestAnimationFrame(attempt2);
15529
+ } else {
15530
+ window.setTimeout(attempt2, 16);
15531
+ }
15532
+ };
15533
+ const attempt = () => {
15534
+ if (document.activeElement !== from) return;
15535
+ const composer = chatPaneRef.current?.querySelector(
15536
+ "textarea:not(:disabled)"
15537
+ );
15538
+ if (!composer) return;
15539
+ composer.focus();
15540
+ tries += 1;
15541
+ if (document.activeElement !== composer && tries < COMPOSER_FOCUS_TRIES) {
15542
+ next(attempt);
15543
+ }
15544
+ };
15545
+ next(attempt);
15546
+ }, []);
15547
+ useEffect(() => {
15548
+ if (focusRequest === null) return;
15549
+ setFocusRequest(null);
15550
+ const shell = shellRef.current;
15551
+ if (focusRequest === "back") {
15552
+ const active = document.activeElement;
15553
+ if (active === null || active === document.body || shell?.contains(active)) {
15554
+ returnFocusRef?.current?.focus();
15555
+ }
14687
15556
  return;
14688
15557
  }
14689
- event.preventDefault();
14690
- onNavigate(href);
14691
- };
14692
- const classes = {
14693
- // A quiet icon control, deliberately NOT a second gradient pill: a header should carry one
14694
- // primary CTA ("Get started"), and a competing coloured button next to it reads as clutter.
14695
- // This matches the theme toggle's visual weight, so the row scans as [utilities] [CTA].
14696
- // The prominent, labelled entry point to /explore is the floating bubble, which is visible
14697
- // on every page without scrolling. `shrink-0` keeps it from squeezing the nav.
14698
- 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",
14699
- 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",
14700
- 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"
14701
- };
14702
- const hooks = {
14703
- header: "cta-header",
14704
- mobile: "cta-mobile",
14705
- floating: "cta-floating"
15558
+ if (!shell) return;
15559
+ shell.focus();
15560
+ if (view === "chat" && !matches(TOUCH_FIRST_QUERY)) {
15561
+ focusComposerSoon(shell);
15562
+ }
15563
+ }, [focusComposerSoon, focusRequest, returnFocusRef, view]);
15564
+ const close = useCallback(() => onOpenChange(false), [onOpenChange]);
15565
+ const expand = useCallback(() => {
15566
+ setSize("expanded");
15567
+ whenSettled(() => {
15568
+ if (!openRef.current) return;
15569
+ if (readMark() === null) push("open");
15570
+ if (readMark() === "open") push("expanded");
15571
+ });
15572
+ }, [push, whenSettled]);
15573
+ const restore = useCallback(() => {
15574
+ setSize("compact");
15575
+ whenSettled(() => {
15576
+ if (readMark() === "expanded") traverse(-1);
15577
+ });
15578
+ }, [traverse, whenSettled]);
15579
+ const onKeyDown = useCallback(
15580
+ (event) => {
15581
+ if (event.key !== "Escape" || event.defaultPrevented) return;
15582
+ if (event.nativeEvent.isComposing || event.keyCode === 229) return;
15583
+ const shell = shellRef.current;
15584
+ if (!shell || !(event.target instanceof Node) || !shell.contains(event.target)) {
15585
+ return;
15586
+ }
15587
+ if (shell.querySelector('dialog[open], [role="dialog"][aria-modal="true"]')) {
15588
+ return;
15589
+ }
15590
+ event.preventDefault();
15591
+ if (size === "expanded") restore();
15592
+ else close();
15593
+ },
15594
+ [close, restore, size]
15595
+ );
15596
+ const navigate = useCallback(
15597
+ (path) => {
15598
+ if (!onNavigate) return;
15599
+ setSize("compact");
15600
+ const stayOpen = !matches(NARROW_QUERY);
15601
+ if (!stayOpen) onOpenChange(false);
15602
+ whenSettled(() => {
15603
+ const go = () => {
15604
+ onNavigate(path);
15605
+ if (stayOpen && openRef.current && readMark() === null) {
15606
+ push("open");
15607
+ }
15608
+ };
15609
+ const count = marksOnTop(readMark());
15610
+ if (count === 0) {
15611
+ go();
15612
+ return;
15613
+ }
15614
+ afterPopRef.current.push(go);
15615
+ traverse(-count);
15616
+ });
15617
+ },
15618
+ [onNavigate, onOpenChange, push, traverse, whenSettled]
15619
+ );
15620
+ const selectView = useCallback((next) => {
15621
+ setView(next);
15622
+ (next === "chat" ? chatTabRef : avatarTabRef).current?.focus();
15623
+ }, []);
15624
+ const continueInChat = useCallback(() => {
15625
+ setView("chat");
15626
+ const tab = chatTabRef.current;
15627
+ tab?.focus();
15628
+ focusComposerSoon(tab);
15629
+ }, [focusComposerSoon]);
15630
+ const onTabKeyDown = useCallback(
15631
+ (event) => {
15632
+ const other = view === "chat" ? "avatar" : "chat";
15633
+ const next = {
15634
+ ArrowLeft: other,
15635
+ ArrowRight: other,
15636
+ Home: "chat",
15637
+ End: "avatar"
15638
+ };
15639
+ const target = next[event.key];
15640
+ if (!target) return;
15641
+ event.preventDefault();
15642
+ selectView(target);
15643
+ },
15644
+ [selectView, view]
15645
+ );
15646
+ if (!mounted) return null;
15647
+ const style = {
15648
+ "--boff-explore-shell-bottom": bottomOffset ?? "0px",
15649
+ ...zIndex === void 0 ? {} : { "--boff-explore-shell-z": String(zIndex) }
14706
15650
  };
15651
+ 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";
15652
+ 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";
15653
+ const expanded = size === "expanded";
15654
+ const sizeLabel = expanded ? T.exitFullScreen : T.enterFullScreen;
15655
+ const tabs = [
15656
+ { key: "chat", id: chatTabId, pane: chatPaneId, label: T.tabChat },
15657
+ { key: "avatar", id: avatarTabId, pane: avatarPaneId, label: T.tabAvatar }
15658
+ ];
14707
15659
  return /* @__PURE__ */ jsxs(
14708
- "a",
15660
+ "div",
14709
15661
  {
14710
- "data-boff-explore": hooks[variant],
14711
- href,
14712
- onClick: handleClick,
14713
- "aria-label": label,
14714
- "aria-current": isActive ? "page" : void 0,
15662
+ ref: shellRef,
15663
+ id,
15664
+ role: "dialog",
15665
+ "aria-modal": "false",
15666
+ "aria-labelledby": titleId,
15667
+ tabIndex: -1,
15668
+ "data-boff-explore": "panel-shell",
15669
+ "data-open": open ? "true" : "false",
15670
+ "data-size": size,
15671
+ dir: rtl ? "rtl" : void 0,
14715
15672
  className: cn(
14716
- classes[variant],
14717
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
15673
+ "boff-explore-shell border-border bg-background text-foreground shadow-2xl",
14718
15674
  className
14719
15675
  ),
15676
+ style,
15677
+ onKeyDown,
14720
15678
  children: [
14721
- /* @__PURE__ */ jsx(
14722
- Sparkles,
14723
- {
14724
- className: cn(
14725
- "shrink-0",
14726
- variant === "floating" ? "h-4 w-4" : variant === "header" ? "h-5 w-5" : "h-3.5 w-3.5"
14727
- ),
14728
- "aria-hidden": "true"
14729
- }
14730
- ),
14731
- /* @__PURE__ */ jsx(
14732
- "span",
14733
- {
14734
- className: cn(
14735
- variant === "floating" && "hidden sm:inline",
14736
- // Never labelled in the header — see the class comment above.
14737
- variant === "header" && "hidden"
15679
+ /* @__PURE__ */ jsx("style", { children: PANEL_CSS }),
15680
+ pinnedSlug === null ? null : /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PRODUCT_TITLE_CSS } }),
15681
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-2 border-b border-border px-3 py-2", children: [
15682
+ pinnedSlug === null ? /* @__PURE__ */ jsx(
15683
+ "span",
15684
+ {
15685
+ id: titleId,
15686
+ className: "min-w-0 flex-1 truncate text-sm font-semibold",
15687
+ children: title
15688
+ }
15689
+ ) : /* @__PURE__ */ jsx(
15690
+ "span",
15691
+ {
15692
+ id: titleId,
15693
+ className: "boff-explore-shell-title min-w-0 flex-1",
15694
+ children: /* @__PURE__ */ jsx("span", { className: "boff-explore-shell-title-text text-sm font-semibold", children: title })
15695
+ }
15696
+ ),
15697
+ avatar ? /* @__PURE__ */ jsx(
15698
+ "div",
15699
+ {
15700
+ role: "tablist",
15701
+ "aria-label": T.panelViews,
15702
+ className: "inline-flex shrink-0 rounded-lg bg-muted p-0.5",
15703
+ children: tabs.map((tab) => /* @__PURE__ */ jsx(
15704
+ "button",
15705
+ {
15706
+ ref: tab.key === "chat" ? chatTabRef : avatarTabRef,
15707
+ type: "button",
15708
+ role: "tab",
15709
+ id: tab.id,
15710
+ "aria-selected": view === tab.key,
15711
+ "aria-controls": tab.pane,
15712
+ tabIndex: view === tab.key ? 0 : -1,
15713
+ "data-boff-explore": `panel-tab-${tab.key}`,
15714
+ className: cn(
15715
+ tabButton,
15716
+ view === tab.key ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
15717
+ ),
15718
+ onClick: () => selectView(tab.key),
15719
+ onKeyDown: onTabKeyDown,
15720
+ children: tab.label
15721
+ },
15722
+ tab.key
15723
+ ))
15724
+ }
15725
+ ) : null,
15726
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
15727
+ /* @__PURE__ */ jsx(
15728
+ "button",
15729
+ {
15730
+ type: "button",
15731
+ "data-boff-explore": expanded ? "panel-restore" : "panel-expand",
15732
+ "aria-label": sizeLabel,
15733
+ title: sizeLabel,
15734
+ className: iconButton,
15735
+ onClick: expanded ? restore : expand,
15736
+ children: expanded ? /* @__PURE__ */ jsx(Minimize2, { className: "h-4 w-4", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Maximize2, { className: "h-4 w-4", "aria-hidden": "true" })
15737
+ }
14738
15738
  ),
14739
- children: label
14740
- }
14741
- )
15739
+ /* @__PURE__ */ jsx(
15740
+ "button",
15741
+ {
15742
+ type: "button",
15743
+ "data-boff-explore": "panel-close",
15744
+ "aria-label": T.closePanel,
15745
+ title: T.closePanel,
15746
+ className: iconButton,
15747
+ onClick: close,
15748
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4", "aria-hidden": "true" })
15749
+ }
15750
+ )
15751
+ ] })
15752
+ ] }),
15753
+ /* @__PURE__ */ jsxs("div", { className: "relative flex min-h-0 flex-1 flex-col", children: [
15754
+ /* @__PURE__ */ jsx(
15755
+ "div",
15756
+ {
15757
+ ref: chatPaneRef,
15758
+ id: chatPaneId,
15759
+ role: avatar ? "tabpanel" : void 0,
15760
+ "aria-labelledby": avatar ? chatTabId : void 0,
15761
+ "data-boff-explore": "panel-chat",
15762
+ className: cn(
15763
+ "flex min-h-0 flex-1 flex-col",
15764
+ view === "avatar" && "invisible"
15765
+ ),
15766
+ children: /* @__PURE__ */ jsx(
15767
+ ExplorePage,
15768
+ {
15769
+ presentation: "panel",
15770
+ active: open && view === "chat",
15771
+ productSlug,
15772
+ locale,
15773
+ scope,
15774
+ productName,
15775
+ examplePrompts,
15776
+ onNavigate: onNavigate ? navigate : void 0,
15777
+ welcomeTitle,
15778
+ welcomeBody,
15779
+ explorePath
15780
+ }
15781
+ )
15782
+ }
15783
+ ),
15784
+ avatar ? /* @__PURE__ */ jsxs(
15785
+ "div",
15786
+ {
15787
+ id: avatarPaneId,
15788
+ role: "tabpanel",
15789
+ "aria-labelledby": avatarTabId,
15790
+ "data-boff-explore": "panel-avatar",
15791
+ className: cn(
15792
+ "absolute inset-0 flex-col items-center justify-center gap-4 overflow-y-auto bg-background p-6 text-center",
15793
+ view === "avatar" ? "flex" : "hidden"
15794
+ ),
15795
+ children: [
15796
+ /* @__PURE__ */ jsx(
15797
+ "img",
15798
+ {
15799
+ src: avatar.src,
15800
+ alt: avatar.name ? `${avatar.name}, ${T.liveAvatar}` : T.liveAvatar,
15801
+ loading: "lazy",
15802
+ decoding: "async",
15803
+ width: 128,
15804
+ height: 128,
15805
+ className: "h-32 w-32 rounded-full border border-border object-cover shadow-sm"
15806
+ }
15807
+ ),
15808
+ /* @__PURE__ */ jsx("p", { className: "text-base font-semibold", children: T.avatarComingSoon }),
15809
+ /* @__PURE__ */ jsx(
15810
+ "button",
15811
+ {
15812
+ type: "button",
15813
+ "data-boff-explore": "panel-continue-chat",
15814
+ 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",
15815
+ onClick: continueInChat,
15816
+ children: T.continueInChat
15817
+ }
15818
+ )
15819
+ ]
15820
+ }
15821
+ ) : null
15822
+ ] })
14742
15823
  ]
14743
15824
  }
14744
15825
  );
@@ -19526,6 +20607,6 @@ function shouldRenderSiteFooter(pathname) {
19526
20607
  return !isFooterlessPath(pathname);
19527
20608
  }
19528
20609
 
19529
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, BlogListPage, BlogPostPage, Button, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ConceptDetailPage, ConceptsPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, LEGAL_DOCUMENTS, LEGAL_DOCUMENT_KEYS, Label, LaunchCountdown, LegalPage, Markdown, NewsletterForm, NewsletterPage, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, PUBLISHED_ANSWER_FIELDS, PageHead, PartnersPage, PressKitPage, PricingPage, PricingProductKeyError, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, availablePlanCurrencies, buttonVariants, classifyExploreError, cleanPlanDisplayName, cn, conceptPath, detectElectronPlatform, emitProductSlug, exploreQuestionHref, fetchLegalContent, fetchLegalContentPage, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, fetchPublicProduct, findLegalDocument, formatAnswerDate, formatDownloads, formatLegalDate, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isInlineVideoAllowed, isPublishedSourceUrl, isSameProductSlug, isUuidLike, isValidUrl, legacyProductSlug, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeProductSlug, normalizeRoutePath, planPriceIn, productSlugVariants, productSlugsByOrigin, resolvePricingProductKey, shouldRenderSiteFooter, speechLocaleOf, splitLeadingHeading, stopSpeaking, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
20610
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, BlogListPage, BlogPostPage, Button, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CONCEPT_WORKFLOW_NOTICE, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ConceptDetailPage, ConceptsPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreChatProvider, ExploreCta, ExplorePage, ExplorePanel, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, LEGAL_DOCUMENTS, LEGAL_DOCUMENT_KEYS, Label, LaunchCountdown, LegalPage, Markdown, NewsletterForm, NewsletterPage, PRODUCT_SLUG_ALIASES, PRODUCT_SLUG_EMIT, PRODUCT_SLUG_RENAMES, PUBLISHED_ANSWER_FIELDS, PageHead, PartnersPage, PressKitPage, PricingPage, PricingProductKeyError, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, availablePlanCurrencies, buttonVariants, classifyExploreError, cleanPlanDisplayName, cn, conceptPath, detectElectronPlatform, emitProductSlug, exploreQuestionHref, fetchLegalContent, fetchLegalContentPage, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, fetchPublicProduct, findLegalDocument, formatAnswerDate, formatDownloads, formatLegalDate, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isInlineVideoAllowed, isPublishedSourceUrl, isSameProductSlug, isUuidLike, isValidUrl, legacyProductSlug, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeProductSlug, normalizeRoutePath, planPriceIn, productSlugVariants, productSlugsByOrigin, resolvePricingProductKey, shouldRenderSiteFooter, speechLocaleOf, splitLeadingHeading, stopSpeaking, useContentPage, useContentPages, useExploreChat, useExploreConversation, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
19530
20611
  //# sourceMappingURL=index.mjs.map
19531
20612
  //# sourceMappingURL=index.mjs.map