@burdenoff/website-sdk 2026.922.5 → 2026.923.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/explore.d.mts +4 -180
- package/dist/components/explore.d.ts +4 -180
- package/dist/components/explore.js +1458 -927
- package/dist/components/explore.js.map +1 -1
- package/dist/components/explore.mjs +1225 -694
- package/dist/components/explore.mjs.map +1 -1
- package/dist/explore-D25zoXy9.d.mts +240 -0
- package/dist/explore-I4QnY4J9.d.ts +240 -0
- package/dist/{explore-types-DvQPiL1t.d.mts → explore-types-B5sdOC5M.d.mts} +75 -2
- package/dist/{explore-types-DvQPiL1t.d.ts → explore-types-B5sdOC5M.d.ts} +75 -2
- package/dist/hooks/index.d.mts +2 -2
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.js +125 -8
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +125 -8
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.d.mts +417 -25
- package/dist/index.d.ts +417 -25
- package/dist/index.js +2629 -872
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2610 -874
- package/dist/index.mjs.map +1 -1
- package/dist/{use-progressive-reveal-Ha3gYPfs.d.mts → use-progressive-reveal-Cmy8bA7L.d.mts} +54 -7
- package/dist/{use-progressive-reveal-BfU_IHip.d.ts → use-progressive-reveal-DHPGGxZu.d.ts} +54 -7
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -5959,7 +5959,7 @@ var EN = {
|
|
|
5959
5959
|
showLess: "Show less",
|
|
5960
5960
|
sources: "Sources",
|
|
5961
5961
|
nextYouCouldAsk: "Next you could ask",
|
|
5962
|
-
placeholder: "Describe the problem
|
|
5962
|
+
placeholder: "Describe the problem\u2026",
|
|
5963
5963
|
placeholderProduct: "Describe a problem, or ask about {product}\u2026",
|
|
5964
5964
|
send: "Send",
|
|
5965
5965
|
stop: "Stop",
|
|
@@ -6000,6 +6000,20 @@ var EN = {
|
|
|
6000
6000
|
feedbackDismiss: "Dismiss",
|
|
6001
6001
|
feedbackThanks: "Thanks \u2014 that helps.",
|
|
6002
6002
|
feedbackNotSent: "That didn't send.",
|
|
6003
|
+
escalateOpen: "Talk to a person",
|
|
6004
|
+
escalateTitle: "Send this conversation to a person",
|
|
6005
|
+
escalateBody: "We'll pass the whole conversation on, so you don't have to type any of it again.",
|
|
6006
|
+
escalateEmailLabel: "Your email address",
|
|
6007
|
+
escalateEmailPlaceholder: "you@example.com",
|
|
6008
|
+
escalateNoteLabel: "Anything else a person should know? (optional)",
|
|
6009
|
+
escalateSubmit: "Send to a person",
|
|
6010
|
+
escalateSending: "Sending\u2026",
|
|
6011
|
+
escalateCancel: "Cancel",
|
|
6012
|
+
escalateInvalidEmail: "That doesn't look like an address we can reply to. Please check it.",
|
|
6013
|
+
escalateSent: "A person now has this conversation. We'll reply to {email}.",
|
|
6014
|
+
escalateRateLimited: "That's a lot of requests in a short time. Please try again in a few minutes.",
|
|
6015
|
+
escalateCaptcha: "We couldn't verify that you're human. Please try that again.",
|
|
6016
|
+
escalateFailed: "We couldn't pass that on just now. Please try again.",
|
|
6003
6017
|
prevSuggestion: "Previous suggestion",
|
|
6004
6018
|
nextSuggestion: "Next suggestion",
|
|
6005
6019
|
conceptIllustration: "Concept illustration",
|
|
@@ -6047,7 +6061,7 @@ var ZH = {
|
|
|
6047
6061
|
showLess: "\u6536\u8D77",
|
|
6048
6062
|
sources: "\u6765\u6E90",
|
|
6049
6063
|
nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
|
|
6050
|
-
placeholder: "\u63CF\u8FF0\u4F60\
|
|
6064
|
+
placeholder: "\u63CF\u8FF0\u4F60\u7684\u95EE\u9898\u2026",
|
|
6051
6065
|
placeholderProduct: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8BE2\u95EE {product}\u2026",
|
|
6052
6066
|
send: "\u53D1\u9001",
|
|
6053
6067
|
stop: "\u505C\u6B62",
|
|
@@ -6085,6 +6099,20 @@ var ZH = {
|
|
|
6085
6099
|
feedbackDismiss: "\u5173\u95ED",
|
|
6086
6100
|
feedbackThanks: "\u8C22\u8C22\uFF0C\u8FD9\u5BF9\u6211\u4EEC\u5F88\u6709\u5E2E\u52A9\u3002",
|
|
6087
6101
|
feedbackNotSent: "\u6CA1\u6709\u63D0\u4EA4\u6210\u529F\u3002",
|
|
6102
|
+
escalateOpen: "\u8054\u7CFB\u771F\u4EBA",
|
|
6103
|
+
escalateTitle: "\u628A\u8FD9\u6BB5\u5BF9\u8BDD\u8F6C\u7ED9\u771F\u4EBA",
|
|
6104
|
+
escalateBody: "\u6211\u4EEC\u4F1A\u628A\u6574\u6BB5\u5BF9\u8BDD\u4E00\u8D77\u8F6C\u8FC7\u53BB\uFF0C\u60A8\u4E0D\u7528\u518D\u91CD\u65B0\u6253\u4E00\u904D\u3002",
|
|
6105
|
+
escalateEmailLabel: "\u60A8\u7684\u90AE\u7BB1\u5730\u5740",
|
|
6106
|
+
escalateEmailPlaceholder: "you@example.com",
|
|
6107
|
+
escalateNoteLabel: "\u8FD8\u6709\u4EC0\u4E48\u9700\u8981\u544A\u8BC9\u6211\u4EEC\u7684\u5417\uFF1F\uFF08\u9009\u586B\uFF09",
|
|
6108
|
+
escalateSubmit: "\u8F6C\u7ED9\u771F\u4EBA",
|
|
6109
|
+
escalateSending: "\u6B63\u5728\u53D1\u9001\u2026",
|
|
6110
|
+
escalateCancel: "\u53D6\u6D88",
|
|
6111
|
+
escalateInvalidEmail: "\u8FD9\u4F3C\u4E4E\u4E0D\u662F\u4E00\u4E2A\u6211\u4EEC\u53EF\u4EE5\u56DE\u590D\u7684\u90AE\u7BB1\u5730\u5740\uFF0C\u8BF7\u68C0\u67E5\u4E00\u4E0B\u3002",
|
|
6112
|
+
escalateSent: "\u5DF2\u6709\u540C\u4E8B\u63A5\u624B\u8FD9\u6BB5\u5BF9\u8BDD\uFF0C\u6211\u4EEC\u4F1A\u56DE\u590D\u5230 {email}\u3002",
|
|
6113
|
+
escalateRateLimited: "\u77ED\u65F6\u95F4\u5185\u8BF7\u6C42\u8FC7\u591A\uFF0C\u8BF7\u51E0\u5206\u949F\u540E\u518D\u8BD5\u3002",
|
|
6114
|
+
escalateCaptcha: "\u6211\u4EEC\u65E0\u6CD5\u9A8C\u8BC1\u60A8\u662F\u771F\u4EBA\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002",
|
|
6115
|
+
escalateFailed: "\u6682\u65F6\u65E0\u6CD5\u8F6C\u4EA4\uFF0C\u8BF7\u518D\u8BD5\u4E00\u6B21\u3002",
|
|
6088
6116
|
prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
|
|
6089
6117
|
nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
|
|
6090
6118
|
conceptIllustration: "\u6982\u5FF5\u793A\u610F\u56FE",
|
|
@@ -6128,7 +6156,7 @@ var HI = {
|
|
|
6128
6156
|
showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
|
|
6129
6157
|
sources: "\u0938\u094D\u0930\u094B\u0924",
|
|
6130
6158
|
nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
|
|
6131
|
-
placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \
|
|
6159
|
+
placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902\u2026",
|
|
6132
6160
|
placeholderProduct: "\u0938\u092E\u0938\u094D\u092F\u093E \u092C\u0924\u093E\u090F\u0902, \u092F\u093E {product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
|
|
6133
6161
|
send: "\u092D\u0947\u091C\u0947\u0902",
|
|
6134
6162
|
stop: "\u0930\u094B\u0915\u0947\u0902",
|
|
@@ -6166,6 +6194,20 @@ var HI = {
|
|
|
6166
6194
|
feedbackDismiss: "\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
|
|
6167
6195
|
feedbackThanks: "\u0927\u0928\u094D\u092F\u0935\u093E\u0926, \u0907\u0938\u0938\u0947 \u092E\u0926\u0926 \u092E\u093F\u0932\u0924\u0940 \u0939\u0948\u0964",
|
|
6168
6196
|
feedbackNotSent: "\u092F\u0939 \u092D\u0947\u091C\u093E \u0928\u0939\u0940\u0902 \u091C\u093E \u0938\u0915\u093E\u0964",
|
|
6197
|
+
escalateOpen: "\u0915\u093F\u0938\u0940 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0938\u0947 \u092C\u093E\u0924 \u0915\u0930\u0947\u0902",
|
|
6198
|
+
escalateTitle: "\u092F\u0939 \u092C\u093E\u0924\u091A\u0940\u0924 \u0915\u093F\u0938\u0940 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u094B \u092D\u0947\u091C\u0947\u0902",
|
|
6199
|
+
escalateBody: "\u0939\u092E \u092A\u0942\u0930\u0940 \u092C\u093E\u0924\u091A\u0940\u0924 \u0906\u0917\u0947 \u092D\u0947\u091C \u0926\u0947\u0902\u0917\u0947, \u0924\u093E\u0915\u093F \u0906\u092A\u0915\u094B \u0926\u094B\u092C\u093E\u0930\u093E \u0915\u0941\u091B \u0932\u093F\u0916\u0928\u093E \u0928 \u092A\u0921\u093C\u0947\u0964",
|
|
6200
|
+
escalateEmailLabel: "\u0906\u092A\u0915\u093E \u0908\u092E\u0947\u0932 \u092A\u0924\u093E",
|
|
6201
|
+
escalateEmailPlaceholder: "you@example.com",
|
|
6202
|
+
escalateNoteLabel: "\u0915\u094D\u092F\u093E \u0915\u0941\u091B \u0914\u0930 \u092C\u0924\u093E\u0928\u093E \u091A\u093E\u0939\u0947\u0902\u0917\u0947? (\u0935\u0948\u0915\u0932\u094D\u092A\u093F\u0915)",
|
|
6203
|
+
escalateSubmit: "\u0915\u093F\u0938\u0940 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u094B \u092D\u0947\u091C\u0947\u0902",
|
|
6204
|
+
escalateSending: "\u092D\u0947\u091C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u2026",
|
|
6205
|
+
escalateCancel: "\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",
|
|
6206
|
+
escalateInvalidEmail: "\u092F\u0939 \u0910\u0938\u093E \u0908\u092E\u0947\u0932 \u092A\u0924\u093E \u0928\u0939\u0940\u0902 \u0932\u0917\u0924\u093E \u091C\u093F\u0938 \u092A\u0930 \u0939\u092E \u091C\u0935\u093E\u092C \u092D\u0947\u091C \u0938\u0915\u0947\u0902\u0964 \u0915\u0943\u092A\u092F\u093E \u091C\u093E\u0901\u091A \u0932\u0947\u0902\u0964",
|
|
6207
|
+
escalateSent: "\u0905\u092C \u092F\u0939 \u092C\u093E\u0924\u091A\u0940\u0924 \u090F\u0915 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u0947 \u092A\u093E\u0938 \u0939\u0948\u0964 \u0939\u092E {email} \u092A\u0930 \u091C\u0935\u093E\u092C \u0926\u0947\u0902\u0917\u0947\u0964",
|
|
6208
|
+
escalateRateLimited: "\u0925\u094B\u0921\u093C\u0947 \u0938\u092E\u092F \u092E\u0947\u0902 \u092C\u0939\u0941\u0924 \u0938\u093E\u0930\u0947 \u0905\u0928\u0941\u0930\u094B\u0927 \u0939\u094B \u0917\u090F\u0964 \u0915\u0943\u092A\u092F\u093E \u0915\u0941\u091B \u092E\u093F\u0928\u091F \u092C\u093E\u0926 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
|
|
6209
|
+
escalateCaptcha: "\u0939\u092E \u092F\u0939 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0928\u0939\u0940\u0902 \u0915\u0930 \u0938\u0915\u0947 \u0915\u093F \u0906\u092A \u090F\u0915 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0939\u0948\u0902\u0964 \u0915\u0943\u092A\u092F\u093E \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
|
|
6210
|
+
escalateFailed: "\u0905\u092D\u0940 \u0907\u0938\u0947 \u0906\u0917\u0947 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u091C\u093E \u0938\u0915\u093E\u0964 \u0915\u0943\u092A\u092F\u093E \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964",
|
|
6169
6211
|
prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
6170
6212
|
nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
|
|
6171
6213
|
conceptIllustration: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u091A\u093F\u0924\u094D\u0930\u0923",
|
|
@@ -6213,7 +6255,7 @@ var ES = {
|
|
|
6213
6255
|
showLess: "Ver menos",
|
|
6214
6256
|
sources: "Fuentes",
|
|
6215
6257
|
nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
|
|
6216
|
-
placeholder: "Describe el problema
|
|
6258
|
+
placeholder: "Describe el problema\u2026",
|
|
6217
6259
|
placeholderProduct: "Describe un problema o pregunta por {product}\u2026",
|
|
6218
6260
|
send: "Enviar",
|
|
6219
6261
|
stop: "Detener",
|
|
@@ -6251,6 +6293,20 @@ var ES = {
|
|
|
6251
6293
|
feedbackDismiss: "Cerrar",
|
|
6252
6294
|
feedbackThanks: "Gracias, nos sirve.",
|
|
6253
6295
|
feedbackNotSent: "No se ha podido enviar.",
|
|
6296
|
+
escalateOpen: "Hablar con una persona",
|
|
6297
|
+
escalateTitle: "Env\xEDa esta conversaci\xF3n a una persona",
|
|
6298
|
+
escalateBody: "Le pasaremos la conversaci\xF3n entera, as\xED no tienes que volver a escribirla.",
|
|
6299
|
+
escalateEmailLabel: "Tu direcci\xF3n de correo",
|
|
6300
|
+
escalateEmailPlaceholder: "tu@ejemplo.com",
|
|
6301
|
+
escalateNoteLabel: "\xBFAlgo m\xE1s que deber\xEDamos saber? (opcional)",
|
|
6302
|
+
escalateSubmit: "Enviar a una persona",
|
|
6303
|
+
escalateSending: "Enviando\u2026",
|
|
6304
|
+
escalateCancel: "Cancelar",
|
|
6305
|
+
escalateInvalidEmail: "No parece una direcci\xF3n a la que podamos responder. Rev\xEDsala, por favor.",
|
|
6306
|
+
escalateSent: "Una persona ya tiene esta conversaci\xF3n. Te responderemos a {email}.",
|
|
6307
|
+
escalateRateLimited: "Han sido muchas peticiones en poco tiempo. Int\xE9ntalo de nuevo en unos minutos.",
|
|
6308
|
+
escalateCaptcha: "No hemos podido verificar que eres una persona. Int\xE9ntalo de nuevo.",
|
|
6309
|
+
escalateFailed: "No hemos podido pasarlo ahora mismo. Int\xE9ntalo de nuevo.",
|
|
6254
6310
|
prevSuggestion: "Sugerencia anterior",
|
|
6255
6311
|
nextSuggestion: "Sugerencia siguiente",
|
|
6256
6312
|
conceptIllustration: "Ilustraci\xF3n del concepto",
|
|
@@ -6298,7 +6354,7 @@ var AR = {
|
|
|
6298
6354
|
showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
|
|
6299
6355
|
sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
|
|
6300
6356
|
nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
|
|
6301
|
-
placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629
|
|
6357
|
+
placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u2026",
|
|
6302
6358
|
placeholderProduct: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
|
|
6303
6359
|
send: "\u0625\u0631\u0633\u0627\u0644",
|
|
6304
6360
|
stop: "\u0625\u064A\u0642\u0627\u0641",
|
|
@@ -6336,6 +6392,20 @@ var AR = {
|
|
|
6336
6392
|
feedbackDismiss: "\u0625\u063A\u0644\u0627\u0642",
|
|
6337
6393
|
feedbackThanks: "\u0634\u0643\u0631\u064B\u0627\u060C \u0647\u0630\u0627 \u064A\u0633\u0627\u0639\u062F\u0646\u0627.",
|
|
6338
6394
|
feedbackNotSent: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0625\u0631\u0633\u0627\u0644.",
|
|
6395
|
+
escalateOpen: "\u062A\u0648\u0627\u0635\u0644 \u0645\u0639 \u0634\u062E\u0635",
|
|
6396
|
+
escalateTitle: "\u0623\u0631\u0633\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0625\u0644\u0649 \u0634\u062E\u0635",
|
|
6397
|
+
escalateBody: "\u0633\u0646\u0645\u0631\u0651\u0631 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0643\u0627\u0645\u0644\u0629\u060C \u062D\u062A\u0649 \u0644\u0627 \u062A\u0636\u0637\u0631 \u0625\u0644\u0649 \u0643\u062A\u0627\u0628\u062A\u0647\u0627 \u0645\u0646 \u062C\u062F\u064A\u062F.",
|
|
6398
|
+
escalateEmailLabel: "\u0628\u0631\u064A\u062F\u0643 \u0627\u0644\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A",
|
|
6399
|
+
escalateEmailPlaceholder: "you@example.com",
|
|
6400
|
+
escalateNoteLabel: "\u0647\u0644 \u0645\u0646 \u0634\u064A\u0621 \u0622\u062E\u0631 \u064A\u0646\u0628\u063A\u064A \u0623\u0646 \u0646\u0639\u0631\u0641\u0647\u061F (\u0627\u062E\u062A\u064A\u0627\u0631\u064A)",
|
|
6401
|
+
escalateSubmit: "\u0625\u0631\u0633\u0627\u0644 \u0625\u0644\u0649 \u0634\u062E\u0635",
|
|
6402
|
+
escalateSending: "\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0631\u0633\u0627\u0644\u2026",
|
|
6403
|
+
escalateCancel: "\u0625\u0644\u063A\u0627\u0621",
|
|
6404
|
+
escalateInvalidEmail: "\u0644\u0627 \u064A\u0628\u062F\u0648 \u0647\u0630\u0627 \u0639\u0646\u0648\u0627\u0646\u064B\u0627 \u064A\u0645\u0643\u0646\u0646\u0627 \u0627\u0644\u0631\u062F \u0639\u0644\u064A\u0647. \u064A\u0631\u062C\u0649 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646\u0647.",
|
|
6405
|
+
escalateSent: "\u0623\u0635\u0628\u062D\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0644\u062F\u0649 \u0623\u062D\u062F \u0627\u0644\u0632\u0645\u0644\u0627\u0621. \u0633\u0646\u0631\u062F \u0639\u0644\u0649 {email}.",
|
|
6406
|
+
escalateRateLimited: "\u0637\u0644\u0628\u0627\u062A \u0643\u062B\u064A\u0631\u0629 \u062E\u0644\u0627\u0644 \u0648\u0642\u062A \u0642\u0635\u064A\u0631. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0628\u0639\u062F \u0628\u0636\u0639 \u062F\u0642\u0627\u0626\u0642.",
|
|
6407
|
+
escalateCaptcha: "\u062A\u0639\u0630\u0651\u0631 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0623\u0646\u0643 \u0644\u0633\u062A \u0631\u0648\u0628\u0648\u062A\u064B\u0627. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
|
|
6408
|
+
escalateFailed: "\u062A\u0639\u0630\u0651\u0631 \u062A\u0645\u0631\u064A\u0631 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0627\u0644\u0622\u0646. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
|
|
6339
6409
|
prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
|
|
6340
6410
|
nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
|
|
6341
6411
|
conceptIllustration: "\u0631\u0633\u0645 \u062A\u0648\u0636\u064A\u062D\u064A \u0644\u0644\u0645\u0641\u0647\u0648\u0645",
|
|
@@ -6383,7 +6453,7 @@ var TA = {
|
|
|
6383
6453
|
showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
|
|
6384
6454
|
sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6385
6455
|
nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
|
|
6386
|
-
placeholder: "\
|
|
6456
|
+
placeholder: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
|
|
6387
6457
|
placeholderProduct: "\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 {product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
|
|
6388
6458
|
send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
6389
6459
|
stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
|
|
@@ -6421,6 +6491,20 @@ var TA = {
|
|
|
6421
6491
|
feedbackDismiss: "\u0BAE\u0BC2\u0B9F\u0BC1",
|
|
6422
6492
|
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.",
|
|
6423
6493
|
feedbackNotSent: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
|
|
6494
|
+
escalateOpen: "\u0B92\u0BB0\u0BC1\u0BB5\u0BB0\u0BBF\u0B9F\u0BAE\u0BCD \u0BAA\u0BC7\u0B9A\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6495
|
+
escalateTitle: "\u0B87\u0BA8\u0BCD\u0BA4 \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BC8 \u0B92\u0BB0\u0BC1\u0BB5\u0BB0\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6496
|
+
escalateBody: "\u0BAE\u0BC1\u0BB4\u0BC1 \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0BA8\u0BBE\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BBF\u0BB5\u0BBF\u0B9F\u0BC1\u0BB5\u0BCB\u0BAE\u0BCD; \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0BA4\u0B9F\u0BCD\u0B9F\u0B9A\u0BCD\u0B9A\u0BC1 \u0B9A\u0BC6\u0BAF\u0BCD\u0BAF \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BBF\u0BAF\u0BA4\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
|
|
6497
|
+
escalateEmailLabel: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF",
|
|
6498
|
+
escalateEmailPlaceholder: "you@example.com",
|
|
6499
|
+
escalateNoteLabel: "\u0BB5\u0BC7\u0BB1\u0BC1 \u0B8F\u0BA4\u0BC7\u0BA9\u0BC1\u0BAE\u0BCD \u0B9A\u0BCA\u0BB2\u0BCD\u0BB2 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAE\u0BCD\u0BAA\u0BC1\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BBE? (\u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD)",
|
|
6500
|
+
escalateSubmit: "\u0B92\u0BB0\u0BC1\u0BB5\u0BB0\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
6501
|
+
escalateSending: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
|
|
6502
|
+
escalateCancel: "\u0BB0\u0BA4\u0BCD\u0BA4\u0BC1 \u0B9A\u0BC6\u0BAF\u0BCD",
|
|
6503
|
+
escalateInvalidEmail: "\u0B87\u0BA4\u0BC1 \u0BA8\u0BBE\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BB3\u0BBF\u0B95\u0BCD\u0B95\u0B95\u0BCD\u0B95\u0BC2\u0B9F\u0BBF\u0BAF \u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF \u0BAA\u0BCB\u0BB2\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0B9A\u0BB0\u0BBF\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
|
|
6504
|
+
escalateSent: "\u0B87\u0BA8\u0BCD\u0BA4 \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD \u0B87\u0BAA\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1 \u0B92\u0BB0\u0BC1\u0BB5\u0BB0\u0BBF\u0B9F\u0BAE\u0BCD \u0B89\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1. {email} \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\u0B95\u0BCD\u0B95\u0BC1\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BB3\u0BBF\u0BAA\u0BCD\u0BAA\u0BCB\u0BAE\u0BCD.",
|
|
6505
|
+
escalateRateLimited: "\u0B95\u0BC1\u0BB1\u0BC1\u0B95\u0BBF\u0BAF \u0BA8\u0BC7\u0BB0\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BCD \u0B85\u0BA4\u0BBF\u0B95 \u0B95\u0BCB\u0BB0\u0BBF\u0B95\u0BCD\u0B95\u0BC8\u0B95\u0BB3\u0BCD. \u0B9A\u0BBF\u0BB2 \u0BA8\u0BBF\u0BAE\u0BBF\u0B9F\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BB4\u0BBF\u0BA4\u0BCD\u0BA4\u0BC1 \u0BAE\u0BC1\u0BAF\u0BB1\u0BCD\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
|
|
6506
|
+
escalateCaptcha: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAE\u0BA9\u0BBF\u0BA4\u0BB0\u0BCD \u0B8E\u0BA9\u0BCD\u0BAA\u0BA4\u0BC8 \u0B89\u0BB1\u0BC1\u0BA4\u0BBF\u0B9A\u0BC6\u0BAF\u0BCD\u0BAF \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0BAF\u0BB1\u0BCD\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
|
|
6507
|
+
escalateFailed: "\u0B87\u0BAA\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1 \u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0BAF\u0BB1\u0BCD\u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
|
|
6424
6508
|
prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
6425
6509
|
nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
|
|
6426
6510
|
conceptIllustration: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BB5\u0BBF\u0BB3\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BAE\u0BCD",
|
|
@@ -6497,6 +6581,1812 @@ function fill(template, values) {
|
|
|
6497
6581
|
return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
|
|
6498
6582
|
}
|
|
6499
6583
|
|
|
6584
|
+
// src/components/answers-i18n.ts
|
|
6585
|
+
var EN2 = {
|
|
6586
|
+
breadcrumbHome: "Home",
|
|
6587
|
+
answers: "Answers",
|
|
6588
|
+
indexHeading: "{product} answers",
|
|
6589
|
+
indexLead: "Questions about {product}, each answered by our own assistant from our published documentation \u2014 with links to the pages the answer came from.",
|
|
6590
|
+
seoIndexTitle: "Answers",
|
|
6591
|
+
seoIndexDescription: "Questions about {product}, answered from our published documentation, each with links to the pages the answer came from.",
|
|
6592
|
+
searchLabel: "Search questions",
|
|
6593
|
+
searchPlaceholder: "Search questions",
|
|
6594
|
+
filterByTopic: "Filter by topic",
|
|
6595
|
+
allTopics: "All",
|
|
6596
|
+
showingCount: "Showing {shown} of {total} questions",
|
|
6597
|
+
noMatchesTitle: "No questions match your filters",
|
|
6598
|
+
noMatchesBody: "Try a different search, or show every topic.",
|
|
6599
|
+
clearFilters: "Clear filters",
|
|
6600
|
+
noneYetTitle: "No answers published yet",
|
|
6601
|
+
noneYetBody: "{product} answers will appear here as they are published.",
|
|
6602
|
+
questionCountOne: "1 question",
|
|
6603
|
+
questionCountMany: "{count} questions",
|
|
6604
|
+
sourceCountOne: "1 source",
|
|
6605
|
+
sourceCountMany: "{count} sources",
|
|
6606
|
+
answerHeading: "Answer",
|
|
6607
|
+
sourcesHeading: "Sources",
|
|
6608
|
+
sourcesLead: "The pages this answer was drawn from.",
|
|
6609
|
+
aboutTitle: "About this answer",
|
|
6610
|
+
aboutBody: "Produced by our own assistant on {date} from our published documentation. The pages it drew on are linked under the answer. It is generated text, not a statement from a person \u2014 where it and a linked page disagree, the page is right.",
|
|
6611
|
+
answeredOn: "Answered {date}",
|
|
6612
|
+
topicsHeading: "Topics",
|
|
6613
|
+
relatedHeading: "Related questions",
|
|
6614
|
+
moreInTopic: "More in {topic}",
|
|
6615
|
+
previousQuestion: "Previous question",
|
|
6616
|
+
nextQuestion: "Next question",
|
|
6617
|
+
allAnswers: "All {product} answers",
|
|
6618
|
+
askYourOwn: "Ask your own question"
|
|
6619
|
+
};
|
|
6620
|
+
var ZH2 = {
|
|
6621
|
+
breadcrumbHome: "\u9996\u9875",
|
|
6622
|
+
answers: "\u95EE\u7B54",
|
|
6623
|
+
indexHeading: "{product} \u95EE\u7B54",
|
|
6624
|
+
indexLead: "\u5173\u4E8E {product} \u7684\u95EE\u9898\uFF0C\u6BCF\u4E2A\u56DE\u7B54\u90FD\u7531\u6211\u4EEC\u81EA\u5DF1\u7684\u52A9\u624B\u4F9D\u636E\u5DF2\u516C\u5F00\u7684\u6587\u6863\u751F\u6210\uFF0C\u5E76\u9644\u4E0A\u56DE\u7B54\u6240\u4F9D\u636E\u9875\u9762\u7684\u94FE\u63A5\u3002",
|
|
6625
|
+
seoIndexTitle: "\u95EE\u7B54",
|
|
6626
|
+
seoIndexDescription: "\u5173\u4E8E {product} \u7684\u95EE\u9898\uFF0C\u4F9D\u636E\u6211\u4EEC\u5DF2\u516C\u5F00\u7684\u6587\u6863\u4F5C\u7B54\uFF0C\u6BCF\u4E2A\u56DE\u7B54\u90FD\u9644\u6709\u6765\u6E90\u9875\u9762\u7684\u94FE\u63A5\u3002",
|
|
6627
|
+
searchLabel: "\u641C\u7D22\u95EE\u9898",
|
|
6628
|
+
searchPlaceholder: "\u641C\u7D22\u95EE\u9898",
|
|
6629
|
+
filterByTopic: "\u6309\u4E3B\u9898\u7B5B\u9009",
|
|
6630
|
+
allTopics: "\u5168\u90E8",
|
|
6631
|
+
showingCount: "\u663E\u793A {total} \u4E2A\u95EE\u9898\u4E2D\u7684 {shown} \u4E2A",
|
|
6632
|
+
noMatchesTitle: "\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u95EE\u9898",
|
|
6633
|
+
noMatchesBody: "\u6362\u4E2A\u641C\u7D22\u8BCD\uFF0C\u6216\u663E\u793A\u5168\u90E8\u4E3B\u9898\u3002",
|
|
6634
|
+
clearFilters: "\u6E05\u9664\u7B5B\u9009",
|
|
6635
|
+
noneYetTitle: "\u5C1A\u672A\u53D1\u5E03\u95EE\u7B54",
|
|
6636
|
+
noneYetBody: "{product} \u7684\u95EE\u7B54\u53D1\u5E03\u540E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002",
|
|
6637
|
+
questionCountOne: "1 \u4E2A\u95EE\u9898",
|
|
6638
|
+
questionCountMany: "{count} \u4E2A\u95EE\u9898",
|
|
6639
|
+
sourceCountOne: "1 \u4E2A\u6765\u6E90",
|
|
6640
|
+
sourceCountMany: "{count} \u4E2A\u6765\u6E90",
|
|
6641
|
+
answerHeading: "\u56DE\u7B54",
|
|
6642
|
+
sourcesHeading: "\u6765\u6E90",
|
|
6643
|
+
sourcesLead: "\u672C\u56DE\u7B54\u6240\u4F9D\u636E\u7684\u9875\u9762\u3002",
|
|
6644
|
+
aboutTitle: "\u5173\u4E8E\u8FD9\u4E2A\u56DE\u7B54",
|
|
6645
|
+
aboutBody: "\u672C\u56DE\u7B54\u7531\u6211\u4EEC\u81EA\u5DF1\u7684\u52A9\u624B\u4E8E {date} \u4F9D\u636E\u5DF2\u516C\u5F00\u7684\u6587\u6863\u751F\u6210\uFF0C\u6240\u4F9D\u636E\u7684\u9875\u9762\u5217\u5728\u56DE\u7B54\u4E0B\u65B9\u3002\u8FD9\u662F\u81EA\u52A8\u751F\u6210\u7684\u6587\u672C\uFF0C\u5E76\u975E\u67D0\u4F4D\u540C\u4E8B\u7684\u8BF4\u6CD5\u2014\u2014\u5982\u679C\u5B83\u4E0E\u6240\u94FE\u63A5\u7684\u9875\u9762\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u4EE5\u9875\u9762\u4E3A\u51C6\u3002",
|
|
6646
|
+
answeredOn: "\u56DE\u7B54\u4E8E {date}",
|
|
6647
|
+
topicsHeading: "\u4E3B\u9898",
|
|
6648
|
+
relatedHeading: "\u76F8\u5173\u95EE\u9898",
|
|
6649
|
+
moreInTopic: "\u66F4\u591A\u300C{topic}\u300D\u95EE\u9898",
|
|
6650
|
+
previousQuestion: "\u4E0A\u4E00\u4E2A\u95EE\u9898",
|
|
6651
|
+
nextQuestion: "\u4E0B\u4E00\u4E2A\u95EE\u9898",
|
|
6652
|
+
allAnswers: "\u5168\u90E8 {product} \u95EE\u7B54",
|
|
6653
|
+
askYourOwn: "\u63D0\u51FA\u4F60\u7684\u95EE\u9898"
|
|
6654
|
+
};
|
|
6655
|
+
var HI2 = {
|
|
6656
|
+
breadcrumbHome: "\u0939\u094B\u092E",
|
|
6657
|
+
answers: "\u0909\u0924\u094D\u0924\u0930",
|
|
6658
|
+
indexHeading: "{product} \u0915\u0947 \u0909\u0924\u094D\u0924\u0930",
|
|
6659
|
+
indexLead: "{product} \u0938\u0947 \u091C\u0941\u0921\u093C\u0947 \u0938\u0935\u093E\u0932, \u091C\u093F\u0928\u0915\u093E \u0909\u0924\u094D\u0924\u0930 \u0939\u092E\u093E\u0930\u093E \u0905\u092A\u0928\u093E \u0938\u0939\u093E\u092F\u0915 \u0939\u092E\u093E\u0930\u0947 \u092A\u094D\u0930\u0915\u093E\u0936\u093F\u0924 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0926\u0947\u0924\u093E \u0939\u0948 \u2014 \u0914\u0930 \u091C\u093F\u0928 \u092A\u0928\u094D\u0928\u094B\u0902 \u0938\u0947 \u0909\u0924\u094D\u0924\u0930 \u0906\u092F\u093E, \u0909\u0928\u0915\u0947 \u0932\u093F\u0902\u0915 \u0938\u093E\u0925 \u092E\u0947\u0902 \u0939\u0948\u0902\u0964",
|
|
6660
|
+
seoIndexTitle: "\u0909\u0924\u094D\u0924\u0930",
|
|
6661
|
+
seoIndexDescription: "{product} \u0938\u0947 \u091C\u0941\u0921\u093C\u0947 \u0938\u0935\u093E\u0932\u094B\u0902 \u0915\u0947 \u0909\u0924\u094D\u0924\u0930, \u0939\u092E\u093E\u0930\u0947 \u092A\u094D\u0930\u0915\u093E\u0936\u093F\u0924 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u2014 \u0939\u0930 \u0909\u0924\u094D\u0924\u0930 \u0915\u0947 \u0938\u093E\u0925 \u0938\u094D\u0930\u094B\u0924 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u0947 \u0932\u093F\u0902\u0915\u0964",
|
|
6662
|
+
searchLabel: "\u0938\u0935\u093E\u0932 \u0916\u094B\u091C\u0947\u0902",
|
|
6663
|
+
searchPlaceholder: "\u0938\u0935\u093E\u0932 \u0916\u094B\u091C\u0947\u0902",
|
|
6664
|
+
filterByTopic: "\u0935\u093F\u0937\u092F \u0938\u0947 \u091B\u093E\u0901\u091F\u0947\u0902",
|
|
6665
|
+
allTopics: "\u0938\u092D\u0940",
|
|
6666
|
+
showingCount: "{total} \u092E\u0947\u0902 \u0938\u0947 {shown} \u0938\u0935\u093E\u0932 \u0926\u093F\u0916 \u0930\u0939\u0947 \u0939\u0948\u0902",
|
|
6667
|
+
noMatchesTitle: "\u0906\u092A\u0915\u0940 \u091B\u0901\u091F\u093E\u0908 \u0938\u0947 \u0915\u094B\u0908 \u0938\u0935\u093E\u0932 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0924\u093E",
|
|
6668
|
+
noMatchesBody: "\u0915\u0941\u091B \u0914\u0930 \u0916\u094B\u091C\u0947\u0902, \u092F\u093E \u0938\u092D\u0940 \u0935\u093F\u0937\u092F \u0926\u093F\u0916\u093E\u090F\u0901\u0964",
|
|
6669
|
+
clearFilters: "\u091B\u0901\u091F\u093E\u0908 \u0939\u091F\u093E\u090F\u0901",
|
|
6670
|
+
noneYetTitle: "\u0905\u092D\u0940 \u0915\u094B\u0908 \u0909\u0924\u094D\u0924\u0930 \u092A\u094D\u0930\u0915\u093E\u0936\u093F\u0924 \u0928\u0939\u0940\u0902 \u0939\u0941\u0906",
|
|
6671
|
+
noneYetBody: "{product} \u0915\u0947 \u0909\u0924\u094D\u0924\u0930 \u092A\u094D\u0930\u0915\u093E\u0936\u093F\u0924 \u0939\u094B\u0924\u0947 \u0939\u0940 \u092F\u0939\u093E\u0901 \u0926\u093F\u0916\u0947\u0902\u0917\u0947\u0964",
|
|
6672
|
+
questionCountOne: "1 \u0938\u0935\u093E\u0932",
|
|
6673
|
+
questionCountMany: "{count} \u0938\u0935\u093E\u0932",
|
|
6674
|
+
sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
|
|
6675
|
+
sourceCountMany: "{count} \u0938\u094D\u0930\u094B\u0924",
|
|
6676
|
+
answerHeading: "\u0909\u0924\u094D\u0924\u0930",
|
|
6677
|
+
sourcesHeading: "\u0938\u094D\u0930\u094B\u0924",
|
|
6678
|
+
sourcesLead: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u091C\u093F\u0928 \u092A\u0928\u094D\u0928\u094B\u0902 \u0938\u0947 \u0932\u093F\u092F\u093E \u0917\u092F\u093E \u0939\u0948\u0964",
|
|
6679
|
+
aboutTitle: "\u0907\u0938 \u0909\u0924\u094D\u0924\u0930 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902",
|
|
6680
|
+
aboutBody: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 {date} \u0915\u094B \u0939\u092E\u093E\u0930\u0947 \u0905\u092A\u0928\u0947 \u0938\u0939\u093E\u092F\u0915 \u0928\u0947 \u0939\u092E\u093E\u0930\u0947 \u092A\u094D\u0930\u0915\u093E\u0936\u093F\u0924 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u0938\u0947 \u0924\u0948\u092F\u093E\u0930 \u0915\u093F\u092F\u093E \u0925\u093E\u0964 \u091C\u093F\u0928 \u092A\u0928\u094D\u0928\u094B\u0902 \u0915\u093E \u0909\u092A\u092F\u094B\u0917 \u0939\u0941\u0906, \u0935\u0947 \u0909\u0924\u094D\u0924\u0930 \u0915\u0947 \u0928\u0940\u091A\u0947 \u0926\u093F\u090F \u0917\u090F \u0939\u0948\u0902\u0964 \u092F\u0939 \u0905\u092A\u0928\u0947-\u0906\u092A \u0924\u0948\u092F\u093E\u0930 \u0915\u093F\u092F\u093E \u0917\u092F\u093E \u092A\u093E\u0920 \u0939\u0948, \u0915\u093F\u0938\u0940 \u0935\u094D\u092F\u0915\u094D\u0924\u093F \u0915\u093E \u0915\u0925\u0928 \u0928\u0939\u0940\u0902 \u2014 \u0905\u0917\u0930 \u0907\u0938\u092E\u0947\u0902 \u0914\u0930 \u0932\u093F\u0902\u0915 \u0915\u093F\u090F \u0917\u090F \u092A\u0928\u094D\u0928\u0947 \u092E\u0947\u0902 \u092B\u093C\u0930\u094D\u0915\u093C \u0939\u094B, \u0924\u094B \u092A\u0928\u094D\u0928\u093E \u0938\u0939\u0940 \u0939\u0948\u0964",
|
|
6681
|
+
answeredOn: "{date} \u0915\u094B \u0909\u0924\u094D\u0924\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E",
|
|
6682
|
+
topicsHeading: "\u0935\u093F\u0937\u092F",
|
|
6683
|
+
relatedHeading: "\u0938\u0902\u092C\u0902\u0927\u093F\u0924 \u0938\u0935\u093E\u0932",
|
|
6684
|
+
moreInTopic: "{topic} \u092E\u0947\u0902 \u0914\u0930",
|
|
6685
|
+
previousQuestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0935\u093E\u0932",
|
|
6686
|
+
nextQuestion: "\u0905\u0917\u0932\u093E \u0938\u0935\u093E\u0932",
|
|
6687
|
+
allAnswers: "{product} \u0915\u0947 \u0938\u092D\u0940 \u0909\u0924\u094D\u0924\u0930",
|
|
6688
|
+
askYourOwn: "\u0905\u092A\u0928\u093E \u0938\u0935\u093E\u0932 \u092A\u0942\u091B\u0947\u0902"
|
|
6689
|
+
};
|
|
6690
|
+
var ES2 = {
|
|
6691
|
+
breadcrumbHome: "Inicio",
|
|
6692
|
+
answers: "Respuestas",
|
|
6693
|
+
indexHeading: "Respuestas sobre {product}",
|
|
6694
|
+
indexLead: "Preguntas sobre {product}, respondidas por nuestro propio asistente a partir de nuestra documentaci\xF3n publicada, con enlaces a las p\xE1ginas de las que sali\xF3 cada respuesta.",
|
|
6695
|
+
seoIndexTitle: "Respuestas",
|
|
6696
|
+
seoIndexDescription: "Preguntas sobre {product} respondidas a partir de nuestra documentaci\xF3n publicada, cada una con enlaces a las p\xE1ginas de origen.",
|
|
6697
|
+
searchLabel: "Buscar preguntas",
|
|
6698
|
+
searchPlaceholder: "Buscar preguntas",
|
|
6699
|
+
filterByTopic: "Filtrar por tema",
|
|
6700
|
+
allTopics: "Todas",
|
|
6701
|
+
showingCount: "Mostrando {shown} de {total} preguntas",
|
|
6702
|
+
noMatchesTitle: "Ninguna pregunta coincide con los filtros",
|
|
6703
|
+
noMatchesBody: "Prueba otra b\xFAsqueda o muestra todos los temas.",
|
|
6704
|
+
clearFilters: "Quitar filtros",
|
|
6705
|
+
noneYetTitle: "Todav\xEDa no hay respuestas publicadas",
|
|
6706
|
+
noneYetBody: "Las respuestas sobre {product} aparecer\xE1n aqu\xED a medida que se publiquen.",
|
|
6707
|
+
questionCountOne: "1 pregunta",
|
|
6708
|
+
questionCountMany: "{count} preguntas",
|
|
6709
|
+
sourceCountOne: "1 fuente",
|
|
6710
|
+
sourceCountMany: "{count} fuentes",
|
|
6711
|
+
answerHeading: "Respuesta",
|
|
6712
|
+
sourcesHeading: "Fuentes",
|
|
6713
|
+
sourcesLead: "Las p\xE1ginas de las que sali\xF3 esta respuesta.",
|
|
6714
|
+
aboutTitle: "Sobre esta respuesta",
|
|
6715
|
+
aboutBody: "La prepar\xF3 nuestro propio asistente el {date} a partir de nuestra documentaci\xF3n publicada. Las p\xE1ginas que utiliz\xF3 est\xE1n enlazadas debajo de la respuesta. Es texto generado, no la palabra de una persona: si la respuesta y una p\xE1gina enlazada no coinciden, manda la p\xE1gina.",
|
|
6716
|
+
answeredOn: "Respondida el {date}",
|
|
6717
|
+
topicsHeading: "Temas",
|
|
6718
|
+
relatedHeading: "Preguntas relacionadas",
|
|
6719
|
+
moreInTopic: "M\xE1s de {topic}",
|
|
6720
|
+
previousQuestion: "Pregunta anterior",
|
|
6721
|
+
nextQuestion: "Pregunta siguiente",
|
|
6722
|
+
allAnswers: "Todas las respuestas sobre {product}",
|
|
6723
|
+
askYourOwn: "Haz tu propia pregunta"
|
|
6724
|
+
};
|
|
6725
|
+
var AR2 = {
|
|
6726
|
+
breadcrumbHome: "\u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629",
|
|
6727
|
+
answers: "\u0627\u0644\u0625\u062C\u0627\u0628\u0627\u062A",
|
|
6728
|
+
indexHeading: "\u0625\u062C\u0627\u0628\u0627\u062A {product}",
|
|
6729
|
+
indexLead: "\u0623\u0633\u0626\u0644\u0629 \u062D\u0648\u0644 {product}\u060C \u064A\u062C\u064A\u0628 \u0639\u0646\u0647\u0627 \u0645\u0633\u0627\u0639\u062F\u0646\u0627 \u0627\u0639\u062A\u0645\u0627\u062F\u064B\u0627 \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0629\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 \u0643\u0644 \u0625\u062C\u0627\u0628\u0629.",
|
|
6730
|
+
seoIndexTitle: "\u0627\u0644\u0625\u062C\u0627\u0628\u0627\u062A",
|
|
6731
|
+
seoIndexDescription: "\u0623\u0633\u0626\u0644\u0629 \u062D\u0648\u0644 {product} \u0645\u064F\u062C\u0627\u0628 \u0639\u0646\u0647\u0627 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642\u0646\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0629\u060C \u0645\u0639 \u0631\u0648\u0627\u0628\u0637 \u0625\u0644\u0649 \u0635\u0641\u062D\u0627\u062A \u0627\u0644\u0645\u0635\u062F\u0631 \u0644\u0643\u0644 \u0625\u062C\u0627\u0628\u0629.",
|
|
6732
|
+
searchLabel: "\u0627\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0623\u0633\u0626\u0644\u0629",
|
|
6733
|
+
searchPlaceholder: "\u0627\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0623\u0633\u0626\u0644\u0629",
|
|
6734
|
+
filterByTopic: "\u062A\u0635\u0641\u064A\u0629 \u062D\u0633\u0628 \u0627\u0644\u0645\u0648\u0636\u0648\u0639",
|
|
6735
|
+
allTopics: "\u0627\u0644\u0643\u0644",
|
|
6736
|
+
showingCount: "\u0639\u0631\u0636 {shown} \u0645\u0646 {total} \u0633\u0624\u0627\u0644\u064B\u0627",
|
|
6737
|
+
noMatchesTitle: "\u0644\u0627 \u062A\u0648\u062C\u062F \u0623\u0633\u0626\u0644\u0629 \u062A\u0637\u0627\u0628\u0642 \u0627\u0644\u062A\u0635\u0641\u064A\u0629",
|
|
6738
|
+
noMatchesBody: "\u062C\u0631\u0651\u0628 \u0628\u062D\u062B\u064B\u0627 \u0622\u062E\u0631\u060C \u0623\u0648 \u0627\u0639\u0631\u0636 \u0643\u0644 \u0627\u0644\u0645\u0648\u0627\u0636\u064A\u0639.",
|
|
6739
|
+
clearFilters: "\u0645\u0633\u062D \u0627\u0644\u062A\u0635\u0641\u064A\u0629",
|
|
6740
|
+
noneYetTitle: "\u0644\u0645 \u062A\u064F\u0646\u0634\u0631 \u0625\u062C\u0627\u0628\u0627\u062A \u0628\u0639\u062F",
|
|
6741
|
+
noneYetBody: "\u0633\u062A\u0638\u0647\u0631 \u0625\u062C\u0627\u0628\u0627\u062A {product} \u0647\u0646\u0627 \u0641\u0648\u0631 \u0646\u0634\u0631\u0647\u0627.",
|
|
6742
|
+
questionCountOne: "\u0633\u0624\u0627\u0644 \u0648\u0627\u062D\u062F",
|
|
6743
|
+
questionCountMany: "{count} \u0623\u0633\u0626\u0644\u0629",
|
|
6744
|
+
sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
|
|
6745
|
+
sourceCountMany: "{count} \u0645\u0635\u0627\u062F\u0631",
|
|
6746
|
+
answerHeading: "\u0627\u0644\u0625\u062C\u0627\u0628\u0629",
|
|
6747
|
+
sourcesHeading: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
|
|
6748
|
+
sourcesLead: "\u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u0627\u0633\u062A\u064F\u0645\u062F\u062A \u0645\u0646\u0647\u0627 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629.",
|
|
6749
|
+
aboutTitle: "\u0639\u0646 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
|
|
6750
|
+
aboutBody: "\u0623\u0639\u062F\u0651\u0647\u0627 \u0645\u0633\u0627\u0639\u062F\u0646\u0627 \u0641\u064A {date} \u0627\u0639\u062A\u0645\u0627\u062F\u064B\u0627 \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627 \u0627\u0644\u0645\u0646\u0634\u0648\u0631\u0629\u060C \u0648\u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u0627\u0633\u062A\u0646\u062F \u0625\u0644\u064A\u0647\u0627 \u0645\u0630\u0643\u0648\u0631\u0629 \u0623\u0633\u0641\u0644 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u0647\u0630\u0627 \u0646\u0635 \u0645\u064F\u0648\u0644\u064E\u0651\u062F \u0622\u0644\u064A\u064B\u0627 \u0648\u0644\u064A\u0633 \u0643\u0644\u0627\u0645 \u0634\u062E\u0635 \u2014 \u0648\u0625\u0630\u0627 \u0627\u062E\u062A\u0644\u0641 \u0645\u0639 \u0635\u0641\u062D\u0629 \u0645\u0631\u062A\u0628\u0637\u0629\u060C \u0641\u0627\u0644\u0635\u0641\u062D\u0629 \u0647\u064A \u0627\u0644\u0635\u062D\u064A\u062D\u0629.",
|
|
6751
|
+
answeredOn: "\u0623\u064F\u062C\u064A\u0628 \u0639\u0646\u0647 \u0641\u064A {date}",
|
|
6752
|
+
topicsHeading: "\u0627\u0644\u0645\u0648\u0627\u0636\u064A\u0639",
|
|
6753
|
+
relatedHeading: "\u0623\u0633\u0626\u0644\u0629 \u0630\u0627\u062A \u0635\u0644\u0629",
|
|
6754
|
+
moreInTopic: "\u0627\u0644\u0645\u0632\u064A\u062F \u0641\u064A {topic}",
|
|
6755
|
+
previousQuestion: "\u0627\u0644\u0633\u0624\u0627\u0644 \u0627\u0644\u0633\u0627\u0628\u0642",
|
|
6756
|
+
nextQuestion: "\u0627\u0644\u0633\u0624\u0627\u0644 \u0627\u0644\u062A\u0627\u0644\u064A",
|
|
6757
|
+
allAnswers: "\u0643\u0644 \u0625\u062C\u0627\u0628\u0627\u062A {product}",
|
|
6758
|
+
askYourOwn: "\u0627\u0637\u0631\u062D \u0633\u0624\u0627\u0644\u0643"
|
|
6759
|
+
};
|
|
6760
|
+
var TA2 = {
|
|
6761
|
+
breadcrumbHome: "\u0BAE\u0BC1\u0B95\u0BAA\u0BCD\u0BAA\u0BC1",
|
|
6762
|
+
answers: "\u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6763
|
+
indexHeading: "{product} \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6764
|
+
indexLead: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0BAF \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BCD \u2014 \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BA9\u0BCD\u0BB1\u0BC1\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BBF\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0B85\u0BB3\u0BBF\u0BA4\u0BCD\u0BA4 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD, \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \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.",
|
|
6765
|
+
seoIndexTitle: "\u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6766
|
+
seoIndexDescription: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0BAF \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BBF\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD \u2014 \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BA9\u0BCD\u0BB1\u0BBF\u0BB2\u0BC1\u0BAE\u0BCD \u0BAE\u0BC2\u0BB2\u0BAA\u0BCD \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.",
|
|
6767
|
+
searchLabel: "\u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6768
|
+
searchPlaceholder: "\u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6769
|
+
filterByTopic: "\u0BA4\u0BB2\u0BC8\u0BAA\u0BCD\u0BAA\u0BBF\u0BA9\u0BCD\u0BAA\u0B9F\u0BBF \u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BC1",
|
|
6770
|
+
allTopics: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD",
|
|
6771
|
+
showingCount: "{total} \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BBF\u0BB2\u0BCD {shown} \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1",
|
|
6772
|
+
noMatchesTitle: "\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BC1\u0BAA\u0BCD \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF \u0B87\u0BB2\u0BCD\u0BB2\u0BC8",
|
|
6773
|
+
noMatchesBody: "\u0BB5\u0BC7\u0BB1\u0BC1 \u0B92\u0BA9\u0BCD\u0BB1\u0BC8\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 \u0B8E\u0BB2\u0BCD\u0BB2\u0BBE\u0BA4\u0BCD \u0BA4\u0BB2\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
|
|
6774
|
+
clearFilters: "\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BC8 \u0BA8\u0BC0\u0B95\u0BCD\u0B95\u0BC1",
|
|
6775
|
+
noneYetTitle: "\u0B87\u0BA4\u0BC1\u0BB5\u0BB0\u0BC8 \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BBF\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
|
|
6776
|
+
noneYetBody: "{product} \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BBF\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0BAE\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1 \u0B87\u0B99\u0BCD\u0B95\u0BC7 \u0BA4\u0BCB\u0BA9\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD.",
|
|
6777
|
+
questionCountOne: "1 \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF",
|
|
6778
|
+
questionCountMany: "{count} \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BCD",
|
|
6779
|
+
sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
|
|
6780
|
+
sourceCountMany: "{count} \u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6781
|
+
answerHeading: "\u0BAA\u0BA4\u0BBF\u0BB2\u0BCD",
|
|
6782
|
+
sourcesHeading: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
|
|
6783
|
+
sourcesLead: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B8E\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
|
|
6784
|
+
aboutTitle: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF",
|
|
6785
|
+
aboutBody: "\u0B87\u0BA4\u0BC8 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B89\u0BA4\u0BB5\u0BBF\u0BAF\u0BBE\u0BB3\u0BB0\u0BCD {date} \u0B85\u0BA9\u0BCD\u0BB1\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BBF\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0B89\u0BB0\u0BC1\u0BB5\u0BBE\u0B95\u0BCD\u0B95\u0BBF\u0BAF\u0BA4\u0BC1; \u0BAA\u0BAF\u0BA9\u0BCD\u0BAA\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BBF\u0BAF \u0BAA\u0B95\u0BCD\u0B95\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BC1\u0B95\u0BCD \u0B95\u0BC0\u0BB4\u0BC7 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BC1\u0BB3\u0BCD\u0BB3\u0BA9. \u0B87\u0BA4\u0BC1 \u0BA4\u0BBE\u0BA9\u0BBE\u0B95 \u0B89\u0BB0\u0BC1\u0BB5\u0BBE\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0B89\u0BB0\u0BC8, \u0B92\u0BB0\u0BC1 \u0BA8\u0BAA\u0BB0\u0BBF\u0BA9\u0BCD \u0B95\u0BC2\u0BB1\u0BCD\u0BB1\u0BC1 \u0B85\u0BB2\u0BCD\u0BB2 \u2014 \u0B87\u0BA4\u0BB1\u0BCD\u0B95\u0BC1\u0BAE\u0BCD \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1\u0BAE\u0BCD \u0BB5\u0BC7\u0BB1\u0BC1\u0BAA\u0BBE\u0B9F\u0BC1 \u0B87\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BBE\u0BB2\u0BCD, \u0BAA\u0B95\u0BCD\u0B95\u0BAE\u0BC7 \u0B9A\u0BB0\u0BBF.",
|
|
6786
|
+
answeredOn: "{date} \u0B85\u0BA9\u0BCD\u0BB1\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BB3\u0BBF\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
|
|
6787
|
+
topicsHeading: "\u0BA4\u0BB2\u0BC8\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
|
|
6788
|
+
relatedHeading: "\u0BA4\u0BCA\u0B9F\u0BB0\u0BCD\u0BAA\u0BC1\u0B9F\u0BC8\u0BAF \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0B95\u0BB3\u0BCD",
|
|
6789
|
+
moreInTopic: "{topic} \u0B87\u0BB2\u0BCD \u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD",
|
|
6790
|
+
previousQuestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF",
|
|
6791
|
+
nextQuestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF",
|
|
6792
|
+
allAnswers: "{product} \u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BC1\u0BAE\u0BCD",
|
|
6793
|
+
askYourOwn: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0BAF\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD"
|
|
6794
|
+
};
|
|
6795
|
+
var CHROME = {
|
|
6796
|
+
en: EN2,
|
|
6797
|
+
zh: ZH2,
|
|
6798
|
+
hi: HI2,
|
|
6799
|
+
es: ES2,
|
|
6800
|
+
ar: AR2,
|
|
6801
|
+
ta: TA2
|
|
6802
|
+
};
|
|
6803
|
+
function answerStrings(locale) {
|
|
6804
|
+
const chrome = CHROME[locale] ?? EN2;
|
|
6805
|
+
const explore = exploreStrings(locale);
|
|
6806
|
+
return {
|
|
6807
|
+
...chrome,
|
|
6808
|
+
answerTable: explore.answerTable,
|
|
6809
|
+
conceptIllustration: explore.conceptIllustration,
|
|
6810
|
+
opensInNewTab: explore.opensInNewTab
|
|
6811
|
+
};
|
|
6812
|
+
}
|
|
6813
|
+
var DATE_TAGS = {
|
|
6814
|
+
en: "en-GB",
|
|
6815
|
+
zh: "zh-CN",
|
|
6816
|
+
hi: "hi-IN",
|
|
6817
|
+
es: "es-ES",
|
|
6818
|
+
ar: "ar",
|
|
6819
|
+
ta: "ta-IN"
|
|
6820
|
+
};
|
|
6821
|
+
function formatAnswerDate(value, locale) {
|
|
6822
|
+
const at = new Date(value);
|
|
6823
|
+
if (Number.isNaN(at.getTime())) return "";
|
|
6824
|
+
try {
|
|
6825
|
+
return new Intl.DateTimeFormat(DATE_TAGS[locale] ?? "en-GB", {
|
|
6826
|
+
year: "numeric",
|
|
6827
|
+
month: "long",
|
|
6828
|
+
day: "numeric",
|
|
6829
|
+
timeZone: "UTC",
|
|
6830
|
+
numberingSystem: "latn"
|
|
6831
|
+
}).format(at);
|
|
6832
|
+
} catch {
|
|
6833
|
+
return value.slice(0, 10);
|
|
6834
|
+
}
|
|
6835
|
+
}
|
|
6836
|
+
|
|
6837
|
+
// src/components/answers-types.ts
|
|
6838
|
+
var PUBLISHED_ANSWER_FIELDS = {
|
|
6839
|
+
slug: true,
|
|
6840
|
+
order: true,
|
|
6841
|
+
question: true,
|
|
6842
|
+
answer: true,
|
|
6843
|
+
topic: true,
|
|
6844
|
+
summary: true,
|
|
6845
|
+
metaDescription: true,
|
|
6846
|
+
keywords: true,
|
|
6847
|
+
sources: true,
|
|
6848
|
+
related: true,
|
|
6849
|
+
answeredAt: true
|
|
6850
|
+
};
|
|
6851
|
+
var ANSWERS_PATH = "/answers";
|
|
6852
|
+
var ANSWER_PATH_PREFIX = "/answer";
|
|
6853
|
+
function answerPath(slug) {
|
|
6854
|
+
return `${ANSWER_PATH_PREFIX}/${encodeURIComponent(slug)}`;
|
|
6855
|
+
}
|
|
6856
|
+
function getAnswerBySlug(answers, slug) {
|
|
6857
|
+
if (!slug) return void 0;
|
|
6858
|
+
const wanted = slug.trim().toLowerCase();
|
|
6859
|
+
if (!wanted) return void 0;
|
|
6860
|
+
return answers.find((answer) => answer.slug === wanted);
|
|
6861
|
+
}
|
|
6862
|
+
function isPublishedSourceUrl(url) {
|
|
6863
|
+
let parsed;
|
|
6864
|
+
try {
|
|
6865
|
+
parsed = new URL(url);
|
|
6866
|
+
} catch {
|
|
6867
|
+
return false;
|
|
6868
|
+
}
|
|
6869
|
+
return parsed.protocol === "https:" && parsed.hostname !== "" && !parsed.username && !parsed.password;
|
|
6870
|
+
}
|
|
6871
|
+
function answerSourceHost(url) {
|
|
6872
|
+
try {
|
|
6873
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
6874
|
+
} catch {
|
|
6875
|
+
return "";
|
|
6876
|
+
}
|
|
6877
|
+
}
|
|
6878
|
+
var EXPLORE_ANSWER_CSS = `
|
|
6879
|
+
/* Nothing inside an answer may widen the page. Model output carries long URLs, code and
|
|
6880
|
+
tables \u2014 each of those overflows a phone by default, and one overflowing child makes the
|
|
6881
|
+
WHOLE document horizontally scrollable, not just the bubble. */
|
|
6882
|
+
.boff-explore-body,
|
|
6883
|
+
.boff-explore-body p,
|
|
6884
|
+
.boff-explore-body li,
|
|
6885
|
+
.boff-explore-body a,
|
|
6886
|
+
.boff-explore-body h1,
|
|
6887
|
+
.boff-explore-body h2,
|
|
6888
|
+
.boff-explore-body h3,
|
|
6889
|
+
/* h4-h6 as well: a published answer page pushes the model's own headings down a level or
|
|
6890
|
+
two so they nest under the page's, and a long unbroken word is no narrower for it. */
|
|
6891
|
+
.boff-explore-body h4,
|
|
6892
|
+
.boff-explore-body h5,
|
|
6893
|
+
.boff-explore-body h6 {
|
|
6894
|
+
overflow-wrap: anywhere;
|
|
6895
|
+
word-break: break-word;
|
|
6896
|
+
}
|
|
6897
|
+
.boff-explore-body pre {
|
|
6898
|
+
overflow-x: auto;
|
|
6899
|
+
max-width: 100%;
|
|
6900
|
+
}
|
|
6901
|
+
.boff-explore-body table {
|
|
6902
|
+
display: block;
|
|
6903
|
+
overflow-x: auto;
|
|
6904
|
+
max-width: 100%;
|
|
6905
|
+
}
|
|
6906
|
+
.boff-explore-body img {
|
|
6907
|
+
max-width: 100%;
|
|
6908
|
+
height: auto;
|
|
6909
|
+
}
|
|
6910
|
+
|
|
6911
|
+
/* ---- Comparison and pricing tables ----------------------------------------------------
|
|
6912
|
+
The harness emits a comparison, and a set of plans, as a GFM table whose FIRST column is
|
|
6913
|
+
the subject \u2014 the product, or the plan (CONTRACT.md \xA77). Two things have to be true of it:
|
|
6914
|
+
the page must not scroll sideways because of it, and it has to be readable on a 320px
|
|
6915
|
+
phone, which a four-column grid of 1px borders is not.
|
|
6916
|
+
|
|
6917
|
+
Wide: a contained scroller. \`max-width: 100%\` keeps the box inside the bubble and
|
|
6918
|
+
\`overflow-x: auto\` keeps the columns inside the box, so the widest possible table still
|
|
6919
|
+
cannot widen the document. \`overscroll-behavior-x: contain\` stops a swipe that runs out
|
|
6920
|
+
of table from chaining to the page \u2014 the same rule the transcript needed. */
|
|
6921
|
+
.boff-explore-body .boff-explore-table {
|
|
6922
|
+
max-width: 100%;
|
|
6923
|
+
overflow-x: auto;
|
|
6924
|
+
overscroll-behavior-x: contain;
|
|
6925
|
+
margin: 0.75rem 0;
|
|
6926
|
+
border: 1px solid hsl(var(--border));
|
|
6927
|
+
border-radius: 0.75rem;
|
|
6928
|
+
background-color: hsl(var(--card));
|
|
6929
|
+
}
|
|
6930
|
+
.boff-explore-body .boff-explore-table:focus-visible {
|
|
6931
|
+
outline: 2px solid hsl(var(--ring));
|
|
6932
|
+
outline-offset: 2px;
|
|
6933
|
+
}
|
|
6934
|
+
.boff-explore-body .boff-explore-table table {
|
|
6935
|
+
/* Beats the blanket \`display: block\` above, which is the unwrapped fallback. */
|
|
6936
|
+
display: table;
|
|
6937
|
+
width: 100%;
|
|
6938
|
+
max-width: none;
|
|
6939
|
+
margin: 0;
|
|
6940
|
+
border-collapse: collapse;
|
|
6941
|
+
font-size: 0.8125rem;
|
|
6942
|
+
}
|
|
6943
|
+
.boff-explore-body .boff-explore-table th,
|
|
6944
|
+
.boff-explore-body .boff-explore-table td {
|
|
6945
|
+
border: 0;
|
|
6946
|
+
border-top: 1px solid hsl(var(--border));
|
|
6947
|
+
padding: 0.5rem 0.75rem;
|
|
6948
|
+
/* \`start\`, never \`left\`: the page root carries dir="rtl" in Arabic, and a left-aligned
|
|
6949
|
+
table there reads against the grain of every other line on the page. */
|
|
6950
|
+
text-align: start;
|
|
6951
|
+
vertical-align: top;
|
|
6952
|
+
overflow-wrap: anywhere;
|
|
6953
|
+
/* Prices in a column line up under each other instead of drifting by digit width. */
|
|
6954
|
+
font-variant-numeric: tabular-nums;
|
|
6955
|
+
min-width: 6rem;
|
|
6956
|
+
}
|
|
6957
|
+
.boff-explore-body .boff-explore-table thead th {
|
|
6958
|
+
border-top: 0;
|
|
6959
|
+
background-color: hsl(var(--muted));
|
|
6960
|
+
color: hsl(var(--foreground));
|
|
6961
|
+
font-weight: 600;
|
|
6962
|
+
white-space: nowrap;
|
|
6963
|
+
}
|
|
6964
|
+
/* The first column is what the row is ABOUT \u2014 the product, or the plan name. Reading it as
|
|
6965
|
+
the row's heading is what makes a price list scannable rather than a grid of strings. */
|
|
6966
|
+
.boff-explore-body .boff-explore-table tbody td:first-child {
|
|
6967
|
+
font-weight: 600;
|
|
6968
|
+
color: hsl(var(--card-foreground));
|
|
6969
|
+
}
|
|
6970
|
+
|
|
6971
|
+
/* Narrow: one card per row. Each cell prints its own column heading, so a value is never
|
|
6972
|
+
stranded without the question it answers, and the subject cell becomes the card's title.
|
|
6973
|
+
A media query rather than a measured width \u2014 these pages are serialised post-hydration,
|
|
6974
|
+
so anything measured here would ship to every phone as static HTML. */
|
|
6975
|
+
@media (max-width: 30rem) {
|
|
6976
|
+
.boff-explore-body .boff-explore-table {
|
|
6977
|
+
overflow-x: visible;
|
|
6978
|
+
}
|
|
6979
|
+
.boff-explore-body .boff-explore-table table,
|
|
6980
|
+
.boff-explore-body .boff-explore-table tbody,
|
|
6981
|
+
.boff-explore-body .boff-explore-table tr,
|
|
6982
|
+
.boff-explore-body .boff-explore-table td {
|
|
6983
|
+
display: block;
|
|
6984
|
+
width: 100%;
|
|
6985
|
+
min-width: 0;
|
|
6986
|
+
}
|
|
6987
|
+
.boff-explore-body .boff-explore-table thead {
|
|
6988
|
+
display: none;
|
|
6989
|
+
}
|
|
6990
|
+
.boff-explore-body .boff-explore-table tr {
|
|
6991
|
+
border-top: 1px solid hsl(var(--border));
|
|
6992
|
+
padding: 0.5rem 0;
|
|
6993
|
+
}
|
|
6994
|
+
.boff-explore-body .boff-explore-table tr:first-child {
|
|
6995
|
+
border-top: 0;
|
|
6996
|
+
}
|
|
6997
|
+
.boff-explore-body .boff-explore-table td {
|
|
6998
|
+
border: 0;
|
|
6999
|
+
padding: 0.125rem 0.75rem;
|
|
7000
|
+
}
|
|
7001
|
+
.boff-explore-body .boff-explore-table td[data-label]::before {
|
|
7002
|
+
content: attr(data-label);
|
|
7003
|
+
display: block;
|
|
7004
|
+
font-size: 0.6875rem;
|
|
7005
|
+
font-weight: 600;
|
|
7006
|
+
text-transform: uppercase;
|
|
7007
|
+
letter-spacing: 0.04em;
|
|
7008
|
+
color: hsl(var(--muted-foreground));
|
|
7009
|
+
}
|
|
7010
|
+
.boff-explore-body .boff-explore-table tbody td:first-child {
|
|
7011
|
+
font-size: 0.9375rem;
|
|
7012
|
+
padding-bottom: 0.25rem;
|
|
7013
|
+
}
|
|
7014
|
+
.boff-explore-body .boff-explore-table tbody td:first-child::before {
|
|
7015
|
+
/* The plan's own name is the heading here; repeating "Plan" over it says nothing. */
|
|
7016
|
+
display: none;
|
|
7017
|
+
}
|
|
7018
|
+
}
|
|
7019
|
+
`;
|
|
7020
|
+
function ExploreAnswerStyles() {
|
|
7021
|
+
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_ANSWER_CSS } });
|
|
7022
|
+
}
|
|
7023
|
+
function inlineImageOrigins(products) {
|
|
7024
|
+
const origins = /* @__PURE__ */ new Set();
|
|
7025
|
+
for (const product of products) {
|
|
7026
|
+
let url;
|
|
7027
|
+
try {
|
|
7028
|
+
url = new URL(product.website);
|
|
7029
|
+
} catch {
|
|
7030
|
+
continue;
|
|
7031
|
+
}
|
|
7032
|
+
if (url.protocol !== "https:") continue;
|
|
7033
|
+
const apex = url.hostname.replace(/^www\./, "");
|
|
7034
|
+
const port = url.port ? `:${url.port}` : "";
|
|
7035
|
+
origins.add(`https://${apex}${port}`);
|
|
7036
|
+
origins.add(`https://www.${apex}${port}`);
|
|
7037
|
+
}
|
|
7038
|
+
return origins;
|
|
7039
|
+
}
|
|
7040
|
+
function isInlineImageAllowed(src, origins) {
|
|
7041
|
+
if (typeof src !== "string" || src === "") return false;
|
|
7042
|
+
let url;
|
|
7043
|
+
try {
|
|
7044
|
+
url = new URL(src);
|
|
7045
|
+
} catch {
|
|
7046
|
+
return false;
|
|
7047
|
+
}
|
|
7048
|
+
if (url.protocol !== "https:" || url.username || url.password) return false;
|
|
7049
|
+
return origins.has(url.origin);
|
|
7050
|
+
}
|
|
7051
|
+
var CODE_FENCE = /^\s*(?:```|~~~)/;
|
|
7052
|
+
var TABLE_ROW_LINE = /^\s{0,3}\|/;
|
|
7053
|
+
var TABLE_DELIMITER_ROW = /^\s{0,3}\|[\s:|-]*-[\s:|-]*$/;
|
|
7054
|
+
function readableLine(raw, mode) {
|
|
7055
|
+
let line = raw;
|
|
7056
|
+
line = line.replace(/!\[[^\]]*\]\([^)\s]*(?:\s+"[^"]*")?\)/g, "");
|
|
7057
|
+
line = mode === "speech" ? (
|
|
7058
|
+
// A voice reading "h-t-t-p-s colon slash slash…" mid-sentence is noise, and the
|
|
7059
|
+
// prompt asks for two to five links in every answer. The label IS the words.
|
|
7060
|
+
line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1")
|
|
7061
|
+
) : line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1 ($2)");
|
|
7062
|
+
line = mode === "speech" ? line.replace(/<(https?:\/\/[^>\s]+)>/g, "") : line.replace(/<(https?:\/\/[^>\s]+)>/g, "$1");
|
|
7063
|
+
line = line.replace(/^\s{0,3}#{1,6}\s+/, "");
|
|
7064
|
+
line = line.replace(/^\s{0,3}>\s?/, "");
|
|
7065
|
+
if (/^\s{0,3}([-*_])[ \t]*(?:\1[ \t]*){2,}$/.test(line)) return "";
|
|
7066
|
+
line = line.replace(/`([^`]+)`/g, "$1");
|
|
7067
|
+
line = line.replace(/\*\*([^*]+)\*\*/g, "$1");
|
|
7068
|
+
line = line.replace(/__([^_]+)__/g, "$1");
|
|
7069
|
+
line = line.replace(/(^|[^*\w])\*([^*\n]+)\*(?![*\w])/g, "$1$2");
|
|
7070
|
+
line = line.replace(/(^|[^_\w])_([^_\n]+)_(?![_\w])/g, "$1$2");
|
|
7071
|
+
return line.replace(/[ \t]+$/, "");
|
|
7072
|
+
}
|
|
7073
|
+
function tableCells(row) {
|
|
7074
|
+
const trimmed = row.trim();
|
|
7075
|
+
const cells = [];
|
|
7076
|
+
let cell = "";
|
|
7077
|
+
for (let at = 0; at < trimmed.length; at += 1) {
|
|
7078
|
+
const char = trimmed[at] ?? "";
|
|
7079
|
+
if (char === "\\") {
|
|
7080
|
+
cell += char + (trimmed[at + 1] ?? "");
|
|
7081
|
+
at += 1;
|
|
7082
|
+
continue;
|
|
7083
|
+
}
|
|
7084
|
+
if (char === "|") {
|
|
7085
|
+
cells.push(cell.trim());
|
|
7086
|
+
cell = "";
|
|
7087
|
+
continue;
|
|
7088
|
+
}
|
|
7089
|
+
cell += char;
|
|
7090
|
+
}
|
|
7091
|
+
cells.push(cell.trim());
|
|
7092
|
+
if (trimmed.startsWith("|") && cells[0] === "") cells.shift();
|
|
7093
|
+
if (trimmed.endsWith("|") && cells[cells.length - 1] === "") cells.pop();
|
|
7094
|
+
return cells;
|
|
7095
|
+
}
|
|
7096
|
+
function asSentence(text) {
|
|
7097
|
+
return /[.!?]$/.test(text) ? text : `${text}.`;
|
|
7098
|
+
}
|
|
7099
|
+
function spokenTable(rows) {
|
|
7100
|
+
if (rows.length < 2 || !TABLE_DELIMITER_ROW.test(rows[1] ?? "")) return rows;
|
|
7101
|
+
const labels = tableCells(rows[0] ?? "");
|
|
7102
|
+
const spoken = [];
|
|
7103
|
+
for (const row of rows.slice(2)) {
|
|
7104
|
+
const parts = [];
|
|
7105
|
+
tableCells(row).forEach((value, column) => {
|
|
7106
|
+
if (value === "") return;
|
|
7107
|
+
const label = column === 0 ? "" : labels[column] ?? "";
|
|
7108
|
+
parts.push(label === "" ? value : `${label}: ${value}`);
|
|
7109
|
+
});
|
|
7110
|
+
if (parts.length > 0) spoken.push(asSentence(parts.join(". ")));
|
|
7111
|
+
}
|
|
7112
|
+
return spoken;
|
|
7113
|
+
}
|
|
7114
|
+
function readableText(markdown, mode) {
|
|
7115
|
+
const lines = [];
|
|
7116
|
+
let inFence = false;
|
|
7117
|
+
let table = [];
|
|
7118
|
+
const flushTable = () => {
|
|
7119
|
+
if (table.length === 0) return;
|
|
7120
|
+
for (const line of spokenTable(table)) lines.push(readableLine(line, mode));
|
|
7121
|
+
table = [];
|
|
7122
|
+
};
|
|
7123
|
+
for (const raw of markdown.split("\n")) {
|
|
7124
|
+
if (CODE_FENCE.test(raw)) {
|
|
7125
|
+
flushTable();
|
|
7126
|
+
inFence = !inFence;
|
|
7127
|
+
continue;
|
|
7128
|
+
}
|
|
7129
|
+
if (inFence) {
|
|
7130
|
+
lines.push(raw);
|
|
7131
|
+
continue;
|
|
7132
|
+
}
|
|
7133
|
+
if (mode === "speech" && TABLE_ROW_LINE.test(raw)) {
|
|
7134
|
+
table.push(raw);
|
|
7135
|
+
continue;
|
|
7136
|
+
}
|
|
7137
|
+
flushTable();
|
|
7138
|
+
lines.push(readableLine(raw, mode));
|
|
7139
|
+
}
|
|
7140
|
+
flushTable();
|
|
7141
|
+
return lines.join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
7142
|
+
}
|
|
7143
|
+
function answerPlainText(markdown) {
|
|
7144
|
+
return readableText(markdown, "clipboard");
|
|
7145
|
+
}
|
|
7146
|
+
function answerSpeechText(markdown) {
|
|
7147
|
+
return readableText(markdown, "speech");
|
|
7148
|
+
}
|
|
7149
|
+
var AnswerScopeContext = React.createContext(null);
|
|
7150
|
+
var InsideLinkContext = React.createContext(false);
|
|
7151
|
+
function AnswerLink(props) {
|
|
7152
|
+
return /* @__PURE__ */ jsxRuntime.jsx(InsideLinkContext.Provider, { value: true, children: /* @__PURE__ */ jsxRuntime.jsx(MarkdownLink, { ...props }) });
|
|
7153
|
+
}
|
|
7154
|
+
var INLINE_IMAGE_FRAME = "relative inline-block max-w-full overflow-hidden rounded-xl border border-border bg-muted align-top shadow-sm";
|
|
7155
|
+
function InlineConceptImage({ src, alt }) {
|
|
7156
|
+
const scope = React.useContext(AnswerScopeContext);
|
|
7157
|
+
const insideLink = React.useContext(InsideLinkContext);
|
|
7158
|
+
if (!scope || !scope.enabled || !isInlineImageAllowed(src, scope.origins) || scope.failed.has(src)) {
|
|
7159
|
+
return null;
|
|
7160
|
+
}
|
|
7161
|
+
const { strings: T, onFailed } = scope;
|
|
7162
|
+
const picture = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7163
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7164
|
+
"img",
|
|
7165
|
+
{
|
|
7166
|
+
src,
|
|
7167
|
+
alt: alt ?? "",
|
|
7168
|
+
loading: "lazy",
|
|
7169
|
+
decoding: "async",
|
|
7170
|
+
onError: () => onFailed(src),
|
|
7171
|
+
className: "block h-auto max-h-80 w-auto max-w-full object-contain"
|
|
7172
|
+
}
|
|
7173
|
+
),
|
|
7174
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7175
|
+
"span",
|
|
7176
|
+
{
|
|
7177
|
+
"aria-hidden": "true",
|
|
7178
|
+
className: "pointer-events-none absolute left-2 top-2 rounded-full border border-border bg-background/90 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-foreground shadow-sm",
|
|
7179
|
+
children: T.conceptIllustration
|
|
7180
|
+
}
|
|
7181
|
+
)
|
|
7182
|
+
] });
|
|
7183
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-boff-explore": "inline-image", className: "my-3 block", children: insideLink ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: INLINE_IMAGE_FRAME, children: picture }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7184
|
+
"a",
|
|
7185
|
+
{
|
|
7186
|
+
href: src,
|
|
7187
|
+
target: "_blank",
|
|
7188
|
+
rel: "noopener noreferrer",
|
|
7189
|
+
className: cn(
|
|
7190
|
+
INLINE_IMAGE_FRAME,
|
|
7191
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7192
|
+
),
|
|
7193
|
+
children: [
|
|
7194
|
+
picture,
|
|
7195
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
|
|
7196
|
+
"(",
|
|
7197
|
+
T.opensInNewTab,
|
|
7198
|
+
")"
|
|
7199
|
+
] })
|
|
7200
|
+
]
|
|
7201
|
+
}
|
|
7202
|
+
) });
|
|
7203
|
+
}
|
|
7204
|
+
function markdownText(node) {
|
|
7205
|
+
if (!node) return "";
|
|
7206
|
+
if (typeof node.value === "string") return node.value;
|
|
7207
|
+
return (node.children ?? []).map(markdownText).join("");
|
|
7208
|
+
}
|
|
7209
|
+
function hasHeaderCells(node) {
|
|
7210
|
+
return (node?.children ?? []).some((cell) => cell.tagName === "th");
|
|
7211
|
+
}
|
|
7212
|
+
function findHeaderRow(node) {
|
|
7213
|
+
for (const child of node?.children ?? []) {
|
|
7214
|
+
if (child.tagName === "tr" && hasHeaderCells(child)) return child;
|
|
7215
|
+
const nested = findHeaderRow(child);
|
|
7216
|
+
if (nested !== null) return nested;
|
|
7217
|
+
}
|
|
7218
|
+
return null;
|
|
7219
|
+
}
|
|
7220
|
+
function tableColumnLabels(node) {
|
|
7221
|
+
const row = findHeaderRow(node);
|
|
7222
|
+
if (row === null) return [];
|
|
7223
|
+
return (row.children ?? []).filter((cell) => cell.tagName === "th").map((cell) => markdownText(cell).trim());
|
|
7224
|
+
}
|
|
7225
|
+
var TableColumnsContext = React.createContext([]);
|
|
7226
|
+
function AnswerTable({ node, children }) {
|
|
7227
|
+
const scope = React.useContext(AnswerScopeContext);
|
|
7228
|
+
const table = /* @__PURE__ */ jsxRuntime.jsx(TableColumnsContext.Provider, { value: tableColumnLabels(node), children: /* @__PURE__ */ jsxRuntime.jsx("table", { children }) });
|
|
7229
|
+
if (!scope) return table;
|
|
7230
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7231
|
+
"div",
|
|
7232
|
+
{
|
|
7233
|
+
"data-boff-explore": "table",
|
|
7234
|
+
role: "region",
|
|
7235
|
+
"aria-label": scope.strings.answerTable,
|
|
7236
|
+
tabIndex: 0,
|
|
7237
|
+
className: "boff-explore-table",
|
|
7238
|
+
children: table
|
|
7239
|
+
}
|
|
7240
|
+
);
|
|
7241
|
+
}
|
|
7242
|
+
function AnswerTableRow({
|
|
7243
|
+
node,
|
|
7244
|
+
children,
|
|
7245
|
+
...props
|
|
7246
|
+
}) {
|
|
7247
|
+
const labels = React.useContext(TableColumnsContext);
|
|
7248
|
+
if (labels.length === 0 || hasHeaderCells(node)) {
|
|
7249
|
+
return /* @__PURE__ */ jsxRuntime.jsx("tr", { ...props, children });
|
|
7250
|
+
}
|
|
7251
|
+
let column = 0;
|
|
7252
|
+
const cells = React.Children.map(children, (cell) => {
|
|
7253
|
+
if (!React.isValidElement(cell)) return cell;
|
|
7254
|
+
const label = labels[column] ?? "";
|
|
7255
|
+
column += 1;
|
|
7256
|
+
if (label === "") return cell;
|
|
7257
|
+
return React.cloneElement(cell, {
|
|
7258
|
+
"data-label": label
|
|
7259
|
+
});
|
|
7260
|
+
});
|
|
7261
|
+
return /* @__PURE__ */ jsxRuntime.jsx("tr", { ...props, children: cells });
|
|
7262
|
+
}
|
|
7263
|
+
var ANSWER_MARKDOWN_COMPONENTS = {
|
|
7264
|
+
a: AnswerLink,
|
|
7265
|
+
img: InlineConceptImage,
|
|
7266
|
+
table: AnswerTable,
|
|
7267
|
+
tr: AnswerTableRow
|
|
7268
|
+
};
|
|
7269
|
+
function ExploreAnswerBody({
|
|
7270
|
+
children,
|
|
7271
|
+
strings,
|
|
7272
|
+
imageOrigins,
|
|
7273
|
+
enabled = true,
|
|
7274
|
+
components,
|
|
7275
|
+
className
|
|
7276
|
+
}) {
|
|
7277
|
+
const [failed, setFailed] = React.useState(() => /* @__PURE__ */ new Set());
|
|
7278
|
+
const onFailed = React.useCallback((src) => {
|
|
7279
|
+
setFailed(
|
|
7280
|
+
(current) => current.has(src) ? current : new Set(current).add(src)
|
|
7281
|
+
);
|
|
7282
|
+
}, []);
|
|
7283
|
+
const scope = React.useMemo(
|
|
7284
|
+
() => ({
|
|
7285
|
+
strings,
|
|
7286
|
+
enabled,
|
|
7287
|
+
origins: imageOrigins,
|
|
7288
|
+
failed,
|
|
7289
|
+
onFailed
|
|
7290
|
+
}),
|
|
7291
|
+
[strings, enabled, imageOrigins, failed, onFailed]
|
|
7292
|
+
);
|
|
7293
|
+
const overrides = React.useMemo(
|
|
7294
|
+
() => components ? { ...ANSWER_MARKDOWN_COMPONENTS, ...components } : ANSWER_MARKDOWN_COMPONENTS,
|
|
7295
|
+
[components]
|
|
7296
|
+
);
|
|
7297
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("boff-prose boff-explore-body min-w-0", className), children: /* @__PURE__ */ jsxRuntime.jsx(AnswerScopeContext.Provider, { value: scope, children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { components: overrides, children }) }) });
|
|
7298
|
+
}
|
|
7299
|
+
var PROSE_CSS = `
|
|
7300
|
+
.boff-prose {
|
|
7301
|
+
max-width: none;
|
|
7302
|
+
}
|
|
7303
|
+
|
|
7304
|
+
.boff-prose h1 {
|
|
7305
|
+
font-size: 2.25rem;
|
|
7306
|
+
font-weight: 800;
|
|
7307
|
+
line-height: 1.2;
|
|
7308
|
+
margin-top: 0;
|
|
7309
|
+
margin-bottom: 1rem;
|
|
7310
|
+
color: hsl(var(--foreground));
|
|
7311
|
+
}
|
|
7312
|
+
|
|
7313
|
+
.boff-prose h2 {
|
|
7314
|
+
font-size: 1.75rem;
|
|
7315
|
+
font-weight: 700;
|
|
7316
|
+
line-height: 1.3;
|
|
7317
|
+
margin-top: 2rem;
|
|
7318
|
+
margin-bottom: 1rem;
|
|
7319
|
+
color: hsl(var(--foreground));
|
|
7320
|
+
}
|
|
7321
|
+
|
|
7322
|
+
.boff-prose h3 {
|
|
7323
|
+
font-size: 1.5rem;
|
|
7324
|
+
font-weight: 600;
|
|
7325
|
+
line-height: 1.4;
|
|
7326
|
+
margin-top: 1.5rem;
|
|
7327
|
+
margin-bottom: 0.75rem;
|
|
7328
|
+
color: hsl(var(--foreground));
|
|
7329
|
+
}
|
|
7330
|
+
|
|
7331
|
+
.boff-prose h4 {
|
|
7332
|
+
font-size: 1.25rem;
|
|
7333
|
+
font-weight: 600;
|
|
7334
|
+
line-height: 1.5;
|
|
7335
|
+
margin-top: 1.25rem;
|
|
7336
|
+
margin-bottom: 0.5rem;
|
|
7337
|
+
color: hsl(var(--foreground));
|
|
7338
|
+
}
|
|
7339
|
+
|
|
7340
|
+
.boff-prose p {
|
|
7341
|
+
margin-bottom: 1rem;
|
|
7342
|
+
line-height: 1.75;
|
|
7343
|
+
color: hsl(var(--foreground));
|
|
7344
|
+
}
|
|
7345
|
+
|
|
7346
|
+
.boff-prose ul,
|
|
7347
|
+
.boff-prose ol {
|
|
7348
|
+
margin-bottom: 1rem;
|
|
7349
|
+
padding-left: 1.5rem;
|
|
7350
|
+
}
|
|
7351
|
+
|
|
7352
|
+
.boff-prose ul {
|
|
7353
|
+
list-style-type: disc;
|
|
7354
|
+
}
|
|
7355
|
+
|
|
7356
|
+
.boff-prose ol {
|
|
7357
|
+
list-style-type: decimal;
|
|
7358
|
+
}
|
|
7359
|
+
|
|
7360
|
+
.boff-prose li {
|
|
7361
|
+
margin-bottom: 0.25rem;
|
|
7362
|
+
line-height: 1.75;
|
|
7363
|
+
color: hsl(var(--foreground));
|
|
7364
|
+
}
|
|
7365
|
+
|
|
7366
|
+
.boff-prose li > ul,
|
|
7367
|
+
.boff-prose li > ol {
|
|
7368
|
+
margin-top: 0.25rem;
|
|
7369
|
+
margin-bottom: 0.25rem;
|
|
7370
|
+
}
|
|
7371
|
+
|
|
7372
|
+
.boff-prose a {
|
|
7373
|
+
color: hsl(var(--primary));
|
|
7374
|
+
text-decoration: underline;
|
|
7375
|
+
text-underline-offset: 2px;
|
|
7376
|
+
}
|
|
7377
|
+
|
|
7378
|
+
.boff-prose a:hover {
|
|
7379
|
+
opacity: 0.8;
|
|
7380
|
+
}
|
|
7381
|
+
|
|
7382
|
+
.boff-prose hr {
|
|
7383
|
+
border: none;
|
|
7384
|
+
height: 1px;
|
|
7385
|
+
background-color: hsl(var(--border));
|
|
7386
|
+
margin: 2rem 0;
|
|
7387
|
+
}
|
|
7388
|
+
|
|
7389
|
+
.boff-prose blockquote {
|
|
7390
|
+
border-left: 4px solid hsl(var(--border));
|
|
7391
|
+
padding-left: 1rem;
|
|
7392
|
+
margin: 1.5rem 0;
|
|
7393
|
+
font-style: italic;
|
|
7394
|
+
color: hsl(var(--muted-foreground));
|
|
7395
|
+
}
|
|
7396
|
+
|
|
7397
|
+
.boff-prose strong {
|
|
7398
|
+
font-weight: 700;
|
|
7399
|
+
color: hsl(var(--foreground));
|
|
7400
|
+
}
|
|
7401
|
+
|
|
7402
|
+
.boff-prose code {
|
|
7403
|
+
background-color: hsl(var(--muted));
|
|
7404
|
+
padding: 0.125rem 0.25rem;
|
|
7405
|
+
border-radius: 0.25rem;
|
|
7406
|
+
font-size: 0.875em;
|
|
7407
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
7408
|
+
}
|
|
7409
|
+
|
|
7410
|
+
.boff-prose pre {
|
|
7411
|
+
background-color: hsl(var(--muted));
|
|
7412
|
+
padding: 1rem;
|
|
7413
|
+
border-radius: 0.5rem;
|
|
7414
|
+
overflow-x: auto;
|
|
7415
|
+
margin-bottom: 1rem;
|
|
7416
|
+
}
|
|
7417
|
+
|
|
7418
|
+
.boff-prose pre code {
|
|
7419
|
+
background-color: transparent;
|
|
7420
|
+
padding: 0;
|
|
7421
|
+
}
|
|
7422
|
+
|
|
7423
|
+
.boff-prose img {
|
|
7424
|
+
max-width: 100%;
|
|
7425
|
+
height: auto;
|
|
7426
|
+
}
|
|
7427
|
+
|
|
7428
|
+
.boff-prose table {
|
|
7429
|
+
width: 100%;
|
|
7430
|
+
border-collapse: collapse;
|
|
7431
|
+
margin-bottom: 1rem;
|
|
7432
|
+
}
|
|
7433
|
+
|
|
7434
|
+
.boff-prose th,
|
|
7435
|
+
.boff-prose td {
|
|
7436
|
+
border: 1px solid hsl(var(--border));
|
|
7437
|
+
padding: 0.5rem;
|
|
7438
|
+
text-align: left;
|
|
7439
|
+
}
|
|
7440
|
+
|
|
7441
|
+
.boff-prose th {
|
|
7442
|
+
font-weight: 600;
|
|
7443
|
+
background-color: hsl(var(--muted));
|
|
7444
|
+
}
|
|
7445
|
+
|
|
7446
|
+
/* Smaller variant used inside cards and compact panels */
|
|
7447
|
+
.boff-prose-sm {
|
|
7448
|
+
font-size: 0.875rem;
|
|
7449
|
+
}
|
|
7450
|
+
|
|
7451
|
+
.boff-prose-sm h1 {
|
|
7452
|
+
font-size: 1.75rem;
|
|
7453
|
+
}
|
|
7454
|
+
|
|
7455
|
+
.boff-prose-sm h2 {
|
|
7456
|
+
font-size: 1.5rem;
|
|
7457
|
+
}
|
|
7458
|
+
|
|
7459
|
+
.boff-prose-sm h3 {
|
|
7460
|
+
font-size: 1.25rem;
|
|
7461
|
+
}
|
|
7462
|
+
|
|
7463
|
+
.boff-prose-sm h4 {
|
|
7464
|
+
font-size: 1.125rem;
|
|
7465
|
+
}
|
|
7466
|
+
|
|
7467
|
+
.boff-prose-sm p,
|
|
7468
|
+
.boff-prose-sm li {
|
|
7469
|
+
line-height: 1.625;
|
|
7470
|
+
}
|
|
7471
|
+
`;
|
|
7472
|
+
function ProseStyles() {
|
|
7473
|
+
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: PROSE_CSS } });
|
|
7474
|
+
}
|
|
7475
|
+
var META_DESCRIPTION_LIMIT2 = 160;
|
|
7476
|
+
var TITLE_LIMIT = 100;
|
|
7477
|
+
var RELATED_LIMIT2 = 4;
|
|
7478
|
+
function normaliseSiteUrl2(siteUrl) {
|
|
7479
|
+
return siteUrl.trim().replace(/\/+$/, "");
|
|
7480
|
+
}
|
|
7481
|
+
function absoluteUrl2(base, path) {
|
|
7482
|
+
if (/^https?:\/\//i.test(path)) return path;
|
|
7483
|
+
return `${base}${path.startsWith("/") ? path : `/${path}`}`;
|
|
7484
|
+
}
|
|
7485
|
+
function sortByOrder2(answers) {
|
|
7486
|
+
return [...answers].sort(
|
|
7487
|
+
(a, b) => a.order - b.order || a.slug.localeCompare(b.slug)
|
|
7488
|
+
);
|
|
7489
|
+
}
|
|
7490
|
+
function clampText2(text, limit) {
|
|
7491
|
+
if (text.length <= limit) return text;
|
|
7492
|
+
const cut = text.slice(0, limit - 1);
|
|
7493
|
+
const lastSpace = cut.lastIndexOf(" ");
|
|
7494
|
+
return `${(lastSpace > 0 ? cut.slice(0, lastSpace) : cut).replace(/[\s,;:—–-]+$/, "")}\u2026`;
|
|
7495
|
+
}
|
|
7496
|
+
function questionCount(T, count) {
|
|
7497
|
+
return count === 1 ? T.questionCountOne : fill(T.questionCountMany, { count: String(count) });
|
|
7498
|
+
}
|
|
7499
|
+
function sourceCount(T, count) {
|
|
7500
|
+
return count === 1 ? T.sourceCountOne : fill(T.sourceCountMany, { count: String(count) });
|
|
7501
|
+
}
|
|
7502
|
+
function slugifyAnchor2(value) {
|
|
7503
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
7504
|
+
}
|
|
7505
|
+
function publishableSources(sources) {
|
|
7506
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7507
|
+
const kept = [];
|
|
7508
|
+
for (const source of sources) {
|
|
7509
|
+
if (!isPublishedSourceUrl(source.url) || seen.has(source.url)) continue;
|
|
7510
|
+
seen.add(source.url);
|
|
7511
|
+
kept.push(source);
|
|
7512
|
+
}
|
|
7513
|
+
return kept;
|
|
7514
|
+
}
|
|
7515
|
+
function groupByTopic(ordered, topics) {
|
|
7516
|
+
const byName = /* @__PURE__ */ new Map();
|
|
7517
|
+
for (const answer of ordered) {
|
|
7518
|
+
const list = byName.get(answer.topic);
|
|
7519
|
+
if (list) list.push(answer);
|
|
7520
|
+
else byName.set(answer.topic, [answer]);
|
|
7521
|
+
}
|
|
7522
|
+
const described = [];
|
|
7523
|
+
for (const topic of topics ?? []) {
|
|
7524
|
+
const list = byName.get(topic.name);
|
|
7525
|
+
if (!list) continue;
|
|
7526
|
+
described.push({
|
|
7527
|
+
name: topic.name,
|
|
7528
|
+
description: topic.description,
|
|
7529
|
+
answers: list
|
|
7530
|
+
});
|
|
7531
|
+
byName.delete(topic.name);
|
|
7532
|
+
}
|
|
7533
|
+
for (const [name, list] of byName) {
|
|
7534
|
+
described.push({ name, description: "", answers: list });
|
|
7535
|
+
}
|
|
7536
|
+
const used = /* @__PURE__ */ new Set();
|
|
7537
|
+
return described.map((group) => {
|
|
7538
|
+
const base = `answers-${slugifyAnchor2(group.name) || "topic"}`;
|
|
7539
|
+
let anchor = base;
|
|
7540
|
+
for (let n = 2; used.has(anchor); n += 1) anchor = `${base}-${n}`;
|
|
7541
|
+
used.add(anchor);
|
|
7542
|
+
return { ...group, anchor };
|
|
7543
|
+
});
|
|
7544
|
+
}
|
|
7545
|
+
function searchTokens2(query) {
|
|
7546
|
+
return query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
7547
|
+
}
|
|
7548
|
+
function matchesSearch2(answer, tokens) {
|
|
7549
|
+
if (tokens.length === 0) return true;
|
|
7550
|
+
const haystack = [
|
|
7551
|
+
answer.question,
|
|
7552
|
+
answer.summary,
|
|
7553
|
+
answer.topic,
|
|
7554
|
+
...answer.keywords
|
|
7555
|
+
].join(" ").toLowerCase();
|
|
7556
|
+
return tokens.every((token) => haystack.includes(token));
|
|
7557
|
+
}
|
|
7558
|
+
function copyKey2(index, text) {
|
|
7559
|
+
return `${index}-${text}`;
|
|
7560
|
+
}
|
|
7561
|
+
function demoteHeading(Tag) {
|
|
7562
|
+
function DemotedHeading({
|
|
7563
|
+
node: _node,
|
|
7564
|
+
...props
|
|
7565
|
+
}) {
|
|
7566
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Tag, { ...props });
|
|
7567
|
+
}
|
|
7568
|
+
DemotedHeading.displayName = `DemotedHeading(${Tag})`;
|
|
7569
|
+
return DemotedHeading;
|
|
7570
|
+
}
|
|
7571
|
+
var ANSWER_HEADING_SHIFT = {
|
|
7572
|
+
h1: demoteHeading("h3"),
|
|
7573
|
+
h2: demoteHeading("h3"),
|
|
7574
|
+
h3: demoteHeading("h4"),
|
|
7575
|
+
h4: demoteHeading("h5"),
|
|
7576
|
+
h5: demoteHeading("h6"),
|
|
7577
|
+
h6: demoteHeading("h6")
|
|
7578
|
+
};
|
|
7579
|
+
var ENGLISH_TEXT = { lang: "en" };
|
|
7580
|
+
function DefaultAnswerLink({
|
|
7581
|
+
href,
|
|
7582
|
+
className,
|
|
7583
|
+
children,
|
|
7584
|
+
"aria-label": ariaLabel
|
|
7585
|
+
}) {
|
|
7586
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { href, className, "aria-label": ariaLabel, children });
|
|
7587
|
+
}
|
|
7588
|
+
function AnswerCard({
|
|
7589
|
+
answer,
|
|
7590
|
+
strings: T,
|
|
7591
|
+
Link
|
|
7592
|
+
}) {
|
|
7593
|
+
const sources = publishableSources(answer.sources).length;
|
|
7594
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7595
|
+
Link,
|
|
7596
|
+
{
|
|
7597
|
+
href: answerPath(answer.slug),
|
|
7598
|
+
className: "group flex h-full flex-col gap-2 rounded-2xl border border-border bg-card p-5 text-card-foreground shadow-sm transition hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transform-none motion-reduce:transition-none",
|
|
7599
|
+
children: [
|
|
7600
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7601
|
+
"h3",
|
|
7602
|
+
{
|
|
7603
|
+
...ENGLISH_TEXT,
|
|
7604
|
+
className: "text-base font-semibold leading-snug text-card-foreground transition-colors group-hover:text-primary",
|
|
7605
|
+
children: answer.question
|
|
7606
|
+
}
|
|
7607
|
+
),
|
|
7608
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7609
|
+
"p",
|
|
7610
|
+
{
|
|
7611
|
+
...ENGLISH_TEXT,
|
|
7612
|
+
className: "line-clamp-3 text-sm leading-relaxed text-muted-foreground",
|
|
7613
|
+
children: answer.summary
|
|
7614
|
+
}
|
|
7615
|
+
),
|
|
7616
|
+
sources > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-auto inline-flex items-center gap-1.5 pt-2 text-xs font-medium text-muted-foreground", children: [
|
|
7617
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpenText, { "aria-hidden": "true", className: "h-3.5 w-3.5" }),
|
|
7618
|
+
sourceCount(T, sources)
|
|
7619
|
+
] }) : null
|
|
7620
|
+
]
|
|
7621
|
+
}
|
|
7622
|
+
);
|
|
7623
|
+
}
|
|
7624
|
+
function FilterChip2({
|
|
7625
|
+
label,
|
|
7626
|
+
count,
|
|
7627
|
+
active,
|
|
7628
|
+
topic,
|
|
7629
|
+
onSelect
|
|
7630
|
+
}) {
|
|
7631
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7632
|
+
"button",
|
|
7633
|
+
{
|
|
7634
|
+
type: "button",
|
|
7635
|
+
"aria-pressed": active,
|
|
7636
|
+
"data-topic": topic,
|
|
7637
|
+
onClick: onSelect,
|
|
7638
|
+
className: cn(
|
|
7639
|
+
"inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7640
|
+
active ? "border-primary bg-primary text-primary-foreground" : "border-border bg-card text-foreground hover:border-primary/40 hover:bg-muted"
|
|
7641
|
+
),
|
|
7642
|
+
children: [
|
|
7643
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
|
|
7644
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7645
|
+
"span",
|
|
7646
|
+
{
|
|
7647
|
+
className: cn(
|
|
7648
|
+
"rounded-full px-1.5 text-xs tabular-nums",
|
|
7649
|
+
active ? "bg-primary-foreground/20 text-primary-foreground" : "bg-muted text-muted-foreground"
|
|
7650
|
+
),
|
|
7651
|
+
children: count
|
|
7652
|
+
}
|
|
7653
|
+
)
|
|
7654
|
+
]
|
|
7655
|
+
}
|
|
7656
|
+
);
|
|
7657
|
+
}
|
|
7658
|
+
function AnswersPage({
|
|
7659
|
+
productName,
|
|
7660
|
+
siteUrl,
|
|
7661
|
+
answers,
|
|
7662
|
+
topics,
|
|
7663
|
+
cta,
|
|
7664
|
+
linkComponent,
|
|
7665
|
+
title,
|
|
7666
|
+
description,
|
|
7667
|
+
locale,
|
|
7668
|
+
className
|
|
7669
|
+
}) {
|
|
7670
|
+
const Link = linkComponent ?? DefaultAnswerLink;
|
|
7671
|
+
const base = normaliseSiteUrl2(siteUrl);
|
|
7672
|
+
const searchId = React.useId();
|
|
7673
|
+
const activeLocale = React.useMemo(() => resolveExploreLocale(locale), [locale]);
|
|
7674
|
+
const T = React.useMemo(() => answerStrings(activeLocale), [activeLocale]);
|
|
7675
|
+
const rtl = isRtlLocale(activeLocale);
|
|
7676
|
+
const ordered = React.useMemo(() => sortByOrder2(answers), [answers]);
|
|
7677
|
+
const groups = React.useMemo(
|
|
7678
|
+
() => groupByTopic(ordered, topics),
|
|
7679
|
+
[ordered, topics]
|
|
7680
|
+
);
|
|
7681
|
+
const [query, setQuery] = React.useState("");
|
|
7682
|
+
const [activeTopic, setActiveTopic] = React.useState(null);
|
|
7683
|
+
const hasAnswers = ordered.length > 0;
|
|
7684
|
+
const tokens = React.useMemo(() => searchTokens2(query), [query]);
|
|
7685
|
+
const searched = React.useMemo(
|
|
7686
|
+
() => ordered.filter((answer) => matchesSearch2(answer, tokens)),
|
|
7687
|
+
[ordered, tokens]
|
|
7688
|
+
);
|
|
7689
|
+
const countsByTopic = React.useMemo(() => {
|
|
7690
|
+
const counts = /* @__PURE__ */ new Map();
|
|
7691
|
+
for (const answer of searched) {
|
|
7692
|
+
counts.set(answer.topic, (counts.get(answer.topic) ?? 0) + 1);
|
|
7693
|
+
}
|
|
7694
|
+
return counts;
|
|
7695
|
+
}, [searched]);
|
|
7696
|
+
const visibleGroups = React.useMemo(() => {
|
|
7697
|
+
const visible = new Set(
|
|
7698
|
+
searched.filter(
|
|
7699
|
+
(answer) => activeTopic === null || answer.topic === activeTopic
|
|
7700
|
+
)
|
|
7701
|
+
);
|
|
7702
|
+
return groups.map((group) => ({
|
|
7703
|
+
...group,
|
|
7704
|
+
answers: group.answers.filter((answer) => visible.has(answer))
|
|
7705
|
+
})).filter((group) => group.answers.length > 0);
|
|
7706
|
+
}, [groups, searched, activeTopic]);
|
|
7707
|
+
const visibleTotal = visibleGroups.reduce(
|
|
7708
|
+
(sum, group) => sum + group.answers.length,
|
|
7709
|
+
0
|
|
7710
|
+
);
|
|
7711
|
+
const filtering = tokens.length > 0 || activeTopic !== null;
|
|
7712
|
+
const clearFilters = React.useCallback(() => {
|
|
7713
|
+
setQuery("");
|
|
7714
|
+
setActiveTopic(null);
|
|
7715
|
+
}, []);
|
|
7716
|
+
const heading = title ?? fill(T.indexHeading, { product: productName });
|
|
7717
|
+
const metaDescription = description ?? clampText2(
|
|
7718
|
+
fill(T.seoIndexDescription, { product: productName }),
|
|
7719
|
+
META_DESCRIPTION_LIMIT2
|
|
7720
|
+
);
|
|
7721
|
+
const lead = description ?? fill(T.indexLead, { product: productName });
|
|
7722
|
+
const canonical = `${base}${ANSWERS_PATH}`;
|
|
7723
|
+
const structuredData = React.useMemo(
|
|
7724
|
+
() => [
|
|
7725
|
+
{
|
|
7726
|
+
"@context": "https://schema.org",
|
|
7727
|
+
"@type": "CollectionPage",
|
|
7728
|
+
name: heading,
|
|
7729
|
+
description: metaDescription,
|
|
7730
|
+
url: canonical,
|
|
7731
|
+
isPartOf: { "@type": "WebSite", name: productName, url: `${base}/` },
|
|
7732
|
+
mainEntity: {
|
|
7733
|
+
"@type": "ItemList",
|
|
7734
|
+
numberOfItems: ordered.length,
|
|
7735
|
+
itemListElement: ordered.map((answer, index) => ({
|
|
7736
|
+
"@type": "ListItem",
|
|
7737
|
+
position: index + 1,
|
|
7738
|
+
url: absoluteUrl2(base, answerPath(answer.slug)),
|
|
7739
|
+
name: answer.question
|
|
7740
|
+
}))
|
|
7741
|
+
}
|
|
7742
|
+
},
|
|
7743
|
+
{
|
|
7744
|
+
"@context": "https://schema.org",
|
|
7745
|
+
"@type": "BreadcrumbList",
|
|
7746
|
+
itemListElement: [
|
|
7747
|
+
{
|
|
7748
|
+
"@type": "ListItem",
|
|
7749
|
+
position: 1,
|
|
7750
|
+
name: T.breadcrumbHome,
|
|
7751
|
+
item: `${base}/`
|
|
7752
|
+
},
|
|
7753
|
+
{
|
|
7754
|
+
"@type": "ListItem",
|
|
7755
|
+
position: 2,
|
|
7756
|
+
name: T.answers,
|
|
7757
|
+
item: canonical
|
|
7758
|
+
}
|
|
7759
|
+
]
|
|
7760
|
+
}
|
|
7761
|
+
],
|
|
7762
|
+
[base, canonical, heading, metaDescription, ordered, productName, T]
|
|
7763
|
+
);
|
|
7764
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7765
|
+
"div",
|
|
7766
|
+
{
|
|
7767
|
+
"data-answers": "landing",
|
|
7768
|
+
"data-locale": activeLocale,
|
|
7769
|
+
dir: rtl ? "rtl" : void 0,
|
|
7770
|
+
className: cn("bg-background text-foreground", className),
|
|
7771
|
+
children: [
|
|
7772
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7773
|
+
PageHead,
|
|
7774
|
+
{
|
|
7775
|
+
title: T.seoIndexTitle,
|
|
7776
|
+
description: metaDescription,
|
|
7777
|
+
productName,
|
|
7778
|
+
keywords: [
|
|
7779
|
+
fill(T.indexHeading, { product: productName }),
|
|
7780
|
+
...groups.map((group) => group.name)
|
|
7781
|
+
].join(", "),
|
|
7782
|
+
url: canonical,
|
|
7783
|
+
structuredData
|
|
7784
|
+
}
|
|
7785
|
+
),
|
|
7786
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "border-b border-border bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-6xl px-4 py-14 sm:px-6 sm:py-20 lg:px-8", children: [
|
|
7787
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-primary", children: T.answers }),
|
|
7788
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-3 max-w-3xl text-4xl font-bold tracking-tight text-foreground sm:text-5xl", children: heading }),
|
|
7789
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 max-w-2xl text-lg leading-relaxed text-muted-foreground", children: lead }),
|
|
7790
|
+
hasAnswers ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-6 text-sm text-muted-foreground", children: [
|
|
7791
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { className: "text-lg font-semibold text-foreground", children: ordered.length }),
|
|
7792
|
+
" ",
|
|
7793
|
+
questionCount(T, ordered.length)
|
|
7794
|
+
] }) : null,
|
|
7795
|
+
cta ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-8 flex flex-wrap gap-3", children: cta }) : null
|
|
7796
|
+
] }) }),
|
|
7797
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto max-w-6xl px-4 pb-20 sm:px-6 lg:px-8", children: hasAnswers ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7798
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7799
|
+
"div",
|
|
7800
|
+
{
|
|
7801
|
+
role: "search",
|
|
7802
|
+
"data-answers": "filter",
|
|
7803
|
+
className: "flex flex-col gap-4 py-8",
|
|
7804
|
+
children: [
|
|
7805
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full max-w-md", children: [
|
|
7806
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7807
|
+
lucideReact.Search,
|
|
7808
|
+
{
|
|
7809
|
+
"aria-hidden": "true",
|
|
7810
|
+
className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"
|
|
7811
|
+
}
|
|
7812
|
+
),
|
|
7813
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: searchId, className: "sr-only", children: T.searchLabel }),
|
|
7814
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7815
|
+
"input",
|
|
7816
|
+
{
|
|
7817
|
+
id: searchId,
|
|
7818
|
+
type: "search",
|
|
7819
|
+
value: query,
|
|
7820
|
+
onChange: (event) => setQuery(event.target.value),
|
|
7821
|
+
placeholder: T.searchPlaceholder,
|
|
7822
|
+
autoComplete: "off",
|
|
7823
|
+
className: "h-10 w-full rounded-lg border border-border bg-background pl-9 pr-3 text-sm text-foreground shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
7824
|
+
}
|
|
7825
|
+
)
|
|
7826
|
+
] }),
|
|
7827
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7828
|
+
"div",
|
|
7829
|
+
{
|
|
7830
|
+
role: "group",
|
|
7831
|
+
"aria-label": T.filterByTopic,
|
|
7832
|
+
className: "flex flex-wrap gap-2",
|
|
7833
|
+
children: [
|
|
7834
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7835
|
+
FilterChip2,
|
|
7836
|
+
{
|
|
7837
|
+
label: T.allTopics,
|
|
7838
|
+
topic: "all",
|
|
7839
|
+
count: searched.length,
|
|
7840
|
+
active: activeTopic === null,
|
|
7841
|
+
onSelect: () => setActiveTopic(null)
|
|
7842
|
+
}
|
|
7843
|
+
),
|
|
7844
|
+
groups.map((group) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7845
|
+
FilterChip2,
|
|
7846
|
+
{
|
|
7847
|
+
label: group.name,
|
|
7848
|
+
topic: group.name,
|
|
7849
|
+
count: countsByTopic.get(group.name) ?? 0,
|
|
7850
|
+
active: activeTopic === group.name,
|
|
7851
|
+
onSelect: () => setActiveTopic(
|
|
7852
|
+
(current) => current === group.name ? null : group.name
|
|
7853
|
+
)
|
|
7854
|
+
},
|
|
7855
|
+
group.anchor
|
|
7856
|
+
))
|
|
7857
|
+
]
|
|
7858
|
+
}
|
|
7859
|
+
),
|
|
7860
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7861
|
+
"p",
|
|
7862
|
+
{
|
|
7863
|
+
"aria-live": "polite",
|
|
7864
|
+
className: filtering ? "text-sm text-muted-foreground" : "sr-only",
|
|
7865
|
+
children: fill(T.showingCount, {
|
|
7866
|
+
shown: String(visibleTotal),
|
|
7867
|
+
total: String(ordered.length)
|
|
7868
|
+
})
|
|
7869
|
+
}
|
|
7870
|
+
)
|
|
7871
|
+
]
|
|
7872
|
+
}
|
|
7873
|
+
),
|
|
7874
|
+
visibleTotal === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7875
|
+
"div",
|
|
7876
|
+
{
|
|
7877
|
+
"data-answers": "empty",
|
|
7878
|
+
className: "rounded-2xl border border-dashed border-border bg-muted/30 px-6 py-14 text-center",
|
|
7879
|
+
children: [
|
|
7880
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7881
|
+
lucideReact.Search,
|
|
7882
|
+
{
|
|
7883
|
+
"aria-hidden": "true",
|
|
7884
|
+
className: "mx-auto h-8 w-8 text-muted-foreground"
|
|
7885
|
+
}
|
|
7886
|
+
),
|
|
7887
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "mt-4 text-lg font-semibold text-foreground", children: T.noMatchesTitle }),
|
|
7888
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: T.noMatchesBody }),
|
|
7889
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7890
|
+
"button",
|
|
7891
|
+
{
|
|
7892
|
+
type: "button",
|
|
7893
|
+
onClick: clearFilters,
|
|
7894
|
+
className: "mt-6 inline-flex items-center rounded-full border border-border bg-card px-4 py-2 text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
7895
|
+
children: T.clearFilters
|
|
7896
|
+
}
|
|
7897
|
+
)
|
|
7898
|
+
]
|
|
7899
|
+
}
|
|
7900
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-14", children: visibleGroups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-labelledby": group.anchor, children: [
|
|
7901
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl", children: [
|
|
7902
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7903
|
+
"h2",
|
|
7904
|
+
{
|
|
7905
|
+
id: group.anchor,
|
|
7906
|
+
className: "scroll-mt-24 text-2xl font-semibold tracking-tight text-foreground",
|
|
7907
|
+
children: group.name
|
|
7908
|
+
}
|
|
7909
|
+
),
|
|
7910
|
+
group.description ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 leading-relaxed text-muted-foreground", children: group.description }) : null
|
|
7911
|
+
] }),
|
|
7912
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7913
|
+
"ul",
|
|
7914
|
+
{
|
|
7915
|
+
role: "list",
|
|
7916
|
+
className: "mt-6 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3",
|
|
7917
|
+
children: group.answers.map((answer) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
7918
|
+
"li",
|
|
7919
|
+
{
|
|
7920
|
+
"data-answers": "card",
|
|
7921
|
+
"data-slug": answer.slug,
|
|
7922
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(AnswerCard, { answer, strings: T, Link })
|
|
7923
|
+
},
|
|
7924
|
+
answer.slug
|
|
7925
|
+
))
|
|
7926
|
+
}
|
|
7927
|
+
)
|
|
7928
|
+
] }, group.anchor)) })
|
|
7929
|
+
] }) : (
|
|
7930
|
+
// Nothing published yet: no filter bar with an "All 0" chip, and no empty state
|
|
7931
|
+
// that blames filters the visitor never set.
|
|
7932
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7933
|
+
"div",
|
|
7934
|
+
{
|
|
7935
|
+
"data-answers": "none",
|
|
7936
|
+
className: "mt-10 rounded-2xl border border-dashed border-border bg-muted/30 px-6 py-14 text-center",
|
|
7937
|
+
children: [
|
|
7938
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7939
|
+
lucideReact.Sparkles,
|
|
7940
|
+
{
|
|
7941
|
+
"aria-hidden": "true",
|
|
7942
|
+
className: "mx-auto h-8 w-8 text-muted-foreground"
|
|
7943
|
+
}
|
|
7944
|
+
),
|
|
7945
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "mt-4 text-lg font-semibold text-foreground", children: T.noneYetTitle }),
|
|
7946
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: fill(T.noneYetBody, { product: productName }) })
|
|
7947
|
+
]
|
|
7948
|
+
}
|
|
7949
|
+
)
|
|
7950
|
+
) })
|
|
7951
|
+
]
|
|
7952
|
+
}
|
|
7953
|
+
);
|
|
7954
|
+
}
|
|
7955
|
+
var SECTION_HEADING2 = "scroll-mt-24 text-2xl font-semibold tracking-tight text-foreground";
|
|
7956
|
+
var CHIP2 = "inline-flex items-center rounded-full border border-border bg-muted/50 px-3 py-1 text-sm text-foreground";
|
|
7957
|
+
function ProvenanceNote({
|
|
7958
|
+
strings: T,
|
|
7959
|
+
date,
|
|
7960
|
+
className
|
|
7961
|
+
}) {
|
|
7962
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7963
|
+
"div",
|
|
7964
|
+
{
|
|
7965
|
+
role: "note",
|
|
7966
|
+
"aria-label": T.aboutTitle,
|
|
7967
|
+
"data-answers": "provenance",
|
|
7968
|
+
className: cn(
|
|
7969
|
+
"flex items-start gap-3 rounded-xl border border-primary/30 bg-primary/10 px-4 py-3 text-sm leading-relaxed text-foreground",
|
|
7970
|
+
className
|
|
7971
|
+
),
|
|
7972
|
+
children: [
|
|
7973
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7974
|
+
lucideReact.Info,
|
|
7975
|
+
{
|
|
7976
|
+
"aria-hidden": "true",
|
|
7977
|
+
className: "mt-0.5 h-4 w-4 shrink-0 text-primary"
|
|
7978
|
+
}
|
|
7979
|
+
),
|
|
7980
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
|
|
7981
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold", children: T.aboutTitle }),
|
|
7982
|
+
" \u2014 ",
|
|
7983
|
+
fill(T.aboutBody, { date })
|
|
7984
|
+
] })
|
|
7985
|
+
]
|
|
7986
|
+
}
|
|
7987
|
+
);
|
|
7988
|
+
}
|
|
7989
|
+
function SourceLink({
|
|
7990
|
+
source,
|
|
7991
|
+
strings: T
|
|
7992
|
+
}) {
|
|
7993
|
+
const host = answerSourceHost(source.url);
|
|
7994
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7995
|
+
"a",
|
|
7996
|
+
{
|
|
7997
|
+
"data-answers": "source",
|
|
7998
|
+
href: source.url,
|
|
7999
|
+
target: "_blank",
|
|
8000
|
+
rel: "noopener noreferrer",
|
|
8001
|
+
className: "group flex h-full flex-col gap-1.5 rounded-xl border border-border bg-card p-4 text-card-foreground transition-colors hover:border-primary/40 hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8002
|
+
children: [
|
|
8003
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold leading-snug transition-colors group-hover:text-primary", children: source.title || host || source.url }),
|
|
8004
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-auto flex items-center gap-2 pt-1 text-xs text-muted-foreground", children: [
|
|
8005
|
+
source.product ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-secondary px-2 py-0.5 font-medium text-secondary-foreground", children: source.product }) : null,
|
|
8006
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-0 items-center gap-1", children: [
|
|
8007
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { "aria-hidden": "true", className: "h-3 w-3 shrink-0" }),
|
|
8008
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: host })
|
|
8009
|
+
] })
|
|
8010
|
+
] }),
|
|
8011
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
|
|
8012
|
+
"(",
|
|
8013
|
+
T.opensInNewTab,
|
|
8014
|
+
")"
|
|
8015
|
+
] })
|
|
8016
|
+
]
|
|
8017
|
+
}
|
|
8018
|
+
);
|
|
8019
|
+
}
|
|
8020
|
+
function AnswerDetailPage(props) {
|
|
8021
|
+
return /* @__PURE__ */ jsxRuntime.jsx(AnswerDetail, { ...props }, props.answer.slug);
|
|
8022
|
+
}
|
|
8023
|
+
function AnswerDetail({
|
|
8024
|
+
productName,
|
|
8025
|
+
siteUrl,
|
|
8026
|
+
answer,
|
|
8027
|
+
answers,
|
|
8028
|
+
topics,
|
|
8029
|
+
imageOrigins,
|
|
8030
|
+
askHref = "/explore",
|
|
8031
|
+
cta,
|
|
8032
|
+
linkComponent,
|
|
8033
|
+
locale,
|
|
8034
|
+
className
|
|
8035
|
+
}) {
|
|
8036
|
+
const Link = linkComponent ?? DefaultAnswerLink;
|
|
8037
|
+
const base = normaliseSiteUrl2(siteUrl);
|
|
8038
|
+
const headingId = React.useId();
|
|
8039
|
+
const activeLocale = React.useMemo(() => resolveExploreLocale(locale), [locale]);
|
|
8040
|
+
const T = React.useMemo(() => answerStrings(activeLocale), [activeLocale]);
|
|
8041
|
+
const rtl = isRtlLocale(activeLocale);
|
|
8042
|
+
const dateLabel = React.useMemo(
|
|
8043
|
+
() => formatAnswerDate(answer.answeredAt, activeLocale),
|
|
8044
|
+
[answer.answeredAt, activeLocale]
|
|
8045
|
+
);
|
|
8046
|
+
const ordered = React.useMemo(() => sortByOrder2(answers), [answers]);
|
|
8047
|
+
const position = ordered.findIndex((item) => item.slug === answer.slug);
|
|
8048
|
+
const previous = position > 0 ? ordered[position - 1] : void 0;
|
|
8049
|
+
const next = position >= 0 && position < ordered.length - 1 ? ordered[position + 1] : void 0;
|
|
8050
|
+
const related = React.useMemo(() => {
|
|
8051
|
+
const bySlug = new Map(ordered.map((item) => [item.slug, item]));
|
|
8052
|
+
const curated = [...new Set(answer.related)].map((slug) => bySlug.get(slug)).filter(
|
|
8053
|
+
(item) => item !== void 0 && item.slug !== answer.slug
|
|
8054
|
+
);
|
|
8055
|
+
const list = curated.length > 0 ? curated : ordered.filter(
|
|
8056
|
+
(item) => item.topic === answer.topic && item.slug !== answer.slug
|
|
8057
|
+
);
|
|
8058
|
+
return list.slice(0, RELATED_LIMIT2);
|
|
8059
|
+
}, [answer, ordered]);
|
|
8060
|
+
const relatedIsCurated = answer.related.some(
|
|
8061
|
+
(slug) => related.some((item) => item.slug === slug)
|
|
8062
|
+
);
|
|
8063
|
+
const topicDescription = topics?.find(
|
|
8064
|
+
(topic) => topic.name === answer.topic
|
|
8065
|
+
)?.description;
|
|
8066
|
+
const sources = React.useMemo(
|
|
8067
|
+
() => publishableSources(answer.sources),
|
|
8068
|
+
[answer.sources]
|
|
8069
|
+
);
|
|
8070
|
+
const answerImageOrigins = React.useMemo(
|
|
8071
|
+
() => inlineImageOrigins([
|
|
8072
|
+
{ website: base },
|
|
8073
|
+
...sources.map((source) => ({ website: source.url })),
|
|
8074
|
+
...(imageOrigins ?? []).map((origin) => ({ website: origin }))
|
|
8075
|
+
]),
|
|
8076
|
+
[base, sources, imageOrigins]
|
|
8077
|
+
);
|
|
8078
|
+
const canonical = absoluteUrl2(base, answerPath(answer.slug));
|
|
8079
|
+
const answerText = React.useMemo(
|
|
8080
|
+
() => answerSpeechText(answer.answer),
|
|
8081
|
+
[answer.answer]
|
|
8082
|
+
);
|
|
8083
|
+
const structuredData = React.useMemo(
|
|
8084
|
+
() => [
|
|
8085
|
+
{
|
|
8086
|
+
"@context": "https://schema.org",
|
|
8087
|
+
"@type": "FAQPage",
|
|
8088
|
+
name: answer.question,
|
|
8089
|
+
description: answer.metaDescription,
|
|
8090
|
+
url: canonical,
|
|
8091
|
+
inLanguage: "en",
|
|
8092
|
+
isPartOf: { "@type": "WebSite", name: productName, url: `${base}/` },
|
|
8093
|
+
mainEntity: {
|
|
8094
|
+
"@type": "Question",
|
|
8095
|
+
name: answer.question,
|
|
8096
|
+
text: answer.question,
|
|
8097
|
+
answerCount: 1,
|
|
8098
|
+
acceptedAnswer: {
|
|
8099
|
+
"@type": "Answer",
|
|
8100
|
+
text: answerText,
|
|
8101
|
+
url: canonical,
|
|
8102
|
+
dateCreated: answer.answeredAt,
|
|
8103
|
+
// The organisation published it. Naming a person would be the one outright
|
|
8104
|
+
// false claim these pages could make.
|
|
8105
|
+
author: { "@type": "Organization", name: productName },
|
|
8106
|
+
...sources.length > 0 ? {
|
|
8107
|
+
citation: sources.map((source) => ({
|
|
8108
|
+
"@type": "WebPage",
|
|
8109
|
+
name: source.title,
|
|
8110
|
+
url: source.url
|
|
8111
|
+
}))
|
|
8112
|
+
} : {}
|
|
8113
|
+
}
|
|
8114
|
+
}
|
|
8115
|
+
},
|
|
8116
|
+
{
|
|
8117
|
+
"@context": "https://schema.org",
|
|
8118
|
+
"@type": "BreadcrumbList",
|
|
8119
|
+
itemListElement: [
|
|
8120
|
+
{
|
|
8121
|
+
"@type": "ListItem",
|
|
8122
|
+
position: 1,
|
|
8123
|
+
name: T.breadcrumbHome,
|
|
8124
|
+
item: `${base}/`
|
|
8125
|
+
},
|
|
8126
|
+
{
|
|
8127
|
+
"@type": "ListItem",
|
|
8128
|
+
position: 2,
|
|
8129
|
+
name: T.answers,
|
|
8130
|
+
item: `${base}${ANSWERS_PATH}`
|
|
8131
|
+
},
|
|
8132
|
+
{
|
|
8133
|
+
"@type": "ListItem",
|
|
8134
|
+
position: 3,
|
|
8135
|
+
name: answer.question,
|
|
8136
|
+
item: canonical
|
|
8137
|
+
}
|
|
8138
|
+
]
|
|
8139
|
+
}
|
|
8140
|
+
],
|
|
8141
|
+
[answer, answerText, base, canonical, productName, sources, T]
|
|
8142
|
+
);
|
|
8143
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8144
|
+
"article",
|
|
8145
|
+
{
|
|
8146
|
+
"data-answers": "detail",
|
|
8147
|
+
"data-slug": answer.slug,
|
|
8148
|
+
"data-locale": activeLocale,
|
|
8149
|
+
"aria-labelledby": headingId,
|
|
8150
|
+
dir: rtl ? "rtl" : void 0,
|
|
8151
|
+
className: cn("bg-background text-foreground", className),
|
|
8152
|
+
children: [
|
|
8153
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8154
|
+
PageHead,
|
|
8155
|
+
{
|
|
8156
|
+
title: clampText2(answer.question, TITLE_LIMIT),
|
|
8157
|
+
description: answer.metaDescription,
|
|
8158
|
+
productName,
|
|
8159
|
+
keywords: answer.keywords.join(", "),
|
|
8160
|
+
url: canonical,
|
|
8161
|
+
structuredData
|
|
8162
|
+
}
|
|
8163
|
+
),
|
|
8164
|
+
/* @__PURE__ */ jsxRuntime.jsx(ProseStyles, {}),
|
|
8165
|
+
/* @__PURE__ */ jsxRuntime.jsx(ExploreAnswerStyles, {}),
|
|
8166
|
+
/* @__PURE__ */ jsxRuntime.jsx("header", { className: "border-b border-border bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-4xl px-4 pb-10 pt-8 sm:px-6 lg:px-8", children: [
|
|
8167
|
+
/* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsxRuntime.jsxs("ol", { className: "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground", children: [
|
|
8168
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "inline-flex items-center gap-1.5", children: [
|
|
8169
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8170
|
+
Link,
|
|
8171
|
+
{
|
|
8172
|
+
href: "/",
|
|
8173
|
+
className: "rounded hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8174
|
+
children: T.breadcrumbHome
|
|
8175
|
+
}
|
|
8176
|
+
),
|
|
8177
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": "true", className: "h-3.5 w-3.5" })
|
|
8178
|
+
] }),
|
|
8179
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "inline-flex items-center gap-1.5", children: [
|
|
8180
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8181
|
+
Link,
|
|
8182
|
+
{
|
|
8183
|
+
href: ANSWERS_PATH,
|
|
8184
|
+
className: "rounded hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8185
|
+
children: T.answers
|
|
8186
|
+
}
|
|
8187
|
+
),
|
|
8188
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": "true", className: "h-3.5 w-3.5" })
|
|
8189
|
+
] }),
|
|
8190
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8191
|
+
"li",
|
|
8192
|
+
{
|
|
8193
|
+
"aria-current": "page",
|
|
8194
|
+
...ENGLISH_TEXT,
|
|
8195
|
+
className: "min-w-0 truncate text-foreground",
|
|
8196
|
+
children: answer.question
|
|
8197
|
+
}
|
|
8198
|
+
)
|
|
8199
|
+
] }) }),
|
|
8200
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6 flex flex-wrap items-center gap-2", children: [
|
|
8201
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8202
|
+
"span",
|
|
8203
|
+
{
|
|
8204
|
+
"data-answers": "topic",
|
|
8205
|
+
title: topicDescription,
|
|
8206
|
+
className: "inline-flex items-center rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs font-semibold text-primary",
|
|
8207
|
+
children: answer.topic
|
|
8208
|
+
}
|
|
8209
|
+
),
|
|
8210
|
+
dateLabel ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center rounded-full border border-border bg-background px-3 py-1 text-xs font-medium text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx("time", { dateTime: answer.answeredAt, children: fill(T.answeredOn, { date: dateLabel }) }) }) : null
|
|
8211
|
+
] }),
|
|
8212
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8213
|
+
"h1",
|
|
8214
|
+
{
|
|
8215
|
+
id: headingId,
|
|
8216
|
+
...ENGLISH_TEXT,
|
|
8217
|
+
className: "mt-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl",
|
|
8218
|
+
children: answer.question
|
|
8219
|
+
}
|
|
8220
|
+
),
|
|
8221
|
+
answer.summary ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
8222
|
+
"p",
|
|
8223
|
+
{
|
|
8224
|
+
...ENGLISH_TEXT,
|
|
8225
|
+
className: "mt-4 text-lg leading-relaxed text-muted-foreground",
|
|
8226
|
+
children: answer.summary
|
|
8227
|
+
}
|
|
8228
|
+
) : null,
|
|
8229
|
+
/* @__PURE__ */ jsxRuntime.jsx(ProvenanceNote, { strings: T, date: dateLabel, className: "mt-6" })
|
|
8230
|
+
] }) }),
|
|
8231
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-4xl px-4 py-12 sm:px-6 lg:px-8", children: [
|
|
8232
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-labelledby": `${headingId}-answer`, children: [
|
|
8233
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: `${headingId}-answer`, className: SECTION_HEADING2, children: T.answerHeading }),
|
|
8234
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-answers": "body", ...ENGLISH_TEXT, dir: "ltr", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8235
|
+
ExploreAnswerBody,
|
|
8236
|
+
{
|
|
8237
|
+
strings: T,
|
|
8238
|
+
imageOrigins: answerImageOrigins,
|
|
8239
|
+
components: ANSWER_HEADING_SHIFT,
|
|
8240
|
+
className: "mt-4",
|
|
8241
|
+
children: answer.answer
|
|
8242
|
+
}
|
|
8243
|
+
) })
|
|
8244
|
+
] }),
|
|
8245
|
+
sources.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8246
|
+
"section",
|
|
8247
|
+
{
|
|
8248
|
+
"aria-labelledby": `${headingId}-sources`,
|
|
8249
|
+
"data-answers": "sources",
|
|
8250
|
+
className: "mt-14",
|
|
8251
|
+
children: [
|
|
8252
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: `${headingId}-sources`, className: SECTION_HEADING2, children: T.sourcesHeading }),
|
|
8253
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-muted-foreground", children: T.sourcesLead }),
|
|
8254
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8255
|
+
"ul",
|
|
8256
|
+
{
|
|
8257
|
+
role: "list",
|
|
8258
|
+
className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
8259
|
+
children: sources.map((source) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source, strings: T }) }, source.url))
|
|
8260
|
+
}
|
|
8261
|
+
)
|
|
8262
|
+
]
|
|
8263
|
+
}
|
|
8264
|
+
) : null,
|
|
8265
|
+
answer.keywords.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-labelledby": `${headingId}-topics`, className: "mt-14", children: [
|
|
8266
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: `${headingId}-topics`, className: SECTION_HEADING2, children: T.topicsHeading }),
|
|
8267
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { role: "list", className: "mt-4 flex flex-wrap gap-2", children: answer.keywords.map((keyword, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: CHIP2, children: keyword }, copyKey2(index, keyword))) })
|
|
8268
|
+
] }) : null,
|
|
8269
|
+
related.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8270
|
+
"section",
|
|
8271
|
+
{
|
|
8272
|
+
"aria-labelledby": `${headingId}-related`,
|
|
8273
|
+
"data-answers": "related",
|
|
8274
|
+
className: "mt-14",
|
|
8275
|
+
children: [
|
|
8276
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { id: `${headingId}-related`, className: SECTION_HEADING2, children: relatedIsCurated ? T.relatedHeading : fill(T.moreInTopic, { topic: answer.topic }) }),
|
|
8277
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8278
|
+
"ul",
|
|
8279
|
+
{
|
|
8280
|
+
role: "list",
|
|
8281
|
+
className: "mt-6 grid grid-cols-1 gap-5 sm:grid-cols-2",
|
|
8282
|
+
children: related.map((item) => /* @__PURE__ */ jsxRuntime.jsx("li", { "data-answers": "card", "data-slug": item.slug, children: /* @__PURE__ */ jsxRuntime.jsx(AnswerCard, { answer: item, strings: T, Link }) }, item.slug))
|
|
8283
|
+
}
|
|
8284
|
+
)
|
|
8285
|
+
]
|
|
8286
|
+
}
|
|
8287
|
+
) : null,
|
|
8288
|
+
previous || next ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8289
|
+
"nav",
|
|
8290
|
+
{
|
|
8291
|
+
"aria-label": `${T.previousQuestion} / ${T.nextQuestion}`,
|
|
8292
|
+
"data-answers": "pager",
|
|
8293
|
+
className: "mt-14 grid gap-4 sm:grid-cols-2",
|
|
8294
|
+
children: [
|
|
8295
|
+
previous ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8296
|
+
Link,
|
|
8297
|
+
{
|
|
8298
|
+
href: answerPath(previous.slug),
|
|
8299
|
+
className: "group flex items-center gap-3 rounded-2xl border border-border bg-card p-4 text-card-foreground transition-colors hover:border-primary/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8300
|
+
children: [
|
|
8301
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8302
|
+
lucideReact.ArrowLeft,
|
|
8303
|
+
{
|
|
8304
|
+
"aria-hidden": "true",
|
|
8305
|
+
className: "h-5 w-5 shrink-0 text-muted-foreground transition-colors group-hover:text-primary"
|
|
8306
|
+
}
|
|
8307
|
+
),
|
|
8308
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
|
|
8309
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs font-medium uppercase tracking-wide text-muted-foreground", children: T.previousQuestion }),
|
|
8310
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8311
|
+
"span",
|
|
8312
|
+
{
|
|
8313
|
+
...ENGLISH_TEXT,
|
|
8314
|
+
className: "block truncate font-semibold",
|
|
8315
|
+
children: previous.question
|
|
8316
|
+
}
|
|
8317
|
+
)
|
|
8318
|
+
] })
|
|
8319
|
+
]
|
|
8320
|
+
}
|
|
8321
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:block" }),
|
|
8322
|
+
next ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8323
|
+
Link,
|
|
8324
|
+
{
|
|
8325
|
+
href: answerPath(next.slug),
|
|
8326
|
+
className: "group flex items-center justify-end gap-3 rounded-2xl border border-border bg-card p-4 text-right text-card-foreground transition-colors hover:border-primary/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8327
|
+
children: [
|
|
8328
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
|
|
8329
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs font-medium uppercase tracking-wide text-muted-foreground", children: T.nextQuestion }),
|
|
8330
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8331
|
+
"span",
|
|
8332
|
+
{
|
|
8333
|
+
...ENGLISH_TEXT,
|
|
8334
|
+
className: "block truncate font-semibold",
|
|
8335
|
+
children: next.question
|
|
8336
|
+
}
|
|
8337
|
+
)
|
|
8338
|
+
] }),
|
|
8339
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8340
|
+
lucideReact.ArrowRight,
|
|
8341
|
+
{
|
|
8342
|
+
"aria-hidden": "true",
|
|
8343
|
+
className: "h-5 w-5 shrink-0 text-muted-foreground transition-colors group-hover:text-primary"
|
|
8344
|
+
}
|
|
8345
|
+
)
|
|
8346
|
+
]
|
|
8347
|
+
}
|
|
8348
|
+
) : null
|
|
8349
|
+
]
|
|
8350
|
+
}
|
|
8351
|
+
) : null,
|
|
8352
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-10 flex flex-wrap items-center gap-x-6 gap-y-3", children: [
|
|
8353
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8354
|
+
Link,
|
|
8355
|
+
{
|
|
8356
|
+
href: ANSWERS_PATH,
|
|
8357
|
+
className: "inline-flex items-center gap-2 rounded text-sm font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8358
|
+
children: [
|
|
8359
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { "aria-hidden": "true", className: "h-4 w-4" }),
|
|
8360
|
+
fill(T.allAnswers, { product: productName })
|
|
8361
|
+
]
|
|
8362
|
+
}
|
|
8363
|
+
),
|
|
8364
|
+
askHref ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8365
|
+
Link,
|
|
8366
|
+
{
|
|
8367
|
+
href: askHref,
|
|
8368
|
+
className: "inline-flex items-center gap-2 rounded text-sm font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
8369
|
+
children: [
|
|
8370
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { "aria-hidden": "true", className: "h-4 w-4" }),
|
|
8371
|
+
T.askYourOwn
|
|
8372
|
+
]
|
|
8373
|
+
}
|
|
8374
|
+
) : null
|
|
8375
|
+
] })
|
|
8376
|
+
] }),
|
|
8377
|
+
cta ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
8378
|
+
"section",
|
|
8379
|
+
{
|
|
8380
|
+
"data-answers": "cta",
|
|
8381
|
+
className: "border-t border-border bg-muted/30",
|
|
8382
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-4xl flex-wrap items-center gap-4 px-4 py-12 sm:px-6 lg:px-8", children: cta })
|
|
8383
|
+
}
|
|
8384
|
+
) : null
|
|
8385
|
+
]
|
|
8386
|
+
}
|
|
8387
|
+
);
|
|
8388
|
+
}
|
|
8389
|
+
|
|
6500
8390
|
// src/components/explore-types.ts
|
|
6501
8391
|
var EXPLORE_FEEDBACK_REASONS = [
|
|
6502
8392
|
"INACCURATE",
|
|
@@ -6640,225 +8530,72 @@ var RECORD_EXPLORE_CLICK_MUTATION = (
|
|
|
6640
8530
|
/* GraphQL */
|
|
6641
8531
|
`
|
|
6642
8532
|
mutation RecordExploreClick($input: RecordExploreClickInput!) {
|
|
6643
|
-
recordExploreClick(input: $input) {
|
|
6644
|
-
recorded
|
|
6645
|
-
}
|
|
6646
|
-
}
|
|
6647
|
-
`
|
|
6648
|
-
);
|
|
6649
|
-
var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
|
|
6650
|
-
/* GraphQL */
|
|
6651
|
-
`
|
|
6652
|
-
mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
|
|
6653
|
-
submitExploreFeedback(input: $input) {
|
|
6654
|
-
recorded
|
|
6655
|
-
feedback {
|
|
6656
|
-
rating
|
|
6657
|
-
reason
|
|
6658
|
-
comment
|
|
6659
|
-
createdAt
|
|
6660
|
-
}
|
|
6661
|
-
}
|
|
6662
|
-
}
|
|
6663
|
-
`
|
|
6664
|
-
);
|
|
6665
|
-
var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
|
|
6666
|
-
var
|
|
6667
|
-
/* GraphQL */
|
|
6668
|
-
`
|
|
6669
|
-
mutation
|
|
6670
|
-
|
|
6671
|
-
|
|
6672
|
-
|
|
6673
|
-
|
|
6674
|
-
|
|
6675
|
-
|
|
6676
|
-
|
|
6677
|
-
|
|
6678
|
-
|
|
6679
|
-
|
|
6680
|
-
|
|
6681
|
-
|
|
6682
|
-
|
|
6683
|
-
|
|
6684
|
-
|
|
6685
|
-
);
|
|
6686
|
-
|
|
6687
|
-
.
|
|
6688
|
-
max-width: none;
|
|
6689
|
-
}
|
|
6690
|
-
|
|
6691
|
-
.boff-prose h1 {
|
|
6692
|
-
font-size: 2.25rem;
|
|
6693
|
-
font-weight: 800;
|
|
6694
|
-
line-height: 1.2;
|
|
6695
|
-
margin-top: 0;
|
|
6696
|
-
margin-bottom: 1rem;
|
|
6697
|
-
color: hsl(var(--foreground));
|
|
6698
|
-
}
|
|
6699
|
-
|
|
6700
|
-
.boff-prose h2 {
|
|
6701
|
-
font-size: 1.75rem;
|
|
6702
|
-
font-weight: 700;
|
|
6703
|
-
line-height: 1.3;
|
|
6704
|
-
margin-top: 2rem;
|
|
6705
|
-
margin-bottom: 1rem;
|
|
6706
|
-
color: hsl(var(--foreground));
|
|
6707
|
-
}
|
|
6708
|
-
|
|
6709
|
-
.boff-prose h3 {
|
|
6710
|
-
font-size: 1.5rem;
|
|
6711
|
-
font-weight: 600;
|
|
6712
|
-
line-height: 1.4;
|
|
6713
|
-
margin-top: 1.5rem;
|
|
6714
|
-
margin-bottom: 0.75rem;
|
|
6715
|
-
color: hsl(var(--foreground));
|
|
6716
|
-
}
|
|
6717
|
-
|
|
6718
|
-
.boff-prose h4 {
|
|
6719
|
-
font-size: 1.25rem;
|
|
6720
|
-
font-weight: 600;
|
|
6721
|
-
line-height: 1.5;
|
|
6722
|
-
margin-top: 1.25rem;
|
|
6723
|
-
margin-bottom: 0.5rem;
|
|
6724
|
-
color: hsl(var(--foreground));
|
|
6725
|
-
}
|
|
6726
|
-
|
|
6727
|
-
.boff-prose p {
|
|
6728
|
-
margin-bottom: 1rem;
|
|
6729
|
-
line-height: 1.75;
|
|
6730
|
-
color: hsl(var(--foreground));
|
|
6731
|
-
}
|
|
6732
|
-
|
|
6733
|
-
.boff-prose ul,
|
|
6734
|
-
.boff-prose ol {
|
|
6735
|
-
margin-bottom: 1rem;
|
|
6736
|
-
padding-left: 1.5rem;
|
|
6737
|
-
}
|
|
6738
|
-
|
|
6739
|
-
.boff-prose ul {
|
|
6740
|
-
list-style-type: disc;
|
|
6741
|
-
}
|
|
6742
|
-
|
|
6743
|
-
.boff-prose ol {
|
|
6744
|
-
list-style-type: decimal;
|
|
6745
|
-
}
|
|
6746
|
-
|
|
6747
|
-
.boff-prose li {
|
|
6748
|
-
margin-bottom: 0.25rem;
|
|
6749
|
-
line-height: 1.75;
|
|
6750
|
-
color: hsl(var(--foreground));
|
|
6751
|
-
}
|
|
6752
|
-
|
|
6753
|
-
.boff-prose li > ul,
|
|
6754
|
-
.boff-prose li > ol {
|
|
6755
|
-
margin-top: 0.25rem;
|
|
6756
|
-
margin-bottom: 0.25rem;
|
|
6757
|
-
}
|
|
6758
|
-
|
|
6759
|
-
.boff-prose a {
|
|
6760
|
-
color: hsl(var(--primary));
|
|
6761
|
-
text-decoration: underline;
|
|
6762
|
-
text-underline-offset: 2px;
|
|
6763
|
-
}
|
|
6764
|
-
|
|
6765
|
-
.boff-prose a:hover {
|
|
6766
|
-
opacity: 0.8;
|
|
6767
|
-
}
|
|
6768
|
-
|
|
6769
|
-
.boff-prose hr {
|
|
6770
|
-
border: none;
|
|
6771
|
-
height: 1px;
|
|
6772
|
-
background-color: hsl(var(--border));
|
|
6773
|
-
margin: 2rem 0;
|
|
6774
|
-
}
|
|
6775
|
-
|
|
6776
|
-
.boff-prose blockquote {
|
|
6777
|
-
border-left: 4px solid hsl(var(--border));
|
|
6778
|
-
padding-left: 1rem;
|
|
6779
|
-
margin: 1.5rem 0;
|
|
6780
|
-
font-style: italic;
|
|
6781
|
-
color: hsl(var(--muted-foreground));
|
|
6782
|
-
}
|
|
6783
|
-
|
|
6784
|
-
.boff-prose strong {
|
|
6785
|
-
font-weight: 700;
|
|
6786
|
-
color: hsl(var(--foreground));
|
|
6787
|
-
}
|
|
6788
|
-
|
|
6789
|
-
.boff-prose code {
|
|
6790
|
-
background-color: hsl(var(--muted));
|
|
6791
|
-
padding: 0.125rem 0.25rem;
|
|
6792
|
-
border-radius: 0.25rem;
|
|
6793
|
-
font-size: 0.875em;
|
|
6794
|
-
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
6795
|
-
}
|
|
6796
|
-
|
|
6797
|
-
.boff-prose pre {
|
|
6798
|
-
background-color: hsl(var(--muted));
|
|
6799
|
-
padding: 1rem;
|
|
6800
|
-
border-radius: 0.5rem;
|
|
6801
|
-
overflow-x: auto;
|
|
6802
|
-
margin-bottom: 1rem;
|
|
6803
|
-
}
|
|
6804
|
-
|
|
6805
|
-
.boff-prose pre code {
|
|
6806
|
-
background-color: transparent;
|
|
6807
|
-
padding: 0;
|
|
6808
|
-
}
|
|
6809
|
-
|
|
6810
|
-
.boff-prose img {
|
|
6811
|
-
max-width: 100%;
|
|
6812
|
-
height: auto;
|
|
6813
|
-
}
|
|
6814
|
-
|
|
6815
|
-
.boff-prose table {
|
|
6816
|
-
width: 100%;
|
|
6817
|
-
border-collapse: collapse;
|
|
6818
|
-
margin-bottom: 1rem;
|
|
6819
|
-
}
|
|
6820
|
-
|
|
6821
|
-
.boff-prose th,
|
|
6822
|
-
.boff-prose td {
|
|
6823
|
-
border: 1px solid hsl(var(--border));
|
|
6824
|
-
padding: 0.5rem;
|
|
6825
|
-
text-align: left;
|
|
6826
|
-
}
|
|
6827
|
-
|
|
6828
|
-
.boff-prose th {
|
|
6829
|
-
font-weight: 600;
|
|
6830
|
-
background-color: hsl(var(--muted));
|
|
6831
|
-
}
|
|
6832
|
-
|
|
6833
|
-
/* Smaller variant used inside cards and compact panels */
|
|
6834
|
-
.boff-prose-sm {
|
|
6835
|
-
font-size: 0.875rem;
|
|
6836
|
-
}
|
|
6837
|
-
|
|
6838
|
-
.boff-prose-sm h1 {
|
|
6839
|
-
font-size: 1.75rem;
|
|
6840
|
-
}
|
|
6841
|
-
|
|
6842
|
-
.boff-prose-sm h2 {
|
|
6843
|
-
font-size: 1.5rem;
|
|
6844
|
-
}
|
|
6845
|
-
|
|
6846
|
-
.boff-prose-sm h3 {
|
|
6847
|
-
font-size: 1.25rem;
|
|
6848
|
-
}
|
|
6849
|
-
|
|
6850
|
-
.boff-prose-sm h4 {
|
|
6851
|
-
font-size: 1.125rem;
|
|
6852
|
-
}
|
|
6853
|
-
|
|
6854
|
-
.boff-prose-sm p,
|
|
6855
|
-
.boff-prose-sm li {
|
|
6856
|
-
line-height: 1.625;
|
|
6857
|
-
}
|
|
6858
|
-
`;
|
|
6859
|
-
function ProseStyles() {
|
|
6860
|
-
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: PROSE_CSS } });
|
|
8533
|
+
recordExploreClick(input: $input) {
|
|
8534
|
+
recorded
|
|
8535
|
+
}
|
|
8536
|
+
}
|
|
8537
|
+
`
|
|
8538
|
+
);
|
|
8539
|
+
var SUBMIT_EXPLORE_FEEDBACK_MUTATION = (
|
|
8540
|
+
/* GraphQL */
|
|
8541
|
+
`
|
|
8542
|
+
mutation SubmitExploreFeedback($input: SubmitExploreFeedbackInput!) {
|
|
8543
|
+
submitExploreFeedback(input: $input) {
|
|
8544
|
+
recorded
|
|
8545
|
+
feedback {
|
|
8546
|
+
rating
|
|
8547
|
+
reason
|
|
8548
|
+
comment
|
|
8549
|
+
createdAt
|
|
8550
|
+
}
|
|
8551
|
+
}
|
|
8552
|
+
}
|
|
8553
|
+
`
|
|
8554
|
+
);
|
|
8555
|
+
var EXPLORE_FEEDBACK_COMMENT_SOFT_MAX = 500;
|
|
8556
|
+
var ESCALATE_EXPLORE_CONVERSATION_MUTATION = (
|
|
8557
|
+
/* GraphQL */
|
|
8558
|
+
`
|
|
8559
|
+
mutation EscalateExploreConversation(
|
|
8560
|
+
$input: EscalateExploreConversationInput!
|
|
8561
|
+
) {
|
|
8562
|
+
escalateExploreConversation(input: $input) {
|
|
8563
|
+
created
|
|
8564
|
+
escalation {
|
|
8565
|
+
email
|
|
8566
|
+
createdAt
|
|
8567
|
+
}
|
|
8568
|
+
}
|
|
8569
|
+
}
|
|
8570
|
+
`
|
|
8571
|
+
);
|
|
8572
|
+
var EXPLORE_ESCALATION_NOTE_SOFT_MAX = 2e3;
|
|
8573
|
+
var DELIVERABLE_EMAIL = /^[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/;
|
|
8574
|
+
function looksLikeDeliverableEmail(value) {
|
|
8575
|
+
const trimmed = value.trim();
|
|
8576
|
+
if (trimmed.length === 0 || trimmed.length > 254) return false;
|
|
8577
|
+
return DELIVERABLE_EMAIL.test(trimmed);
|
|
6861
8578
|
}
|
|
8579
|
+
var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
|
|
8580
|
+
/* GraphQL */
|
|
8581
|
+
`
|
|
8582
|
+
mutation CreateExploreShareLink($conversationToken: String!) {
|
|
8583
|
+
createExploreShareLink(conversationToken: $conversationToken) {
|
|
8584
|
+
shareToken
|
|
8585
|
+
}
|
|
8586
|
+
}
|
|
8587
|
+
`
|
|
8588
|
+
);
|
|
8589
|
+
var EXPLORE_SHARED_CONVERSATION_QUERY = (
|
|
8590
|
+
/* GraphQL */
|
|
8591
|
+
`
|
|
8592
|
+
query ExploreSharedConversation($shareToken: String!) {
|
|
8593
|
+
exploreSharedConversation(shareToken: $shareToken) {
|
|
8594
|
+
${EXPLORE_MESSAGE_FIELDS}
|
|
8595
|
+
}
|
|
8596
|
+
}
|
|
8597
|
+
`
|
|
8598
|
+
);
|
|
6862
8599
|
|
|
6863
8600
|
// src/data/products.ts
|
|
6864
8601
|
var ECOSYSTEM_PRODUCTS = [
|
|
@@ -7205,6 +8942,25 @@ var VALIDATION_CODES = /* @__PURE__ */ new Set([
|
|
|
7205
8942
|
"CONVERSATION_LIMIT",
|
|
7206
8943
|
"INVALID_INPUT"
|
|
7207
8944
|
]);
|
|
8945
|
+
function escalateOutcomeForCode(code) {
|
|
8946
|
+
switch (code) {
|
|
8947
|
+
case "INVALID_EMAIL":
|
|
8948
|
+
return "invalid-email";
|
|
8949
|
+
case "RATE_LIMITED":
|
|
8950
|
+
case "HTTP_429":
|
|
8951
|
+
return "rate-limited";
|
|
8952
|
+
case "CAPTCHA_REQUIRED":
|
|
8953
|
+
case "CAPTCHA_FAILED":
|
|
8954
|
+
return "captcha";
|
|
8955
|
+
// The token owns nothing, or owns a different conversation. The server answers NOT_FOUND
|
|
8956
|
+
// rather than FORBIDDEN so the endpoint is not an oracle for whether a thread exists;
|
|
8957
|
+
// either way there is nothing this visitor can do about it, so it reads as a failure.
|
|
8958
|
+
case "NOT_FOUND":
|
|
8959
|
+
return "failed";
|
|
8960
|
+
default:
|
|
8961
|
+
return "failed";
|
|
8962
|
+
}
|
|
8963
|
+
}
|
|
7208
8964
|
function classifyExploreError(code, serverMessage) {
|
|
7209
8965
|
const c = code ?? "UNKNOWN";
|
|
7210
8966
|
if (RATE_LIMIT_CODES.has(c)) {
|
|
@@ -7371,6 +9127,7 @@ function useExploreChat(options = {}) {
|
|
|
7371
9127
|
onSend
|
|
7372
9128
|
} = options;
|
|
7373
9129
|
const client = useWebSDK();
|
|
9130
|
+
const { productId } = useWebSDKConfig();
|
|
7374
9131
|
const promptKey = JSON.stringify(examplePrompts ?? []);
|
|
7375
9132
|
const welcomeKey = JSON.stringify(fallbackWelcome ?? null);
|
|
7376
9133
|
const fallbackCatalog = React.useMemo(
|
|
@@ -7394,6 +9151,7 @@ function useExploreChat(options = {}) {
|
|
|
7394
9151
|
const pollGenerationRef = React.useRef(0);
|
|
7395
9152
|
const pollTimerRef = React.useRef(null);
|
|
7396
9153
|
const conversationTokenRef = React.useRef(null);
|
|
9154
|
+
const [hasConversation, setHasConversation] = React.useState(false);
|
|
7397
9155
|
const shareTokenRef = React.useRef(void 0);
|
|
7398
9156
|
if (shareTokenRef.current === void 0) {
|
|
7399
9157
|
shareTokenRef.current = readShareToken();
|
|
@@ -7408,6 +9166,10 @@ function useExploreChat(options = {}) {
|
|
|
7408
9166
|
);
|
|
7409
9167
|
const inFlightRef = React.useRef(false);
|
|
7410
9168
|
catalogRef.current = catalog;
|
|
9169
|
+
const rememberConversationToken = React.useCallback((token) => {
|
|
9170
|
+
conversationTokenRef.current = token;
|
|
9171
|
+
setHasConversation(token !== null);
|
|
9172
|
+
}, []);
|
|
7411
9173
|
const clearPollTimer = React.useCallback(() => {
|
|
7412
9174
|
if (pollTimerRef.current !== null) {
|
|
7413
9175
|
clearTimeout(pollTimerRef.current);
|
|
@@ -7474,7 +9236,7 @@ function useExploreChat(options = {}) {
|
|
|
7474
9236
|
setArchive(readArchive(storageKey));
|
|
7475
9237
|
const stored = readPersisted(storageKey);
|
|
7476
9238
|
if (stored) {
|
|
7477
|
-
|
|
9239
|
+
rememberConversationToken(stored.conversationToken);
|
|
7478
9240
|
focusProductRef.current = stored.focusProduct;
|
|
7479
9241
|
const settled = stored.messages.flatMap((m) => {
|
|
7480
9242
|
if (m.role !== "ASSISTANT") return [m];
|
|
@@ -7490,7 +9252,7 @@ function useExploreChat(options = {}) {
|
|
|
7490
9252
|
setTurnCount(turns);
|
|
7491
9253
|
}
|
|
7492
9254
|
setHydrated(true);
|
|
7493
|
-
}, [persist, storageKey]);
|
|
9255
|
+
}, [persist, rememberConversationToken, storageKey]);
|
|
7494
9256
|
React.useEffect(() => {
|
|
7495
9257
|
if (!persist || !hydrated || typeof window === "undefined") return;
|
|
7496
9258
|
try {
|
|
@@ -7683,7 +9445,7 @@ function useExploreChat(options = {}) {
|
|
|
7683
9445
|
setPhase(classified.kind === "rate-limit" ? "limited" : "error");
|
|
7684
9446
|
return;
|
|
7685
9447
|
}
|
|
7686
|
-
|
|
9448
|
+
rememberConversationToken(result.conversation.token);
|
|
7687
9449
|
turnCountRef.current = result.conversation.turnCount;
|
|
7688
9450
|
setTurnCount(result.conversation.turnCount);
|
|
7689
9451
|
setRemainingToday(result.remainingToday ?? null);
|
|
@@ -7709,7 +9471,14 @@ function useExploreChat(options = {}) {
|
|
|
7709
9471
|
setPhase("streaming");
|
|
7710
9472
|
startPolling(result.conversation.token, assistantMessage.id);
|
|
7711
9473
|
},
|
|
7712
|
-
[
|
|
9474
|
+
[
|
|
9475
|
+
client,
|
|
9476
|
+
locale,
|
|
9477
|
+
pageUrl,
|
|
9478
|
+
productSlug,
|
|
9479
|
+
rememberConversationToken,
|
|
9480
|
+
startPolling
|
|
9481
|
+
]
|
|
7713
9482
|
);
|
|
7714
9483
|
const send = React.useCallback(
|
|
7715
9484
|
async (message, attachments = []) => {
|
|
@@ -7826,7 +9595,7 @@ function useExploreChat(options = {}) {
|
|
|
7826
9595
|
);
|
|
7827
9596
|
cancelPolling();
|
|
7828
9597
|
inFlightRef.current = false;
|
|
7829
|
-
|
|
9598
|
+
rememberConversationToken(null);
|
|
7830
9599
|
lastSentTextRef.current = null;
|
|
7831
9600
|
lastSentAttachmentsRef.current = [];
|
|
7832
9601
|
turnCountRef.current = 0;
|
|
@@ -7841,7 +9610,7 @@ function useExploreChat(options = {}) {
|
|
|
7841
9610
|
} catch {
|
|
7842
9611
|
}
|
|
7843
9612
|
}
|
|
7844
|
-
}, [cancelPolling, storageKey]);
|
|
9613
|
+
}, [cancelPolling, rememberConversationToken, storageKey]);
|
|
7845
9614
|
const openConversation = React.useCallback(
|
|
7846
9615
|
(token) => {
|
|
7847
9616
|
const entry = readArchive(storageKey).find((e) => e.token === token);
|
|
@@ -7853,7 +9622,7 @@ function useExploreChat(options = {}) {
|
|
|
7853
9622
|
});
|
|
7854
9623
|
cancelPolling();
|
|
7855
9624
|
inFlightRef.current = false;
|
|
7856
|
-
|
|
9625
|
+
rememberConversationToken(entry.token);
|
|
7857
9626
|
turnCountRef.current = entry.messages.filter(
|
|
7858
9627
|
(m) => m.role === "USER"
|
|
7859
9628
|
).length;
|
|
@@ -7865,7 +9634,7 @@ function useExploreChat(options = {}) {
|
|
|
7865
9634
|
setPhase(catalogRef.current.enabled ? "ready" : "disabled");
|
|
7866
9635
|
setArchive(readArchive(storageKey));
|
|
7867
9636
|
},
|
|
7868
|
-
[cancelPolling, storageKey]
|
|
9637
|
+
[cancelPolling, rememberConversationToken, storageKey]
|
|
7869
9638
|
);
|
|
7870
9639
|
const deleteConversation = React.useCallback(
|
|
7871
9640
|
(token) => {
|
|
@@ -7954,6 +9723,69 @@ function useExploreChat(options = {}) {
|
|
|
7954
9723
|
},
|
|
7955
9724
|
[client]
|
|
7956
9725
|
);
|
|
9726
|
+
const escalate = React.useCallback(
|
|
9727
|
+
async (email, note) => {
|
|
9728
|
+
const token = conversationTokenRef.current;
|
|
9729
|
+
if (!token) {
|
|
9730
|
+
return { outcome: "no-conversation", email: null, createdAt: null };
|
|
9731
|
+
}
|
|
9732
|
+
const attempt = async (captchaAttempt) => {
|
|
9733
|
+
const activeCatalog = catalogRef.current;
|
|
9734
|
+
let recaptchaToken;
|
|
9735
|
+
if (activeCatalog.captchaRequired && activeCatalog.recaptchaSiteKey) {
|
|
9736
|
+
try {
|
|
9737
|
+
recaptchaToken = await getRecaptchaV3Token(
|
|
9738
|
+
activeCatalog.recaptchaSiteKey
|
|
9739
|
+
);
|
|
9740
|
+
} catch (err) {
|
|
9741
|
+
console.warn(
|
|
9742
|
+
"[WebSDK] reCAPTCHA v3 token could not be minted",
|
|
9743
|
+
err
|
|
9744
|
+
);
|
|
9745
|
+
}
|
|
9746
|
+
}
|
|
9747
|
+
const input = {
|
|
9748
|
+
conversationToken: token,
|
|
9749
|
+
email: email.trim(),
|
|
9750
|
+
note: note?.trim() ? note.trim() : null,
|
|
9751
|
+
...recaptchaToken ? { recaptchaToken } : {},
|
|
9752
|
+
...productId ? { productId } : {}
|
|
9753
|
+
};
|
|
9754
|
+
try {
|
|
9755
|
+
const res = await client.mutate(
|
|
9756
|
+
ESCALATE_EXPLORE_CONVERSATION_MUTATION,
|
|
9757
|
+
{ input }
|
|
9758
|
+
);
|
|
9759
|
+
const first = res?.errors?.[0];
|
|
9760
|
+
const result = res?.data?.escalateExploreConversation;
|
|
9761
|
+
if (first || !result) {
|
|
9762
|
+
const code = typeof first?.extensions?.code === "string" ? first.extensions.code : "ESCALATION_FAILED";
|
|
9763
|
+
if (code === "CAPTCHA_FAILED" && captchaAttempt === 0) {
|
|
9764
|
+
return attempt(1);
|
|
9765
|
+
}
|
|
9766
|
+
return {
|
|
9767
|
+
outcome: escalateOutcomeForCode(code),
|
|
9768
|
+
email: null,
|
|
9769
|
+
createdAt: null
|
|
9770
|
+
};
|
|
9771
|
+
}
|
|
9772
|
+
return {
|
|
9773
|
+
// `created: false` is the double-click, the retry, the reload. The handover
|
|
9774
|
+
// exists, so this is a success — and the address comes from the SERVER, because
|
|
9775
|
+
// on a repeat submit the reply goes to whatever the FIRST handover used.
|
|
9776
|
+
outcome: result.created ? "sent" : "already-handed-over",
|
|
9777
|
+
email: result.escalation?.email ?? null,
|
|
9778
|
+
createdAt: result.escalation?.createdAt ?? null
|
|
9779
|
+
};
|
|
9780
|
+
} catch {
|
|
9781
|
+
return { outcome: "failed", email: null, createdAt: null };
|
|
9782
|
+
}
|
|
9783
|
+
};
|
|
9784
|
+
return attempt(0);
|
|
9785
|
+
},
|
|
9786
|
+
[client, productId]
|
|
9787
|
+
);
|
|
9788
|
+
const canEscalate = hasConversation && !isSharedView;
|
|
7957
9789
|
return {
|
|
7958
9790
|
phase,
|
|
7959
9791
|
catalog,
|
|
@@ -7974,6 +9806,8 @@ function useExploreChat(options = {}) {
|
|
|
7974
9806
|
clearHistory,
|
|
7975
9807
|
recordClick,
|
|
7976
9808
|
submitFeedback,
|
|
9809
|
+
escalate,
|
|
9810
|
+
canEscalate,
|
|
7977
9811
|
createShareLink,
|
|
7978
9812
|
isSharedView
|
|
7979
9813
|
};
|
|
@@ -8746,188 +10580,52 @@ var EXPLORE_CSS = `
|
|
|
8746
10580
|
}
|
|
8747
10581
|
.boff-explore-caret {
|
|
8748
10582
|
display: inline-block;
|
|
8749
|
-
width: 2px;
|
|
8750
|
-
height: 1em;
|
|
8751
|
-
margin-left: 2px;
|
|
8752
|
-
vertical-align: text-bottom;
|
|
8753
|
-
background-color: hsl(var(--primary));
|
|
8754
|
-
animation: boff-explore-caret 1s step-end infinite;
|
|
8755
|
-
}
|
|
8756
|
-
@media (prefers-reduced-motion: reduce) {
|
|
8757
|
-
.boff-explore-dot,
|
|
8758
|
-
.boff-explore-caret { animation: none; }
|
|
8759
|
-
.boff-explore-dot { opacity: 0.6; }
|
|
8760
|
-
}
|
|
8761
|
-
.boff-explore-scroll {
|
|
8762
|
-
scrollbar-width: thin;
|
|
8763
|
-
scrollbar-color: hsl(var(--border)) transparent;
|
|
8764
|
-
/* Stop the transcript handing its scroll to the page. Without this, the first
|
|
8765
|
-
swipe that exhausts the transcript chains to the document \u2014 and on a host site
|
|
8766
|
-
that is 65-70% footer, which is how a phone ends up showing nothing but the
|
|
8767
|
-
footer. Engines that do not support this property ignore the line and keep
|
|
8768
|
-
today's behaviour; the scroll correction above covers them. */
|
|
8769
|
-
overscroll-behavior: contain;
|
|
8770
|
-
}
|
|
8771
|
-
.boff-explore-scroll::-webkit-scrollbar { width: 10px; }
|
|
8772
|
-
.boff-explore-scroll::-webkit-scrollbar-track { background: transparent; }
|
|
8773
|
-
.boff-explore-scroll::-webkit-scrollbar-thumb {
|
|
8774
|
-
background-color: hsl(var(--border));
|
|
8775
|
-
border: 3px solid transparent;
|
|
8776
|
-
border-radius: 9999px;
|
|
8777
|
-
background-clip: content-box;
|
|
8778
|
-
}
|
|
8779
|
-
|
|
8780
|
-
/* The product strip scrolls inside itself; a visible scrollbar would read as a broken
|
|
8781
|
-
layout rather than an affordance, and reserving its gutter shifts the chips. */
|
|
8782
|
-
.boff-explore-strip {
|
|
8783
|
-
scrollbar-width: none;
|
|
8784
|
-
-ms-overflow-style: none;
|
|
8785
|
-
}
|
|
8786
|
-
.boff-explore-strip::-webkit-scrollbar { display: none; }
|
|
8787
|
-
|
|
8788
|
-
@keyframes boff-explore-fade-in {
|
|
8789
|
-
from { opacity: 0; transform: translateY(2px); }
|
|
8790
|
-
to { opacity: 1; transform: none; }
|
|
8791
|
-
}
|
|
8792
|
-
.boff-explore-fade { animation: boff-explore-fade-in 220ms ease-out; }
|
|
8793
|
-
@media (prefers-reduced-motion: reduce) {
|
|
8794
|
-
.boff-explore-fade { animation: none; }
|
|
8795
|
-
}
|
|
8796
|
-
|
|
8797
|
-
/* Nothing inside an answer may widen the page. Model output carries long URLs, code and
|
|
8798
|
-
tables \u2014 each of those overflows a phone by default, and one overflowing child makes the
|
|
8799
|
-
WHOLE document horizontally scrollable, not just the bubble. */
|
|
8800
|
-
.boff-explore-body,
|
|
8801
|
-
.boff-explore-body p,
|
|
8802
|
-
.boff-explore-body li,
|
|
8803
|
-
.boff-explore-body a,
|
|
8804
|
-
.boff-explore-body h1,
|
|
8805
|
-
.boff-explore-body h2,
|
|
8806
|
-
.boff-explore-body h3 {
|
|
8807
|
-
overflow-wrap: anywhere;
|
|
8808
|
-
word-break: break-word;
|
|
8809
|
-
}
|
|
8810
|
-
.boff-explore-body pre {
|
|
8811
|
-
overflow-x: auto;
|
|
8812
|
-
max-width: 100%;
|
|
8813
|
-
}
|
|
8814
|
-
.boff-explore-body table {
|
|
8815
|
-
display: block;
|
|
8816
|
-
overflow-x: auto;
|
|
8817
|
-
max-width: 100%;
|
|
8818
|
-
}
|
|
8819
|
-
.boff-explore-body img {
|
|
8820
|
-
max-width: 100%;
|
|
8821
|
-
height: auto;
|
|
8822
|
-
}
|
|
8823
|
-
|
|
8824
|
-
/* ---- Comparison and pricing tables ----------------------------------------------------
|
|
8825
|
-
The harness emits a comparison, and a set of plans, as a GFM table whose FIRST column is
|
|
8826
|
-
the subject \u2014 the product, or the plan (CONTRACT.md \xA77). Two things have to be true of it:
|
|
8827
|
-
the page must not scroll sideways because of it, and it has to be readable on a 320px
|
|
8828
|
-
phone, which a four-column grid of 1px borders is not.
|
|
8829
|
-
|
|
8830
|
-
Wide: a contained scroller. \`max-width: 100%\` keeps the box inside the bubble and
|
|
8831
|
-
\`overflow-x: auto\` keeps the columns inside the box, so the widest possible table still
|
|
8832
|
-
cannot widen the document. \`overscroll-behavior-x: contain\` stops a swipe that runs out
|
|
8833
|
-
of table from chaining to the page \u2014 the same rule the transcript needed. */
|
|
8834
|
-
.boff-explore-body .boff-explore-table {
|
|
8835
|
-
max-width: 100%;
|
|
8836
|
-
overflow-x: auto;
|
|
8837
|
-
overscroll-behavior-x: contain;
|
|
8838
|
-
margin: 0.75rem 0;
|
|
8839
|
-
border: 1px solid hsl(var(--border));
|
|
8840
|
-
border-radius: 0.75rem;
|
|
8841
|
-
background-color: hsl(var(--card));
|
|
8842
|
-
}
|
|
8843
|
-
.boff-explore-body .boff-explore-table:focus-visible {
|
|
8844
|
-
outline: 2px solid hsl(var(--ring));
|
|
8845
|
-
outline-offset: 2px;
|
|
8846
|
-
}
|
|
8847
|
-
.boff-explore-body .boff-explore-table table {
|
|
8848
|
-
/* Beats the blanket \`display: block\` above, which is the unwrapped fallback. */
|
|
8849
|
-
display: table;
|
|
8850
|
-
width: 100%;
|
|
8851
|
-
max-width: none;
|
|
8852
|
-
margin: 0;
|
|
8853
|
-
border-collapse: collapse;
|
|
8854
|
-
font-size: 0.8125rem;
|
|
8855
|
-
}
|
|
8856
|
-
.boff-explore-body .boff-explore-table th,
|
|
8857
|
-
.boff-explore-body .boff-explore-table td {
|
|
8858
|
-
border: 0;
|
|
8859
|
-
border-top: 1px solid hsl(var(--border));
|
|
8860
|
-
padding: 0.5rem 0.75rem;
|
|
8861
|
-
/* \`start\`, never \`left\`: the page root carries dir="rtl" in Arabic, and a left-aligned
|
|
8862
|
-
table there reads against the grain of every other line on the page. */
|
|
8863
|
-
text-align: start;
|
|
8864
|
-
vertical-align: top;
|
|
8865
|
-
overflow-wrap: anywhere;
|
|
8866
|
-
/* Prices in a column line up under each other instead of drifting by digit width. */
|
|
8867
|
-
font-variant-numeric: tabular-nums;
|
|
8868
|
-
min-width: 6rem;
|
|
8869
|
-
}
|
|
8870
|
-
.boff-explore-body .boff-explore-table thead th {
|
|
8871
|
-
border-top: 0;
|
|
8872
|
-
background-color: hsl(var(--muted));
|
|
8873
|
-
color: hsl(var(--foreground));
|
|
8874
|
-
font-weight: 600;
|
|
8875
|
-
white-space: nowrap;
|
|
8876
|
-
}
|
|
8877
|
-
/* The first column is what the row is ABOUT \u2014 the product, or the plan name. Reading it as
|
|
8878
|
-
the row's heading is what makes a price list scannable rather than a grid of strings. */
|
|
8879
|
-
.boff-explore-body .boff-explore-table tbody td:first-child {
|
|
8880
|
-
font-weight: 600;
|
|
8881
|
-
color: hsl(var(--card-foreground));
|
|
8882
|
-
}
|
|
8883
|
-
|
|
8884
|
-
/* Narrow: one card per row. Each cell prints its own column heading, so a value is never
|
|
8885
|
-
stranded without the question it answers, and the subject cell becomes the card's title.
|
|
8886
|
-
A media query rather than a measured width \u2014 these pages are serialised post-hydration,
|
|
8887
|
-
so anything measured here would ship to every phone as static HTML. */
|
|
8888
|
-
@media (max-width: 30rem) {
|
|
8889
|
-
.boff-explore-body .boff-explore-table {
|
|
8890
|
-
overflow-x: visible;
|
|
8891
|
-
}
|
|
8892
|
-
.boff-explore-body .boff-explore-table table,
|
|
8893
|
-
.boff-explore-body .boff-explore-table tbody,
|
|
8894
|
-
.boff-explore-body .boff-explore-table tr,
|
|
8895
|
-
.boff-explore-body .boff-explore-table td {
|
|
8896
|
-
display: block;
|
|
8897
|
-
width: 100%;
|
|
8898
|
-
min-width: 0;
|
|
8899
|
-
}
|
|
8900
|
-
.boff-explore-body .boff-explore-table thead {
|
|
8901
|
-
display: none;
|
|
8902
|
-
}
|
|
8903
|
-
.boff-explore-body .boff-explore-table tr {
|
|
8904
|
-
border-top: 1px solid hsl(var(--border));
|
|
8905
|
-
padding: 0.5rem 0;
|
|
8906
|
-
}
|
|
8907
|
-
.boff-explore-body .boff-explore-table tr:first-child {
|
|
8908
|
-
border-top: 0;
|
|
8909
|
-
}
|
|
8910
|
-
.boff-explore-body .boff-explore-table td {
|
|
8911
|
-
border: 0;
|
|
8912
|
-
padding: 0.125rem 0.75rem;
|
|
8913
|
-
}
|
|
8914
|
-
.boff-explore-body .boff-explore-table td[data-label]::before {
|
|
8915
|
-
content: attr(data-label);
|
|
8916
|
-
display: block;
|
|
8917
|
-
font-size: 0.6875rem;
|
|
8918
|
-
font-weight: 600;
|
|
8919
|
-
text-transform: uppercase;
|
|
8920
|
-
letter-spacing: 0.04em;
|
|
8921
|
-
color: hsl(var(--muted-foreground));
|
|
8922
|
-
}
|
|
8923
|
-
.boff-explore-body .boff-explore-table tbody td:first-child {
|
|
8924
|
-
font-size: 0.9375rem;
|
|
8925
|
-
padding-bottom: 0.25rem;
|
|
8926
|
-
}
|
|
8927
|
-
.boff-explore-body .boff-explore-table tbody td:first-child::before {
|
|
8928
|
-
/* The plan's own name is the heading here; repeating "Plan" over it says nothing. */
|
|
8929
|
-
display: none;
|
|
8930
|
-
}
|
|
10583
|
+
width: 2px;
|
|
10584
|
+
height: 1em;
|
|
10585
|
+
margin-left: 2px;
|
|
10586
|
+
vertical-align: text-bottom;
|
|
10587
|
+
background-color: hsl(var(--primary));
|
|
10588
|
+
animation: boff-explore-caret 1s step-end infinite;
|
|
10589
|
+
}
|
|
10590
|
+
@media (prefers-reduced-motion: reduce) {
|
|
10591
|
+
.boff-explore-dot,
|
|
10592
|
+
.boff-explore-caret { animation: none; }
|
|
10593
|
+
.boff-explore-dot { opacity: 0.6; }
|
|
10594
|
+
}
|
|
10595
|
+
.boff-explore-scroll {
|
|
10596
|
+
scrollbar-width: thin;
|
|
10597
|
+
scrollbar-color: hsl(var(--border)) transparent;
|
|
10598
|
+
/* Stop the transcript handing its scroll to the page. Without this, the first
|
|
10599
|
+
swipe that exhausts the transcript chains to the document \u2014 and on a host site
|
|
10600
|
+
that is 65-70% footer, which is how a phone ends up showing nothing but the
|
|
10601
|
+
footer. Engines that do not support this property ignore the line and keep
|
|
10602
|
+
today's behaviour; the scroll correction above covers them. */
|
|
10603
|
+
overscroll-behavior: contain;
|
|
10604
|
+
}
|
|
10605
|
+
.boff-explore-scroll::-webkit-scrollbar { width: 10px; }
|
|
10606
|
+
.boff-explore-scroll::-webkit-scrollbar-track { background: transparent; }
|
|
10607
|
+
.boff-explore-scroll::-webkit-scrollbar-thumb {
|
|
10608
|
+
background-color: hsl(var(--border));
|
|
10609
|
+
border: 3px solid transparent;
|
|
10610
|
+
border-radius: 9999px;
|
|
10611
|
+
background-clip: content-box;
|
|
10612
|
+
}
|
|
10613
|
+
|
|
10614
|
+
/* The product strip scrolls inside itself; a visible scrollbar would read as a broken
|
|
10615
|
+
layout rather than an affordance, and reserving its gutter shifts the chips. */
|
|
10616
|
+
.boff-explore-strip {
|
|
10617
|
+
scrollbar-width: none;
|
|
10618
|
+
-ms-overflow-style: none;
|
|
10619
|
+
}
|
|
10620
|
+
.boff-explore-strip::-webkit-scrollbar { display: none; }
|
|
10621
|
+
|
|
10622
|
+
@keyframes boff-explore-fade-in {
|
|
10623
|
+
from { opacity: 0; transform: translateY(2px); }
|
|
10624
|
+
to { opacity: 1; transform: none; }
|
|
10625
|
+
}
|
|
10626
|
+
.boff-explore-fade { animation: boff-explore-fade-in 220ms ease-out; }
|
|
10627
|
+
@media (prefers-reduced-motion: reduce) {
|
|
10628
|
+
.boff-explore-fade { animation: none; }
|
|
8931
10629
|
}
|
|
8932
10630
|
|
|
8933
10631
|
/* ---- Ambient backdrop -----------------------------------------------------------------
|
|
@@ -8986,11 +10684,40 @@ var EXPLORE_CSS = `
|
|
|
8986
10684
|
animation: boff-explore-sheen 1.5s ease-in-out infinite;
|
|
8987
10685
|
}
|
|
8988
10686
|
|
|
10687
|
+
/* ---- The composer, before anyone has typed -----------------------------------------
|
|
10688
|
+
On the welcome screen the box IS the page: everything above it is a way of explaining
|
|
10689
|
+
what to put in it. Unhighlighted it reads as a search bar at the bottom of a landing
|
|
10690
|
+
page, which people scroll past \u2014 so while the conversation is empty it gets a soft halo
|
|
10691
|
+
in the site's own --primary and one slow breath of it, and the moment there is a
|
|
10692
|
+
transcript, or the visitor focuses or types, it drops back to the ordinary card it was.
|
|
10693
|
+
An input that keeps pulsing while you are using it is nagging, not inviting.
|
|
10694
|
+
|
|
10695
|
+
Colour comes from the product's --primary token, so it is whatever that site's palette
|
|
10696
|
+
already is, never a colour chosen here. */
|
|
10697
|
+
.boff-explore-invite {
|
|
10698
|
+
border-color: hsl(var(--primary) / 0.45);
|
|
10699
|
+
box-shadow:
|
|
10700
|
+
0 0 0 4px hsl(var(--primary) / 0.08),
|
|
10701
|
+
0 8px 24px -12px hsl(var(--primary) / 0.45);
|
|
10702
|
+
animation: boff-explore-breathe 3.2s ease-in-out infinite;
|
|
10703
|
+
}
|
|
10704
|
+
/* Focus and typing both mean "I have found it", and the hint has done its job. */
|
|
10705
|
+
.boff-explore-invite:focus-within,
|
|
10706
|
+
.boff-explore-invite.boff-explore-invite-quiet {
|
|
10707
|
+
animation: none;
|
|
10708
|
+
box-shadow: 0 0 0 4px hsl(var(--primary) / 0.10);
|
|
10709
|
+
}
|
|
10710
|
+
@keyframes boff-explore-breathe {
|
|
10711
|
+
0%, 100% { box-shadow: 0 0 0 4px hsl(var(--primary) / 0.07), 0 8px 24px -12px hsl(var(--primary) / 0.40); }
|
|
10712
|
+
50% { box-shadow: 0 0 0 7px hsl(var(--primary) / 0.13), 0 8px 28px -12px hsl(var(--primary) / 0.55); }
|
|
10713
|
+
}
|
|
10714
|
+
|
|
8989
10715
|
/* Every one of the above is decoration. Reduced motion removes the movement and keeps the
|
|
8990
10716
|
final state, rather than leaving content mid-animation and invisible. */
|
|
8991
10717
|
@media (prefers-reduced-motion: reduce) {
|
|
8992
10718
|
.boff-explore-aura::before,
|
|
8993
|
-
.boff-explore-busy::after
|
|
10719
|
+
.boff-explore-busy::after,
|
|
10720
|
+
.boff-explore-invite { animation: none; }
|
|
8994
10721
|
.boff-explore-rise { animation: none; opacity: 1; transform: none; }
|
|
8995
10722
|
}
|
|
8996
10723
|
|
|
@@ -9036,438 +10763,192 @@ var EXPLORE_CSS = `
|
|
|
9036
10763
|
min-height: calc(100vh - var(--boff-explore-offset, 0px));
|
|
9037
10764
|
}
|
|
9038
10765
|
}
|
|
9039
|
-
@supports (height: 100dvh) {
|
|
9040
|
-
@media (max-height: ${SHORT_VIEWPORT_PX}px) {
|
|
9041
|
-
.boff-explore-viewport {
|
|
9042
|
-
min-height: calc(100dvh - var(--boff-explore-offset, 0px));
|
|
9043
|
-
}
|
|
9044
|
-
}
|
|
9045
|
-
}
|
|
9046
|
-
|
|
9047
|
-
/* ---- Composer dock --------------------------------------------------------------------
|
|
9048
|
-
Three declarations, each the fallback for the one after it: a plain 1rem where \`max()\`
|
|
9049
|
-
is unknown, then the measured overlap of any FOREIGN fixed chrome sitting over the
|
|
9050
|
-
composer (the host sites' cookie banner is 229px tall and lands exactly there), then the
|
|
9051
|
-
same plus the home-indicator inset. \`--boff-explore-chrome\` is set on the root only once
|
|
9052
|
-
an overlap has actually been measured, so everywhere else this collapses to 1rem. */
|
|
9053
|
-
.boff-explore-composer {
|
|
9054
|
-
padding-bottom: 1rem;
|
|
9055
|
-
padding-bottom: max(1rem, var(--boff-explore-chrome, 0px));
|
|
9056
|
-
padding-bottom: max(1rem, env(safe-area-inset-bottom), var(--boff-explore-chrome, 0px));
|
|
9057
|
-
}
|
|
9058
|
-
`;
|
|
9059
|
-
function ExploreStyles() {
|
|
9060
|
-
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
|
|
9061
|
-
}
|
|
9062
|
-
var CAPABILITIES = [
|
|
9063
|
-
{
|
|
9064
|
-
icon: lucideReact.BookOpenText,
|
|
9065
|
-
title: "Grounded in our own docs",
|
|
9066
|
-
body: "Every answer comes from published product pages and documentation \u2014 never invented."
|
|
9067
|
-
},
|
|
9068
|
-
{
|
|
9069
|
-
icon: lucideReact.Layers,
|
|
9070
|
-
title: "Compare across the ecosystem",
|
|
9071
|
-
body: "Ask which product fits your team, or how two of them work together."
|
|
9072
|
-
},
|
|
9073
|
-
{
|
|
9074
|
-
icon: lucideReact.Link2,
|
|
9075
|
-
title: "Straight to the right page",
|
|
9076
|
-
body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
|
|
9077
|
-
}
|
|
9078
|
-
];
|
|
9079
|
-
var MIN_VISIBLE_FRACTION = 0.25;
|
|
9080
|
-
var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
|
|
9081
|
-
var CTA_VARIANTS = {
|
|
9082
|
-
CONTACT: "default",
|
|
9083
|
-
WAITLIST: "default",
|
|
9084
|
-
APP: "default",
|
|
9085
|
-
PRICING: "secondary",
|
|
9086
|
-
STORE: "secondary",
|
|
9087
|
-
PARTNERS: "secondary",
|
|
9088
|
-
DOCS: "outline",
|
|
9089
|
-
SERVICES: "outline",
|
|
9090
|
-
OTHER: "outline"
|
|
9091
|
-
};
|
|
9092
|
-
function normalizeOffset(offset) {
|
|
9093
|
-
if (offset === void 0) return "0px";
|
|
9094
|
-
return typeof offset === "number" ? `${offset}px` : offset;
|
|
9095
|
-
}
|
|
9096
|
-
function isOwnElement(el, root) {
|
|
9097
|
-
if (el === document.body || el === document.documentElement) return true;
|
|
9098
|
-
if (root.contains(el)) return true;
|
|
9099
|
-
return el.closest(SDK_OVERLAY_SELECTOR) !== null;
|
|
9100
|
-
}
|
|
9101
|
-
function visualViewportHeight() {
|
|
9102
|
-
return window.visualViewport?.height ?? window.innerHeight;
|
|
9103
|
-
}
|
|
9104
|
-
function clamp2(value, min, max) {
|
|
9105
|
-
return Math.min(Math.max(value, min), max);
|
|
9106
|
-
}
|
|
9107
|
-
function isRestoredNavigation() {
|
|
9108
|
-
const entries = window.performance?.getEntriesByType?.("navigation");
|
|
9109
|
-
const entry = entries?.[0];
|
|
9110
|
-
if (!entry) return true;
|
|
9111
|
-
const navigation = entry;
|
|
9112
|
-
return navigation.type === "reload" || navigation.type === "back_forward";
|
|
9113
|
-
}
|
|
9114
|
-
function pageOwnsScrolling(el) {
|
|
9115
|
-
if (window.innerHeight > SHORT_VIEWPORT_PX) return false;
|
|
9116
|
-
return el.scrollHeight - el.clientHeight <= 1;
|
|
9117
|
-
}
|
|
9118
|
-
function isInternalPath(url) {
|
|
9119
|
-
return url.startsWith("/") && !url.startsWith("//");
|
|
9120
|
-
}
|
|
9121
|
-
function hostnameOf(url) {
|
|
9122
|
-
try {
|
|
9123
|
-
return new URL(url).hostname.replace(/^www\./, "");
|
|
9124
|
-
} catch {
|
|
9125
|
-
return "";
|
|
9126
|
-
}
|
|
9127
|
-
}
|
|
9128
|
-
function initialOf(value, fallback) {
|
|
9129
|
-
const source = (value || fallback).trim();
|
|
9130
|
-
return source ? source.slice(0, 1).toUpperCase() : "?";
|
|
9131
|
-
}
|
|
9132
|
-
function logoUrlOf(url) {
|
|
9133
|
-
try {
|
|
9134
|
-
const { origin, protocol } = new URL(url);
|
|
9135
|
-
if (protocol !== "https:" && protocol !== "http:") return null;
|
|
9136
|
-
return `${origin}/favicon.svg`;
|
|
9137
|
-
} catch {
|
|
9138
|
-
return null;
|
|
9139
|
-
}
|
|
9140
|
-
}
|
|
9141
|
-
function inlineImageOrigins(products) {
|
|
9142
|
-
const origins = /* @__PURE__ */ new Set();
|
|
9143
|
-
for (const product of products) {
|
|
9144
|
-
let url;
|
|
9145
|
-
try {
|
|
9146
|
-
url = new URL(product.website);
|
|
9147
|
-
} catch {
|
|
9148
|
-
continue;
|
|
9149
|
-
}
|
|
9150
|
-
if (url.protocol !== "https:") continue;
|
|
9151
|
-
const apex = url.hostname.replace(/^www\./, "");
|
|
9152
|
-
const port = url.port ? `:${url.port}` : "";
|
|
9153
|
-
origins.add(`https://${apex}${port}`);
|
|
9154
|
-
origins.add(`https://www.${apex}${port}`);
|
|
9155
|
-
}
|
|
9156
|
-
return origins;
|
|
9157
|
-
}
|
|
9158
|
-
function isInlineImageAllowed(src, origins) {
|
|
9159
|
-
if (typeof src !== "string" || src === "") return false;
|
|
9160
|
-
let url;
|
|
9161
|
-
try {
|
|
9162
|
-
url = new URL(src);
|
|
9163
|
-
} catch {
|
|
9164
|
-
return false;
|
|
9165
|
-
}
|
|
9166
|
-
if (url.protocol !== "https:" || url.username || url.password) return false;
|
|
9167
|
-
return origins.has(url.origin);
|
|
9168
|
-
}
|
|
9169
|
-
var REFERENCE_KIND_ORDER = [
|
|
9170
|
-
"CONCEPT",
|
|
9171
|
-
"DOCS",
|
|
9172
|
-
"PRICING",
|
|
9173
|
-
"USE_CASE",
|
|
9174
|
-
"PAGE"
|
|
9175
|
-
];
|
|
9176
|
-
var PRODUCT_SUBDOMAINS = [
|
|
9177
|
-
"alphadocs.",
|
|
9178
|
-
"alphaapp.",
|
|
9179
|
-
"docs.",
|
|
9180
|
-
"alpha.",
|
|
9181
|
-
"app.",
|
|
9182
|
-
"www."
|
|
9183
|
-
];
|
|
9184
|
-
function readCatalogUrl(raw) {
|
|
9185
|
-
let parsed;
|
|
9186
|
-
try {
|
|
9187
|
-
parsed = new URL(raw);
|
|
9188
|
-
} catch {
|
|
9189
|
-
return null;
|
|
9190
|
-
}
|
|
9191
|
-
if (parsed.protocol !== "https:") return null;
|
|
9192
|
-
const host = parsed.hostname.toLowerCase();
|
|
9193
|
-
const prefix = PRODUCT_SUBDOMAINS.find(
|
|
9194
|
-
(candidate) => host.startsWith(candidate)
|
|
9195
|
-
);
|
|
9196
|
-
const apex = prefix === void 0 ? host : host.slice(prefix.length);
|
|
9197
|
-
const port = parsed.port ? `:${parsed.port}` : "";
|
|
9198
|
-
return {
|
|
9199
|
-
origin: `https://${apex}${port}`,
|
|
9200
|
-
prefix,
|
|
9201
|
-
pathname: parsed.pathname
|
|
9202
|
-
};
|
|
9203
|
-
}
|
|
9204
|
-
function referenceKindOf(url, origins) {
|
|
9205
|
-
const parsed = readCatalogUrl(url);
|
|
9206
|
-
if (parsed === null || !origins.has(parsed.origin)) return null;
|
|
9207
|
-
if (parsed.prefix === "docs." || parsed.prefix === "alphadocs.")
|
|
9208
|
-
return "DOCS";
|
|
9209
|
-
const segment = parsed.pathname.toLowerCase().split("/").filter(Boolean)[0] ?? "";
|
|
9210
|
-
if (segment === "concept" || segment === "concepts") return "CONCEPT";
|
|
9211
|
-
if (segment === "docs") return "DOCS";
|
|
9212
|
-
if (segment === "pricing" || segment === "plans") return "PRICING";
|
|
9213
|
-
if (segment === "use-case" || segment === "use-cases" || segment === "solutions") {
|
|
9214
|
-
return "USE_CASE";
|
|
9215
|
-
}
|
|
9216
|
-
return "PAGE";
|
|
9217
|
-
}
|
|
9218
|
-
function productNamesByOrigin(products) {
|
|
9219
|
-
const names = /* @__PURE__ */ new Map();
|
|
9220
|
-
for (const product of products) {
|
|
9221
|
-
let url;
|
|
9222
|
-
try {
|
|
9223
|
-
url = new URL(product.website);
|
|
9224
|
-
} catch {
|
|
9225
|
-
continue;
|
|
9226
|
-
}
|
|
9227
|
-
if (url.protocol !== "https:") continue;
|
|
9228
|
-
const apex = url.hostname.replace(/^www\./, "");
|
|
9229
|
-
const port = url.port ? `:${url.port}` : "";
|
|
9230
|
-
const key = `https://${apex}${port}`;
|
|
9231
|
-
if (!names.has(key)) names.set(key, product.name);
|
|
9232
|
-
}
|
|
9233
|
-
return names;
|
|
9234
|
-
}
|
|
9235
|
-
function summariseReferences(references, origins, productNames) {
|
|
9236
|
-
const counts = /* @__PURE__ */ new Map();
|
|
9237
|
-
const products = [];
|
|
9238
|
-
for (const reference of references) {
|
|
9239
|
-
const kind = referenceKindOf(reference.url, origins);
|
|
9240
|
-
if (kind !== null) counts.set(kind, (counts.get(kind) ?? 0) + 1);
|
|
9241
|
-
const parsed = readCatalogUrl(reference.url);
|
|
9242
|
-
const name = (parsed === null ? void 0 : productNames.get(parsed.origin)) ?? (reference.product || null);
|
|
9243
|
-
if (name != null && !products.includes(name)) products.push(name);
|
|
9244
|
-
}
|
|
9245
|
-
return {
|
|
9246
|
-
total: references.length,
|
|
9247
|
-
kinds: REFERENCE_KIND_ORDER.filter((kind) => counts.has(kind)).map(
|
|
9248
|
-
(kind) => ({ kind, count: counts.get(kind) ?? 0 })
|
|
9249
|
-
),
|
|
9250
|
-
products
|
|
9251
|
-
};
|
|
9252
|
-
}
|
|
9253
|
-
var CODE_FENCE = /^\s*(?:```|~~~)/;
|
|
9254
|
-
var TABLE_ROW_LINE = /^\s{0,3}\|/;
|
|
9255
|
-
var TABLE_DELIMITER_ROW = /^\s{0,3}\|[\s:|-]*-[\s:|-]*$/;
|
|
9256
|
-
function readableLine(raw, mode) {
|
|
9257
|
-
let line = raw;
|
|
9258
|
-
line = line.replace(/!\[[^\]]*\]\([^)\s]*(?:\s+"[^"]*")?\)/g, "");
|
|
9259
|
-
line = mode === "speech" ? (
|
|
9260
|
-
// A voice reading "h-t-t-p-s colon slash slash…" mid-sentence is noise, and the
|
|
9261
|
-
// prompt asks for two to five links in every answer. The label IS the words.
|
|
9262
|
-
line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1")
|
|
9263
|
-
) : line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1 ($2)");
|
|
9264
|
-
line = mode === "speech" ? line.replace(/<(https?:\/\/[^>\s]+)>/g, "") : line.replace(/<(https?:\/\/[^>\s]+)>/g, "$1");
|
|
9265
|
-
line = line.replace(/^\s{0,3}#{1,6}\s+/, "");
|
|
9266
|
-
line = line.replace(/^\s{0,3}>\s?/, "");
|
|
9267
|
-
if (/^\s{0,3}([-*_])[ \t]*(?:\1[ \t]*){2,}$/.test(line)) return "";
|
|
9268
|
-
line = line.replace(/`([^`]+)`/g, "$1");
|
|
9269
|
-
line = line.replace(/\*\*([^*]+)\*\*/g, "$1");
|
|
9270
|
-
line = line.replace(/__([^_]+)__/g, "$1");
|
|
9271
|
-
line = line.replace(/(^|[^*\w])\*([^*\n]+)\*(?![*\w])/g, "$1$2");
|
|
9272
|
-
line = line.replace(/(^|[^_\w])_([^_\n]+)_(?![_\w])/g, "$1$2");
|
|
9273
|
-
return line.replace(/[ \t]+$/, "");
|
|
9274
|
-
}
|
|
9275
|
-
function tableCells(row) {
|
|
9276
|
-
const trimmed = row.trim();
|
|
9277
|
-
const cells = [];
|
|
9278
|
-
let cell = "";
|
|
9279
|
-
for (let at = 0; at < trimmed.length; at += 1) {
|
|
9280
|
-
const char = trimmed[at] ?? "";
|
|
9281
|
-
if (char === "\\") {
|
|
9282
|
-
cell += char + (trimmed[at + 1] ?? "");
|
|
9283
|
-
at += 1;
|
|
9284
|
-
continue;
|
|
9285
|
-
}
|
|
9286
|
-
if (char === "|") {
|
|
9287
|
-
cells.push(cell.trim());
|
|
9288
|
-
cell = "";
|
|
9289
|
-
continue;
|
|
10766
|
+
@supports (height: 100dvh) {
|
|
10767
|
+
@media (max-height: ${SHORT_VIEWPORT_PX}px) {
|
|
10768
|
+
.boff-explore-viewport {
|
|
10769
|
+
min-height: calc(100dvh - var(--boff-explore-offset, 0px));
|
|
9290
10770
|
}
|
|
9291
|
-
cell += char;
|
|
9292
10771
|
}
|
|
9293
|
-
cells.push(cell.trim());
|
|
9294
|
-
if (trimmed.startsWith("|") && cells[0] === "") cells.shift();
|
|
9295
|
-
if (trimmed.endsWith("|") && cells[cells.length - 1] === "") cells.pop();
|
|
9296
|
-
return cells;
|
|
9297
10772
|
}
|
|
9298
|
-
|
|
9299
|
-
|
|
10773
|
+
|
|
10774
|
+
/* ---- Composer dock --------------------------------------------------------------------
|
|
10775
|
+
Three declarations, each the fallback for the one after it: a plain 1rem where \`max()\`
|
|
10776
|
+
is unknown, then the measured overlap of any FOREIGN fixed chrome sitting over the
|
|
10777
|
+
composer (the host sites' cookie banner is 229px tall and lands exactly there), then the
|
|
10778
|
+
same plus the home-indicator inset. \`--boff-explore-chrome\` is set on the root only once
|
|
10779
|
+
an overlap has actually been measured, so everywhere else this collapses to 1rem. */
|
|
10780
|
+
.boff-explore-composer {
|
|
10781
|
+
padding-bottom: 1rem;
|
|
10782
|
+
padding-bottom: max(1rem, var(--boff-explore-chrome, 0px));
|
|
10783
|
+
padding-bottom: max(1rem, env(safe-area-inset-bottom), var(--boff-explore-chrome, 0px));
|
|
9300
10784
|
}
|
|
9301
|
-
|
|
9302
|
-
|
|
9303
|
-
|
|
9304
|
-
const spoken = [];
|
|
9305
|
-
for (const row of rows.slice(2)) {
|
|
9306
|
-
const parts = [];
|
|
9307
|
-
tableCells(row).forEach((value, column) => {
|
|
9308
|
-
if (value === "") return;
|
|
9309
|
-
const label = column === 0 ? "" : labels[column] ?? "";
|
|
9310
|
-
parts.push(label === "" ? value : `${label}: ${value}`);
|
|
9311
|
-
});
|
|
9312
|
-
if (parts.length > 0) spoken.push(asSentence(parts.join(". ")));
|
|
9313
|
-
}
|
|
9314
|
-
return spoken;
|
|
10785
|
+
`;
|
|
10786
|
+
function ExploreStyles() {
|
|
10787
|
+
return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
|
|
9315
10788
|
}
|
|
9316
|
-
|
|
9317
|
-
|
|
9318
|
-
|
|
9319
|
-
|
|
9320
|
-
|
|
9321
|
-
|
|
9322
|
-
|
|
9323
|
-
|
|
9324
|
-
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
|
|
9328
|
-
|
|
9329
|
-
|
|
9330
|
-
|
|
9331
|
-
if (inFence) {
|
|
9332
|
-
lines.push(raw);
|
|
9333
|
-
continue;
|
|
9334
|
-
}
|
|
9335
|
-
if (mode === "speech" && TABLE_ROW_LINE.test(raw)) {
|
|
9336
|
-
table.push(raw);
|
|
9337
|
-
continue;
|
|
9338
|
-
}
|
|
9339
|
-
flushTable();
|
|
9340
|
-
lines.push(readableLine(raw, mode));
|
|
10789
|
+
var CAPABILITIES = [
|
|
10790
|
+
{
|
|
10791
|
+
icon: lucideReact.BookOpenText,
|
|
10792
|
+
title: "Grounded in our own docs",
|
|
10793
|
+
body: "Every answer comes from published product pages and documentation \u2014 never invented."
|
|
10794
|
+
},
|
|
10795
|
+
{
|
|
10796
|
+
icon: lucideReact.Layers,
|
|
10797
|
+
title: "Compare across the ecosystem",
|
|
10798
|
+
body: "Ask which product fits your team, or how two of them work together."
|
|
10799
|
+
},
|
|
10800
|
+
{
|
|
10801
|
+
icon: lucideReact.Link2,
|
|
10802
|
+
title: "Straight to the right page",
|
|
10803
|
+
body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
|
|
9341
10804
|
}
|
|
9342
|
-
|
|
9343
|
-
|
|
10805
|
+
];
|
|
10806
|
+
var MIN_VISIBLE_FRACTION = 0.25;
|
|
10807
|
+
var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
|
|
10808
|
+
var CTA_VARIANTS = {
|
|
10809
|
+
CONTACT: "default",
|
|
10810
|
+
WAITLIST: "default",
|
|
10811
|
+
APP: "default",
|
|
10812
|
+
PRICING: "secondary",
|
|
10813
|
+
STORE: "secondary",
|
|
10814
|
+
PARTNERS: "secondary",
|
|
10815
|
+
DOCS: "outline",
|
|
10816
|
+
SERVICES: "outline",
|
|
10817
|
+
OTHER: "outline"
|
|
10818
|
+
};
|
|
10819
|
+
function normalizeOffset(offset) {
|
|
10820
|
+
if (offset === void 0) return "0px";
|
|
10821
|
+
return typeof offset === "number" ? `${offset}px` : offset;
|
|
9344
10822
|
}
|
|
9345
|
-
function
|
|
9346
|
-
|
|
10823
|
+
function isOwnElement(el, root) {
|
|
10824
|
+
if (el === document.body || el === document.documentElement) return true;
|
|
10825
|
+
if (root.contains(el)) return true;
|
|
10826
|
+
return el.closest(SDK_OVERLAY_SELECTOR) !== null;
|
|
9347
10827
|
}
|
|
9348
|
-
function
|
|
9349
|
-
return
|
|
10828
|
+
function visualViewportHeight() {
|
|
10829
|
+
return window.visualViewport?.height ?? window.innerHeight;
|
|
9350
10830
|
}
|
|
9351
|
-
|
|
9352
|
-
|
|
9353
|
-
function AnswerLink(props) {
|
|
9354
|
-
return /* @__PURE__ */ jsxRuntime.jsx(InsideLinkContext.Provider, { value: true, children: /* @__PURE__ */ jsxRuntime.jsx(MarkdownLink, { ...props }) });
|
|
10831
|
+
function clamp2(value, min, max) {
|
|
10832
|
+
return Math.min(Math.max(value, min), max);
|
|
9355
10833
|
}
|
|
9356
|
-
|
|
9357
|
-
|
|
9358
|
-
const
|
|
9359
|
-
|
|
9360
|
-
|
|
9361
|
-
|
|
10834
|
+
function isRestoredNavigation() {
|
|
10835
|
+
const entries = window.performance?.getEntriesByType?.("navigation");
|
|
10836
|
+
const entry = entries?.[0];
|
|
10837
|
+
if (!entry) return true;
|
|
10838
|
+
const navigation = entry;
|
|
10839
|
+
return navigation.type === "reload" || navigation.type === "back_forward";
|
|
10840
|
+
}
|
|
10841
|
+
function pageOwnsScrolling(el) {
|
|
10842
|
+
if (window.innerHeight > SHORT_VIEWPORT_PX) return false;
|
|
10843
|
+
return el.scrollHeight - el.clientHeight <= 1;
|
|
10844
|
+
}
|
|
10845
|
+
function isInternalPath(url) {
|
|
10846
|
+
return url.startsWith("/") && !url.startsWith("//");
|
|
10847
|
+
}
|
|
10848
|
+
function hostnameOf(url) {
|
|
10849
|
+
try {
|
|
10850
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
10851
|
+
} catch {
|
|
10852
|
+
return "";
|
|
9362
10853
|
}
|
|
9363
|
-
const { strings: T, onFailed } = scope;
|
|
9364
|
-
const picture = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9365
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9366
|
-
"img",
|
|
9367
|
-
{
|
|
9368
|
-
src,
|
|
9369
|
-
alt: alt ?? "",
|
|
9370
|
-
loading: "lazy",
|
|
9371
|
-
decoding: "async",
|
|
9372
|
-
onError: () => onFailed(src),
|
|
9373
|
-
className: "block h-auto max-h-80 w-auto max-w-full object-contain"
|
|
9374
|
-
}
|
|
9375
|
-
),
|
|
9376
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9377
|
-
"span",
|
|
9378
|
-
{
|
|
9379
|
-
"aria-hidden": "true",
|
|
9380
|
-
className: "pointer-events-none absolute left-2 top-2 rounded-full border border-border bg-background/90 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-foreground shadow-sm",
|
|
9381
|
-
children: T.conceptIllustration
|
|
9382
|
-
}
|
|
9383
|
-
)
|
|
9384
|
-
] });
|
|
9385
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-boff-explore": "inline-image", className: "my-3 block", children: insideLink ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: INLINE_IMAGE_FRAME, children: picture }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9386
|
-
"a",
|
|
9387
|
-
{
|
|
9388
|
-
href: src,
|
|
9389
|
-
target: "_blank",
|
|
9390
|
-
rel: "noopener noreferrer",
|
|
9391
|
-
className: cn(
|
|
9392
|
-
INLINE_IMAGE_FRAME,
|
|
9393
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
9394
|
-
),
|
|
9395
|
-
children: [
|
|
9396
|
-
picture,
|
|
9397
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
|
|
9398
|
-
"(",
|
|
9399
|
-
T.opensInNewTab,
|
|
9400
|
-
")"
|
|
9401
|
-
] })
|
|
9402
|
-
]
|
|
9403
|
-
}
|
|
9404
|
-
) });
|
|
9405
10854
|
}
|
|
9406
|
-
function
|
|
9407
|
-
|
|
9408
|
-
|
|
9409
|
-
return (node.children ?? []).map(markdownText).join("");
|
|
10855
|
+
function initialOf(value, fallback) {
|
|
10856
|
+
const source = (value || fallback).trim();
|
|
10857
|
+
return source ? source.slice(0, 1).toUpperCase() : "?";
|
|
9410
10858
|
}
|
|
9411
|
-
function
|
|
9412
|
-
|
|
10859
|
+
function logoUrlOf(url) {
|
|
10860
|
+
try {
|
|
10861
|
+
const { origin, protocol } = new URL(url);
|
|
10862
|
+
if (protocol !== "https:" && protocol !== "http:") return null;
|
|
10863
|
+
return `${origin}/favicon.svg`;
|
|
10864
|
+
} catch {
|
|
10865
|
+
return null;
|
|
10866
|
+
}
|
|
9413
10867
|
}
|
|
9414
|
-
|
|
9415
|
-
|
|
9416
|
-
|
|
9417
|
-
|
|
9418
|
-
|
|
10868
|
+
var REFERENCE_KIND_ORDER = [
|
|
10869
|
+
"CONCEPT",
|
|
10870
|
+
"DOCS",
|
|
10871
|
+
"PRICING",
|
|
10872
|
+
"USE_CASE",
|
|
10873
|
+
"PAGE"
|
|
10874
|
+
];
|
|
10875
|
+
var PRODUCT_SUBDOMAINS = [
|
|
10876
|
+
"alphadocs.",
|
|
10877
|
+
"alphaapp.",
|
|
10878
|
+
"docs.",
|
|
10879
|
+
"alpha.",
|
|
10880
|
+
"app.",
|
|
10881
|
+
"www."
|
|
10882
|
+
];
|
|
10883
|
+
function readCatalogUrl(raw) {
|
|
10884
|
+
let parsed;
|
|
10885
|
+
try {
|
|
10886
|
+
parsed = new URL(raw);
|
|
10887
|
+
} catch {
|
|
10888
|
+
return null;
|
|
9419
10889
|
}
|
|
9420
|
-
return null;
|
|
10890
|
+
if (parsed.protocol !== "https:") return null;
|
|
10891
|
+
const host = parsed.hostname.toLowerCase();
|
|
10892
|
+
const prefix = PRODUCT_SUBDOMAINS.find(
|
|
10893
|
+
(candidate) => host.startsWith(candidate)
|
|
10894
|
+
);
|
|
10895
|
+
const apex = prefix === void 0 ? host : host.slice(prefix.length);
|
|
10896
|
+
const port = parsed.port ? `:${parsed.port}` : "";
|
|
10897
|
+
return {
|
|
10898
|
+
origin: `https://${apex}${port}`,
|
|
10899
|
+
prefix,
|
|
10900
|
+
pathname: parsed.pathname
|
|
10901
|
+
};
|
|
9421
10902
|
}
|
|
9422
|
-
function
|
|
9423
|
-
const
|
|
9424
|
-
if (
|
|
9425
|
-
|
|
10903
|
+
function referenceKindOf(url, origins) {
|
|
10904
|
+
const parsed = readCatalogUrl(url);
|
|
10905
|
+
if (parsed === null || !origins.has(parsed.origin)) return null;
|
|
10906
|
+
if (parsed.prefix === "docs." || parsed.prefix === "alphadocs.")
|
|
10907
|
+
return "DOCS";
|
|
10908
|
+
const segment = parsed.pathname.toLowerCase().split("/").filter(Boolean)[0] ?? "";
|
|
10909
|
+
if (segment === "concept" || segment === "concepts") return "CONCEPT";
|
|
10910
|
+
if (segment === "docs") return "DOCS";
|
|
10911
|
+
if (segment === "pricing" || segment === "plans") return "PRICING";
|
|
10912
|
+
if (segment === "use-case" || segment === "use-cases" || segment === "solutions") {
|
|
10913
|
+
return "USE_CASE";
|
|
10914
|
+
}
|
|
10915
|
+
return "PAGE";
|
|
9426
10916
|
}
|
|
9427
|
-
|
|
9428
|
-
|
|
9429
|
-
const
|
|
9430
|
-
|
|
9431
|
-
|
|
9432
|
-
|
|
9433
|
-
|
|
9434
|
-
|
|
9435
|
-
"data-boff-explore": "table",
|
|
9436
|
-
role: "region",
|
|
9437
|
-
"aria-label": scope.strings.answerTable,
|
|
9438
|
-
tabIndex: 0,
|
|
9439
|
-
className: "boff-explore-table",
|
|
9440
|
-
children: table
|
|
10917
|
+
function productNamesByOrigin(products) {
|
|
10918
|
+
const names = /* @__PURE__ */ new Map();
|
|
10919
|
+
for (const product of products) {
|
|
10920
|
+
let url;
|
|
10921
|
+
try {
|
|
10922
|
+
url = new URL(product.website);
|
|
10923
|
+
} catch {
|
|
10924
|
+
continue;
|
|
9441
10925
|
}
|
|
9442
|
-
|
|
10926
|
+
if (url.protocol !== "https:") continue;
|
|
10927
|
+
const apex = url.hostname.replace(/^www\./, "");
|
|
10928
|
+
const port = url.port ? `:${url.port}` : "";
|
|
10929
|
+
const key = `https://${apex}${port}`;
|
|
10930
|
+
if (!names.has(key)) names.set(key, product.name);
|
|
10931
|
+
}
|
|
10932
|
+
return names;
|
|
9443
10933
|
}
|
|
9444
|
-
function
|
|
9445
|
-
|
|
9446
|
-
|
|
9447
|
-
|
|
9448
|
-
|
|
9449
|
-
|
|
9450
|
-
|
|
9451
|
-
|
|
10934
|
+
function summariseReferences(references, origins, productNames) {
|
|
10935
|
+
const counts = /* @__PURE__ */ new Map();
|
|
10936
|
+
const products = [];
|
|
10937
|
+
for (const reference of references) {
|
|
10938
|
+
const kind = referenceKindOf(reference.url, origins);
|
|
10939
|
+
if (kind !== null) counts.set(kind, (counts.get(kind) ?? 0) + 1);
|
|
10940
|
+
const parsed = readCatalogUrl(reference.url);
|
|
10941
|
+
const name = (parsed === null ? void 0 : productNames.get(parsed.origin)) ?? (reference.product || null);
|
|
10942
|
+
if (name != null && !products.includes(name)) products.push(name);
|
|
9452
10943
|
}
|
|
9453
|
-
|
|
9454
|
-
|
|
9455
|
-
|
|
9456
|
-
|
|
9457
|
-
|
|
9458
|
-
|
|
9459
|
-
|
|
9460
|
-
"data-label": label
|
|
9461
|
-
});
|
|
9462
|
-
});
|
|
9463
|
-
return /* @__PURE__ */ jsxRuntime.jsx("tr", { ...props, children: cells });
|
|
10944
|
+
return {
|
|
10945
|
+
total: references.length,
|
|
10946
|
+
kinds: REFERENCE_KIND_ORDER.filter((kind) => counts.has(kind)).map(
|
|
10947
|
+
(kind) => ({ kind, count: counts.get(kind) ?? 0 })
|
|
10948
|
+
),
|
|
10949
|
+
products
|
|
10950
|
+
};
|
|
9464
10951
|
}
|
|
9465
|
-
var ANSWER_MARKDOWN_COMPONENTS = {
|
|
9466
|
-
a: AnswerLink,
|
|
9467
|
-
img: InlineConceptImage,
|
|
9468
|
-
table: AnswerTable,
|
|
9469
|
-
tr: AnswerTableRow
|
|
9470
|
-
};
|
|
9471
10952
|
function ReferenceCard({
|
|
9472
10953
|
reference,
|
|
9473
10954
|
onFollow
|
|
@@ -9806,6 +11287,195 @@ function AnswerFeedback({
|
|
|
9806
11287
|
}
|
|
9807
11288
|
);
|
|
9808
11289
|
}
|
|
11290
|
+
function EscalateForm({
|
|
11291
|
+
strings: T,
|
|
11292
|
+
formId,
|
|
11293
|
+
onEscalate,
|
|
11294
|
+
onClose,
|
|
11295
|
+
onBusyChange
|
|
11296
|
+
}) {
|
|
11297
|
+
const [email, setEmail] = React.useState("");
|
|
11298
|
+
const [note, setNote] = React.useState("");
|
|
11299
|
+
const [error, setError] = React.useState(null);
|
|
11300
|
+
const [sending, setSending] = React.useState(false);
|
|
11301
|
+
const [sentTo, setSentTo] = React.useState(null);
|
|
11302
|
+
const emailRef = React.useRef(null);
|
|
11303
|
+
const inFlightRef = React.useRef(false);
|
|
11304
|
+
const titleId = `${formId}-title`;
|
|
11305
|
+
const emailId = `${formId}-email`;
|
|
11306
|
+
const noteId = `${formId}-note`;
|
|
11307
|
+
const errorId = `${formId}-error`;
|
|
11308
|
+
React.useEffect(() => {
|
|
11309
|
+
emailRef.current?.focus();
|
|
11310
|
+
}, []);
|
|
11311
|
+
React.useEffect(() => {
|
|
11312
|
+
onBusyChange?.(sending);
|
|
11313
|
+
return () => onBusyChange?.(false);
|
|
11314
|
+
}, [sending, onBusyChange]);
|
|
11315
|
+
const handleSubmit = React.useCallback(
|
|
11316
|
+
async (event) => {
|
|
11317
|
+
event.preventDefault();
|
|
11318
|
+
if (inFlightRef.current) return;
|
|
11319
|
+
const address = email.trim();
|
|
11320
|
+
if (!looksLikeDeliverableEmail(address)) {
|
|
11321
|
+
setError(T.escalateInvalidEmail);
|
|
11322
|
+
emailRef.current?.focus();
|
|
11323
|
+
return;
|
|
11324
|
+
}
|
|
11325
|
+
inFlightRef.current = true;
|
|
11326
|
+
setSending(true);
|
|
11327
|
+
setError(null);
|
|
11328
|
+
const result = await onEscalate(address, note);
|
|
11329
|
+
inFlightRef.current = false;
|
|
11330
|
+
setSending(false);
|
|
11331
|
+
switch (result.outcome) {
|
|
11332
|
+
case "sent":
|
|
11333
|
+
case "already-handed-over":
|
|
11334
|
+
setSentTo(result.email ?? address);
|
|
11335
|
+
return;
|
|
11336
|
+
case "invalid-email":
|
|
11337
|
+
setError(T.escalateInvalidEmail);
|
|
11338
|
+
emailRef.current?.focus();
|
|
11339
|
+
return;
|
|
11340
|
+
case "rate-limited":
|
|
11341
|
+
setError(T.escalateRateLimited);
|
|
11342
|
+
return;
|
|
11343
|
+
case "captcha":
|
|
11344
|
+
setError(T.escalateCaptcha);
|
|
11345
|
+
return;
|
|
11346
|
+
// `no-conversation` included: the form should not have been offered at all, and the
|
|
11347
|
+
// honest thing to show is that nothing was passed on.
|
|
11348
|
+
default:
|
|
11349
|
+
setError(T.escalateFailed);
|
|
11350
|
+
return;
|
|
11351
|
+
}
|
|
11352
|
+
},
|
|
11353
|
+
[T, email, note, onEscalate]
|
|
11354
|
+
);
|
|
11355
|
+
if (sentTo !== null) {
|
|
11356
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11357
|
+
"p",
|
|
11358
|
+
{
|
|
11359
|
+
id: formId,
|
|
11360
|
+
"data-boff-explore": "escalate-sent",
|
|
11361
|
+
role: "status",
|
|
11362
|
+
className: "boff-explore-fade mt-2 rounded-xl border border-border bg-card px-3 py-2 text-xs leading-relaxed text-card-foreground",
|
|
11363
|
+
children: fill(T.escalateSent, { email: sentTo })
|
|
11364
|
+
}
|
|
11365
|
+
);
|
|
11366
|
+
}
|
|
11367
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11368
|
+
"form",
|
|
11369
|
+
{
|
|
11370
|
+
id: formId,
|
|
11371
|
+
"data-boff-explore": "escalate-form",
|
|
11372
|
+
"aria-labelledby": titleId,
|
|
11373
|
+
noValidate: true,
|
|
11374
|
+
onSubmit: handleSubmit,
|
|
11375
|
+
onKeyDown: (event) => {
|
|
11376
|
+
if (event.key !== "Escape") return;
|
|
11377
|
+
event.stopPropagation();
|
|
11378
|
+
if (sending) return;
|
|
11379
|
+
onClose();
|
|
11380
|
+
},
|
|
11381
|
+
className: "boff-explore-fade mt-2 space-y-2 rounded-xl border border-border bg-card p-3",
|
|
11382
|
+
children: [
|
|
11383
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { id: titleId, className: "text-xs font-medium text-card-foreground", children: T.escalateTitle }),
|
|
11384
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: T.escalateBody }),
|
|
11385
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
11386
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11387
|
+
"label",
|
|
11388
|
+
{
|
|
11389
|
+
htmlFor: emailId,
|
|
11390
|
+
className: "block text-xs font-medium text-card-foreground",
|
|
11391
|
+
children: T.escalateEmailLabel
|
|
11392
|
+
}
|
|
11393
|
+
),
|
|
11394
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11395
|
+
"input",
|
|
11396
|
+
{
|
|
11397
|
+
ref: emailRef,
|
|
11398
|
+
id: emailId,
|
|
11399
|
+
name: "email",
|
|
11400
|
+
"data-boff-explore": "escalate-email",
|
|
11401
|
+
type: "email",
|
|
11402
|
+
inputMode: "email",
|
|
11403
|
+
autoComplete: "email",
|
|
11404
|
+
required: true,
|
|
11405
|
+
value: email,
|
|
11406
|
+
onChange: (event) => {
|
|
11407
|
+
setEmail(event.target.value);
|
|
11408
|
+
if (error) setError(null);
|
|
11409
|
+
},
|
|
11410
|
+
"aria-invalid": error ? "true" : void 0,
|
|
11411
|
+
"aria-describedby": error ? errorId : void 0,
|
|
11412
|
+
placeholder: T.escalateEmailPlaceholder,
|
|
11413
|
+
className: "w-full 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"
|
|
11414
|
+
}
|
|
11415
|
+
)
|
|
11416
|
+
] }),
|
|
11417
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
11418
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11419
|
+
"label",
|
|
11420
|
+
{
|
|
11421
|
+
htmlFor: noteId,
|
|
11422
|
+
className: "block text-xs font-medium text-card-foreground",
|
|
11423
|
+
children: T.escalateNoteLabel
|
|
11424
|
+
}
|
|
11425
|
+
),
|
|
11426
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11427
|
+
Textarea,
|
|
11428
|
+
{
|
|
11429
|
+
id: noteId,
|
|
11430
|
+
name: "note",
|
|
11431
|
+
"data-boff-explore": "escalate-note",
|
|
11432
|
+
rows: 2,
|
|
11433
|
+
value: note,
|
|
11434
|
+
onChange: (event) => setNote(event.target.value),
|
|
11435
|
+
maxLength: EXPLORE_ESCALATION_NOTE_SOFT_MAX,
|
|
11436
|
+
className: "min-h-0 border-border bg-background"
|
|
11437
|
+
}
|
|
11438
|
+
)
|
|
11439
|
+
] }),
|
|
11440
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
11441
|
+
"p",
|
|
11442
|
+
{
|
|
11443
|
+
id: errorId,
|
|
11444
|
+
"data-boff-explore": "escalate-error",
|
|
11445
|
+
role: "alert",
|
|
11446
|
+
className: "text-xs leading-relaxed text-destructive",
|
|
11447
|
+
children: error
|
|
11448
|
+
}
|
|
11449
|
+
) : null,
|
|
11450
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
11451
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11452
|
+
Button,
|
|
11453
|
+
{
|
|
11454
|
+
"data-boff-explore": "escalate-send",
|
|
11455
|
+
type: "submit",
|
|
11456
|
+
size: "sm",
|
|
11457
|
+
disabled: sending,
|
|
11458
|
+
children: sending ? T.escalateSending : T.escalateSubmit
|
|
11459
|
+
}
|
|
11460
|
+
),
|
|
11461
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11462
|
+
Button,
|
|
11463
|
+
{
|
|
11464
|
+
"data-boff-explore": "escalate-cancel",
|
|
11465
|
+
type: "button",
|
|
11466
|
+
size: "sm",
|
|
11467
|
+
variant: "ghost",
|
|
11468
|
+
className: "text-muted-foreground",
|
|
11469
|
+
disabled: sending,
|
|
11470
|
+
onClick: onClose,
|
|
11471
|
+
children: T.escalateCancel
|
|
11472
|
+
}
|
|
11473
|
+
)
|
|
11474
|
+
] })
|
|
11475
|
+
]
|
|
11476
|
+
}
|
|
11477
|
+
);
|
|
11478
|
+
}
|
|
9809
11479
|
var PROVENANCE_CHIP = "inline-flex max-w-full items-center gap-1 rounded-full border border-border bg-muted/60 px-2 py-0.5 text-[11px] leading-5 text-muted-foreground";
|
|
9810
11480
|
function ProvenanceChips({
|
|
9811
11481
|
strings: T,
|
|
@@ -9999,31 +11669,15 @@ function AssistantBubble({
|
|
|
9999
11669
|
anchorRef,
|
|
10000
11670
|
onFollow,
|
|
10001
11671
|
onFollowUp,
|
|
10002
|
-
onFeedback
|
|
11672
|
+
onFeedback,
|
|
11673
|
+
onEscalate,
|
|
11674
|
+
isLatestAnswer = false
|
|
10003
11675
|
}) {
|
|
10004
11676
|
const streaming = message.status === "PENDING" || message.status === "RUNNING";
|
|
10005
11677
|
const body = message.content || message.partialContent || "";
|
|
10006
11678
|
const failed = message.status === "FAILED";
|
|
10007
11679
|
const completed = message.status === "COMPLETED";
|
|
10008
11680
|
const visible = useProgressiveReveal(body, !streaming);
|
|
10009
|
-
const [failedImages, setFailedImages] = React.useState(
|
|
10010
|
-
() => /* @__PURE__ */ new Set()
|
|
10011
|
-
);
|
|
10012
|
-
const markImageFailed = React.useCallback((src) => {
|
|
10013
|
-
setFailedImages(
|
|
10014
|
-
(current) => current.has(src) ? current : new Set(current).add(src)
|
|
10015
|
-
);
|
|
10016
|
-
}, []);
|
|
10017
|
-
const answerScope = React.useMemo(
|
|
10018
|
-
() => ({
|
|
10019
|
-
strings: T,
|
|
10020
|
-
enabled: completed,
|
|
10021
|
-
origins: imageOrigins,
|
|
10022
|
-
failed: failedImages,
|
|
10023
|
-
onFailed: markImageFailed
|
|
10024
|
-
}),
|
|
10025
|
-
[T, completed, imageOrigins, failedImages, markImageFailed]
|
|
10026
|
-
);
|
|
10027
11681
|
const provenance = React.useMemo(
|
|
10028
11682
|
() => summariseReferences(message.references, imageOrigins, productNames),
|
|
10029
11683
|
[message.references, imageOrigins, productNames]
|
|
@@ -10037,6 +11691,20 @@ function AssistantBubble({
|
|
|
10037
11691
|
[message.content]
|
|
10038
11692
|
);
|
|
10039
11693
|
const grounded = completed && message.answered !== false;
|
|
11694
|
+
const [escalateOpen, setEscalateOpen] = React.useState(false);
|
|
11695
|
+
const [escalateBusy, setEscalateBusy] = React.useState(false);
|
|
11696
|
+
const escalateTriggerRef = React.useRef(null);
|
|
11697
|
+
const escalateFormId = `boff-explore-escalate-${message.id}`;
|
|
11698
|
+
const unanswered = completed && message.answered === false;
|
|
11699
|
+
const offerEscalate = Boolean(onEscalate) && completed;
|
|
11700
|
+
const showQuietEscalate = offerEscalate && !unanswered && isLatestAnswer;
|
|
11701
|
+
const closeEscalate = React.useCallback(() => {
|
|
11702
|
+
setEscalateOpen(false);
|
|
11703
|
+
escalateTriggerRef.current?.focus();
|
|
11704
|
+
}, []);
|
|
11705
|
+
const handleEscalateBusy = React.useCallback((busy) => {
|
|
11706
|
+
setEscalateBusy(busy);
|
|
11707
|
+
}, []);
|
|
10040
11708
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10041
11709
|
"div",
|
|
10042
11710
|
{
|
|
@@ -10054,7 +11722,7 @@ function AssistantBubble({
|
|
|
10054
11722
|
}
|
|
10055
11723
|
),
|
|
10056
11724
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-3", children: [
|
|
10057
|
-
|
|
11725
|
+
unanswered ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10058
11726
|
"div",
|
|
10059
11727
|
{
|
|
10060
11728
|
"data-boff-explore": "no-answer",
|
|
@@ -10064,18 +11732,39 @@ function AssistantBubble({
|
|
|
10064
11732
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
10065
11733
|
T.noAnswer,
|
|
10066
11734
|
" ",
|
|
10067
|
-
|
|
10068
|
-
|
|
10069
|
-
|
|
10070
|
-
|
|
10071
|
-
|
|
10072
|
-
|
|
10073
|
-
|
|
10074
|
-
|
|
10075
|
-
|
|
10076
|
-
|
|
10077
|
-
|
|
10078
|
-
|
|
11735
|
+
offerEscalate ? (
|
|
11736
|
+
/* The point of the wave: the same words, but they now open a form that
|
|
11737
|
+
sends the conversation we are both looking at, instead of a link to a
|
|
11738
|
+
blank contact page that asks the visitor to type it all again. */
|
|
11739
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11740
|
+
"button",
|
|
11741
|
+
{
|
|
11742
|
+
ref: escalateTriggerRef,
|
|
11743
|
+
"data-boff-explore": "escalate-open",
|
|
11744
|
+
type: "button",
|
|
11745
|
+
"aria-expanded": escalateOpen,
|
|
11746
|
+
"aria-controls": escalateOpen ? escalateFormId : void 0,
|
|
11747
|
+
onClick: () => setEscalateOpen(true),
|
|
11748
|
+
className: "rounded-sm underline underline-offset-2 hover:text-primary focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
11749
|
+
children: T.askHuman
|
|
11750
|
+
}
|
|
11751
|
+
)
|
|
11752
|
+
) : (
|
|
11753
|
+
/* No conversation to hand over (a shared, read-only view). The old dead end
|
|
11754
|
+
is still better than a control whose submit could only fail. */
|
|
11755
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11756
|
+
"a",
|
|
11757
|
+
{
|
|
11758
|
+
href: "/contact",
|
|
11759
|
+
className: "underline underline-offset-2 hover:text-primary",
|
|
11760
|
+
onClick: (event) => {
|
|
11761
|
+
if (!onNavigate) return;
|
|
11762
|
+
event.preventDefault();
|
|
11763
|
+
onNavigate("/contact");
|
|
11764
|
+
},
|
|
11765
|
+
children: T.askHuman
|
|
11766
|
+
}
|
|
11767
|
+
)
|
|
10079
11768
|
),
|
|
10080
11769
|
"."
|
|
10081
11770
|
] })
|
|
@@ -10083,7 +11772,16 @@ function AssistantBubble({
|
|
|
10083
11772
|
}
|
|
10084
11773
|
) : null,
|
|
10085
11774
|
visible ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl rounded-tl-md border border-border bg-card px-4 py-3 shadow-sm", children: [
|
|
10086
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11775
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11776
|
+
ExploreAnswerBody,
|
|
11777
|
+
{
|
|
11778
|
+
strings: T,
|
|
11779
|
+
imageOrigins,
|
|
11780
|
+
enabled: completed,
|
|
11781
|
+
className: "boff-prose-sm text-card-foreground",
|
|
11782
|
+
children: visible
|
|
11783
|
+
}
|
|
11784
|
+
),
|
|
10087
11785
|
streaming ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "boff-explore-caret", "aria-hidden": "true" }) : null
|
|
10088
11786
|
] }) : null,
|
|
10089
11787
|
grounded && provenance.total > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ProvenanceChips, { strings: T, provenance }) : null,
|
|
@@ -10143,6 +11841,30 @@ function AssistantBubble({
|
|
|
10143
11841
|
feedback: message.feedback,
|
|
10144
11842
|
onSubmit: onFeedback
|
|
10145
11843
|
}
|
|
11844
|
+
) : null,
|
|
11845
|
+
showQuietEscalate ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11846
|
+
"button",
|
|
11847
|
+
{
|
|
11848
|
+
ref: escalateTriggerRef,
|
|
11849
|
+
"data-boff-explore": "escalate-open",
|
|
11850
|
+
type: "button",
|
|
11851
|
+
"aria-expanded": escalateOpen,
|
|
11852
|
+
"aria-controls": escalateOpen ? escalateFormId : void 0,
|
|
11853
|
+
disabled: escalateBusy,
|
|
11854
|
+
onClick: () => setEscalateOpen((open) => !open),
|
|
11855
|
+
className: "rounded-sm text-xs text-muted-foreground underline underline-offset-2 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
11856
|
+
children: T.escalateOpen
|
|
11857
|
+
}
|
|
11858
|
+
) }) : null,
|
|
11859
|
+
escalateOpen && onEscalate ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
11860
|
+
EscalateForm,
|
|
11861
|
+
{
|
|
11862
|
+
strings: T,
|
|
11863
|
+
formId: escalateFormId,
|
|
11864
|
+
onEscalate,
|
|
11865
|
+
onClose: closeEscalate,
|
|
11866
|
+
onBusyChange: handleEscalateBusy
|
|
11867
|
+
}
|
|
10146
11868
|
) : null
|
|
10147
11869
|
] })
|
|
10148
11870
|
]
|
|
@@ -10368,7 +12090,7 @@ function ConceptStrip({
|
|
|
10368
12090
|
"div",
|
|
10369
12091
|
{
|
|
10370
12092
|
"data-boff-explore": "concept-strip-block",
|
|
10371
|
-
className: "boff-explore-rise boff-explore-rise-
|
|
12093
|
+
className: "boff-explore-rise boff-explore-rise-3 mt-6",
|
|
10372
12094
|
children: [
|
|
10373
12095
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.conceptStripTitle }),
|
|
10374
12096
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10558,15 +12280,6 @@ function WelcomeState({
|
|
|
10558
12280
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-4 text-balance break-words text-2xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
10559
12281
|
/* @__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 })
|
|
10560
12282
|
] }),
|
|
10561
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10562
|
-
ConceptStrip,
|
|
10563
|
-
{
|
|
10564
|
-
strings: T,
|
|
10565
|
-
highlights: conceptHighlights,
|
|
10566
|
-
onAsk: onPrompt,
|
|
10567
|
-
disabled
|
|
10568
|
-
}
|
|
10569
|
-
),
|
|
10570
12283
|
/* @__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(
|
|
10571
12284
|
"li",
|
|
10572
12285
|
{
|
|
@@ -10602,7 +12315,16 @@ function WelcomeState({
|
|
|
10602
12315
|
onFocus
|
|
10603
12316
|
}
|
|
10604
12317
|
)
|
|
10605
|
-
] }) : null
|
|
12318
|
+
] }) : null,
|
|
12319
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12320
|
+
ConceptStrip,
|
|
12321
|
+
{
|
|
12322
|
+
strings: T,
|
|
12323
|
+
highlights: conceptHighlights,
|
|
12324
|
+
onAsk: onPrompt,
|
|
12325
|
+
disabled
|
|
12326
|
+
}
|
|
12327
|
+
)
|
|
10606
12328
|
] });
|
|
10607
12329
|
}
|
|
10608
12330
|
function ExplorePage({
|
|
@@ -10649,6 +12371,8 @@ function ExplorePage({
|
|
|
10649
12371
|
clearHistory,
|
|
10650
12372
|
recordClick,
|
|
10651
12373
|
submitFeedback,
|
|
12374
|
+
escalate,
|
|
12375
|
+
canEscalate,
|
|
10652
12376
|
createShareLink,
|
|
10653
12377
|
isSharedView
|
|
10654
12378
|
} = useExploreChat({
|
|
@@ -11092,6 +12816,7 @@ function ExplorePage({
|
|
|
11092
12816
|
),
|
|
11093
12817
|
/* @__PURE__ */ jsxRuntime.jsx(ProseStyles, {}),
|
|
11094
12818
|
/* @__PURE__ */ jsxRuntime.jsx(ExploreStyles, {}),
|
|
12819
|
+
/* @__PURE__ */ jsxRuntime.jsx(ExploreAnswerStyles, {}),
|
|
11095
12820
|
!showWelcome ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2.5 border-b border-border px-4 py-2.5", children: [
|
|
11096
12821
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11097
12822
|
"span",
|
|
@@ -11270,7 +12995,9 @@ function ExplorePage({
|
|
|
11270
12995
|
anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
|
|
11271
12996
|
onFollow: (kind, url) => recordClick(message.id, kind, url),
|
|
11272
12997
|
onFollowUp: sendPrompt,
|
|
11273
|
-
onFeedback: isSharedView ? void 0 : (rating, detail) => submitFeedback(message.id, rating, detail)
|
|
12998
|
+
onFeedback: isSharedView ? void 0 : (rating, detail) => submitFeedback(message.id, rating, detail),
|
|
12999
|
+
onEscalate: canEscalate ? escalate : void 0,
|
|
13000
|
+
isLatestAnswer: message.id === latestAssistantId
|
|
11274
13001
|
},
|
|
11275
13002
|
message.id
|
|
11276
13003
|
)
|
|
@@ -11377,10 +13104,19 @@ function ExplorePage({
|
|
|
11377
13104
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
11378
13105
|
"div",
|
|
11379
13106
|
{
|
|
13107
|
+
"data-boff-explore": "composer-field",
|
|
11380
13108
|
className: cn(
|
|
11381
13109
|
"flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
|
|
11382
13110
|
busy && "boff-explore-busy",
|
|
11383
|
-
overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
|
|
13111
|
+
overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring",
|
|
13112
|
+
// The halo is an invitation, and an invitation is only useful before it has
|
|
13113
|
+
// been accepted: while the conversation is empty, the composer is usable, and
|
|
13114
|
+
// nothing has been typed. Once any of those stops being true the class goes
|
|
13115
|
+
// and the box is an ordinary card again. `-quiet` keeps the ring but stops the
|
|
13116
|
+
// movement the moment there are characters in the field, so it does not pulse
|
|
13117
|
+
// at someone who is mid-sentence.
|
|
13118
|
+
showWelcome && !composerDisabled && !overLimit && "boff-explore-invite",
|
|
13119
|
+
showWelcome && draft.length > 0 && "boff-explore-invite-quiet"
|
|
11384
13120
|
),
|
|
11385
13121
|
children: [
|
|
11386
13122
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16227,6 +17963,11 @@ function StoreProductDetailPage({
|
|
|
16227
17963
|
] });
|
|
16228
17964
|
}
|
|
16229
17965
|
|
|
17966
|
+
exports.ANSWERS_PATH = ANSWERS_PATH;
|
|
17967
|
+
exports.ANSWER_HEADING_SHIFT = ANSWER_HEADING_SHIFT;
|
|
17968
|
+
exports.ANSWER_PATH_PREFIX = ANSWER_PATH_PREFIX;
|
|
17969
|
+
exports.AnswerDetailPage = AnswerDetailPage;
|
|
17970
|
+
exports.AnswersPage = AnswersPage;
|
|
16230
17971
|
exports.BlogListPage = BlogListPage;
|
|
16231
17972
|
exports.BlogPostPage = BlogPostPage;
|
|
16232
17973
|
exports.Button = Button;
|
|
@@ -16246,12 +17987,16 @@ exports.ContractsPage = ContractsPage;
|
|
|
16246
17987
|
exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
|
|
16247
17988
|
exports.DEFAULT_EXPLORE_EXAMPLE_PROMPTS = DEFAULT_EXPLORE_EXAMPLE_PROMPTS;
|
|
16248
17989
|
exports.ECOSYSTEM_PRODUCTS = ECOSYSTEM_PRODUCTS;
|
|
17990
|
+
exports.ESCALATE_EXPLORE_CONVERSATION_MUTATION = ESCALATE_EXPLORE_CONVERSATION_MUTATION;
|
|
16249
17991
|
exports.EXPLORE_CATALOG_QUERY = EXPLORE_CATALOG_QUERY;
|
|
16250
17992
|
exports.EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS = EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS;
|
|
17993
|
+
exports.EXPLORE_ESCALATION_NOTE_SOFT_MAX = EXPLORE_ESCALATION_NOTE_SOFT_MAX;
|
|
16251
17994
|
exports.EXPLORE_LOCALES = EXPLORE_LOCALES;
|
|
16252
17995
|
exports.EXPLORE_MESSAGE_QUERY = EXPLORE_MESSAGE_QUERY;
|
|
16253
17996
|
exports.EXPLORE_RECAPTCHA_ACTION = EXPLORE_RECAPTCHA_ACTION;
|
|
16254
17997
|
exports.ElectronDownloadLink = ElectronDownloadLink;
|
|
17998
|
+
exports.ExploreAnswerBody = ExploreAnswerBody;
|
|
17999
|
+
exports.ExploreAnswerStyles = ExploreAnswerStyles;
|
|
16255
18000
|
exports.ExploreCta = ExploreCta;
|
|
16256
18001
|
exports.ExplorePage = ExplorePage;
|
|
16257
18002
|
exports.FALLBACK_EXPLORE_LIMITS = FALLBACK_EXPLORE_LIMITS;
|
|
@@ -16261,6 +18006,7 @@ exports.LaunchCountdown = LaunchCountdown;
|
|
|
16261
18006
|
exports.Markdown = Markdown;
|
|
16262
18007
|
exports.NewsletterForm = NewsletterForm;
|
|
16263
18008
|
exports.NewsletterPage = NewsletterPage;
|
|
18009
|
+
exports.PUBLISHED_ANSWER_FIELDS = PUBLISHED_ANSWER_FIELDS;
|
|
16264
18010
|
exports.PageHead = PageHead;
|
|
16265
18011
|
exports.PartnersPage = PartnersPage;
|
|
16266
18012
|
exports.PressKitPage = PressKitPage;
|
|
@@ -16286,6 +18032,11 @@ exports.WaitlistPage = WaitlistPage;
|
|
|
16286
18032
|
exports.WebSDKClient = WebSDKClient;
|
|
16287
18033
|
exports.WebSDKProvider = WebSDKProvider;
|
|
16288
18034
|
exports.WebsiteSwitcher = WebsiteSwitcher;
|
|
18035
|
+
exports.answerPath = answerPath;
|
|
18036
|
+
exports.answerPlainText = answerPlainText;
|
|
18037
|
+
exports.answerSourceHost = answerSourceHost;
|
|
18038
|
+
exports.answerSpeechText = answerSpeechText;
|
|
18039
|
+
exports.answerStrings = answerStrings;
|
|
16289
18040
|
exports.buttonVariants = buttonVariants;
|
|
16290
18041
|
exports.classifyExploreError = classifyExploreError;
|
|
16291
18042
|
exports.cn = cn;
|
|
@@ -16294,12 +18045,18 @@ exports.detectElectronPlatform = detectElectronPlatform;
|
|
|
16294
18045
|
exports.fetchPublicJobPosting = fetchPublicJobPosting;
|
|
16295
18046
|
exports.fetchPublicJobPostings = fetchPublicJobPostings;
|
|
16296
18047
|
exports.fetchPublicJobPostingsForSubmission = fetchPublicJobPostingsForSubmission;
|
|
18048
|
+
exports.formatAnswerDate = formatAnswerDate;
|
|
16297
18049
|
exports.formatDownloads = formatDownloads;
|
|
16298
18050
|
exports.formatPrice = formatPrice2;
|
|
18051
|
+
exports.getAnswerBySlug = getAnswerBySlug;
|
|
16299
18052
|
exports.getConceptBySlug = getConceptBySlug;
|
|
16300
18053
|
exports.getRecaptchaV3Token = getRecaptchaV3Token;
|
|
18054
|
+
exports.inlineImageOrigins = inlineImageOrigins;
|
|
18055
|
+
exports.isInlineImageAllowed = isInlineImageAllowed;
|
|
18056
|
+
exports.isPublishedSourceUrl = isPublishedSourceUrl;
|
|
16301
18057
|
exports.isValidUrl = isValidUrl;
|
|
16302
18058
|
exports.loadRecaptchaV3 = loadRecaptchaV3;
|
|
18059
|
+
exports.looksLikeDeliverableEmail = looksLikeDeliverableEmail;
|
|
16303
18060
|
exports.speechLocaleOf = speechLocaleOf;
|
|
16304
18061
|
exports.stopSpeaking = stopSpeaking;
|
|
16305
18062
|
exports.useContentPage = useContentPage;
|