@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.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect } from 'react';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, Globe, ChevronDown, Search, Rocket, ArrowRight, Download, Sparkles, RotateCcw, Link2, History, Trash2, Mic, Square, ArrowUp, BookOpenText, Layers, TriangleAlert, ChevronLeft, ChevronRight, FileText, ExternalLink } from 'lucide-react';
4
+ import { Instagram, Youtube, Facebook, Github, Linkedin, Twitter, Mail, Phone, MapPin, Clock, Send, CheckCircle, Upload, Globe, ChevronDown, Search, Rocket, ArrowRight, Download, Sparkles, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, BookOpenText, Layers, TriangleAlert, ChevronLeft, ChevronRight, FileText, ExternalLink } from 'lucide-react';
5
5
  import ReCAPTCHA4 from 'react-google-recaptcha';
6
6
  import { toast } from 'sonner';
7
7
  import { Helmet } from 'react-helmet-async';
@@ -4735,6 +4735,325 @@ function ElectronDownloadLink({
4735
4735
  }
4736
4736
  );
4737
4737
  }
4738
+
4739
+ // src/components/explore-i18n.ts
4740
+ var EXPLORE_LOCALES = ["en", "zh", "hi", "es", "ar", "ta"];
4741
+ var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
4742
+ function isRtlLocale(locale) {
4743
+ return RTL_LOCALES.has(locale);
4744
+ }
4745
+ var EN = {
4746
+ badge: "AI answers, grounded in our documentation",
4747
+ welcomeTitle: "Ask anything about our products",
4748
+ welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
4749
+ tryAsking: "Try asking",
4750
+ focusProduct: "Focus on a product",
4751
+ allProducts: "All products",
4752
+ showAll: "All",
4753
+ showLess: "Show less",
4754
+ sources: "Sources",
4755
+ nextYouCouldAsk: "Next you could ask",
4756
+ placeholder: "Ask anything about our products\u2026",
4757
+ placeholderProduct: "Ask about {product}\u2026",
4758
+ send: "Send",
4759
+ stop: "Stop",
4760
+ newChat: "New chat",
4761
+ history: "History",
4762
+ clearHistory: "Clear history",
4763
+ share: "Share",
4764
+ copied: "Copied",
4765
+ copying: "Copying\u2026",
4766
+ shareUnavailable: "Unavailable",
4767
+ disclaimer: "Disclaimer",
4768
+ disclaimerShort: "Grounded in our docs \u2014 check anything important.",
4769
+ dictate: "Dictate your question",
4770
+ stopDictating: "Stop dictating",
4771
+ attach: "Attach files",
4772
+ attachHint: "Up to {{max}} files, {{size}} MB each",
4773
+ removeAttachment: "Remove {{name}}",
4774
+ attachmentNameOnly: "name and type only",
4775
+ attachmentTooLarge: "{{name}} is larger than {{size}} MB and was not attached.",
4776
+ attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
4777
+ noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
4778
+ askHuman: "ask a human",
4779
+ prevSuggestion: "Previous suggestion",
4780
+ nextSuggestion: "Next suggestion",
4781
+ capabilities: [
4782
+ "Grounded in our own docs",
4783
+ "Compare across the ecosystem",
4784
+ "Straight to the right page"
4785
+ ],
4786
+ prompts: [
4787
+ "What does this product actually do?",
4788
+ "Which product fits my team?",
4789
+ "How do I get started, step by step?",
4790
+ "How much does it cost?"
4791
+ ]
4792
+ };
4793
+ var ZH = {
4794
+ badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
4795
+ welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
4796
+ 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",
4797
+ tryAsking: "\u8BD5\u7740\u95EE",
4798
+ focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
4799
+ allProducts: "\u5168\u90E8\u4EA7\u54C1",
4800
+ showAll: "\u5168\u90E8",
4801
+ showLess: "\u6536\u8D77",
4802
+ sources: "\u6765\u6E90",
4803
+ nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
4804
+ placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
4805
+ placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
4806
+ send: "\u53D1\u9001",
4807
+ stop: "\u505C\u6B62",
4808
+ newChat: "\u65B0\u5BF9\u8BDD",
4809
+ history: "\u5386\u53F2",
4810
+ clearHistory: "\u6E05\u9664\u5386\u53F2",
4811
+ share: "\u5206\u4EAB",
4812
+ copied: "\u5DF2\u590D\u5236",
4813
+ copying: "\u590D\u5236\u4E2D\u2026",
4814
+ shareUnavailable: "\u4E0D\u53EF\u7528",
4815
+ disclaimer: "\u514D\u8D23\u58F0\u660E",
4816
+ disclaimerShort: "\u5185\u5BB9\u57FA\u4E8E\u6211\u4EEC\u7684\u6587\u6863\uFF0C\u91CD\u8981\u4FE1\u606F\u8BF7\u81EA\u884C\u6838\u5BF9\u3002",
4817
+ dictate: "\u8BED\u97F3\u8F93\u5165",
4818
+ stopDictating: "\u505C\u6B62\u8BED\u97F3\u8F93\u5165",
4819
+ attach: "\u6DFB\u52A0\u6587\u4EF6",
4820
+ attachHint: "\u6700\u591A {{max}} \u4E2A\u6587\u4EF6\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 {{size}} MB",
4821
+ removeAttachment: "\u79FB\u9664 {{name}}",
4822
+ attachmentNameOnly: "\u4EC5\u6587\u4EF6\u540D\u548C\u7C7B\u578B",
4823
+ attachmentTooLarge: "{{name}} \u8D85\u8FC7 {{size}} MB\uFF0C\u672A\u80FD\u6DFB\u52A0\u3002",
4824
+ attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
4825
+ 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",
4826
+ askHuman: "\u8054\u7CFB\u6211\u4EEC",
4827
+ prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
4828
+ nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
4829
+ capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
4830
+ prompts: [
4831
+ "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
4832
+ "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
4833
+ "\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
4834
+ "\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
4835
+ ]
4836
+ };
4837
+ var HI = {
4838
+ 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",
4839
+ 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",
4840
+ 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",
4841
+ tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
4842
+ focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
4843
+ allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
4844
+ showAll: "\u0938\u092D\u0940",
4845
+ showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
4846
+ sources: "\u0938\u094D\u0930\u094B\u0924",
4847
+ nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
4848
+ 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",
4849
+ placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
4850
+ send: "\u092D\u0947\u091C\u0947\u0902",
4851
+ stop: "\u0930\u094B\u0915\u0947\u0902",
4852
+ newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
4853
+ history: "\u0907\u0924\u093F\u0939\u093E\u0938",
4854
+ clearHistory: "\u0907\u0924\u093F\u0939\u093E\u0938 \u092E\u093F\u091F\u093E\u090F\u0901",
4855
+ share: "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
4856
+ copied: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E",
4857
+ copying: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
4858
+ shareUnavailable: "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
4859
+ disclaimer: "\u0905\u0938\u094D\u0935\u0940\u0915\u0930\u0923",
4860
+ 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",
4861
+ dictate: "\u092C\u094B\u0932\u0915\u0930 \u092A\u0942\u091B\u0947\u0902",
4862
+ stopDictating: "\u092C\u094B\u0932\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
4863
+ attach: "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
4864
+ 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",
4865
+ removeAttachment: "{{name}} \u0939\u091F\u093E\u090F\u0901",
4866
+ attachmentNameOnly: "\u0915\u0947\u0935\u0932 \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u0915\u093E\u0930",
4867
+ 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",
4868
+ 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",
4869
+ 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",
4870
+ askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
4871
+ prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
4872
+ nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
4873
+ capabilities: [
4874
+ "\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",
4875
+ "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
4876
+ "\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
4877
+ ],
4878
+ prompts: [
4879
+ "\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
4880
+ "\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?",
4881
+ "\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
4882
+ "\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
4883
+ ]
4884
+ };
4885
+ var ES = {
4886
+ badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
4887
+ welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
4888
+ welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
4889
+ tryAsking: "Prueba a preguntar",
4890
+ focusProduct: "Centrarse en un producto",
4891
+ allProducts: "Todos los productos",
4892
+ showAll: "Todos",
4893
+ showLess: "Ver menos",
4894
+ sources: "Fuentes",
4895
+ nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
4896
+ placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
4897
+ placeholderProduct: "Pregunta sobre {product}\u2026",
4898
+ send: "Enviar",
4899
+ stop: "Detener",
4900
+ newChat: "Nueva conversaci\xF3n",
4901
+ history: "Historial",
4902
+ clearHistory: "Borrar historial",
4903
+ share: "Compartir",
4904
+ copied: "Copiado",
4905
+ copying: "Copiando\u2026",
4906
+ shareUnavailable: "No disponible",
4907
+ disclaimer: "Aviso",
4908
+ disclaimerShort: "Basado en nuestra documentaci\xF3n: comprueba cualquier dato importante.",
4909
+ dictate: "Dictar tu pregunta",
4910
+ stopDictating: "Dejar de dictar",
4911
+ attach: "Adjuntar archivos",
4912
+ attachHint: "Hasta {{max}} archivos, {{size}} MB cada uno",
4913
+ removeAttachment: "Quitar {{name}}",
4914
+ attachmentNameOnly: "solo nombre y tipo",
4915
+ attachmentTooLarge: "{{name}} supera los {{size}} MB y no se adjunt\xF3.",
4916
+ attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
4917
+ 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",
4918
+ askHuman: "habla con una persona",
4919
+ prevSuggestion: "Sugerencia anterior",
4920
+ nextSuggestion: "Sugerencia siguiente",
4921
+ capabilities: [
4922
+ "Basado en nuestra documentaci\xF3n",
4923
+ "Compara todo el ecosistema",
4924
+ "Directo a la p\xE1gina correcta"
4925
+ ],
4926
+ prompts: [
4927
+ "\xBFQu\xE9 hace realmente este producto?",
4928
+ "\xBFQu\xE9 producto encaja con mi equipo?",
4929
+ "\xBFC\xF3mo empiezo, paso a paso?",
4930
+ "\xBFCu\xE1nto cuesta?"
4931
+ ]
4932
+ };
4933
+ var AR = {
4934
+ 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",
4935
+ welcomeTitle: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627",
4936
+ 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.",
4937
+ tryAsking: "\u062C\u0631\u0651\u0628 \u0623\u0646 \u062A\u0633\u0623\u0644",
4938
+ focusProduct: "\u0627\u0644\u062A\u0631\u0643\u064A\u0632 \u0639\u0644\u0649 \u0645\u0646\u062A\u062C",
4939
+ allProducts: "\u0643\u0644 \u0627\u0644\u0645\u0646\u062A\u062C\u0627\u062A",
4940
+ showAll: "\u0627\u0644\u0643\u0644",
4941
+ showLess: "\u0639\u0631\u0636 \u0623\u0642\u0644",
4942
+ sources: "\u0627\u0644\u0645\u0635\u0627\u062F\u0631",
4943
+ nextYouCouldAsk: "\u064A\u0645\u0643\u0646\u0643 \u0623\u0646 \u062A\u0633\u0623\u0644 \u0628\u0639\u062F \u0630\u0644\u0643",
4944
+ placeholder: "\u0627\u0633\u0623\u0644 \u0623\u064A \u0634\u064A\u0621 \u0639\u0646 \u0645\u0646\u062A\u062C\u0627\u062A\u0646\u0627\u2026",
4945
+ placeholderProduct: "\u0627\u0633\u0623\u0644 \u0639\u0646 {product}\u2026",
4946
+ send: "\u0625\u0631\u0633\u0627\u0644",
4947
+ stop: "\u0625\u064A\u0642\u0627\u0641",
4948
+ newChat: "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629",
4949
+ history: "\u0627\u0644\u0633\u062C\u0644",
4950
+ clearHistory: "\u0645\u0633\u062D \u0627\u0644\u0633\u062C\u0644",
4951
+ share: "\u0645\u0634\u0627\u0631\u0643\u0629",
4952
+ copied: "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
4953
+ copying: "\u062C\u0627\u0631\u064D \u0627\u0644\u0646\u0633\u062E\u2026",
4954
+ shareUnavailable: "\u063A\u064A\u0631 \u0645\u062A\u0627\u062D",
4955
+ disclaimer: "\u0625\u062E\u0644\u0627\u0621 \u0645\u0633\u0624\u0648\u0644\u064A\u0629",
4956
+ 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.",
4957
+ dictate: "\u0623\u0645\u0644\u0650 \u0633\u0624\u0627\u0644\u0643",
4958
+ stopDictating: "\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0625\u0645\u0644\u0627\u0621",
4959
+ attach: "\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641\u0627\u062A",
4960
+ 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",
4961
+ removeAttachment: "\u0625\u0632\u0627\u0644\u0629 {{name}}",
4962
+ attachmentNameOnly: "\u0627\u0644\u0627\u0633\u0645 \u0648\u0627\u0644\u0646\u0648\u0639 \u0641\u0642\u0637",
4963
+ 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.",
4964
+ 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}}.",
4965
+ 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",
4966
+ askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
4967
+ prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
4968
+ nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
4969
+ capabilities: [
4970
+ "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
4971
+ "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
4972
+ "\u0645\u0628\u0627\u0634\u0631\u0629\u064B \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0635\u062D\u064A\u062D\u0629"
4973
+ ],
4974
+ prompts: [
4975
+ "\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",
4976
+ "\u0623\u064A \u0645\u0646\u062A\u062C \u064A\u0646\u0627\u0633\u0628 \u0641\u0631\u064A\u0642\u064A\u061F",
4977
+ "\u0643\u064A\u0641 \u0623\u0628\u062F\u0623 \u062E\u0637\u0648\u0629 \u0628\u062E\u0637\u0648\u0629\u061F",
4978
+ "\u0643\u0645 \u062A\u0628\u0644\u063A \u0627\u0644\u062A\u0643\u0644\u0641\u0629\u061F"
4979
+ ]
4980
+ };
4981
+ var TA = {
4982
+ 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",
4983
+ 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",
4984
+ 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.",
4985
+ tryAsking: "\u0B87\u0BA4\u0BC8\u0B95\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
4986
+ focusProduct: "\u0B92\u0BB0\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BBF\u0BB2\u0BCD \u0B95\u0BB5\u0BA9\u0BAE\u0BCD",
4987
+ allProducts: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD",
4988
+ showAll: "\u0B85\u0BA9\u0BC8\u0BA4\u0BCD\u0BA4\u0BC1\u0BAE\u0BCD",
4989
+ showLess: "\u0B95\u0BC1\u0BB1\u0BC8\u0BB5\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1",
4990
+ sources: "\u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
4991
+ nextYouCouldAsk: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BA8\u0BC0\u0B99\u0BCD\u0B95\u0BB3\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B95\u0BB2\u0BBE\u0BAE\u0BCD",
4992
+ 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",
4993
+ placeholderProduct: "{product} \u0BAA\u0BB1\u0BCD\u0BB1\u0BBF\u0B95\u0BCD \u0B95\u0BC7\u0BB3\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD\u2026",
4994
+ send: "\u0B85\u0BA9\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1",
4995
+ stop: "\u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
4996
+ newChat: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0B89\u0BB0\u0BC8\u0BAF\u0BBE\u0B9F\u0BB2\u0BCD",
4997
+ history: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BC1",
4998
+ clearHistory: "\u0BB5\u0BB0\u0BB2\u0BBE\u0BB1\u0BCD\u0BB1\u0BC8 \u0B85\u0BB4\u0BBF",
4999
+ share: "\u0BAA\u0B95\u0BBF\u0BB0\u0BCD",
5000
+ copied: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1",
5001
+ copying: "\u0BA8\u0B95\u0BB2\u0BC6\u0B9F\u0BC1\u0B95\u0BCD\u0B95\u0BBF\u0BB1\u0BA4\u0BC1\u2026",
5002
+ shareUnavailable: "\u0B95\u0BBF\u0B9F\u0BC8\u0B95\u0BCD\u0B95\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8",
5003
+ disclaimer: "\u0BAA\u0BCA\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0BA4\u0BCD \u0BA4\u0BC1\u0BB1\u0BAA\u0BCD\u0BAA\u0BC1",
5004
+ 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.",
5005
+ 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",
5006
+ stopDictating: "\u0BAA\u0BC7\u0B9A\u0BC1\u0BB5\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
5007
+ attach: "\u0B95\u0BCB\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B87\u0BA3\u0BC8\u0B95\u0BCD\u0B95",
5008
+ 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",
5009
+ removeAttachment: "{{name}} \u0B85\u0B95\u0BB1\u0BCD\u0BB1\u0BC1",
5010
+ attachmentNameOnly: "\u0BAA\u0BC6\u0BAF\u0BB0\u0BC1\u0BAE\u0BCD \u0BB5\u0B95\u0BC8\u0BAF\u0BC1\u0BAE\u0BCD \u0BAE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD",
5011
+ 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.",
5012
+ 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.",
5013
+ 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",
5014
+ 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",
5015
+ prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
5016
+ nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
5017
+ capabilities: [
5018
+ "\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",
5019
+ "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
5020
+ "\u0BA8\u0BC7\u0BB0\u0BBE\u0B95 \u0B9A\u0BB0\u0BBF\u0BAF\u0BBE\u0BA9 \u0BAA\u0B95\u0BCD\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BB1\u0BCD\u0B95\u0BC1"
5021
+ ],
5022
+ prompts: [
5023
+ "\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?",
5024
+ "\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?",
5025
+ "\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?",
5026
+ "\u0B87\u0BA4\u0BA9\u0BCD \u0BB5\u0BBF\u0BB2\u0BC8 \u0B8E\u0BA9\u0BCD\u0BA9?"
5027
+ ]
5028
+ };
5029
+ var STRINGS = {
5030
+ en: EN,
5031
+ zh: ZH,
5032
+ hi: HI,
5033
+ es: ES,
5034
+ ar: AR,
5035
+ ta: TA
5036
+ };
5037
+ function resolveExploreLocale(explicit) {
5038
+ const candidates = [
5039
+ explicit,
5040
+ typeof document === "undefined" ? void 0 : document.documentElement.lang,
5041
+ typeof navigator === "undefined" ? void 0 : navigator.language
5042
+ ];
5043
+ for (const candidate of candidates) {
5044
+ if (!candidate) continue;
5045
+ const primary = candidate.toLowerCase().split("-")[0];
5046
+ const match = EXPLORE_LOCALES.find((locale) => locale === primary);
5047
+ if (match) return match;
5048
+ }
5049
+ return "en";
5050
+ }
5051
+ function exploreStrings(locale) {
5052
+ return STRINGS[locale] ?? EN;
5053
+ }
5054
+ function fill(template, values) {
5055
+ return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
5056
+ }
4738
5057
  var PROSE_CSS = `
4739
5058
  .boff-prose {
4740
5059
  max-width: none;
@@ -4939,6 +5258,12 @@ var EXPLORE_MESSAGE_FIELDS = (
4939
5258
  }
4940
5259
  followUps
4941
5260
  answered
5261
+ attachments {
5262
+ name
5263
+ mimeType
5264
+ size
5265
+ textExtracted
5266
+ }
4942
5267
  errorCode
4943
5268
  createdAt
4944
5269
  completedAt
@@ -5024,6 +5349,16 @@ var CREATE_EXPLORE_SHARE_LINK_MUTATION = (
5024
5349
  }
5025
5350
  `
5026
5351
  );
5352
+ var EXPLORE_SHARED_CONVERSATION_QUERY = (
5353
+ /* GraphQL */
5354
+ `
5355
+ query ExploreSharedConversation($shareToken: String!) {
5356
+ exploreSharedConversation(shareToken: $shareToken) {
5357
+ ${EXPLORE_MESSAGE_FIELDS}
5358
+ }
5359
+ }
5360
+ `
5361
+ );
5027
5362
 
5028
5363
  // src/data/products.ts
5029
5364
  var ECOSYSTEM_PRODUCTS = [
@@ -5474,6 +5809,14 @@ function readPersisted(key) {
5474
5809
  return null;
5475
5810
  }
5476
5811
  }
5812
+ function readShareToken() {
5813
+ if (typeof window === "undefined") return null;
5814
+ try {
5815
+ return new URL(window.location.href).searchParams.get("c");
5816
+ } catch {
5817
+ return null;
5818
+ }
5819
+ }
5477
5820
  function visibleText(message) {
5478
5821
  return message.content || message.partialContent || "";
5479
5822
  }
@@ -5512,10 +5855,18 @@ function useExploreChat(options = {}) {
5512
5855
  const pollGenerationRef = useRef(0);
5513
5856
  const pollTimerRef = useRef(null);
5514
5857
  const conversationTokenRef = useRef(null);
5858
+ const shareTokenRef = useRef(void 0);
5859
+ if (shareTokenRef.current === void 0) {
5860
+ shareTokenRef.current = readShareToken();
5861
+ }
5862
+ const isSharedView = shareTokenRef.current !== null;
5515
5863
  const catalogRef = useRef(fallbackCatalog);
5516
5864
  const turnCountRef = useRef(0);
5517
5865
  const focusProductRef = useRef(null);
5518
5866
  const lastSentTextRef = useRef(null);
5867
+ const lastSentAttachmentsRef = useRef(
5868
+ []
5869
+ );
5519
5870
  const inFlightRef = useRef(false);
5520
5871
  catalogRef.current = catalog;
5521
5872
  const clearPollTimer = useCallback(() => {
@@ -5540,6 +5891,43 @@ function useExploreChat(options = {}) {
5540
5891
  };
5541
5892
  }, []);
5542
5893
  useEffect(() => {
5894
+ const shareToken = shareTokenRef.current;
5895
+ if (!shareToken) return;
5896
+ let cancelled = false;
5897
+ setHydrated(true);
5898
+ void client.query(
5899
+ EXPLORE_SHARED_CONVERSATION_QUERY,
5900
+ { shareToken },
5901
+ { cache: false }
5902
+ ).then((res) => {
5903
+ if (cancelled || !mountedRef.current) return;
5904
+ const shared = res?.data?.exploreSharedConversation;
5905
+ if (shared && shared.length > 0) {
5906
+ setMessages(shared);
5907
+ return;
5908
+ }
5909
+ setError({
5910
+ kind: "unknown",
5911
+ code: "SHARE_NOT_FOUND",
5912
+ message: "That shared conversation could not be found. The link may have expired.",
5913
+ // Nothing to retry: a bad token will stay bad.
5914
+ retryable: false
5915
+ });
5916
+ }).catch(() => {
5917
+ if (cancelled || !mountedRef.current) return;
5918
+ setError({
5919
+ kind: "unknown",
5920
+ code: "SHARE_NOT_FOUND",
5921
+ message: "That shared conversation could not be loaded.",
5922
+ retryable: true
5923
+ });
5924
+ });
5925
+ return () => {
5926
+ cancelled = true;
5927
+ };
5928
+ }, [client]);
5929
+ useEffect(() => {
5930
+ if (shareTokenRef.current !== null) return;
5543
5931
  if (!persist) {
5544
5932
  setHydrated(true);
5545
5933
  return;
@@ -5707,7 +6095,7 @@ function useExploreChat(options = {}) {
5707
6095
  [client, pollIntervalMs, pollTimeoutMs]
5708
6096
  );
5709
6097
  const submit = useCallback(
5710
- async (text, optimisticId, captchaAttempt) => {
6098
+ async (text, optimisticId, captchaAttempt, attachments) => {
5711
6099
  const activeCatalog = catalogRef.current;
5712
6100
  let recaptchaToken;
5713
6101
  if (activeCatalog.captchaRequired && activeCatalog.recaptchaSiteKey) {
@@ -5725,7 +6113,8 @@ function useExploreChat(options = {}) {
5725
6113
  ...focusProductRef.current || productSlug ? { productSlug: focusProductRef.current ?? productSlug } : {},
5726
6114
  ...recaptchaToken ? { recaptchaToken } : {},
5727
6115
  ...locale ? { locale } : {},
5728
- ...pageUrl ? { pageUrl } : {}
6116
+ ...pageUrl ? { pageUrl } : {},
6117
+ ...attachments.length > 0 ? { attachments: [...attachments] } : {}
5729
6118
  };
5730
6119
  const res = await client.mutate(
5731
6120
  SEND_EXPLORE_MESSAGE_MUTATION,
@@ -5739,7 +6128,7 @@ function useExploreChat(options = {}) {
5739
6128
  const code = typeof first?.extensions?.code === "string" ? first.extensions.code : void 0;
5740
6129
  const classified = classifyExploreError(code, first?.message);
5741
6130
  if (classified.kind === "captcha" && captchaAttempt === 0) {
5742
- await submit(text, optimisticId, 1);
6131
+ await submit(text, optimisticId, 1, attachments);
5743
6132
  return;
5744
6133
  }
5745
6134
  inFlightRef.current = false;
@@ -5776,7 +6165,7 @@ function useExploreChat(options = {}) {
5776
6165
  [client, locale, pageUrl, productSlug, startPolling]
5777
6166
  );
5778
6167
  const send = useCallback(
5779
- async (message) => {
6168
+ async (message, attachments = []) => {
5780
6169
  const text = message.trim();
5781
6170
  if (!text) return;
5782
6171
  if (inFlightRef.current) return;
@@ -5806,6 +6195,7 @@ function useExploreChat(options = {}) {
5806
6195
  }
5807
6196
  inFlightRef.current = true;
5808
6197
  lastSentTextRef.current = text;
6198
+ lastSentAttachmentsRef.current = attachments;
5809
6199
  setError(null);
5810
6200
  setPhase("sending");
5811
6201
  cancelPolling();
@@ -5828,7 +6218,7 @@ function useExploreChat(options = {}) {
5828
6218
  setTurnCount(turnCountRef.current);
5829
6219
  onSend?.(text);
5830
6220
  try {
5831
- await submit(text, optimistic.id, 0);
6221
+ await submit(text, optimistic.id, 0, attachments);
5832
6222
  } catch (err) {
5833
6223
  if (!mountedRef.current) return;
5834
6224
  console.error("[WebSDK] Explore send failed", err);
@@ -5877,7 +6267,7 @@ function useExploreChat(options = {}) {
5877
6267
  });
5878
6268
  turnCountRef.current = Math.max(0, turnCountRef.current - 1);
5879
6269
  setTurnCount(turnCountRef.current);
5880
- void send(text);
6270
+ void send(text, lastSentAttachmentsRef.current);
5881
6271
  }, [cancelPolling, send]);
5882
6272
  const reset = useCallback(() => {
5883
6273
  setArchive(
@@ -5891,6 +6281,7 @@ function useExploreChat(options = {}) {
5891
6281
  inFlightRef.current = false;
5892
6282
  conversationTokenRef.current = null;
5893
6283
  lastSentTextRef.current = null;
6284
+ lastSentAttachmentsRef.current = [];
5894
6285
  turnCountRef.current = 0;
5895
6286
  setTurnCount(0);
5896
6287
  setMessages([]);
@@ -5999,7 +6390,8 @@ function useExploreChat(options = {}) {
5999
6390
  deleteConversation,
6000
6391
  clearHistory,
6001
6392
  recordClick,
6002
- createShareLink
6393
+ createShareLink,
6394
+ isSharedView
6003
6395
  };
6004
6396
  }
6005
6397
  var optimisticCounter = 0;
@@ -6225,6 +6617,178 @@ function useSpeechInput({
6225
6617
  );
6226
6618
  return { supported, listening, interim, error, start, stop, toggle };
6227
6619
  }
6620
+ var SWIPE_THRESHOLD = 40;
6621
+ function useSwipe({
6622
+ onSwipeLeft,
6623
+ onSwipeRight,
6624
+ enabled = true
6625
+ }) {
6626
+ const start = useRef(null);
6627
+ const onPointerDown = useCallback(
6628
+ (event) => {
6629
+ if (!enabled) return;
6630
+ start.current = { x: event.clientX, y: event.clientY };
6631
+ },
6632
+ [enabled]
6633
+ );
6634
+ const onPointerUp = useCallback(
6635
+ (event) => {
6636
+ const from = start.current;
6637
+ start.current = null;
6638
+ if (!enabled || !from) return;
6639
+ const dx = event.clientX - from.x;
6640
+ const dy = event.clientY - from.y;
6641
+ if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dx) <= Math.abs(dy))
6642
+ return;
6643
+ if (dx < 0) onSwipeLeft?.();
6644
+ else onSwipeRight?.();
6645
+ },
6646
+ [enabled, onSwipeLeft, onSwipeRight]
6647
+ );
6648
+ const onPointerCancel = useCallback(() => {
6649
+ start.current = null;
6650
+ }, []);
6651
+ return { onPointerDown, onPointerUp, onPointerCancel };
6652
+ }
6653
+
6654
+ // src/utils/explore-attachments.ts
6655
+ var MAX_ATTACHMENTS = 5;
6656
+ var MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
6657
+ var MAX_TEXT_PER_ATTACHMENT = 2e4;
6658
+ var TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
6659
+ "txt",
6660
+ "md",
6661
+ "markdown",
6662
+ "csv",
6663
+ "tsv",
6664
+ "json",
6665
+ "jsonl",
6666
+ "yaml",
6667
+ "yml",
6668
+ "toml",
6669
+ "ini",
6670
+ "cfg",
6671
+ "conf",
6672
+ "env",
6673
+ "log",
6674
+ "sql",
6675
+ "graphql",
6676
+ "gql",
6677
+ "html",
6678
+ "htm",
6679
+ "xml",
6680
+ "svg",
6681
+ "css",
6682
+ "scss",
6683
+ "js",
6684
+ "jsx",
6685
+ "mjs",
6686
+ "cjs",
6687
+ "ts",
6688
+ "tsx",
6689
+ "py",
6690
+ "rb",
6691
+ "go",
6692
+ "rs",
6693
+ "java",
6694
+ "kt",
6695
+ "c",
6696
+ "h",
6697
+ "cpp",
6698
+ "cs",
6699
+ "php",
6700
+ "sh",
6701
+ "bash",
6702
+ "zsh",
6703
+ "ps1",
6704
+ "dockerfile",
6705
+ "tf",
6706
+ "tfvars"
6707
+ ]);
6708
+ function isTextualMimeType(mimeType) {
6709
+ if (mimeType.startsWith("text/")) return true;
6710
+ 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");
6711
+ }
6712
+ function extensionOf(name) {
6713
+ const dot = name.lastIndexOf(".");
6714
+ if (dot <= 0 || dot === name.length - 1) return "";
6715
+ return name.slice(dot + 1).toLowerCase();
6716
+ }
6717
+ function looksTextual(name, mimeType) {
6718
+ if (isTextualMimeType(mimeType)) return true;
6719
+ return TEXT_EXTENSIONS.has(extensionOf(name));
6720
+ }
6721
+ function isDecodedTextUsable(decoded) {
6722
+ if (decoded.length === 0) return false;
6723
+ if (decoded.includes("\0")) return false;
6724
+ let replacements = 0;
6725
+ for (const char of decoded) if (char === "\uFFFD") replacements += 1;
6726
+ return replacements / decoded.length < 0.1;
6727
+ }
6728
+ function formatBytes(bytes) {
6729
+ if (bytes < 1024) return `${bytes} B`;
6730
+ if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;
6731
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
6732
+ }
6733
+ var counter = 0;
6734
+ function nextId() {
6735
+ counter += 1;
6736
+ return `att-${counter}`;
6737
+ }
6738
+ async function readArrayBuffer(blob) {
6739
+ if (typeof blob.arrayBuffer === "function") return blob.arrayBuffer();
6740
+ return new Promise((resolve, reject) => {
6741
+ const reader = new FileReader();
6742
+ reader.onload = () => resolve(reader.result);
6743
+ reader.onerror = () => reject(reader.error ?? new Error("file read failed"));
6744
+ reader.readAsArrayBuffer(blob);
6745
+ });
6746
+ }
6747
+ async function readTextPrefix(file) {
6748
+ try {
6749
+ const slice = file.slice(0, MAX_TEXT_PER_ATTACHMENT);
6750
+ const buffer = await readArrayBuffer(slice);
6751
+ const decoded = new TextDecoder("utf-8").decode(buffer);
6752
+ return isDecodedTextUsable(decoded) ? decoded : null;
6753
+ } catch {
6754
+ return null;
6755
+ }
6756
+ }
6757
+ async function stageFiles(files, alreadyStaged) {
6758
+ const accepted = [];
6759
+ const rejected = [];
6760
+ let slots = MAX_ATTACHMENTS - alreadyStaged.length;
6761
+ for (const file of files) {
6762
+ if (slots <= 0) {
6763
+ rejected.push({ name: file.name, reason: "too-many" });
6764
+ continue;
6765
+ }
6766
+ if (file.size > MAX_ATTACHMENT_BYTES) {
6767
+ rejected.push({ name: file.name, reason: "too-large" });
6768
+ continue;
6769
+ }
6770
+ const mimeType = file.type || "application/octet-stream";
6771
+ const textContent = looksTextual(file.name, mimeType) ? await readTextPrefix(file) : null;
6772
+ accepted.push({
6773
+ id: nextId(),
6774
+ name: file.name,
6775
+ mimeType,
6776
+ size: file.size,
6777
+ textContent,
6778
+ textExtracted: textContent !== null
6779
+ });
6780
+ slots -= 1;
6781
+ }
6782
+ return { accepted, rejected };
6783
+ }
6784
+ function toPayload(staged) {
6785
+ return staged.map(({ name, mimeType, size, textContent }) => ({
6786
+ name,
6787
+ mimeType,
6788
+ size,
6789
+ textContent
6790
+ }));
6791
+ }
6228
6792
  var EXPLORE_CSS = `
6229
6793
  @keyframes boff-explore-pulse {
6230
6794
  0%, 80%, 100% { opacity: 0.25; transform: translateY(0); }
@@ -6312,6 +6876,70 @@ var EXPLORE_CSS = `
6312
6876
  max-width: 100%;
6313
6877
  height: auto;
6314
6878
  }
6879
+
6880
+ /* ---- Ambient backdrop -----------------------------------------------------------------
6881
+ Two very low-opacity radial washes behind the welcome state, drifting slowly. Painted on
6882
+ a pseudo-element with pointer-events:none so it can never intercept a click \u2014 a
6883
+ decorative overlay that swallows clicks is a bug we have shipped before.
6884
+ Colours come from the product's own --primary token, so this picks up each site's palette
6885
+ instead of introducing one. */
6886
+ .boff-explore-aura {
6887
+ position: relative;
6888
+ isolation: isolate;
6889
+ }
6890
+ .boff-explore-aura::before {
6891
+ content: "";
6892
+ position: absolute;
6893
+ inset: -10% -20% auto -20%;
6894
+ height: 60%;
6895
+ z-index: -1;
6896
+ pointer-events: none;
6897
+ background:
6898
+ radial-gradient(38% 55% at 22% 30%, hsl(var(--primary) / 0.10), transparent 70%),
6899
+ radial-gradient(32% 48% at 78% 18%, hsl(var(--primary) / 0.07), transparent 72%);
6900
+ filter: blur(6px);
6901
+ animation: boff-explore-drift 26s ease-in-out infinite alternate;
6902
+ }
6903
+ @keyframes boff-explore-drift {
6904
+ from { transform: translate3d(-1.5%, -1%, 0) scale(1); }
6905
+ to { transform: translate3d(1.5%, 1.5%, 0) scale(1.06); }
6906
+ }
6907
+
6908
+ /* Entrance: content settles rather than snapping in. Short, and only once. */
6909
+ @keyframes boff-explore-rise {
6910
+ from { opacity: 0; transform: translateY(6px); }
6911
+ to { opacity: 1; transform: none; }
6912
+ }
6913
+ .boff-explore-rise {
6914
+ animation: boff-explore-rise 380ms cubic-bezier(0.22, 1, 0.36, 1) both;
6915
+ }
6916
+ .boff-explore-rise-1 { animation-delay: 40ms; }
6917
+ .boff-explore-rise-2 { animation-delay: 90ms; }
6918
+ .boff-explore-rise-3 { animation-delay: 140ms; }
6919
+
6920
+ /* A soft sheen that crosses the send button while a turn is in flight \u2014 enough to say
6921
+ "working" without another spinner competing with the thinking dots. */
6922
+ @keyframes boff-explore-sheen {
6923
+ from { transform: translateX(-120%); }
6924
+ to { transform: translateX(220%); }
6925
+ }
6926
+ .boff-explore-busy { position: relative; overflow: hidden; }
6927
+ .boff-explore-busy::after {
6928
+ content: "";
6929
+ position: absolute;
6930
+ inset: 0;
6931
+ pointer-events: none;
6932
+ background: linear-gradient(100deg, transparent 20%, hsl(var(--primary) / 0.22) 50%, transparent 80%);
6933
+ animation: boff-explore-sheen 1.5s ease-in-out infinite;
6934
+ }
6935
+
6936
+ /* Every one of the above is decoration. Reduced motion removes the movement and keeps the
6937
+ final state, rather than leaving content mid-animation and invisible. */
6938
+ @media (prefers-reduced-motion: reduce) {
6939
+ .boff-explore-aura::before,
6940
+ .boff-explore-busy::after { animation: none; }
6941
+ .boff-explore-rise { animation: none; opacity: 1; transform: none; }
6942
+ }
6315
6943
  `;
6316
6944
  function ExploreStyles() {
6317
6945
  return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: EXPLORE_CSS } });
@@ -6509,17 +7137,48 @@ function ThinkingIndicator({ activity }) {
6509
7137
  }
6510
7138
  );
6511
7139
  }
6512
- function UserBubble({ message }) {
6513
- return /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(
6514
- "div",
6515
- {
6516
- "data-boff-explore": "user",
6517
- 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",
6518
- children: message.content
6519
- }
6520
- ) });
7140
+ function UserBubble({
7141
+ strings: T,
7142
+ message
7143
+ }) {
7144
+ const attachments = message.attachments ?? [];
7145
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end gap-1.5", children: [
7146
+ /* @__PURE__ */ jsx(
7147
+ "div",
7148
+ {
7149
+ "data-boff-explore": "user",
7150
+ 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",
7151
+ children: message.content
7152
+ }
7153
+ ),
7154
+ attachments.length > 0 ? /* @__PURE__ */ jsx(
7155
+ "ul",
7156
+ {
7157
+ "data-boff-explore": "user-attachments",
7158
+ className: "flex max-w-[85%] flex-wrap justify-end gap-1.5",
7159
+ children: attachments.map((attachment) => /* @__PURE__ */ jsxs(
7160
+ "li",
7161
+ {
7162
+ "data-boff-explore": "user-attachment",
7163
+ "data-text-extracted": attachment.textExtracted ? "true" : "false",
7164
+ 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",
7165
+ children: [
7166
+ /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3 shrink-0" }),
7167
+ /* @__PURE__ */ jsx("span", { className: "truncate", title: attachment.name, children: attachment.name }),
7168
+ attachment.textExtracted ? null : /* @__PURE__ */ jsxs("span", { className: "shrink-0", children: [
7169
+ "\xB7 ",
7170
+ T.attachmentNameOnly
7171
+ ] })
7172
+ ]
7173
+ },
7174
+ `${attachment.name}-${attachment.size}`
7175
+ ))
7176
+ }
7177
+ ) : null
7178
+ ] });
6521
7179
  }
6522
7180
  function AssistantBubble({
7181
+ strings: T,
6523
7182
  message,
6524
7183
  activity,
6525
7184
  onNavigate,
@@ -6536,7 +7195,7 @@ function AssistantBubble({
6536
7195
  ref: anchorRef,
6537
7196
  "data-boff-explore": "assistant",
6538
7197
  "data-status": message.status,
6539
- className: "flex scroll-mt-4 gap-3",
7198
+ className: "boff-explore-rise flex scroll-mt-4 gap-3",
6540
7199
  children: [
6541
7200
  /* @__PURE__ */ jsx(
6542
7201
  "span",
@@ -6567,7 +7226,7 @@ function AssistantBubble({
6567
7226
  event.preventDefault();
6568
7227
  onNavigate("/contact");
6569
7228
  },
6570
- children: "ask a human"
7229
+ children: T.askHuman
6571
7230
  }
6572
7231
  ),
6573
7232
  "."
@@ -6582,7 +7241,7 @@ function AssistantBubble({
6582
7241
  streaming ? /* @__PURE__ */ jsx(ThinkingIndicator, { activity }) : null,
6583
7242
  failed && !body ? /* @__PURE__ */ 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,
6584
7243
  message.references.length > 0 ? /* @__PURE__ */ jsxs("div", { children: [
6585
- /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Sources" }),
7244
+ /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.sources }),
6586
7245
  /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3", children: message.references.map((reference) => /* @__PURE__ */ jsx(
6587
7246
  ReferenceCard,
6588
7247
  {
@@ -6602,7 +7261,7 @@ function AssistantBubble({
6602
7261
  `${cta.kind}-${cta.url}`
6603
7262
  )) }) : null,
6604
7263
  message.status === "COMPLETED" && (message.followUps?.length ?? 0) > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-1.5 pt-0.5", children: [
6605
- /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground", children: "Next you could ask" }),
7264
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground", children: T.nextYouCouldAsk }),
6606
7265
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: (message.followUps ?? []).map((question) => /* @__PURE__ */ jsxs(
6607
7266
  "button",
6608
7267
  {
@@ -6664,6 +7323,7 @@ function ErrorBanner({
6664
7323
  );
6665
7324
  }
6666
7325
  function PromptCarousel({
7326
+ strings: T,
6667
7327
  prompts,
6668
7328
  onPrompt,
6669
7329
  disabled
@@ -6678,6 +7338,11 @@ function PromptCarousel({
6678
7338
  },
6679
7339
  [count]
6680
7340
  );
7341
+ const swipe = useSwipe({
7342
+ onSwipeLeft: () => go(1),
7343
+ onSwipeRight: () => go(-1),
7344
+ enabled: count > 1
7345
+ });
6681
7346
  useEffect(() => {
6682
7347
  if (paused || disabled || count < 2) return;
6683
7348
  if (typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
@@ -6690,7 +7355,7 @@ function PromptCarousel({
6690
7355
  return /* @__PURE__ */ jsxs(
6691
7356
  "div",
6692
7357
  {
6693
- className: "flex min-w-0 items-center gap-1.5",
7358
+ className: "flex min-w-0 touch-pan-y items-center gap-1.5",
6694
7359
  role: "group",
6695
7360
  "aria-roledescription": "carousel",
6696
7361
  "aria-label": "Example questions",
@@ -6698,14 +7363,15 @@ function PromptCarousel({
6698
7363
  onMouseLeave: () => setPaused(false),
6699
7364
  onFocusCapture: () => setPaused(true),
6700
7365
  onBlurCapture: () => setPaused(false),
7366
+ ...swipe,
6701
7367
  children: [
6702
7368
  count > 1 ? /* @__PURE__ */ jsx(
6703
7369
  "button",
6704
7370
  {
6705
7371
  type: "button",
6706
- "aria-label": "Previous suggestion",
7372
+ "aria-label": T.prevSuggestion,
6707
7373
  onClick: () => go(-1),
6708
- 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",
7374
+ 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",
6709
7375
  children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
6710
7376
  }
6711
7377
  ) : null,
@@ -6732,7 +7398,7 @@ function PromptCarousel({
6732
7398
  "button",
6733
7399
  {
6734
7400
  type: "button",
6735
- "aria-label": "Next suggestion",
7401
+ "aria-label": T.nextSuggestion,
6736
7402
  onClick: () => go(1),
6737
7403
  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",
6738
7404
  children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
@@ -6743,6 +7409,7 @@ function PromptCarousel({
6743
7409
  );
6744
7410
  }
6745
7411
  function ProductStrip({
7412
+ strings: T,
6746
7413
  products,
6747
7414
  focusProduct,
6748
7415
  onFocus
@@ -6777,7 +7444,7 @@ function ProductStrip({
6777
7444
  "aria-pressed": focusProduct === null,
6778
7445
  onClick: () => onFocus(null),
6779
7446
  className: chipClass(focusProduct === null),
6780
- children: "All products"
7447
+ children: T.allProducts
6781
7448
  }
6782
7449
  ),
6783
7450
  products.map((product) => /* @__PURE__ */ jsx(
@@ -6806,7 +7473,7 @@ function ProductStrip({
6806
7473
  "aria-expanded": expanded,
6807
7474
  onClick: () => setExpanded((v) => !v),
6808
7475
  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",
6809
- children: expanded ? "Show less" : `All ${products.length}`
7476
+ children: expanded ? T.showLess : `${T.showAll} ${products.length}`
6810
7477
  }
6811
7478
  ) : null
6812
7479
  ]
@@ -6914,6 +7581,7 @@ function DisclaimerDialog({
6914
7581
  );
6915
7582
  }
6916
7583
  function WelcomeState({
7584
+ strings: T,
6917
7585
  title,
6918
7586
  body,
6919
7587
  prompts,
@@ -6923,43 +7591,45 @@ function WelcomeState({
6923
7591
  onFocus,
6924
7592
  disabled
6925
7593
  }) {
6926
- return /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-3xl px-4 py-8 sm:py-12", children: [
6927
- /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
7594
+ return /* @__PURE__ */ 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: [
7595
+ /* @__PURE__ */ jsxs("div", { className: "boff-explore-rise text-center", children: [
6928
7596
  /* @__PURE__ */ 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: [
6929
7597
  /* @__PURE__ */ jsx(Sparkles, { className: "h-3.5 w-3.5" }),
6930
- "AI answers, grounded in our documentation"
7598
+ T.badge
6931
7599
  ] }),
6932
7600
  /* @__PURE__ */ jsx("h1", { className: "mt-4 text-balance break-words text-2xl font-bold tracking-tight sm:text-4xl", children: title }),
6933
7601
  /* @__PURE__ */ 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 })
6934
7602
  ] }),
6935
- /* @__PURE__ */ jsx("ul", { className: "mt-7 grid gap-2.5 sm:grid-cols-3", children: CAPABILITIES.map(({ icon: Icon, title: capTitle, body: capBody }) => /* @__PURE__ */ jsxs(
7603
+ /* @__PURE__ */ 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__ */ jsxs(
6936
7604
  "li",
6937
7605
  {
6938
- className: "rounded-xl border border-border/70 bg-card/60 p-3.5 text-left transition-colors hover:border-border",
7606
+ 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",
6939
7607
  children: [
6940
- /* @__PURE__ */ jsx("span", { className: "mb-2.5 flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" }) }),
6941
- /* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-card-foreground", children: capTitle }),
6942
- /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: capBody })
7608
+ /* @__PURE__ */ 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__ */ jsx(Icon, { className: "h-3.5 w-3.5 sm:h-4 sm:w-4" }) }),
7609
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] font-semibold leading-tight text-card-foreground sm:text-sm sm:leading-normal", children: T.capabilities[i] ?? "" }),
7610
+ /* @__PURE__ */ jsx("p", { className: "mt-1 hidden text-xs leading-relaxed text-muted-foreground sm:block", children: capBody })
6943
7611
  ]
6944
7612
  },
6945
- capTitle
7613
+ i
6946
7614
  )) }),
6947
- prompts.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "mt-8", children: [
6948
- /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Try asking" }),
7615
+ prompts.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "boff-explore-rise boff-explore-rise-2 mt-8", children: [
7616
+ /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.tryAsking }),
6949
7617
  /* @__PURE__ */ jsx(
6950
7618
  PromptCarousel,
6951
7619
  {
7620
+ strings: T,
6952
7621
  prompts,
6953
7622
  onPrompt,
6954
7623
  disabled
6955
7624
  }
6956
7625
  )
6957
7626
  ] }) : null,
6958
- products.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "mt-6", children: [
6959
- /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: "Focus on a product" }),
7627
+ products.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "boff-explore-rise boff-explore-rise-3 mt-6", children: [
7628
+ /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.focusProduct }),
6960
7629
  /* @__PURE__ */ jsx(
6961
7630
  ProductStrip,
6962
7631
  {
7632
+ strings: T,
6963
7633
  products,
6964
7634
  focusProduct,
6965
7635
  onFocus
@@ -6978,7 +7648,8 @@ function ExplorePage({
6978
7648
  onNavigate,
6979
7649
  onSend,
6980
7650
  welcomeTitle,
6981
- welcomeBody
7651
+ welcomeBody,
7652
+ locale
6982
7653
  }) {
6983
7654
  const pageUrl = useMemo(
6984
7655
  () => typeof window === "undefined" ? void 0 : window.location.href,
@@ -7003,7 +7674,8 @@ function ExplorePage({
7003
7674
  deleteConversation,
7004
7675
  clearHistory,
7005
7676
  recordClick,
7006
- createShareLink
7677
+ createShareLink,
7678
+ isSharedView
7007
7679
  } = useExploreChat({ productSlug, pageUrl, onSend, examplePrompts });
7008
7680
  const [draft, setDraft] = useState("");
7009
7681
  const textareaRef = useRef(null);
@@ -7022,7 +7694,18 @@ function ExplorePage({
7022
7694
  }
7023
7695
  });
7024
7696
  speechStopRef.current = speech.stop;
7697
+ const activeLocale = useMemo(
7698
+ () => resolveExploreLocale(locale),
7699
+ [locale]
7700
+ );
7701
+ const T = useMemo(() => exploreStrings(activeLocale), [activeLocale]);
7702
+ const rtl = isRtlLocale(activeLocale);
7025
7703
  const [disclaimerOpen, setDisclaimerOpen] = useState(false);
7704
+ const [staged, setStaged] = useState([]);
7705
+ const [attachmentNotice, setAttachmentNotice] = useState(null);
7706
+ const fileInputRef = useRef(null);
7707
+ const stagedRef = useRef([]);
7708
+ stagedRef.current = staged;
7026
7709
  const [shareLabel, setShareLabel] = useState("Share");
7027
7710
  const [shareUrl, setShareUrl] = useState(null);
7028
7711
  const scrollRef = useRef(null);
@@ -7099,13 +7782,40 @@ function ExplorePage({
7099
7782
  setShareLabel("Share");
7100
7783
  }
7101
7784
  }, [createShareLink, pageUrl]);
7785
+ const handleFilesPicked = useCallback(
7786
+ async (picked) => {
7787
+ if (!picked || picked.length === 0) return;
7788
+ const { accepted, rejected } = await stageFiles(
7789
+ Array.from(picked),
7790
+ stagedRef.current
7791
+ );
7792
+ setStaged((prev) => [...prev, ...accepted]);
7793
+ const first = rejected[0];
7794
+ setAttachmentNotice(
7795
+ first ? first.reason === "too-large" ? fill(T.attachmentTooLarge, {
7796
+ name: first.name,
7797
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
7798
+ }) : fill(T.attachmentTooMany, {
7799
+ name: first.name,
7800
+ max: String(MAX_ATTACHMENTS)
7801
+ }) : null
7802
+ );
7803
+ },
7804
+ [T]
7805
+ );
7806
+ const removeAttachment = useCallback((id) => {
7807
+ setStaged((prev) => prev.filter((entry) => entry.id !== id));
7808
+ setAttachmentNotice(null);
7809
+ }, []);
7102
7810
  const submitDraft = useCallback(() => {
7103
7811
  const text = draft.trim();
7104
7812
  if (!text || overLimit || busy || !canSend) return;
7105
7813
  stopDictation();
7106
7814
  setDraft("");
7107
7815
  stickToBottomRef.current = true;
7108
- void send(text);
7816
+ void send(text, toPayload(stagedRef.current));
7817
+ setStaged([]);
7818
+ setAttachmentNotice(null);
7109
7819
  textareaRef.current?.focus();
7110
7820
  }, [busy, canSend, draft, overLimit, send, stopDictation]);
7111
7821
  const sendPrompt = useCallback(
@@ -7113,7 +7823,9 @@ function ExplorePage({
7113
7823
  if (!canSend || busy) return;
7114
7824
  setDraft("");
7115
7825
  stickToBottomRef.current = true;
7116
- void send(prompt);
7826
+ void send(prompt, toPayload(stagedRef.current));
7827
+ setStaged([]);
7828
+ setAttachmentNotice(null);
7117
7829
  },
7118
7830
  [busy, canSend, send]
7119
7831
  );
@@ -7126,7 +7838,9 @@ function ExplorePage({
7126
7838
  },
7127
7839
  [submitDraft]
7128
7840
  );
7129
- const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled;
7841
+ const composerDisabled = phase === "limited" || phase === "disabled" || !catalog.enabled || // A share token grants read access only — the server would reject a send anyway, so
7842
+ // disable it here rather than letting the visitor type into a dead composer.
7843
+ isSharedView;
7130
7844
  const captchaOn = Boolean(
7131
7845
  catalog.captchaRequired && catalog.recaptchaSiteKey
7132
7846
  );
@@ -7136,6 +7850,8 @@ function ExplorePage({
7136
7850
  {
7137
7851
  "data-boff-explore": "page",
7138
7852
  "data-phase": phase,
7853
+ "data-locale": activeLocale,
7854
+ dir: rtl ? "rtl" : void 0,
7139
7855
  className: cn(
7140
7856
  "flex w-full min-w-0 flex-col overflow-x-hidden bg-background text-foreground",
7141
7857
  heightMode === "auto" && "min-h-[70vh]",
@@ -7297,10 +8013,17 @@ function ExplorePage({
7297
8013
  role: "log",
7298
8014
  "aria-live": "polite",
7299
8015
  "aria-label": "Explore conversation",
7300
- className: "boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
8016
+ className: cn(
8017
+ "boff-explore-scroll min-h-0 min-w-0 flex-1 overflow-y-auto overflow-x-hidden",
8018
+ // Only while the welcome state is showing: a flex column is what lets its
8019
+ // `my-auto` centre the block on a tall screen. The transcript must NOT be a flex
8020
+ // column — that would fight the natural top-down flow of messages.
8021
+ showWelcome && "flex flex-col"
8022
+ ),
7301
8023
  children: showWelcome ? /* @__PURE__ */ jsx(
7302
8024
  WelcomeState,
7303
8025
  {
8026
+ strings: T,
7304
8027
  title: resolvedTitle,
7305
8028
  body: resolvedBody,
7306
8029
  prompts,
@@ -7311,9 +8034,10 @@ function ExplorePage({
7311
8034
  disabled: !canSend || busy
7312
8035
  }
7313
8036
  ) : /* @__PURE__ */ jsx("div", { className: "mx-auto w-full min-w-0 max-w-3xl space-y-6 px-4 py-6", children: messages.map(
7314
- (message) => message.role === "USER" ? /* @__PURE__ */ jsx(UserBubble, { message }, message.id) : /* @__PURE__ */ jsx(
8037
+ (message) => message.role === "USER" ? /* @__PURE__ */ jsx(UserBubble, { strings: T, message }, message.id) : /* @__PURE__ */ jsx(
7315
8038
  AssistantBubble,
7316
8039
  {
8040
+ strings: T,
7317
8041
  message,
7318
8042
  activity,
7319
8043
  onNavigate,
@@ -7334,6 +8058,33 @@ function ExplorePage({
7334
8058
  captchaOn
7335
8059
  }
7336
8060
  ),
8061
+ isSharedView ? /* @__PURE__ */ jsxs(
8062
+ "div",
8063
+ {
8064
+ "data-boff-explore": "shared-banner",
8065
+ className: "mx-auto flex w-full max-w-3xl items-center gap-2 px-4 pb-2 text-xs text-muted-foreground",
8066
+ children: [
8067
+ /* @__PURE__ */ jsx(Link2, { className: "h-3.5 w-3.5 shrink-0" }),
8068
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children: "You are viewing a shared conversation. Start your own to ask a question." }),
8069
+ /* @__PURE__ */ jsx(
8070
+ "button",
8071
+ {
8072
+ type: "button",
8073
+ "data-boff-explore": "shared-start-own",
8074
+ onClick: () => {
8075
+ if (typeof window !== "undefined") {
8076
+ const url = new URL(window.location.href);
8077
+ url.searchParams.delete("c");
8078
+ window.location.href = url.toString();
8079
+ }
8080
+ },
8081
+ className: "shrink-0 underline underline-offset-2 hover:text-foreground",
8082
+ children: "New chat"
8083
+ }
8084
+ )
8085
+ ]
8086
+ }
8087
+ ) : null,
7337
8088
  /* @__PURE__ */ jsx("div", { className: "border-t border-border bg-background/85 px-4 pb-[max(1rem,env(safe-area-inset-bottom))] pt-3 backdrop-blur-md", children: /* @__PURE__ */ jsxs(
7338
8089
  "form",
7339
8090
  {
@@ -7345,11 +8096,57 @@ function ExplorePage({
7345
8096
  },
7346
8097
  children: [
7347
8098
  error ? /* @__PURE__ */ jsx(ErrorBanner, { error, onRetry: retry, onReset: reset }) : null,
8099
+ staged.length > 0 ? /* @__PURE__ */ jsx(
8100
+ "ul",
8101
+ {
8102
+ "data-boff-explore": "attachments",
8103
+ className: "mb-2 flex flex-wrap gap-1.5",
8104
+ "aria-label": T.attach,
8105
+ children: staged.map((entry) => /* @__PURE__ */ jsxs(
8106
+ "li",
8107
+ {
8108
+ "data-boff-explore": "attachment",
8109
+ "data-text-extracted": entry.textExtracted ? "true" : "false",
8110
+ 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",
8111
+ children: [
8112
+ /* @__PURE__ */ jsx(Paperclip, { className: "h-3 w-3 shrink-0 text-muted-foreground" }),
8113
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium", title: entry.name, children: entry.name }),
8114
+ /* @__PURE__ */ jsxs("span", { className: "shrink-0 text-muted-foreground", children: [
8115
+ formatBytes(entry.size),
8116
+ entry.textExtracted ? "" : ` \xB7 ${T.attachmentNameOnly}`
8117
+ ] }),
8118
+ /* @__PURE__ */ jsx(
8119
+ "button",
8120
+ {
8121
+ type: "button",
8122
+ "data-boff-explore": "attachment-remove",
8123
+ onClick: () => removeAttachment(entry.id),
8124
+ "aria-label": fill(T.removeAttachment, { name: entry.name }),
8125
+ 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",
8126
+ children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
8127
+ }
8128
+ )
8129
+ ]
8130
+ },
8131
+ entry.id
8132
+ ))
8133
+ }
8134
+ ) : null,
8135
+ attachmentNotice !== null ? /* @__PURE__ */ jsx(
8136
+ "p",
8137
+ {
8138
+ "data-boff-explore": "attachment-notice",
8139
+ role: "status",
8140
+ className: "mb-2 text-xs text-destructive",
8141
+ children: attachmentNotice
8142
+ }
8143
+ ) : null,
7348
8144
  /* @__PURE__ */ jsxs(
7349
8145
  "div",
7350
8146
  {
7351
8147
  className: cn(
7352
8148
  "flex min-w-0 items-end gap-2 rounded-2xl border bg-card p-2 shadow-sm transition-all",
8149
+ busy && "boff-explore-busy",
7353
8150
  overLimit ? "border-destructive/60" : "border-border focus-within:border-primary/40 focus-within:ring-1 focus-within:ring-ring"
7354
8151
  ),
7355
8152
  children: [
@@ -7369,8 +8166,40 @@ function ExplorePage({
7369
8166
  composingRef.current = false;
7370
8167
  },
7371
8168
  "aria-label": "Ask a question",
7372
- 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",
7373
- 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"
8169
+ placeholder: composerDisabled ? phase === "limited" ? "Message limit reached \u2014 please try again later" : "Explore is unavailable right now" : focusedProductName ? fill(T.placeholderProduct, {
8170
+ product: focusedProductName
8171
+ }) : T.placeholder,
8172
+ 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"
8173
+ }
8174
+ ),
8175
+ /* @__PURE__ */ jsx(
8176
+ "input",
8177
+ {
8178
+ ref: fileInputRef,
8179
+ type: "file",
8180
+ multiple: true,
8181
+ className: "hidden",
8182
+ onChange: (event) => {
8183
+ void handleFilesPicked(event.target.files);
8184
+ event.target.value = "";
8185
+ }
8186
+ }
8187
+ ),
8188
+ /* @__PURE__ */ jsx(
8189
+ Button,
8190
+ {
8191
+ "data-boff-explore": "attach",
8192
+ type: "button",
8193
+ size: "icon",
8194
+ variant: "ghost",
8195
+ disabled: composerDisabled || staged.length >= MAX_ATTACHMENTS,
8196
+ "aria-label": T.attach,
8197
+ title: `${T.attach} \u2014 ${fill(T.attachHint, {
8198
+ max: String(MAX_ATTACHMENTS),
8199
+ size: String(MAX_ATTACHMENT_BYTES / (1024 * 1024))
8200
+ })}`,
8201
+ onClick: () => fileInputRef.current?.click(),
8202
+ children: /* @__PURE__ */ jsx(Paperclip, { className: "h-4 w-4" })
7374
8203
  }
7375
8204
  ),
7376
8205
  speech.supported ? /* @__PURE__ */ jsx(
@@ -7382,9 +8211,9 @@ function ExplorePage({
7382
8211
  size: "icon",
7383
8212
  variant: speech.listening ? "default" : "ghost",
7384
8213
  disabled: composerDisabled,
7385
- "aria-label": speech.listening ? "Stop dictating" : "Dictate your question",
8214
+ "aria-label": speech.listening ? T.stopDictating : T.dictate,
7386
8215
  "aria-pressed": speech.listening,
7387
- title: speech.listening ? "Stop dictating" : "Dictate your question",
8216
+ title: speech.listening ? T.stopDictating : T.dictate,
7388
8217
  onClick: speech.toggle,
7389
8218
  className: cn(speech.listening && "animate-pulse"),
7390
8219
  children: /* @__PURE__ */ jsx(Mic, { className: "h-4 w-4" })
@@ -7484,7 +8313,7 @@ function ExplorePage({
7484
8313
  )
7485
8314
  ] }) : null,
7486
8315
  /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground", children: [
7487
- /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: "Grounded in our docs \u2014 check anything important." }),
8316
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: T.disclaimerShort }),
7488
8317
  /* @__PURE__ */ jsx(
7489
8318
  "button",
7490
8319
  {
@@ -7492,7 +8321,7 @@ function ExplorePage({
7492
8321
  "data-boff-explore": "disclaimer",
7493
8322
  onClick: () => setDisclaimerOpen(true),
7494
8323
  className: "shrink-0 underline underline-offset-2 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
7495
- children: "Disclaimer"
8324
+ children: T.disclaimer
7496
8325
  }
7497
8326
  )
7498
8327
  ] })
@@ -9355,7 +10184,7 @@ function ChangelogPage(props) {
9355
10184
  }
9356
10185
 
9357
10186
  // src/content/utils.ts
9358
- function formatBytes(bytes) {
10187
+ function formatBytes2(bytes) {
9359
10188
  if (bytes == null) return "";
9360
10189
  if (bytes < 1024) return `${bytes} B`;
9361
10190
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;
@@ -9476,7 +10305,7 @@ function PressKitLightbox({
9476
10305
  }, [asset, onClose]);
9477
10306
  if (!asset) return null;
9478
10307
  const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
9479
- const size = formatBytes(asset.fileSize);
10308
+ const size = formatBytes2(asset.fileSize);
9480
10309
  return /* @__PURE__ */ jsx(
9481
10310
  "div",
9482
10311
  {
@@ -9585,7 +10414,7 @@ function AssetCard({
9585
10414
  day: "numeric"
9586
10415
  }) : "";
9587
10416
  const ext = (asset.mimeType || "file").split("/").pop()?.toUpperCase() || "FILE";
9588
- const size = formatBytes(asset.fileSize);
10417
+ const size = formatBytes2(asset.fileSize);
9589
10418
  const [imgError, setImgError] = useState(false);
9590
10419
  const thumb = asset.thumbnailUrl && !imgError ? /* @__PURE__ */ jsx("div", { className: "aspect-[16/9] overflow-hidden bg-muted/30", children: /* @__PURE__ */ jsx(
9591
10420
  "img",
@@ -10089,7 +10918,7 @@ function ContractsPage(props) {
10089
10918
  ] }) }),
10090
10919
  /* @__PURE__ */ jsx("section", { className: "max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12", children: loading ? /* @__PURE__ */ jsx("div", { className: "flex justify-center py-20", children: /* @__PURE__ */ jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" }) }) : error ? /* @__PURE__ */ jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: error }) }) : contracts.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-center py-16", children: /* @__PURE__ */ jsx("p", { className: "text-base text-muted-foreground", children: "No contracts are available yet." }) }) : /* @__PURE__ */ jsx("ul", { className: "divide-y divide-border rounded-xl border border-border overflow-hidden bg-card", children: contracts.map((c) => {
10091
10920
  const ext = fileExt(c);
10092
- const size = formatBytes(c.fileSize);
10921
+ const size = formatBytes2(c.fileSize);
10093
10922
  return /* @__PURE__ */ jsxs(
10094
10923
  "li",
10095
10924
  {
@@ -12163,6 +12992,6 @@ function StoreProductDetailPage({
12163
12992
  ] });
12164
12993
  }
12165
12994
 
12166
- export { BlogListPage, BlogPostPage, Button, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, ECOSYSTEM_PRODUCTS, EXPLORE_CATALOG_QUERY, EXPLORE_MESSAGE_QUERY, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, buttonVariants, classifyExploreError, cn, detectElectronPlatform, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatDownloads, formatPrice2 as formatPrice, getRecaptchaV3Token, isValidUrl, loadRecaptchaV3, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useWebSDK, useWebSDKConfig };
12995
+ export { BlogListPage, BlogPostPage, Button, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ContactPage, ContentRenderer, ContractsPage, DEFAULT_CONTACT_CATEGORIES, DEFAULT_EXPLORE_EXAMPLE_PROMPTS, ECOSYSTEM_PRODUCTS, EXPLORE_CATALOG_QUERY, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PageHead, PartnersPage, PressKitPage, PricingPage, PricingSection, ProblemsSolvedSection, ProductCard, ProductProvider, ResourceLinks, RybbitAnalytics, SEND_EXPLORE_MESSAGE_MUTATION, Select, SocialLinks, StarRating, StoreBrowsePage, StoreHomePage, StoreProductDetailPage, Textarea, TypeBadge, UnsubscribePage, WaitlistForm, WaitlistPage, WebSDKClient, WebSDKProvider, WebsiteSwitcher, buttonVariants, classifyExploreError, cn, detectElectronPlatform, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatDownloads, formatPrice2 as formatPrice, getRecaptchaV3Token, isValidUrl, loadRecaptchaV3, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useWebSDK, useWebSDKConfig };
12167
12996
  //# sourceMappingURL=index.mjs.map
12168
12997
  //# sourceMappingURL=index.mjs.map