@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.js CHANGED
@@ -5950,8 +5950,8 @@ function isRtlLocale(locale) {
5950
5950
  }
5951
5951
  var EN = {
5952
5952
  badge: "AI answers, grounded in our documentation",
5953
- welcomeTitle: "Ask anything about our products",
5954
- welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
5953
+ welcomeTitle: "What problem are you trying to solve?",
5954
+ 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.",
5955
5955
  tryAsking: "Try asking",
5956
5956
  focusProduct: "Focus on a product",
5957
5957
  allProducts: "All products",
@@ -5959,8 +5959,8 @@ var EN = {
5959
5959
  showLess: "Show less",
5960
5960
  sources: "Sources",
5961
5961
  nextYouCouldAsk: "Next you could ask",
5962
- placeholder: "Ask anything about our products\u2026",
5963
- placeholderProduct: "Ask about {product}\u2026",
5962
+ placeholder: "Describe the problem you're facing\u2026",
5963
+ placeholderProduct: "Describe a problem, or ask about {product}\u2026",
5964
5964
  send: "Send",
5965
5965
  stop: "Stop",
5966
5966
  newChat: "New chat",
@@ -5993,16 +5993,16 @@ var EN = {
5993
5993
  "Straight to the right page"
5994
5994
  ],
5995
5995
  prompts: [
5996
- "What does this product actually do?",
5997
- "Which product fits my team?",
5998
- "How do I get started, step by step?",
5999
- "How much does it cost?"
5996
+ "Every course we run lives in a different spreadsheet.",
5997
+ "We only hear a machine is down after the line has stopped.",
5998
+ "Members quietly stop showing up and we never know why.",
5999
+ "Which of your products fits a problem like mine?"
6000
6000
  ]
6001
6001
  };
6002
6002
  var ZH = {
6003
6003
  badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
6004
- welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
6005
- 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",
6004
+ welcomeTitle: "\u4F60\u60F3\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\uFF1F",
6005
+ 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",
6006
6006
  tryAsking: "\u8BD5\u7740\u95EE",
6007
6007
  focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
6008
6008
  allProducts: "\u5168\u90E8\u4EA7\u54C1",
@@ -6010,8 +6010,8 @@ var ZH = {
6010
6010
  showLess: "\u6536\u8D77",
6011
6011
  sources: "\u6765\u6E90",
6012
6012
  nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
6013
- placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
6014
- placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
6013
+ placeholder: "\u63CF\u8FF0\u4F60\u9047\u5230\u7684\u95EE\u9898\u2026",
6014
+ placeholderProduct: "\u63CF\u8FF0\u95EE\u9898\uFF0C\u6216\u8BE2\u95EE {product}\u2026",
6015
6015
  send: "\u53D1\u9001",
6016
6016
  stop: "\u505C\u6B62",
6017
6017
  newChat: "\u65B0\u5BF9\u8BDD",
@@ -6040,16 +6040,16 @@ var ZH = {
6040
6040
  opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
6041
6041
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
6042
6042
  prompts: [
6043
- "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
6044
- "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
6045
- "\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
6046
- "\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
6043
+ "\u6BCF\u95E8\u8BFE\u7A0B\u90FD\u8BB0\u5728\u4E0D\u540C\u7684\u8868\u683C\u91CC\u3002",
6044
+ "\u673A\u5668\u505C\u4E86\uFF0C\u8981\u7B49\u6574\u6761\u7EBF\u505C\u4E0B\u6765\u624D\u77E5\u9053\u3002",
6045
+ "\u4F1A\u5458\u6162\u6162\u5C31\u4E0D\u6765\u4E86\uFF0C\u6211\u4EEC\u4E5F\u4E0D\u77E5\u9053\u4E3A\u4EC0\u4E48\u3002",
6046
+ "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u8FD9\u6837\u7684\u95EE\u9898\uFF1F"
6047
6047
  ]
6048
6048
  };
6049
6049
  var HI = {
6050
6050
  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",
6051
- 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",
6052
- 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",
6051
+ 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?",
6052
+ 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",
6053
6053
  tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
6054
6054
  focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
6055
6055
  allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
@@ -6057,8 +6057,8 @@ var HI = {
6057
6057
  showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
6058
6058
  sources: "\u0938\u094D\u0930\u094B\u0924",
6059
6059
  nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
6060
- 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",
6061
- placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6060
+ placeholder: "\u0905\u092A\u0928\u0940 \u0938\u092E\u0938\u094D\u092F\u093E \u092F\u0939\u093E\u0901 \u092C\u0924\u093E\u090F\u0902\u2026",
6061
+ 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",
6062
6062
  send: "\u092D\u0947\u091C\u0947\u0902",
6063
6063
  stop: "\u0930\u094B\u0915\u0947\u0902",
6064
6064
  newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
@@ -6091,16 +6091,16 @@ var HI = {
6091
6091
  "\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
6092
6092
  ],
6093
6093
  prompts: [
6094
- "\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
6095
- "\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?",
6096
- "\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
6097
- "\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
6094
+ "\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",
6095
+ "\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",
6096
+ "\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",
6097
+ "\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?"
6098
6098
  ]
6099
6099
  };
6100
6100
  var ES = {
6101
6101
  badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
6102
- welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
6103
- welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
6102
+ welcomeTitle: "\xBFQu\xE9 problema quieres resolver?",
6103
+ 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.",
6104
6104
  tryAsking: "Prueba a preguntar",
6105
6105
  focusProduct: "Centrarse en un producto",
6106
6106
  allProducts: "Todos los productos",
@@ -6108,8 +6108,8 @@ var ES = {
6108
6108
  showLess: "Ver menos",
6109
6109
  sources: "Fuentes",
6110
6110
  nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
6111
- placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
6112
- placeholderProduct: "Pregunta sobre {product}\u2026",
6111
+ placeholder: "Describe el problema que tienes\u2026",
6112
+ placeholderProduct: "Describe un problema o pregunta por {product}\u2026",
6113
6113
  send: "Enviar",
6114
6114
  stop: "Detener",
6115
6115
  newChat: "Nueva conversaci\xF3n",
@@ -6142,16 +6142,16 @@ var ES = {
6142
6142
  "Directo a la p\xE1gina correcta"
6143
6143
  ],
6144
6144
  prompts: [
6145
- "\xBFQu\xE9 hace realmente este producto?",
6146
- "\xBFQu\xE9 producto encaja con mi equipo?",
6147
- "\xBFC\xF3mo empiezo, paso a paso?",
6148
- "\xBFCu\xE1nto cuesta?"
6145
+ "Cada curso que damos est\xE1 en una hoja de c\xE1lculo distinta.",
6146
+ "Nos enteramos de que una m\xE1quina falla cuando para la l\xEDnea.",
6147
+ "Los socios dejan de venir poco a poco y nunca sabemos por qu\xE9.",
6148
+ "\xBFQu\xE9 producto encaja con un problema como el m\xEDo?"
6149
6149
  ]
6150
6150
  };
6151
6151
  var AR = {
6152
6152
  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",
6153
- welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
6154
- 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.",
6153
+ welcomeTitle: "\u0645\u0627 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u062D\u0627\u0648\u0644 \u062D\u0644\u0647\u0627\u061F",
6154
+ 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.",
6155
6155
  tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
6156
6156
  focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
6157
6157
  allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
@@ -6159,8 +6159,8 @@ var AR = {
6159
6159
  showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
6160
6160
  sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
6161
6161
  nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
6162
- placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
6163
- placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6162
+ placeholder: "\u0635\u0641 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0627\u0644\u062A\u064A \u062A\u0648\u0627\u062C\u0647\u0647\u0627\u2026",
6163
+ placeholderProduct: "\u0635\u0641 \u0645\u0634\u0643\u0644\u062A\u0643 \u0623\u0648 \u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
6164
6164
  send: "\u0625\u0631\u0633\u0627\u0644",
6165
6165
  stop: "\u0625\u064A\u0642\u0627\u0641",
6166
6166
  newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
@@ -6193,16 +6193,16 @@ var AR = {
6193
6193
  "\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
6194
6194
  ],
6195
6195
  prompts: [
6196
- "\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",
6197
- "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
6198
- "\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
6199
- "\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
6196
+ "\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.",
6197
+ "\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.",
6198
+ "\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.",
6199
+ "\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"
6200
6200
  ]
6201
6201
  };
6202
6202
  var TA = {
6203
6203
  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",
6204
- 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",
6205
- 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.",
6204
+ 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?",
6205
+ 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.",
6206
6206
  tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6207
6207
  focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
6208
6208
  allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
@@ -6210,8 +6210,8 @@ var TA = {
6210
6210
  showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
6211
6211
  sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
6212
6212
  nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
6213
- 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",
6214
- placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
6213
+ 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",
6214
+ 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",
6215
6215
  send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
6216
6216
  stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
6217
6217
  newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
@@ -6244,10 +6244,10 @@ var TA = {
6244
6244
  "\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
6245
6245
  ],
6246
6246
  prompts: [
6247
- "\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?",
6248
- "\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?",
6249
- "\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?",
6250
- "\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
6247
+ "\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.",
6248
+ "\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.",
6249
+ "\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.",
6250
+ "\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?"
6251
6251
  ]
6252
6252
  };
6253
6253
  var STRINGS = {
@@ -6846,13 +6846,13 @@ var FALLBACK_EXPLORE_LIMITS = {
6846
6846
  historyTurns: 6
6847
6847
  };
6848
6848
  var DEFAULT_EXPLORE_EXAMPLE_PROMPTS = [
6849
- "What does this product actually do?",
6850
- "Which Burdenoff product fits my team?",
6851
- "How do I get started, step by step?",
6852
- "What does it integrate with?"
6849
+ "Every course we run lives in a different spreadsheet.",
6850
+ "We only hear a machine is down after the line has stopped.",
6851
+ "Members quietly stop showing up and we never know why.",
6852
+ "Which of your products fits a problem like mine?"
6853
6853
  ];
6854
- var FALLBACK_WELCOME_TITLE = "Ask anything about our products";
6855
- 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.";
6854
+ var FALLBACK_WELCOME_TITLE = "What problem are you trying to solve?";
6855
+ 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.";
6856
6856
  function buildFallbackCatalog(examplePrompts, welcome) {
6857
6857
  return {
6858
6858
  enabled: true,
@@ -8029,6 +8029,7 @@ function toPayload(staged) {
8029
8029
  textContent
8030
8030
  }));
8031
8031
  }
8032
+ var SHORT_VIEWPORT_PX = 420;
8032
8033
  var EXPLORE_CSS = `
8033
8034
  @keyframes boff-explore-pulse {
8034
8035
  0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
@@ -8063,6 +8064,12 @@ var EXPLORE_CSS = `
8063
8064
  .boff-explore-scroll {
8064
8065
  scrollbar-width: thin;
8065
8066
  scrollbar-color: hsl(var(--border)) transparent;
8067
+ /* Stop the transcript handing its scroll to the page. Without this, the first
8068
+ swipe that exhausts the transcript chains to the document \u2014 and on a host site
8069
+ that is 65-70% footer, which is how a phone ends up showing nothing but the
8070
+ footer. Engines that do not support this property ignore the line and keep
8071
+ today's behaviour; the scroll correction above covers them. */
8072
+ overscroll-behavior: contain;
8066
8073
  }
8067
8074
  .boff-explore-scroll::-webkit-scrollbar { width: 10px; }
8068
8075
  .boff-explore-scroll::-webkit-scrollbar-track { background: transparent; }
@@ -8180,6 +8187,68 @@ var EXPLORE_CSS = `
8180
8187
  .boff-explore-busy::after { animation: none; }
8181
8188
  .boff-explore-rise { animation: none; opacity: 1; transform: none; }
8182
8189
  }
8190
+
8191
+ /* ---- Pane height ----------------------------------------------------------------------
8192
+ This used to be one inline declaration, \`height: calc(100dvh - 64px)\`, and it carried two
8193
+ defects. An inline style cannot carry a fallback, so every engine without \`dvh\` (iOS
8194
+ Safari < 15.4, Chrome/WebView < 108, Samsung Internet < 21, Firefox < 101) dropped it
8195
+ whole; and the 64px came from a prop hard-coded to 64 on all 41 host pages that matches
8196
+ none of them \u2014 the burdenoff/algoshred chrome is 80px, the sticky-header sites are 65.
8197
+
8198
+ A class plus custom properties lets the cascade do the work: \`vh\` is the floor and \`dvh\`
8199
+ an upgrade where it exists, while the two measured values stay *lengths*, never a height.
8200
+ That distinction is the whole prerender contract. The host sites snapshot \`/explore\` by
8201
+ loading the built SPA in headless Chromium and writing the POST-HYDRATION DOM to
8202
+ dist/explore/index.html, so every attribute and inline value this component sets after
8203
+ mount IS the static HTML CloudFront serves. A measured pixel *height* would therefore
8204
+ hand every phone the prerender viewport's height until the bundle executes; a measured
8205
+ *offset* is a site-header height, which is the same on every device to within a few
8206
+ pixels, and the height built from it stays viewport-relative on the visitor's own screen.
8207
+
8208
+ --boff-explore-offset chrome above the pane (measured root top; the prop pre-measure)
8209
+ --boff-explore-inset the slice of the layout viewport hidden below the visible area \u2014
8210
+ the on-screen keyboard, which \`dvh\` does not track. Zero unless
8211
+ something is actually covering the bottom, so a snapshot taken
8212
+ with no keyboard open never carries it. */
8213
+ .boff-explore-viewport {
8214
+ height: calc(100vh - var(--boff-explore-offset, 0px) - var(--boff-explore-inset, 0px));
8215
+ }
8216
+ @supports (height: 100dvh) {
8217
+ .boff-explore-viewport {
8218
+ height: calc(100dvh - var(--boff-explore-offset, 0px) - var(--boff-explore-inset, 0px));
8219
+ }
8220
+ }
8221
+
8222
+ /* Landscape phones and other short viewports: a one-screen pane leaves a ~124px transcript
8223
+ sliver under ~610px of chrome and content. At or below the threshold the pane stops
8224
+ pretending to be a window and lets the page's own scrolling carry the transcript. The
8225
+ min-height is the available height rather than a fixed rem value, so the fallback can
8226
+ never be taller than the screen it is rescuing. */
8227
+ @media (max-height: ${SHORT_VIEWPORT_PX}px) {
8228
+ .boff-explore-viewport {
8229
+ height: auto;
8230
+ min-height: calc(100vh - var(--boff-explore-offset, 0px));
8231
+ }
8232
+ }
8233
+ @supports (height: 100dvh) {
8234
+ @media (max-height: ${SHORT_VIEWPORT_PX}px) {
8235
+ .boff-explore-viewport {
8236
+ min-height: calc(100dvh - var(--boff-explore-offset, 0px));
8237
+ }
8238
+ }
8239
+ }
8240
+
8241
+ /* ---- Composer dock --------------------------------------------------------------------
8242
+ Three declarations, each the fallback for the one after it: a plain 1rem where \`max()\`
8243
+ is unknown, then the measured overlap of any FOREIGN fixed chrome sitting over the
8244
+ composer (the host sites' cookie banner is 229px tall and lands exactly there), then the
8245
+ same plus the home-indicator inset. \`--boff-explore-chrome\` is set on the root only once
8246
+ an overlap has actually been measured, so everywhere else this collapses to 1rem. */
8247
+ .boff-explore-composer {
8248
+ padding-bottom: 1rem;
8249
+ padding-bottom: max(1rem, var(--boff-explore-chrome, 0px));
8250
+ padding-bottom: max(1rem, env(safe-area-inset-bottom), var(--boff-explore-chrome, 0px));
8251
+ }
8183
8252
  `;
8184
8253
  function ExploreStyles() {
8185
8254
  return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
@@ -8201,6 +8270,8 @@ var CAPABILITIES = [
8201
8270
  body: "Get the sources and next steps \u2014 pricing, docs, a demo \u2014 without hunting."
8202
8271
  }
8203
8272
  ];
8273
+ var MIN_VISIBLE_FRACTION = 0.25;
8274
+ var SDK_OVERLAY_SELECTOR = "[data-boff-explore]";
8204
8275
  var CTA_VARIANTS = {
8205
8276
  CONTACT: "default",
8206
8277
  WAITLIST: "default",
@@ -8216,6 +8287,28 @@ function normalizeOffset(offset) {
8216
8287
  if (offset === void 0) return "0px";
8217
8288
  return typeof offset === "number" ? `${offset}px` : offset;
8218
8289
  }
8290
+ function isOwnElement(el, root) {
8291
+ if (el === document.body || el === document.documentElement) return true;
8292
+ if (root.contains(el)) return true;
8293
+ return el.closest(SDK_OVERLAY_SELECTOR) !== null;
8294
+ }
8295
+ function visualViewportHeight() {
8296
+ return window.visualViewport?.height ?? window.innerHeight;
8297
+ }
8298
+ function clamp(value, min, max) {
8299
+ return Math.min(Math.max(value, min), max);
8300
+ }
8301
+ function isRestoredNavigation() {
8302
+ const entries = window.performance?.getEntriesByType?.("navigation");
8303
+ const entry = entries?.[0];
8304
+ if (!entry) return true;
8305
+ const navigation = entry;
8306
+ return navigation.type === "reload" || navigation.type === "back_forward";
8307
+ }
8308
+ function pageOwnsScrolling(el) {
8309
+ if (window.innerHeight > SHORT_VIEWPORT_PX) return false;
8310
+ return el.scrollHeight - el.clientHeight <= 1;
8311
+ }
8219
8312
  function isInternalPath(url) {
8220
8313
  return url.startsWith("/") && !url.startsWith("//");
8221
8314
  }
@@ -9064,6 +9157,8 @@ function ExplorePage({
9064
9157
  const pickQueueRef = React.useRef(Promise.resolve());
9065
9158
  const [shareLabel, setShareLabel] = React.useState(T.share);
9066
9159
  const [shareUrl, setShareUrl] = React.useState(null);
9160
+ const rootRef = React.useRef(null);
9161
+ const composerRef = React.useRef(null);
9067
9162
  const scrollRef = React.useRef(null);
9068
9163
  const latestAssistantRef = React.useRef(null);
9069
9164
  const alignedForRef = React.useRef(null);
@@ -9091,11 +9186,196 @@ function ExplorePage({
9091
9186
  el.style.height = "auto";
9092
9187
  el.style.height = `${Math.min(el.scrollHeight, 200)}px`;
9093
9188
  }, [draft]);
9189
+ const [paneOffset, setPaneOffset] = React.useState(null);
9190
+ const [bottomInset, setBottomInset] = React.useState(0);
9191
+ const paneOffsetRef = React.useRef(0);
9192
+ const measurePane = React.useCallback(() => {
9193
+ if (heightMode !== "viewport") return;
9194
+ const el = rootRef.current;
9195
+ if (!el) return;
9196
+ const layoutHeight = window.innerHeight;
9197
+ if (layoutHeight === 0) return;
9198
+ const top = Math.round(
9199
+ clamp(el.getBoundingClientRect().top, 0, layoutHeight)
9200
+ );
9201
+ const viewport = window.visualViewport;
9202
+ const inset = viewport ? Math.round(
9203
+ clamp(
9204
+ layoutHeight - viewport.height - viewport.offsetTop,
9205
+ 0,
9206
+ layoutHeight
9207
+ )
9208
+ ) : 0;
9209
+ paneOffsetRef.current = top;
9210
+ setPaneOffset((current) => current === top ? current : top);
9211
+ setBottomInset((current) => current === inset ? current : inset);
9212
+ }, [heightMode]);
9213
+ const [chromeOverlap, setChromeOverlap] = React.useState(0);
9214
+ const measureChrome = React.useCallback(() => {
9215
+ const root = rootRef.current;
9216
+ const dock = composerRef.current;
9217
+ if (!root || !dock) return;
9218
+ if (typeof document.elementFromPoint !== "function") return;
9219
+ const viewportHeight = visualViewportHeight();
9220
+ const rect = dock.getBoundingClientRect();
9221
+ if (rect.width === 0 || viewportHeight === 0) return;
9222
+ if (rect.bottom <= 0 || rect.top >= viewportHeight) return;
9223
+ const edge = Math.min(rect.bottom, viewportHeight);
9224
+ const hit = document.elementFromPoint(rect.left + rect.width / 2, edge - 1);
9225
+ if (!hit || isOwnElement(hit, root)) {
9226
+ setChromeOverlap(0);
9227
+ return;
9228
+ }
9229
+ const overlap = Math.round(edge - hit.getBoundingClientRect().top);
9230
+ setChromeOverlap(overlap > 0 && overlap < viewportHeight ? overlap : 0);
9231
+ }, []);
9232
+ const remeasure = React.useCallback(() => {
9233
+ measurePane();
9234
+ measureChrome();
9235
+ }, [measurePane, measureChrome]);
9236
+ React.useEffect(() => {
9237
+ if (typeof window === "undefined") return;
9238
+ let frame = 0;
9239
+ const run = () => {
9240
+ frame = 0;
9241
+ remeasure();
9242
+ };
9243
+ const schedule = () => {
9244
+ if (frame) return;
9245
+ if (typeof window.requestAnimationFrame !== "function") {
9246
+ remeasure();
9247
+ return;
9248
+ }
9249
+ frame = window.requestAnimationFrame(run);
9250
+ };
9251
+ remeasure();
9252
+ const viewport = window.visualViewport;
9253
+ window.addEventListener("resize", schedule);
9254
+ window.addEventListener("orientationchange", schedule);
9255
+ viewport?.addEventListener("resize", schedule);
9256
+ viewport?.addEventListener("scroll", schedule);
9257
+ const observer = typeof MutationObserver === "function" ? new MutationObserver((records) => {
9258
+ const el = rootRef.current;
9259
+ if (el && records.every((record) => el.contains(record.target)))
9260
+ return;
9261
+ schedule();
9262
+ }) : null;
9263
+ observer?.observe(document.body, { childList: true, subtree: true });
9264
+ return () => {
9265
+ if (frame) window.cancelAnimationFrame(frame);
9266
+ window.removeEventListener("resize", schedule);
9267
+ window.removeEventListener("orientationchange", schedule);
9268
+ viewport?.removeEventListener("resize", schedule);
9269
+ viewport?.removeEventListener("scroll", schedule);
9270
+ observer?.disconnect();
9271
+ setPaneOffset(null);
9272
+ setBottomInset(0);
9273
+ setChromeOverlap(0);
9274
+ };
9275
+ }, [remeasure]);
9276
+ React.useEffect(() => {
9277
+ measureChrome();
9278
+ }, [measureChrome, paneOffset, bottomInset]);
9279
+ React.useEffect(() => {
9280
+ if (heightMode !== "viewport" || typeof window === "undefined") return;
9281
+ const { history: browserHistory } = window;
9282
+ const previousRestoration = "scrollRestoration" in browserHistory ? browserHistory.scrollRestoration : null;
9283
+ if (previousRestoration !== null)
9284
+ browserHistory.scrollRestoration = "manual";
9285
+ let frame = 0;
9286
+ let visitorMoved = false;
9287
+ const onVisitorMove = () => {
9288
+ visitorMoved = true;
9289
+ };
9290
+ const align = () => {
9291
+ if (visitorMoved) return;
9292
+ const el = rootRef.current;
9293
+ if (!el) return;
9294
+ const viewportHeight = visualViewportHeight();
9295
+ const rect = el.getBoundingClientRect();
9296
+ if (rect.height === 0 || viewportHeight === 0) return;
9297
+ const visible = Math.min(rect.bottom, viewportHeight) - Math.max(rect.top, 0);
9298
+ const reachable = Math.min(rect.height, viewportHeight);
9299
+ if (visible >= reachable * MIN_VISIBLE_FRACTION) return;
9300
+ window.scrollTo({
9301
+ top: Math.max(0, window.scrollY + rect.top),
9302
+ left: window.scrollX,
9303
+ behavior: "auto"
9304
+ });
9305
+ if (typeof document.elementFromPoint === "function") {
9306
+ const probe = document.elementFromPoint(
9307
+ Math.max(0, rect.left + rect.width / 2),
9308
+ 1
9309
+ );
9310
+ if (probe && !isOwnElement(probe, el)) {
9311
+ const chrome = probe.getBoundingClientRect().bottom;
9312
+ if (chrome > 0 && chrome < viewportHeight / 2) {
9313
+ window.scrollBy({ top: -chrome, left: 0, behavior: "auto" });
9314
+ }
9315
+ }
9316
+ }
9317
+ remeasure();
9318
+ };
9319
+ const alignIfRestored = () => {
9320
+ if (!isRestoredNavigation()) return;
9321
+ align();
9322
+ };
9323
+ alignIfRestored();
9324
+ if (typeof window.requestAnimationFrame === "function") {
9325
+ frame = window.requestAnimationFrame(alignIfRestored);
9326
+ }
9327
+ const onPageShow = (event) => {
9328
+ if (!event.persisted) {
9329
+ alignIfRestored();
9330
+ return;
9331
+ }
9332
+ visitorMoved = false;
9333
+ align();
9334
+ };
9335
+ window.addEventListener("pageshow", onPageShow);
9336
+ window.addEventListener("wheel", onVisitorMove, { passive: true });
9337
+ window.addEventListener("touchmove", onVisitorMove, { passive: true });
9338
+ window.addEventListener("keydown", onVisitorMove, { passive: true });
9339
+ return () => {
9340
+ if (frame) window.cancelAnimationFrame(frame);
9341
+ window.removeEventListener("pageshow", onPageShow);
9342
+ window.removeEventListener("wheel", onVisitorMove);
9343
+ window.removeEventListener("touchmove", onVisitorMove);
9344
+ window.removeEventListener("keydown", onVisitorMove);
9345
+ if (previousRestoration !== null)
9346
+ browserHistory.scrollRestoration = previousRestoration;
9347
+ };
9348
+ }, [heightMode, remeasure]);
9094
9349
  const handleScroll = React.useCallback(() => {
9095
9350
  const el = scrollRef.current;
9096
9351
  if (!el) return;
9097
9352
  stickToBottomRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
9098
9353
  }, []);
9354
+ React.useEffect(() => {
9355
+ if (typeof window === "undefined") return;
9356
+ let frame = 0;
9357
+ const run = () => {
9358
+ frame = 0;
9359
+ const el = scrollRef.current;
9360
+ const dock = composerRef.current;
9361
+ if (!el || !dock) return;
9362
+ if (!pageOwnsScrolling(el)) return;
9363
+ stickToBottomRef.current = dock.getBoundingClientRect().bottom - visualViewportHeight() < 80;
9364
+ };
9365
+ const schedule = () => {
9366
+ if (frame) return;
9367
+ if (typeof window.requestAnimationFrame !== "function") {
9368
+ run();
9369
+ return;
9370
+ }
9371
+ frame = window.requestAnimationFrame(run);
9372
+ };
9373
+ window.addEventListener("scroll", schedule, { passive: true });
9374
+ return () => {
9375
+ if (frame) window.cancelAnimationFrame(frame);
9376
+ window.removeEventListener("scroll", schedule);
9377
+ };
9378
+ }, []);
9099
9379
  const latestAssistantId = React.useMemo(() => {
9100
9380
  for (let i = messages.length - 1; i >= 0; i -= 1) {
9101
9381
  const message = messages[i];
@@ -9111,16 +9391,32 @@ function ExplorePage({
9111
9391
  if (!stickToBottomRef.current) return;
9112
9392
  if (anchor.offsetHeight === 0) return;
9113
9393
  alignedForRef.current = latestAssistantId;
9114
- const delta = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
9115
- el.scrollTop = Math.max(0, el.scrollTop + delta - 12);
9394
+ if (!pageOwnsScrolling(el)) {
9395
+ const delta2 = anchor.getBoundingClientRect().top - el.getBoundingClientRect().top;
9396
+ el.scrollTop = Math.max(0, el.scrollTop + delta2 - 12);
9397
+ return;
9398
+ }
9399
+ const delta = Math.round(
9400
+ anchor.getBoundingClientRect().top - paneOffsetRef.current - 12
9401
+ );
9402
+ if (delta !== 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
9116
9403
  }, [latestAssistantId, messages]);
9117
9404
  React.useEffect(() => {
9405
+ if (messages.length === 0) return;
9118
9406
  if (!stickToBottomRef.current) return;
9119
9407
  if (latestAssistantId && alignedForRef.current === latestAssistantId)
9120
9408
  return;
9121
9409
  const el = scrollRef.current;
9122
9410
  if (!el) return;
9123
- el.scrollTop = el.scrollHeight;
9411
+ if (!pageOwnsScrolling(el)) {
9412
+ el.scrollTop = el.scrollHeight;
9413
+ return;
9414
+ }
9415
+ const dock = composerRef.current ?? el;
9416
+ const delta = Math.round(
9417
+ dock.getBoundingClientRect().bottom - visualViewportHeight()
9418
+ );
9419
+ if (delta > 0) window.scrollBy({ top: delta, left: 0, behavior: "auto" });
9124
9420
  }, [activity, latestAssistantId, messages]);
9125
9421
  const handleShare = React.useCallback(async () => {
9126
9422
  setShareLabel(T.copying);
@@ -9218,16 +9514,27 @@ function ExplorePage({
9218
9514
  const captchaOn = Boolean(
9219
9515
  catalog.captchaRequired && catalog.recaptchaSiteKey
9220
9516
  );
9221
- const rootStyle = heightMode === "viewport" ? { height: `calc(100dvh - ${normalizeOffset(viewportOffset)})` } : void 0;
9517
+ const rootStyle = {};
9518
+ if (heightMode === "viewport") {
9519
+ rootStyle["--boff-explore-offset"] = paneOffset === null ? normalizeOffset(viewportOffset) : `${paneOffset}px`;
9520
+ if (bottomInset > 0) {
9521
+ rootStyle["--boff-explore-inset"] = `${bottomInset}px`;
9522
+ }
9523
+ }
9524
+ if (chromeOverlap > 0) {
9525
+ rootStyle["--boff-explore-chrome"] = `${chromeOverlap}px`;
9526
+ }
9222
9527
  return /* @__PURE__ */ jsxRuntime.jsxs(
9223
9528
  "div",
9224
9529
  {
9530
+ ref: rootRef,
9225
9531
  "data-boff-explore": "page",
9226
9532
  "data-phase": phase,
9227
9533
  "data-locale": activeLocale,
9228
9534
  dir: rtl ? "rtl" : void 0,
9229
9535
  className: cn(
9230
9536
  "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
9537
+ heightMode === "viewport" && "boff-explore-viewport",
9231
9538
  heightMode === "auto" && "min-h-[70vh]",
9232
9539
  className
9233
9540
  ),
@@ -9461,249 +9768,257 @@ function ExplorePage({
9461
9768
  ]
9462
9769
  }
9463
9770
  ) : null,
9464
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t border-border bg-background/85 px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 backdrop-blur-md", children: /* @__PURE__ */ jsxRuntime.jsxs(
9465
- "form",
9771
+ /* @__PURE__ */ jsxRuntime.jsx(
9772
+ "div",
9466
9773
  {
9467
- "data-boff-explore": "composer",
9468
- className: "mx-auto w-full max-w-3xl",
9469
- onSubmit: (event) => {
9470
- event.preventDefault();
9471
- submitDraft();
9472
- },
9473
- children: [
9474
- error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
9475
- staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
9476
- "ul",
9477
- {
9478
- "data-boff-explore": "attachments",
9479
- className: "mb-2 flex flex-wrap gap-1.5",
9480
- "aria-label": T.attach,
9481
- children: staged.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
9482
- "li",
9774
+ ref: composerRef,
9775
+ "data-boff-explore": "composer-dock",
9776
+ className: "boff-explore-composer border-t border-border bg-background/85 px-4 pt-3 backdrop-blur-md",
9777
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
9778
+ "form",
9779
+ {
9780
+ "data-boff-explore": "composer",
9781
+ className: "mx-auto w-full max-w-3xl",
9782
+ onSubmit: (event) => {
9783
+ event.preventDefault();
9784
+ submitDraft();
9785
+ },
9786
+ children: [
9787
+ error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
9788
+ staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
9789
+ "ul",
9790
+ {
9791
+ "data-boff-explore": "attachments",
9792
+ className: "mb-2 flex flex-wrap gap-1.5",
9793
+ "aria-label": T.attach,
9794
+ children: staged.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
9795
+ "li",
9796
+ {
9797
+ "data-boff-explore": "attachment",
9798
+ "data-text-extracted": entry.textExtracted ? "true" : "false",
9799
+ 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",
9800
+ children: [
9801
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
9802
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
9803
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
9804
+ formatBytes(entry.size),
9805
+ entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
9806
+ ] }),
9807
+ /* @__PURE__ */ jsxRuntime.jsx(
9808
+ "button",
9809
+ {
9810
+ type: "button",
9811
+ "data-boff-explore": "attachment-remove",
9812
+ onClick: () => removeAttachment(entry.id),
9813
+ "aria-label": fill(T.removeAttachment, { name: entry.name }),
9814
+ 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",
9815
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" })
9816
+ }
9817
+ )
9818
+ ]
9819
+ },
9820
+ entry.id
9821
+ ))
9822
+ }
9823
+ ) : null,
9824
+ attachmentNotice !== null ? /* @__PURE__ */ jsxRuntime.jsx(
9825
+ "p",
9483
9826
  {
9484
- "data-boff-explore": "attachment",
9485
- "data-text-extracted": entry.textExtracted ? "true" : "false",
9486
- 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",
9827
+ "data-boff-explore": "attachment-notice",
9828
+ role: "status",
9829
+ className: "mb-2 text-xs text-destructive",
9830
+ children: attachmentNotice
9831
+ }
9832
+ ) : null,
9833
+ /* @__PURE__ */ jsxRuntime.jsxs(
9834
+ "div",
9835
+ {
9836
+ className: cn(
9837
+ "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
9838
+ busy && "boff-explore-busy",
9839
+ overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
9840
+ ),
9487
9841
  children: [
9488
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
9489
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
9490
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
9491
- formatBytes(entry.size),
9492
- entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
9493
- ] }),
9494
9842
  /* @__PURE__ */ jsxRuntime.jsx(
9495
- "button",
9843
+ Textarea,
9496
9844
  {
9845
+ ref: textareaRef,
9846
+ value: draft,
9847
+ rows: 1,
9848
+ disabled: composerDisabled,
9849
+ onChange: (event) => setDraft(event.target.value),
9850
+ onKeyDown: handleKeyDown,
9851
+ onCompositionStart: () => {
9852
+ composingRef.current = true;
9853
+ },
9854
+ onCompositionEnd: () => {
9855
+ composingRef.current = false;
9856
+ },
9857
+ "aria-label": "Ask a question",
9858
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
9859
+ product: focusedProductName
9860
+ }) : T.placeholder,
9861
+ 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"
9862
+ }
9863
+ ),
9864
+ /* @__PURE__ */ jsxRuntime.jsx(
9865
+ "input",
9866
+ {
9867
+ ref: fileInputRef,
9868
+ type: "file",
9869
+ multiple: true,
9870
+ className: "hidden",
9871
+ onChange: (event) => {
9872
+ void handleFilesPicked(event.target.files);
9873
+ event.target.value = "";
9874
+ }
9875
+ }
9876
+ ),
9877
+ /* @__PURE__ */ jsxRuntime.jsx(
9878
+ Button,
9879
+ {
9880
+ "data-boff-explore": "attach",
9881
+ type: "button",
9882
+ size: "icon",
9883
+ variant: "ghost",
9884
+ disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
9885
+ "aria-label": T.attach,
9886
+ title: `${T.attach} \u2014 ${fill(T.attachHint, {
9887
+ max: String(MAX_ATTACHMENTS),
9888
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
9889
+ })}`,
9890
+ onClick: () => fileInputRef.current?.click(),
9891
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-4 w-4" })
9892
+ }
9893
+ ),
9894
+ speech.supported ? /* @__PURE__ */ jsxRuntime.jsx(
9895
+ Button,
9896
+ {
9897
+ "data-boff-explore": "mic",
9898
+ "data-listening": speech.listening ? "true" : "false",
9497
9899
  type: "button",
9498
- "data-boff-explore": "attachment-remove",
9499
- onClick: () => removeAttachment(entry.id),
9500
- "aria-label": fill(T.removeAttachment, { name: entry.name }),
9501
- 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",
9502
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" })
9900
+ size: "icon",
9901
+ variant: speech.listening ? "default" : "ghost",
9902
+ disabled: composerDisabled,
9903
+ "aria-label": speech.listening ? T.stopDictating : T.dictate,
9904
+ "aria-pressed": speech.listening,
9905
+ title: speech.listening ? T.stopDictating : T.dictate,
9906
+ onClick: speech.toggle,
9907
+ className: cn(speech.listening && "animate-pulse"),
9908
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
9909
+ }
9910
+ ) : null,
9911
+ busy ? /* @__PURE__ */ jsxRuntime.jsx(
9912
+ Button,
9913
+ {
9914
+ "data-boff-explore": "stop",
9915
+ type: "button",
9916
+ size: "icon",
9917
+ variant: "secondary",
9918
+ "aria-label": T.stop,
9919
+ onClick: stop,
9920
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Square, { className: "h-4 w-4" })
9921
+ }
9922
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
9923
+ Button,
9924
+ {
9925
+ "data-boff-explore": "send",
9926
+ type: "submit",
9927
+ size: "icon",
9928
+ disabled: !canSubmit,
9929
+ "aria-label": T.send,
9930
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUp, { className: "h-4 w-4" })
9503
9931
  }
9504
9932
  )
9505
9933
  ]
9506
- },
9507
- entry.id
9508
- ))
9509
- }
9510
- ) : null,
9511
- attachmentNotice !== null ? /* @__PURE__ */ jsxRuntime.jsx(
9512
- "p",
9513
- {
9514
- "data-boff-explore": "attachment-notice",
9515
- role: "status",
9516
- className: "mb-2 text-xs text-destructive",
9517
- children: attachmentNotice
9518
- }
9519
- ) : null,
9520
- /* @__PURE__ */ jsxRuntime.jsxs(
9521
- "div",
9522
- {
9523
- className: cn(
9524
- "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
9525
- busy && "boff-explore-busy",
9526
- overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
9934
+ }
9527
9935
  ),
9528
- children: [
9529
- /* @__PURE__ */ jsxRuntime.jsx(
9530
- Textarea,
9936
+ speech.listening || speech.interim !== "" ? /* @__PURE__ */ jsxRuntime.jsxs(
9937
+ "p",
9938
+ {
9939
+ "data-boff-explore": "dictation",
9940
+ className: "mt-2 flex items-center gap-2 text-xs text-muted-foreground",
9941
+ "aria-live": "polite",
9942
+ children: [
9943
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative flex h-2 w-2 shrink-0", children: [
9944
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75" }),
9945
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-primary" })
9946
+ ] }),
9947
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "italic", children: speech.interim !== "" ? speech.interim : "Listening\u2026" })
9948
+ ]
9949
+ }
9950
+ ) : null,
9951
+ speech.error !== null ? /* @__PURE__ */ jsxRuntime.jsx(
9952
+ "p",
9953
+ {
9954
+ "data-boff-explore": "dictation-error",
9955
+ className: "mt-2 text-xs text-destructive",
9956
+ children: speech.error
9957
+ }
9958
+ ) : null,
9959
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9960
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Enter to send \xB7 Shift + Enter for a new line" }),
9961
+ remainingToday !== null ? /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-boff-explore": "remaining", children: [
9962
+ remainingToday,
9963
+ " message",
9964
+ remainingToday === 1 ? "" : "s",
9965
+ " left today"
9966
+ ] }) : null,
9967
+ /* @__PURE__ */ jsxRuntime.jsxs(
9968
+ "span",
9531
9969
  {
9532
- ref: textareaRef,
9533
- value: draft,
9534
- rows: 1,
9535
- disabled: composerDisabled,
9536
- onChange: (event) => setDraft(event.target.value),
9537
- onKeyDown: handleKeyDown,
9538
- onCompositionStart: () => {
9539
- composingRef.current = true;
9540
- },
9541
- onCompositionEnd: () => {
9542
- composingRef.current = false;
9543
- },
9544
- "aria-label": "Ask a question",
9545
- placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
9546
- product: focusedProductName
9547
- }) : T.placeholder,
9548
- 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"
9970
+ className: cn(
9971
+ "ml-auto tabular-nums",
9972
+ overLimit && "font-medium text-destructive"
9973
+ ),
9974
+ children: [
9975
+ draft.length.toLocaleString(),
9976
+ " / ",
9977
+ maxLength.toLocaleString()
9978
+ ]
9549
9979
  }
9550
- ),
9980
+ )
9981
+ ] }),
9982
+ shareUrl ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
9551
9983
  /* @__PURE__ */ jsxRuntime.jsx(
9552
9984
  "input",
9553
9985
  {
9554
- ref: fileInputRef,
9555
- type: "file",
9556
- multiple: true,
9557
- className: "hidden",
9558
- onChange: (event) => {
9559
- void handleFilesPicked(event.target.files);
9560
- event.target.value = "";
9561
- }
9986
+ "data-boff-explore": "share-url",
9987
+ readOnly: true,
9988
+ value: shareUrl,
9989
+ "aria-label": "Read-only link to this conversation",
9990
+ onFocus: (event) => event.currentTarget.select(),
9991
+ className: "min-w-0 flex-1 rounded-md border border-border bg-muted px-2 py-1 text-xs text-muted-foreground"
9562
9992
  }
9563
9993
  ),
9564
9994
  /* @__PURE__ */ jsxRuntime.jsx(
9565
- Button,
9995
+ "button",
9566
9996
  {
9567
- "data-boff-explore": "attach",
9568
9997
  type: "button",
9569
- size: "icon",
9570
- variant: "ghost",
9571
- disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
9572
- "aria-label": T.attach,
9573
- title: `${T.attach} \u2014 ${fill(T.attachHint, {
9574
- max: String(MAX_ATTACHMENTS),
9575
- size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
9576
- })}`,
9577
- onClick: () => fileInputRef.current?.click(),
9578
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-4 w-4" })
9998
+ className: "shrink-0 text-xs underline underline-offset-2",
9999
+ onClick: () => setShareUrl(null),
10000
+ children: "Done"
9579
10001
  }
9580
- ),
9581
- speech.supported ? /* @__PURE__ */ jsxRuntime.jsx(
9582
- Button,
9583
- {
9584
- "data-boff-explore": "mic",
9585
- "data-listening": speech.listening ? "true" : "false",
9586
- type: "button",
9587
- size: "icon",
9588
- variant: speech.listening ? "default" : "ghost",
9589
- disabled: composerDisabled,
9590
- "aria-label": speech.listening ? T.stopDictating : T.dictate,
9591
- "aria-pressed": speech.listening,
9592
- title: speech.listening ? T.stopDictating : T.dictate,
9593
- onClick: speech.toggle,
9594
- className: cn(speech.listening && "animate-pulse"),
9595
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
9596
- }
9597
- ) : null,
9598
- busy ? /* @__PURE__ */ jsxRuntime.jsx(
9599
- Button,
10002
+ )
10003
+ ] }) : null,
10004
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
10005
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
10006
+ /* @__PURE__ */ jsxRuntime.jsx(
10007
+ "button",
9600
10008
  {
9601
- "data-boff-explore": "stop",
9602
10009
  type: "button",
9603
- size: "icon",
9604
- variant: "secondary",
9605
- "aria-label": T.stop,
9606
- onClick: stop,
9607
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Square, { className: "h-4 w-4" })
9608
- }
9609
- ) : /* @__PURE__ */ jsxRuntime.jsx(
9610
- Button,
9611
- {
9612
- "data-boff-explore": "send",
9613
- type: "submit",
9614
- size: "icon",
9615
- disabled: !canSubmit,
9616
- "aria-label": T.send,
9617
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUp, { className: "h-4 w-4" })
10010
+ "data-boff-explore": "disclaimer",
10011
+ onClick: () => setDisclaimerOpen(true),
10012
+ className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
10013
+ children: T.disclaimer
9618
10014
  }
9619
10015
  )
9620
- ]
9621
- }
9622
- ),
9623
- speech.listening || speech.interim !== "" ? /* @__PURE__ */ jsxRuntime.jsxs(
9624
- "p",
9625
- {
9626
- "data-boff-explore": "dictation",
9627
- className: "mt-2 flex items-center gap-2 text-xs text-muted-foreground",
9628
- "aria-live": "polite",
9629
- children: [
9630
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative flex h-2 w-2 shrink-0", children: [
9631
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75" }),
9632
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-primary" })
9633
- ] }),
9634
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "italic", children: speech.interim !== "" ? speech.interim : "Listening\u2026" })
9635
- ]
9636
- }
9637
- ) : null,
9638
- speech.error !== null ? /* @__PURE__ */ jsxRuntime.jsx(
9639
- "p",
9640
- {
9641
- "data-boff-explore": "dictation-error",
9642
- className: "mt-2 text-xs text-destructive",
9643
- children: speech.error
9644
- }
9645
- ) : null,
9646
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9647
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Enter to send \xB7 Shift + Enter for a new line" }),
9648
- remainingToday !== null ? /* @__PURE__ */ jsxRuntime.jsxs("span", { "data-boff-explore": "remaining", children: [
9649
- remainingToday,
9650
- " message",
9651
- remainingToday === 1 ? "" : "s",
9652
- " left today"
9653
- ] }) : null,
9654
- /* @__PURE__ */ jsxRuntime.jsxs(
9655
- "span",
9656
- {
9657
- className: cn(
9658
- "ml-auto tabular-nums",
9659
- overLimit && "font-medium text-destructive"
9660
- ),
9661
- children: [
9662
- draft.length.toLocaleString(),
9663
- " / ",
9664
- maxLength.toLocaleString()
9665
- ]
9666
- }
9667
- )
9668
- ] }),
9669
- shareUrl ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
9670
- /* @__PURE__ */ jsxRuntime.jsx(
9671
- "input",
9672
- {
9673
- "data-boff-explore": "share-url",
9674
- readOnly: true,
9675
- value: shareUrl,
9676
- "aria-label": "Read-only link to this conversation",
9677
- onFocus: (event) => event.currentTarget.select(),
9678
- className: "min-w-0 flex-1 rounded-md border border-border bg-muted px-2 py-1 text-xs text-muted-foreground"
9679
- }
9680
- ),
9681
- /* @__PURE__ */ jsxRuntime.jsx(
9682
- "button",
9683
- {
9684
- type: "button",
9685
- className: "shrink-0 text-xs underline underline-offset-2",
9686
- onClick: () => setShareUrl(null),
9687
- children: "Done"
9688
- }
9689
- )
9690
- ] }) : null,
9691
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
9692
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
9693
- /* @__PURE__ */ jsxRuntime.jsx(
9694
- "button",
9695
- {
9696
- type: "button",
9697
- "data-boff-explore": "disclaimer",
9698
- onClick: () => setDisclaimerOpen(true),
9699
- className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
9700
- children: T.disclaimer
9701
- }
9702
- )
9703
- ] })
9704
- ]
10016
+ ] })
10017
+ ]
10018
+ }
10019
+ )
9705
10020
  }
9706
- ) })
10021
+ )
9707
10022
  ]
9708
10023
  }
9709
10024
  );