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