@burdenoff/website-sdk 2026.829.4 → 2026.829.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4765,6 +4765,325 @@ function ElectronDownloadLink({
4765
4765
  }
4766
4766
  );
4767
4767
  }
4768
+
4769
+ // src/components/explore-i18n.ts
4770
+ var EXPLORE_LOCALES = ["en", "zh", "hi", "es", "ar", "ta"];
4771
+ var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
4772
+ function isRtlLocale(locale) {
4773
+ return RTL_LOCALES.has(locale);
4774
+ }
4775
+ var EN = {
4776
+ badge: "AI answers, grounded in our documentation",
4777
+ welcomeTitle: "Ask anything about our products",
4778
+ welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
4779
+ tryAsking: "Try asking",
4780
+ focusProduct: "Focus on a product",
4781
+ allProducts: "All products",
4782
+ showAll: "All",
4783
+ showLess: "Show less",
4784
+ sources: "Sources",
4785
+ nextYouCouldAsk: "Next you could ask",
4786
+ placeholder: "Ask anything about our products\u2026",
4787
+ placeholderProduct: "Ask about {product}\u2026",
4788
+ send: "Send",
4789
+ stop: "Stop",
4790
+ newChat: "New chat",
4791
+ history: "History",
4792
+ clearHistory: "Clear history",
4793
+ share: "Share",
4794
+ copied: "Copied",
4795
+ copying: "Copying\u2026",
4796
+ shareUnavailable: "Unavailable",
4797
+ disclaimer: "Disclaimer",
4798
+ disclaimerShort: "Grounded in our docs \u2014 check anything important.",
4799
+ dictate: "Dictate your question",
4800
+ stopDictating: "Stop dictating",
4801
+ attach: "Attach files",
4802
+ attachHint: "Up to {{max}} files, {{size}} MB each",
4803
+ removeAttachment: "Remove {{name}}",
4804
+ attachmentNameOnly: "name and type only",
4805
+ attachmentTooLarge: "{{name}} is larger than {{size}} MB and was not attached.",
4806
+ attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
4807
+ noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
4808
+ askHuman: "ask a human",
4809
+ prevSuggestion: "Previous suggestion",
4810
+ nextSuggestion: "Next suggestion",
4811
+ capabilities: [
4812
+ "Grounded in our own docs",
4813
+ "Compare across the ecosystem",
4814
+ "Straight to the right page"
4815
+ ],
4816
+ prompts: [
4817
+ "What does this product actually do?",
4818
+ "Which product fits my team?",
4819
+ "How do I get started, step by step?",
4820
+ "How much does it cost?"
4821
+ ]
4822
+ };
4823
+ var ZH = {
4824
+ badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
4825
+ welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
4826
+ 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",
4827
+ tryAsking: "\u8BD5\u7740\u95EE",
4828
+ focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
4829
+ allProducts: "\u5168\u90E8\u4EA7\u54C1",
4830
+ showAll: "\u5168\u90E8",
4831
+ showLess: "\u6536\u8D77",
4832
+ sources: "\u6765\u6E90",
4833
+ nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
4834
+ placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
4835
+ placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
4836
+ send: "\u53D1\u9001",
4837
+ stop: "\u505C\u6B62",
4838
+ newChat: "\u65B0\u5BF9\u8BDD",
4839
+ history: "\u5386\u53F2",
4840
+ clearHistory: "\u6E05\u9664\u5386\u53F2",
4841
+ share: "\u5206\u4EAB",
4842
+ copied: "\u5DF2\u590D\u5236",
4843
+ copying: "\u590D\u5236\u4E2D\u2026",
4844
+ shareUnavailable: "\u4E0D\u53EF\u7528",
4845
+ disclaimer: "\u514D\u8D23\u58F0\u660E",
4846
+ disclaimerShort: "\u5185\u5BB9\u57FA\u4E8E\u6211\u4EEC\u7684\u6587\u6863\uFF0C\u91CD\u8981\u4FE1\u606F\u8BF7\u81EA\u884C\u6838\u5BF9\u3002",
4847
+ dictate: "\u8BED\u97F3\u8F93\u5165",
4848
+ stopDictating: "\u505C\u6B62\u8BED\u97F3\u8F93\u5165",
4849
+ attach: "\u6DFB\u52A0\u6587\u4EF6",
4850
+ attachHint: "\u6700\u591A {{max}} \u4E2A\u6587\u4EF6\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 {{size}} MB",
4851
+ removeAttachment: "\u79FB\u9664 {{name}}",
4852
+ attachmentNameOnly: "\u4EC5\u6587\u4EF6\u540D\u548C\u7C7B\u578B",
4853
+ attachmentTooLarge: "{{name}} \u8D85\u8FC7 {{size}} MB\uFF0C\u672A\u80FD\u6DFB\u52A0\u3002",
4854
+ attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
4855
+ noAnswer: "\u6211\u5728\u6587\u6863\u4E2D\u6CA1\u6709\u627E\u5230\u76F8\u5173\u5185\u5BB9\uFF0C\u4E0B\u9762\u7684\u56DE\u7B54\u6CA1\u6709\u6765\u6E90\u652F\u6301\u3002\u8BF7\u6362\u4E2A\u8BF4\u6CD5\uFF0C\u6216",
4856
+ askHuman: "\u8054\u7CFB\u6211\u4EEC",
4857
+ prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
4858
+ nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
4859
+ capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
4860
+ prompts: [
4861
+ "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
4862
+ "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
4863
+ "\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
4864
+ "\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
4865
+ ]
4866
+ };
4867
+ var HI = {
4868
+ 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",
4869
+ 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",
4870
+ 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",
4871
+ tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
4872
+ focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
4873
+ allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
4874
+ showAll: "\u0938\u092D\u0940",
4875
+ showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
4876
+ sources: "\u0938\u094D\u0930\u094B\u0924",
4877
+ nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
4878
+ 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",
4879
+ placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
4880
+ send: "\u092D\u0947\u091C\u0947\u0902",
4881
+ stop: "\u0930\u094B\u0915\u0947\u0902",
4882
+ newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
4883
+ history: "\u0907\u0924\u093F\u0939\u093E\u0938",
4884
+ clearHistory: "\u0907\u0924\u093F\u0939\u093E\u0938 \u092E\u093F\u091F\u093E\u090F\u0901",
4885
+ share: "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
4886
+ copied: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E",
4887
+ copying: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
4888
+ shareUnavailable: "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
4889
+ disclaimer: "\u0905\u0938\u094D\u0935\u0940\u0915\u0930\u0923",
4890
+ disclaimerShort: "\u092F\u0939 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948 \u2014 \u092E\u0939\u0924\u094D\u0935\u092A\u0942\u0930\u094D\u0923 \u092C\u093E\u0924\u0947\u0902 \u091C\u093C\u0930\u0942\u0930 \u091C\u093E\u0901\u091A \u0932\u0947\u0902\u0964",
4891
+ dictate: "\u092C\u094B\u0932\u0915\u0930 \u092A\u0942\u091B\u0947\u0902",
4892
+ stopDictating: "\u092C\u094B\u0932\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
4893
+ attach: "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
4894
+ attachHint: "\u0905\u0927\u093F\u0915\u0924\u092E {{max}} \u092B\u093C\u093E\u0907\u0932\u0947\u0902, \u092A\u094D\u0930\u0924\u094D\u092F\u0947\u0915 {{size}} MB \u0924\u0915",
4895
+ removeAttachment: "{{name}} \u0939\u091F\u093E\u090F\u0901",
4896
+ attachmentNameOnly: "\u0915\u0947\u0935\u0932 \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u0915\u093E\u0930",
4897
+ attachmentTooLarge: "{{name}} {{size}} MB \u0938\u0947 \u092C\u0921\u093C\u0940 \u0939\u0948, \u0907\u0938\u0932\u093F\u090F \u091C\u094B\u0921\u093C\u0940 \u0928\u0939\u0940\u0902 \u0917\u0908\u0964",
4898
+ attachmentTooMany: "\u0915\u0947\u0935\u0932 {{max}} \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0940 \u091C\u093E \u0938\u0915\u0924\u0940 \u0939\u0948\u0902, \u0907\u0938\u0932\u093F\u090F {{name}} \u091B\u094B\u0921\u093C \u0926\u0940 \u0917\u0908\u0964",
4899
+ noAnswer: "\u092F\u0939 \u092E\u0941\u091D\u0947 \u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092E\u0947\u0902 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E, \u0907\u0938\u0932\u093F\u090F \u0928\u0940\u091A\u0947 \u0926\u093F\u092F\u093E \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938\u0940 \u0938\u094D\u0930\u094B\u0924 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0926\u0942\u0938\u0930\u0947 \u0936\u092C\u094D\u0926\u094B\u0902 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902, \u092F\u093E",
4900
+ askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
4901
+ prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
4902
+ nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
4903
+ capabilities: [
4904
+ "\u0939\u092E\u093E\u0930\u0947 \u0905\u092A\u0928\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924",
4905
+ "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
4906
+ "\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
4907
+ ],
4908
+ prompts: [
4909
+ "\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
4910
+ "\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?",
4911
+ "\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
4912
+ "\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
4913
+ ]
4914
+ };
4915
+ var ES = {
4916
+ badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
4917
+ welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
4918
+ welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
4919
+ tryAsking: "Prueba a preguntar",
4920
+ focusProduct: "Centrarse en un producto",
4921
+ allProducts: "Todos los productos",
4922
+ showAll: "Todos",
4923
+ showLess: "Ver menos",
4924
+ sources: "Fuentes",
4925
+ nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
4926
+ placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
4927
+ placeholderProduct: "Pregunta sobre {product}\u2026",
4928
+ send: "Enviar",
4929
+ stop: "Detener",
4930
+ newChat: "Nueva conversaci\xF3n",
4931
+ history: "Historial",
4932
+ clearHistory: "Borrar historial",
4933
+ share: "Compartir",
4934
+ copied: "Copiado",
4935
+ copying: "Copiando\u2026",
4936
+ shareUnavailable: "No disponible",
4937
+ disclaimer: "Aviso",
4938
+ disclaimerShort: "Basado en nuestra documentaci\xF3n: comprueba cualquier dato importante.",
4939
+ dictate: "Dictar tu pregunta",
4940
+ stopDictating: "Dejar de dictar",
4941
+ attach: "Adjuntar archivos",
4942
+ attachHint: "Hasta {{max}} archivos, {{size}} MB cada uno",
4943
+ removeAttachment: "Quitar {{name}}",
4944
+ attachmentNameOnly: "solo nombre y tipo",
4945
+ attachmentTooLarge: "{{name}} supera los {{size}} MB y no se adjunt\xF3.",
4946
+ attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
4947
+ noAnswer: "No he encontrado esto en nuestra documentaci\xF3n, as\xED que la respuesta de abajo no se apoya en ninguna fuente. Prueba a reformularla, o",
4948
+ askHuman: "habla con una persona",
4949
+ prevSuggestion: "Sugerencia anterior",
4950
+ nextSuggestion: "Sugerencia siguiente",
4951
+ capabilities: [
4952
+ "Basado en nuestra documentaci\xF3n",
4953
+ "Compara todo el ecosistema",
4954
+ "Directo a la p\xE1gina correcta"
4955
+ ],
4956
+ prompts: [
4957
+ "\xBFQu\xE9 hace realmente este producto?",
4958
+ "\xBFQu\xE9 producto encaja con mi equipo?",
4959
+ "\xBFC\xF3mo empiezo, paso a paso?",
4960
+ "\xBFCu\xE1nto cuesta?"
4961
+ ]
4962
+ };
4963
+ var AR = {
4964
+ 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",
4965
+ welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
4966
+ 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.",
4967
+ tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
4968
+ focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
4969
+ allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
4970
+ showAll: "\u0627\u0644\u0643\u0644",
4971
+ showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
4972
+ sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
4973
+ nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
4974
+ placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
4975
+ placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
4976
+ send: "\u0625\u0631\u0633\u0627\u0644",
4977
+ stop: "\u0625\u064A\u0642\u0627\u0641",
4978
+ newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
4979
+ history: "\u0627\u0644\u0633\u062C\u0644",
4980
+ clearHistory: "\u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644",
4981
+ share: "\u0645\u0634\u0627\u0631\u0643\u0629",
4982
+ copied: "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
4983
+ copying: "\u062C\u0627\u0631\u064D \u0627\u0644\u0646\u0633\u062E\u2026",
4984
+ shareUnavailable: "\u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
4985
+ disclaimer: "\u0625\u062E\u0644\u0627\u0621 \u0645\u0633\u0624\u0648\u0644\u064A\u0629",
4986
+ disclaimerShort: "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627 \u2014 \u062A\u062D\u0642\u0651\u0642 \u0645\u0646 \u0623\u064A \u0645\u0639\u0644\u0648\u0645\u0629 \u0645\u0647\u0645\u0629.",
4987
+ dictate: "\u0623\u0645\u0644\u0650 \u0633\u0624\u0627\u0644\u0643",
4988
+ stopDictating: "\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0625\u0645\u0644\u0627\u0621",
4989
+ attach: "\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641\u0627\u062A",
4990
+ attachHint: "\u062D\u062A\u0649 {{max}} \u0645\u0644\u0641\u0627\u062A\u060C \u0628\u062D\u062F \u0623\u0642\u0635\u0649 {{size}} \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A \u0644\u0643\u0644 \u0645\u0644\u0641",
4991
+ removeAttachment: "\u0625\u0632\u0627\u0644\u0629 {{name}}",
4992
+ attachmentNameOnly: "\u0627\u0644\u0627\u0633\u0645 \u0648\u0627\u0644\u0646\u0648\u0639 \u0641\u0642\u0637",
4993
+ attachmentTooLarge: "{{name}} \u0623\u0643\u0628\u0631 \u0645\u0646 {{size}} \u0645\u064A\u063A\u0627\u0628\u0627\u064A\u062A \u0648\u0644\u0645 \u064A\u062A\u0645 \u0625\u0631\u0641\u0627\u0642\u0647.",
4994
+ attachmentTooMany: "\u064A\u0645\u0643\u0646 \u0625\u0631\u0641\u0627\u0642 {{max}} \u0645\u0644\u0641\u0627\u062A \u0641\u0642\u0637\u060C \u0644\u0630\u0627 \u062A\u0645 \u062A\u062E\u0637\u064A {{name}}.",
4995
+ noAnswer: "\u0644\u0645 \u0623\u062C\u062F \u0647\u0630\u0627 \u0641\u064A \u0648\u062B\u0627\u0626\u0642\u0646\u0627\u060C \u0644\u0630\u0627 \u0641\u0627\u0644\u0625\u062C\u0627\u0628\u0629 \u0623\u062F\u0646\u0627\u0647 \u063A\u064A\u0631 \u0645\u0633\u062A\u0646\u062F\u0629 \u0625\u0644\u0649 \u0645\u0635\u062F\u0631. \u062D\u0627\u0648\u0644 \u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0635\u064A\u0627\u063A\u0629\u060C \u0623\u0648",
4996
+ askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
4997
+ prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
4998
+ nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
4999
+ capabilities: [
5000
+ "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
5001
+ "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
5002
+ "\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
5003
+ ],
5004
+ prompts: [
5005
+ "\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",
5006
+ "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
5007
+ "\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
5008
+ "\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
5009
+ ]
5010
+ };
5011
+ var TA = {
5012
+ 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",
5013
+ 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",
5014
+ 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.",
5015
+ tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5016
+ focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
5017
+ allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
5018
+ showAll: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD",
5019
+ showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
5020
+ sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5021
+ nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
5022
+ 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",
5023
+ placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
5024
+ send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
5025
+ stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
5026
+ newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
5027
+ history: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BC1",
5028
+ clearHistory: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BCD\u0BB1\u0BC8 \u0B85\u0BB4\u0BBF",
5029
+ share: "\u0BAA\u0B95\u0BBF\u0BB0\u0BCD",
5030
+ copied: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
5031
+ copying: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
5032
+ shareUnavailable: "\u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
5033
+ disclaimer: "\u0BAA\u0BCA\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BA4\u0BCD \u0BA4\u0BC1\u0BB1\u0BAA\u0BCD\u0BAA\u0BC1",
5034
+ disclaimerShort: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BA4\u0BC1 \u2014 \u0BAE\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BAF\u0BAE\u0BBE\u0BA9\u0BA4\u0BC8\u0B9A\u0BCD \u0B9A\u0BB0\u0BBF\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD.",
5035
+ dictate: "\u0B89\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0BB3\u0BCD\u0BB5\u0BBF\u0BAF\u0BC8\u0BAA\u0BCD \u0BAA\u0BC7\u0B9A\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5036
+ stopDictating: "\u0BAA\u0BC7\u0B9A\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
5037
+ attach: "\u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95",
5038
+ attachHint: "\u0B85\u0BA4\u0BBF\u0B95\u0BAA\u0B9F\u0BCD\u0B9A\u0BAE\u0BCD {{max}} \u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD, \u0B92\u0BB5\u0BCD\u0BB5\u0BCA\u0BA9\u0BCD\u0BB1\u0BC1\u0BAE\u0BCD {{size}} MB \u0BB5\u0BB0\u0BC8",
5039
+ removeAttachment: "{{name}} \u0B85\u0B95\u0BB1\u0BCD\u0BB1\u0BC1",
5040
+ attachmentNameOnly: "\u0BAA\u0BC6\u0BAF\u0BB0\u0BC1\u0BAE\u0BCD \u0BB5\u0B95\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD",
5041
+ attachmentTooLarge: "{{name}} {{size}} MB-\u0B90 \u0BB5\u0BBF\u0B9F \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1, \u0B8E\u0BA9\u0BB5\u0BC7 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
5042
+ attachmentTooMany: "{{max}} \u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BC7 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BC1\u0BAE\u0BCD, \u0B8E\u0BA9\u0BB5\u0BC7 {{name}} \u0BA4\u0BB5\u0BBF\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1.",
5043
+ noAnswer: "\u0B87\u0BA4\u0BC1 \u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BB2\u0BCD \u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8, \u0B8E\u0BA9\u0BB5\u0BC7 \u0B95\u0BC0\u0BB4\u0BC7 \u0B89\u0BB3\u0BCD\u0BB3 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BC1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8. \u0BB5\u0BC7\u0BB1\u0BC1 \u0BB5\u0B95\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD, \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1",
5044
+ askHuman: "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BCA\u0B9F\u0BB0\u0BCD\u0BAA\u0BC1 \u0B95\u0BCA\u0BB3\u0BCD\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5045
+ prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
5046
+ nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
5047
+ capabilities: [
5048
+ "\u0B8E\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B9A\u0BCA\u0BA8\u0BCD\u0BA4 \u0B86\u0BB5\u0BA3\u0B99\u0BCD\u0B95\u0BB3\u0BBF\u0BA9\u0BCD \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBF\u0BB2\u0BCD",
5049
+ "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5050
+ "\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
5051
+ ],
5052
+ prompts: [
5053
+ "\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?",
5054
+ "\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?",
5055
+ "\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?",
5056
+ "\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
5057
+ ]
5058
+ };
5059
+ var STRINGS = {
5060
+ en: EN,
5061
+ zh: ZH,
5062
+ hi: HI,
5063
+ es: ES,
5064
+ ar: AR,
5065
+ ta: TA
5066
+ };
5067
+ function resolveExploreLocale(explicit) {
5068
+ const candidates = [
5069
+ explicit,
5070
+ typeof document === "undefined" ? void 0 : document.documentElement.lang,
5071
+ typeof navigator === "undefined" ? void 0 : navigator.language
5072
+ ];
5073
+ for (const candidate of candidates) {
5074
+ if (!candidate) continue;
5075
+ const primary = candidate.toLowerCase().split("-")[0];
5076
+ const match = EXPLORE_LOCALES.find((locale) => locale === primary);
5077
+ if (match) return match;
5078
+ }
5079
+ return "en";
5080
+ }
5081
+ function exploreStrings(locale) {
5082
+ return STRINGS[locale] ?? EN;
5083
+ }
5084
+ function fill(template, values) {
5085
+ return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
5086
+ }
4768
5087
  var PROSE_CSS = `
4769
5088
  .boff-prose {
4770
5089
  max-width: none;
@@ -4969,6 +5288,12 @@ var EXPLORE_MESSAGE_FIELDS = (
4969
5288
  }
4970
5289
  followUps
4971
5290
  answered
5291
+ attachments {
5292
+ name
5293
+ mimeType
5294
+ size
5295
+ textExtracted
5296
+ }
4972
5297
  errorCode
4973
5298
  createdAt
4974
5299
  completedAt
@@ -5054,6 +5379,16 @@ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
5054
5379
  }
5055
5380
  `
5056
5381
  );
5382
+ var EXPLORE_SHARED_CONVERSATION_QUERY = (
5383
+ /* GraphQL */
5384
+ `
5385
+ query ExploreSharedConversation($shareToken: String!) {
5386
+ exploreSharedConversation(shareToken: $shareToken) {
5387
+ ${EXPLORE_MESSAGE_FIELDS}
5388
+ }
5389
+ }
5390
+ `
5391
+ );
5057
5392
 
5058
5393
  // src/data/products.ts
5059
5394
  var ECOSYSTEM_PRODUCTS = [
@@ -5504,6 +5839,14 @@ function readPersisted(key) {
5504
5839
  return null;
5505
5840
  }
5506
5841
  }
5842
+ function readShareToken() {
5843
+ if (typeof window === "undefined") return null;
5844
+ try {
5845
+ return new URL(window.location.href).searchParams.get("c");
5846
+ } catch {
5847
+ return null;
5848
+ }
5849
+ }
5507
5850
  function visibleText(message) {
5508
5851
  return message.content || message.partialContent || "";
5509
5852
  }
@@ -5542,10 +5885,18 @@ function useExploreChat(options = {}) {
5542
5885
  const pollGenerationRef = React.useRef(0);
5543
5886
  const pollTimerRef = React.useRef(null);
5544
5887
  const conversationTokenRef = React.useRef(null);
5888
+ const shareTokenRef = React.useRef(void 0);
5889
+ if (shareTokenRef.current === void 0) {
5890
+ shareTokenRef.current = readShareToken();
5891
+ }
5892
+ const isSharedView = shareTokenRef.current !== null;
5545
5893
  const catalogRef = React.useRef(fallbackCatalog);
5546
5894
  const turnCountRef = React.useRef(0);
5547
5895
  const focusProductRef = React.useRef(null);
5548
5896
  const lastSentTextRef = React.useRef(null);
5897
+ const lastSentAttachmentsRef = React.useRef(
5898
+ []
5899
+ );
5549
5900
  const inFlightRef = React.useRef(false);
5550
5901
  catalogRef.current = catalog;
5551
5902
  const clearPollTimer = React.useCallback(() => {
@@ -5570,6 +5921,43 @@ function useExploreChat(options = {}) {
5570
5921
  };
5571
5922
  }, []);
5572
5923
  React.useEffect(() => {
5924
+ const shareToken = shareTokenRef.current;
5925
+ if (!shareToken) return;
5926
+ let cancelled = false;
5927
+ setHydrated(true);
5928
+ void client.query(
5929
+ EXPLORE_SHARED_CONVERSATION_QUERY,
5930
+ { shareToken },
5931
+ { cache: false }
5932
+ ).then((res) => {
5933
+ if (cancelled || !mountedRef.current) return;
5934
+ const shared = res?.data?.exploreSharedConversation;
5935
+ if (shared && shared.length > 0) {
5936
+ setMessages(shared);
5937
+ return;
5938
+ }
5939
+ setError({
5940
+ kind: "unknown",
5941
+ code: "SHARE_NOT_FOUND",
5942
+ message: "That shared conversation could not be found. The link may have expired.",
5943
+ // Nothing to retry: a bad token will stay bad.
5944
+ retryable: false
5945
+ });
5946
+ }).catch(() => {
5947
+ if (cancelled || !mountedRef.current) return;
5948
+ setError({
5949
+ kind: "unknown",
5950
+ code: "SHARE_NOT_FOUND",
5951
+ message: "That shared conversation could not be loaded.",
5952
+ retryable: true
5953
+ });
5954
+ });
5955
+ return () => {
5956
+ cancelled = true;
5957
+ };
5958
+ }, [client]);
5959
+ React.useEffect(() => {
5960
+ if (shareTokenRef.current !== null) return;
5573
5961
  if (!persist) {
5574
5962
  setHydrated(true);
5575
5963
  return;
@@ -5737,7 +6125,7 @@ function useExploreChat(options = {}) {
5737
6125
  [client, pollIntervalMs, pollTimeoutMs]
5738
6126
  );
5739
6127
  const submit = React.useCallback(
5740
- async (text, optimisticId, captchaAttempt) => {
6128
+ async (text, optimisticId, captchaAttempt, attachments) => {
5741
6129
  const activeCatalog = catalogRef.current;
5742
6130
  let recaptchaToken;
5743
6131
  if (activeCatalog.captchaRequired && activeCatalog.recaptchaSiteKey) {
@@ -5755,7 +6143,8 @@ function useExploreChat(options = {}) {
5755
6143
  ...focusProductRef.current || productSlug ? { productSlug: focusProductRef.current ?? productSlug } : {},
5756
6144
  ...recaptchaToken ? { recaptchaToken } : {},
5757
6145
  ...locale ? { locale } : {},
5758
- ...pageUrl ? { pageUrl } : {}
6146
+ ...pageUrl ? { pageUrl } : {},
6147
+ ...attachments.length > 0 ? { attachments: [...attachments] } : {}
5759
6148
  };
5760
6149
  const res = await client.mutate(
5761
6150
  SEND_EXPLORE_MESSAGE_MUTATION,
@@ -5769,7 +6158,7 @@ function useExploreChat(options = {}) {
5769
6158
  const code = typeof first?.extensions?.code === "string" ? first.extensions.code : void 0;
5770
6159
  const classified = classifyExploreError(code, first?.message);
5771
6160
  if (classified.kind === "captcha" && captchaAttempt === 0) {
5772
- await submit(text, optimisticId, 1);
6161
+ await submit(text, optimisticId, 1, attachments);
5773
6162
  return;
5774
6163
  }
5775
6164
  inFlightRef.current = false;
@@ -5806,7 +6195,7 @@ function useExploreChat(options = {}) {
5806
6195
  [client, locale, pageUrl, productSlug, startPolling]
5807
6196
  );
5808
6197
  const send = React.useCallback(
5809
- async (message) => {
6198
+ async (message, attachments = []) => {
5810
6199
  const text = message.trim();
5811
6200
  if (!text) return;
5812
6201
  if (inFlightRef.current) return;
@@ -5836,6 +6225,7 @@ function useExploreChat(options = {}) {
5836
6225
  }
5837
6226
  inFlightRef.current = true;
5838
6227
  lastSentTextRef.current = text;
6228
+ lastSentAttachmentsRef.current = attachments;
5839
6229
  setError(null);
5840
6230
  setPhase("sending");
5841
6231
  cancelPolling();
@@ -5858,7 +6248,7 @@ function useExploreChat(options = {}) {
5858
6248
  setTurnCount(turnCountRef.current);
5859
6249
  onSend?.(text);
5860
6250
  try {
5861
- await submit(text, optimistic.id, 0);
6251
+ await submit(text, optimistic.id, 0, attachments);
5862
6252
  } catch (err) {
5863
6253
  if (!mountedRef.current) return;
5864
6254
  console.error("[WebSDK] Explore send failed", err);
@@ -5907,7 +6297,7 @@ function useExploreChat(options = {}) {
5907
6297
  });
5908
6298
  turnCountRef.current = Math.max(0, turnCountRef.current - 1);
5909
6299
  setTurnCount(turnCountRef.current);
5910
- void send(text);
6300
+ void send(text, lastSentAttachmentsRef.current);
5911
6301
  }, [cancelPolling, send]);
5912
6302
  const reset = React.useCallback(() => {
5913
6303
  setArchive(
@@ -5921,6 +6311,7 @@ function useExploreChat(options = {}) {
5921
6311
  inFlightRef.current = false;
5922
6312
  conversationTokenRef.current = null;
5923
6313
  lastSentTextRef.current = null;
6314
+ lastSentAttachmentsRef.current = [];
5924
6315
  turnCountRef.current = 0;
5925
6316
  setTurnCount(0);
5926
6317
  setMessages([]);
@@ -6029,7 +6420,8 @@ function useExploreChat(options = {}) {
6029
6420
  deleteConversation,
6030
6421
  clearHistory,
6031
6422
  recordClick,
6032
- createShareLink
6423
+ createShareLink,
6424
+ isSharedView
6033
6425
  };
6034
6426
  }
6035
6427
  var optimisticCounter = 0;
@@ -6255,6 +6647,178 @@ function useSpeechInput({
6255
6647
  );
6256
6648
  return { supported, listening, interim, error, start, stop, toggle };
6257
6649
  }
6650
+ var SWIPE_THRESHOLD = 40;
6651
+ function useSwipe({
6652
+ onSwipeLeft,
6653
+ onSwipeRight,
6654
+ enabled = true
6655
+ }) {
6656
+ const start = React.useRef(null);
6657
+ const onPointerDown = React.useCallback(
6658
+ (event) => {
6659
+ if (!enabled) return;
6660
+ start.current = { x: event.clientX, y: event.clientY };
6661
+ },
6662
+ [enabled]
6663
+ );
6664
+ const onPointerUp = React.useCallback(
6665
+ (event) => {
6666
+ const from = start.current;
6667
+ start.current = null;
6668
+ if (!enabled || !from) return;
6669
+ const dx = event.clientX - from.x;
6670
+ const dy = event.clientY - from.y;
6671
+ if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dx) <= Math.abs(dy))
6672
+ return;
6673
+ if (dx < 0) onSwipeLeft?.();
6674
+ else onSwipeRight?.();
6675
+ },
6676
+ [enabled, onSwipeLeft, onSwipeRight]
6677
+ );
6678
+ const onPointerCancel = React.useCallback(() => {
6679
+ start.current = null;
6680
+ }, []);
6681
+ return { onPointerDown, onPointerUp, onPointerCancel };
6682
+ }
6683
+
6684
+ // src/utils/explore-attachments.ts
6685
+ var MAX_ATTACHMENTS = 5;
6686
+ var MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
6687
+ var MAX_TEXT_PER_ATTACHMENT = 2e4;
6688
+ var TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
6689
+ "txt",
6690
+ "md",
6691
+ "markdown",
6692
+ "csv",
6693
+ "tsv",
6694
+ "json",
6695
+ "jsonl",
6696
+ "yaml",
6697
+ "yml",
6698
+ "toml",
6699
+ "ini",
6700
+ "cfg",
6701
+ "conf",
6702
+ "env",
6703
+ "log",
6704
+ "sql",
6705
+ "graphql",
6706
+ "gql",
6707
+ "html",
6708
+ "htm",
6709
+ "xml",
6710
+ "svg",
6711
+ "css",
6712
+ "scss",
6713
+ "js",
6714
+ "jsx",
6715
+ "mjs",
6716
+ "cjs",
6717
+ "ts",
6718
+ "tsx",
6719
+ "py",
6720
+ "rb",
6721
+ "go",
6722
+ "rs",
6723
+ "java",
6724
+ "kt",
6725
+ "c",
6726
+ "h",
6727
+ "cpp",
6728
+ "cs",
6729
+ "php",
6730
+ "sh",
6731
+ "bash",
6732
+ "zsh",
6733
+ "ps1",
6734
+ "dockerfile",
6735
+ "tf",
6736
+ "tfvars"
6737
+ ]);
6738
+ function isTextualMimeType(mimeType) {
6739
+ if (mimeType.startsWith("text/")) return true;
6740
+ return mimeType === "application/json" || mimeType === "application/xml" || mimeType === "application/yaml" || mimeType === "application/x-yaml" || mimeType === "application/javascript" || mimeType === "application/graphql" || mimeType.endsWith("+json") || mimeType.endsWith("+xml");
6741
+ }
6742
+ function extensionOf(name) {
6743
+ const dot = name.lastIndexOf(".");
6744
+ if (dot <= 0 || dot === name.length - 1) return "";
6745
+ return name.slice(dot + 1).toLowerCase();
6746
+ }
6747
+ function looksTextual(name, mimeType) {
6748
+ if (isTextualMimeType(mimeType)) return true;
6749
+ return TEXT_EXTENSIONS.has(extensionOf(name));
6750
+ }
6751
+ function isDecodedTextUsable(decoded) {
6752
+ if (decoded.length === 0) return false;
6753
+ if (decoded.includes("\0")) return false;
6754
+ let replacements = 0;
6755
+ for (const char of decoded) if (char === "\uFFFD") replacements += 1;
6756
+ return replacements / decoded.length < 0.1;
6757
+ }
6758
+ function formatBytes(bytes) {
6759
+ if (bytes < 1024) return `${bytes} B`;
6760
+ if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;
6761
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
6762
+ }
6763
+ var counter = 0;
6764
+ function nextId() {
6765
+ counter += 1;
6766
+ return `att-${counter}`;
6767
+ }
6768
+ async function readArrayBuffer(blob) {
6769
+ if (typeof blob.arrayBuffer === "function") return blob.arrayBuffer();
6770
+ return new Promise((resolve, reject) => {
6771
+ const reader = new FileReader();
6772
+ reader.onload = () => resolve(reader.result);
6773
+ reader.onerror = () => reject(reader.error ?? new Error("file read failed"));
6774
+ reader.readAsArrayBuffer(blob);
6775
+ });
6776
+ }
6777
+ async function readTextPrefix(file) {
6778
+ try {
6779
+ const slice = file.slice(0, MAX_TEXT_PER_ATTACHMENT);
6780
+ const buffer = await readArrayBuffer(slice);
6781
+ const decoded = new TextDecoder("utf-8").decode(buffer);
6782
+ return isDecodedTextUsable(decoded) ? decoded : null;
6783
+ } catch {
6784
+ return null;
6785
+ }
6786
+ }
6787
+ async function stageFiles(files, alreadyStaged) {
6788
+ const accepted = [];
6789
+ const rejected = [];
6790
+ let slots = MAX_ATTACHMENTS - alreadyStaged.length;
6791
+ for (const file of files) {
6792
+ if (slots <= 0) {
6793
+ rejected.push({ name: file.name, reason: "too-many" });
6794
+ continue;
6795
+ }
6796
+ if (file.size > MAX_ATTACHMENT_BYTES) {
6797
+ rejected.push({ name: file.name, reason: "too-large" });
6798
+ continue;
6799
+ }
6800
+ const mimeType = file.type || "application/octet-stream";
6801
+ const textContent = looksTextual(file.name, mimeType) ? await readTextPrefix(file) : null;
6802
+ accepted.push({
6803
+ id: nextId(),
6804
+ name: file.name,
6805
+ mimeType,
6806
+ size: file.size,
6807
+ textContent,
6808
+ textExtracted: textContent !== null
6809
+ });
6810
+ slots -= 1;
6811
+ }
6812
+ return { accepted, rejected };
6813
+ }
6814
+ function toPayload(staged) {
6815
+ return staged.map(({ name, mimeType, size, textContent }) => ({
6816
+ name,
6817
+ mimeType,
6818
+ size,
6819
+ textContent
6820
+ }));
6821
+ }
6258
6822
  var EXPLORE_CSS = `
6259
6823
  @keyframes boff-explore-pulse {
6260
6824
  0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
@@ -6342,6 +6906,70 @@ var EXPLORE_CSS = `
6342
6906
  max-width: 100%;
6343
6907
  height: auto;
6344
6908
  }
6909
+
6910
+ /* ---- Ambient backdrop -----------------------------------------------------------------
6911
+ Two very low-opacity radial washes behind the welcome state, drifting slowly. Painted on
6912
+ a pseudo-element with pointer-events:none so it can never intercept a click \u2014 a
6913
+ decorative overlay that swallows clicks is a bug we have shipped before.
6914
+ Colours come from the product's own --primary token, so this picks up each site's palette
6915
+ instead of introducing one. */
6916
+ .boff-explore-aura {
6917
+ position: relative;
6918
+ isolation: isolate;
6919
+ }
6920
+ .boff-explore-aura::before {
6921
+ content: "";
6922
+ position: absolute;
6923
+ inset: -10% -20% auto -20%;
6924
+ height: 60%;
6925
+ z-index: -1;
6926
+ pointer-events: none;
6927
+ background:
6928
+ radial-gradient(38% 55% at 22% 30%, hsl(var(--primary) / 0.10), transparent 70%),
6929
+ radial-gradient(32% 48% at 78% 18%, hsl(var(--primary) / 0.07), transparent 72%);
6930
+ filter: blur(6px);
6931
+ animation: boff-explore-drift 26s ease-in-out infinite alternate;
6932
+ }
6933
+ @keyframes boff-explore-drift {
6934
+ from { transform: translate3d(-1.5%, -1%, 0) scale(1); }
6935
+ to { transform: translate3d(1.5%, 1.5%, 0) scale(1.06); }
6936
+ }
6937
+
6938
+ /* Entrance: content settles rather than snapping in. Short, and only once. */
6939
+ @keyframes boff-explore-rise {
6940
+ from { opacity: 0; transform: translateY(6px); }
6941
+ to { opacity: 1; transform: none; }
6942
+ }
6943
+ .boff-explore-rise {
6944
+ animation: boff-explore-rise 380ms cubic-bezier(0.22, 1, 0.36, 1) both;
6945
+ }
6946
+ .boff-explore-rise-1 { animation-delay: 40ms; }
6947
+ .boff-explore-rise-2 { animation-delay: 90ms; }
6948
+ .boff-explore-rise-3 { animation-delay: 140ms; }
6949
+
6950
+ /* A soft sheen that crosses the send button while a turn is in flight \u2014 enough to say
6951
+ "working" without another spinner competing with the thinking dots. */
6952
+ @keyframes boff-explore-sheen {
6953
+ from { transform: translateX(-120%); }
6954
+ to { transform: translateX(220%); }
6955
+ }
6956
+ .boff-explore-busy { position: relative; overflow: hidden; }
6957
+ .boff-explore-busy::after {
6958
+ content: "";
6959
+ position: absolute;
6960
+ inset: 0;
6961
+ pointer-events: none;
6962
+ background: linear-gradient(100deg, transparent 20%, hsl(var(--primary) / 0.22) 50%, transparent 80%);
6963
+ animation: boff-explore-sheen 1.5s ease-in-out infinite;
6964
+ }
6965
+
6966
+ /* Every one of the above is decoration. Reduced motion removes the movement and keeps the
6967
+ final state, rather than leaving content mid-animation and invisible. */
6968
+ @media (prefers-reduced-motion: reduce) {
6969
+ .boff-explore-aura::before,
6970
+ .boff-explore-busy::after { animation: none; }
6971
+ .boff-explore-rise { animation: none; opacity: 1; transform: none; }
6972
+ }
6345
6973
  `;
6346
6974
  function ExploreStyles() {
6347
6975
  return /* @__PURE__ */ jsxRuntime.jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
@@ -6539,17 +7167,48 @@ function ThinkingIndicator({ activity }) {
6539
7167
  }
6540
7168
  );
6541
7169
  }
6542
- function UserBubble({ message }) {
6543
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(
6544
- "div",
6545
- {
6546
- "data-boff-explore": "user",
6547
- className: "max-w-[85%] whitespace-pre-wrap break-words rounded-2xl rounded-br-md bg-primary px-4 py-2.5 text-sm leading-relaxed text-primary-foreground shadow-sm",
6548
- children: message.content
6549
- }
6550
- ) });
7170
+ function UserBubble({
7171
+ strings: T,
7172
+ message
7173
+ }) {
7174
+ const attachments = message.attachments ?? [];
7175
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-end gap-1.5", children: [
7176
+ /* @__PURE__ */ jsxRuntime.jsx(
7177
+ "div",
7178
+ {
7179
+ "data-boff-explore": "user",
7180
+ className: "max-w-[85%] whitespace-pre-wrap break-words rounded-2xl rounded-br-md bg-primary px-4 py-2.5 text-sm leading-relaxed text-primary-foreground shadow-sm",
7181
+ children: message.content
7182
+ }
7183
+ ),
7184
+ attachments.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
7185
+ "ul",
7186
+ {
7187
+ "data-boff-explore": "user-attachments",
7188
+ className: "flex max-w-[85%] flex-wrap justify-end gap-1.5",
7189
+ children: attachments.map((attachment) => /* @__PURE__ */ jsxRuntime.jsxs(
7190
+ "li",
7191
+ {
7192
+ "data-boff-explore": "user-attachment",
7193
+ "data-text-extracted": attachment.textExtracted ? "true" : "false",
7194
+ className: "flex max-w-full items-center gap-1.5 rounded-full border border-border bg-muted/60 px-2.5 py-1 text-xs text-muted-foreground",
7195
+ children: [
7196
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0" }),
7197
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", title: attachment.name, children: attachment.name }),
7198
+ attachment.textExtracted ? null : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0", children: [
7199
+ "\xB7 ",
7200
+ T.attachmentNameOnly
7201
+ ] })
7202
+ ]
7203
+ },
7204
+ `${attachment.name}-${attachment.size}`
7205
+ ))
7206
+ }
7207
+ ) : null
7208
+ ] });
6551
7209
  }
6552
7210
  function AssistantBubble({
7211
+ strings: T,
6553
7212
  message,
6554
7213
  activity,
6555
7214
  onNavigate,
@@ -6566,7 +7225,7 @@ function AssistantBubble({
6566
7225
  ref: anchorRef,
6567
7226
  "data-boff-explore": "assistant",
6568
7227
  "data-status": message.status,
6569
- className: "flex scroll-mt-4 gap-3",
7228
+ className: "boff-explore-rise flex scroll-mt-4 gap-3",
6570
7229
  children: [
6571
7230
  /* @__PURE__ */ jsxRuntime.jsx(
6572
7231
  "span",
@@ -6597,7 +7256,7 @@ function AssistantBubble({
6597
7256
  event.preventDefault();
6598
7257
  onNavigate("/contact");
6599
7258
  },
6600
- children: "ask a human"
7259
+ children: T.askHuman
6601
7260
  }
6602
7261
  ),
6603
7262
  "."
@@ -6612,7 +7271,7 @@ function AssistantBubble({
6612
7271
  streaming ? /* @__PURE__ */ jsxRuntime.jsx(ThinkingIndicator, { activity }) : null,
6613
7272
  failed && !body ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-2xl rounded-tl-md border border-border bg-muted px-4 py-3 text-sm text-muted-foreground", children: "That answer didn't come through. Try asking again." }) : null,
6614
7273
  message.references.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6615
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Sources" }),
7274
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.sources }),
6616
7275
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3", children: message.references.map((reference) => /* @__PURE__ */ jsxRuntime.jsx(
6617
7276
  ReferenceCard,
6618
7277
  {
@@ -6632,7 +7291,7 @@ function AssistantBubble({
6632
7291
  `${cta.kind}-${cta.url}`
6633
7292
  )) }) : null,
6634
7293
  message.status === "COMPLETED" && (message.followUps?.length ?? 0) > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5 pt-0.5", children: [
6635
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children: "Next you could ask" }),
7294
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground", children: T.nextYouCouldAsk }),
6636
7295
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: (message.followUps ?? []).map((question) => /* @__PURE__ */ jsxRuntime.jsxs(
6637
7296
  "button",
6638
7297
  {
@@ -6694,6 +7353,7 @@ function ErrorBanner({
6694
7353
  );
6695
7354
  }
6696
7355
  function PromptCarousel({
7356
+ strings: T,
6697
7357
  prompts,
6698
7358
  onPrompt,
6699
7359
  disabled
@@ -6708,6 +7368,11 @@ function PromptCarousel({
6708
7368
  },
6709
7369
  [count]
6710
7370
  );
7371
+ const swipe = useSwipe({
7372
+ onSwipeLeft: () => go(1),
7373
+ onSwipeRight: () => go(-1),
7374
+ enabled: count > 1
7375
+ });
6711
7376
  React.useEffect(() => {
6712
7377
  if (paused || disabled || count < 2) return;
6713
7378
  if (typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
@@ -6720,7 +7385,7 @@ function PromptCarousel({
6720
7385
  return /* @__PURE__ */ jsxRuntime.jsxs(
6721
7386
  "div",
6722
7387
  {
6723
- className: "flex min-w-0 items-center gap-1.5",
7388
+ className: "flex min-w-0 touch-pan-y items-center gap-1.5",
6724
7389
  role: "group",
6725
7390
  "aria-roledescription": "carousel",
6726
7391
  "aria-label": "Example questions",
@@ -6728,14 +7393,15 @@ function PromptCarousel({
6728
7393
  onMouseLeave: () => setPaused(false),
6729
7394
  onFocusCapture: () => setPaused(true),
6730
7395
  onBlurCapture: () => setPaused(false),
7396
+ ...swipe,
6731
7397
  children: [
6732
7398
  count > 1 ? /* @__PURE__ */ jsxRuntime.jsx(
6733
7399
  "button",
6734
7400
  {
6735
7401
  type: "button",
6736
- "aria-label": "Previous suggestion",
7402
+ "aria-label": T.prevSuggestion,
6737
7403
  onClick: () => go(-1),
6738
- className: "hidden h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring sm:inline-flex",
7404
+ className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
6739
7405
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" })
6740
7406
  }
6741
7407
  ) : null,
@@ -6762,7 +7428,7 @@ function PromptCarousel({
6762
7428
  "button",
6763
7429
  {
6764
7430
  type: "button",
6765
- "aria-label": "Next suggestion",
7431
+ "aria-label": T.nextSuggestion,
6766
7432
  onClick: () => go(1),
6767
7433
  className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
6768
7434
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
@@ -6773,6 +7439,7 @@ function PromptCarousel({
6773
7439
  );
6774
7440
  }
6775
7441
  function ProductStrip({
7442
+ strings: T,
6776
7443
  products,
6777
7444
  focusProduct,
6778
7445
  onFocus
@@ -6807,7 +7474,7 @@ function ProductStrip({
6807
7474
  "aria-pressed": focusProduct === null,
6808
7475
  onClick: () => onFocus(null),
6809
7476
  className: chipClass(focusProduct === null),
6810
- children: "All products"
7477
+ children: T.allProducts
6811
7478
  }
6812
7479
  ),
6813
7480
  products.map((product) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -6836,7 +7503,7 @@ function ProductStrip({
6836
7503
  "aria-expanded": expanded,
6837
7504
  onClick: () => setExpanded((v) => !v),
6838
7505
  className: "shrink-0 whitespace-nowrap rounded-full px-2 py-1 text-xs font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
6839
- children: expanded ? "Show less" : `All ${products.length}`
7506
+ children: expanded ? T.showLess : `${T.showAll} ${products.length}`
6840
7507
  }
6841
7508
  ) : null
6842
7509
  ]
@@ -6944,6 +7611,7 @@ function DisclaimerDialog({
6944
7611
  );
6945
7612
  }
6946
7613
  function WelcomeState({
7614
+ strings: T,
6947
7615
  title,
6948
7616
  body,
6949
7617
  prompts,
@@ -6953,43 +7621,45 @@ function WelcomeState({
6953
7621
  onFocus,
6954
7622
  disabled
6955
7623
  }) {
6956
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-3xl px-4 py-8 sm:py-12", children: [
6957
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
7624
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-aura mx-auto my-auto w-full max-w-3xl px-4 py-6 sm:py-8 lg:py-10", children: [
7625
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise text-center", children: [
6958
7626
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full border border-border bg-muted px-3 py-1 text-xs font-medium text-muted-foreground", children: [
6959
7627
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-3.5 w-3.5" }),
6960
- "AI answers, grounded in our documentation"
7628
+ T.badge
6961
7629
  ] }),
6962
7630
  /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "mt-4 text-balance break-words text-2xl font-bold tracking-tight sm:text-4xl", children: title }),
6963
7631
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mx-auto mt-2.5 max-w-2xl text-pretty text-sm leading-relaxed text-muted-foreground sm:text-lg", children: body })
6964
7632
  ] }),
6965
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-7 grid gap-2.5 sm:grid-cols-3", children: CAPABILITIES.map(({ icon: Icon, title: capTitle, body: capBody }) => /* @__PURE__ */ jsxRuntime.jsxs(
7633
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "boff-explore-rise boff-explore-rise-1 mt-6 grid grid-cols-3 gap-2 sm:mt-7 sm:gap-2.5", children: CAPABILITIES.map(({ icon: Icon, body: capBody }, i) => /* @__PURE__ */ jsxRuntime.jsxs(
6966
7634
  "li",
6967
7635
  {
6968
- className: "rounded-xl border border-border/70 bg-card/60 p-3.5 text-left transition-colors hover:border-border",
7636
+ className: "rounded-xl border border-border/70 bg-card/60 p-2.5 text-center transition-colors hover:border-border sm:p-3.5 sm:text-left",
6969
7637
  children: [
6970
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-2.5 flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4" }) }),
6971
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold text-card-foreground", children: capTitle }),
6972
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: capBody })
7638
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-auto mb-1.5 flex h-7 w-7 items-center justify-center rounded-lg bg-primary/10 text-primary sm:mx-0 sm:mb-2.5 sm:h-8 sm:w-8", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
7639
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-normal", children: T.capabilities[i] ?? "" }),
7640
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 hidden text-xs leading-relaxed text-muted-foreground sm:block", children: capBody })
6973
7641
  ]
6974
7642
  },
6975
- capTitle
7643
+ i
6976
7644
  )) }),
6977
- prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8", children: [
6978
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Try asking" }),
7645
+ prompts.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-2 mt-8", children: [
7646
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.tryAsking }),
6979
7647
  /* @__PURE__ */ jsxRuntime.jsx(
6980
7648
  PromptCarousel,
6981
7649
  {
7650
+ strings: T,
6982
7651
  prompts,
6983
7652
  onPrompt,
6984
7653
  disabled
6985
7654
  }
6986
7655
  )
6987
7656
  ] }) : null,
6988
- products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6", children: [
6989
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Focus on a product" }),
7657
+ products.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "boff-explore-rise boff-explore-rise-3 mt-6", children: [
7658
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.focusProduct }),
6990
7659
  /* @__PURE__ */ jsxRuntime.jsx(
6991
7660
  ProductStrip,
6992
7661
  {
7662
+ strings: T,
6993
7663
  products,
6994
7664
  focusProduct,
6995
7665
  onFocus
@@ -7008,7 +7678,8 @@ function ExplorePage({
7008
7678
  onNavigate,
7009
7679
  onSend,
7010
7680
  welcomeTitle,
7011
- welcomeBody
7681
+ welcomeBody,
7682
+ locale
7012
7683
  }) {
7013
7684
  const pageUrl = React.useMemo(
7014
7685
  () => typeof window === "undefined" ? void 0 : window.location.href,
@@ -7033,7 +7704,8 @@ function ExplorePage({
7033
7704
  deleteConversation,
7034
7705
  clearHistory,
7035
7706
  recordClick,
7036
- createShareLink
7707
+ createShareLink,
7708
+ isSharedView
7037
7709
  } = useExploreChat({ productSlug, pageUrl, onSend, examplePrompts });
7038
7710
  const [draft, setDraft] = React.useState("");
7039
7711
  const textareaRef = React.useRef(null);
@@ -7052,7 +7724,18 @@ function ExplorePage({
7052
7724
  }
7053
7725
  });
7054
7726
  speechStopRef.current = speech.stop;
7727
+ const activeLocale = React.useMemo(
7728
+ () => resolveExploreLocale(locale),
7729
+ [locale]
7730
+ );
7731
+ const T = React.useMemo(() => exploreStrings(activeLocale), [activeLocale]);
7732
+ const rtl = isRtlLocale(activeLocale);
7055
7733
  const [disclaimerOpen, setDisclaimerOpen] = React.useState(false);
7734
+ const [staged, setStaged] = React.useState([]);
7735
+ const [attachmentNotice, setAttachmentNotice] = React.useState(null);
7736
+ const fileInputRef = React.useRef(null);
7737
+ const stagedRef = React.useRef([]);
7738
+ stagedRef.current = staged;
7056
7739
  const [shareLabel, setShareLabel] = React.useState("Share");
7057
7740
  const [shareUrl, setShareUrl] = React.useState(null);
7058
7741
  const scrollRef = React.useRef(null);
@@ -7129,13 +7812,40 @@ function ExplorePage({
7129
7812
  setShareLabel("Share");
7130
7813
  }
7131
7814
  }, [createShareLink, pageUrl]);
7815
+ const handleFilesPicked = React.useCallback(
7816
+ async (picked) => {
7817
+ if (!picked || picked.length === 0) return;
7818
+ const { accepted, rejected } = await stageFiles(
7819
+ Array.from(picked),
7820
+ stagedRef.current
7821
+ );
7822
+ setStaged((prev) => [...prev, ...accepted]);
7823
+ const first = rejected[0];
7824
+ setAttachmentNotice(
7825
+ first ? first.reason === "too-large" ? fill(T.attachmentTooLarge, {
7826
+ name: first.name,
7827
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
7828
+ }) : fill(T.attachmentTooMany, {
7829
+ name: first.name,
7830
+ max: String(MAX_ATTACHMENTS)
7831
+ }) : null
7832
+ );
7833
+ },
7834
+ [T]
7835
+ );
7836
+ const removeAttachment = React.useCallback((id) => {
7837
+ setStaged((prev) => prev.filter((entry) => entry.id !== id));
7838
+ setAttachmentNotice(null);
7839
+ }, []);
7132
7840
  const submitDraft = React.useCallback(() => {
7133
7841
  const text = draft.trim();
7134
7842
  if (!text || overLimit || busy || !canSend) return;
7135
7843
  stopDictation();
7136
7844
  setDraft("");
7137
7845
  stickToBottomRef.current = true;
7138
- void send(text);
7846
+ void send(text, toPayload(stagedRef.current));
7847
+ setStaged([]);
7848
+ setAttachmentNotice(null);
7139
7849
  textareaRef.current?.focus();
7140
7850
  }, [busy, canSend, draft, overLimit, send, stopDictation]);
7141
7851
  const sendPrompt = React.useCallback(
@@ -7143,7 +7853,9 @@ function ExplorePage({
7143
7853
  if (!canSend || busy) return;
7144
7854
  setDraft("");
7145
7855
  stickToBottomRef.current = true;
7146
- void send(prompt);
7856
+ void send(prompt, toPayload(stagedRef.current));
7857
+ setStaged([]);
7858
+ setAttachmentNotice(null);
7147
7859
  },
7148
7860
  [busy, canSend, send]
7149
7861
  );
@@ -7156,7 +7868,9 @@ function ExplorePage({
7156
7868
  },
7157
7869
  [submitDraft]
7158
7870
  );
7159
- const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled;
7871
+ const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled || // A share token grants read access only — the server would reject a send anyway, so
7872
+ // disable it here rather than letting the visitor type into a dead composer.
7873
+ isSharedView;
7160
7874
  const captchaOn = Boolean(
7161
7875
  catalog.captchaRequired && catalog.recaptchaSiteKey
7162
7876
  );
@@ -7166,6 +7880,8 @@ function ExplorePage({
7166
7880
  {
7167
7881
  "data-boff-explore": "page",
7168
7882
  "data-phase": phase,
7883
+ "data-locale": activeLocale,
7884
+ dir: rtl ? "rtl" : void 0,
7169
7885
  className: cn(
7170
7886
  "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
7171
7887
  heightMode === "auto" && "min-h-[70vh]",
@@ -7327,10 +8043,17 @@ function ExplorePage({
7327
8043
  role: "log",
7328
8044
  "aria-live": "polite",
7329
8045
  "aria-label": "Explore conversation",
7330
- className: "boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
8046
+ className: cn(
8047
+ "boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
8048
+ // Only while the welcome state is showing: a flex column is what lets its
8049
+ // `my-auto` centre the block on a tall screen. The transcript must NOT be a flex
8050
+ // column — that would fight the natural top-down flow of messages.
8051
+ showWelcome && "flex flex-col"
8052
+ ),
7331
8053
  children: showWelcome ? /* @__PURE__ */ jsxRuntime.jsx(
7332
8054
  WelcomeState,
7333
8055
  {
8056
+ strings: T,
7334
8057
  title: resolvedTitle,
7335
8058
  body: resolvedBody,
7336
8059
  prompts,
@@ -7341,9 +8064,10 @@ function ExplorePage({
7341
8064
  disabled: !canSend || busy
7342
8065
  }
7343
8066
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto w-full min-w-0 max-w-3xl space-y-6 px-4 py-6", children: messages.map(
7344
- (message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
8067
+ (message) => message.role === "USER" ? /* @__PURE__ */ jsxRuntime.jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsxRuntime.jsx(
7345
8068
  AssistantBubble,
7346
8069
  {
8070
+ strings: T,
7347
8071
  message,
7348
8072
  activity,
7349
8073
  onNavigate,
@@ -7364,6 +8088,33 @@ function ExplorePage({
7364
8088
  captchaOn
7365
8089
  }
7366
8090
  ),
8091
+ isSharedView ? /* @__PURE__ */ jsxRuntime.jsxs(
8092
+ "div",
8093
+ {
8094
+ "data-boff-explore": "shared-banner",
8095
+ className: "mx-auto flex w-full max-w-3xl items-center gap-2 px-4 pb-2 text-xs text-muted-foreground",
8096
+ children: [
8097
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Link2, { className: "h-3.5 w-3.5 shrink-0" }),
8098
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1", children: "You are viewing a shared conversation. Start your own to ask a question." }),
8099
+ /* @__PURE__ */ jsxRuntime.jsx(
8100
+ "button",
8101
+ {
8102
+ type: "button",
8103
+ "data-boff-explore": "shared-start-own",
8104
+ onClick: () => {
8105
+ if (typeof window !== "undefined") {
8106
+ const url = new URL(window.location.href);
8107
+ url.searchParams.delete("c");
8108
+ window.location.href = url.toString();
8109
+ }
8110
+ },
8111
+ className: "shrink-0 underline underline-offset-2 hover:text-foreground",
8112
+ children: "New chat"
8113
+ }
8114
+ )
8115
+ ]
8116
+ }
8117
+ ) : null,
7367
8118
  /* @__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(
7368
8119
  "form",
7369
8120
  {
@@ -7375,11 +8126,57 @@ function ExplorePage({
7375
8126
  },
7376
8127
  children: [
7377
8128
  error ? /* @__PURE__ */ jsxRuntime.jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
8129
+ staged.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
8130
+ "ul",
8131
+ {
8132
+ "data-boff-explore": "attachments",
8133
+ className: "mb-2 flex flex-wrap gap-1.5",
8134
+ "aria-label": T.attach,
8135
+ children: staged.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
8136
+ "li",
8137
+ {
8138
+ "data-boff-explore": "attachment",
8139
+ "data-text-extracted": entry.textExtracted ? "true" : "false",
8140
+ 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",
8141
+ children: [
8142
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
8143
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
8144
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
8145
+ formatBytes(entry.size),
8146
+ entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
8147
+ ] }),
8148
+ /* @__PURE__ */ jsxRuntime.jsx(
8149
+ "button",
8150
+ {
8151
+ type: "button",
8152
+ "data-boff-explore": "attachment-remove",
8153
+ onClick: () => removeAttachment(entry.id),
8154
+ "aria-label": fill(T.removeAttachment, { name: entry.name }),
8155
+ 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",
8156
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" })
8157
+ }
8158
+ )
8159
+ ]
8160
+ },
8161
+ entry.id
8162
+ ))
8163
+ }
8164
+ ) : null,
8165
+ attachmentNotice !== null ? /* @__PURE__ */ jsxRuntime.jsx(
8166
+ "p",
8167
+ {
8168
+ "data-boff-explore": "attachment-notice",
8169
+ role: "status",
8170
+ className: "mb-2 text-xs text-destructive",
8171
+ children: attachmentNotice
8172
+ }
8173
+ ) : null,
7378
8174
  /* @__PURE__ */ jsxRuntime.jsxs(
7379
8175
  "div",
7380
8176
  {
7381
8177
  className: cn(
7382
8178
  "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
8179
+ busy && "boff-explore-busy",
7383
8180
  overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
7384
8181
  ),
7385
8182
  children: [
@@ -7399,8 +8196,40 @@ function ExplorePage({
7399
8196
  composingRef.current = false;
7400
8197
  },
7401
8198
  "aria-label": "Ask a question",
7402
- placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? `Ask about ${focusedProductName}\u2026` : "Ask anything about our products\u2026",
7403
- className: "max-h-[200px] min-h-[44px] w-full min-w-0 flex-1 resize-none border-0 bg-transparent px-2 py-2.5 text-sm shadow-none focus-visible:ring-0 md:text-sm"
8199
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
8200
+ product: focusedProductName
8201
+ }) : T.placeholder,
8202
+ 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"
8203
+ }
8204
+ ),
8205
+ /* @__PURE__ */ jsxRuntime.jsx(
8206
+ "input",
8207
+ {
8208
+ ref: fileInputRef,
8209
+ type: "file",
8210
+ multiple: true,
8211
+ className: "hidden",
8212
+ onChange: (event) => {
8213
+ void handleFilesPicked(event.target.files);
8214
+ event.target.value = "";
8215
+ }
8216
+ }
8217
+ ),
8218
+ /* @__PURE__ */ jsxRuntime.jsx(
8219
+ Button,
8220
+ {
8221
+ "data-boff-explore": "attach",
8222
+ type: "button",
8223
+ size: "icon",
8224
+ variant: "ghost",
8225
+ disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
8226
+ "aria-label": T.attach,
8227
+ title: `${T.attach} \u2014 ${fill(T.attachHint, {
8228
+ max: String(MAX_ATTACHMENTS),
8229
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
8230
+ })}`,
8231
+ onClick: () => fileInputRef.current?.click(),
8232
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Paperclip, { className: "h-4 w-4" })
7404
8233
  }
7405
8234
  ),
7406
8235
  speech.supported ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -7412,9 +8241,9 @@ function ExplorePage({
7412
8241
  size: "icon",
7413
8242
  variant: speech.listening ? "default" : "ghost",
7414
8243
  disabled: composerDisabled,
7415
- "aria-label": speech.listening ? "Stop dictating" : "Dictate your question",
8244
+ "aria-label": speech.listening ? T.stopDictating : T.dictate,
7416
8245
  "aria-pressed": speech.listening,
7417
- title: speech.listening ? "Stop dictating" : "Dictate your question",
8246
+ title: speech.listening ? T.stopDictating : T.dictate,
7418
8247
  onClick: speech.toggle,
7419
8248
  className: cn(speech.listening && "animate-pulse"),
7420
8249
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" })
@@ -7514,7 +8343,7 @@ function ExplorePage({
7514
8343
  )
7515
8344
  ] }) : null,
7516
8345
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
7517
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: "Grounded in our docs \u2014 check anything important." }),
8346
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
7518
8347
  /* @__PURE__ */ jsxRuntime.jsx(
7519
8348
  "button",
7520
8349
  {
@@ -7522,7 +8351,7 @@ function ExplorePage({
7522
8351
  "data-boff-explore": "disclaimer",
7523
8352
  onClick: () => setDisclaimerOpen(true),
7524
8353
  className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
7525
- children: "Disclaimer"
8354
+ children: T.disclaimer
7526
8355
  }
7527
8356
  )
7528
8357
  ] })
@@ -9385,7 +10214,7 @@ function ChangelogPage(props) {
9385
10214
  }
9386
10215
 
9387
10216
  // src/content/utils.ts
9388
- function formatBytes(bytes) {
10217
+ function formatBytes2(bytes) {
9389
10218
  if (bytes == null) return "";
9390
10219
  if (bytes < 1024) return `${bytes} B`;
9391
10220
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
@@ -9506,7 +10335,7 @@ function PressKitLightbox({
9506
10335
  }, [asset, onClose]);
9507
10336
  if (!asset) return null;
9508
10337
  const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
9509
- const size = formatBytes(asset.fileSize);
10338
+ const size = formatBytes2(asset.fileSize);
9510
10339
  return /* @__PURE__ */ jsxRuntime.jsx(
9511
10340
  "div",
9512
10341
  {
@@ -9615,7 +10444,7 @@ function AssetCard({
9615
10444
  day: "numeric"
9616
10445
  }) : "";
9617
10446
  const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
9618
- const size = formatBytes(asset.fileSize);
10447
+ const size = formatBytes2(asset.fileSize);
9619
10448
  const [imgError, setImgError] = React.useState(false);
9620
10449
  const thumb = asset.thumbnailUrl && !imgError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-[16/9] overflow-hidden bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsx(
9621
10450
  "img",
@@ -10119,7 +10948,7 @@ function ContractsPage(props) {
10119
10948
  ] }) }),
10120
10949
  /* @__PURE__ */ jsxRuntime.jsx("section", { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center py-20", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }) : error ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: error }) }) : contracts.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base text-muted-foreground", children: "No contracts are available yet." }) }) : /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "divide-y divide-border rounded-xl border border-border overflow-hidden bg-card", children: contracts.map((c) => {
10121
10950
  const ext = fileExt(c);
10122
- const size = formatBytes(c.fileSize);
10951
+ const size = formatBytes2(c.fileSize);
10123
10952
  return /* @__PURE__ */ jsxRuntime.jsxs(
10124
10953
  "li",
10125
10954
  {
@@ -12208,6 +13037,7 @@ exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
12208
13037
  exports.DEFAULT_EXPLORE_EXAMPLE_PROMPTS = DEFAULT_EXPLORE_EXAMPLE_PROMPTS;
12209
13038
  exports.ECOSYSTEM_PRODUCTS = ECOSYSTEM_PRODUCTS;
12210
13039
  exports.EXPLORE_CATALOG_QUERY = EXPLORE_CATALOG_QUERY;
13040
+ exports.EXPLORE_LOCALES = EXPLORE_LOCALES;
12211
13041
  exports.EXPLORE_MESSAGE_QUERY = EXPLORE_MESSAGE_QUERY;
12212
13042
  exports.EXPLORE_RECAPTCHA_ACTION = EXPLORE_RECAPTCHA_ACTION;
12213
13043
  exports.ElectronDownloadLink = ElectronDownloadLink;