@burdenoff/website-sdk 2026.921.1 → 2026.922.2

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/index.mjs CHANGED
@@ -5920,8 +5920,8 @@ function isRtlLocale(locale) {
5920
5920
  }
5921
5921
  var EN = {
5922
5922
  badge: "AI answers, grounded in our documentation",
5923
- welcomeTitle: "Ask anything about our products",
5924
- welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
5923
+ welcomeTitle: "What problem are you trying to solve?",
5924
+ welcomeBody: "Describe the problem you're facing, in your own words. You can also ask about a specific product or compare a few. Every answer comes straight from our documentation.",
5925
5925
  tryAsking: "Try asking",
5926
5926
  focusProduct: "Focus on a product",
5927
5927
  allProducts: "All products",
@@ -5929,8 +5929,8 @@ var EN = {
5929
5929
  showLess: "Show less",
5930
5930
  sources: "Sources",
5931
5931
  nextYouCouldAsk: "Next you could ask",
5932
- placeholder: "Ask anything about our products\u2026",
5933
- placeholderProduct: "Ask about {product}\u2026",
5932
+ placeholder: "Describe the problem you're facing\u2026",
5933
+ placeholderProduct: "Describe a problem, or ask about {product}\u2026",
5934
5934
  send: "Send",
5935
5935
  stop: "Stop",
5936
5936
  newChat: "New chat",
@@ -5963,16 +5963,16 @@ var EN = {
5963
5963
  "Straight to the right page"
5964
5964
  ],
5965
5965
  prompts: [
5966
- "What does this product actually do?",
5967
- "Which product fits my team?",
5968
- "How do I get started, step by step?",
5969
- "How much does it cost?"
5966
+ "Every course we run lives in a different spreadsheet.",
5967
+ "We only hear a machine is down after the line has stopped.",
5968
+ "Members quietly stop showing up and we never know why.",
5969
+ "Which of your products fits a problem like mine?"
5970
5970
  ]
5971
5971
  };
5972
5972
  var ZH = {
5973
5973
  badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
5974
- welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
5975
- welcomeBody: "\u63CF\u8FF0\u4F60\u60F3\u505A\u7684\u4E8B\uFF0C\u6211\u4F1A\u4E3A\u4F60\u6307\u51FA\u5BF9\u5E94\u7684\u4EA7\u54C1\u3001\u9875\u9762\u548C\u4E0B\u4E00\u6B65\u3002",
5974
+ welcomeTitle: "\u4F60\u60F3\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\uFF1F",
5975
+ welcomeBody: "\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u63CF\u8FF0\u4F60\u9047\u5230\u7684\u95EE\u9898\u3002\u4F60\u4E5F\u53EF\u4EE5\u8BE2\u95EE\u67D0\u4E00\u6B3E\u4EA7\u54C1\uFF0C\u6216\u6BD4\u8F83\u51E0\u6B3E\u4EA7\u54C1\u3002\u6240\u6709\u56DE\u7B54\u90FD\u76F4\u63A5\u6765\u81EA\u6211\u4EEC\u7684\u6587\u6863\u3002",
5976
5976
  tryAsking: "\u8BD5\u7740\u95EE",
5977
5977
  focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
5978
5978
  allProducts: "\u5168\u90E8\u4EA7\u54C1",
@@ -5980,8 +5980,8 @@ var ZH = {
5980
5980
  showLess: "\u6536\u8D77",
5981
5981
  sources: "\u6765\u6E90",
5982
5982
  nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
5983
- placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
5984
- placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
5983
+ placeholder: "\u63CF\u8FF0\u4F60\u9047\u5230\u7684\u95EE\u9898\u2026",
5984
+ placeholderProduct: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8BE2\u95EE {product}\u2026",
5985
5985
  send: "\u53D1\u9001",
5986
5986
  stop: "\u505C\u6B62",
5987
5987
  newChat: "\u65B0\u5BF9\u8BDD",
@@ -6010,16 +6010,16 @@ var ZH = {
6010
6010
  opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
6011
6011
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
6012
6012
  prompts: [
6013
- "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
6014
- "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
6015
- "\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
6016
- "\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
6013
+ "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
6014
+ "\u673A\u5668\u505C\u4E86\uFF0C\u8981\u7B49\u6574\u6761\u7EBF\u505C\u4E0B\u6765\u624D\u77E5\u9053\u3002",
6015
+ "\u4F1A\u5458\u6162\u6162\u5C31\u4E0D\u6765\u4E86\uFF0C\u6211\u4EEC\u4E5F\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\u3002",
6016
+ "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F"
6017
6017
  ]
6018
6018
  };
6019
6019
  var HI = {
6020
6020
  badge: "\u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 AI \u0909\u0924\u094D\u0924\u0930",
6021
- welcomeTitle: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902",
6022
- welcomeBody: "\u092C\u0924\u093E\u0907\u090F \u0906\u092A \u0915\u094D\u092F\u093E \u0915\u0930\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902, \u0914\u0930 \u092E\u0948\u0902 \u0906\u092A\u0915\u094B \u0938\u0939\u0940 \u0909\u0924\u094D\u092A\u093E\u0926, \u092A\u0947\u091C \u0914\u0930 \u0905\u0917\u0932\u093E \u0915\u0926\u092E \u092C\u0924\u093E\u090A\u0901\u0917\u093E\u0964",
6021
+ welcomeTitle: "\u0906\u092A \u0915\u094C\u0928 \u0938\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0939\u0932 \u0915\u0930\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902?",
6022
+ welcomeBody: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0905\u092A\u0928\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092C\u0924\u093E\u090F\u0902\u0964 \u0906\u092A \u0915\u093F\u0938\u0940 \u090F\u0915 \u0909\u0924\u094D\u092A\u093E\u0926 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092D\u0940 \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902 \u092F\u093E \u0915\u0941\u091B \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u0939\u0930 \u0909\u0924\u094D\u0924\u0930 \u0938\u0940\u0927\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C \u0938\u0947 \u0906\u0924\u093E \u0939\u0948\u0964",
6023
6023
  tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
6024
6024
  focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
6025
6025
  allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
@@ -6027,8 +6027,8 @@ var HI = {
6027
6027
  showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
6028
6028
  sources: "\u0938\u094D\u0930\u094B\u0924",
6029
6029
  nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
6030
- placeholder: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902\u2026",
6031
- placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6030
+ placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u092F\u0939\u093E\u0901 \u092C\u0924\u093E\u090F\u0902\u2026",
6031
+ 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",
6032
6032
  send: "\u092D\u0947\u091C\u0947\u0902",
6033
6033
  stop: "\u0930\u094B\u0915\u0947\u0902",
6034
6034
  newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
@@ -6061,16 +6061,16 @@ var HI = {
6061
6061
  "\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
6062
6062
  ],
6063
6063
  prompts: [
6064
- "\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
6065
- "\u092E\u0947\u0930\u0940 \u091F\u0940\u092E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?",
6066
- "\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
6067
- "\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
6064
+ "\u0939\u0930 \u0915\u094B\u0930\u094D\u0938 \u0915\u093E \u0939\u093F\u0938\u093E\u092C \u0905\u0932\u0917 \u0936\u0940\u091F \u092E\u0947\u0902 \u0930\u0916\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964",
6065
+ "\u092E\u0936\u0940\u0928 \u092C\u0902\u0926 \u0939\u094B\u0928\u0947 \u0915\u093E \u092A\u0924\u093E \u0924\u092D\u0940 \u091A\u0932\u0924\u093E \u0939\u0948 \u091C\u092C \u0932\u093E\u0907\u0928 \u0930\u0941\u0915 \u091C\u093E\u090F\u0964",
6066
+ "\u0938\u0926\u0938\u094D\u092F \u0927\u0940\u0930\u0947-\u0927\u0940\u0930\u0947 \u0906\u0928\u093E \u092C\u0902\u0926 \u0915\u0930 \u0926\u0947\u0924\u0947 \u0939\u0948\u0902, \u0935\u091C\u0939 \u092A\u0924\u093E \u0928\u0939\u0940\u0902 \u091A\u0932\u0924\u0940\u0964",
6067
+ "\u092E\u0947\u0930\u0940 \u091C\u0948\u0938\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?"
6068
6068
  ]
6069
6069
  };
6070
6070
  var ES = {
6071
6071
  badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
6072
- welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
6073
- welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
6072
+ welcomeTitle: "\xBFQu\xE9 problema quieres resolver?",
6073
+ welcomeBody: "Describe el problema que tienes con tus propias palabras. Tambi\xE9n puedes preguntar por un producto concreto o comparar varios. Cada respuesta procede directamente de nuestra documentaci\xF3n.",
6074
6074
  tryAsking: "Prueba a preguntar",
6075
6075
  focusProduct: "Centrarse en un producto",
6076
6076
  allProducts: "Todos los productos",
@@ -6078,8 +6078,8 @@ var ES = {
6078
6078
  showLess: "Ver menos",
6079
6079
  sources: "Fuentes",
6080
6080
  nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
6081
- placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
6082
- placeholderProduct: "Pregunta sobre {product}\u2026",
6081
+ placeholder: "Describe el problema que tienes\u2026",
6082
+ placeholderProduct: "Describe un problema o pregunta por {product}\u2026",
6083
6083
  send: "Enviar",
6084
6084
  stop: "Detener",
6085
6085
  newChat: "Nueva conversaci\xF3n",
@@ -6112,16 +6112,16 @@ var ES = {
6112
6112
  "Directo a la p\xE1gina correcta"
6113
6113
  ],
6114
6114
  prompts: [
6115
- "\xBFQu\xE9 hace realmente este producto?",
6116
- "\xBFQu\xE9 producto encaja con mi equipo?",
6117
- "\xBFC\xF3mo empiezo, paso a paso?",
6118
- "\xBFCu\xE1nto cuesta?"
6115
+ "Cada curso que damos est\xE1 en una hoja de c\xE1lculo distinta.",
6116
+ "Nos enteramos de que una m\xE1quina falla cuando para la l\xEDnea.",
6117
+ "Los socios dejan de venir poco a poco y nunca sabemos por qu\xE9.",
6118
+ "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?"
6119
6119
  ]
6120
6120
  };
6121
6121
  var AR = {
6122
6122
  badge: "\u0625\u062C\u0627\u0628\u0627\u062A \u0630\u0643\u0627\u0621 \u0627\u0635\u0637\u0646\u0627\u0639\u064A \u0645\u0628\u0646\u064A\u0629 \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
6123
- welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
6124
- welcomeBody: "\u0635\u0650\u0641 \u0645\u0627 \u062A\u0631\u064A\u062F \u0625\u0646\u062C\u0627\u0632\u0647 \u0648\u0633\u0623\u062F\u0644\u0651\u0643 \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u062A\u062C \u0648\u0627\u0644\u0635\u0641\u062D\u0629 \u0648\u0627\u0644\u062E\u0637\u0648\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629.",
6123
+ welcomeTitle: "\u0645\u0627 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u062D\u0627\u0648\u0644 \u062D\u0644\u0647\u0627\u061F",
6124
+ welcomeBody: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627 \u0628\u0643\u0644\u0645\u0627\u062A\u0643 \u0623\u0646\u062A. \u064A\u0645\u0643\u0646\u0643 \u0623\u064A\u0636\u064B\u0627 \u0627\u0644\u0633\u0624\u0627\u0644 \u0639\u0646 \u0645\u0646\u062A\u062C \u0628\u0639\u064A\u0646\u0647 \u0623\u0648 \u0627\u0644\u0645\u0642\u0627\u0631\u0646\u0629 \u0628\u064A\u0646 \u0639\u062F\u0629 \u0645\u0646\u062A\u062C\u0627\u062A. \u062A\u0623\u062A\u064A \u0643\u0644 \u0625\u062C\u0627\u0628\u0629 \u0645\u0628\u0627\u0634\u0631\u0629 \u0645\u0646 \u0648\u062B\u0627\u0626\u0642\u0646\u0627.",
6125
6125
  tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
6126
6126
  focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
6127
6127
  allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
@@ -6129,8 +6129,8 @@ var AR = {
6129
6129
  showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
6130
6130
  sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
6131
6131
  nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
6132
- placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
6133
- placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6132
+ placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627\u2026",
6133
+ placeholderProduct: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6134
6134
  send: "\u0625\u0631\u0633\u0627\u0644",
6135
6135
  stop: "\u0625\u064A\u0642\u0627\u0641",
6136
6136
  newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
@@ -6163,16 +6163,16 @@ var AR = {
6163
6163
  "\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
6164
6164
  ],
6165
6165
  prompts: [
6166
- "\u0645\u0627 \u0627\u0644\u0630\u064A \u064A\u0641\u0639\u0644\u0647 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u062A\u062C \u0641\u0639\u0644\u064A\u064B\u0627\u061F",
6167
- "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
6168
- "\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
6169
- "\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
6166
+ "\u0643\u0644 \u062F\u0648\u0631\u0629 \u062A\u062F\u0631\u064A\u0628\u064A\u0629 \u0644\u062F\u064A\u0646\u0627 \u0641\u064A \u062C\u062F\u0648\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0645\u062E\u062A\u0644\u0641.",
6167
+ "\u0644\u0627 \u0646\u0639\u0644\u0645 \u0628\u062A\u0639\u0637\u0644 \u0627\u0644\u0645\u0627\u0643\u064A\u0646\u0629 \u0625\u0644\u0627 \u0628\u0639\u062F \u062A\u0648\u0642\u0641 \u062E\u0637 \u0627\u0644\u0625\u0646\u062A\u0627\u062C.",
6168
+ "\u0623\u0639\u0636\u0627\u0624\u0646\u0627 \u064A\u062A\u0648\u0642\u0641\u0648\u0646 \u0639\u0646 \u0627\u0644\u062D\u0636\u0648\u0631 \u062A\u062F\u0631\u064A\u062C\u064A\u064B\u0627 \u062F\u0648\u0646 \u0623\u0646 \u0646\u0639\u0631\u0641 \u0627\u0644\u0633\u0628\u0628.",
6169
+ "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0645\u0634\u0643\u0644\u0629 \u0645\u062B\u0644 \u0645\u0634\u0643\u0644\u062A\u064A\u061F"
6170
6170
  ]
6171
6171
  };
6172
6172
  var TA = {
6173
6173
  badge: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F AI \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",
6174
- welcomeTitle: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF \u0B8E\u0BA4\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6175
- welcomeBody: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BC6\u0BAF\u0BCD\u0BAF \u0BB5\u0BBF\u0BB0\u0BC1\u0BAE\u0BCD\u0BAA\u0BC1\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA9\u0BCD\u0BB1\u0BC1 \u0B9A\u0BCA\u0BB2\u0BCD\u0BB2\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD; \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1, \u0BAA\u0B95\u0BCD\u0B95\u0BAE\u0BCD, \u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0B9F\u0BBF \u0B86\u0B95\u0BBF\u0BAF\u0BB5\u0BB1\u0BCD\u0BB1\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BBF\u0BB1\u0BC7\u0BA9\u0BCD.",
6174
+ welcomeTitle: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA8\u0BCD\u0BA4\u0B9A\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8\u0BA4\u0BCD \u0BA4\u0BC0\u0BB0\u0BCD\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0BAF\u0BB2\u0BCD\u0B95\u0BBF\u0BB1\u0BC0\u0BB0\u0BCD\u0B95\u0BB3\u0BCD?",
6175
+ welcomeBody: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0BB5\u0BBE\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4\u0BC8\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD. \u0B92\u0BB0\u0BC1 \u0B95\u0BC1\u0BB1\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BCD\u0B9F \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD, \u0B9A\u0BBF\u0BB2\u0BB5\u0BB1\u0BCD\u0BB1\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BB5\u0BC1\u0BAE\u0BCD \u0B9A\u0BC6\u0BAF\u0BCD\u0BAF\u0BB2\u0BBE\u0BAE\u0BCD. \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0BAE\u0BCD \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC7\u0BB0\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
6176
6176
  tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6177
6177
  focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
6178
6178
  allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
@@ -6180,8 +6180,8 @@ var TA = {
6180
6180
  showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
6181
6181
  sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6182
6182
  nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
6183
- placeholder: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF \u0B8E\u0BA4\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6184
- placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6183
+ placeholder: "\u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0BAE\u0BCD \u0B9A\u0BBF\u0B95\u0BCD\u0B95\u0BB2\u0BC8 \u0BB5\u0BBF\u0BB5\u0BB0\u0BBF\u0BAF\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6184
+ 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",
6185
6185
  send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
6186
6186
  stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
6187
6187
  newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
@@ -6214,10 +6214,10 @@ var TA = {
6214
6214
  "\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
6215
6215
  ],
6216
6216
  prompts: [
6217
- "\u0B87\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0B89\u0BA3\u0BCD\u0BAE\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B8E\u0BA9\u0BCD\u0BA9 \u0B9A\u0BC6\u0BAF\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1?",
6218
- "\u0B8E\u0BA9\u0BCD \u0B95\u0BC1\u0BB4\u0BC1\u0BB5\u0BBF\u0BB1\u0BCD\u0B95\u0BC1 \u0B8E\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD?",
6219
- "\u0BAA\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0BAF\u0BBE\u0B95 \u0B8E\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0BA4\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95\u0BC1\u0BB5\u0BA4\u0BC1?",
6220
- "\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
6217
+ "\u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BB0\u0BC1 \u0BAA\u0BAF\u0BBF\u0BB1\u0BCD\u0B9A\u0BBF \u0BB5\u0B95\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BAE\u0BCD \u0BB5\u0BC6\u0BB5\u0BCD\u0BB5\u0BC7\u0BB1\u0BC1 \u0BB5\u0BBF\u0BB0\u0BBF\u0BA4\u0BBE\u0BB3\u0BBF\u0BB2\u0BCD \u0B89\u0BB3\u0BCD\u0BB3\u0BA4\u0BC1.",
6218
+ "\u0B87\u0BAF\u0BA8\u0BCD\u0BA4\u0BBF\u0BB0\u0BAE\u0BCD \u0BA8\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1 \u0BB2\u0BC8\u0BA9\u0BCD \u0BA8\u0BBF\u0BB1\u0BCD\u0B95\u0BC1\u0BAE\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1\u0BA4\u0BBE\u0BA9\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF \u0BB5\u0BB0\u0BC1\u0B95\u0BBF\u0BB1\u0BA4\u0BC1.",
6219
+ "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BBF\u0BA9\u0BB0\u0BCD\u0B95\u0BB3\u0BCD \u0BAE\u0BC6\u0BB2\u0BCD\u0BB2 \u0BB5\u0BB0\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BBF\u0BB1\u0BBE\u0BB0\u0BCD\u0B95\u0BB3\u0BCD, \u0B95\u0BBE\u0BB0\u0BA3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4\u0BC1.",
6220
+ "\u0B8E\u0BA9\u0BCD \u0BAA\u0BBF\u0BB0\u0B9A\u0BCD\u0B9A\u0BBF\u0BA9\u0BC8\u0B95\u0BCD\u0B95\u0BC1 \u0B8E\u0BA8\u0BCD\u0BA4\u0BA4\u0BCD \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD?"
6221
6221
  ]
6222
6222
  };
6223
6223
  var STRINGS = {
@@ -6816,13 +6816,13 @@ var FALLBACK_EXPLORE_LIMITS = {
6816
6816
  historyTurns: 6
6817
6817
  };
6818
6818
  var DEFAULT_EXPLORE_EXAMPLE_PROMPTS = [
6819
- "What does this product actually do?",
6820
- "Which Burdenoff product fits my team?",
6821
- "How do I get started, step by step?",
6822
- "What does it integrate with?"
6819
+ "Every course we run lives in a different spreadsheet.",
6820
+ "We only hear a machine is down after the line has stopped.",
6821
+ "Members quietly stop showing up and we never know why.",
6822
+ "Which of your products fits a problem like mine?"
6823
6823
  ];
6824
- var FALLBACK_WELCOME_TITLE = "Ask anything about our products";
6825
- var FALLBACK_WELCOME_BODY = "Get straight answers drawn from our product documentation and public pages \u2014 with links back to the exact page each answer came from.";
6824
+ var FALLBACK_WELCOME_TITLE = "What problem are you trying to solve?";
6825
+ var FALLBACK_WELCOME_BODY = "Describe the problem you're facing, in your own words. You can also ask about a specific product or compare a few. Every answer comes straight from our documentation.";
6826
6826
  function buildFallbackCatalog(examplePrompts, welcome) {
6827
6827
  return {
6828
6828
  enabled: true,
@@ -7999,6 +7999,7 @@ function toPayload(staged) {
7999
7999
  textContent
8000
8000
  }));
8001
8001
  }
8002
+ var SHORT_VIEWPORT_PX = 420;
8002
8003
  var EXPLORE_CSS = `
8003
8004
  @keyframes boff-explore-pulse {
8004
8005
  0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
@@ -8033,6 +8034,12 @@ var EXPLORE_CSS = `
8033
8034
  .boff-explore-scroll {
8034
8035
  scrollbar-width: thin;
8035
8036
  scrollbar-color: hsl(var(--border)) transparent;
8037
+ /* Stop the transcript handing its scroll to the page. Without this, the first
8038
+ swipe that exhausts the transcript chains to the document \u2014 and on a host site
8039
+ that is 65-70% footer, which is how a phone ends up showing nothing but the
8040
+ footer. Engines that do not support this property ignore the line and keep
8041
+ today's behaviour; the scroll correction above covers them. */
8042
+ overscroll-behavior: contain;
8036
8043
  }
8037
8044
  .boff-explore-scroll::-webkit-scrollbar { width: 10px; }
8038
8045
  .boff-explore-scroll::-webkit-scrollbar-track { background: transparent; }
@@ -8150,6 +8157,68 @@ var EXPLORE_CSS = `
8150
8157
  .boff-explore-busy::after { animation: none; }
8151
8158
  .boff-explore-rise { animation: none; opacity: 1; transform: none; }
8152
8159
  }
8160
+
8161
+ /* ---- Pane height ----------------------------------------------------------------------
8162
+ This used to be one inline declaration, \`height: calc(100dvh - 64px)\`, and it carried two
8163
+ defects. An inline style cannot carry a fallback, so every engine without \`dvh\` (iOS
8164
+ Safari < 15.4, Chrome/WebView < 108, Samsung Internet < 21, Firefox < 101) dropped it
8165
+ whole; and the 64px came from a prop hard-coded to 64 on all 41 host pages that matches
8166
+ none of them \u2014 the burdenoff/algoshred chrome is 80px, the sticky-header sites are 65.
8167
+
8168
+ A class plus custom properties lets the cascade do the work: \`vh\` is the floor and \`dvh\`
8169
+ an upgrade where it exists, while the two measured values stay *lengths*, never a height.
8170
+ That distinction is the whole prerender contract. The host sites snapshot \`/explore\` by
8171
+ loading the built SPA in headless Chromium and writing the POST-HYDRATION DOM to
8172
+ dist/explore/index.html, so every attribute and inline value this component sets after
8173
+ mount IS the static HTML CloudFront serves. A measured pixel *height* would therefore
8174
+ hand every phone the prerender viewport's height until the bundle executes; a measured
8175
+ *offset* is a site-header height, which is the same on every device to within a few
8176
+ pixels, and the height built from it stays viewport-relative on the visitor's own screen.
8177
+
8178
+ --boff-explore-offset chrome above the pane (measured root top; the prop pre-measure)
8179
+ --boff-explore-inset the slice of the layout viewport hidden below the visible area \u2014
8180
+ the on-screen keyboard, which \`dvh\` does not track. Zero unless
8181
+ something is actually covering the bottom, so a snapshot taken
8182
+ with no keyboard open never carries it. */
8183
+ .boff-explore-viewport {
8184
+ height: calc(100vh - var(--boff-explore-offset, 0px) - var(--boff-explore-inset, 0px));
8185
+ }
8186
+ @supports (height: 100dvh) {
8187
+ .boff-explore-viewport {
8188
+ height: calc(100dvh - var(--boff-explore-offset, 0px) - var(--boff-explore-inset, 0px));
8189
+ }
8190
+ }
8191
+
8192
+ /* Landscape phones and other short viewports: a one-screen pane leaves a ~124px transcript
8193
+ sliver under ~610px of chrome and content. At or below the threshold the pane stops
8194
+ pretending to be a window and lets the page's own scrolling carry the transcript. The
8195
+ min-height is the available height rather than a fixed rem value, so the fallback can
8196
+ never be taller than the screen it is rescuing. */
8197
+ @media (max-height: ${SHORT_VIEWPORT_PX}px) {
8198
+ .boff-explore-viewport {
8199
+ height: auto;
8200
+ min-height: calc(100vh - var(--boff-explore-offset, 0px));
8201
+ }
8202
+ }
8203
+ @supports (height: 100dvh) {
8204
+ @media (max-height: ${SHORT_VIEWPORT_PX}px) {
8205
+ .boff-explore-viewport {
8206
+ min-height: calc(100dvh - var(--boff-explore-offset, 0px));
8207
+ }
8208
+ }
8209
+ }
8210
+
8211
+ /* ---- Composer dock --------------------------------------------------------------------
8212
+ Three declarations, each the fallback for the one after it: a plain 1rem where \`max()\`
8213
+ is unknown, then the measured overlap of any FOREIGN fixed chrome sitting over the
8214
+ composer (the host sites' cookie banner is 229px tall and lands exactly there), then the
8215
+ same plus the home-indicator inset. \`--boff-explore-chrome\` is set on the root only once
8216
+ an overlap has actually been measured, so everywhere else this collapses to 1rem. */
8217
+ .boff-explore-composer {
8218
+ padding-bottom: 1rem;
8219
+ padding-bottom: max(1rem, var(--boff-explore-chrome, 0px));
8220
+ padding-bottom: max(1rem, env(safe-area-inset-bottom), var(--boff-explore-chrome, 0px));
8221
+ }
8153
8222
  `;
8154
8223
  function ExploreStyles() {
8155
8224
  return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
@@ -8171,6 +8240,8 @@ var CAPABILITIES = [
8171
8240
  body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
8172
8241
  }
8173
8242
  ];
8243
+ var MIN_VISIBLE_FRACTION = 0.25;
8244
+ var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
8174
8245
  var CTA_VARIANTS = {
8175
8246
  CONTACT: "default",
8176
8247
  WAITLIST: "default",
@@ -8186,6 +8257,28 @@ function normalizeOffset(offset) {
8186
8257
  if (offset === void 0) return "0px";
8187
8258
  return typeof offset === "number" ? `${offset}px` : offset;
8188
8259
  }
8260
+ function isOwnElement(el, root) {
8261
+ if (el === document.body || el === document.documentElement) return true;
8262
+ if (root.contains(el)) return true;
8263
+ return el.closest(SDK_OVERLAY_SELECTOR) !== null;
8264
+ }
8265
+ function visualViewportHeight() {
8266
+ return window.visualViewport?.height ?? window.innerHeight;
8267
+ }
8268
+ function clamp(value, min, max) {
8269
+ return Math.min(Math.max(value, min), max);
8270
+ }
8271
+ function isRestoredNavigation() {
8272
+ const entries = window.performance?.getEntriesByType?.("navigation");
8273
+ const entry = entries?.[0];
8274
+ if (!entry) return true;
8275
+ const navigation = entry;
8276
+ return navigation.type === "reload" || navigation.type === "back_forward";
8277
+ }
8278
+ function pageOwnsScrolling(el) {
8279
+ if (window.innerHeight > SHORT_VIEWPORT_PX) return false;
8280
+ return el.scrollHeight - el.clientHeight <= 1;
8281
+ }
8189
8282
  function isInternalPath(url) {
8190
8283
  return url.startsWith("/") && !url.startsWith("//");
8191
8284
  }
@@ -9034,6 +9127,8 @@ function ExplorePage({
9034
9127
  const pickQueueRef = useRef(Promise.resolve());
9035
9128
  const [shareLabel, setShareLabel] = useState(T.share);
9036
9129
  const [shareUrl, setShareUrl] = useState(null);
9130
+ const rootRef = useRef(null);
9131
+ const composerRef = useRef(null);
9037
9132
  const scrollRef = useRef(null);
9038
9133
  const latestAssistantRef = useRef(null);
9039
9134
  const alignedForRef = useRef(null);
@@ -9061,11 +9156,196 @@ function ExplorePage({
9061
9156
  el.style.height = "auto";
9062
9157
  el.style.height = `${Math.min(el.scrollHeight, 200)}px`;
9063
9158
  }, [draft]);
9159
+ const [paneOffset, setPaneOffset] = useState(null);
9160
+ const [bottomInset, setBottomInset] = useState(0);
9161
+ const paneOffsetRef = useRef(0);
9162
+ const measurePane = useCallback(() => {
9163
+ if (heightMode !== "viewport") return;
9164
+ const el = rootRef.current;
9165
+ if (!el) return;
9166
+ const layoutHeight = window.innerHeight;
9167
+ if (layoutHeight === 0) return;
9168
+ const top = Math.round(
9169
+ clamp(el.getBoundingClientRect().top, 0, layoutHeight)
9170
+ );
9171
+ const viewport = window.visualViewport;
9172
+ const inset = viewport ? Math.round(
9173
+ clamp(
9174
+ layoutHeight - viewport.height - viewport.offsetTop,
9175
+ 0,
9176
+ layoutHeight
9177
+ )
9178
+ ) : 0;
9179
+ paneOffsetRef.current = top;
9180
+ setPaneOffset((current) => current === top ? current : top);
9181
+ setBottomInset((current) => current === inset ? current : inset);
9182
+ }, [heightMode]);
9183
+ const [chromeOverlap, setChromeOverlap] = useState(0);
9184
+ const measureChrome = useCallback(() => {
9185
+ const root = rootRef.current;
9186
+ const dock = composerRef.current;
9187
+ if (!root || !dock) return;
9188
+ if (typeof document.elementFromPoint !== "function") return;
9189
+ const viewportHeight = visualViewportHeight();
9190
+ const rect = dock.getBoundingClientRect();
9191
+ if (rect.width === 0 || viewportHeight === 0) return;
9192
+ if (rect.bottom <= 0 || rect.top >= viewportHeight) return;
9193
+ const edge = Math.min(rect.bottom, viewportHeight);
9194
+ const hit = document.elementFromPoint(rect.left + rect.width / 2, edge - 1);
9195
+ if (!hit || isOwnElement(hit, root)) {
9196
+ setChromeOverlap(0);
9197
+ return;
9198
+ }
9199
+ const overlap = Math.round(edge - hit.getBoundingClientRect().top);
9200
+ setChromeOverlap(overlap > 0 && overlap < viewportHeight ? overlap : 0);
9201
+ }, []);
9202
+ const remeasure = useCallback(() => {
9203
+ measurePane();
9204
+ measureChrome();
9205
+ }, [measurePane, measureChrome]);
9206
+ useEffect(() => {
9207
+ if (typeof window === "undefined") return;
9208
+ let frame = 0;
9209
+ const run = () => {
9210
+ frame = 0;
9211
+ remeasure();
9212
+ };
9213
+ const schedule = () => {
9214
+ if (frame) return;
9215
+ if (typeof window.requestAnimationFrame !== "function") {
9216
+ remeasure();
9217
+ return;
9218
+ }
9219
+ frame = window.requestAnimationFrame(run);
9220
+ };
9221
+ remeasure();
9222
+ const viewport = window.visualViewport;
9223
+ window.addEventListener("resize", schedule);
9224
+ window.addEventListener("orientationchange", schedule);
9225
+ viewport?.addEventListener("resize", schedule);
9226
+ viewport?.addEventListener("scroll", schedule);
9227
+ const observer = typeof MutationObserver === "function" ? new MutationObserver((records) => {
9228
+ const el = rootRef.current;
9229
+ if (el && records.every((record) => el.contains(record.target)))
9230
+ return;
9231
+ schedule();
9232
+ }) : null;
9233
+ observer?.observe(document.body, { childList: true, subtree: true });
9234
+ return () => {
9235
+ if (frame) window.cancelAnimationFrame(frame);
9236
+ window.removeEventListener("resize", schedule);
9237
+ window.removeEventListener("orientationchange", schedule);
9238
+ viewport?.removeEventListener("resize", schedule);
9239
+ viewport?.removeEventListener("scroll", schedule);
9240
+ observer?.disconnect();
9241
+ setPaneOffset(null);
9242
+ setBottomInset(0);
9243
+ setChromeOverlap(0);
9244
+ };
9245
+ }, [remeasure]);
9246
+ useEffect(() => {
9247
+ measureChrome();
9248
+ }, [measureChrome, paneOffset, bottomInset]);
9249
+ useEffect(() => {
9250
+ if (heightMode !== "viewport" || typeof window === "undefined") return;
9251
+ const { history: browserHistory } = window;
9252
+ const previousRestoration = "scrollRestoration" in browserHistory ? browserHistory.scrollRestoration : null;
9253
+ if (previousRestoration !== null)
9254
+ browserHistory.scrollRestoration = "manual";
9255
+ let frame = 0;
9256
+ let visitorMoved = false;
9257
+ const onVisitorMove = () => {
9258
+ visitorMoved = true;
9259
+ };
9260
+ const align = () => {
9261
+ if (visitorMoved) return;
9262
+ const el = rootRef.current;
9263
+ if (!el) return;
9264
+ const viewportHeight = visualViewportHeight();
9265
+ const rect = el.getBoundingClientRect();
9266
+ if (rect.height === 0 || viewportHeight === 0) return;
9267
+ const visible = Math.min(rect.bottom, viewportHeight) - Math.max(rect.top, 0);
9268
+ const reachable = Math.min(rect.height, viewportHeight);
9269
+ if (visible >= reachable * MIN_VISIBLE_FRACTION) return;
9270
+ window.scrollTo({
9271
+ top: Math.max(0, window.scrollY + rect.top),
9272
+ left: window.scrollX,
9273
+ behavior: "auto"
9274
+ });
9275
+ if (typeof document.elementFromPoint === "function") {
9276
+ const probe = document.elementFromPoint(
9277
+ Math.max(0, rect.left + rect.width / 2),
9278
+ 1
9279
+ );
9280
+ if (probe && !isOwnElement(probe, el)) {
9281
+ const chrome = probe.getBoundingClientRect().bottom;
9282
+ if (chrome > 0 && chrome < viewportHeight / 2) {
9283
+ window.scrollBy({ top: -chrome, left: 0, behavior: "auto" });
9284
+ }
9285
+ }
9286
+ }
9287
+ remeasure();
9288
+ };
9289
+ const alignIfRestored = () => {
9290
+ if (!isRestoredNavigation()) return;
9291
+ align();
9292
+ };
9293
+ alignIfRestored();
9294
+ if (typeof window.requestAnimationFrame === "function") {
9295
+ frame = window.requestAnimationFrame(alignIfRestored);
9296
+ }
9297
+ const onPageShow = (event) => {
9298
+ if (!event.persisted) {
9299
+ alignIfRestored();
9300
+ return;
9301
+ }
9302
+ visitorMoved = false;
9303
+ align();
9304
+ };
9305
+ window.addEventListener("pageshow", onPageShow);
9306
+ window.addEventListener("wheel", onVisitorMove, { passive: true });
9307
+ window.addEventListener("touchmove", onVisitorMove, { passive: true });
9308
+ window.addEventListener("keydown", onVisitorMove, { passive: true });
9309
+ return () => {
9310
+ if (frame) window.cancelAnimationFrame(frame);
9311
+ window.removeEventListener("pageshow", onPageShow);
9312
+ window.removeEventListener("wheel", onVisitorMove);
9313
+ window.removeEventListener("touchmove", onVisitorMove);
9314
+ window.removeEventListener("keydown", onVisitorMove);
9315
+ if (previousRestoration !== null)
9316
+ browserHistory.scrollRestoration = previousRestoration;
9317
+ };
9318
+ }, [heightMode, remeasure]);
9064
9319
  const handleScroll = useCallback(() => {
9065
9320
  const el = scrollRef.current;
9066
9321
  if (!el) return;
9067
9322
  stickToBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
9068
9323
  }, []);
9324
+ useEffect(() => {
9325
+ if (typeof window === "undefined") return;
9326
+ let frame = 0;
9327
+ const run = () => {
9328
+ frame = 0;
9329
+ const el = scrollRef.current;
9330
+ const dock = composerRef.current;
9331
+ if (!el || !dock) return;
9332
+ if (!pageOwnsScrolling(el)) return;
9333
+ stickToBottomRef.current = dock.getBoundingClientRect().bottom - visualViewportHeight() < 80;
9334
+ };
9335
+ const schedule = () => {
9336
+ if (frame) return;
9337
+ if (typeof window.requestAnimationFrame !== "function") {
9338
+ run();
9339
+ return;
9340
+ }
9341
+ frame = window.requestAnimationFrame(run);
9342
+ };
9343
+ window.addEventListener("scroll", schedule, { passive: true });
9344
+ return () => {
9345
+ if (frame) window.cancelAnimationFrame(frame);
9346
+ window.removeEventListener("scroll", schedule);
9347
+ };
9348
+ }, []);
9069
9349
  const latestAssistantId = useMemo(() => {
9070
9350
  for (let i = messages.length - 1; i >= 0; i -= 1) {
9071
9351
  const message = messages[i];
@@ -9081,16 +9361,32 @@ function ExplorePage({
9081
9361
  if (!stickToBottomRef.current) return;
9082
9362
  if (anchor.offsetHeight === 0) return;
9083
9363
  alignedForRef.current = latestAssistantId;
9084
- const delta = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
9085
- el.scrollTop = Math.max(0, el.scrollTop + delta - 12);
9364
+ if (!pageOwnsScrolling(el)) {
9365
+ const delta2 = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
9366
+ el.scrollTop = Math.max(0, el.scrollTop + delta2 - 12);
9367
+ return;
9368
+ }
9369
+ const delta = Math.round(
9370
+ anchor.getBoundingClientRect().top - paneOffsetRef.current - 12
9371
+ );
9372
+ if (delta !== 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
9086
9373
  }, [latestAssistantId, messages]);
9087
9374
  useEffect(() => {
9375
+ if (messages.length === 0) return;
9088
9376
  if (!stickToBottomRef.current) return;
9089
9377
  if (latestAssistantId && alignedForRef.current === latestAssistantId)
9090
9378
  return;
9091
9379
  const el = scrollRef.current;
9092
9380
  if (!el) return;
9093
- el.scrollTop = el.scrollHeight;
9381
+ if (!pageOwnsScrolling(el)) {
9382
+ el.scrollTop = el.scrollHeight;
9383
+ return;
9384
+ }
9385
+ const dock = composerRef.current ?? el;
9386
+ const delta = Math.round(
9387
+ dock.getBoundingClientRect().bottom - visualViewportHeight()
9388
+ );
9389
+ if (delta > 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
9094
9390
  }, [activity, latestAssistantId, messages]);
9095
9391
  const handleShare = useCallback(async () => {
9096
9392
  setShareLabel(T.copying);
@@ -9188,16 +9484,27 @@ function ExplorePage({
9188
9484
  const captchaOn = Boolean(
9189
9485
  catalog.captchaRequired && catalog.recaptchaSiteKey
9190
9486
  );
9191
- const rootStyle = heightMode === "viewport" ? { height: `calc(100dvh - ${normalizeOffset(viewportOffset)})` } : void 0;
9487
+ const rootStyle = {};
9488
+ if (heightMode === "viewport") {
9489
+ rootStyle["--boff-explore-offset"] = paneOffset === null ? normalizeOffset(viewportOffset) : `${paneOffset}px`;
9490
+ if (bottomInset > 0) {
9491
+ rootStyle["--boff-explore-inset"] = `${bottomInset}px`;
9492
+ }
9493
+ }
9494
+ if (chromeOverlap > 0) {
9495
+ rootStyle["--boff-explore-chrome"] = `${chromeOverlap}px`;
9496
+ }
9192
9497
  return /* @__PURE__ */ jsxs(
9193
9498
  "div",
9194
9499
  {
9500
+ ref: rootRef,
9195
9501
  "data-boff-explore": "page",
9196
9502
  "data-phase": phase,
9197
9503
  "data-locale": activeLocale,
9198
9504
  dir: rtl ? "rtl" : void 0,
9199
9505
  className: cn(
9200
9506
  "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
9507
+ heightMode === "viewport" && "boff-explore-viewport",
9201
9508
  heightMode === "auto" && "min-h-[70vh]",
9202
9509
  className
9203
9510
  ),
@@ -9431,249 +9738,257 @@ function ExplorePage({
9431
9738
  ]
9432
9739
  }
9433
9740
  ) : null,
9434
- /* @__PURE__ */ jsx("div", { className: "border-t border-border bg-background/85 px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 backdrop-blur-md", children: /* @__PURE__ */ jsxs(
9435
- "form",
9741
+ /* @__PURE__ */ jsx(
9742
+ "div",
9436
9743
  {
9437
- "data-boff-explore": "composer",
9438
- className: "mx-auto w-full max-w-3xl",
9439
- onSubmit: (event) => {
9440
- event.preventDefault();
9441
- submitDraft();
9442
- },
9443
- children: [
9444
- error ? /* @__PURE__ */ jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
9445
- staged.length > 0 ? /* @__PURE__ */ jsx(
9446
- "ul",
9447
- {
9448
- "data-boff-explore": "attachments",
9449
- className: "mb-2 flex flex-wrap gap-1.5",
9450
- "aria-label": T.attach,
9451
- children: staged.map((entry) => /* @__PURE__ */ jsxs(
9452
- "li",
9744
+ ref: composerRef,
9745
+ "data-boff-explore": "composer-dock",
9746
+ className: "boff-explore-composer border-t border-border bg-background/85 px-4 pt-3 backdrop-blur-md",
9747
+ children: /* @__PURE__ */ jsxs(
9748
+ "form",
9749
+ {
9750
+ "data-boff-explore": "composer",
9751
+ className: "mx-auto w-full max-w-3xl",
9752
+ onSubmit: (event) => {
9753
+ event.preventDefault();
9754
+ submitDraft();
9755
+ },
9756
+ children: [
9757
+ error ? /* @__PURE__ */ jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
9758
+ staged.length > 0 ? /* @__PURE__ */ jsx(
9759
+ "ul",
9760
+ {
9761
+ "data-boff-explore": "attachments",
9762
+ className: "mb-2 flex flex-wrap gap-1.5",
9763
+ "aria-label": T.attach,
9764
+ children: staged.map((entry) => /* @__PURE__ */ jsxs(
9765
+ "li",
9766
+ {
9767
+ "data-boff-explore": "attachment",
9768
+ "data-text-extracted": entry.textExtracted ? "true" : "false",
9769
+ className: "flex max-w-full items-center gap-1.5 rounded-full border border-border bg-muted/60 py-1 pl-2.5 pr-1 text-xs",
9770
+ children: [
9771
+ /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
9772
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
9773
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
9774
+ formatBytes(entry.size),
9775
+ entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
9776
+ ] }),
9777
+ /* @__PURE__ */ jsx(
9778
+ "button",
9779
+ {
9780
+ type: "button",
9781
+ "data-boff-explore": "attachment-remove",
9782
+ onClick: () => removeAttachment(entry.id),
9783
+ "aria-label": fill(T.removeAttachment, { name: entry.name }),
9784
+ className: "ml-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-background hover:text-foreground",
9785
+ children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
9786
+ }
9787
+ )
9788
+ ]
9789
+ },
9790
+ entry.id
9791
+ ))
9792
+ }
9793
+ ) : null,
9794
+ attachmentNotice !== null ? /* @__PURE__ */ jsx(
9795
+ "p",
9453
9796
  {
9454
- "data-boff-explore": "attachment",
9455
- "data-text-extracted": entry.textExtracted ? "true" : "false",
9456
- className: "flex max-w-full items-center gap-1.5 rounded-full border border-border bg-muted/60 py-1 pl-2.5 pr-1 text-xs",
9797
+ "data-boff-explore": "attachment-notice",
9798
+ role: "status",
9799
+ className: "mb-2 text-xs text-destructive",
9800
+ children: attachmentNotice
9801
+ }
9802
+ ) : null,
9803
+ /* @__PURE__ */ jsxs(
9804
+ "div",
9805
+ {
9806
+ className: cn(
9807
+ "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
9808
+ busy && "boff-explore-busy",
9809
+ overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
9810
+ ),
9457
9811
  children: [
9458
- /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
9459
- /* @__PURE__ */ jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
9460
- /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
9461
- formatBytes(entry.size),
9462
- entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
9463
- ] }),
9464
9812
  /* @__PURE__ */ jsx(
9465
- "button",
9813
+ Textarea,
9466
9814
  {
9815
+ ref: textareaRef,
9816
+ value: draft,
9817
+ rows: 1,
9818
+ disabled: composerDisabled,
9819
+ onChange: (event) => setDraft(event.target.value),
9820
+ onKeyDown: handleKeyDown,
9821
+ onCompositionStart: () => {
9822
+ composingRef.current = true;
9823
+ },
9824
+ onCompositionEnd: () => {
9825
+ composingRef.current = false;
9826
+ },
9827
+ "aria-label": "Ask a question",
9828
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
9829
+ product: focusedProductName
9830
+ }) : T.placeholder,
9831
+ className: "max-h-[200px] min-h-[44px] w-full min-w-0 flex-1 resize-none border-0 bg-transparent px-2 py-2.5 text-base shadow-none focus-visible:ring-0 sm:text-sm"
9832
+ }
9833
+ ),
9834
+ /* @__PURE__ */ jsx(
9835
+ "input",
9836
+ {
9837
+ ref: fileInputRef,
9838
+ type: "file",
9839
+ multiple: true,
9840
+ className: "hidden",
9841
+ onChange: (event) => {
9842
+ void handleFilesPicked(event.target.files);
9843
+ event.target.value = "";
9844
+ }
9845
+ }
9846
+ ),
9847
+ /* @__PURE__ */ jsx(
9848
+ Button,
9849
+ {
9850
+ "data-boff-explore": "attach",
9851
+ type: "button",
9852
+ size: "icon",
9853
+ variant: "ghost",
9854
+ disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
9855
+ "aria-label": T.attach,
9856
+ title: `${T.attach} \u2014 ${fill(T.attachHint, {
9857
+ max: String(MAX_ATTACHMENTS),
9858
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
9859
+ })}`,
9860
+ onClick: () => fileInputRef.current?.click(),
9861
+ children: /* @__PURE__ */ jsx(Paperclip, { className: "h-4 w-4" })
9862
+ }
9863
+ ),
9864
+ speech.supported ? /* @__PURE__ */ jsx(
9865
+ Button,
9866
+ {
9867
+ "data-boff-explore": "mic",
9868
+ "data-listening": speech.listening ? "true" : "false",
9467
9869
  type: "button",
9468
- "data-boff-explore": "attachment-remove",
9469
- onClick: () => removeAttachment(entry.id),
9470
- "aria-label": fill(T.removeAttachment, { name: entry.name }),
9471
- className: "ml-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-background hover:text-foreground",
9472
- children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
9870
+ size: "icon",
9871
+ variant: speech.listening ? "default" : "ghost",
9872
+ disabled: composerDisabled,
9873
+ "aria-label": speech.listening ? T.stopDictating : T.dictate,
9874
+ "aria-pressed": speech.listening,
9875
+ title: speech.listening ? T.stopDictating : T.dictate,
9876
+ onClick: speech.toggle,
9877
+ className: cn(speech.listening && "animate-pulse"),
9878
+ children: /* @__PURE__ */ jsx(Mic, { className: "h-4 w-4" })
9879
+ }
9880
+ ) : null,
9881
+ busy ? /* @__PURE__ */ jsx(
9882
+ Button,
9883
+ {
9884
+ "data-boff-explore": "stop",
9885
+ type: "button",
9886
+ size: "icon",
9887
+ variant: "secondary",
9888
+ "aria-label": T.stop,
9889
+ onClick: stop,
9890
+ children: /* @__PURE__ */ jsx(Square, { className: "h-4 w-4" })
9891
+ }
9892
+ ) : /* @__PURE__ */ jsx(
9893
+ Button,
9894
+ {
9895
+ "data-boff-explore": "send",
9896
+ type: "submit",
9897
+ size: "icon",
9898
+ disabled: !canSubmit,
9899
+ "aria-label": T.send,
9900
+ children: /* @__PURE__ */ jsx(ArrowUp, { className: "h-4 w-4" })
9473
9901
  }
9474
9902
  )
9475
9903
  ]
9476
- },
9477
- entry.id
9478
- ))
9479
- }
9480
- ) : null,
9481
- attachmentNotice !== null ? /* @__PURE__ */ jsx(
9482
- "p",
9483
- {
9484
- "data-boff-explore": "attachment-notice",
9485
- role: "status",
9486
- className: "mb-2 text-xs text-destructive",
9487
- children: attachmentNotice
9488
- }
9489
- ) : null,
9490
- /* @__PURE__ */ jsxs(
9491
- "div",
9492
- {
9493
- className: cn(
9494
- "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
9495
- busy && "boff-explore-busy",
9496
- overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
9904
+ }
9497
9905
  ),
9498
- children: [
9499
- /* @__PURE__ */ jsx(
9500
- Textarea,
9906
+ speech.listening || speech.interim !== "" ? /* @__PURE__ */ jsxs(
9907
+ "p",
9908
+ {
9909
+ "data-boff-explore": "dictation",
9910
+ className: "mt-2 flex items-center gap-2 text-xs text-muted-foreground",
9911
+ "aria-live": "polite",
9912
+ children: [
9913
+ /* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2 shrink-0", children: [
9914
+ /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75" }),
9915
+ /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-primary" })
9916
+ ] }),
9917
+ /* @__PURE__ */ jsx("span", { className: "italic", children: speech.interim !== "" ? speech.interim : "Listening\u2026" })
9918
+ ]
9919
+ }
9920
+ ) : null,
9921
+ speech.error !== null ? /* @__PURE__ */ jsx(
9922
+ "p",
9923
+ {
9924
+ "data-boff-explore": "dictation-error",
9925
+ className: "mt-2 text-xs text-destructive",
9926
+ children: speech.error
9927
+ }
9928
+ ) : null,
9929
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9930
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "Enter to send \xB7 Shift + Enter for a new line" }),
9931
+ remainingToday !== null ? /* @__PURE__ */ jsxs("span", { "data-boff-explore": "remaining", children: [
9932
+ remainingToday,
9933
+ " message",
9934
+ remainingToday === 1 ? "" : "s",
9935
+ " left today"
9936
+ ] }) : null,
9937
+ /* @__PURE__ */ jsxs(
9938
+ "span",
9501
9939
  {
9502
- ref: textareaRef,
9503
- value: draft,
9504
- rows: 1,
9505
- disabled: composerDisabled,
9506
- onChange: (event) => setDraft(event.target.value),
9507
- onKeyDown: handleKeyDown,
9508
- onCompositionStart: () => {
9509
- composingRef.current = true;
9510
- },
9511
- onCompositionEnd: () => {
9512
- composingRef.current = false;
9513
- },
9514
- "aria-label": "Ask a question",
9515
- placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
9516
- product: focusedProductName
9517
- }) : T.placeholder,
9518
- className: "max-h-[200px] min-h-[44px] w-full min-w-0 flex-1 resize-none border-0 bg-transparent px-2 py-2.5 text-base shadow-none focus-visible:ring-0 sm:text-sm"
9940
+ className: cn(
9941
+ "ml-auto tabular-nums",
9942
+ overLimit && "font-medium text-destructive"
9943
+ ),
9944
+ children: [
9945
+ draft.length.toLocaleString(),
9946
+ " / ",
9947
+ maxLength.toLocaleString()
9948
+ ]
9519
9949
  }
9520
- ),
9950
+ )
9951
+ ] }),
9952
+ shareUrl ? /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
9521
9953
  /* @__PURE__ */ jsx(
9522
9954
  "input",
9523
9955
  {
9524
- ref: fileInputRef,
9525
- type: "file",
9526
- multiple: true,
9527
- className: "hidden",
9528
- onChange: (event) => {
9529
- void handleFilesPicked(event.target.files);
9530
- event.target.value = "";
9531
- }
9956
+ "data-boff-explore": "share-url",
9957
+ readOnly: true,
9958
+ value: shareUrl,
9959
+ "aria-label": "Read-only link to this conversation",
9960
+ onFocus: (event) => event.currentTarget.select(),
9961
+ className: "min-w-0 flex-1 rounded-md border border-border bg-muted px-2 py-1 text-xs text-muted-foreground"
9532
9962
  }
9533
9963
  ),
9534
9964
  /* @__PURE__ */ jsx(
9535
- Button,
9965
+ "button",
9536
9966
  {
9537
- "data-boff-explore": "attach",
9538
9967
  type: "button",
9539
- size: "icon",
9540
- variant: "ghost",
9541
- disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
9542
- "aria-label": T.attach,
9543
- title: `${T.attach} \u2014 ${fill(T.attachHint, {
9544
- max: String(MAX_ATTACHMENTS),
9545
- size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
9546
- })}`,
9547
- onClick: () => fileInputRef.current?.click(),
9548
- children: /* @__PURE__ */ jsx(Paperclip, { className: "h-4 w-4" })
9968
+ className: "shrink-0 text-xs underline underline-offset-2",
9969
+ onClick: () => setShareUrl(null),
9970
+ children: "Done"
9549
9971
  }
9550
- ),
9551
- speech.supported ? /* @__PURE__ */ jsx(
9552
- Button,
9553
- {
9554
- "data-boff-explore": "mic",
9555
- "data-listening": speech.listening ? "true" : "false",
9556
- type: "button",
9557
- size: "icon",
9558
- variant: speech.listening ? "default" : "ghost",
9559
- disabled: composerDisabled,
9560
- "aria-label": speech.listening ? T.stopDictating : T.dictate,
9561
- "aria-pressed": speech.listening,
9562
- title: speech.listening ? T.stopDictating : T.dictate,
9563
- onClick: speech.toggle,
9564
- className: cn(speech.listening && "animate-pulse"),
9565
- children: /* @__PURE__ */ jsx(Mic, { className: "h-4 w-4" })
9566
- }
9567
- ) : null,
9568
- busy ? /* @__PURE__ */ jsx(
9569
- Button,
9972
+ )
9973
+ ] }) : null,
9974
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9975
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
9976
+ /* @__PURE__ */ jsx(
9977
+ "button",
9570
9978
  {
9571
- "data-boff-explore": "stop",
9572
9979
  type: "button",
9573
- size: "icon",
9574
- variant: "secondary",
9575
- "aria-label": T.stop,
9576
- onClick: stop,
9577
- children: /* @__PURE__ */ jsx(Square, { className: "h-4 w-4" })
9578
- }
9579
- ) : /* @__PURE__ */ jsx(
9580
- Button,
9581
- {
9582
- "data-boff-explore": "send",
9583
- type: "submit",
9584
- size: "icon",
9585
- disabled: !canSubmit,
9586
- "aria-label": T.send,
9587
- children: /* @__PURE__ */ jsx(ArrowUp, { className: "h-4 w-4" })
9980
+ "data-boff-explore": "disclaimer",
9981
+ onClick: () => setDisclaimerOpen(true),
9982
+ className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
9983
+ children: T.disclaimer
9588
9984
  }
9589
9985
  )
9590
- ]
9591
- }
9592
- ),
9593
- speech.listening || speech.interim !== "" ? /* @__PURE__ */ jsxs(
9594
- "p",
9595
- {
9596
- "data-boff-explore": "dictation",
9597
- className: "mt-2 flex items-center gap-2 text-xs text-muted-foreground",
9598
- "aria-live": "polite",
9599
- children: [
9600
- /* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2 shrink-0", children: [
9601
- /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75" }),
9602
- /* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-primary" })
9603
- ] }),
9604
- /* @__PURE__ */ jsx("span", { className: "italic", children: speech.interim !== "" ? speech.interim : "Listening\u2026" })
9605
- ]
9606
- }
9607
- ) : null,
9608
- speech.error !== null ? /* @__PURE__ */ jsx(
9609
- "p",
9610
- {
9611
- "data-boff-explore": "dictation-error",
9612
- className: "mt-2 text-xs text-destructive",
9613
- children: speech.error
9614
- }
9615
- ) : null,
9616
- /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9617
- /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "Enter to send \xB7 Shift + Enter for a new line" }),
9618
- remainingToday !== null ? /* @__PURE__ */ jsxs("span", { "data-boff-explore": "remaining", children: [
9619
- remainingToday,
9620
- " message",
9621
- remainingToday === 1 ? "" : "s",
9622
- " left today"
9623
- ] }) : null,
9624
- /* @__PURE__ */ jsxs(
9625
- "span",
9626
- {
9627
- className: cn(
9628
- "ml-auto tabular-nums",
9629
- overLimit && "font-medium text-destructive"
9630
- ),
9631
- children: [
9632
- draft.length.toLocaleString(),
9633
- " / ",
9634
- maxLength.toLocaleString()
9635
- ]
9636
- }
9637
- )
9638
- ] }),
9639
- shareUrl ? /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
9640
- /* @__PURE__ */ jsx(
9641
- "input",
9642
- {
9643
- "data-boff-explore": "share-url",
9644
- readOnly: true,
9645
- value: shareUrl,
9646
- "aria-label": "Read-only link to this conversation",
9647
- onFocus: (event) => event.currentTarget.select(),
9648
- className: "min-w-0 flex-1 rounded-md border border-border bg-muted px-2 py-1 text-xs text-muted-foreground"
9649
- }
9650
- ),
9651
- /* @__PURE__ */ jsx(
9652
- "button",
9653
- {
9654
- type: "button",
9655
- className: "shrink-0 text-xs underline underline-offset-2",
9656
- onClick: () => setShareUrl(null),
9657
- children: "Done"
9658
- }
9659
- )
9660
- ] }) : null,
9661
- /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9662
- /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
9663
- /* @__PURE__ */ jsx(
9664
- "button",
9665
- {
9666
- type: "button",
9667
- "data-boff-explore": "disclaimer",
9668
- onClick: () => setDisclaimerOpen(true),
9669
- className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
9670
- children: T.disclaimer
9671
- }
9672
- )
9673
- ] })
9674
- ]
9986
+ ] })
9987
+ ]
9988
+ }
9989
+ )
9675
9990
  }
9676
- ) })
9991
+ )
9677
9992
  ]
9678
9993
  }
9679
9994
  );