@burdenoff/website-sdk 2026.922.2 → 2026.922.3

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.
@@ -82,10 +82,30 @@ var EN = {
82
82
  noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
83
83
  answerDidNotArrive: "That answer didn't come through. Try asking again.",
84
84
  askHuman: "ask a human",
85
+ // An offer, not a demand: this row sits under every answer on 38 marketing sites, so the
86
+ // wording has to be shruggable. "Was this helpful?" invites; "Please rate this answer"
87
+ // conscripts.
88
+ feedbackPrompt: "Was this helpful?",
89
+ feedbackHelpful: "Helpful",
90
+ feedbackNotHelpful: "Not helpful",
91
+ feedbackReasonTitle: "What was off?",
92
+ feedbackReasonInaccurate: "Inaccurate",
93
+ feedbackReasonIncomplete: "Incomplete",
94
+ feedbackReasonOffTopic: "Off topic",
95
+ feedbackReasonHardToFollow: "Hard to follow",
96
+ feedbackReasonOther: "Something else",
97
+ feedbackCommentPlaceholder: "Add a detail (optional)",
98
+ feedbackSend: "Send",
99
+ feedbackDismiss: "Dismiss",
100
+ feedbackThanks: "Thanks \u2014 that helps.",
101
+ feedbackNotSent: "That didn't send.",
85
102
  prevSuggestion: "Previous suggestion",
86
103
  nextSuggestion: "Next suggestion",
87
104
  conceptIllustration: "Concept illustration",
88
105
  opensInNewTab: "opens in a new tab",
106
+ seoTitle: "Describe a problem, get an answer",
107
+ seoDescription: "Describe the problem you're facing in your own words and get an answer drawn from our product documentation, with links to the exact pages it came from.",
108
+ seoDescriptionProduct: "Describe the problem you're facing in your own words and get an answer drawn from {product}'s documentation \u2014 and every other product we build \u2014 with links to the exact pages it came from.",
89
109
  capabilities: [
90
110
  "Grounded in our own docs",
91
111
  "Compare across the ecosystem",
@@ -133,10 +153,27 @@ var ZH = {
133
153
  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",
134
154
  answerDidNotArrive: "\u8FD9\u6761\u56DE\u7B54\u6CA1\u6709\u8FD4\u56DE\u3002\u8BF7\u518D\u95EE\u4E00\u6B21\u3002",
135
155
  askHuman: "\u8054\u7CFB\u6211\u4EEC",
156
+ feedbackPrompt: "\u8FD9\u4E2A\u56DE\u7B54\u6709\u5E2E\u52A9\u5417\uFF1F",
157
+ feedbackHelpful: "\u6709\u5E2E\u52A9",
158
+ feedbackNotHelpful: "\u6CA1\u6709\u5E2E\u52A9",
159
+ feedbackReasonTitle: "\u54EA\u91CC\u4E0D\u5BF9\uFF1F",
160
+ feedbackReasonInaccurate: "\u4E0D\u51C6\u786E",
161
+ feedbackReasonIncomplete: "\u4E0D\u5B8C\u6574",
162
+ feedbackReasonOffTopic: "\u7B54\u975E\u6240\u95EE",
163
+ feedbackReasonHardToFollow: "\u770B\u4E0D\u592A\u61C2",
164
+ feedbackReasonOther: "\u5176\u4ED6\u539F\u56E0",
165
+ feedbackCommentPlaceholder: "\u8865\u5145\u8BF4\u660E\uFF08\u53EF\u9009\uFF09",
166
+ feedbackSend: "\u63D0\u4EA4",
167
+ feedbackDismiss: "\u5173\u95ED",
168
+ feedbackThanks: "\u8C22\u8C22\uFF0C\u8FD9\u5BF9\u6211\u4EEC\u5F88\u6709\u5E2E\u52A9\u3002",
169
+ feedbackNotSent: "\u6CA1\u6709\u63D0\u4EA4\u6210\u529F\u3002",
136
170
  prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
137
171
  nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
138
172
  conceptIllustration: "\u6982\u5FF5\u793A\u610F\u56FE",
139
173
  opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
174
+ seoTitle: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u83B7\u5F97\u7B54\u6848",
175
+ seoDescription: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u9047\u5230\u7684\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA\u6211\u4EEC\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
176
+ seoDescriptionProduct: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u9047\u5230\u7684\u95EE\u9898\uFF0C\u5373\u53EF\u83B7\u5F97\u6765\u81EA {product} \u53CA\u6211\u4EEC\u5176\u4ED6\u4EA7\u54C1\u6587\u6863\u7684\u56DE\u7B54\uFF0C\u5E76\u9644\u4E0A\u7B54\u6848\u51FA\u5904\u7684\u9875\u9762\u94FE\u63A5\u3002",
140
177
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
141
178
  prompts: [
142
179
  "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
@@ -180,10 +217,27 @@ var HI = {
180
217
  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",
181
218
  answerDidNotArrive: "\u0935\u0939 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0906 \u0938\u0915\u093E\u0964 \u0915\u0943\u092A\u092F\u093E \u0926\u094B\u092C\u093E\u0930\u093E \u092A\u0942\u091B\u0947\u0902\u0964",
182
219
  askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
220
+ feedbackPrompt: "\u0915\u094D\u092F\u093E \u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u092E\u0926\u0926\u0917\u093E\u0930 \u0925\u093E?",
221
+ feedbackHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930",
222
+ feedbackNotHelpful: "\u092E\u0926\u0926\u0917\u093E\u0930 \u0928\u0939\u0940\u0902",
223
+ feedbackReasonTitle: "\u0915\u094D\u092F\u093E \u0920\u0940\u0915 \u0928\u0939\u0940\u0902 \u0925\u093E?",
224
+ feedbackReasonInaccurate: "\u0917\u093C\u0932\u0924 \u091C\u093E\u0928\u0915\u093E\u0930\u0940",
225
+ feedbackReasonIncomplete: "\u0905\u0927\u0942\u0930\u093E",
226
+ feedbackReasonOffTopic: "\u0935\u093F\u0937\u092F \u0938\u0947 \u0939\u091F\u0915\u0930",
227
+ feedbackReasonHardToFollow: "\u0938\u092E\u091D\u0928\u0947 \u092E\u0947\u0902 \u092E\u0941\u0936\u094D\u0915\u093F\u0932",
228
+ feedbackReasonOther: "\u0915\u0941\u091B \u0914\u0930",
229
+ feedbackCommentPlaceholder: "\u0915\u0941\u091B \u0914\u0930 \u092C\u0924\u093E\u090F\u0902 (\u0935\u0948\u0915\u0932\u094D\u092A\u093F\u0915)",
230
+ feedbackSend: "\u092D\u0947\u091C\u0947\u0902",
231
+ feedbackDismiss: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
232
+ feedbackThanks: "\u0927\u0928\u094D\u092F\u0935\u093E\u0926, \u0907\u0938\u0938\u0947 \u092E\u0926\u0926 \u092E\u093F\u0932\u0924\u0940 \u0939\u0948\u0964",
233
+ feedbackNotSent: "\u092F\u0939 \u092D\u0947\u091C\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
183
234
  prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
184
235
  nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
185
236
  conceptIllustration: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u091A\u093F\u0924\u094D\u0930\u0923",
186
237
  opensInNewTab: "\u0928\u090F \u091F\u0948\u092C \u092E\u0947\u0902 \u0916\u0941\u0932\u0924\u093E \u0939\u0948",
238
+ seoTitle: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902",
239
+ seoDescription: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 \u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
240
+ seoDescriptionProduct: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902 \u0914\u0930 {product} \u0924\u0925\u093E \u0939\u092E\u093E\u0930\u0947 \u092C\u093E\u0915\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u091C\u0935\u093E\u092C \u092A\u093E\u090F\u0902, \u0938\u093E\u0925 \u092E\u0947\u0902 \u0909\u0928\u094D\u0939\u0940\u0902 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915 \u091C\u0939\u093E\u0901 \u0938\u0947 \u0935\u0939 \u0906\u092F\u093E \u0939\u0948\u0964",
187
241
  capabilities: [
188
242
  "\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",
189
243
  "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
@@ -231,10 +285,27 @@ var ES = {
231
285
  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",
232
286
  answerDidNotArrive: "Esa respuesta no lleg\xF3. Int\xE9ntalo de nuevo.",
233
287
  askHuman: "habla con una persona",
288
+ feedbackPrompt: "\xBFTe ha servido?",
289
+ feedbackHelpful: "Me sirve",
290
+ feedbackNotHelpful: "No me sirve",
291
+ feedbackReasonTitle: "\xBFQu\xE9 ha fallado?",
292
+ feedbackReasonInaccurate: "Es inexacta",
293
+ feedbackReasonIncomplete: "Est\xE1 incompleta",
294
+ feedbackReasonOffTopic: "No viene al caso",
295
+ feedbackReasonHardToFollow: "Cuesta seguirla",
296
+ feedbackReasonOther: "Otra cosa",
297
+ feedbackCommentPlaceholder: "A\xF1ade un detalle (opcional)",
298
+ feedbackSend: "Enviar",
299
+ feedbackDismiss: "Cerrar",
300
+ feedbackThanks: "Gracias, nos sirve.",
301
+ feedbackNotSent: "No se ha podido enviar.",
234
302
  prevSuggestion: "Sugerencia anterior",
235
303
  nextSuggestion: "Sugerencia siguiente",
236
304
  conceptIllustration: "Ilustraci\xF3n del concepto",
237
305
  opensInNewTab: "se abre en una pesta\xF1a nueva",
306
+ seoTitle: "Describe un problema y obt\xE9n una respuesta",
307
+ seoDescription: "Describe con tus palabras el problema que tienes y recibe una respuesta extra\xEDda de la documentaci\xF3n de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
308
+ seoDescriptionProduct: "Describe con tus palabras el problema que tienes y recibe una respuesta extra\xEDda de la documentaci\xF3n de {product} y del resto de nuestros productos, con enlaces a las p\xE1ginas exactas de las que procede.",
238
309
  capabilities: [
239
310
  "Basado en nuestra documentaci\xF3n",
240
311
  "Compara todo el ecosistema",
@@ -282,10 +353,27 @@ var AR = {
282
353
  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",
283
354
  answerDidNotArrive: "\u0644\u0645 \u062A\u0635\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
284
355
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
356
+ feedbackPrompt: "\u0647\u0644 \u0643\u0627\u0646\u062A \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0645\u0641\u064A\u062F\u0629\u061F",
357
+ feedbackHelpful: "\u0645\u0641\u064A\u062F\u0629",
358
+ feedbackNotHelpful: "\u063A\u064A\u0631 \u0645\u0641\u064A\u062F\u0629",
359
+ feedbackReasonTitle: "\u0645\u0627 \u0627\u0644\u062E\u0637\u0623 \u0641\u064A\u0647\u0627\u061F",
360
+ feedbackReasonInaccurate: "\u063A\u064A\u0631 \u062F\u0642\u064A\u0642\u0629",
361
+ feedbackReasonIncomplete: "\u0646\u0627\u0642\u0635\u0629",
362
+ feedbackReasonOffTopic: "\u062E\u0627\u0631\u062C \u0627\u0644\u0645\u0648\u0636\u0648\u0639",
363
+ feedbackReasonHardToFollow: "\u0635\u0639\u0628\u0629 \u0627\u0644\u0641\u0647\u0645",
364
+ feedbackReasonOther: "\u0634\u064A\u0621 \u0622\u062E\u0631",
365
+ feedbackCommentPlaceholder: "\u0623\u0636\u0641 \u062A\u0641\u0635\u064A\u0644\u0627\u064B (\u0627\u062E\u062A\u064A\u0627\u0631\u064A)",
366
+ feedbackSend: "\u0625\u0631\u0633\u0627\u0644",
367
+ feedbackDismiss: "\u0625\u063A\u0644\u0627\u0642",
368
+ feedbackThanks: "\u0634\u0643\u0631\u064B\u0627\u060C \u0647\u0630\u0627 \u064A\u0633\u0627\u0639\u062F\u0646\u0627.",
369
+ feedbackNotSent: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0625\u0631\u0633\u0627\u0644.",
285
370
  prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
286
371
  nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
287
372
  conceptIllustration: "\u0631\u0633\u0645 \u062A\u0648\u0636\u064A\u062D\u064A \u0644\u0644\u0645\u0641\u0647\u0648\u0645",
288
373
  opensInNewTab: "\u064A\u064F\u0641\u062A\u062D \u0641\u064A \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u062C\u062F\u064A\u062F\u0629",
374
+ seoTitle: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629",
375
+ seoDescription: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
376
+ seoDescriptionProduct: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0648\u0627\u062D\u0635\u0644 \u0639\u0644\u0649 \u0625\u062C\u0627\u0628\u0629 \u0645\u0633\u062A\u0645\u062F\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642 {product} \u0648\u0628\u0642\u064A\u0629 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062C\u0627\u0621\u062A \u0645\u0646\u0647\u0627.",
289
377
  capabilities: [
290
378
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
291
379
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -333,10 +421,27 @@ var TA = {
333
421
  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",
334
422
  answerDidNotArrive: "\u0B85\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BB5\u0BB0\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
335
423
  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",
424
+ feedbackPrompt: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BA4\u0BBE?",
425
+ feedbackHelpful: "\u0BAA\u0BAF\u0BA9\u0BC1\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1",
426
+ feedbackNotHelpful: "\u0BAA\u0BAF\u0BA9\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
427
+ feedbackReasonTitle: "\u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0B95 \u0B87\u0BB2\u0BCD\u0BB2\u0BC8?",
428
+ feedbackReasonInaccurate: "\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BA4\u0B95\u0BB5\u0BB2\u0BCD",
429
+ feedbackReasonIncomplete: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BAE\u0BC8\u0BAF\u0BB1\u0BCD\u0BB1\u0BA4\u0BC1",
430
+ feedbackReasonOffTopic: "\u0BA4\u0BB2\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B85\u0BAA\u0BCD\u0BAA\u0BBE\u0BB1\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
431
+ feedbackReasonHardToFollow: "\u0BAA\u0BC1\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0B95\u0BCA\u0BB3\u0BCD\u0BB3 \u0B95\u0B9F\u0BBF\u0BA9\u0BAE\u0BCD",
432
+ feedbackReasonOther: "\u0BB5\u0BC7\u0BB1\u0BC1 \u0B8F\u0BA4\u0BCB",
433
+ feedbackCommentPlaceholder: "\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BAE\u0BCD (\u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD)",
434
+ feedbackSend: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
435
+ feedbackDismiss: "\u0BAE\u0BC2\u0B9F\u0BC1",
436
+ feedbackThanks: "\u0BA8\u0BA9\u0BCD\u0BB1\u0BBF, \u0B87\u0BA4\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B89\u0BA4\u0BB5\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
437
+ feedbackNotSent: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
336
438
  prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
337
439
  nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
338
440
  conceptIllustration: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BB5\u0BBF\u0BB3\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BAE\u0BCD",
339
441
  opensInNewTab: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0BA4\u0BBE\u0BB5\u0BB2\u0BBF\u0BB2\u0BCD \u0BA4\u0BBF\u0BB1\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD",
442
+ seoTitle: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
443
+ seoDescription: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD; \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD, \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
444
+ seoDescriptionProduct: "{product} \u0BAE\u0BB1\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BBF\u0BB1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BC6\u0BB1, \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u2014 \u0B85\u0BA4\u0BC1 \u0BB5\u0BA8\u0BCD\u0BA4 \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B87\u0BA3\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC1\u0B9F\u0BA9\u0BCD.",
340
445
  capabilities: [
341
446
  "\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",
342
447
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -377,6 +482,171 @@ function exploreStrings(locale) {
377
482
  function fill(template, values) {
378
483
  return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
379
484
  }
485
+
486
+ // src/components/explore-types.ts
487
+ var EXPLORE_FEEDBACK_REASONS = [
488
+ "INACCURATE",
489
+ "INCOMPLETE",
490
+ "OFF_TOPIC",
491
+ "HARD_TO_FOLLOW",
492
+ "OTHER"
493
+ ];
494
+ var EXPLORE_MESSAGE_FIELDS = (
495
+ /* GraphQL */
496
+ `
497
+ id
498
+ conversationId
499
+ role
500
+ status
501
+ content
502
+ partialContent
503
+ activity
504
+ references {
505
+ url
506
+ title
507
+ description
508
+ product
509
+ imageUrl
510
+ index
511
+ }
512
+ ctas {
513
+ kind
514
+ label
515
+ url
516
+ product
517
+ }
518
+ followUps
519
+ answered
520
+ attachments {
521
+ name
522
+ mimeType
523
+ size
524
+ textExtracted
525
+ }
526
+ errorCode
527
+ createdAt
528
+ completedAt
529
+ `
530
+ );
531
+ var EXPLORE_OWN_MESSAGE_FIELDS = (
532
+ /* GraphQL */
533
+ `
534
+ ${EXPLORE_MESSAGE_FIELDS}
535
+ feedback {
536
+ rating
537
+ reason
538
+ comment
539
+ createdAt
540
+ }
541
+ `
542
+ );
543
+ var EXPLORE_CATALOG_QUERY = (
544
+ /* GraphQL */
545
+ `
546
+ query ExploreCatalog($productSlug: String) {
547
+ exploreCatalog(productSlug: $productSlug) {
548
+ enabled
549
+ products {
550
+ slug
551
+ name
552
+ tagline
553
+ website
554
+ }
555
+ examplePrompts
556
+ welcomeTitle
557
+ welcomeBody
558
+ limits {
559
+ maxMessageLength
560
+ maxTurnsPerConversation
561
+ messagesPerDay
562
+ historyTurns
563
+ }
564
+ captchaRequired
565
+ recaptchaSiteKey
566
+ }
567
+ }
568
+ `
569
+ );
570
+ var EXPLORE_MESSAGE_QUERY = (
571
+ /* GraphQL */
572
+ `
573
+ query ExploreMessage($conversationToken: String!, $id: ID!) {
574
+ exploreMessage(conversationToken: $conversationToken, id: $id) {
575
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
576
+ }
577
+ }
578
+ `
579
+ );
580
+ var SEND_EXPLORE_MESSAGE_MUTATION = (
581
+ /* GraphQL */
582
+ `
583
+ mutation SendExploreMessage($input: SendExploreMessageInput!) {
584
+ sendExploreMessage(input: $input) {
585
+ conversation {
586
+ id
587
+ token
588
+ productSlug
589
+ turnCount
590
+ createdAt
591
+ }
592
+ userMessage {
593
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
594
+ }
595
+ assistantMessage {
596
+ ${EXPLORE_OWN_MESSAGE_FIELDS}
597
+ }
598
+ remainingToday
599
+ }
600
+ }
601
+ `
602
+ );
603
+ var RECORD_EXPLORE_CLICK_MUTATION = (
604
+ /* GraphQL */
605
+ `
606
+ mutation RecordExploreClick($input: RecordExploreClickInput!) {
607
+ recordExploreClick(input: $input) {
608
+ recorded
609
+ }
610
+ }
611
+ `
612
+ );
613
+ var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
614
+ /* GraphQL */
615
+ `
616
+ mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
617
+ submitExploreFeedback(input: $input) {
618
+ recorded
619
+ feedback {
620
+ rating
621
+ reason
622
+ comment
623
+ createdAt
624
+ }
625
+ }
626
+ }
627
+ `
628
+ );
629
+ var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
630
+ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
631
+ /* GraphQL */
632
+ `
633
+ mutation CreateExploreShareLink($conversationToken: String!) {
634
+ createExploreShareLink(conversationToken: $conversationToken) {
635
+ shareToken
636
+ }
637
+ }
638
+ `
639
+ );
640
+ var EXPLORE_SHARED_CONVERSATION_QUERY = (
641
+ /* GraphQL */
642
+ `
643
+ query ExploreSharedConversation($shareToken: String!) {
644
+ exploreSharedConversation(shareToken: $shareToken) {
645
+ ${EXPLORE_MESSAGE_FIELDS}
646
+ }
647
+ }
648
+ `
649
+ );
380
650
  function MarkdownLink({
381
651
  href,
382
652
  children,
@@ -816,135 +1086,6 @@ function useWebSDK() {
816
1086
  return client;
817
1087
  }
818
1088
 
819
- // src/components/explore-types.ts
820
- var EXPLORE_MESSAGE_FIELDS = (
821
- /* GraphQL */
822
- `
823
- id
824
- conversationId
825
- role
826
- status
827
- content
828
- partialContent
829
- activity
830
- references {
831
- url
832
- title
833
- description
834
- product
835
- imageUrl
836
- index
837
- }
838
- ctas {
839
- kind
840
- label
841
- url
842
- product
843
- }
844
- followUps
845
- answered
846
- attachments {
847
- name
848
- mimeType
849
- size
850
- textExtracted
851
- }
852
- errorCode
853
- createdAt
854
- completedAt
855
- `
856
- );
857
- var EXPLORE_CATALOG_QUERY = (
858
- /* GraphQL */
859
- `
860
- query ExploreCatalog($productSlug: String) {
861
- exploreCatalog(productSlug: $productSlug) {
862
- enabled
863
- products {
864
- slug
865
- name
866
- tagline
867
- website
868
- }
869
- examplePrompts
870
- welcomeTitle
871
- welcomeBody
872
- limits {
873
- maxMessageLength
874
- maxTurnsPerConversation
875
- messagesPerDay
876
- historyTurns
877
- }
878
- captchaRequired
879
- recaptchaSiteKey
880
- }
881
- }
882
- `
883
- );
884
- var EXPLORE_MESSAGE_QUERY = (
885
- /* GraphQL */
886
- `
887
- query ExploreMessage($conversationToken: String!, $id: ID!) {
888
- exploreMessage(conversationToken: $conversationToken, id: $id) {
889
- ${EXPLORE_MESSAGE_FIELDS}
890
- }
891
- }
892
- `
893
- );
894
- var SEND_EXPLORE_MESSAGE_MUTATION = (
895
- /* GraphQL */
896
- `
897
- mutation SendExploreMessage($input: SendExploreMessageInput!) {
898
- sendExploreMessage(input: $input) {
899
- conversation {
900
- id
901
- token
902
- productSlug
903
- turnCount
904
- createdAt
905
- }
906
- userMessage {
907
- ${EXPLORE_MESSAGE_FIELDS}
908
- }
909
- assistantMessage {
910
- ${EXPLORE_MESSAGE_FIELDS}
911
- }
912
- remainingToday
913
- }
914
- }
915
- `
916
- );
917
- var RECORD_EXPLORE_CLICK_MUTATION = (
918
- /* GraphQL */
919
- `
920
- mutation RecordExploreClick($input: RecordExploreClickInput!) {
921
- recordExploreClick(input: $input) {
922
- recorded
923
- }
924
- }
925
- `
926
- );
927
- var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
928
- /* GraphQL */
929
- `
930
- mutation CreateExploreShareLink($conversationToken: String!) {
931
- createExploreShareLink(conversationToken: $conversationToken) {
932
- shareToken
933
- }
934
- }
935
- `
936
- );
937
- var EXPLORE_SHARED_CONVERSATION_QUERY = (
938
- /* GraphQL */
939
- `
940
- query ExploreSharedConversation($shareToken: String!) {
941
- exploreSharedConversation(shareToken: $shareToken) {
942
- ${EXPLORE_MESSAGE_FIELDS}
943
- }
944
- }
945
- `
946
- );
947
-
948
1089
  // src/data/products.ts
949
1090
  var ECOSYSTEM_PRODUCTS = [
950
1091
  {
@@ -1972,6 +2113,42 @@ function useExploreChat(options = {}) {
1972
2113
  },
1973
2114
  [client]
1974
2115
  );
2116
+ const submitFeedback = React.useCallback(
2117
+ async (messageId, rating, detail) => {
2118
+ const token = conversationTokenRef.current;
2119
+ if (!token) return false;
2120
+ const comment = detail?.comment?.trim();
2121
+ const input = {
2122
+ conversationToken: token,
2123
+ messageId,
2124
+ rating,
2125
+ // Only meaningful with NOT_HELPFUL. The server stores null for HELPFUL either
2126
+ // way; sending it would just be noise the backend has to defend against.
2127
+ reason: rating === "NOT_HELPFUL" ? detail?.reason ?? null : null,
2128
+ comment: comment ? comment : null
2129
+ };
2130
+ try {
2131
+ const res = await client.mutate(
2132
+ SUBMIT_EXPLORE_FEEDBACK_MUTATION,
2133
+ { input }
2134
+ );
2135
+ const result = res?.data?.submitExploreFeedback;
2136
+ if (!result?.recorded) return false;
2137
+ const recorded = result.feedback;
2138
+ if (recorded && mountedRef.current) {
2139
+ setMessages(
2140
+ (current) => current.map(
2141
+ (message) => message.id === messageId ? { ...message, feedback: recorded } : message
2142
+ )
2143
+ );
2144
+ }
2145
+ return true;
2146
+ } catch {
2147
+ return false;
2148
+ }
2149
+ },
2150
+ [client]
2151
+ );
1975
2152
  return {
1976
2153
  phase,
1977
2154
  catalog,
@@ -1991,6 +2168,7 @@ function useExploreChat(options = {}) {
1991
2168
  deleteConversation,
1992
2169
  clearHistory,
1993
2170
  recordClick,
2171
+ submitFeedback,
1994
2172
  createShareLink,
1995
2173
  isSharedView
1996
2174
  };
@@ -3046,6 +3224,206 @@ function ThinkingIndicator({ activity }) {
3046
3224
  }
3047
3225
  );
3048
3226
  }
3227
+ function AnswerFeedback({
3228
+ strings: T,
3229
+ messageId,
3230
+ feedback,
3231
+ onSubmit
3232
+ }) {
3233
+ const [local, setLocal] = React.useState(null);
3234
+ const [failed, setFailed] = React.useState(false);
3235
+ const [sending, setSending] = React.useState(false);
3236
+ const [chooserOpen, setChooserOpen] = React.useState(false);
3237
+ const [reason, setReason] = React.useState(null);
3238
+ const [comment, setComment] = React.useState("");
3239
+ const downRef = React.useRef(null);
3240
+ const firstReasonRef = React.useRef(null);
3241
+ const inFlightRef = React.useRef(false);
3242
+ const panelId = `boff-explore-feedback-${messageId}`;
3243
+ const rating = local ?? feedback?.rating ?? null;
3244
+ const rated = rating !== null;
3245
+ const reasonLabels = {
3246
+ INACCURATE: T.feedbackReasonInaccurate,
3247
+ INCOMPLETE: T.feedbackReasonIncomplete,
3248
+ OFF_TOPIC: T.feedbackReasonOffTopic,
3249
+ HARD_TO_FOLLOW: T.feedbackReasonHardToFollow,
3250
+ OTHER: T.feedbackReasonOther
3251
+ };
3252
+ const closeChooser = React.useCallback(() => {
3253
+ setChooserOpen(false);
3254
+ downRef.current?.focus();
3255
+ }, []);
3256
+ const submit = React.useCallback(
3257
+ async (next, detail) => {
3258
+ if (inFlightRef.current) return;
3259
+ inFlightRef.current = true;
3260
+ setSending(true);
3261
+ setFailed(false);
3262
+ setLocal(next);
3263
+ const recorded = await onSubmit(next, detail);
3264
+ inFlightRef.current = false;
3265
+ setSending(false);
3266
+ if (recorded) return;
3267
+ setLocal(null);
3268
+ setFailed(true);
3269
+ },
3270
+ [onSubmit]
3271
+ );
3272
+ const onThumbUp = React.useCallback(() => {
3273
+ setChooserOpen(false);
3274
+ void submit("HELPFUL");
3275
+ }, [submit]);
3276
+ const onThumbDown = React.useCallback(() => {
3277
+ setChooserOpen((open) => !open);
3278
+ }, []);
3279
+ const onSendReason = React.useCallback(() => {
3280
+ setChooserOpen(false);
3281
+ void submit("NOT_HELPFUL", { reason, comment });
3282
+ }, [comment, reason, submit]);
3283
+ React.useEffect(() => {
3284
+ if (!chooserOpen) return;
3285
+ firstReasonRef.current?.focus();
3286
+ }, [chooserOpen]);
3287
+ const thumbClass = (active) => cn(
3288
+ "inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border transition-colors",
3289
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3290
+ "disabled:pointer-events-none disabled:opacity-50",
3291
+ active ? "border-primary/40 bg-accent text-primary" : "border-border bg-card text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground"
3292
+ );
3293
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3294
+ "div",
3295
+ {
3296
+ "data-boff-explore": "feedback",
3297
+ "data-rating": rating ?? "none",
3298
+ className: "pt-0.5",
3299
+ children: [
3300
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
3301
+ /* @__PURE__ */ jsxRuntime.jsx(
3302
+ "p",
3303
+ {
3304
+ "data-boff-explore": "feedback-status",
3305
+ role: "status",
3306
+ className: "text-xs text-muted-foreground",
3307
+ children: failed ? T.feedbackNotSent : rated ? T.feedbackThanks : T.feedbackPrompt
3308
+ }
3309
+ ),
3310
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
3311
+ /* @__PURE__ */ jsxRuntime.jsx(
3312
+ "button",
3313
+ {
3314
+ "data-boff-explore": "feedback-up",
3315
+ type: "button",
3316
+ disabled: sending,
3317
+ "aria-label": T.feedbackHelpful,
3318
+ title: T.feedbackHelpful,
3319
+ "aria-pressed": rating === "HELPFUL",
3320
+ onClick: onThumbUp,
3321
+ className: thumbClass(rating === "HELPFUL"),
3322
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ThumbsUp, { className: "h-3.5 w-3.5", "aria-hidden": "true" })
3323
+ }
3324
+ ),
3325
+ /* @__PURE__ */ jsxRuntime.jsx(
3326
+ "button",
3327
+ {
3328
+ ref: downRef,
3329
+ "data-boff-explore": "feedback-down",
3330
+ type: "button",
3331
+ disabled: sending,
3332
+ "aria-label": T.feedbackNotHelpful,
3333
+ title: T.feedbackNotHelpful,
3334
+ "aria-pressed": rating === "NOT_HELPFUL",
3335
+ "aria-expanded": chooserOpen,
3336
+ "aria-controls": chooserOpen ? panelId : void 0,
3337
+ onClick: onThumbDown,
3338
+ className: thumbClass(rating === "NOT_HELPFUL" || chooserOpen),
3339
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ThumbsDown, { className: "h-3.5 w-3.5", "aria-hidden": "true" })
3340
+ }
3341
+ )
3342
+ ] })
3343
+ ] }),
3344
+ chooserOpen ? /* @__PURE__ */ jsxRuntime.jsxs(
3345
+ "div",
3346
+ {
3347
+ id: panelId,
3348
+ "data-boff-explore": "feedback-reasons",
3349
+ role: "group",
3350
+ "aria-label": T.feedbackReasonTitle,
3351
+ onKeyDown: (event) => {
3352
+ if (event.key !== "Escape") return;
3353
+ event.stopPropagation();
3354
+ closeChooser();
3355
+ },
3356
+ className: "boff-explore-fade mt-2 rounded-xl border border-border bg-card p-3",
3357
+ children: [
3358
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-medium text-card-foreground", children: T.feedbackReasonTitle }),
3359
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: EXPLORE_FEEDBACK_REASONS.map((code, index) => /* @__PURE__ */ jsxRuntime.jsx(
3360
+ "button",
3361
+ {
3362
+ ref: index === 0 ? firstReasonRef : void 0,
3363
+ "data-boff-explore": "feedback-reason",
3364
+ "data-reason": code,
3365
+ type: "button",
3366
+ "aria-pressed": reason === code,
3367
+ onClick: () => setReason((current) => current === code ? null : code),
3368
+ className: cn(
3369
+ "inline-flex max-w-full items-center rounded-full border px-3 py-1 text-xs transition-colors",
3370
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
3371
+ reason === code ? "border-primary/40 bg-accent text-primary" : "border-border bg-background text-muted-foreground hover:border-primary/40 hover:bg-accent hover:text-foreground"
3372
+ ),
3373
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: reasonLabels[code] })
3374
+ },
3375
+ code
3376
+ )) }),
3377
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2", children: [
3378
+ /* @__PURE__ */ jsxRuntime.jsx(
3379
+ "input",
3380
+ {
3381
+ "data-boff-explore": "feedback-comment",
3382
+ type: "text",
3383
+ value: comment,
3384
+ onChange: (event) => setComment(event.target.value),
3385
+ onKeyDown: (event) => {
3386
+ if (event.key !== "Enter") return;
3387
+ event.preventDefault();
3388
+ onSendReason();
3389
+ },
3390
+ "aria-label": T.feedbackCommentPlaceholder,
3391
+ placeholder: T.feedbackCommentPlaceholder,
3392
+ maxLength: EXPLORE_FEEDBACK_COMMENT_SOFT_MAX,
3393
+ className: "min-w-0 flex-1 rounded-md border border-border bg-background px-2 py-1 text-base text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:text-sm"
3394
+ }
3395
+ ),
3396
+ /* @__PURE__ */ jsxRuntime.jsx(
3397
+ Button,
3398
+ {
3399
+ "data-boff-explore": "feedback-send",
3400
+ type: "button",
3401
+ size: "sm",
3402
+ disabled: sending,
3403
+ onClick: onSendReason,
3404
+ children: T.feedbackSend
3405
+ }
3406
+ ),
3407
+ /* @__PURE__ */ jsxRuntime.jsx(
3408
+ Button,
3409
+ {
3410
+ "data-boff-explore": "feedback-dismiss",
3411
+ type: "button",
3412
+ size: "sm",
3413
+ variant: "ghost",
3414
+ className: "text-muted-foreground",
3415
+ onClick: closeChooser,
3416
+ children: T.feedbackDismiss
3417
+ }
3418
+ )
3419
+ ] })
3420
+ ]
3421
+ }
3422
+ ) : null
3423
+ ]
3424
+ }
3425
+ );
3426
+ }
3049
3427
  function UserBubble({
3050
3428
  strings: T,
3051
3429
  message
@@ -3094,7 +3472,8 @@ function AssistantBubble({
3094
3472
  onNavigate,
3095
3473
  anchorRef,
3096
3474
  onFollow,
3097
- onFollowUp
3475
+ onFollowUp,
3476
+ onFeedback
3098
3477
  }) {
3099
3478
  const streaming = message.status === "PENDING" || message.status === "RUNNING";
3100
3479
  const body = message.content || message.partialContent || "";
@@ -3205,7 +3584,16 @@ function AssistantBubble({
3205
3584
  },
3206
3585
  question
3207
3586
  )) })
3208
- ] }) : null
3587
+ ] }) : null,
3588
+ completed && onFeedback ? /* @__PURE__ */ jsxRuntime.jsx(
3589
+ AnswerFeedback,
3590
+ {
3591
+ strings: T,
3592
+ messageId: message.id,
3593
+ feedback: message.feedback,
3594
+ onSubmit: onFeedback
3595
+ }
3596
+ ) : null
3209
3597
  ] })
3210
3598
  ]
3211
3599
  }
@@ -3609,6 +3997,7 @@ function ExplorePage({
3609
3997
  deleteConversation,
3610
3998
  clearHistory,
3611
3999
  recordClick,
4000
+ submitFeedback,
3612
4001
  createShareLink,
3613
4002
  isSharedView
3614
4003
  } = useExploreChat({
@@ -3665,6 +4054,10 @@ function ExplorePage({
3665
4054
  () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
3666
4055
  [catalog.products, focusProduct]
3667
4056
  );
4057
+ const headProductName = React.useMemo(
4058
+ () => productSlug ? catalog.products.find((p) => p.slug === productSlug)?.name ?? null : null,
4059
+ [catalog.products, productSlug]
4060
+ );
3668
4061
  const imageOrigins = React.useMemo(
3669
4062
  () => inlineImageOrigins(catalog.products),
3670
4063
  [catalog.products]
@@ -4029,16 +4422,17 @@ function ExplorePage({
4029
4422
  ),
4030
4423
  style: rootStyle,
4031
4424
  children: [
4032
- seo ? /* @__PURE__ */ jsxRuntime.jsx(
4425
+ /* @__PURE__ */ jsxRuntime.jsx(
4033
4426
  PageHead,
4034
4427
  {
4035
- title: seo.title ?? "Explore \u2014 ask anything about our products",
4036
- description: seo.description ?? "Ask questions in plain English and get answers drawn from our product documentation, with links to the exact pages they came from.",
4037
- keywords: seo.keywords,
4038
- image: seo.image,
4039
- url: seo.url
4428
+ title: seo?.title ?? T.seoTitle,
4429
+ description: seo?.description ?? (headProductName ? fill(T.seoDescriptionProduct, { product: headProductName }) : T.seoDescription),
4430
+ productName: seo?.title ? void 0 : headProductName ?? void 0,
4431
+ keywords: seo?.keywords,
4432
+ image: seo?.image,
4433
+ url: seo?.url
4040
4434
  }
4041
- ) : null,
4435
+ ),
4042
4436
  /* @__PURE__ */ jsxRuntime.jsx(ProseStyles, {}),
4043
4437
  /* @__PURE__ */ jsxRuntime.jsx(ExploreStyles, {}),
4044
4438
  !showWelcome ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5 border-b border-border px-4 py-2.5", children: [
@@ -4215,7 +4609,8 @@ function ExplorePage({
4215
4609
  onNavigate,
4216
4610
  anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
4217
4611
  onFollow: (kind, url) => recordClick(message.id, kind, url),
4218
- onFollowUp: sendPrompt
4612
+ onFollowUp: sendPrompt,
4613
+ onFeedback: isSharedView ? void 0 : (rating, detail) => submitFeedback(message.id, rating, detail)
4219
4614
  },
4220
4615
  message.id
4221
4616
  )