@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
|
@@ -40,6 +40,325 @@ var remarkGfm__default = /*#__PURE__*/_interopDefault(remarkGfm);
|
|
|
40
40
|
var __defProp = Object.defineProperty;
|
|
41
41
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
42
42
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
43
|
+
|
|
44
|
+
// src/components/explore-i18n.ts
|
|
45
|
+
var EXPLORE_LOCALES = ["en", "zh", "hi", "es", "ar", "ta"];
|
|
46
|
+
var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
|
|
47
|
+
function isRtlLocale(locale) {
|
|
48
|
+
return RTL_LOCALES.has(locale);
|
|
49
|
+
}
|
|
50
|
+
var EN = {
|
|
51
|
+
badge: "AI answers, grounded in our documentation",
|
|
52
|
+
welcomeTitle: "Ask anything about our products",
|
|
53
|
+
welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
|
|
54
|
+
tryAsking: "Try asking",
|
|
55
|
+
focusProduct: "Focus on a product",
|
|
56
|
+
allProducts: "All products",
|
|
57
|
+
showAll: "All",
|
|
58
|
+
showLess: "Show less",
|
|
59
|
+
sources: "Sources",
|
|
60
|
+
nextYouCouldAsk: "Next you could ask",
|
|
61
|
+
placeholder: "Ask anything about our products\u2026",
|
|
62
|
+
placeholderProduct: "Ask about {product}\u2026",
|
|
63
|
+
send: "Send",
|
|
64
|
+
stop: "Stop",
|
|
65
|
+
newChat: "New chat",
|
|
66
|
+
history: "History",
|
|
67
|
+
clearHistory: "Clear history",
|
|
68
|
+
share: "Share",
|
|
69
|
+
copied: "Copied",
|
|
70
|
+
copying: "Copying\u2026",
|
|
71
|
+
shareUnavailable: "Unavailable",
|
|
72
|
+
disclaimer: "Disclaimer",
|
|
73
|
+
disclaimerShort: "Grounded in our docs \u2014 check anything important.",
|
|
74
|
+
dictate: "Dictate your question",
|
|
75
|
+
stopDictating: "Stop dictating",
|
|
76
|
+
attach: "Attach files",
|
|
77
|
+
attachHint: "Up to {{max}} files, {{size}} MB each",
|
|
78
|
+
removeAttachment: "Remove {{name}}",
|
|
79
|
+
attachmentNameOnly: "name and type only",
|
|
80
|
+
attachmentTooLarge: "{{name}} is larger than {{size}} MB and was not attached.",
|
|
81
|
+
attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
|
|
82
|
+
noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
|
|
83
|
+
askHuman: "ask a human",
|
|
84
|
+
prevSuggestion: "Previous suggestion",
|
|
85
|
+
nextSuggestion: "Next suggestion",
|
|
86
|
+
capabilities: [
|
|
87
|
+
"Grounded in our own docs",
|
|
88
|
+
"Compare across the ecosystem",
|
|
89
|
+
"Straight to the right page"
|
|
90
|
+
],
|
|
91
|
+
prompts: [
|
|
92
|
+
"What does this product actually do?",
|
|
93
|
+
"Which product fits my team?",
|
|
94
|
+
"How do I get started, step by step?",
|
|
95
|
+
"How much does it cost?"
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
var ZH = {
|
|
99
|
+
badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
|
|
100
|
+
welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
|
|
101
|
+
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",
|
|
102
|
+
tryAsking: "\u8BD5\u7740\u95EE",
|
|
103
|
+
focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
|
|
104
|
+
allProducts: "\u5168\u90E8\u4EA7\u54C1",
|
|
105
|
+
showAll: "\u5168\u90E8",
|
|
106
|
+
showLess: "\u6536\u8D77",
|
|
107
|
+
sources: "\u6765\u6E90",
|
|
108
|
+
nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
|
|
109
|
+
placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
|
|
110
|
+
placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
|
|
111
|
+
send: "\u53D1\u9001",
|
|
112
|
+
stop: "\u505C\u6B62",
|
|
113
|
+
newChat: "\u65B0\u5BF9\u8BDD",
|
|
114
|
+
history: "\u5386\u53F2",
|
|
115
|
+
clearHistory: "\u6E05\u9664\u5386\u53F2",
|
|
116
|
+
share: "\u5206\u4EAB",
|
|
117
|
+
copied: "\u5DF2\u590D\u5236",
|
|
118
|
+
copying: "\u590D\u5236\u4E2D\u2026",
|
|
119
|
+
shareUnavailable: "\u4E0D\u53EF\u7528",
|
|
120
|
+
disclaimer: "\u514D\u8D23\u58F0\u660E",
|
|
121
|
+
disclaimerShort: "\u5185\u5BB9\u57FA\u4E8E\u6211\u4EEC\u7684\u6587\u6863\uFF0C\u91CD\u8981\u4FE1\u606F\u8BF7\u81EA\u884C\u6838\u5BF9\u3002",
|
|
122
|
+
dictate: "\u8BED\u97F3\u8F93\u5165",
|
|
123
|
+
stopDictating: "\u505C\u6B62\u8BED\u97F3\u8F93\u5165",
|
|
124
|
+
attach: "\u6DFB\u52A0\u6587\u4EF6",
|
|
125
|
+
attachHint: "\u6700\u591A {{max}} \u4E2A\u6587\u4EF6\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 {{size}} MB",
|
|
126
|
+
removeAttachment: "\u79FB\u9664 {{name}}",
|
|
127
|
+
attachmentNameOnly: "\u4EC5\u6587\u4EF6\u540D\u548C\u7C7B\u578B",
|
|
128
|
+
attachmentTooLarge: "{{name}} \u8D85\u8FC7 {{size}} MB\uFF0C\u672A\u80FD\u6DFB\u52A0\u3002",
|
|
129
|
+
attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
|
|
130
|
+
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",
|
|
131
|
+
askHuman: "\u8054\u7CFB\u6211\u4EEC",
|
|
132
|
+
prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
|
|
133
|
+
nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
|
|
134
|
+
capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
|
|
135
|
+
prompts: [
|
|
136
|
+
"\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
|
|
137
|
+
"\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
|
|
138
|
+
"\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
|
|
139
|
+
"\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
|
|
140
|
+
]
|
|
141
|
+
};
|
|
142
|
+
var HI = {
|
|
143
|
+
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",
|
|
144
|
+
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",
|
|
145
|
+
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",
|
|
146
|
+
tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
|
|
147
|
+
focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
|
|
148
|
+
allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
|
|
149
|
+
showAll: "\u0938\u092D\u0940",
|
|
150
|
+
showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
|
|
151
|
+
sources: "\u0938\u094D\u0930\u094B\u0924",
|
|
152
|
+
nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
|
|
153
|
+
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",
|
|
154
|
+
placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
|
|
155
|
+
send: "\u092D\u0947\u091C\u0947\u0902",
|
|
156
|
+
stop: "\u0930\u094B\u0915\u0947\u0902",
|
|
157
|
+
newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
|
|
158
|
+
history: "\u0907\u0924\u093F\u0939\u093E\u0938",
|
|
159
|
+
clearHistory: "\u0907\u0924\u093F\u0939\u093E\u0938 \u092E\u093F\u091F\u093E\u090F\u0901",
|
|
160
|
+
share: "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
|
|
161
|
+
copied: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E",
|
|
162
|
+
copying: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
|
|
163
|
+
shareUnavailable: "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
|
|
164
|
+
disclaimer: "\u0905\u0938\u094D\u0935\u0940\u0915\u0930\u0923",
|
|
165
|
+
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",
|
|
166
|
+
dictate: "\u092C\u094B\u0932\u0915\u0930 \u092A\u0942\u091B\u0947\u0902",
|
|
167
|
+
stopDictating: "\u092C\u094B\u0932\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
|
|
168
|
+
attach: "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
|
|
169
|
+
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",
|
|
170
|
+
removeAttachment: "{{name}} \u0939\u091F\u093E\u090F\u0901",
|
|
171
|
+
attachmentNameOnly: "\u0915\u0947\u0935\u0932 \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u0915\u093E\u0930",
|
|
172
|
+
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",
|
|
173
|
+
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",
|
|
174
|
+
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",
|
|
175
|
+
askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
|
|
176
|
+
prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
177
|
+
nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
178
|
+
capabilities: [
|
|
179
|
+
"\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",
|
|
180
|
+
"\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
|
|
181
|
+
"\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
|
|
182
|
+
],
|
|
183
|
+
prompts: [
|
|
184
|
+
"\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
|
|
185
|
+
"\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?",
|
|
186
|
+
"\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
|
|
187
|
+
"\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
|
|
188
|
+
]
|
|
189
|
+
};
|
|
190
|
+
var ES = {
|
|
191
|
+
badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
|
|
192
|
+
welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
|
|
193
|
+
welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
|
|
194
|
+
tryAsking: "Prueba a preguntar",
|
|
195
|
+
focusProduct: "Centrarse en un producto",
|
|
196
|
+
allProducts: "Todos los productos",
|
|
197
|
+
showAll: "Todos",
|
|
198
|
+
showLess: "Ver menos",
|
|
199
|
+
sources: "Fuentes",
|
|
200
|
+
nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
|
|
201
|
+
placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
|
|
202
|
+
placeholderProduct: "Pregunta sobre {product}\u2026",
|
|
203
|
+
send: "Enviar",
|
|
204
|
+
stop: "Detener",
|
|
205
|
+
newChat: "Nueva conversaci\xF3n",
|
|
206
|
+
history: "Historial",
|
|
207
|
+
clearHistory: "Borrar historial",
|
|
208
|
+
share: "Compartir",
|
|
209
|
+
copied: "Copiado",
|
|
210
|
+
copying: "Copiando\u2026",
|
|
211
|
+
shareUnavailable: "No disponible",
|
|
212
|
+
disclaimer: "Aviso",
|
|
213
|
+
disclaimerShort: "Basado en nuestra documentaci\xF3n: comprueba cualquier dato importante.",
|
|
214
|
+
dictate: "Dictar tu pregunta",
|
|
215
|
+
stopDictating: "Dejar de dictar",
|
|
216
|
+
attach: "Adjuntar archivos",
|
|
217
|
+
attachHint: "Hasta {{max}} archivos, {{size}} MB cada uno",
|
|
218
|
+
removeAttachment: "Quitar {{name}}",
|
|
219
|
+
attachmentNameOnly: "solo nombre y tipo",
|
|
220
|
+
attachmentTooLarge: "{{name}} supera los {{size}} MB y no se adjunt\xF3.",
|
|
221
|
+
attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
|
|
222
|
+
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",
|
|
223
|
+
askHuman: "habla con una persona",
|
|
224
|
+
prevSuggestion: "Sugerencia anterior",
|
|
225
|
+
nextSuggestion: "Sugerencia siguiente",
|
|
226
|
+
capabilities: [
|
|
227
|
+
"Basado en nuestra documentaci\xF3n",
|
|
228
|
+
"Compara todo el ecosistema",
|
|
229
|
+
"Directo a la p\xE1gina correcta"
|
|
230
|
+
],
|
|
231
|
+
prompts: [
|
|
232
|
+
"\xBFQu\xE9 hace realmente este producto?",
|
|
233
|
+
"\xBFQu\xE9 producto encaja con mi equipo?",
|
|
234
|
+
"\xBFC\xF3mo empiezo, paso a paso?",
|
|
235
|
+
"\xBFCu\xE1nto cuesta?"
|
|
236
|
+
]
|
|
237
|
+
};
|
|
238
|
+
var AR = {
|
|
239
|
+
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",
|
|
240
|
+
welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
|
|
241
|
+
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.",
|
|
242
|
+
tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
|
|
243
|
+
focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
|
|
244
|
+
allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
|
|
245
|
+
showAll: "\u0627\u0644\u0643\u0644",
|
|
246
|
+
showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
|
|
247
|
+
sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
|
|
248
|
+
nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
|
|
249
|
+
placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
|
|
250
|
+
placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
|
|
251
|
+
send: "\u0625\u0631\u0633\u0627\u0644",
|
|
252
|
+
stop: "\u0625\u064A\u0642\u0627\u0641",
|
|
253
|
+
newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
|
|
254
|
+
history: "\u0627\u0644\u0633\u062C\u0644",
|
|
255
|
+
clearHistory: "\u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644",
|
|
256
|
+
share: "\u0645\u0634\u0627\u0631\u0643\u0629",
|
|
257
|
+
copied: "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
|
|
258
|
+
copying: "\u062C\u0627\u0631\u064D \u0627\u0644\u0646\u0633\u062E\u2026",
|
|
259
|
+
shareUnavailable: "\u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
|
|
260
|
+
disclaimer: "\u0625\u062E\u0644\u0627\u0621 \u0645\u0633\u0624\u0648\u0644\u064A\u0629",
|
|
261
|
+
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.",
|
|
262
|
+
dictate: "\u0623\u0645\u0644\u0650 \u0633\u0624\u0627\u0644\u0643",
|
|
263
|
+
stopDictating: "\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0625\u0645\u0644\u0627\u0621",
|
|
264
|
+
attach: "\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641\u0627\u062A",
|
|
265
|
+
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",
|
|
266
|
+
removeAttachment: "\u0625\u0632\u0627\u0644\u0629 {{name}}",
|
|
267
|
+
attachmentNameOnly: "\u0627\u0644\u0627\u0633\u0645 \u0648\u0627\u0644\u0646\u0648\u0639 \u0641\u0642\u0637",
|
|
268
|
+
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.",
|
|
269
|
+
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}}.",
|
|
270
|
+
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",
|
|
271
|
+
askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
|
|
272
|
+
prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
|
|
273
|
+
nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
|
|
274
|
+
capabilities: [
|
|
275
|
+
"\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
|
|
276
|
+
"\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
|
|
277
|
+
"\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
|
|
278
|
+
],
|
|
279
|
+
prompts: [
|
|
280
|
+
"\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",
|
|
281
|
+
"\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
|
|
282
|
+
"\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
|
|
283
|
+
"\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
|
|
284
|
+
]
|
|
285
|
+
};
|
|
286
|
+
var TA = {
|
|
287
|
+
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",
|
|
288
|
+
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",
|
|
289
|
+
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.",
|
|
290
|
+
tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
291
|
+
focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
|
|
292
|
+
allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
|
|
293
|
+
showAll: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD",
|
|
294
|
+
showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
|
|
295
|
+
sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
296
|
+
nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
|
|
297
|
+
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",
|
|
298
|
+
placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
|
|
299
|
+
send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
300
|
+
stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
|
|
301
|
+
newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
|
|
302
|
+
history: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BC1",
|
|
303
|
+
clearHistory: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BCD\u0BB1\u0BC8 \u0B85\u0BB4\u0BBF",
|
|
304
|
+
share: "\u0BAA\u0B95\u0BBF\u0BB0\u0BCD",
|
|
305
|
+
copied: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
|
|
306
|
+
copying: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
|
|
307
|
+
shareUnavailable: "\u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
|
|
308
|
+
disclaimer: "\u0BAA\u0BCA\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BA4\u0BCD \u0BA4\u0BC1\u0BB1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
309
|
+
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.",
|
|
310
|
+
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",
|
|
311
|
+
stopDictating: "\u0BAA\u0BC7\u0B9A\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
|
|
312
|
+
attach: "\u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95",
|
|
313
|
+
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",
|
|
314
|
+
removeAttachment: "{{name}} \u0B85\u0B95\u0BB1\u0BCD\u0BB1\u0BC1",
|
|
315
|
+
attachmentNameOnly: "\u0BAA\u0BC6\u0BAF\u0BB0\u0BC1\u0BAE\u0BCD \u0BB5\u0B95\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD",
|
|
316
|
+
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.",
|
|
317
|
+
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.",
|
|
318
|
+
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",
|
|
319
|
+
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",
|
|
320
|
+
prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
321
|
+
nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
322
|
+
capabilities: [
|
|
323
|
+
"\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",
|
|
324
|
+
"\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
325
|
+
"\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
|
|
326
|
+
],
|
|
327
|
+
prompts: [
|
|
328
|
+
"\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?",
|
|
329
|
+
"\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?",
|
|
330
|
+
"\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?",
|
|
331
|
+
"\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
|
|
332
|
+
]
|
|
333
|
+
};
|
|
334
|
+
var STRINGS = {
|
|
335
|
+
en: EN,
|
|
336
|
+
zh: ZH,
|
|
337
|
+
hi: HI,
|
|
338
|
+
es: ES,
|
|
339
|
+
ar: AR,
|
|
340
|
+
ta: TA
|
|
341
|
+
};
|
|
342
|
+
function resolveExploreLocale(explicit) {
|
|
343
|
+
const candidates = [
|
|
344
|
+
explicit,
|
|
345
|
+
typeof document === "undefined" ? void 0 : document.documentElement.lang,
|
|
346
|
+
typeof navigator === "undefined" ? void 0 : navigator.language
|
|
347
|
+
];
|
|
348
|
+
for (const candidate of candidates) {
|
|
349
|
+
if (!candidate) continue;
|
|
350
|
+
const primary = candidate.toLowerCase().split("-")[0];
|
|
351
|
+
const match = EXPLORE_LOCALES.find((locale) => locale === primary);
|
|
352
|
+
if (match) return match;
|
|
353
|
+
}
|
|
354
|
+
return "en";
|
|
355
|
+
}
|
|
356
|
+
function exploreStrings(locale) {
|
|
357
|
+
return STRINGS[locale] ?? EN;
|
|
358
|
+
}
|
|
359
|
+
function fill(template, values) {
|
|
360
|
+
return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
|
|
361
|
+
}
|
|
43
362
|
var defaultComponents = {
|
|
44
363
|
a: ({ href, children, ...props }) => {
|
|
45
364
|
const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
|
|
@@ -499,6 +818,12 @@ var EXPLORE_MESSAGE_FIELDS = (
|
|
|
499
818
|
}
|
|
500
819
|
followUps
|
|
501
820
|
answered
|
|
821
|
+
attachments {
|
|
822
|
+
name
|
|
823
|
+
mimeType
|
|
824
|
+
size
|
|
825
|
+
textExtracted
|
|
826
|
+
}
|
|
502
827
|
errorCode
|
|
503
828
|
createdAt
|
|
504
829
|
completedAt
|
|
@@ -584,6 +909,16 @@ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
|
|
|
584
909
|
}
|
|
585
910
|
`
|
|
586
911
|
);
|
|
912
|
+
var EXPLORE_SHARED_CONVERSATION_QUERY = (
|
|
913
|
+
/* GraphQL */
|
|
914
|
+
`
|
|
915
|
+
query ExploreSharedConversation($shareToken: String!) {
|
|
916
|
+
exploreSharedConversation(shareToken: $shareToken) {
|
|
917
|
+
${EXPLORE_MESSAGE_FIELDS}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
`
|
|
921
|
+
);
|
|
587
922
|
|
|
588
923
|
// src/data/products.ts
|
|
589
924
|
var ECOSYSTEM_PRODUCTS = [
|
|
@@ -1034,6 +1369,14 @@ function readPersisted(key) {
|
|
|
1034
1369
|
return null;
|
|
1035
1370
|
}
|
|
1036
1371
|
}
|
|
1372
|
+
function readShareToken() {
|
|
1373
|
+
if (typeof window === "undefined") return null;
|
|
1374
|
+
try {
|
|
1375
|
+
return new URL(window.location.href).searchParams.get("c");
|
|
1376
|
+
} catch {
|
|
1377
|
+
return null;
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1037
1380
|
function visibleText(message) {
|
|
1038
1381
|
return message.content || message.partialContent || "";
|
|
1039
1382
|
}
|
|
@@ -1072,10 +1415,18 @@ function useExploreChat(options = {}) {
|
|
|
1072
1415
|
const pollGenerationRef = React.useRef(0);
|
|
1073
1416
|
const pollTimerRef = React.useRef(null);
|
|
1074
1417
|
const conversationTokenRef = React.useRef(null);
|
|
1418
|
+
const shareTokenRef = React.useRef(void 0);
|
|
1419
|
+
if (shareTokenRef.current === void 0) {
|
|
1420
|
+
shareTokenRef.current = readShareToken();
|
|
1421
|
+
}
|
|
1422
|
+
const isSharedView = shareTokenRef.current !== null;
|
|
1075
1423
|
const catalogRef = React.useRef(fallbackCatalog);
|
|
1076
1424
|
const turnCountRef = React.useRef(0);
|
|
1077
1425
|
const focusProductRef = React.useRef(null);
|
|
1078
1426
|
const lastSentTextRef = React.useRef(null);
|
|
1427
|
+
const lastSentAttachmentsRef = React.useRef(
|
|
1428
|
+
[]
|
|
1429
|
+
);
|
|
1079
1430
|
const inFlightRef = React.useRef(false);
|
|
1080
1431
|
catalogRef.current = catalog;
|
|
1081
1432
|
const clearPollTimer = React.useCallback(() => {
|
|
@@ -1100,6 +1451,43 @@ function useExploreChat(options = {}) {
|
|
|
1100
1451
|
};
|
|
1101
1452
|
}, []);
|
|
1102
1453
|
React.useEffect(() => {
|
|
1454
|
+
const shareToken = shareTokenRef.current;
|
|
1455
|
+
if (!shareToken) return;
|
|
1456
|
+
let cancelled = false;
|
|
1457
|
+
setHydrated(true);
|
|
1458
|
+
void client.query(
|
|
1459
|
+
EXPLORE_SHARED_CONVERSATION_QUERY,
|
|
1460
|
+
{ shareToken },
|
|
1461
|
+
{ cache: false }
|
|
1462
|
+
).then((res) => {
|
|
1463
|
+
if (cancelled || !mountedRef.current) return;
|
|
1464
|
+
const shared = res?.data?.exploreSharedConversation;
|
|
1465
|
+
if (shared && shared.length > 0) {
|
|
1466
|
+
setMessages(shared);
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
setError({
|
|
1470
|
+
kind: "unknown",
|
|
1471
|
+
code: "SHARE_NOT_FOUND",
|
|
1472
|
+
message: "That shared conversation could not be found. The link may have expired.",
|
|
1473
|
+
// Nothing to retry: a bad token will stay bad.
|
|
1474
|
+
retryable: false
|
|
1475
|
+
});
|
|
1476
|
+
}).catch(() => {
|
|
1477
|
+
if (cancelled || !mountedRef.current) return;
|
|
1478
|
+
setError({
|
|
1479
|
+
kind: "unknown",
|
|
1480
|
+
code: "SHARE_NOT_FOUND",
|
|
1481
|
+
message: "That shared conversation could not be loaded.",
|
|
1482
|
+
retryable: true
|
|
1483
|
+
});
|
|
1484
|
+
});
|
|
1485
|
+
return () => {
|
|
1486
|
+
cancelled = true;
|
|
1487
|
+
};
|
|
1488
|
+
}, [client]);
|
|
1489
|
+
React.useEffect(() => {
|
|
1490
|
+
if (shareTokenRef.current !== null) return;
|
|
1103
1491
|
if (!persist) {
|
|
1104
1492
|
setHydrated(true);
|
|
1105
1493
|
return;
|
|
@@ -1267,7 +1655,7 @@ function useExploreChat(options = {}) {
|
|
|
1267
1655
|
[client, pollIntervalMs, pollTimeoutMs]
|
|
1268
1656
|
);
|
|
1269
1657
|
const submit = React.useCallback(
|
|
1270
|
-
async (text, optimisticId, captchaAttempt) => {
|
|
1658
|
+
async (text, optimisticId, captchaAttempt, attachments) => {
|
|
1271
1659
|
const activeCatalog = catalogRef.current;
|
|
1272
1660
|
let recaptchaToken;
|
|
1273
1661
|
if (activeCatalog.captchaRequired && activeCatalog.recaptchaSiteKey) {
|
|
@@ -1285,7 +1673,8 @@ function useExploreChat(options = {}) {
|
|
|
1285
1673
|
...focusProductRef.current || productSlug ? { productSlug: focusProductRef.current ?? productSlug } : {},
|
|
1286
1674
|
...recaptchaToken ? { recaptchaToken } : {},
|
|
1287
1675
|
...locale ? { locale } : {},
|
|
1288
|
-
...pageUrl ? { pageUrl } : {}
|
|
1676
|
+
...pageUrl ? { pageUrl } : {},
|
|
1677
|
+
...attachments.length > 0 ? { attachments: [...attachments] } : {}
|
|
1289
1678
|
};
|
|
1290
1679
|
const res = await client.mutate(
|
|
1291
1680
|
SEND_EXPLORE_MESSAGE_MUTATION,
|
|
@@ -1299,7 +1688,7 @@ function useExploreChat(options = {}) {
|
|
|
1299
1688
|
const code = typeof first?.extensions?.code === "string" ? first.extensions.code : void 0;
|
|
1300
1689
|
const classified = classifyExploreError(code, first?.message);
|
|
1301
1690
|
if (classified.kind === "captcha" && captchaAttempt === 0) {
|
|
1302
|
-
await submit(text, optimisticId, 1);
|
|
1691
|
+
await submit(text, optimisticId, 1, attachments);
|
|
1303
1692
|
return;
|
|
1304
1693
|
}
|
|
1305
1694
|
inFlightRef.current = false;
|
|
@@ -1336,7 +1725,7 @@ function useExploreChat(options = {}) {
|
|
|
1336
1725
|
[client, locale, pageUrl, productSlug, startPolling]
|
|
1337
1726
|
);
|
|
1338
1727
|
const send = React.useCallback(
|
|
1339
|
-
async (message) => {
|
|
1728
|
+
async (message, attachments = []) => {
|
|
1340
1729
|
const text = message.trim();
|
|
1341
1730
|
if (!text) return;
|
|
1342
1731
|
if (inFlightRef.current) return;
|
|
@@ -1366,6 +1755,7 @@ function useExploreChat(options = {}) {
|
|
|
1366
1755
|
}
|
|
1367
1756
|
inFlightRef.current = true;
|
|
1368
1757
|
lastSentTextRef.current = text;
|
|
1758
|
+
lastSentAttachmentsRef.current = attachments;
|
|
1369
1759
|
setError(null);
|
|
1370
1760
|
setPhase("sending");
|
|
1371
1761
|
cancelPolling();
|
|
@@ -1388,7 +1778,7 @@ function useExploreChat(options = {}) {
|
|
|
1388
1778
|
setTurnCount(turnCountRef.current);
|
|
1389
1779
|
onSend?.(text);
|
|
1390
1780
|
try {
|
|
1391
|
-
await submit(text, optimistic.id, 0);
|
|
1781
|
+
await submit(text, optimistic.id, 0, attachments);
|
|
1392
1782
|
} catch (err) {
|
|
1393
1783
|
if (!mountedRef.current) return;
|
|
1394
1784
|
console.error("[WebSDK] Explore send failed", err);
|
|
@@ -1437,7 +1827,7 @@ function useExploreChat(options = {}) {
|
|
|
1437
1827
|
});
|
|
1438
1828
|
turnCountRef.current = Math.max(0, turnCountRef.current - 1);
|
|
1439
1829
|
setTurnCount(turnCountRef.current);
|
|
1440
|
-
void send(text);
|
|
1830
|
+
void send(text, lastSentAttachmentsRef.current);
|
|
1441
1831
|
}, [cancelPolling, send]);
|
|
1442
1832
|
const reset = React.useCallback(() => {
|
|
1443
1833
|
setArchive(
|
|
@@ -1451,6 +1841,7 @@ function useExploreChat(options = {}) {
|
|
|
1451
1841
|
inFlightRef.current = false;
|
|
1452
1842
|
conversationTokenRef.current = null;
|
|
1453
1843
|
lastSentTextRef.current = null;
|
|
1844
|
+
lastSentAttachmentsRef.current = [];
|
|
1454
1845
|
turnCountRef.current = 0;
|
|
1455
1846
|
setTurnCount(0);
|
|
1456
1847
|
setMessages([]);
|
|
@@ -1559,7 +1950,8 @@ function useExploreChat(options = {}) {
|
|
|
1559
1950
|
deleteConversation,
|
|
1560
1951
|
clearHistory,
|
|
1561
1952
|
recordClick,
|
|
1562
|
-
createShareLink
|
|
1953
|
+
createShareLink,
|
|
1954
|
+
isSharedView
|
|
1563
1955
|
};
|
|
1564
1956
|
}
|
|
1565
1957
|
var optimisticCounter = 0;
|
|
@@ -1785,6 +2177,39 @@ function useSpeechInput({
|
|
|
1785
2177
|
);
|
|
1786
2178
|
return { supported, listening, interim, error, start, stop, toggle };
|
|
1787
2179
|
}
|
|
2180
|
+
var SWIPE_THRESHOLD = 40;
|
|
2181
|
+
function useSwipe({
|
|
2182
|
+
onSwipeLeft,
|
|
2183
|
+
onSwipeRight,
|
|
2184
|
+
enabled = true
|
|
2185
|
+
}) {
|
|
2186
|
+
const start = React.useRef(null);
|
|
2187
|
+
const onPointerDown = React.useCallback(
|
|
2188
|
+
(event) => {
|
|
2189
|
+
if (!enabled) return;
|
|
2190
|
+
start.current = { x: event.clientX, y: event.clientY };
|
|
2191
|
+
},
|
|
2192
|
+
[enabled]
|
|
2193
|
+
);
|
|
2194
|
+
const onPointerUp = React.useCallback(
|
|
2195
|
+
(event) => {
|
|
2196
|
+
const from = start.current;
|
|
2197
|
+
start.current = null;
|
|
2198
|
+
if (!enabled || !from) return;
|
|
2199
|
+
const dx = event.clientX - from.x;
|
|
2200
|
+
const dy = event.clientY - from.y;
|
|
2201
|
+
if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dx) <= Math.abs(dy))
|
|
2202
|
+
return;
|
|
2203
|
+
if (dx < 0) onSwipeLeft?.();
|
|
2204
|
+
else onSwipeRight?.();
|
|
2205
|
+
},
|
|
2206
|
+
[enabled, onSwipeLeft, onSwipeRight]
|
|
2207
|
+
);
|
|
2208
|
+
const onPointerCancel = React.useCallback(() => {
|
|
2209
|
+
start.current = null;
|
|
2210
|
+
}, []);
|
|
2211
|
+
return { onPointerDown, onPointerUp, onPointerCancel };
|
|
2212
|
+
}
|
|
1788
2213
|
function canonicalFromLocation() {
|
|
1789
2214
|
if (typeof window === "undefined" || !window.location) return void 0;
|
|
1790
2215
|
const { origin, pathname } = window.location;
|
|
@@ -1910,6 +2335,145 @@ var Textarea = React__namespace.forwardRef(({ className, ...props }, ref) => {
|
|
|
1910
2335
|
);
|
|
1911
2336
|
});
|
|
1912
2337
|
Textarea.displayName = "Textarea";
|
|
2338
|
+
|
|
2339
|
+
// src/utils/explore-attachments.ts
|
|
2340
|
+
var MAX_ATTACHMENTS = 5;
|
|
2341
|
+
var MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
|
|
2342
|
+
var MAX_TEXT_PER_ATTACHMENT = 2e4;
|
|
2343
|
+
var TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2344
|
+
"txt",
|
|
2345
|
+
"md",
|
|
2346
|
+
"markdown",
|
|
2347
|
+
"csv",
|
|
2348
|
+
"tsv",
|
|
2349
|
+
"json",
|
|
2350
|
+
"jsonl",
|
|
2351
|
+
"yaml",
|
|
2352
|
+
"yml",
|
|
2353
|
+
"toml",
|
|
2354
|
+
"ini",
|
|
2355
|
+
"cfg",
|
|
2356
|
+
"conf",
|
|
2357
|
+
"env",
|
|
2358
|
+
"log",
|
|
2359
|
+
"sql",
|
|
2360
|
+
"graphql",
|
|
2361
|
+
"gql",
|
|
2362
|
+
"html",
|
|
2363
|
+
"htm",
|
|
2364
|
+
"xml",
|
|
2365
|
+
"svg",
|
|
2366
|
+
"css",
|
|
2367
|
+
"scss",
|
|
2368
|
+
"js",
|
|
2369
|
+
"jsx",
|
|
2370
|
+
"mjs",
|
|
2371
|
+
"cjs",
|
|
2372
|
+
"ts",
|
|
2373
|
+
"tsx",
|
|
2374
|
+
"py",
|
|
2375
|
+
"rb",
|
|
2376
|
+
"go",
|
|
2377
|
+
"rs",
|
|
2378
|
+
"java",
|
|
2379
|
+
"kt",
|
|
2380
|
+
"c",
|
|
2381
|
+
"h",
|
|
2382
|
+
"cpp",
|
|
2383
|
+
"cs",
|
|
2384
|
+
"php",
|
|
2385
|
+
"sh",
|
|
2386
|
+
"bash",
|
|
2387
|
+
"zsh",
|
|
2388
|
+
"ps1",
|
|
2389
|
+
"dockerfile",
|
|
2390
|
+
"tf",
|
|
2391
|
+
"tfvars"
|
|
2392
|
+
]);
|
|
2393
|
+
function isTextualMimeType(mimeType) {
|
|
2394
|
+
if (mimeType.startsWith("text/")) return true;
|
|
2395
|
+
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");
|
|
2396
|
+
}
|
|
2397
|
+
function extensionOf(name) {
|
|
2398
|
+
const dot = name.lastIndexOf(".");
|
|
2399
|
+
if (dot <= 0 || dot === name.length - 1) return "";
|
|
2400
|
+
return name.slice(dot + 1).toLowerCase();
|
|
2401
|
+
}
|
|
2402
|
+
function looksTextual(name, mimeType) {
|
|
2403
|
+
if (isTextualMimeType(mimeType)) return true;
|
|
2404
|
+
return TEXT_EXTENSIONS.has(extensionOf(name));
|
|
2405
|
+
}
|
|
2406
|
+
function isDecodedTextUsable(decoded) {
|
|
2407
|
+
if (decoded.length === 0) return false;
|
|
2408
|
+
if (decoded.includes("\0")) return false;
|
|
2409
|
+
let replacements = 0;
|
|
2410
|
+
for (const char of decoded) if (char === "\uFFFD") replacements += 1;
|
|
2411
|
+
return replacements / decoded.length < 0.1;
|
|
2412
|
+
}
|
|
2413
|
+
function formatBytes(bytes) {
|
|
2414
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
2415
|
+
if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;
|
|
2416
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
2417
|
+
}
|
|
2418
|
+
var counter = 0;
|
|
2419
|
+
function nextId() {
|
|
2420
|
+
counter += 1;
|
|
2421
|
+
return `att-${counter}`;
|
|
2422
|
+
}
|
|
2423
|
+
async function readArrayBuffer(blob) {
|
|
2424
|
+
if (typeof blob.arrayBuffer === "function") return blob.arrayBuffer();
|
|
2425
|
+
return new Promise((resolve, reject) => {
|
|
2426
|
+
const reader = new FileReader();
|
|
2427
|
+
reader.onload = () => resolve(reader.result);
|
|
2428
|
+
reader.onerror = () => reject(reader.error ?? new Error("file read failed"));
|
|
2429
|
+
reader.readAsArrayBuffer(blob);
|
|
2430
|
+
});
|
|
2431
|
+
}
|
|
2432
|
+
async function readTextPrefix(file) {
|
|
2433
|
+
try {
|
|
2434
|
+
const slice = file.slice(0, MAX_TEXT_PER_ATTACHMENT);
|
|
2435
|
+
const buffer = await readArrayBuffer(slice);
|
|
2436
|
+
const decoded = new TextDecoder("utf-8").decode(buffer);
|
|
2437
|
+
return isDecodedTextUsable(decoded) ? decoded : null;
|
|
2438
|
+
} catch {
|
|
2439
|
+
return null;
|
|
2440
|
+
}
|
|
2441
|
+
}
|
|
2442
|
+
async function stageFiles(files, alreadyStaged) {
|
|
2443
|
+
const accepted = [];
|
|
2444
|
+
const rejected = [];
|
|
2445
|
+
let slots = MAX_ATTACHMENTS - alreadyStaged.length;
|
|
2446
|
+
for (const file of files) {
|
|
2447
|
+
if (slots <= 0) {
|
|
2448
|
+
rejected.push({ name: file.name, reason: "too-many" });
|
|
2449
|
+
continue;
|
|
2450
|
+
}
|
|
2451
|
+
if (file.size > MAX_ATTACHMENT_BYTES) {
|
|
2452
|
+
rejected.push({ name: file.name, reason: "too-large" });
|
|
2453
|
+
continue;
|
|
2454
|
+
}
|
|
2455
|
+
const mimeType = file.type || "application/octet-stream";
|
|
2456
|
+
const textContent = looksTextual(file.name, mimeType) ? await readTextPrefix(file) : null;
|
|
2457
|
+
accepted.push({
|
|
2458
|
+
id: nextId(),
|
|
2459
|
+
name: file.name,
|
|
2460
|
+
mimeType,
|
|
2461
|
+
size: file.size,
|
|
2462
|
+
textContent,
|
|
2463
|
+
textExtracted: textContent !== null
|
|
2464
|
+
});
|
|
2465
|
+
slots -= 1;
|
|
2466
|
+
}
|
|
2467
|
+
return { accepted, rejected };
|
|
2468
|
+
}
|
|
2469
|
+
function toPayload(staged) {
|
|
2470
|
+
return staged.map(({ name, mimeType, size, textContent }) => ({
|
|
2471
|
+
name,
|
|
2472
|
+
mimeType,
|
|
2473
|
+
size,
|
|
2474
|
+
textContent
|
|
2475
|
+
}));
|
|
2476
|
+
}
|
|
1913
2477
|
var EXPLORE_CSS = `
|
|
1914
2478
|
@keyframes boff-explore-pulse {
|
|
1915
2479
|
0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
|
|
@@ -1997,6 +2561,70 @@ var EXPLORE_CSS = `
|
|
|
1997
2561
|
max-width: 100%;
|
|
1998
2562
|
height: auto;
|
|
1999
2563
|
}
|
|
2564
|
+
|
|
2565
|
+
/* ---- Ambient backdrop -----------------------------------------------------------------
|
|
2566
|
+
Two very low-opacity radial washes behind the welcome state, drifting slowly. Painted on
|
|
2567
|
+
a pseudo-element with pointer-events:none so it can never intercept a click \u2014 a
|
|
2568
|
+
decorative overlay that swallows clicks is a bug we have shipped before.
|
|
2569
|
+
Colours come from the product's own --primary token, so this picks up each site's palette
|
|
2570
|
+
instead of introducing one. */
|
|
2571
|
+
.boff-explore-aura {
|
|
2572
|
+
position: relative;
|
|
2573
|
+
isolation: isolate;
|
|
2574
|
+
}
|
|
2575
|
+
.boff-explore-aura::before {
|
|
2576
|
+
content: "";
|
|
2577
|
+
position: absolute;
|
|
2578
|
+
inset: -10% -20% auto -20%;
|
|
2579
|
+
height: 60%;
|
|
2580
|
+
z-index: -1;
|
|
2581
|
+
pointer-events: none;
|
|
2582
|
+
background:
|
|
2583
|
+
radial-gradient(38% 55% at 22% 30%, hsl(var(--primary) / 0.10), transparent 70%),
|
|
2584
|
+
radial-gradient(32% 48% at 78% 18%, hsl(var(--primary) / 0.07), transparent 72%);
|
|
2585
|
+
filter: blur(6px);
|
|
2586
|
+
animation: boff-explore-drift 26s ease-in-out infinite alternate;
|
|
2587
|
+
}
|
|
2588
|
+
@keyframes boff-explore-drift {
|
|
2589
|
+
from { transform: translate3d(-1.5%, -1%, 0) scale(1); }
|
|
2590
|
+
to { transform: translate3d(1.5%, 1.5%, 0) scale(1.06); }
|
|
2591
|
+
}
|
|
2592
|
+
|
|
2593
|
+
/* Entrance: content settles rather than snapping in. Short, and only once. */
|
|
2594
|
+
@keyframes boff-explore-rise {
|
|
2595
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
2596
|
+
to { opacity: 1; transform: none; }
|
|
2597
|
+
}
|
|
2598
|
+
.boff-explore-rise {
|
|
2599
|
+
animation: boff-explore-rise 380ms cubic-bezier(0.22, 1, 0.36, 1) both;
|
|
2600
|
+
}
|
|
2601
|
+
.boff-explore-rise-1 { animation-delay: 40ms; }
|
|
2602
|
+
.boff-explore-rise-2 { animation-delay: 90ms; }
|
|
2603
|
+
.boff-explore-rise-3 { animation-delay: 140ms; }
|
|
2604
|
+
|
|
2605
|
+
/* A soft sheen that crosses the send button while a turn is in flight \u2014 enough to say
|
|
2606
|
+
"working" without another spinner competing with the thinking dots. */
|
|
2607
|
+
@keyframes boff-explore-sheen {
|
|
2608
|
+
from { transform: translateX(-120%); }
|
|
2609
|
+
to { transform: translateX(220%); }
|
|
2610
|
+
}
|
|
2611
|
+
.boff-explore-busy { position: relative; overflow: hidden; }
|
|
2612
|
+
.boff-explore-busy::after {
|
|
2613
|
+
content: "";
|
|
2614
|
+
position: absolute;
|
|
2615
|
+
inset: 0;
|
|
2616
|
+
pointer-events: none;
|
|
2617
|
+
background: linear-gradient(100deg, transparent 20%, hsl(var(--primary) / 0.22) 50%, transparent 80%);
|
|
2618
|
+
animation: boff-explore-sheen 1.5s ease-in-out infinite;
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
/* Every one of the above is decoration. Reduced motion removes the movement and keeps the
|
|
2622
|
+
final state, rather than leaving content mid-animation and invisible. */
|
|
2623
|
+
@media (prefers-reduced-motion: reduce) {
|
|
2624
|
+
.boff-explore-aura::before,
|
|
2625
|
+
.boff-explore-busy::after { animation: none; }
|
|
2626
|
+
.boff-explore-rise { animation: none; opacity: 1; transform: none; }
|
|
2627
|
+
}
|
|
2000
2628
|
`;
|
|
2001
2629
|
function ExploreStyles() {
|
|
2002
2630
|
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
|
|
@@ -2194,17 +2822,48 @@ function ThinkingIndicator({ activity }) {
|
|
|
2194
2822
|
}
|
|
2195
2823
|
);
|
|
2196
2824
|
}
|
|
2197
|
-
function UserBubble({
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2825
|
+
function UserBubble({
|
|
2826
|
+
strings: T,
|
|
2827
|
+
message
|
|
2828
|
+
}) {
|
|
2829
|
+
const attachments = message.attachments ?? [];
|
|
2830
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-end gap-1.5", children: [
|
|
2831
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2832
|
+
"div",
|
|
2833
|
+
{
|
|
2834
|
+
"data-boff-explore": "user",
|
|
2835
|
+
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",
|
|
2836
|
+
children: message.content
|
|
2837
|
+
}
|
|
2838
|
+
),
|
|
2839
|
+
attachments.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2840
|
+
"ul",
|
|
2841
|
+
{
|
|
2842
|
+
"data-boff-explore": "user-attachments",
|
|
2843
|
+
className: "flex max-w-[85%] flex-wrap justify-end gap-1.5",
|
|
2844
|
+
children: attachments.map((attachment) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2845
|
+
"li",
|
|
2846
|
+
{
|
|
2847
|
+
"data-boff-explore": "user-attachment",
|
|
2848
|
+
"data-text-extracted": attachment.textExtracted ? "true" : "false",
|
|
2849
|
+
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",
|
|
2850
|
+
children: [
|
|
2851
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0" }),
|
|
2852
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", title: attachment.name, children: attachment.name }),
|
|
2853
|
+
attachment.textExtracted ? null : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0", children: [
|
|
2854
|
+
"\xB7 ",
|
|
2855
|
+
T.attachmentNameOnly
|
|
2856
|
+
] })
|
|
2857
|
+
]
|
|
2858
|
+
},
|
|
2859
|
+
`${attachment.name}-${attachment.size}`
|
|
2860
|
+
))
|
|
2861
|
+
}
|
|
2862
|
+
) : null
|
|
2863
|
+
] });
|
|
2206
2864
|
}
|
|
2207
2865
|
function AssistantBubble({
|
|
2866
|
+
strings: T,
|
|
2208
2867
|
message,
|
|
2209
2868
|
activity,
|
|
2210
2869
|
onNavigate,
|
|
@@ -2221,7 +2880,7 @@ function AssistantBubble({
|
|
|
2221
2880
|
ref: anchorRef,
|
|
2222
2881
|
"data-boff-explore": "assistant",
|
|
2223
2882
|
"data-status": message.status,
|
|
2224
|
-
className: "flex scroll-mt-4 gap-3",
|
|
2883
|
+
className: "boff-explore-rise flex scroll-mt-4 gap-3",
|
|
2225
2884
|
children: [
|
|
2226
2885
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2227
2886
|
"span",
|
|
@@ -2252,7 +2911,7 @@ function AssistantBubble({
|
|
|
2252
2911
|
event.preventDefault();
|
|
2253
2912
|
onNavigate("/contact");
|
|
2254
2913
|
},
|
|
2255
|
-
children:
|
|
2914
|
+
children: T.askHuman
|
|
2256
2915
|
}
|
|
2257
2916
|
),
|
|
2258
2917
|
"."
|
|
@@ -2267,7 +2926,7 @@ function AssistantBubble({
|
|
|
2267
2926
|
streaming ? /* @__PURE__ */ jsxRuntime.jsx(ThinkingIndicator, { activity }) : null,
|
|
2268
2927
|
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,
|
|
2269
2928
|
message.references.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
2270
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
2929
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.sources }),
|
|
2271
2930
|
/* @__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(
|
|
2272
2931
|
ReferenceCard,
|
|
2273
2932
|
{
|
|
@@ -2287,7 +2946,7 @@ function AssistantBubble({
|
|
|
2287
2946
|
`${cta.kind}-${cta.url}`
|
|
2288
2947
|
)) }) : null,
|
|
2289
2948
|
message.status === "COMPLETED" && (message.followUps?.length ?? 0) > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 pt-0.5", children: [
|
|
2290
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children:
|
|
2949
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children: T.nextYouCouldAsk }),
|
|
2291
2950
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: (message.followUps ?? []).map((question) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2292
2951
|
"button",
|
|
2293
2952
|
{
|
|
@@ -2349,6 +3008,7 @@ function ErrorBanner({
|
|
|
2349
3008
|
);
|
|
2350
3009
|
}
|
|
2351
3010
|
function PromptCarousel({
|
|
3011
|
+
strings: T,
|
|
2352
3012
|
prompts,
|
|
2353
3013
|
onPrompt,
|
|
2354
3014
|
disabled
|
|
@@ -2363,6 +3023,11 @@ function PromptCarousel({
|
|
|
2363
3023
|
},
|
|
2364
3024
|
[count]
|
|
2365
3025
|
);
|
|
3026
|
+
const swipe = useSwipe({
|
|
3027
|
+
onSwipeLeft: () => go(1),
|
|
3028
|
+
onSwipeRight: () => go(-1),
|
|
3029
|
+
enabled: count > 1
|
|
3030
|
+
});
|
|
2366
3031
|
React.useEffect(() => {
|
|
2367
3032
|
if (paused || disabled || count < 2) return;
|
|
2368
3033
|
if (typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
|
|
@@ -2375,7 +3040,7 @@ function PromptCarousel({
|
|
|
2375
3040
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2376
3041
|
"div",
|
|
2377
3042
|
{
|
|
2378
|
-
className: "flex min-w-0 items-center gap-1.5",
|
|
3043
|
+
className: "flex min-w-0 touch-pan-y items-center gap-1.5",
|
|
2379
3044
|
role: "group",
|
|
2380
3045
|
"aria-roledescription": "carousel",
|
|
2381
3046
|
"aria-label": "Example questions",
|
|
@@ -2383,14 +3048,15 @@ function PromptCarousel({
|
|
|
2383
3048
|
onMouseLeave: () => setPaused(false),
|
|
2384
3049
|
onFocusCapture: () => setPaused(true),
|
|
2385
3050
|
onBlurCapture: () => setPaused(false),
|
|
3051
|
+
...swipe,
|
|
2386
3052
|
children: [
|
|
2387
3053
|
count > 1 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2388
3054
|
"button",
|
|
2389
3055
|
{
|
|
2390
3056
|
type: "button",
|
|
2391
|
-
"aria-label":
|
|
3057
|
+
"aria-label": T.prevSuggestion,
|
|
2392
3058
|
onClick: () => go(-1),
|
|
2393
|
-
className: "
|
|
3059
|
+
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",
|
|
2394
3060
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
|
|
2395
3061
|
}
|
|
2396
3062
|
) : null,
|
|
@@ -2417,7 +3083,7 @@ function PromptCarousel({
|
|
|
2417
3083
|
"button",
|
|
2418
3084
|
{
|
|
2419
3085
|
type: "button",
|
|
2420
|
-
"aria-label":
|
|
3086
|
+
"aria-label": T.nextSuggestion,
|
|
2421
3087
|
onClick: () => go(1),
|
|
2422
3088
|
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",
|
|
2423
3089
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
|
|
@@ -2428,6 +3094,7 @@ function PromptCarousel({
|
|
|
2428
3094
|
);
|
|
2429
3095
|
}
|
|
2430
3096
|
function ProductStrip({
|
|
3097
|
+
strings: T,
|
|
2431
3098
|
products,
|
|
2432
3099
|
focusProduct,
|
|
2433
3100
|
onFocus
|
|
@@ -2462,7 +3129,7 @@ function ProductStrip({
|
|
|
2462
3129
|
"aria-pressed": focusProduct === null,
|
|
2463
3130
|
onClick: () => onFocus(null),
|
|
2464
3131
|
className: chipClass(focusProduct === null),
|
|
2465
|
-
children:
|
|
3132
|
+
children: T.allProducts
|
|
2466
3133
|
}
|
|
2467
3134
|
),
|
|
2468
3135
|
products.map((product) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -2491,7 +3158,7 @@ function ProductStrip({
|
|
|
2491
3158
|
"aria-expanded": expanded,
|
|
2492
3159
|
onClick: () => setExpanded((v) => !v),
|
|
2493
3160
|
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",
|
|
2494
|
-
children: expanded ?
|
|
3161
|
+
children: expanded ? T.showLess : `${T.showAll} ${products.length}`
|
|
2495
3162
|
}
|
|
2496
3163
|
) : null
|
|
2497
3164
|
]
|
|
@@ -2599,6 +3266,7 @@ function DisclaimerDialog({
|
|
|
2599
3266
|
);
|
|
2600
3267
|
}
|
|
2601
3268
|
function WelcomeState({
|
|
3269
|
+
strings: T,
|
|
2602
3270
|
title,
|
|
2603
3271
|
body,
|
|
2604
3272
|
prompts,
|
|
@@ -2608,43 +3276,45 @@ function WelcomeState({
|
|
|
2608
3276
|
onFocus,
|
|
2609
3277
|
disabled
|
|
2610
3278
|
}) {
|
|
2611
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-4 py-
|
|
2612
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
3279
|
+
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: [
|
|
3280
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise text-center", children: [
|
|
2613
3281
|
/* @__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: [
|
|
2614
3282
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }),
|
|
2615
|
-
|
|
3283
|
+
T.badge
|
|
2616
3284
|
] }),
|
|
2617
3285
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-4 text-balance break-words text-2xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
2618
3286
|
/* @__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 })
|
|
2619
3287
|
] }),
|
|
2620
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-
|
|
3288
|
+
/* @__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(
|
|
2621
3289
|
"li",
|
|
2622
3290
|
{
|
|
2623
|
-
className: "rounded-xl border border-border/70 bg-card/60 p-
|
|
3291
|
+
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",
|
|
2624
3292
|
children: [
|
|
2625
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-
|
|
2626
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-
|
|
2627
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: capBody })
|
|
3293
|
+
/* @__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" }) }),
|
|
3294
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-normal", children: T.capabilities[i] ?? "" }),
|
|
3295
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 hidden text-xs leading-relaxed text-muted-foreground sm:block", children: capBody })
|
|
2628
3296
|
]
|
|
2629
3297
|
},
|
|
2630
|
-
|
|
3298
|
+
i
|
|
2631
3299
|
)) }),
|
|
2632
|
-
prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8", children: [
|
|
2633
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
3300
|
+
prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-2 mt-8", children: [
|
|
3301
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.tryAsking }),
|
|
2634
3302
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2635
3303
|
PromptCarousel,
|
|
2636
3304
|
{
|
|
3305
|
+
strings: T,
|
|
2637
3306
|
prompts,
|
|
2638
3307
|
onPrompt,
|
|
2639
3308
|
disabled
|
|
2640
3309
|
}
|
|
2641
3310
|
)
|
|
2642
3311
|
] }) : null,
|
|
2643
|
-
products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6", children: [
|
|
2644
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children:
|
|
3312
|
+
products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-3 mt-6", children: [
|
|
3313
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.focusProduct }),
|
|
2645
3314
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2646
3315
|
ProductStrip,
|
|
2647
3316
|
{
|
|
3317
|
+
strings: T,
|
|
2648
3318
|
products,
|
|
2649
3319
|
focusProduct,
|
|
2650
3320
|
onFocus
|
|
@@ -2663,7 +3333,8 @@ function ExplorePage({
|
|
|
2663
3333
|
onNavigate,
|
|
2664
3334
|
onSend,
|
|
2665
3335
|
welcomeTitle,
|
|
2666
|
-
welcomeBody
|
|
3336
|
+
welcomeBody,
|
|
3337
|
+
locale
|
|
2667
3338
|
}) {
|
|
2668
3339
|
const pageUrl = React.useMemo(
|
|
2669
3340
|
() => typeof window === "undefined" ? void 0 : window.location.href,
|
|
@@ -2688,7 +3359,8 @@ function ExplorePage({
|
|
|
2688
3359
|
deleteConversation,
|
|
2689
3360
|
clearHistory,
|
|
2690
3361
|
recordClick,
|
|
2691
|
-
createShareLink
|
|
3362
|
+
createShareLink,
|
|
3363
|
+
isSharedView
|
|
2692
3364
|
} = useExploreChat({ productSlug, pageUrl, onSend, examplePrompts });
|
|
2693
3365
|
const [draft, setDraft] = React.useState("");
|
|
2694
3366
|
const textareaRef = React.useRef(null);
|
|
@@ -2707,7 +3379,18 @@ function ExplorePage({
|
|
|
2707
3379
|
}
|
|
2708
3380
|
});
|
|
2709
3381
|
speechStopRef.current = speech.stop;
|
|
3382
|
+
const activeLocale = React.useMemo(
|
|
3383
|
+
() => resolveExploreLocale(locale),
|
|
3384
|
+
[locale]
|
|
3385
|
+
);
|
|
3386
|
+
const T = React.useMemo(() => exploreStrings(activeLocale), [activeLocale]);
|
|
3387
|
+
const rtl = isRtlLocale(activeLocale);
|
|
2710
3388
|
const [disclaimerOpen, setDisclaimerOpen] = React.useState(false);
|
|
3389
|
+
const [staged, setStaged] = React.useState([]);
|
|
3390
|
+
const [attachmentNotice, setAttachmentNotice] = React.useState(null);
|
|
3391
|
+
const fileInputRef = React.useRef(null);
|
|
3392
|
+
const stagedRef = React.useRef([]);
|
|
3393
|
+
stagedRef.current = staged;
|
|
2711
3394
|
const [shareLabel, setShareLabel] = React.useState("Share");
|
|
2712
3395
|
const [shareUrl, setShareUrl] = React.useState(null);
|
|
2713
3396
|
const scrollRef = React.useRef(null);
|
|
@@ -2784,13 +3467,40 @@ function ExplorePage({
|
|
|
2784
3467
|
setShareLabel("Share");
|
|
2785
3468
|
}
|
|
2786
3469
|
}, [createShareLink, pageUrl]);
|
|
3470
|
+
const handleFilesPicked = React.useCallback(
|
|
3471
|
+
async (picked) => {
|
|
3472
|
+
if (!picked || picked.length === 0) return;
|
|
3473
|
+
const { accepted, rejected } = await stageFiles(
|
|
3474
|
+
Array.from(picked),
|
|
3475
|
+
stagedRef.current
|
|
3476
|
+
);
|
|
3477
|
+
setStaged((prev) => [...prev, ...accepted]);
|
|
3478
|
+
const first = rejected[0];
|
|
3479
|
+
setAttachmentNotice(
|
|
3480
|
+
first ? first.reason === "too-large" ? fill(T.attachmentTooLarge, {
|
|
3481
|
+
name: first.name,
|
|
3482
|
+
size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
|
|
3483
|
+
}) : fill(T.attachmentTooMany, {
|
|
3484
|
+
name: first.name,
|
|
3485
|
+
max: String(MAX_ATTACHMENTS)
|
|
3486
|
+
}) : null
|
|
3487
|
+
);
|
|
3488
|
+
},
|
|
3489
|
+
[T]
|
|
3490
|
+
);
|
|
3491
|
+
const removeAttachment = React.useCallback((id) => {
|
|
3492
|
+
setStaged((prev) => prev.filter((entry) => entry.id !== id));
|
|
3493
|
+
setAttachmentNotice(null);
|
|
3494
|
+
}, []);
|
|
2787
3495
|
const submitDraft = React.useCallback(() => {
|
|
2788
3496
|
const text = draft.trim();
|
|
2789
3497
|
if (!text || overLimit || busy || !canSend) return;
|
|
2790
3498
|
stopDictation();
|
|
2791
3499
|
setDraft("");
|
|
2792
3500
|
stickToBottomRef.current = true;
|
|
2793
|
-
void send(text);
|
|
3501
|
+
void send(text, toPayload(stagedRef.current));
|
|
3502
|
+
setStaged([]);
|
|
3503
|
+
setAttachmentNotice(null);
|
|
2794
3504
|
textareaRef.current?.focus();
|
|
2795
3505
|
}, [busy, canSend, draft, overLimit, send, stopDictation]);
|
|
2796
3506
|
const sendPrompt = React.useCallback(
|
|
@@ -2798,7 +3508,9 @@ function ExplorePage({
|
|
|
2798
3508
|
if (!canSend || busy) return;
|
|
2799
3509
|
setDraft("");
|
|
2800
3510
|
stickToBottomRef.current = true;
|
|
2801
|
-
void send(prompt);
|
|
3511
|
+
void send(prompt, toPayload(stagedRef.current));
|
|
3512
|
+
setStaged([]);
|
|
3513
|
+
setAttachmentNotice(null);
|
|
2802
3514
|
},
|
|
2803
3515
|
[busy, canSend, send]
|
|
2804
3516
|
);
|
|
@@ -2811,7 +3523,9 @@ function ExplorePage({
|
|
|
2811
3523
|
},
|
|
2812
3524
|
[submitDraft]
|
|
2813
3525
|
);
|
|
2814
|
-
const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled
|
|
3526
|
+
const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled || // A share token grants read access only — the server would reject a send anyway, so
|
|
3527
|
+
// disable it here rather than letting the visitor type into a dead composer.
|
|
3528
|
+
isSharedView;
|
|
2815
3529
|
const captchaOn = Boolean(
|
|
2816
3530
|
catalog.captchaRequired && catalog.recaptchaSiteKey
|
|
2817
3531
|
);
|
|
@@ -2821,6 +3535,8 @@ function ExplorePage({
|
|
|
2821
3535
|
{
|
|
2822
3536
|
"data-boff-explore": "page",
|
|
2823
3537
|
"data-phase": phase,
|
|
3538
|
+
"data-locale": activeLocale,
|
|
3539
|
+
dir: rtl ? "rtl" : void 0,
|
|
2824
3540
|
className: cn(
|
|
2825
3541
|
"flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
|
|
2826
3542
|
heightMode === "auto" && "min-h-[70vh]",
|
|
@@ -2982,10 +3698,17 @@ function ExplorePage({
|
|
|
2982
3698
|
role: "log",
|
|
2983
3699
|
"aria-live": "polite",
|
|
2984
3700
|
"aria-label": "Explore conversation",
|
|
2985
|
-
className:
|
|
3701
|
+
className: cn(
|
|
3702
|
+
"boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
|
|
3703
|
+
// Only while the welcome state is showing: a flex column is what lets its
|
|
3704
|
+
// `my-auto` centre the block on a tall screen. The transcript must NOT be a flex
|
|
3705
|
+
// column — that would fight the natural top-down flow of messages.
|
|
3706
|
+
showWelcome && "flex flex-col"
|
|
3707
|
+
),
|
|
2986
3708
|
children: showWelcome ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2987
3709
|
WelcomeState,
|
|
2988
3710
|
{
|
|
3711
|
+
strings: T,
|
|
2989
3712
|
title: resolvedTitle,
|
|
2990
3713
|
body: resolvedBody,
|
|
2991
3714
|
prompts,
|
|
@@ -2996,9 +3719,10 @@ function ExplorePage({
|
|
|
2996
3719
|
disabled: !canSend || busy
|
|
2997
3720
|
}
|
|
2998
3721
|
) : /* @__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(
|
|
2999
|
-
(message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3722
|
+
(message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3000
3723
|
AssistantBubble,
|
|
3001
3724
|
{
|
|
3725
|
+
strings: T,
|
|
3002
3726
|
message,
|
|
3003
3727
|
activity,
|
|
3004
3728
|
onNavigate,
|
|
@@ -3019,6 +3743,33 @@ function ExplorePage({
|
|
|
3019
3743
|
captchaOn
|
|
3020
3744
|
}
|
|
3021
3745
|
),
|
|
3746
|
+
isSharedView ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3747
|
+
"div",
|
|
3748
|
+
{
|
|
3749
|
+
"data-boff-explore": "shared-banner",
|
|
3750
|
+
className: "mx-auto flex w-full max-w-3xl items-center gap-2 px-4 pb-2 text-xs text-muted-foreground",
|
|
3751
|
+
children: [
|
|
3752
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link2, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
3753
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1", children: "You are viewing a shared conversation. Start your own to ask a question." }),
|
|
3754
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3755
|
+
"button",
|
|
3756
|
+
{
|
|
3757
|
+
type: "button",
|
|
3758
|
+
"data-boff-explore": "shared-start-own",
|
|
3759
|
+
onClick: () => {
|
|
3760
|
+
if (typeof window !== "undefined") {
|
|
3761
|
+
const url = new URL(window.location.href);
|
|
3762
|
+
url.searchParams.delete("c");
|
|
3763
|
+
window.location.href = url.toString();
|
|
3764
|
+
}
|
|
3765
|
+
},
|
|
3766
|
+
className: "shrink-0 underline underline-offset-2 hover:text-foreground",
|
|
3767
|
+
children: "New chat"
|
|
3768
|
+
}
|
|
3769
|
+
)
|
|
3770
|
+
]
|
|
3771
|
+
}
|
|
3772
|
+
) : null,
|
|
3022
3773
|
/* @__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(
|
|
3023
3774
|
"form",
|
|
3024
3775
|
{
|
|
@@ -3030,11 +3781,57 @@ function ExplorePage({
|
|
|
3030
3781
|
},
|
|
3031
3782
|
children: [
|
|
3032
3783
|
error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
|
|
3784
|
+
staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
3785
|
+
"ul",
|
|
3786
|
+
{
|
|
3787
|
+
"data-boff-explore": "attachments",
|
|
3788
|
+
className: "mb-2 flex flex-wrap gap-1.5",
|
|
3789
|
+
"aria-label": T.attach,
|
|
3790
|
+
children: staged.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3791
|
+
"li",
|
|
3792
|
+
{
|
|
3793
|
+
"data-boff-explore": "attachment",
|
|
3794
|
+
"data-text-extracted": entry.textExtracted ? "true" : "false",
|
|
3795
|
+
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",
|
|
3796
|
+
children: [
|
|
3797
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
|
|
3798
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
|
|
3799
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
|
|
3800
|
+
formatBytes(entry.size),
|
|
3801
|
+
entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
|
|
3802
|
+
] }),
|
|
3803
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3804
|
+
"button",
|
|
3805
|
+
{
|
|
3806
|
+
type: "button",
|
|
3807
|
+
"data-boff-explore": "attachment-remove",
|
|
3808
|
+
onClick: () => removeAttachment(entry.id),
|
|
3809
|
+
"aria-label": fill(T.removeAttachment, { name: entry.name }),
|
|
3810
|
+
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",
|
|
3811
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" })
|
|
3812
|
+
}
|
|
3813
|
+
)
|
|
3814
|
+
]
|
|
3815
|
+
},
|
|
3816
|
+
entry.id
|
|
3817
|
+
))
|
|
3818
|
+
}
|
|
3819
|
+
) : null,
|
|
3820
|
+
attachmentNotice !== null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
3821
|
+
"p",
|
|
3822
|
+
{
|
|
3823
|
+
"data-boff-explore": "attachment-notice",
|
|
3824
|
+
role: "status",
|
|
3825
|
+
className: "mb-2 text-xs text-destructive",
|
|
3826
|
+
children: attachmentNotice
|
|
3827
|
+
}
|
|
3828
|
+
) : null,
|
|
3033
3829
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3034
3830
|
"div",
|
|
3035
3831
|
{
|
|
3036
3832
|
className: cn(
|
|
3037
3833
|
"flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
|
|
3834
|
+
busy && "boff-explore-busy",
|
|
3038
3835
|
overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
|
|
3039
3836
|
),
|
|
3040
3837
|
children: [
|
|
@@ -3054,8 +3851,40 @@ function ExplorePage({
|
|
|
3054
3851
|
composingRef.current = false;
|
|
3055
3852
|
},
|
|
3056
3853
|
"aria-label": "Ask a question",
|
|
3057
|
-
placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ?
|
|
3058
|
-
|
|
3854
|
+
placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
|
|
3855
|
+
product: focusedProductName
|
|
3856
|
+
}) : T.placeholder,
|
|
3857
|
+
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"
|
|
3858
|
+
}
|
|
3859
|
+
),
|
|
3860
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3861
|
+
"input",
|
|
3862
|
+
{
|
|
3863
|
+
ref: fileInputRef,
|
|
3864
|
+
type: "file",
|
|
3865
|
+
multiple: true,
|
|
3866
|
+
className: "hidden",
|
|
3867
|
+
onChange: (event) => {
|
|
3868
|
+
void handleFilesPicked(event.target.files);
|
|
3869
|
+
event.target.value = "";
|
|
3870
|
+
}
|
|
3871
|
+
}
|
|
3872
|
+
),
|
|
3873
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3874
|
+
Button,
|
|
3875
|
+
{
|
|
3876
|
+
"data-boff-explore": "attach",
|
|
3877
|
+
type: "button",
|
|
3878
|
+
size: "icon",
|
|
3879
|
+
variant: "ghost",
|
|
3880
|
+
disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
|
|
3881
|
+
"aria-label": T.attach,
|
|
3882
|
+
title: `${T.attach} \u2014 ${fill(T.attachHint, {
|
|
3883
|
+
max: String(MAX_ATTACHMENTS),
|
|
3884
|
+
size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
|
|
3885
|
+
})}`,
|
|
3886
|
+
onClick: () => fileInputRef.current?.click(),
|
|
3887
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-4 w-4" })
|
|
3059
3888
|
}
|
|
3060
3889
|
),
|
|
3061
3890
|
speech.supported ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -3067,9 +3896,9 @@ function ExplorePage({
|
|
|
3067
3896
|
size: "icon",
|
|
3068
3897
|
variant: speech.listening ? "default" : "ghost",
|
|
3069
3898
|
disabled: composerDisabled,
|
|
3070
|
-
"aria-label": speech.listening ?
|
|
3899
|
+
"aria-label": speech.listening ? T.stopDictating : T.dictate,
|
|
3071
3900
|
"aria-pressed": speech.listening,
|
|
3072
|
-
title: speech.listening ?
|
|
3901
|
+
title: speech.listening ? T.stopDictating : T.dictate,
|
|
3073
3902
|
onClick: speech.toggle,
|
|
3074
3903
|
className: cn(speech.listening && "animate-pulse"),
|
|
3075
3904
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
|
|
@@ -3169,7 +3998,7 @@ function ExplorePage({
|
|
|
3169
3998
|
)
|
|
3170
3999
|
] }) : null,
|
|
3171
4000
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
|
|
3172
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children:
|
|
4001
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
|
|
3173
4002
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3174
4003
|
"button",
|
|
3175
4004
|
{
|
|
@@ -3177,7 +4006,7 @@ function ExplorePage({
|
|
|
3177
4006
|
"data-boff-explore": "disclaimer",
|
|
3178
4007
|
onClick: () => setDisclaimerOpen(true),
|
|
3179
4008
|
className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
3180
|
-
children:
|
|
4009
|
+
children: T.disclaimer
|
|
3181
4010
|
}
|
|
3182
4011
|
)
|
|
3183
4012
|
] })
|