@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.
@@ -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({ message }) {
2198
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(
2199
- "div",
2200
- {
2201
- "data-boff-explore": "user",
2202
- 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",
2203
- children: message.content
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: "ask a human"
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: "Sources" }),
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: "Next you could ask" }),
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": "Previous suggestion",
3057
+ "aria-label": T.prevSuggestion,
2392
3058
  onClick: () => go(-1),
2393
- className: "hidden 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 sm:inline-flex",
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": "Next suggestion",
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: "All products"
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 ? "Show less" : `All ${products.length}`
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-8 sm:py-12", children: [
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
- "AI answers, grounded in our documentation"
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-7 grid gap-2.5 sm:grid-cols-3", children: CAPABILITIES.map(({ icon: Icon, title: capTitle, body: capBody }) => /* @__PURE__ */ jsxRuntime.jsxs(
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-3.5 text-left transition-colors hover:border-border",
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-2.5 flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4" }) }),
2626
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-card-foreground", children: capTitle }),
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
- capTitle
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: "Try asking" }),
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: "Focus on a product" }),
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: "boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
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 ? `Ask about ${focusedProductName}\u2026` : "Ask anything about our products\u2026",
3058
- 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-sm shadow-none focus-visible:ring-0 md:text-sm"
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 ? "Stop dictating" : "Dictate your question",
3899
+ "aria-label": speech.listening ? T.stopDictating : T.dictate,
3071
3900
  "aria-pressed": speech.listening,
3072
- title: speech.listening ? "Stop dictating" : "Dictate your question",
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: "Grounded in our docs \u2014 check anything important." }),
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: "Disclaimer"
4009
+ children: T.disclaimer
3181
4010
  }
3182
4011
  )
3183
4012
  ] })