@burdenoff/website-sdk 2026.829.4 → 2026.829.6
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/dist/components/explore.d.mts +7 -1
- package/dist/components/explore.d.ts +7 -1
- package/dist/components/explore.js +881 -52
- package/dist/components/explore.js.map +1 -1
- package/dist/components/explore.mjs +882 -53
- package/dist/components/explore.mjs.map +1 -1
- package/dist/hooks/index.d.mts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +80 -7
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +80 -7
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.d.mts +66 -2
- package/dist/index.d.ts +66 -2
- package/dist/index.js +886 -56
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +887 -58
- package/dist/index.mjs.map +1 -1
- package/dist/{use-explore-chat-B-E7jN1H.d.mts → use-explore-chat-BzXCz2UM.d.mts} +38 -3
- package/dist/{use-explore-chat-B-E7jN1H.d.ts → use-explore-chat-BzXCz2UM.d.ts} +38 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4765,6 +4765,325 @@ function ElectronDownloadLink({
|
|
|
4765
4765
|
}
|
|
4766
4766
|
);
|
|
4767
4767
|
}
|
|
4768
|
+
|
|
4769
|
+
// src/components/explore-i18n.ts
|
|
4770
|
+
var EXPLORE_LOCALES = ["en", "zh", "hi", "es", "ar", "ta"];
|
|
4771
|
+
var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
|
|
4772
|
+
function isRtlLocale(locale) {
|
|
4773
|
+
return RTL_LOCALES.has(locale);
|
|
4774
|
+
}
|
|
4775
|
+
var EN = {
|
|
4776
|
+
badge: "AI answers, grounded in our documentation",
|
|
4777
|
+
welcomeTitle: "Ask anything about our products",
|
|
4778
|
+
welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
|
|
4779
|
+
tryAsking: "Try asking",
|
|
4780
|
+
focusProduct: "Focus on a product",
|
|
4781
|
+
allProducts: "All products",
|
|
4782
|
+
showAll: "All",
|
|
4783
|
+
showLess: "Show less",
|
|
4784
|
+
sources: "Sources",
|
|
4785
|
+
nextYouCouldAsk: "Next you could ask",
|
|
4786
|
+
placeholder: "Ask anything about our products\u2026",
|
|
4787
|
+
placeholderProduct: "Ask about {product}\u2026",
|
|
4788
|
+
send: "Send",
|
|
4789
|
+
stop: "Stop",
|
|
4790
|
+
newChat: "New chat",
|
|
4791
|
+
history: "History",
|
|
4792
|
+
clearHistory: "Clear history",
|
|
4793
|
+
share: "Share",
|
|
4794
|
+
copied: "Copied",
|
|
4795
|
+
copying: "Copying\u2026",
|
|
4796
|
+
shareUnavailable: "Unavailable",
|
|
4797
|
+
disclaimer: "Disclaimer",
|
|
4798
|
+
disclaimerShort: "Grounded in our docs \u2014 check anything important.",
|
|
4799
|
+
dictate: "Dictate your question",
|
|
4800
|
+
stopDictating: "Stop dictating",
|
|
4801
|
+
attach: "Attach files",
|
|
4802
|
+
attachHint: "Up to {{max}} files, {{size}} MB each",
|
|
4803
|
+
removeAttachment: "Remove {{name}}",
|
|
4804
|
+
attachmentNameOnly: "name and type only",
|
|
4805
|
+
attachmentTooLarge: "{{name}} is larger than {{size}} MB and was not attached.",
|
|
4806
|
+
attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
|
|
4807
|
+
noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
|
|
4808
|
+
askHuman: "ask a human",
|
|
4809
|
+
prevSuggestion: "Previous suggestion",
|
|
4810
|
+
nextSuggestion: "Next suggestion",
|
|
4811
|
+
capabilities: [
|
|
4812
|
+
"Grounded in our own docs",
|
|
4813
|
+
"Compare across the ecosystem",
|
|
4814
|
+
"Straight to the right page"
|
|
4815
|
+
],
|
|
4816
|
+
prompts: [
|
|
4817
|
+
"What does this product actually do?",
|
|
4818
|
+
"Which product fits my team?",
|
|
4819
|
+
"How do I get started, step by step?",
|
|
4820
|
+
"How much does it cost?"
|
|
4821
|
+
]
|
|
4822
|
+
};
|
|
4823
|
+
var ZH = {
|
|
4824
|
+
badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
|
|
4825
|
+
welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
|
|
4826
|
+
welcomeBody: "\u63CF\u8FF0\u4F60\u60F3\u505A\u7684\u4E8B\uFF0C\u6211\u4F1A\u4E3A\u4F60\u6307\u51FA\u5BF9\u5E94\u7684\u4EA7\u54C1\u3001\u9875\u9762\u548C\u4E0B\u4E00\u6B65\u3002",
|
|
4827
|
+
tryAsking: "\u8BD5\u7740\u95EE",
|
|
4828
|
+
focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
|
|
4829
|
+
allProducts: "\u5168\u90E8\u4EA7\u54C1",
|
|
4830
|
+
showAll: "\u5168\u90E8",
|
|
4831
|
+
showLess: "\u6536\u8D77",
|
|
4832
|
+
sources: "\u6765\u6E90",
|
|
4833
|
+
nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
|
|
4834
|
+
placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
|
|
4835
|
+
placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
|
|
4836
|
+
send: "\u53D1\u9001",
|
|
4837
|
+
stop: "\u505C\u6B62",
|
|
4838
|
+
newChat: "\u65B0\u5BF9\u8BDD",
|
|
4839
|
+
history: "\u5386\u53F2",
|
|
4840
|
+
clearHistory: "\u6E05\u9664\u5386\u53F2",
|
|
4841
|
+
share: "\u5206\u4EAB",
|
|
4842
|
+
copied: "\u5DF2\u590D\u5236",
|
|
4843
|
+
copying: "\u590D\u5236\u4E2D\u2026",
|
|
4844
|
+
shareUnavailable: "\u4E0D\u53EF\u7528",
|
|
4845
|
+
disclaimer: "\u514D\u8D23\u58F0\u660E",
|
|
4846
|
+
disclaimerShort: "\u5185\u5BB9\u57FA\u4E8E\u6211\u4EEC\u7684\u6587\u6863\uFF0C\u91CD\u8981\u4FE1\u606F\u8BF7\u81EA\u884C\u6838\u5BF9\u3002",
|
|
4847
|
+
dictate: "\u8BED\u97F3\u8F93\u5165",
|
|
4848
|
+
stopDictating: "\u505C\u6B62\u8BED\u97F3\u8F93\u5165",
|
|
4849
|
+
attach: "\u6DFB\u52A0\u6587\u4EF6",
|
|
4850
|
+
attachHint: "\u6700\u591A {{max}} \u4E2A\u6587\u4EF6\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 {{size}} MB",
|
|
4851
|
+
removeAttachment: "\u79FB\u9664 {{name}}",
|
|
4852
|
+
attachmentNameOnly: "\u4EC5\u6587\u4EF6\u540D\u548C\u7C7B\u578B",
|
|
4853
|
+
attachmentTooLarge: "{{name}} \u8D85\u8FC7 {{size}} MB\uFF0C\u672A\u80FD\u6DFB\u52A0\u3002",
|
|
4854
|
+
attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
|
|
4855
|
+
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",
|
|
4856
|
+
askHuman: "\u8054\u7CFB\u6211\u4EEC",
|
|
4857
|
+
prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
|
|
4858
|
+
nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
|
|
4859
|
+
capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
|
|
4860
|
+
prompts: [
|
|
4861
|
+
"\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
|
|
4862
|
+
"\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
|
|
4863
|
+
"\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
|
|
4864
|
+
"\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
|
|
4865
|
+
]
|
|
4866
|
+
};
|
|
4867
|
+
var HI = {
|
|
4868
|
+
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",
|
|
4869
|
+
welcomeTitle: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902",
|
|
4870
|
+
welcomeBody: "\u092C\u0924\u093E\u0907\u090F \u0906\u092A \u0915\u094D\u092F\u093E \u0915\u0930\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902, \u0914\u0930 \u092E\u0948\u0902 \u0906\u092A\u0915\u094B \u0938\u0939\u0940 \u0909\u0924\u094D\u092A\u093E\u0926, \u092A\u0947\u091C \u0914\u0930 \u0905\u0917\u0932\u093E \u0915\u0926\u092E \u092C\u0924\u093E\u090A\u0901\u0917\u093E\u0964",
|
|
4871
|
+
tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
|
|
4872
|
+
focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
|
|
4873
|
+
allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
|
|
4874
|
+
showAll: "\u0938\u092D\u0940",
|
|
4875
|
+
showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
|
|
4876
|
+
sources: "\u0938\u094D\u0930\u094B\u0924",
|
|
4877
|
+
nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
|
|
4878
|
+
placeholder: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902\u2026",
|
|
4879
|
+
placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
|
|
4880
|
+
send: "\u092D\u0947\u091C\u0947\u0902",
|
|
4881
|
+
stop: "\u0930\u094B\u0915\u0947\u0902",
|
|
4882
|
+
newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
|
|
4883
|
+
history: "\u0907\u0924\u093F\u0939\u093E\u0938",
|
|
4884
|
+
clearHistory: "\u0907\u0924\u093F\u0939\u093E\u0938 \u092E\u093F\u091F\u093E\u090F\u0901",
|
|
4885
|
+
share: "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
|
|
4886
|
+
copied: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E",
|
|
4887
|
+
copying: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
|
|
4888
|
+
shareUnavailable: "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
|
|
4889
|
+
disclaimer: "\u0905\u0938\u094D\u0935\u0940\u0915\u0930\u0923",
|
|
4890
|
+
disclaimerShort: "\u092F\u0939 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948 \u2014 \u092E\u0939\u0924\u094D\u0935\u092A\u0942\u0930\u094D\u0923 \u092C\u093E\u0924\u0947\u0902 \u091C\u093C\u0930\u0942\u0930 \u091C\u093E\u0901\u091A \u0932\u0947\u0902\u0964",
|
|
4891
|
+
dictate: "\u092C\u094B\u0932\u0915\u0930 \u092A\u0942\u091B\u0947\u0902",
|
|
4892
|
+
stopDictating: "\u092C\u094B\u0932\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
|
|
4893
|
+
attach: "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
|
|
4894
|
+
attachHint: "\u0905\u0927\u093F\u0915\u0924\u092E {{max}} \u092B\u093C\u093E\u0907\u0932\u0947\u0902, \u092A\u094D\u0930\u0924\u094D\u092F\u0947\u0915 {{size}} MB \u0924\u0915",
|
|
4895
|
+
removeAttachment: "{{name}} \u0939\u091F\u093E\u090F\u0901",
|
|
4896
|
+
attachmentNameOnly: "\u0915\u0947\u0935\u0932 \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u0915\u093E\u0930",
|
|
4897
|
+
attachmentTooLarge: "{{name}} {{size}} MB \u0938\u0947 \u092C\u0921\u093C\u0940 \u0939\u0948, \u0907\u0938\u0932\u093F\u090F \u091C\u094B\u0921\u093C\u0940 \u0928\u0939\u0940\u0902 \u0917\u0908\u0964",
|
|
4898
|
+
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",
|
|
4899
|
+
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",
|
|
4900
|
+
askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
|
|
4901
|
+
prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
4902
|
+
nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
4903
|
+
capabilities: [
|
|
4904
|
+
"\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",
|
|
4905
|
+
"\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
|
|
4906
|
+
"\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
|
|
4907
|
+
],
|
|
4908
|
+
prompts: [
|
|
4909
|
+
"\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
|
|
4910
|
+
"\u092E\u0947\u0930\u0940 \u091F\u0940\u092E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?",
|
|
4911
|
+
"\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
|
|
4912
|
+
"\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
|
|
4913
|
+
]
|
|
4914
|
+
};
|
|
4915
|
+
var ES = {
|
|
4916
|
+
badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
|
|
4917
|
+
welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
|
|
4918
|
+
welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
|
|
4919
|
+
tryAsking: "Prueba a preguntar",
|
|
4920
|
+
focusProduct: "Centrarse en un producto",
|
|
4921
|
+
allProducts: "Todos los productos",
|
|
4922
|
+
showAll: "Todos",
|
|
4923
|
+
showLess: "Ver menos",
|
|
4924
|
+
sources: "Fuentes",
|
|
4925
|
+
nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
|
|
4926
|
+
placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
|
|
4927
|
+
placeholderProduct: "Pregunta sobre {product}\u2026",
|
|
4928
|
+
send: "Enviar",
|
|
4929
|
+
stop: "Detener",
|
|
4930
|
+
newChat: "Nueva conversaci\xF3n",
|
|
4931
|
+
history: "Historial",
|
|
4932
|
+
clearHistory: "Borrar historial",
|
|
4933
|
+
share: "Compartir",
|
|
4934
|
+
copied: "Copiado",
|
|
4935
|
+
copying: "Copiando\u2026",
|
|
4936
|
+
shareUnavailable: "No disponible",
|
|
4937
|
+
disclaimer: "Aviso",
|
|
4938
|
+
disclaimerShort: "Basado en nuestra documentaci\xF3n: comprueba cualquier dato importante.",
|
|
4939
|
+
dictate: "Dictar tu pregunta",
|
|
4940
|
+
stopDictating: "Dejar de dictar",
|
|
4941
|
+
attach: "Adjuntar archivos",
|
|
4942
|
+
attachHint: "Hasta {{max}} archivos, {{size}} MB cada uno",
|
|
4943
|
+
removeAttachment: "Quitar {{name}}",
|
|
4944
|
+
attachmentNameOnly: "solo nombre y tipo",
|
|
4945
|
+
attachmentTooLarge: "{{name}} supera los {{size}} MB y no se adjunt\xF3.",
|
|
4946
|
+
attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
|
|
4947
|
+
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",
|
|
4948
|
+
askHuman: "habla con una persona",
|
|
4949
|
+
prevSuggestion: "Sugerencia anterior",
|
|
4950
|
+
nextSuggestion: "Sugerencia siguiente",
|
|
4951
|
+
capabilities: [
|
|
4952
|
+
"Basado en nuestra documentaci\xF3n",
|
|
4953
|
+
"Compara todo el ecosistema",
|
|
4954
|
+
"Directo a la p\xE1gina correcta"
|
|
4955
|
+
],
|
|
4956
|
+
prompts: [
|
|
4957
|
+
"\xBFQu\xE9 hace realmente este producto?",
|
|
4958
|
+
"\xBFQu\xE9 producto encaja con mi equipo?",
|
|
4959
|
+
"\xBFC\xF3mo empiezo, paso a paso?",
|
|
4960
|
+
"\xBFCu\xE1nto cuesta?"
|
|
4961
|
+
]
|
|
4962
|
+
};
|
|
4963
|
+
var AR = {
|
|
4964
|
+
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",
|
|
4965
|
+
welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
|
|
4966
|
+
welcomeBody: "\u0635\u0650\u0641 \u0645\u0627 \u062A\u0631\u064A\u062F \u0625\u0646\u062C\u0627\u0632\u0647 \u0648\u0633\u0623\u062F\u0644\u0651\u0643 \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u062A\u062C \u0648\u0627\u0644\u0635\u0641\u062D\u0629 \u0648\u0627\u0644\u062E\u0637\u0648\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629.",
|
|
4967
|
+
tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
|
|
4968
|
+
focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
|
|
4969
|
+
allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
|
|
4970
|
+
showAll: "\u0627\u0644\u0643\u0644",
|
|
4971
|
+
showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
|
|
4972
|
+
sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
|
|
4973
|
+
nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
|
|
4974
|
+
placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
|
|
4975
|
+
placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
|
|
4976
|
+
send: "\u0625\u0631\u0633\u0627\u0644",
|
|
4977
|
+
stop: "\u0625\u064A\u0642\u0627\u0641",
|
|
4978
|
+
newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
|
|
4979
|
+
history: "\u0627\u0644\u0633\u062C\u0644",
|
|
4980
|
+
clearHistory: "\u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644",
|
|
4981
|
+
share: "\u0645\u0634\u0627\u0631\u0643\u0629",
|
|
4982
|
+
copied: "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
|
|
4983
|
+
copying: "\u062C\u0627\u0631\u064D \u0627\u0644\u0646\u0633\u062E\u2026",
|
|
4984
|
+
shareUnavailable: "\u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
|
|
4985
|
+
disclaimer: "\u0625\u062E\u0644\u0627\u0621 \u0645\u0633\u0624\u0648\u0644\u064A\u0629",
|
|
4986
|
+
disclaimerShort: "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627 \u2014 \u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0623\u064A \u0645\u0639\u0644\u0648\u0645\u0629 \u0645\u0647\u0645\u0629.",
|
|
4987
|
+
dictate: "\u0623\u0645\u0644\u0650 \u0633\u0624\u0627\u0644\u0643",
|
|
4988
|
+
stopDictating: "\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0625\u0645\u0644\u0627\u0621",
|
|
4989
|
+
attach: "\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641\u0627\u062A",
|
|
4990
|
+
attachHint: "\u062D\u062A\u0649 {{max}} \u0645\u0644\u0641\u0627\u062A\u060C \u0628\u062D\u062F \u0623\u0642\u0635\u0649 {{size}} \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A \u0644\u0643\u0644 \u0645\u0644\u0641",
|
|
4991
|
+
removeAttachment: "\u0625\u0632\u0627\u0644\u0629 {{name}}",
|
|
4992
|
+
attachmentNameOnly: "\u0627\u0644\u0627\u0633\u0645 \u0648\u0627\u0644\u0646\u0648\u0639 \u0641\u0642\u0637",
|
|
4993
|
+
attachmentTooLarge: "{{name}} \u0623\u0643\u0628\u0631 \u0645\u0646 {{size}} \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A \u0648\u0644\u0645 \u064A\u062A\u0645 \u0625\u0631\u0641\u0627\u0642\u0647.",
|
|
4994
|
+
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}}.",
|
|
4995
|
+
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",
|
|
4996
|
+
askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
|
|
4997
|
+
prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
|
|
4998
|
+
nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
|
|
4999
|
+
capabilities: [
|
|
5000
|
+
"\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
|
|
5001
|
+
"\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
|
|
5002
|
+
"\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
|
|
5003
|
+
],
|
|
5004
|
+
prompts: [
|
|
5005
|
+
"\u0645\u0627 \u0627\u0644\u0630\u064A \u064A\u0641\u0639\u0644\u0647 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u062A\u062C \u0641\u0639\u0644\u064A\u064B\u0627\u061F",
|
|
5006
|
+
"\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
|
|
5007
|
+
"\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
|
|
5008
|
+
"\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
|
|
5009
|
+
]
|
|
5010
|
+
};
|
|
5011
|
+
var TA = {
|
|
5012
|
+
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",
|
|
5013
|
+
welcomeTitle: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF \u0B8E\u0BA4\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
5014
|
+
welcomeBody: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BC6\u0BAF\u0BCD\u0BAF \u0BB5\u0BBF\u0BB0\u0BC1\u0BAE\u0BCD\u0BAA\u0BC1\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA9\u0BCD\u0BB1\u0BC1 \u0B9A\u0BCA\u0BB2\u0BCD\u0BB2\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD; \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1, \u0BAA\u0B95\u0BCD\u0B95\u0BAE\u0BCD, \u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0B9F\u0BBF \u0B86\u0B95\u0BBF\u0BAF\u0BB5\u0BB1\u0BCD\u0BB1\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BBF\u0BB1\u0BC7\u0BA9\u0BCD.",
|
|
5015
|
+
tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
5016
|
+
focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
|
|
5017
|
+
allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
|
|
5018
|
+
showAll: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD",
|
|
5019
|
+
showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
|
|
5020
|
+
sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
5021
|
+
nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
|
|
5022
|
+
placeholder: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF \u0B8E\u0BA4\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
|
|
5023
|
+
placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
|
|
5024
|
+
send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
5025
|
+
stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
|
|
5026
|
+
newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
|
|
5027
|
+
history: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BC1",
|
|
5028
|
+
clearHistory: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BCD\u0BB1\u0BC8 \u0B85\u0BB4\u0BBF",
|
|
5029
|
+
share: "\u0BAA\u0B95\u0BBF\u0BB0\u0BCD",
|
|
5030
|
+
copied: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
|
|
5031
|
+
copying: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
|
|
5032
|
+
shareUnavailable: "\u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
|
|
5033
|
+
disclaimer: "\u0BAA\u0BCA\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BA4\u0BCD \u0BA4\u0BC1\u0BB1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
5034
|
+
disclaimerShort: "\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\u0BA4\u0BC1 \u2014 \u0BAE\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BAF\u0BAE\u0BBE\u0BA9\u0BA4\u0BC8\u0B9A\u0BCD \u0B9A\u0BB0\u0BBF\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
|
|
5035
|
+
dictate: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0BAF\u0BC8\u0BAA\u0BCD \u0BAA\u0BC7\u0B9A\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
5036
|
+
stopDictating: "\u0BAA\u0BC7\u0B9A\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
|
|
5037
|
+
attach: "\u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95",
|
|
5038
|
+
attachHint: "\u0B85\u0BA4\u0BBF\u0B95\u0BAA\u0B9F\u0BCD\u0B9A\u0BAE\u0BCD {{max}} \u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD, \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BA9\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD {{size}} MB \u0BB5\u0BB0\u0BC8",
|
|
5039
|
+
removeAttachment: "{{name}} \u0B85\u0B95\u0BB1\u0BCD\u0BB1\u0BC1",
|
|
5040
|
+
attachmentNameOnly: "\u0BAA\u0BC6\u0BAF\u0BB0\u0BC1\u0BAE\u0BCD \u0BB5\u0B95\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD",
|
|
5041
|
+
attachmentTooLarge: "{{name}} {{size}} MB-\u0B90 \u0BB5\u0BBF\u0B9F \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1, \u0B8E\u0BA9\u0BB5\u0BC7 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
|
|
5042
|
+
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.",
|
|
5043
|
+
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",
|
|
5044
|
+
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",
|
|
5045
|
+
prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
5046
|
+
nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
5047
|
+
capabilities: [
|
|
5048
|
+
"\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",
|
|
5049
|
+
"\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
5050
|
+
"\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
|
|
5051
|
+
],
|
|
5052
|
+
prompts: [
|
|
5053
|
+
"\u0B87\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0B89\u0BA3\u0BCD\u0BAE\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BC6\u0BAF\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1?",
|
|
5054
|
+
"\u0B8E\u0BA9\u0BCD \u0B95\u0BC1\u0BB4\u0BC1\u0BB5\u0BBF\u0BB1\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?",
|
|
5055
|
+
"\u0BAA\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0BA4\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95\u0BC1\u0BB5\u0BA4\u0BC1?",
|
|
5056
|
+
"\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
|
|
5057
|
+
]
|
|
5058
|
+
};
|
|
5059
|
+
var STRINGS = {
|
|
5060
|
+
en: EN,
|
|
5061
|
+
zh: ZH,
|
|
5062
|
+
hi: HI,
|
|
5063
|
+
es: ES,
|
|
5064
|
+
ar: AR,
|
|
5065
|
+
ta: TA
|
|
5066
|
+
};
|
|
5067
|
+
function resolveExploreLocale(explicit) {
|
|
5068
|
+
const candidates = [
|
|
5069
|
+
explicit,
|
|
5070
|
+
typeof document === "undefined" ? void 0 : document.documentElement.lang,
|
|
5071
|
+
typeof navigator === "undefined" ? void 0 : navigator.language
|
|
5072
|
+
];
|
|
5073
|
+
for (const candidate of candidates) {
|
|
5074
|
+
if (!candidate) continue;
|
|
5075
|
+
const primary = candidate.toLowerCase().split("-")[0];
|
|
5076
|
+
const match = EXPLORE_LOCALES.find((locale) => locale === primary);
|
|
5077
|
+
if (match) return match;
|
|
5078
|
+
}
|
|
5079
|
+
return "en";
|
|
5080
|
+
}
|
|
5081
|
+
function exploreStrings(locale) {
|
|
5082
|
+
return STRINGS[locale] ?? EN;
|
|
5083
|
+
}
|
|
5084
|
+
function fill(template, values) {
|
|
5085
|
+
return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
|
|
5086
|
+
}
|
|
4768
5087
|
var PROSE_CSS = `
|
|
4769
5088
|
.boff-prose {
|
|
4770
5089
|
max-width: none;
|
|
@@ -4969,6 +5288,12 @@ var EXPLORE_MESSAGE_FIELDS = (
|
|
|
4969
5288
|
}
|
|
4970
5289
|
followUps
|
|
4971
5290
|
answered
|
|
5291
|
+
attachments {
|
|
5292
|
+
name
|
|
5293
|
+
mimeType
|
|
5294
|
+
size
|
|
5295
|
+
textExtracted
|
|
5296
|
+
}
|
|
4972
5297
|
errorCode
|
|
4973
5298
|
createdAt
|
|
4974
5299
|
completedAt
|
|
@@ -5054,6 +5379,16 @@ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
|
|
|
5054
5379
|
}
|
|
5055
5380
|
`
|
|
5056
5381
|
);
|
|
5382
|
+
var EXPLORE_SHARED_CONVERSATION_QUERY = (
|
|
5383
|
+
/* GraphQL */
|
|
5384
|
+
`
|
|
5385
|
+
query ExploreSharedConversation($shareToken: String!) {
|
|
5386
|
+
exploreSharedConversation(shareToken: $shareToken) {
|
|
5387
|
+
${EXPLORE_MESSAGE_FIELDS}
|
|
5388
|
+
}
|
|
5389
|
+
}
|
|
5390
|
+
`
|
|
5391
|
+
);
|
|
5057
5392
|
|
|
5058
5393
|
// src/data/products.ts
|
|
5059
5394
|
var ECOSYSTEM_PRODUCTS = [
|
|
@@ -5504,6 +5839,14 @@ function readPersisted(key) {
|
|
|
5504
5839
|
return null;
|
|
5505
5840
|
}
|
|
5506
5841
|
}
|
|
5842
|
+
function readShareToken() {
|
|
5843
|
+
if (typeof window === "undefined") return null;
|
|
5844
|
+
try {
|
|
5845
|
+
return new URL(window.location.href).searchParams.get("c");
|
|
5846
|
+
} catch {
|
|
5847
|
+
return null;
|
|
5848
|
+
}
|
|
5849
|
+
}
|
|
5507
5850
|
function visibleText(message) {
|
|
5508
5851
|
return message.content || message.partialContent || "";
|
|
5509
5852
|
}
|
|
@@ -5542,10 +5885,18 @@ function useExploreChat(options = {}) {
|
|
|
5542
5885
|
const pollGenerationRef = React.useRef(0);
|
|
5543
5886
|
const pollTimerRef = React.useRef(null);
|
|
5544
5887
|
const conversationTokenRef = React.useRef(null);
|
|
5888
|
+
const shareTokenRef = React.useRef(void 0);
|
|
5889
|
+
if (shareTokenRef.current === void 0) {
|
|
5890
|
+
shareTokenRef.current = readShareToken();
|
|
5891
|
+
}
|
|
5892
|
+
const isSharedView = shareTokenRef.current !== null;
|
|
5545
5893
|
const catalogRef = React.useRef(fallbackCatalog);
|
|
5546
5894
|
const turnCountRef = React.useRef(0);
|
|
5547
5895
|
const focusProductRef = React.useRef(null);
|
|
5548
5896
|
const lastSentTextRef = React.useRef(null);
|
|
5897
|
+
const lastSentAttachmentsRef = React.useRef(
|
|
5898
|
+
[]
|
|
5899
|
+
);
|
|
5549
5900
|
const inFlightRef = React.useRef(false);
|
|
5550
5901
|
catalogRef.current = catalog;
|
|
5551
5902
|
const clearPollTimer = React.useCallback(() => {
|
|
@@ -5570,6 +5921,43 @@ function useExploreChat(options = {}) {
|
|
|
5570
5921
|
};
|
|
5571
5922
|
}, []);
|
|
5572
5923
|
React.useEffect(() => {
|
|
5924
|
+
const shareToken = shareTokenRef.current;
|
|
5925
|
+
if (!shareToken) return;
|
|
5926
|
+
let cancelled = false;
|
|
5927
|
+
setHydrated(true);
|
|
5928
|
+
void client.query(
|
|
5929
|
+
EXPLORE_SHARED_CONVERSATION_QUERY,
|
|
5930
|
+
{ shareToken },
|
|
5931
|
+
{ cache: false }
|
|
5932
|
+
).then((res) => {
|
|
5933
|
+
if (cancelled || !mountedRef.current) return;
|
|
5934
|
+
const shared = res?.data?.exploreSharedConversation;
|
|
5935
|
+
if (shared && shared.length > 0) {
|
|
5936
|
+
setMessages(shared);
|
|
5937
|
+
return;
|
|
5938
|
+
}
|
|
5939
|
+
setError({
|
|
5940
|
+
kind: "unknown",
|
|
5941
|
+
code: "SHARE_NOT_FOUND",
|
|
5942
|
+
message: "That shared conversation could not be found. The link may have expired.",
|
|
5943
|
+
// Nothing to retry: a bad token will stay bad.
|
|
5944
|
+
retryable: false
|
|
5945
|
+
});
|
|
5946
|
+
}).catch(() => {
|
|
5947
|
+
if (cancelled || !mountedRef.current) return;
|
|
5948
|
+
setError({
|
|
5949
|
+
kind: "unknown",
|
|
5950
|
+
code: "SHARE_NOT_FOUND",
|
|
5951
|
+
message: "That shared conversation could not be loaded.",
|
|
5952
|
+
retryable: true
|
|
5953
|
+
});
|
|
5954
|
+
});
|
|
5955
|
+
return () => {
|
|
5956
|
+
cancelled = true;
|
|
5957
|
+
};
|
|
5958
|
+
}, [client]);
|
|
5959
|
+
React.useEffect(() => {
|
|
5960
|
+
if (shareTokenRef.current !== null) return;
|
|
5573
5961
|
if (!persist) {
|
|
5574
5962
|
setHydrated(true);
|
|
5575
5963
|
return;
|
|
@@ -5737,7 +6125,7 @@ function useExploreChat(options = {}) {
|
|
|
5737
6125
|
[client, pollIntervalMs, pollTimeoutMs]
|
|
5738
6126
|
);
|
|
5739
6127
|
const submit = React.useCallback(
|
|
5740
|
-
async (text, optimisticId, captchaAttempt) => {
|
|
6128
|
+
async (text, optimisticId, captchaAttempt, attachments) => {
|
|
5741
6129
|
const activeCatalog = catalogRef.current;
|
|
5742
6130
|
let recaptchaToken;
|
|
5743
6131
|
if (activeCatalog.captchaRequired && activeCatalog.recaptchaSiteKey) {
|
|
@@ -5755,7 +6143,8 @@ function useExploreChat(options = {}) {
|
|
|
5755
6143
|
...focusProductRef.current || productSlug ? { productSlug: focusProductRef.current ?? productSlug } : {},
|
|
5756
6144
|
...recaptchaToken ? { recaptchaToken } : {},
|
|
5757
6145
|
...locale ? { locale } : {},
|
|
5758
|
-
...pageUrl ? { pageUrl } : {}
|
|
6146
|
+
...pageUrl ? { pageUrl } : {},
|
|
6147
|
+
...attachments.length > 0 ? { attachments: [...attachments] } : {}
|
|
5759
6148
|
};
|
|
5760
6149
|
const res = await client.mutate(
|
|
5761
6150
|
SEND_EXPLORE_MESSAGE_MUTATION,
|
|
@@ -5769,7 +6158,7 @@ function useExploreChat(options = {}) {
|
|
|
5769
6158
|
const code = typeof first?.extensions?.code === "string" ? first.extensions.code : void 0;
|
|
5770
6159
|
const classified = classifyExploreError(code, first?.message);
|
|
5771
6160
|
if (classified.kind === "captcha" && captchaAttempt === 0) {
|
|
5772
|
-
await submit(text, optimisticId, 1);
|
|
6161
|
+
await submit(text, optimisticId, 1, attachments);
|
|
5773
6162
|
return;
|
|
5774
6163
|
}
|
|
5775
6164
|
inFlightRef.current = false;
|
|
@@ -5806,7 +6195,7 @@ function useExploreChat(options = {}) {
|
|
|
5806
6195
|
[client, locale, pageUrl, productSlug, startPolling]
|
|
5807
6196
|
);
|
|
5808
6197
|
const send = React.useCallback(
|
|
5809
|
-
async (message) => {
|
|
6198
|
+
async (message, attachments = []) => {
|
|
5810
6199
|
const text = message.trim();
|
|
5811
6200
|
if (!text) return;
|
|
5812
6201
|
if (inFlightRef.current) return;
|
|
@@ -5836,6 +6225,7 @@ function useExploreChat(options = {}) {
|
|
|
5836
6225
|
}
|
|
5837
6226
|
inFlightRef.current = true;
|
|
5838
6227
|
lastSentTextRef.current = text;
|
|
6228
|
+
lastSentAttachmentsRef.current = attachments;
|
|
5839
6229
|
setError(null);
|
|
5840
6230
|
setPhase("sending");
|
|
5841
6231
|
cancelPolling();
|
|
@@ -5858,7 +6248,7 @@ function useExploreChat(options = {}) {
|
|
|
5858
6248
|
setTurnCount(turnCountRef.current);
|
|
5859
6249
|
onSend?.(text);
|
|
5860
6250
|
try {
|
|
5861
|
-
await submit(text, optimistic.id, 0);
|
|
6251
|
+
await submit(text, optimistic.id, 0, attachments);
|
|
5862
6252
|
} catch (err) {
|
|
5863
6253
|
if (!mountedRef.current) return;
|
|
5864
6254
|
console.error("[WebSDK] Explore send failed", err);
|
|
@@ -5907,7 +6297,7 @@ function useExploreChat(options = {}) {
|
|
|
5907
6297
|
});
|
|
5908
6298
|
turnCountRef.current = Math.max(0, turnCountRef.current - 1);
|
|
5909
6299
|
setTurnCount(turnCountRef.current);
|
|
5910
|
-
void send(text);
|
|
6300
|
+
void send(text, lastSentAttachmentsRef.current);
|
|
5911
6301
|
}, [cancelPolling, send]);
|
|
5912
6302
|
const reset = React.useCallback(() => {
|
|
5913
6303
|
setArchive(
|
|
@@ -5921,6 +6311,7 @@ function useExploreChat(options = {}) {
|
|
|
5921
6311
|
inFlightRef.current = false;
|
|
5922
6312
|
conversationTokenRef.current = null;
|
|
5923
6313
|
lastSentTextRef.current = null;
|
|
6314
|
+
lastSentAttachmentsRef.current = [];
|
|
5924
6315
|
turnCountRef.current = 0;
|
|
5925
6316
|
setTurnCount(0);
|
|
5926
6317
|
setMessages([]);
|
|
@@ -6029,7 +6420,8 @@ function useExploreChat(options = {}) {
|
|
|
6029
6420
|
deleteConversation,
|
|
6030
6421
|
clearHistory,
|
|
6031
6422
|
recordClick,
|
|
6032
|
-
createShareLink
|
|
6423
|
+
createShareLink,
|
|
6424
|
+
isSharedView
|
|
6033
6425
|
};
|
|
6034
6426
|
}
|
|
6035
6427
|
var optimisticCounter = 0;
|
|
@@ -6255,6 +6647,178 @@ function useSpeechInput({
|
|
|
6255
6647
|
);
|
|
6256
6648
|
return { supported, listening, interim, error, start, stop, toggle };
|
|
6257
6649
|
}
|
|
6650
|
+
var SWIPE_THRESHOLD = 40;
|
|
6651
|
+
function useSwipe({
|
|
6652
|
+
onSwipeLeft,
|
|
6653
|
+
onSwipeRight,
|
|
6654
|
+
enabled = true
|
|
6655
|
+
}) {
|
|
6656
|
+
const start = React.useRef(null);
|
|
6657
|
+
const onPointerDown = React.useCallback(
|
|
6658
|
+
(event) => {
|
|
6659
|
+
if (!enabled) return;
|
|
6660
|
+
start.current = { x: event.clientX, y: event.clientY };
|
|
6661
|
+
},
|
|
6662
|
+
[enabled]
|
|
6663
|
+
);
|
|
6664
|
+
const onPointerUp = React.useCallback(
|
|
6665
|
+
(event) => {
|
|
6666
|
+
const from = start.current;
|
|
6667
|
+
start.current = null;
|
|
6668
|
+
if (!enabled || !from) return;
|
|
6669
|
+
const dx = event.clientX - from.x;
|
|
6670
|
+
const dy = event.clientY - from.y;
|
|
6671
|
+
if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dx) <= Math.abs(dy))
|
|
6672
|
+
return;
|
|
6673
|
+
if (dx < 0) onSwipeLeft?.();
|
|
6674
|
+
else onSwipeRight?.();
|
|
6675
|
+
},
|
|
6676
|
+
[enabled, onSwipeLeft, onSwipeRight]
|
|
6677
|
+
);
|
|
6678
|
+
const onPointerCancel = React.useCallback(() => {
|
|
6679
|
+
start.current = null;
|
|
6680
|
+
}, []);
|
|
6681
|
+
return { onPointerDown, onPointerUp, onPointerCancel };
|
|
6682
|
+
}
|
|
6683
|
+
|
|
6684
|
+
// src/utils/explore-attachments.ts
|
|
6685
|
+
var MAX_ATTACHMENTS = 5;
|
|
6686
|
+
var MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
|
|
6687
|
+
var MAX_TEXT_PER_ATTACHMENT = 2e4;
|
|
6688
|
+
var TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
6689
|
+
"txt",
|
|
6690
|
+
"md",
|
|
6691
|
+
"markdown",
|
|
6692
|
+
"csv",
|
|
6693
|
+
"tsv",
|
|
6694
|
+
"json",
|
|
6695
|
+
"jsonl",
|
|
6696
|
+
"yaml",
|
|
6697
|
+
"yml",
|
|
6698
|
+
"toml",
|
|
6699
|
+
"ini",
|
|
6700
|
+
"cfg",
|
|
6701
|
+
"conf",
|
|
6702
|
+
"env",
|
|
6703
|
+
"log",
|
|
6704
|
+
"sql",
|
|
6705
|
+
"graphql",
|
|
6706
|
+
"gql",
|
|
6707
|
+
"html",
|
|
6708
|
+
"htm",
|
|
6709
|
+
"xml",
|
|
6710
|
+
"svg",
|
|
6711
|
+
"css",
|
|
6712
|
+
"scss",
|
|
6713
|
+
"js",
|
|
6714
|
+
"jsx",
|
|
6715
|
+
"mjs",
|
|
6716
|
+
"cjs",
|
|
6717
|
+
"ts",
|
|
6718
|
+
"tsx",
|
|
6719
|
+
"py",
|
|
6720
|
+
"rb",
|
|
6721
|
+
"go",
|
|
6722
|
+
"rs",
|
|
6723
|
+
"java",
|
|
6724
|
+
"kt",
|
|
6725
|
+
"c",
|
|
6726
|
+
"h",
|
|
6727
|
+
"cpp",
|
|
6728
|
+
"cs",
|
|
6729
|
+
"php",
|
|
6730
|
+
"sh",
|
|
6731
|
+
"bash",
|
|
6732
|
+
"zsh",
|
|
6733
|
+
"ps1",
|
|
6734
|
+
"dockerfile",
|
|
6735
|
+
"tf",
|
|
6736
|
+
"tfvars"
|
|
6737
|
+
]);
|
|
6738
|
+
function isTextualMimeType(mimeType) {
|
|
6739
|
+
if (mimeType.startsWith("text/")) return true;
|
|
6740
|
+
return mimeType === "application/json" || mimeType === "application/xml" || mimeType === "application/yaml" || mimeType === "application/x-yaml" || mimeType === "application/javascript" || mimeType === "application/graphql" || mimeType.endsWith("+json") || mimeType.endsWith("+xml");
|
|
6741
|
+
}
|
|
6742
|
+
function extensionOf(name) {
|
|
6743
|
+
const dot = name.lastIndexOf(".");
|
|
6744
|
+
if (dot <= 0 || dot === name.length - 1) return "";
|
|
6745
|
+
return name.slice(dot + 1).toLowerCase();
|
|
6746
|
+
}
|
|
6747
|
+
function looksTextual(name, mimeType) {
|
|
6748
|
+
if (isTextualMimeType(mimeType)) return true;
|
|
6749
|
+
return TEXT_EXTENSIONS.has(extensionOf(name));
|
|
6750
|
+
}
|
|
6751
|
+
function isDecodedTextUsable(decoded) {
|
|
6752
|
+
if (decoded.length === 0) return false;
|
|
6753
|
+
if (decoded.includes("\0")) return false;
|
|
6754
|
+
let replacements = 0;
|
|
6755
|
+
for (const char of decoded) if (char === "\uFFFD") replacements += 1;
|
|
6756
|
+
return replacements / decoded.length < 0.1;
|
|
6757
|
+
}
|
|
6758
|
+
function formatBytes(bytes) {
|
|
6759
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
6760
|
+
if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;
|
|
6761
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
6762
|
+
}
|
|
6763
|
+
var counter = 0;
|
|
6764
|
+
function nextId() {
|
|
6765
|
+
counter += 1;
|
|
6766
|
+
return `att-${counter}`;
|
|
6767
|
+
}
|
|
6768
|
+
async function readArrayBuffer(blob) {
|
|
6769
|
+
if (typeof blob.arrayBuffer === "function") return blob.arrayBuffer();
|
|
6770
|
+
return new Promise((resolve, reject) => {
|
|
6771
|
+
const reader = new FileReader();
|
|
6772
|
+
reader.onload = () => resolve(reader.result);
|
|
6773
|
+
reader.onerror = () => reject(reader.error ?? new Error("file read failed"));
|
|
6774
|
+
reader.readAsArrayBuffer(blob);
|
|
6775
|
+
});
|
|
6776
|
+
}
|
|
6777
|
+
async function readTextPrefix(file) {
|
|
6778
|
+
try {
|
|
6779
|
+
const slice = file.slice(0, MAX_TEXT_PER_ATTACHMENT);
|
|
6780
|
+
const buffer = await readArrayBuffer(slice);
|
|
6781
|
+
const decoded = new TextDecoder("utf-8").decode(buffer);
|
|
6782
|
+
return isDecodedTextUsable(decoded) ? decoded : null;
|
|
6783
|
+
} catch {
|
|
6784
|
+
return null;
|
|
6785
|
+
}
|
|
6786
|
+
}
|
|
6787
|
+
async function stageFiles(files, alreadyStaged) {
|
|
6788
|
+
const accepted = [];
|
|
6789
|
+
const rejected = [];
|
|
6790
|
+
let slots = MAX_ATTACHMENTS - alreadyStaged.length;
|
|
6791
|
+
for (const file of files) {
|
|
6792
|
+
if (slots <= 0) {
|
|
6793
|
+
rejected.push({ name: file.name, reason: "too-many" });
|
|
6794
|
+
continue;
|
|
6795
|
+
}
|
|
6796
|
+
if (file.size > MAX_ATTACHMENT_BYTES) {
|
|
6797
|
+
rejected.push({ name: file.name, reason: "too-large" });
|
|
6798
|
+
continue;
|
|
6799
|
+
}
|
|
6800
|
+
const mimeType = file.type || "application/octet-stream";
|
|
6801
|
+
const textContent = looksTextual(file.name, mimeType) ? await readTextPrefix(file) : null;
|
|
6802
|
+
accepted.push({
|
|
6803
|
+
id: nextId(),
|
|
6804
|
+
name: file.name,
|
|
6805
|
+
mimeType,
|
|
6806
|
+
size: file.size,
|
|
6807
|
+
textContent,
|
|
6808
|
+
textExtracted: textContent !== null
|
|
6809
|
+
});
|
|
6810
|
+
slots -= 1;
|
|
6811
|
+
}
|
|
6812
|
+
return { accepted, rejected };
|
|
6813
|
+
}
|
|
6814
|
+
function toPayload(staged) {
|
|
6815
|
+
return staged.map(({ name, mimeType, size, textContent }) => ({
|
|
6816
|
+
name,
|
|
6817
|
+
mimeType,
|
|
6818
|
+
size,
|
|
6819
|
+
textContent
|
|
6820
|
+
}));
|
|
6821
|
+
}
|
|
6258
6822
|
var EXPLORE_CSS = `
|
|
6259
6823
|
@keyframes boff-explore-pulse {
|
|
6260
6824
|
0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
|
|
@@ -6342,6 +6906,70 @@ var EXPLORE_CSS = `
|
|
|
6342
6906
|
max-width: 100%;
|
|
6343
6907
|
height: auto;
|
|
6344
6908
|
}
|
|
6909
|
+
|
|
6910
|
+
/* ---- Ambient backdrop -----------------------------------------------------------------
|
|
6911
|
+
Two very low-opacity radial washes behind the welcome state, drifting slowly. Painted on
|
|
6912
|
+
a pseudo-element with pointer-events:none so it can never intercept a click \u2014 a
|
|
6913
|
+
decorative overlay that swallows clicks is a bug we have shipped before.
|
|
6914
|
+
Colours come from the product's own --primary token, so this picks up each site's palette
|
|
6915
|
+
instead of introducing one. */
|
|
6916
|
+
.boff-explore-aura {
|
|
6917
|
+
position: relative;
|
|
6918
|
+
isolation: isolate;
|
|
6919
|
+
}
|
|
6920
|
+
.boff-explore-aura::before {
|
|
6921
|
+
content: "";
|
|
6922
|
+
position: absolute;
|
|
6923
|
+
inset: -10% -20% auto -20%;
|
|
6924
|
+
height: 60%;
|
|
6925
|
+
z-index: -1;
|
|
6926
|
+
pointer-events: none;
|
|
6927
|
+
background:
|
|
6928
|
+
radial-gradient(38% 55% at 22% 30%, hsl(var(--primary) / 0.10), transparent 70%),
|
|
6929
|
+
radial-gradient(32% 48% at 78% 18%, hsl(var(--primary) / 0.07), transparent 72%);
|
|
6930
|
+
filter: blur(6px);
|
|
6931
|
+
animation: boff-explore-drift 26s ease-in-out infinite alternate;
|
|
6932
|
+
}
|
|
6933
|
+
@keyframes boff-explore-drift {
|
|
6934
|
+
from { transform: translate3d(-1.5%, -1%, 0) scale(1); }
|
|
6935
|
+
to { transform: translate3d(1.5%, 1.5%, 0) scale(1.06); }
|
|
6936
|
+
}
|
|
6937
|
+
|
|
6938
|
+
/* Entrance: content settles rather than snapping in. Short, and only once. */
|
|
6939
|
+
@keyframes boff-explore-rise {
|
|
6940
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
6941
|
+
to { opacity: 1; transform: none; }
|
|
6942
|
+
}
|
|
6943
|
+
.boff-explore-rise {
|
|
6944
|
+
animation: boff-explore-rise 380ms cubic-bezier(0.22, 1, 0.36, 1) both;
|
|
6945
|
+
}
|
|
6946
|
+
.boff-explore-rise-1 { animation-delay: 40ms; }
|
|
6947
|
+
.boff-explore-rise-2 { animation-delay: 90ms; }
|
|
6948
|
+
.boff-explore-rise-3 { animation-delay: 140ms; }
|
|
6949
|
+
|
|
6950
|
+
/* A soft sheen that crosses the send button while a turn is in flight \u2014 enough to say
|
|
6951
|
+
"working" without another spinner competing with the thinking dots. */
|
|
6952
|
+
@keyframes boff-explore-sheen {
|
|
6953
|
+
from { transform: translateX(-120%); }
|
|
6954
|
+
to { transform: translateX(220%); }
|
|
6955
|
+
}
|
|
6956
|
+
.boff-explore-busy { position: relative; overflow: hidden; }
|
|
6957
|
+
.boff-explore-busy::after {
|
|
6958
|
+
content: "";
|
|
6959
|
+
position: absolute;
|
|
6960
|
+
inset: 0;
|
|
6961
|
+
pointer-events: none;
|
|
6962
|
+
background: linear-gradient(100deg, transparent 20%, hsl(var(--primary) / 0.22) 50%, transparent 80%);
|
|
6963
|
+
animation: boff-explore-sheen 1.5s ease-in-out infinite;
|
|
6964
|
+
}
|
|
6965
|
+
|
|
6966
|
+
/* Every one of the above is decoration. Reduced motion removes the movement and keeps the
|
|
6967
|
+
final state, rather than leaving content mid-animation and invisible. */
|
|
6968
|
+
@media (prefers-reduced-motion: reduce) {
|
|
6969
|
+
.boff-explore-aura::before,
|
|
6970
|
+
.boff-explore-busy::after { animation: none; }
|
|
6971
|
+
.boff-explore-rise { animation: none; opacity: 1; transform: none; }
|
|
6972
|
+
}
|
|
6345
6973
|
`;
|
|
6346
6974
|
function ExploreStyles() {
|
|
6347
6975
|
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
|
|
@@ -6539,17 +7167,48 @@ function ThinkingIndicator({ activity }) {
|
|
|
6539
7167
|
}
|
|
6540
7168
|
);
|
|
6541
7169
|
}
|
|
6542
|
-
function UserBubble({
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
7170
|
+
function UserBubble({
|
|
7171
|
+
strings: T,
|
|
7172
|
+
message
|
|
7173
|
+
}) {
|
|
7174
|
+
const attachments = message.attachments ?? [];
|
|
7175
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-end gap-1.5", children: [
|
|
7176
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7177
|
+
"div",
|
|
7178
|
+
{
|
|
7179
|
+
"data-boff-explore": "user",
|
|
7180
|
+
className: "max-w-[85%] whitespace-pre-wrap break-words rounded-2xl rounded-br-md bg-primary px-4 py-2.5 text-sm leading-relaxed text-primary-foreground shadow-sm",
|
|
7181
|
+
children: message.content
|
|
7182
|
+
}
|
|
7183
|
+
),
|
|
7184
|
+
attachments.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7185
|
+
"ul",
|
|
7186
|
+
{
|
|
7187
|
+
"data-boff-explore": "user-attachments",
|
|
7188
|
+
className: "flex max-w-[85%] flex-wrap justify-end gap-1.5",
|
|
7189
|
+
children: attachments.map((attachment) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7190
|
+
"li",
|
|
7191
|
+
{
|
|
7192
|
+
"data-boff-explore": "user-attachment",
|
|
7193
|
+
"data-text-extracted": attachment.textExtracted ? "true" : "false",
|
|
7194
|
+
className: "flex max-w-full items-center gap-1.5 rounded-full border border-border bg-muted/60 px-2.5 py-1 text-xs text-muted-foreground",
|
|
7195
|
+
children: [
|
|
7196
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0" }),
|
|
7197
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", title: attachment.name, children: attachment.name }),
|
|
7198
|
+
attachment.textExtracted ? null : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0", children: [
|
|
7199
|
+
"\xB7 ",
|
|
7200
|
+
T.attachmentNameOnly
|
|
7201
|
+
] })
|
|
7202
|
+
]
|
|
7203
|
+
},
|
|
7204
|
+
`${attachment.name}-${attachment.size}`
|
|
7205
|
+
))
|
|
7206
|
+
}
|
|
7207
|
+
) : null
|
|
7208
|
+
] });
|
|
6551
7209
|
}
|
|
6552
7210
|
function AssistantBubble({
|
|
7211
|
+
strings: T,
|
|
6553
7212
|
message,
|
|
6554
7213
|
activity,
|
|
6555
7214
|
onNavigate,
|
|
@@ -6566,7 +7225,7 @@ function AssistantBubble({
|
|
|
6566
7225
|
ref: anchorRef,
|
|
6567
7226
|
"data-boff-explore": "assistant",
|
|
6568
7227
|
"data-status": message.status,
|
|
6569
|
-
className: "flex scroll-mt-4 gap-3",
|
|
7228
|
+
className: "boff-explore-rise flex scroll-mt-4 gap-3",
|
|
6570
7229
|
children: [
|
|
6571
7230
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6572
7231
|
"span",
|
|
@@ -6597,7 +7256,7 @@ function AssistantBubble({
|
|
|
6597
7256
|
event.preventDefault();
|
|
6598
7257
|
onNavigate("/contact");
|
|
6599
7258
|
},
|
|
6600
|
-
children:
|
|
7259
|
+
children: T.askHuman
|
|
6601
7260
|
}
|
|
6602
7261
|
),
|
|
6603
7262
|
"."
|
|
@@ -6612,7 +7271,7 @@ function AssistantBubble({
|
|
|
6612
7271
|
streaming ? /* @__PURE__ */ jsxRuntime.jsx(ThinkingIndicator, { activity }) : null,
|
|
6613
7272
|
failed && !body ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl rounded-tl-md border border-border bg-muted px-4 py-3 text-sm text-muted-foreground", children: "That answer didn't come through. Try asking again." }) : null,
|
|
6614
7273
|
message.references.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
6615
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
7274
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.sources }),
|
|
6616
7275
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3", children: message.references.map((reference) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
6617
7276
|
ReferenceCard,
|
|
6618
7277
|
{
|
|
@@ -6632,7 +7291,7 @@ function AssistantBubble({
|
|
|
6632
7291
|
`${cta.kind}-${cta.url}`
|
|
6633
7292
|
)) }) : null,
|
|
6634
7293
|
message.status === "COMPLETED" && (message.followUps?.length ?? 0) > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 pt-0.5", children: [
|
|
6635
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children:
|
|
7294
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children: T.nextYouCouldAsk }),
|
|
6636
7295
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: (message.followUps ?? []).map((question) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6637
7296
|
"button",
|
|
6638
7297
|
{
|
|
@@ -6694,6 +7353,7 @@ function ErrorBanner({
|
|
|
6694
7353
|
);
|
|
6695
7354
|
}
|
|
6696
7355
|
function PromptCarousel({
|
|
7356
|
+
strings: T,
|
|
6697
7357
|
prompts,
|
|
6698
7358
|
onPrompt,
|
|
6699
7359
|
disabled
|
|
@@ -6708,6 +7368,11 @@ function PromptCarousel({
|
|
|
6708
7368
|
},
|
|
6709
7369
|
[count]
|
|
6710
7370
|
);
|
|
7371
|
+
const swipe = useSwipe({
|
|
7372
|
+
onSwipeLeft: () => go(1),
|
|
7373
|
+
onSwipeRight: () => go(-1),
|
|
7374
|
+
enabled: count > 1
|
|
7375
|
+
});
|
|
6711
7376
|
React.useEffect(() => {
|
|
6712
7377
|
if (paused || disabled || count < 2) return;
|
|
6713
7378
|
if (typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
|
|
@@ -6720,7 +7385,7 @@ function PromptCarousel({
|
|
|
6720
7385
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6721
7386
|
"div",
|
|
6722
7387
|
{
|
|
6723
|
-
className: "flex min-w-0 items-center gap-1.5",
|
|
7388
|
+
className: "flex min-w-0 touch-pan-y items-center gap-1.5",
|
|
6724
7389
|
role: "group",
|
|
6725
7390
|
"aria-roledescription": "carousel",
|
|
6726
7391
|
"aria-label": "Example questions",
|
|
@@ -6728,14 +7393,15 @@ function PromptCarousel({
|
|
|
6728
7393
|
onMouseLeave: () => setPaused(false),
|
|
6729
7394
|
onFocusCapture: () => setPaused(true),
|
|
6730
7395
|
onBlurCapture: () => setPaused(false),
|
|
7396
|
+
...swipe,
|
|
6731
7397
|
children: [
|
|
6732
7398
|
count > 1 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
6733
7399
|
"button",
|
|
6734
7400
|
{
|
|
6735
7401
|
type: "button",
|
|
6736
|
-
"aria-label":
|
|
7402
|
+
"aria-label": T.prevSuggestion,
|
|
6737
7403
|
onClick: () => go(-1),
|
|
6738
|
-
className: "
|
|
7404
|
+
className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
6739
7405
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
|
|
6740
7406
|
}
|
|
6741
7407
|
) : null,
|
|
@@ -6762,7 +7428,7 @@ function PromptCarousel({
|
|
|
6762
7428
|
"button",
|
|
6763
7429
|
{
|
|
6764
7430
|
type: "button",
|
|
6765
|
-
"aria-label":
|
|
7431
|
+
"aria-label": T.nextSuggestion,
|
|
6766
7432
|
onClick: () => go(1),
|
|
6767
7433
|
className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
6768
7434
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
|
|
@@ -6773,6 +7439,7 @@ function PromptCarousel({
|
|
|
6773
7439
|
);
|
|
6774
7440
|
}
|
|
6775
7441
|
function ProductStrip({
|
|
7442
|
+
strings: T,
|
|
6776
7443
|
products,
|
|
6777
7444
|
focusProduct,
|
|
6778
7445
|
onFocus
|
|
@@ -6807,7 +7474,7 @@ function ProductStrip({
|
|
|
6807
7474
|
"aria-pressed": focusProduct === null,
|
|
6808
7475
|
onClick: () => onFocus(null),
|
|
6809
7476
|
className: chipClass(focusProduct === null),
|
|
6810
|
-
children:
|
|
7477
|
+
children: T.allProducts
|
|
6811
7478
|
}
|
|
6812
7479
|
),
|
|
6813
7480
|
products.map((product) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -6836,7 +7503,7 @@ function ProductStrip({
|
|
|
6836
7503
|
"aria-expanded": expanded,
|
|
6837
7504
|
onClick: () => setExpanded((v) => !v),
|
|
6838
7505
|
className: "shrink-0 whitespace-nowrap rounded-full px-2 py-1 text-xs font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
6839
|
-
children: expanded ?
|
|
7506
|
+
children: expanded ? T.showLess : `${T.showAll} ${products.length}`
|
|
6840
7507
|
}
|
|
6841
7508
|
) : null
|
|
6842
7509
|
]
|
|
@@ -6944,6 +7611,7 @@ function DisclaimerDialog({
|
|
|
6944
7611
|
);
|
|
6945
7612
|
}
|
|
6946
7613
|
function WelcomeState({
|
|
7614
|
+
strings: T,
|
|
6947
7615
|
title,
|
|
6948
7616
|
body,
|
|
6949
7617
|
prompts,
|
|
@@ -6953,43 +7621,45 @@ function WelcomeState({
|
|
|
6953
7621
|
onFocus,
|
|
6954
7622
|
disabled
|
|
6955
7623
|
}) {
|
|
6956
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-4 py-
|
|
6957
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
7624
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-6 sm:py-8 lg:py-10", children: [
|
|
7625
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise text-center", children: [
|
|
6958
7626
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "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: [
|
|
6959
7627
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }),
|
|
6960
|
-
|
|
7628
|
+
T.badge
|
|
6961
7629
|
] }),
|
|
6962
7630
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-4 text-balance break-words text-2xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
6963
7631
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-2.5 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground sm:text-lg", children: body })
|
|
6964
7632
|
] }),
|
|
6965
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-
|
|
7633
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "boff-explore-rise boff-explore-rise-1 mt-6 grid grid-cols-3 gap-2 sm:mt-7 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6966
7634
|
"li",
|
|
6967
7635
|
{
|
|
6968
|
-
className: "rounded-xl border border-border/70 bg-card/60 p-
|
|
7636
|
+
className: "rounded-xl border border-border/70 bg-card/60 p-2.5 text-center transition-colors hover:border-border sm:p-3.5 sm:text-left",
|
|
6969
7637
|
children: [
|
|
6970
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-
|
|
6971
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-
|
|
6972
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: capBody })
|
|
7638
|
+
/* @__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.5 sm:h-8 sm:w-8", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
|
|
7639
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-normal", children: T.capabilities[i] ?? "" }),
|
|
7640
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 hidden text-xs leading-relaxed text-muted-foreground sm:block", children: capBody })
|
|
6973
7641
|
]
|
|
6974
7642
|
},
|
|
6975
|
-
|
|
7643
|
+
i
|
|
6976
7644
|
)) }),
|
|
6977
|
-
prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8", children: [
|
|
6978
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
7645
|
+
prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-2 mt-8", children: [
|
|
7646
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.tryAsking }),
|
|
6979
7647
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6980
7648
|
PromptCarousel,
|
|
6981
7649
|
{
|
|
7650
|
+
strings: T,
|
|
6982
7651
|
prompts,
|
|
6983
7652
|
onPrompt,
|
|
6984
7653
|
disabled
|
|
6985
7654
|
}
|
|
6986
7655
|
)
|
|
6987
7656
|
] }) : null,
|
|
6988
|
-
products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6", children: [
|
|
6989
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
7657
|
+
products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-3 mt-6", children: [
|
|
7658
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.focusProduct }),
|
|
6990
7659
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6991
7660
|
ProductStrip,
|
|
6992
7661
|
{
|
|
7662
|
+
strings: T,
|
|
6993
7663
|
products,
|
|
6994
7664
|
focusProduct,
|
|
6995
7665
|
onFocus
|
|
@@ -7008,7 +7678,8 @@ function ExplorePage({
|
|
|
7008
7678
|
onNavigate,
|
|
7009
7679
|
onSend,
|
|
7010
7680
|
welcomeTitle,
|
|
7011
|
-
welcomeBody
|
|
7681
|
+
welcomeBody,
|
|
7682
|
+
locale
|
|
7012
7683
|
}) {
|
|
7013
7684
|
const pageUrl = React.useMemo(
|
|
7014
7685
|
() => typeof window === "undefined" ? void 0 : window.location.href,
|
|
@@ -7033,7 +7704,8 @@ function ExplorePage({
|
|
|
7033
7704
|
deleteConversation,
|
|
7034
7705
|
clearHistory,
|
|
7035
7706
|
recordClick,
|
|
7036
|
-
createShareLink
|
|
7707
|
+
createShareLink,
|
|
7708
|
+
isSharedView
|
|
7037
7709
|
} = useExploreChat({ productSlug, pageUrl, onSend, examplePrompts });
|
|
7038
7710
|
const [draft, setDraft] = React.useState("");
|
|
7039
7711
|
const textareaRef = React.useRef(null);
|
|
@@ -7052,7 +7724,18 @@ function ExplorePage({
|
|
|
7052
7724
|
}
|
|
7053
7725
|
});
|
|
7054
7726
|
speechStopRef.current = speech.stop;
|
|
7727
|
+
const activeLocale = React.useMemo(
|
|
7728
|
+
() => resolveExploreLocale(locale),
|
|
7729
|
+
[locale]
|
|
7730
|
+
);
|
|
7731
|
+
const T = React.useMemo(() => exploreStrings(activeLocale), [activeLocale]);
|
|
7732
|
+
const rtl = isRtlLocale(activeLocale);
|
|
7055
7733
|
const [disclaimerOpen, setDisclaimerOpen] = React.useState(false);
|
|
7734
|
+
const [staged, setStaged] = React.useState([]);
|
|
7735
|
+
const [attachmentNotice, setAttachmentNotice] = React.useState(null);
|
|
7736
|
+
const fileInputRef = React.useRef(null);
|
|
7737
|
+
const stagedRef = React.useRef([]);
|
|
7738
|
+
stagedRef.current = staged;
|
|
7056
7739
|
const [shareLabel, setShareLabel] = React.useState("Share");
|
|
7057
7740
|
const [shareUrl, setShareUrl] = React.useState(null);
|
|
7058
7741
|
const scrollRef = React.useRef(null);
|
|
@@ -7129,13 +7812,40 @@ function ExplorePage({
|
|
|
7129
7812
|
setShareLabel("Share");
|
|
7130
7813
|
}
|
|
7131
7814
|
}, [createShareLink, pageUrl]);
|
|
7815
|
+
const handleFilesPicked = React.useCallback(
|
|
7816
|
+
async (picked) => {
|
|
7817
|
+
if (!picked || picked.length === 0) return;
|
|
7818
|
+
const { accepted, rejected } = await stageFiles(
|
|
7819
|
+
Array.from(picked),
|
|
7820
|
+
stagedRef.current
|
|
7821
|
+
);
|
|
7822
|
+
setStaged((prev) => [...prev, ...accepted]);
|
|
7823
|
+
const first = rejected[0];
|
|
7824
|
+
setAttachmentNotice(
|
|
7825
|
+
first ? first.reason === "too-large" ? fill(T.attachmentTooLarge, {
|
|
7826
|
+
name: first.name,
|
|
7827
|
+
size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
|
|
7828
|
+
}) : fill(T.attachmentTooMany, {
|
|
7829
|
+
name: first.name,
|
|
7830
|
+
max: String(MAX_ATTACHMENTS)
|
|
7831
|
+
}) : null
|
|
7832
|
+
);
|
|
7833
|
+
},
|
|
7834
|
+
[T]
|
|
7835
|
+
);
|
|
7836
|
+
const removeAttachment = React.useCallback((id) => {
|
|
7837
|
+
setStaged((prev) => prev.filter((entry) => entry.id !== id));
|
|
7838
|
+
setAttachmentNotice(null);
|
|
7839
|
+
}, []);
|
|
7132
7840
|
const submitDraft = React.useCallback(() => {
|
|
7133
7841
|
const text = draft.trim();
|
|
7134
7842
|
if (!text || overLimit || busy || !canSend) return;
|
|
7135
7843
|
stopDictation();
|
|
7136
7844
|
setDraft("");
|
|
7137
7845
|
stickToBottomRef.current = true;
|
|
7138
|
-
void send(text);
|
|
7846
|
+
void send(text, toPayload(stagedRef.current));
|
|
7847
|
+
setStaged([]);
|
|
7848
|
+
setAttachmentNotice(null);
|
|
7139
7849
|
textareaRef.current?.focus();
|
|
7140
7850
|
}, [busy, canSend, draft, overLimit, send, stopDictation]);
|
|
7141
7851
|
const sendPrompt = React.useCallback(
|
|
@@ -7143,7 +7853,9 @@ function ExplorePage({
|
|
|
7143
7853
|
if (!canSend || busy) return;
|
|
7144
7854
|
setDraft("");
|
|
7145
7855
|
stickToBottomRef.current = true;
|
|
7146
|
-
void send(prompt);
|
|
7856
|
+
void send(prompt, toPayload(stagedRef.current));
|
|
7857
|
+
setStaged([]);
|
|
7858
|
+
setAttachmentNotice(null);
|
|
7147
7859
|
},
|
|
7148
7860
|
[busy, canSend, send]
|
|
7149
7861
|
);
|
|
@@ -7156,7 +7868,9 @@ function ExplorePage({
|
|
|
7156
7868
|
},
|
|
7157
7869
|
[submitDraft]
|
|
7158
7870
|
);
|
|
7159
|
-
const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled
|
|
7871
|
+
const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled || // A share token grants read access only — the server would reject a send anyway, so
|
|
7872
|
+
// disable it here rather than letting the visitor type into a dead composer.
|
|
7873
|
+
isSharedView;
|
|
7160
7874
|
const captchaOn = Boolean(
|
|
7161
7875
|
catalog.captchaRequired && catalog.recaptchaSiteKey
|
|
7162
7876
|
);
|
|
@@ -7166,6 +7880,8 @@ function ExplorePage({
|
|
|
7166
7880
|
{
|
|
7167
7881
|
"data-boff-explore": "page",
|
|
7168
7882
|
"data-phase": phase,
|
|
7883
|
+
"data-locale": activeLocale,
|
|
7884
|
+
dir: rtl ? "rtl" : void 0,
|
|
7169
7885
|
className: cn(
|
|
7170
7886
|
"flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
|
|
7171
7887
|
heightMode === "auto" && "min-h-[70vh]",
|
|
@@ -7327,10 +8043,17 @@ function ExplorePage({
|
|
|
7327
8043
|
role: "log",
|
|
7328
8044
|
"aria-live": "polite",
|
|
7329
8045
|
"aria-label": "Explore conversation",
|
|
7330
|
-
className:
|
|
8046
|
+
className: cn(
|
|
8047
|
+
"boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
|
|
8048
|
+
// Only while the welcome state is showing: a flex column is what lets its
|
|
8049
|
+
// `my-auto` centre the block on a tall screen. The transcript must NOT be a flex
|
|
8050
|
+
// column — that would fight the natural top-down flow of messages.
|
|
8051
|
+
showWelcome && "flex flex-col"
|
|
8052
|
+
),
|
|
7331
8053
|
children: showWelcome ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
7332
8054
|
WelcomeState,
|
|
7333
8055
|
{
|
|
8056
|
+
strings: T,
|
|
7334
8057
|
title: resolvedTitle,
|
|
7335
8058
|
body: resolvedBody,
|
|
7336
8059
|
prompts,
|
|
@@ -7341,9 +8064,10 @@ function ExplorePage({
|
|
|
7341
8064
|
disabled: !canSend || busy
|
|
7342
8065
|
}
|
|
7343
8066
|
) : /* @__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(
|
|
7344
|
-
(message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
8067
|
+
(message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
7345
8068
|
AssistantBubble,
|
|
7346
8069
|
{
|
|
8070
|
+
strings: T,
|
|
7347
8071
|
message,
|
|
7348
8072
|
activity,
|
|
7349
8073
|
onNavigate,
|
|
@@ -7364,6 +8088,33 @@ function ExplorePage({
|
|
|
7364
8088
|
captchaOn
|
|
7365
8089
|
}
|
|
7366
8090
|
),
|
|
8091
|
+
isSharedView ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8092
|
+
"div",
|
|
8093
|
+
{
|
|
8094
|
+
"data-boff-explore": "shared-banner",
|
|
8095
|
+
className: "mx-auto flex w-full max-w-3xl items-center gap-2 px-4 pb-2 text-xs text-muted-foreground",
|
|
8096
|
+
children: [
|
|
8097
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link2, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
8098
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1", children: "You are viewing a shared conversation. Start your own to ask a question." }),
|
|
8099
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8100
|
+
"button",
|
|
8101
|
+
{
|
|
8102
|
+
type: "button",
|
|
8103
|
+
"data-boff-explore": "shared-start-own",
|
|
8104
|
+
onClick: () => {
|
|
8105
|
+
if (typeof window !== "undefined") {
|
|
8106
|
+
const url = new URL(window.location.href);
|
|
8107
|
+
url.searchParams.delete("c");
|
|
8108
|
+
window.location.href = url.toString();
|
|
8109
|
+
}
|
|
8110
|
+
},
|
|
8111
|
+
className: "shrink-0 underline underline-offset-2 hover:text-foreground",
|
|
8112
|
+
children: "New chat"
|
|
8113
|
+
}
|
|
8114
|
+
)
|
|
8115
|
+
]
|
|
8116
|
+
}
|
|
8117
|
+
) : null,
|
|
7367
8118
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border bg-background/85 px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 backdrop-blur-md", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7368
8119
|
"form",
|
|
7369
8120
|
{
|
|
@@ -7375,11 +8126,57 @@ function ExplorePage({
|
|
|
7375
8126
|
},
|
|
7376
8127
|
children: [
|
|
7377
8128
|
error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
|
|
8129
|
+
staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
8130
|
+
"ul",
|
|
8131
|
+
{
|
|
8132
|
+
"data-boff-explore": "attachments",
|
|
8133
|
+
className: "mb-2 flex flex-wrap gap-1.5",
|
|
8134
|
+
"aria-label": T.attach,
|
|
8135
|
+
children: staged.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8136
|
+
"li",
|
|
8137
|
+
{
|
|
8138
|
+
"data-boff-explore": "attachment",
|
|
8139
|
+
"data-text-extracted": entry.textExtracted ? "true" : "false",
|
|
8140
|
+
className: "flex max-w-full items-center gap-1.5 rounded-full border border-border bg-muted/60 py-1 pl-2.5 pr-1 text-xs",
|
|
8141
|
+
children: [
|
|
8142
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
|
|
8143
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
|
|
8144
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
|
|
8145
|
+
formatBytes(entry.size),
|
|
8146
|
+
entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
|
|
8147
|
+
] }),
|
|
8148
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8149
|
+
"button",
|
|
8150
|
+
{
|
|
8151
|
+
type: "button",
|
|
8152
|
+
"data-boff-explore": "attachment-remove",
|
|
8153
|
+
onClick: () => removeAttachment(entry.id),
|
|
8154
|
+
"aria-label": fill(T.removeAttachment, { name: entry.name }),
|
|
8155
|
+
className: "ml-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-background hover:text-foreground",
|
|
8156
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" })
|
|
8157
|
+
}
|
|
8158
|
+
)
|
|
8159
|
+
]
|
|
8160
|
+
},
|
|
8161
|
+
entry.id
|
|
8162
|
+
))
|
|
8163
|
+
}
|
|
8164
|
+
) : null,
|
|
8165
|
+
attachmentNotice !== null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
8166
|
+
"p",
|
|
8167
|
+
{
|
|
8168
|
+
"data-boff-explore": "attachment-notice",
|
|
8169
|
+
role: "status",
|
|
8170
|
+
className: "mb-2 text-xs text-destructive",
|
|
8171
|
+
children: attachmentNotice
|
|
8172
|
+
}
|
|
8173
|
+
) : null,
|
|
7378
8174
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7379
8175
|
"div",
|
|
7380
8176
|
{
|
|
7381
8177
|
className: cn(
|
|
7382
8178
|
"flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
|
|
8179
|
+
busy && "boff-explore-busy",
|
|
7383
8180
|
overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
|
|
7384
8181
|
),
|
|
7385
8182
|
children: [
|
|
@@ -7399,8 +8196,40 @@ function ExplorePage({
|
|
|
7399
8196
|
composingRef.current = false;
|
|
7400
8197
|
},
|
|
7401
8198
|
"aria-label": "Ask a question",
|
|
7402
|
-
placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ?
|
|
7403
|
-
|
|
8199
|
+
placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
|
|
8200
|
+
product: focusedProductName
|
|
8201
|
+
}) : T.placeholder,
|
|
8202
|
+
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"
|
|
8203
|
+
}
|
|
8204
|
+
),
|
|
8205
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8206
|
+
"input",
|
|
8207
|
+
{
|
|
8208
|
+
ref: fileInputRef,
|
|
8209
|
+
type: "file",
|
|
8210
|
+
multiple: true,
|
|
8211
|
+
className: "hidden",
|
|
8212
|
+
onChange: (event) => {
|
|
8213
|
+
void handleFilesPicked(event.target.files);
|
|
8214
|
+
event.target.value = "";
|
|
8215
|
+
}
|
|
8216
|
+
}
|
|
8217
|
+
),
|
|
8218
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8219
|
+
Button,
|
|
8220
|
+
{
|
|
8221
|
+
"data-boff-explore": "attach",
|
|
8222
|
+
type: "button",
|
|
8223
|
+
size: "icon",
|
|
8224
|
+
variant: "ghost",
|
|
8225
|
+
disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
|
|
8226
|
+
"aria-label": T.attach,
|
|
8227
|
+
title: `${T.attach} \u2014 ${fill(T.attachHint, {
|
|
8228
|
+
max: String(MAX_ATTACHMENTS),
|
|
8229
|
+
size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
|
|
8230
|
+
})}`,
|
|
8231
|
+
onClick: () => fileInputRef.current?.click(),
|
|
8232
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-4 w-4" })
|
|
7404
8233
|
}
|
|
7405
8234
|
),
|
|
7406
8235
|
speech.supported ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -7412,9 +8241,9 @@ function ExplorePage({
|
|
|
7412
8241
|
size: "icon",
|
|
7413
8242
|
variant: speech.listening ? "default" : "ghost",
|
|
7414
8243
|
disabled: composerDisabled,
|
|
7415
|
-
"aria-label": speech.listening ?
|
|
8244
|
+
"aria-label": speech.listening ? T.stopDictating : T.dictate,
|
|
7416
8245
|
"aria-pressed": speech.listening,
|
|
7417
|
-
title: speech.listening ?
|
|
8246
|
+
title: speech.listening ? T.stopDictating : T.dictate,
|
|
7418
8247
|
onClick: speech.toggle,
|
|
7419
8248
|
className: cn(speech.listening && "animate-pulse"),
|
|
7420
8249
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
|
|
@@ -7514,7 +8343,7 @@ function ExplorePage({
|
|
|
7514
8343
|
)
|
|
7515
8344
|
] }) : null,
|
|
7516
8345
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
|
|
7517
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children:
|
|
8346
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
|
|
7518
8347
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7519
8348
|
"button",
|
|
7520
8349
|
{
|
|
@@ -7522,7 +8351,7 @@ function ExplorePage({
|
|
|
7522
8351
|
"data-boff-explore": "disclaimer",
|
|
7523
8352
|
onClick: () => setDisclaimerOpen(true),
|
|
7524
8353
|
className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
7525
|
-
children:
|
|
8354
|
+
children: T.disclaimer
|
|
7526
8355
|
}
|
|
7527
8356
|
)
|
|
7528
8357
|
] })
|
|
@@ -9385,7 +10214,7 @@ function ChangelogPage(props) {
|
|
|
9385
10214
|
}
|
|
9386
10215
|
|
|
9387
10216
|
// src/content/utils.ts
|
|
9388
|
-
function
|
|
10217
|
+
function formatBytes2(bytes) {
|
|
9389
10218
|
if (bytes == null) return "";
|
|
9390
10219
|
if (bytes < 1024) return `${bytes} B`;
|
|
9391
10220
|
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
|
|
@@ -9506,7 +10335,7 @@ function PressKitLightbox({
|
|
|
9506
10335
|
}, [asset, onClose]);
|
|
9507
10336
|
if (!asset) return null;
|
|
9508
10337
|
const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
|
|
9509
|
-
const size =
|
|
10338
|
+
const size = formatBytes2(asset.fileSize);
|
|
9510
10339
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9511
10340
|
"div",
|
|
9512
10341
|
{
|
|
@@ -9615,7 +10444,7 @@ function AssetCard({
|
|
|
9615
10444
|
day: "numeric"
|
|
9616
10445
|
}) : "";
|
|
9617
10446
|
const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
|
|
9618
|
-
const size =
|
|
10447
|
+
const size = formatBytes2(asset.fileSize);
|
|
9619
10448
|
const [imgError, setImgError] = React.useState(false);
|
|
9620
10449
|
const thumb = asset.thumbnailUrl && !imgError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] overflow-hidden bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9621
10450
|
"img",
|
|
@@ -10119,7 +10948,7 @@ function ContractsPage(props) {
|
|
|
10119
10948
|
] }) }),
|
|
10120
10949
|
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-20", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }) : error ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: error }) }) : contracts.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base text-muted-foreground", children: "No contracts are available yet." }) }) : /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "divide-y divide-border rounded-xl border border-border overflow-hidden bg-card", children: contracts.map((c) => {
|
|
10121
10950
|
const ext = fileExt(c);
|
|
10122
|
-
const size =
|
|
10951
|
+
const size = formatBytes2(c.fileSize);
|
|
10123
10952
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10124
10953
|
"li",
|
|
10125
10954
|
{
|
|
@@ -12208,6 +13037,7 @@ exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
|
|
|
12208
13037
|
exports.DEFAULT_EXPLORE_EXAMPLE_PROMPTS = DEFAULT_EXPLORE_EXAMPLE_PROMPTS;
|
|
12209
13038
|
exports.ECOSYSTEM_PRODUCTS = ECOSYSTEM_PRODUCTS;
|
|
12210
13039
|
exports.EXPLORE_CATALOG_QUERY = EXPLORE_CATALOG_QUERY;
|
|
13040
|
+
exports.EXPLORE_LOCALES = EXPLORE_LOCALES;
|
|
12211
13041
|
exports.EXPLORE_MESSAGE_QUERY = EXPLORE_MESSAGE_QUERY;
|
|
12212
13042
|
exports.EXPLORE_RECAPTCHA_ACTION = EXPLORE_RECAPTCHA_ACTION;
|
|
12213
13043
|
exports.ElectronDownloadLink = ElectronDownloadLink;
|