@burdenoff/website-sdk 2026.829.8 → 2026.921.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +112 -1
  2. package/dist/components/contact.js +4 -1
  3. package/dist/components/contact.js.map +1 -1
  4. package/dist/components/contact.mjs +4 -1
  5. package/dist/components/contact.mjs.map +1 -1
  6. package/dist/components/explore.d.mts +14 -1
  7. package/dist/components/explore.d.ts +14 -1
  8. package/dist/components/explore.js +217 -43
  9. package/dist/components/explore.js.map +1 -1
  10. package/dist/components/explore.mjs +217 -45
  11. package/dist/components/explore.mjs.map +1 -1
  12. package/dist/components/newsletter.js +4 -1
  13. package/dist/components/newsletter.js.map +1 -1
  14. package/dist/components/newsletter.mjs +4 -1
  15. package/dist/components/newsletter.mjs.map +1 -1
  16. package/dist/components/partners.js +23 -13
  17. package/dist/components/partners.js.map +1 -1
  18. package/dist/components/partners.mjs +23 -13
  19. package/dist/components/partners.mjs.map +1 -1
  20. package/dist/components/pricing.js +4 -1
  21. package/dist/components/pricing.js.map +1 -1
  22. package/dist/components/pricing.mjs +4 -1
  23. package/dist/components/pricing.mjs.map +1 -1
  24. package/dist/components/unsubscribe.js +4 -1
  25. package/dist/components/unsubscribe.js.map +1 -1
  26. package/dist/components/unsubscribe.mjs +4 -1
  27. package/dist/components/unsubscribe.mjs.map +1 -1
  28. package/dist/components/waitlist.js +4 -1
  29. package/dist/components/waitlist.js.map +1 -1
  30. package/dist/components/waitlist.mjs +4 -1
  31. package/dist/components/waitlist.mjs.map +1 -1
  32. package/dist/content/index.js +23 -13
  33. package/dist/content/index.js.map +1 -1
  34. package/dist/content/index.mjs +23 -13
  35. package/dist/content/index.mjs.map +1 -1
  36. package/dist/{use-explore-chat-BzXCz2UM.d.mts → explore-types-CLw19R76.d.mts} +1 -131
  37. package/dist/{use-explore-chat-BzXCz2UM.d.ts → explore-types-CLw19R76.d.ts} +1 -131
  38. package/dist/hooks/index.d.mts +2 -1
  39. package/dist/hooks/index.d.ts +2 -1
  40. package/dist/hooks/index.js +23 -7
  41. package/dist/hooks/index.js.map +1 -1
  42. package/dist/hooks/index.mjs +23 -7
  43. package/dist/hooks/index.mjs.map +1 -1
  44. package/dist/index.d.mts +143 -3
  45. package/dist/index.d.ts +143 -3
  46. package/dist/index.js +1552 -207
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +1548 -210
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/seo/index.js +4 -1
  51. package/dist/seo/index.js.map +1 -1
  52. package/dist/seo/index.mjs +4 -1
  53. package/dist/seo/index.mjs.map +1 -1
  54. package/dist/store/index.js +23 -13
  55. package/dist/store/index.js.map +1 -1
  56. package/dist/store/index.mjs +23 -13
  57. package/dist/store/index.mjs.map +1 -1
  58. package/dist/use-explore-chat-CvW-kyIm.d.mts +145 -0
  59. package/dist/use-explore-chat-DdGBimiz.d.ts +145 -0
  60. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
- import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect } from 'react';
2
+ import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect, useId, version } 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, Paperclip, X, 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, ImageIcon, ChevronRight, Maximize2, Check, ArrowLeft, Sparkles, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, Info, ChevronLeft, BookOpenText, Layers, TriangleAlert, 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';
@@ -477,6 +477,9 @@ function resolveImageUrl(image, base) {
477
477
  return image;
478
478
  }
479
479
  }
480
+ function serializeJsonLd(data) {
481
+ return JSON.stringify(data).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
482
+ }
480
483
  function PageHead({
481
484
  title,
482
485
  description,
@@ -518,7 +521,7 @@ function PageHead({
518
521
  fullImageUrl && /* @__PURE__ */ jsx("meta", { name: "twitter:image", content: fullImageUrl }),
519
522
  twitterHandle && /* @__PURE__ */ jsx("meta", { name: "twitter:creator", content: twitterHandle }),
520
523
  /* @__PURE__ */ jsx("meta", { name: "theme-color", content: themeColor }),
521
- structuredDataItems.map((data, index) => /* @__PURE__ */ jsx("script", { type: "application/ld+json", children: JSON.stringify(data) }, `ld-${index}`)),
524
+ structuredDataItems.map((data, index) => /* @__PURE__ */ jsx("script", { type: "application/ld+json", children: serializeJsonLd(data) }, `ld-${index}`)),
522
525
  additionalMeta?.map((meta, index) => /* @__PURE__ */ jsx(
523
526
  "meta",
524
527
  {
@@ -1078,19 +1081,26 @@ function ContactPage({
1078
1081
  ] }) })
1079
1082
  ] });
1080
1083
  }
1084
+ function MarkdownLink({
1085
+ href,
1086
+ children,
1087
+ // react-markdown passes the hast node to every override; it is not a DOM attribute.
1088
+ node: _node,
1089
+ ...props
1090
+ }) {
1091
+ const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
1092
+ return /* @__PURE__ */ jsx(
1093
+ "a",
1094
+ {
1095
+ href,
1096
+ ...props,
1097
+ ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : { rel: "noopener noreferrer" },
1098
+ children
1099
+ }
1100
+ );
1101
+ }
1081
1102
  var defaultComponents = {
1082
- a: ({ href, children, ...props }) => {
1083
- const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
1084
- return /* @__PURE__ */ jsx(
1085
- "a",
1086
- {
1087
- href,
1088
- ...props,
1089
- ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : { rel: "noopener noreferrer" },
1090
- children
1091
- }
1092
- );
1093
- }
1103
+ a: MarkdownLink
1094
1104
  };
1095
1105
  function Markdown({
1096
1106
  children,
@@ -4736,171 +4746,1346 @@ function ElectronDownloadLink({
4736
4746
  );
4737
4747
  }
4738
4748
 
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);
4749
+ // src/components/concepts-types.ts
4750
+ var CONCEPT_ILLUSTRATION_NOTICE = "These images are illustrations of the concept, not screenshots of the actual product.";
4751
+ var CONCEPTS_PATH = "/concepts";
4752
+ var CONCEPT_PATH_PREFIX = "/concept";
4753
+ function conceptPath(slug) {
4754
+ return `${CONCEPT_PATH_PREFIX}/${encodeURIComponent(slug)}`;
4755
+ }
4756
+ function getConceptBySlug(concepts, slug) {
4757
+ if (!slug) return void 0;
4758
+ const wanted = slug.trim().toLowerCase();
4759
+ if (!wanted) return void 0;
4760
+ return concepts.find((concept) => concept.slug === wanted);
4761
+ }
4762
+ var NAV_BUTTON = "inline-flex h-11 w-11 items-center justify-center rounded-full border border-border bg-card text-foreground shadow-md transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
4763
+ function ConceptLightbox({
4764
+ images,
4765
+ index,
4766
+ conceptTitle,
4767
+ onIndexChange,
4768
+ onClose
4769
+ }) {
4770
+ const dialogRef = useRef(null);
4771
+ const closeRef = useRef(null);
4772
+ const nativeModalRef = useRef(false);
4773
+ const titleId = useId();
4774
+ const count = images.length;
4775
+ const position = count > 0 ? (index % count + count) % count : 0;
4776
+ const image = images[position];
4777
+ useEffect(() => {
4778
+ const dialog = dialogRef.current;
4779
+ if (!dialog) return;
4780
+ if (typeof dialog.showModal === "function") {
4781
+ if (!dialog.open) dialog.showModal();
4782
+ nativeModalRef.current = true;
4783
+ } else {
4784
+ dialog.setAttribute("open", "");
4785
+ nativeModalRef.current = false;
4786
+ }
4787
+ closeRef.current?.focus();
4788
+ return () => {
4789
+ if (dialog.open && typeof dialog.close === "function") dialog.close();
4790
+ };
4791
+ }, []);
4792
+ const go = useCallback(
4793
+ (delta) => {
4794
+ if (count < 2) return;
4795
+ onIndexChange((position + delta + count) % count);
4796
+ },
4797
+ [count, onIndexChange, position]
4798
+ );
4799
+ const handleClose = useCallback(
4800
+ (event) => {
4801
+ if (event.currentTarget.open) return;
4802
+ onClose();
4803
+ },
4804
+ [onClose]
4805
+ );
4806
+ const handleKeyDown = useCallback(
4807
+ (event) => {
4808
+ if (event.key === "ArrowRight") {
4809
+ event.preventDefault();
4810
+ go(1);
4811
+ } else if (event.key === "ArrowLeft") {
4812
+ event.preventDefault();
4813
+ go(-1);
4814
+ } else if (event.key === "Escape" && !nativeModalRef.current) {
4815
+ event.preventDefault();
4816
+ onClose();
4817
+ }
4818
+ },
4819
+ [go, onClose]
4820
+ );
4821
+ const handleStageClick = useCallback(
4822
+ (event) => {
4823
+ if (event.target === event.currentTarget) onClose();
4824
+ },
4825
+ [onClose]
4826
+ );
4827
+ if (!image) return null;
4828
+ return /* @__PURE__ */ jsx(
4829
+ "dialog",
4830
+ {
4831
+ ref: dialogRef,
4832
+ "data-concepts": "lightbox",
4833
+ "aria-labelledby": titleId,
4834
+ onClose: handleClose,
4835
+ onKeyDown: handleKeyDown,
4836
+ className: "fixed inset-0 z-50 m-0 h-full max-h-none w-full max-w-none overflow-y-auto overscroll-contain border-0 bg-background/95 p-0 text-foreground backdrop-blur-sm",
4837
+ children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-full flex-col", children: [
4838
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-border px-4 py-3 sm:px-6", children: [
4839
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
4840
+ /* @__PURE__ */ jsxs("p", { className: "truncate text-xs font-medium uppercase tracking-wide text-muted-foreground", children: [
4841
+ conceptTitle,
4842
+ count > 1 ? ` \xB7 ${position + 1} / ${count}` : null
4843
+ ] }),
4844
+ /* @__PURE__ */ jsx(
4845
+ "h2",
4846
+ {
4847
+ id: titleId,
4848
+ className: "truncate text-base font-semibold text-foreground sm:text-lg",
4849
+ children: image.title
4850
+ }
4851
+ )
4852
+ ] }),
4853
+ /* @__PURE__ */ jsx(
4854
+ "button",
4855
+ {
4856
+ ref: closeRef,
4857
+ type: "button",
4858
+ onClick: onClose,
4859
+ "aria-label": "Close",
4860
+ "data-concepts": "lightbox-close",
4861
+ className: "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full border border-border bg-card text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4862
+ children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-5 w-5" })
4863
+ }
4864
+ )
4865
+ ] }),
4866
+ /* @__PURE__ */ jsxs(
4867
+ "div",
4868
+ {
4869
+ className: "relative flex flex-1 items-center justify-center px-4 py-4 sm:px-20",
4870
+ onClick: handleStageClick,
4871
+ children: [
4872
+ /* @__PURE__ */ jsx(
4873
+ "img",
4874
+ {
4875
+ src: image.src,
4876
+ alt: image.alt,
4877
+ width: image.width,
4878
+ height: image.height,
4879
+ decoding: "async",
4880
+ className: "h-auto max-h-[calc(100vh-14rem)] w-auto max-w-full rounded-lg border border-border bg-muted object-contain shadow-lg"
4881
+ },
4882
+ image.key
4883
+ ),
4884
+ count > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [
4885
+ /* @__PURE__ */ jsx(
4886
+ "button",
4887
+ {
4888
+ type: "button",
4889
+ onClick: () => go(-1),
4890
+ "aria-label": "Previous illustration",
4891
+ "data-concepts": "lightbox-prev",
4892
+ className: `absolute left-2 top-1/2 -translate-y-1/2 sm:left-4 ${NAV_BUTTON}`,
4893
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true", className: "h-5 w-5" })
4894
+ }
4895
+ ),
4896
+ /* @__PURE__ */ jsx(
4897
+ "button",
4898
+ {
4899
+ type: "button",
4900
+ onClick: () => go(1),
4901
+ "aria-label": "Next illustration",
4902
+ "data-concepts": "lightbox-next",
4903
+ className: `absolute right-2 top-1/2 -translate-y-1/2 sm:right-4 ${NAV_BUTTON}`,
4904
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "h-5 w-5" })
4905
+ }
4906
+ )
4907
+ ] }) : null
4908
+ ]
4909
+ }
4910
+ ),
4911
+ /* @__PURE__ */ jsxs("div", { className: "border-t border-border px-4 py-3 sm:px-6", children: [
4912
+ /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed text-foreground", children: image.caption }),
4913
+ /* @__PURE__ */ jsxs("p", { className: "mt-1.5 flex items-start gap-1.5 text-xs leading-relaxed text-muted-foreground", children: [
4914
+ /* @__PURE__ */ jsx(Info, { "aria-hidden": "true", className: "mt-0.5 h-3.5 w-3.5 shrink-0" }),
4915
+ /* @__PURE__ */ jsx("span", { children: CONCEPT_ILLUSTRATION_NOTICE })
4916
+ ] })
4917
+ ] })
4918
+ ] })
4919
+ }
4920
+ );
4744
4921
  }
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",
4922
+ var META_DESCRIPTION_LIMIT = 160;
4923
+ var RELATED_LIMIT = 4;
4924
+ var HERO_FETCH_PRIORITY = Number.parseInt(version, 10) >= 19 ? { fetchPriority: "high" } : { fetchpriority: "high" };
4925
+ function normaliseSiteUrl(siteUrl) {
4926
+ return siteUrl.trim().replace(/\/+$/, "");
4927
+ }
4928
+ function absoluteUrl(base, path) {
4929
+ if (/^https?:\/\//i.test(path)) return path;
4930
+ return `${base}${path.startsWith("/") ? path : `/${path}`}`;
4931
+ }
4932
+ function sortByOrder(concepts) {
4933
+ return [...concepts].sort(
4934
+ (a, b) => a.order - b.order || a.slug.localeCompare(b.slug)
4935
+ );
4936
+ }
4937
+ function plural(count, singular, pluralForm) {
4938
+ return `${count} ${count === 1 ? singular : pluralForm}`;
4939
+ }
4940
+ function illustrationCount(count) {
4941
+ return plural(count, "illustration", "illustrations");
4942
+ }
4943
+ function listSentence(items) {
4944
+ if (items.length <= 1) return items.join("");
4945
+ return `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
4946
+ }
4947
+ function clampText(text, limit) {
4948
+ if (text.length <= limit) return text;
4949
+ const cut = text.slice(0, limit - 1);
4950
+ const lastSpace = cut.lastIndexOf(" ");
4951
+ return `${(lastSpace > 0 ? cut.slice(0, lastSpace) : cut).replace(/[\s,;:—–-]+$/, "")}\u2026`;
4952
+ }
4953
+ function defaultLandingDescription(productName, conceptTotal, imageTotal, categoryNames) {
4954
+ if (conceptTotal === 0) {
4955
+ return clampText(
4956
+ `Concepts of how ${productName} works, each a feature or flow explained with illustrations.`,
4957
+ META_DESCRIPTION_LIMIT
4958
+ );
4959
+ }
4960
+ const head = `Explore ${plural(conceptTotal, `${productName} concept`, `${productName} concepts`)} with ${illustrationCount(imageTotal)}`;
4961
+ for (let take = Math.min(categoryNames.length, 4); take >= 1; take -= 1) {
4962
+ const more = categoryNames.length > take ? " and more" : "";
4963
+ const text = `${head} across ${listSentence(categoryNames.slice(0, take))}${more}.`;
4964
+ if (text.length <= META_DESCRIPTION_LIMIT) return text;
4965
+ }
4966
+ return clampText(`${head} of how the product works.`, META_DESCRIPTION_LIMIT);
4967
+ }
4968
+ function slugifyAnchor(value) {
4969
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
4970
+ }
4971
+ function groupByCategory(ordered, categories) {
4972
+ const byName = /* @__PURE__ */ new Map();
4973
+ for (const concept of ordered) {
4974
+ const list = byName.get(concept.category);
4975
+ if (list) list.push(concept);
4976
+ else byName.set(concept.category, [concept]);
4977
+ }
4978
+ const described = [];
4979
+ for (const category of categories ?? []) {
4980
+ const list = byName.get(category.name);
4981
+ if (!list) continue;
4982
+ described.push({
4983
+ name: category.name,
4984
+ description: category.description,
4985
+ concepts: list
4986
+ });
4987
+ byName.delete(category.name);
4988
+ }
4989
+ for (const [name, list] of byName) {
4990
+ described.push({ name, description: "", concepts: list });
4991
+ }
4992
+ const used = /* @__PURE__ */ new Set();
4993
+ return described.map((group) => {
4994
+ const base = `concepts-${slugifyAnchor(group.name) || "category"}`;
4995
+ let anchor = base;
4996
+ for (let n = 2; used.has(anchor); n += 1) anchor = `${base}-${n}`;
4997
+ used.add(anchor);
4998
+ return { ...group, anchor };
4999
+ });
5000
+ }
5001
+ function searchTokens(query) {
5002
+ return query.toLowerCase().split(/\s+/).filter(Boolean);
5003
+ }
5004
+ function matchesSearch(concept, tokens) {
5005
+ if (tokens.length === 0) return true;
5006
+ const haystack = [
5007
+ concept.title,
5008
+ concept.tagline,
5009
+ concept.category,
5010
+ ...concept.keywords
5011
+ ].join(" ").toLowerCase();
5012
+ return tokens.every((token) => haystack.includes(token));
5013
+ }
5014
+ function isPortrait(width, height) {
5015
+ return height > width;
5016
+ }
5017
+ function copyKey(index, text) {
5018
+ return `${index}-${text}`;
5019
+ }
5020
+ function DefaultConceptLink({
5021
+ href,
5022
+ className,
5023
+ children,
5024
+ "aria-label": ariaLabel
5025
+ }) {
5026
+ return /* @__PURE__ */ jsx("a", { href, className, "aria-label": ariaLabel, children });
5027
+ }
5028
+ function IllustrationNotice({ className }) {
5029
+ return /* @__PURE__ */ jsxs(
5030
+ "div",
5031
+ {
5032
+ role: "note",
5033
+ "data-concepts": "notice",
5034
+ "data-concepts-notice": "",
5035
+ className: cn(
5036
+ "flex items-start gap-3 rounded-xl border border-primary/30 bg-primary/10 px-4 py-3 text-sm leading-relaxed text-foreground",
5037
+ className
5038
+ ),
5039
+ children: [
5040
+ /* @__PURE__ */ jsx(
5041
+ Info,
5042
+ {
5043
+ "aria-hidden": "true",
5044
+ className: "mt-0.5 h-4 w-4 shrink-0 text-primary"
5045
+ }
5046
+ ),
5047
+ /* @__PURE__ */ jsx("p", { children: CONCEPT_ILLUSTRATION_NOTICE })
5048
+ ]
5049
+ }
5050
+ );
5051
+ }
5052
+ function IllustrationBadge({ className }) {
5053
+ return /* @__PURE__ */ jsx(
5054
+ "span",
5055
+ {
5056
+ "aria-hidden": "true",
5057
+ className: cn(
5058
+ "pointer-events-none absolute left-2 top-2 inline-flex items-center rounded-full border border-border bg-background/90 px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide text-foreground shadow-sm",
5059
+ className
5060
+ ),
5061
+ children: "Illustration"
5062
+ }
5063
+ );
5064
+ }
5065
+ function ConceptCard({
5066
+ concept,
5067
+ Link
5068
+ }) {
5069
+ const image = concept.images[0];
5070
+ const portrait = image ? isPortrait(image.thumbWidth, image.thumbHeight) : false;
5071
+ return /* @__PURE__ */ jsxs(
5072
+ Link,
5073
+ {
5074
+ href: conceptPath(concept.slug),
5075
+ className: "group flex h-full flex-col overflow-hidden rounded-2xl border border-border bg-card text-card-foreground shadow-sm transition hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transform-none motion-reduce:transition-none",
5076
+ children: [
5077
+ /* @__PURE__ */ jsxs("div", { className: "relative aspect-[16/10] overflow-hidden border-b border-border bg-muted", children: [
5078
+ image ? /* @__PURE__ */ jsx(
5079
+ "img",
5080
+ {
5081
+ src: image.thumb,
5082
+ alt: "",
5083
+ width: image.thumbWidth,
5084
+ height: image.thumbHeight,
5085
+ loading: "lazy",
5086
+ decoding: "async",
5087
+ className: cn(
5088
+ "h-full w-full",
5089
+ portrait ? "object-contain p-3" : "object-cover object-top"
5090
+ )
5091
+ }
5092
+ ) : null,
5093
+ /* @__PURE__ */ jsx(IllustrationBadge, {})
5094
+ ] }),
5095
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
5096
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold leading-snug text-card-foreground transition-colors group-hover:text-primary", children: concept.title }),
5097
+ /* @__PURE__ */ jsx("p", { className: "line-clamp-3 text-sm leading-relaxed text-muted-foreground", children: concept.tagline }),
5098
+ /* @__PURE__ */ jsxs("span", { className: "mt-auto inline-flex items-center gap-1.5 pt-1 text-xs font-medium text-muted-foreground", children: [
5099
+ /* @__PURE__ */ jsx(ImageIcon, { "aria-hidden": "true", className: "h-3.5 w-3.5" }),
5100
+ illustrationCount(concept.images.length)
5101
+ ] })
5102
+ ] })
5103
+ ]
5104
+ }
5105
+ );
5106
+ }
5107
+ function FilterChip({
5108
+ label,
5109
+ count,
5110
+ active,
5111
+ category,
5112
+ onSelect
5113
+ }) {
5114
+ return /* @__PURE__ */ jsxs(
5115
+ "button",
5116
+ {
5117
+ type: "button",
5118
+ "aria-pressed": active,
5119
+ "data-category": category,
5120
+ onClick: onSelect,
5121
+ className: cn(
5122
+ "inline-flex items-center gap-2 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5123
+ active ? "border-primary bg-primary text-primary-foreground" : "border-border bg-card text-foreground hover:border-primary/40 hover:bg-muted"
5124
+ ),
5125
+ children: [
5126
+ /* @__PURE__ */ jsx("span", { children: label }),
5127
+ /* @__PURE__ */ jsx(
5128
+ "span",
5129
+ {
5130
+ className: cn(
5131
+ "rounded-full px-1.5 text-xs tabular-nums",
5132
+ active ? "bg-primary-foreground/20 text-primary-foreground" : "bg-muted text-muted-foreground"
5133
+ ),
5134
+ children: count
5135
+ }
5136
+ )
5137
+ ]
5138
+ }
5139
+ );
5140
+ }
5141
+ function ConceptsPage({
5142
+ productName,
5143
+ siteUrl,
5144
+ concepts,
5145
+ categories,
5146
+ cta,
5147
+ linkComponent,
5148
+ title,
5149
+ description,
5150
+ className
5151
+ }) {
5152
+ const Link = linkComponent ?? DefaultConceptLink;
5153
+ const base = normaliseSiteUrl(siteUrl);
5154
+ const searchId = useId();
5155
+ const ordered = useMemo(() => sortByOrder(concepts), [concepts]);
5156
+ const groups = useMemo(
5157
+ () => groupByCategory(ordered, categories),
5158
+ [ordered, categories]
5159
+ );
5160
+ const imageTotal = useMemo(
5161
+ () => ordered.reduce((sum, concept) => sum + concept.images.length, 0),
5162
+ [ordered]
5163
+ );
5164
+ const [query, setQuery] = useState("");
5165
+ const [activeCategory, setActiveCategory] = useState(null);
5166
+ const hasConcepts = ordered.length > 0;
5167
+ const tokens = useMemo(() => searchTokens(query), [query]);
5168
+ const searched = useMemo(
5169
+ () => ordered.filter((concept) => matchesSearch(concept, tokens)),
5170
+ [ordered, tokens]
5171
+ );
5172
+ const countsByCategory = useMemo(() => {
5173
+ const counts = /* @__PURE__ */ new Map();
5174
+ for (const concept of searched) {
5175
+ counts.set(concept.category, (counts.get(concept.category) ?? 0) + 1);
5176
+ }
5177
+ return counts;
5178
+ }, [searched]);
5179
+ const visibleGroups = useMemo(() => {
5180
+ const visible = new Set(
5181
+ searched.filter(
5182
+ (concept) => activeCategory === null || concept.category === activeCategory
5183
+ )
5184
+ );
5185
+ return groups.map((group) => ({
5186
+ ...group,
5187
+ concepts: group.concepts.filter((concept) => visible.has(concept))
5188
+ })).filter((group) => group.concepts.length > 0);
5189
+ }, [groups, searched, activeCategory]);
5190
+ const visibleTotal = visibleGroups.reduce(
5191
+ (sum, group) => sum + group.concepts.length,
5192
+ 0
5193
+ );
5194
+ const filtering = tokens.length > 0 || activeCategory !== null;
5195
+ const clearFilters = useCallback(() => {
5196
+ setQuery("");
5197
+ setActiveCategory(null);
5198
+ }, []);
5199
+ const heading = title ?? `${productName} concepts`;
5200
+ const metaDescription = description ?? defaultLandingDescription(
5201
+ productName,
5202
+ ordered.length,
5203
+ imageTotal,
5204
+ groups.map((group) => group.name)
5205
+ );
5206
+ const lead = description ?? `A guided tour of ${productName}, one concept at a time. Each concept groups the illustrations of a feature or flow and explains what it does, how it works and who it is for.`;
5207
+ const canonical = `${base}${CONCEPTS_PATH}`;
5208
+ const firstImage = ordered.find((concept) => concept.images[0])?.images[0];
5209
+ const structuredData = useMemo(
5210
+ () => [
5211
+ {
5212
+ "@context": "https://schema.org",
5213
+ "@type": "CollectionPage",
5214
+ name: heading,
5215
+ description: metaDescription,
5216
+ url: canonical,
5217
+ isPartOf: { "@type": "WebSite", name: productName, url: `${base}/` },
5218
+ mainEntity: {
5219
+ "@type": "ItemList",
5220
+ numberOfItems: ordered.length,
5221
+ itemListElement: ordered.map((concept, index) => {
5222
+ const image = concept.images[0];
5223
+ return {
5224
+ "@type": "ListItem",
5225
+ position: index + 1,
5226
+ url: absoluteUrl(base, conceptPath(concept.slug)),
5227
+ name: concept.title,
5228
+ ...image ? { image: absoluteUrl(base, image.src) } : {}
5229
+ };
5230
+ })
5231
+ }
5232
+ },
5233
+ {
5234
+ "@context": "https://schema.org",
5235
+ "@type": "BreadcrumbList",
5236
+ itemListElement: [
5237
+ { "@type": "ListItem", position: 1, name: "Home", item: `${base}/` },
5238
+ {
5239
+ "@type": "ListItem",
5240
+ position: 2,
5241
+ name: "Concepts",
5242
+ item: canonical
5243
+ }
5244
+ ]
5245
+ }
5246
+ ],
5247
+ [base, canonical, heading, metaDescription, ordered, productName]
5248
+ );
5249
+ return /* @__PURE__ */ jsxs(
5250
+ "div",
5251
+ {
5252
+ "data-concepts": "landing",
5253
+ className: cn("bg-background text-foreground", className),
5254
+ children: [
5255
+ /* @__PURE__ */ jsx(
5256
+ PageHead,
5257
+ {
5258
+ title: "Concepts",
5259
+ description: metaDescription,
5260
+ productName,
5261
+ keywords: [
5262
+ `${productName} concepts`,
5263
+ `${productName} illustrations`,
5264
+ ...groups.map((group) => group.name)
5265
+ ].join(", "),
5266
+ image: firstImage ? absoluteUrl(base, firstImage.src) : void 0,
5267
+ url: canonical,
5268
+ structuredData
5269
+ }
5270
+ ),
5271
+ /* @__PURE__ */ jsx("section", { className: "border-b border-border bg-muted/30", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl px-4 py-14 sm:px-6 sm:py-20 lg:px-8", children: [
5272
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-[0.2em] text-primary", children: "Concepts" }),
5273
+ /* @__PURE__ */ jsx("h1", { className: "mt-3 max-w-3xl text-4xl font-bold tracking-tight text-foreground sm:text-5xl", children: heading }),
5274
+ /* @__PURE__ */ jsx("p", { className: "mt-4 max-w-2xl text-lg leading-relaxed text-muted-foreground", children: lead }),
5275
+ hasConcepts ? /* @__PURE__ */ jsxs("p", { className: "mt-6 flex flex-wrap gap-x-6 gap-y-2 text-sm text-muted-foreground", children: [
5276
+ /* @__PURE__ */ jsxs("span", { children: [
5277
+ /* @__PURE__ */ jsx("strong", { className: "text-lg font-semibold text-foreground", children: ordered.length }),
5278
+ " ",
5279
+ ordered.length === 1 ? "concept" : "concepts"
5280
+ ] }),
5281
+ /* @__PURE__ */ jsxs("span", { children: [
5282
+ /* @__PURE__ */ jsx("strong", { className: "text-lg font-semibold text-foreground", children: imageTotal }),
5283
+ " ",
5284
+ imageTotal === 1 ? "illustration" : "illustrations"
5285
+ ] })
5286
+ ] }) : null,
5287
+ /* @__PURE__ */ jsx(IllustrationNotice, { className: "mt-6 max-w-2xl" }),
5288
+ cta ? /* @__PURE__ */ jsx("div", { className: "mt-8 flex flex-wrap gap-3", children: cta }) : null
5289
+ ] }) }),
5290
+ /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-6xl px-4 pb-20 sm:px-6 lg:px-8", children: hasConcepts ? /* @__PURE__ */ jsxs(Fragment, { children: [
5291
+ /* @__PURE__ */ jsxs(
5292
+ "div",
5293
+ {
5294
+ role: "search",
5295
+ "data-concepts": "filter",
5296
+ className: "flex flex-col gap-4 py-8",
5297
+ children: [
5298
+ /* @__PURE__ */ jsxs("div", { className: "relative w-full max-w-md", children: [
5299
+ /* @__PURE__ */ jsx(
5300
+ Search,
5301
+ {
5302
+ "aria-hidden": "true",
5303
+ className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"
5304
+ }
5305
+ ),
5306
+ /* @__PURE__ */ jsx("label", { htmlFor: searchId, className: "sr-only", children: "Search concepts" }),
5307
+ /* @__PURE__ */ jsx(
5308
+ "input",
5309
+ {
5310
+ id: searchId,
5311
+ type: "search",
5312
+ value: query,
5313
+ onChange: (event) => setQuery(event.target.value),
5314
+ placeholder: "Search concepts",
5315
+ autoComplete: "off",
5316
+ className: "h-10 w-full rounded-lg border border-border bg-background pl-9 pr-3 text-sm text-foreground shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
5317
+ }
5318
+ )
5319
+ ] }),
5320
+ /* @__PURE__ */ jsxs(
5321
+ "div",
5322
+ {
5323
+ role: "group",
5324
+ "aria-label": "Filter by category",
5325
+ className: "flex flex-wrap gap-2",
5326
+ children: [
5327
+ /* @__PURE__ */ jsx(
5328
+ FilterChip,
5329
+ {
5330
+ label: "All",
5331
+ category: "all",
5332
+ count: searched.length,
5333
+ active: activeCategory === null,
5334
+ onSelect: () => setActiveCategory(null)
5335
+ }
5336
+ ),
5337
+ groups.map((group) => /* @__PURE__ */ jsx(
5338
+ FilterChip,
5339
+ {
5340
+ label: group.name,
5341
+ category: group.name,
5342
+ count: countsByCategory.get(group.name) ?? 0,
5343
+ active: activeCategory === group.name,
5344
+ onSelect: () => setActiveCategory(
5345
+ (current) => current === group.name ? null : group.name
5346
+ )
5347
+ },
5348
+ group.anchor
5349
+ ))
5350
+ ]
5351
+ }
5352
+ ),
5353
+ /* @__PURE__ */ jsxs(
5354
+ "p",
5355
+ {
5356
+ "aria-live": "polite",
5357
+ className: filtering ? "text-sm text-muted-foreground" : "sr-only",
5358
+ children: [
5359
+ "Showing ",
5360
+ visibleTotal,
5361
+ " of ",
5362
+ ordered.length,
5363
+ " ",
5364
+ ordered.length === 1 ? "concept" : "concepts"
5365
+ ]
5366
+ }
5367
+ )
5368
+ ]
5369
+ }
5370
+ ),
5371
+ visibleTotal === 0 ? /* @__PURE__ */ jsxs(
5372
+ "div",
5373
+ {
5374
+ "data-concepts": "empty",
5375
+ className: "rounded-2xl border border-dashed border-border bg-muted/30 px-6 py-14 text-center",
5376
+ children: [
5377
+ /* @__PURE__ */ jsx(
5378
+ Search,
5379
+ {
5380
+ "aria-hidden": "true",
5381
+ className: "mx-auto h-8 w-8 text-muted-foreground"
5382
+ }
5383
+ ),
5384
+ /* @__PURE__ */ jsx("h2", { className: "mt-4 text-lg font-semibold text-foreground", children: "No concepts match your filters" }),
5385
+ /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: "Try a different search, or show every category." }),
5386
+ /* @__PURE__ */ jsx(
5387
+ "button",
5388
+ {
5389
+ type: "button",
5390
+ onClick: clearFilters,
5391
+ className: "mt-6 inline-flex items-center rounded-full border border-border bg-card px-4 py-2 text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5392
+ children: "Clear filters"
5393
+ }
5394
+ )
5395
+ ]
5396
+ }
5397
+ ) : /* @__PURE__ */ jsx("div", { className: "space-y-14", children: visibleGroups.map((group) => /* @__PURE__ */ jsxs("section", { "aria-labelledby": group.anchor, children: [
5398
+ /* @__PURE__ */ jsxs("div", { className: "max-w-3xl", children: [
5399
+ /* @__PURE__ */ jsx(
5400
+ "h2",
5401
+ {
5402
+ id: group.anchor,
5403
+ className: "scroll-mt-24 text-2xl font-semibold tracking-tight text-foreground",
5404
+ children: group.name
5405
+ }
5406
+ ),
5407
+ group.description ? /* @__PURE__ */ jsx("p", { className: "mt-2 leading-relaxed text-muted-foreground", children: group.description }) : null
5408
+ ] }),
5409
+ /* @__PURE__ */ jsx(
5410
+ "ul",
5411
+ {
5412
+ role: "list",
5413
+ className: "mt-6 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3",
5414
+ children: group.concepts.map((concept) => /* @__PURE__ */ jsx(
5415
+ "li",
5416
+ {
5417
+ "data-concepts": "card",
5418
+ "data-slug": concept.slug,
5419
+ children: /* @__PURE__ */ jsx(ConceptCard, { concept, Link })
5420
+ },
5421
+ concept.slug
5422
+ ))
5423
+ }
5424
+ )
5425
+ ] }, group.anchor)) })
5426
+ ] }) : (
5427
+ // Nothing published yet: no filter bar with an "All 0" chip, and no empty state
5428
+ // that blames filters the visitor never set.
5429
+ /* @__PURE__ */ jsxs(
5430
+ "div",
5431
+ {
5432
+ "data-concepts": "none",
5433
+ className: "mt-10 rounded-2xl border border-dashed border-border bg-muted/30 px-6 py-14 text-center",
5434
+ children: [
5435
+ /* @__PURE__ */ jsx(
5436
+ ImageIcon,
5437
+ {
5438
+ "aria-hidden": "true",
5439
+ className: "mx-auto h-8 w-8 text-muted-foreground"
5440
+ }
5441
+ ),
5442
+ /* @__PURE__ */ jsx("h2", { className: "mt-4 text-lg font-semibold text-foreground", children: "No concepts published yet" }),
5443
+ /* @__PURE__ */ jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: [
5444
+ productName,
5445
+ " concepts will appear here as they are published."
5446
+ ] })
5447
+ ]
5448
+ }
5449
+ )
5450
+ ) })
5451
+ ]
5452
+ }
5453
+ );
5454
+ }
5455
+ var SECTION_HEADING = "scroll-mt-24 text-2xl font-semibold tracking-tight text-foreground";
5456
+ var CHIP = "inline-flex items-center rounded-full border border-border bg-muted/50 px-3 py-1 text-sm text-foreground";
5457
+ function IllustrationFigure({
5458
+ image,
5459
+ onOpen
5460
+ }) {
5461
+ const portrait = isPortrait(image.width, image.height);
5462
+ return (
5463
+ // The block the llms extractor reads: title, image line, caption, description — in
5464
+ // that order and with nothing in between. The description sits outside <figure>
5465
+ // because a <figcaption> must be the figure's first or last child.
5466
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
5467
+ /* @__PURE__ */ jsxs("figure", { id: `illustration-${image.key}`, className: "scroll-mt-24", children: [
5468
+ /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-foreground", children: image.title }),
5469
+ /* @__PURE__ */ jsxs(
5470
+ "button",
5471
+ {
5472
+ type: "button",
5473
+ onClick: (event) => onOpen(event.currentTarget),
5474
+ "data-concepts": "illustration",
5475
+ className: cn(
5476
+ "group relative mt-3 block w-full overflow-hidden rounded-2xl border border-border shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5477
+ portrait ? "bg-muted p-4 sm:p-6" : "bg-muted"
5478
+ ),
5479
+ children: [
5480
+ /* @__PURE__ */ jsx(
5481
+ "img",
5482
+ {
5483
+ "data-llms-image": "",
5484
+ src: image.src,
5485
+ alt: image.alt,
5486
+ width: image.width,
5487
+ height: image.height,
5488
+ loading: "lazy",
5489
+ decoding: "async",
5490
+ className: "mx-auto block h-auto max-h-[80vh] w-auto max-w-full"
5491
+ }
5492
+ ),
5493
+ /* @__PURE__ */ jsx(IllustrationBadge, { className: "left-3 top-3" }),
5494
+ /* @__PURE__ */ jsx(
5495
+ "span",
5496
+ {
5497
+ "aria-hidden": "true",
5498
+ className: "absolute bottom-3 right-3 inline-flex h-8 w-8 items-center justify-center rounded-full border border-border bg-background/90 text-foreground shadow-sm transition-opacity group-hover:opacity-100 sm:opacity-80",
5499
+ children: /* @__PURE__ */ jsx(Maximize2, { className: "h-4 w-4" })
5500
+ }
5501
+ ),
5502
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Enlarge illustration" })
5503
+ ]
5504
+ }
5505
+ ),
5506
+ /* @__PURE__ */ jsx("figcaption", { className: "mt-3 text-sm font-medium text-foreground", children: image.caption })
5507
+ ] }),
5508
+ /* @__PURE__ */ jsx("p", { className: "leading-relaxed text-muted-foreground", children: image.description })
5509
+ ] })
5510
+ );
5511
+ }
5512
+ function ConceptDetailPage(props) {
5513
+ return /* @__PURE__ */ jsx(ConceptDetail, { ...props }, props.concept.slug);
5514
+ }
5515
+ function ConceptDetail({
5516
+ productName,
5517
+ siteUrl,
5518
+ concept,
5519
+ concepts,
5520
+ categories,
5521
+ cta,
5522
+ linkComponent,
5523
+ className
5524
+ }) {
5525
+ const Link = linkComponent ?? DefaultConceptLink;
5526
+ const base = normaliseSiteUrl(siteUrl);
5527
+ const headingId = useId();
5528
+ const ordered = useMemo(() => sortByOrder(concepts), [concepts]);
5529
+ const position = ordered.findIndex((item) => item.slug === concept.slug);
5530
+ const previous = position > 0 ? ordered[position - 1] : void 0;
5531
+ const next = position >= 0 && position < ordered.length - 1 ? ordered[position + 1] : void 0;
5532
+ const related = useMemo(() => {
5533
+ const bySlug = new Map(ordered.map((item) => [item.slug, item]));
5534
+ const curated = [...new Set(concept.related)].map((slug) => bySlug.get(slug)).filter(
5535
+ (item) => item !== void 0 && item.slug !== concept.slug
5536
+ );
5537
+ const list = curated.length > 0 ? curated : ordered.filter(
5538
+ (item) => item.category === concept.category && item.slug !== concept.slug
5539
+ );
5540
+ return list.slice(0, RELATED_LIMIT);
5541
+ }, [concept, ordered]);
5542
+ const relatedIsCurated = concept.related.some(
5543
+ (slug) => related.some((item) => item.slug === slug)
5544
+ );
5545
+ const categoryDescription = categories?.find(
5546
+ (category) => category.name === concept.category
5547
+ )?.description;
5548
+ const [lightboxIndex, setLightboxIndex] = useState(null);
5549
+ const triggerRef = useRef(null);
5550
+ const openLightbox = useCallback((index, trigger) => {
5551
+ triggerRef.current = trigger;
5552
+ setLightboxIndex(index);
5553
+ }, []);
5554
+ const closeLightbox = useCallback(() => setLightboxIndex(null), []);
5555
+ useEffect(() => {
5556
+ if (lightboxIndex !== null) return;
5557
+ const trigger = triggerRef.current;
5558
+ if (!trigger) return;
5559
+ triggerRef.current = null;
5560
+ if (trigger.isConnected) trigger.focus();
5561
+ }, [lightboxIndex]);
5562
+ const canonical = absoluteUrl(base, conceptPath(concept.slug));
5563
+ const hero = concept.images[0];
5564
+ const imageTotal = concept.images.length;
5565
+ const structuredData = useMemo(
5566
+ () => [
5567
+ {
5568
+ "@context": "https://schema.org",
5569
+ "@type": "ImageGallery",
5570
+ name: concept.title,
5571
+ description: concept.metaDescription,
5572
+ url: canonical,
5573
+ keywords: concept.keywords.join(", "),
5574
+ about: { "@type": "Thing", name: productName },
5575
+ image: concept.images.map((image) => ({
5576
+ "@type": "ImageObject",
5577
+ contentUrl: absoluteUrl(base, image.src),
5578
+ thumbnailUrl: absoluteUrl(base, image.thumb),
5579
+ name: image.title,
5580
+ caption: image.caption,
5581
+ description: image.description,
5582
+ width: image.width,
5583
+ height: image.height
5584
+ }))
5585
+ },
5586
+ {
5587
+ "@context": "https://schema.org",
5588
+ "@type": "BreadcrumbList",
5589
+ itemListElement: [
5590
+ { "@type": "ListItem", position: 1, name: "Home", item: `${base}/` },
5591
+ {
5592
+ "@type": "ListItem",
5593
+ position: 2,
5594
+ name: "Concepts",
5595
+ item: `${base}${CONCEPTS_PATH}`
5596
+ },
5597
+ {
5598
+ "@type": "ListItem",
5599
+ position: 3,
5600
+ name: concept.title,
5601
+ item: canonical
5602
+ }
5603
+ ]
5604
+ }
5605
+ ],
5606
+ [base, canonical, concept, productName]
5607
+ );
5608
+ return /* @__PURE__ */ jsxs(
5609
+ "article",
5610
+ {
5611
+ "data-concepts": "detail",
5612
+ "data-slug": concept.slug,
5613
+ "aria-labelledby": headingId,
5614
+ className: cn("bg-background text-foreground", className),
5615
+ children: [
5616
+ /* @__PURE__ */ jsx(
5617
+ PageHead,
5618
+ {
5619
+ title: `${concept.title} \u2014 Concept`,
5620
+ description: concept.metaDescription,
5621
+ productName,
5622
+ keywords: concept.keywords.join(", "),
5623
+ image: hero ? absoluteUrl(base, hero.src) : void 0,
5624
+ url: canonical,
5625
+ structuredData
5626
+ }
5627
+ ),
5628
+ /* @__PURE__ */ jsx("header", { className: "border-b border-border bg-muted/30", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl px-4 pb-10 pt-8 sm:px-6 lg:px-8", children: [
5629
+ /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsxs("ol", { className: "flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground", children: [
5630
+ /* @__PURE__ */ jsxs("li", { className: "inline-flex items-center gap-1.5", children: [
5631
+ /* @__PURE__ */ jsx(
5632
+ Link,
5633
+ {
5634
+ href: "/",
5635
+ className: "rounded hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5636
+ children: "Home"
5637
+ }
5638
+ ),
5639
+ /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "h-3.5 w-3.5" })
5640
+ ] }),
5641
+ /* @__PURE__ */ jsxs("li", { className: "inline-flex items-center gap-1.5", children: [
5642
+ /* @__PURE__ */ jsx(
5643
+ Link,
5644
+ {
5645
+ href: CONCEPTS_PATH,
5646
+ className: "rounded hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5647
+ children: "Concepts"
5648
+ }
5649
+ ),
5650
+ /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "h-3.5 w-3.5" })
5651
+ ] }),
5652
+ /* @__PURE__ */ jsx(
5653
+ "li",
5654
+ {
5655
+ "aria-current": "page",
5656
+ className: "min-w-0 truncate text-foreground",
5657
+ children: concept.title
5658
+ }
5659
+ )
5660
+ ] }) }),
5661
+ /* @__PURE__ */ jsxs("div", { className: "mt-6 flex flex-wrap items-center gap-2", children: [
5662
+ /* @__PURE__ */ jsx(
5663
+ "span",
5664
+ {
5665
+ "data-concepts": "category",
5666
+ title: categoryDescription,
5667
+ className: "inline-flex items-center rounded-full border border-primary/30 bg-primary/10 px-3 py-1 text-xs font-semibold text-primary",
5668
+ children: concept.category
5669
+ }
5670
+ ),
5671
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-3 py-1 text-xs font-medium text-muted-foreground", children: [
5672
+ /* @__PURE__ */ jsx(ImageIcon, { "aria-hidden": "true", className: "h-3.5 w-3.5" }),
5673
+ illustrationCount(imageTotal)
5674
+ ] })
5675
+ ] }),
5676
+ /* @__PURE__ */ jsx(
5677
+ "h1",
5678
+ {
5679
+ id: headingId,
5680
+ className: "mt-4 max-w-4xl text-3xl font-bold tracking-tight text-foreground sm:text-4xl lg:text-5xl",
5681
+ children: concept.title
5682
+ }
5683
+ ),
5684
+ /* @__PURE__ */ jsx("p", { className: "mt-4 max-w-3xl text-lg leading-relaxed text-muted-foreground", children: concept.tagline }),
5685
+ /* @__PURE__ */ jsx(IllustrationNotice, { className: "mt-6 max-w-3xl" })
5686
+ ] }) }),
5687
+ hero ? /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-6xl px-4 pt-10 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsx("figure", { "data-concepts": "hero", children: /* @__PURE__ */ jsxs(
5688
+ "button",
5689
+ {
5690
+ type: "button",
5691
+ onClick: (event) => openLightbox(0, event.currentTarget),
5692
+ className: cn(
5693
+ "group relative block w-full overflow-hidden rounded-2xl border border-border bg-muted shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5694
+ isPortrait(hero.width, hero.height) && "p-4 sm:p-6"
5695
+ ),
5696
+ children: [
5697
+ /* @__PURE__ */ jsx(
5698
+ "img",
5699
+ {
5700
+ src: hero.src,
5701
+ alt: hero.alt,
5702
+ width: hero.width,
5703
+ height: hero.height,
5704
+ loading: "eager",
5705
+ ...HERO_FETCH_PRIORITY,
5706
+ className: "mx-auto block h-auto max-h-[75vh] w-auto max-w-full"
5707
+ }
5708
+ ),
5709
+ /* @__PURE__ */ jsx(IllustrationBadge, { className: "left-3 top-3" }),
5710
+ /* @__PURE__ */ jsxs(
5711
+ "span",
5712
+ {
5713
+ "aria-hidden": "true",
5714
+ className: "absolute bottom-3 right-3 inline-flex items-center gap-1.5 rounded-full border border-border bg-background/90 px-3 py-1 text-xs font-medium text-foreground shadow-sm",
5715
+ children: [
5716
+ /* @__PURE__ */ jsx(Maximize2, { className: "h-3.5 w-3.5" }),
5717
+ "Enlarge"
5718
+ ]
5719
+ }
5720
+ ),
5721
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Enlarge illustration" })
5722
+ ]
5723
+ }
5724
+ ) }) }) : null,
5725
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl px-4 py-14 sm:px-6 lg:px-8", children: [
5726
+ /* @__PURE__ */ jsxs("div", { className: "max-w-3xl space-y-12", children: [
5727
+ concept.overview.length > 0 ? /* @__PURE__ */ jsxs("section", { "aria-labelledby": `${headingId}-overview`, children: [
5728
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-overview`, className: SECTION_HEADING, children: "Overview" }),
5729
+ /* @__PURE__ */ jsx("div", { className: "mt-4 space-y-4 text-base leading-relaxed text-foreground", children: concept.overview.map((paragraph, index) => /* @__PURE__ */ jsx("p", { children: paragraph }, copyKey(index, paragraph))) })
5730
+ ] }) : null,
5731
+ concept.highlights.length > 0 ? /* @__PURE__ */ jsxs("section", { "aria-labelledby": `${headingId}-highlights`, children: [
5732
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-highlights`, className: SECTION_HEADING, children: "What this concept shows" }),
5733
+ /* @__PURE__ */ jsx("ul", { role: "list", className: "mt-4 space-y-3", children: concept.highlights.map((highlight, index) => /* @__PURE__ */ jsxs(
5734
+ "li",
5735
+ {
5736
+ className: "flex items-start gap-3 leading-relaxed text-foreground",
5737
+ children: [
5738
+ /* @__PURE__ */ jsx(
5739
+ "span",
5740
+ {
5741
+ "aria-hidden": "true",
5742
+ className: "mt-0.5 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary",
5743
+ children: /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5" })
5744
+ }
5745
+ ),
5746
+ /* @__PURE__ */ jsx("span", { children: highlight })
5747
+ ]
5748
+ },
5749
+ copyKey(index, highlight)
5750
+ )) })
5751
+ ] }) : null,
5752
+ concept.workflow.length > 0 ? /* @__PURE__ */ jsxs("section", { "aria-labelledby": `${headingId}-workflow`, children: [
5753
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-workflow`, className: SECTION_HEADING, children: "How it works" }),
5754
+ /* @__PURE__ */ jsx("ol", { role: "list", className: "mt-4 space-y-4", children: concept.workflow.map((step, index) => /* @__PURE__ */ jsxs(
5755
+ "li",
5756
+ {
5757
+ className: "flex items-start gap-4",
5758
+ children: [
5759
+ /* @__PURE__ */ jsx(
5760
+ "span",
5761
+ {
5762
+ "aria-hidden": "true",
5763
+ className: "inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full border border-border bg-card text-sm font-semibold tabular-nums text-foreground",
5764
+ children: index + 1
5765
+ }
5766
+ ),
5767
+ /* @__PURE__ */ jsx("span", { className: "pt-0.5 leading-relaxed text-foreground", children: step })
5768
+ ]
5769
+ },
5770
+ copyKey(index, step)
5771
+ )) })
5772
+ ] }) : null,
5773
+ concept.audience.length > 0 ? /* @__PURE__ */ jsxs("section", { "aria-labelledby": `${headingId}-audience`, children: [
5774
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-audience`, className: SECTION_HEADING, children: "Who it's for" }),
5775
+ /* @__PURE__ */ jsx("ul", { role: "list", className: "mt-4 flex flex-wrap gap-2", children: concept.audience.map((who, index) => /* @__PURE__ */ jsx("li", { className: CHIP, children: who }, copyKey(index, who))) })
5776
+ ] }) : null
5777
+ ] }),
5778
+ imageTotal > 0 ? /* @__PURE__ */ jsxs(
5779
+ "section",
5780
+ {
5781
+ "aria-labelledby": `${headingId}-illustrations`,
5782
+ className: "mt-16",
5783
+ children: [
5784
+ /* @__PURE__ */ jsxs("div", { className: "max-w-3xl", children: [
5785
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-illustrations`, className: SECTION_HEADING, children: "Illustrations" }),
5786
+ /* @__PURE__ */ jsxs("p", { className: "mt-2 text-muted-foreground", children: [
5787
+ illustrationCount(imageTotal),
5788
+ " of this concept. Select one to view it full size."
5789
+ ] })
5790
+ ] }),
5791
+ /* @__PURE__ */ jsx("div", { className: "mt-8 space-y-14", children: concept.images.map((image, index) => /* @__PURE__ */ jsx(
5792
+ IllustrationFigure,
5793
+ {
5794
+ image,
5795
+ onOpen: (trigger) => openLightbox(index, trigger)
5796
+ },
5797
+ image.key
5798
+ )) })
5799
+ ]
5800
+ }
5801
+ ) : null,
5802
+ concept.keywords.length > 0 ? /* @__PURE__ */ jsxs("section", { "aria-labelledby": `${headingId}-topics`, className: "mt-16", children: [
5803
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-topics`, className: SECTION_HEADING, children: "Topics" }),
5804
+ /* @__PURE__ */ jsx("ul", { role: "list", className: "mt-4 flex flex-wrap gap-2", children: concept.keywords.map((keyword, index) => /* @__PURE__ */ jsx("li", { className: CHIP, children: keyword }, copyKey(index, keyword))) })
5805
+ ] }) : null,
5806
+ related.length > 0 ? /* @__PURE__ */ jsxs(
5807
+ "section",
5808
+ {
5809
+ "aria-labelledby": `${headingId}-related`,
5810
+ "data-concepts": "related",
5811
+ className: "mt-16",
5812
+ children: [
5813
+ /* @__PURE__ */ jsx("h2", { id: `${headingId}-related`, className: SECTION_HEADING, children: relatedIsCurated ? "Related concepts" : `More in ${concept.category}` }),
5814
+ /* @__PURE__ */ jsx(
5815
+ "ul",
5816
+ {
5817
+ role: "list",
5818
+ className: cn(
5819
+ "mt-6 grid grid-cols-1 gap-5 sm:grid-cols-2",
5820
+ related.length >= 4 ? "lg:grid-cols-4" : "lg:grid-cols-3"
5821
+ ),
5822
+ children: related.map((item) => /* @__PURE__ */ jsx("li", { "data-concepts": "card", "data-slug": item.slug, children: /* @__PURE__ */ jsx(ConceptCard, { concept: item, Link }) }, item.slug))
5823
+ }
5824
+ )
5825
+ ]
5826
+ }
5827
+ ) : null,
5828
+ previous || next ? /* @__PURE__ */ jsxs(
5829
+ "nav",
5830
+ {
5831
+ "aria-label": "Previous and next concepts",
5832
+ "data-concepts": "pager",
5833
+ className: "mt-16 grid gap-4 sm:grid-cols-2",
5834
+ children: [
5835
+ previous ? /* @__PURE__ */ jsxs(
5836
+ Link,
5837
+ {
5838
+ href: conceptPath(previous.slug),
5839
+ className: "group flex items-center gap-3 rounded-2xl border border-border bg-card p-4 text-card-foreground transition-colors hover:border-primary/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5840
+ children: [
5841
+ /* @__PURE__ */ jsx(
5842
+ ArrowLeft,
5843
+ {
5844
+ "aria-hidden": "true",
5845
+ className: "h-5 w-5 shrink-0 text-muted-foreground transition-colors group-hover:text-primary"
5846
+ }
5847
+ ),
5848
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
5849
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Previous concept" }),
5850
+ /* @__PURE__ */ jsx("span", { className: "block truncate font-semibold", children: previous.title })
5851
+ ] })
5852
+ ]
5853
+ }
5854
+ ) : /* @__PURE__ */ jsx("span", { className: "hidden sm:block" }),
5855
+ next ? /* @__PURE__ */ jsxs(
5856
+ Link,
5857
+ {
5858
+ href: conceptPath(next.slug),
5859
+ className: "group flex items-center justify-end gap-3 rounded-2xl border border-border bg-card p-4 text-right text-card-foreground transition-colors hover:border-primary/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5860
+ children: [
5861
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
5862
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Next concept" }),
5863
+ /* @__PURE__ */ jsx("span", { className: "block truncate font-semibold", children: next.title })
5864
+ ] }),
5865
+ /* @__PURE__ */ jsx(
5866
+ ArrowRight,
5867
+ {
5868
+ "aria-hidden": "true",
5869
+ className: "h-5 w-5 shrink-0 text-muted-foreground transition-colors group-hover:text-primary"
5870
+ }
5871
+ )
5872
+ ]
5873
+ }
5874
+ ) : null
5875
+ ]
5876
+ }
5877
+ ) : null,
5878
+ /* @__PURE__ */ jsx("div", { className: "mt-10", children: /* @__PURE__ */ jsxs(
5879
+ Link,
5880
+ {
5881
+ href: CONCEPTS_PATH,
5882
+ className: "inline-flex items-center gap-2 rounded text-sm font-medium text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
5883
+ children: [
5884
+ /* @__PURE__ */ jsx(ArrowLeft, { "aria-hidden": "true", className: "h-4 w-4" }),
5885
+ "All ",
5886
+ productName,
5887
+ " concepts"
5888
+ ]
5889
+ }
5890
+ ) })
5891
+ ] }),
5892
+ cta ? /* @__PURE__ */ jsx(
5893
+ "section",
5894
+ {
5895
+ "data-concepts": "cta",
5896
+ className: "border-t border-border bg-muted/30",
5897
+ children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-6xl flex-wrap items-center gap-4 px-4 py-12 sm:px-6 lg:px-8", children: cta })
5898
+ }
5899
+ ) : null,
5900
+ lightboxIndex !== null ? /* @__PURE__ */ jsx(
5901
+ ConceptLightbox,
5902
+ {
5903
+ images: concept.images,
5904
+ index: lightboxIndex,
5905
+ conceptTitle: concept.title,
5906
+ onIndexChange: setLightboxIndex,
5907
+ onClose: closeLightbox
5908
+ }
5909
+ ) : null
5910
+ ]
5911
+ }
5912
+ );
5913
+ }
5914
+
5915
+ // src/components/explore-i18n.ts
5916
+ var EXPLORE_LOCALES = ["en", "zh", "hi", "es", "ar", "ta"];
5917
+ var RTL_LOCALES = /* @__PURE__ */ new Set(["ar"]);
5918
+ function isRtlLocale(locale) {
5919
+ return RTL_LOCALES.has(locale);
5920
+ }
5921
+ var EN = {
5922
+ badge: "AI answers, grounded in our documentation",
5923
+ welcomeTitle: "Ask anything about our products",
5924
+ welcomeBody: "Describe what you are trying to do and I will point you at the product, the page and the next step.",
5925
+ tryAsking: "Try asking",
5926
+ focusProduct: "Focus on a product",
5927
+ allProducts: "All products",
5928
+ showAll: "All",
5929
+ showLess: "Show less",
5930
+ sources: "Sources",
5931
+ nextYouCouldAsk: "Next you could ask",
5932
+ placeholder: "Ask anything about our products\u2026",
5933
+ placeholderProduct: "Ask about {product}\u2026",
5934
+ send: "Send",
5935
+ stop: "Stop",
5936
+ newChat: "New chat",
5937
+ history: "History",
5938
+ clearHistory: "Clear history",
5939
+ share: "Share",
5940
+ copied: "Copied",
5941
+ copying: "Copying\u2026",
5942
+ shareUnavailable: "Unavailable",
5943
+ disclaimer: "Disclaimer",
5944
+ disclaimerShort: "Grounded in our docs \u2014 check anything important.",
5945
+ dictate: "Dictate your question",
5946
+ stopDictating: "Stop dictating",
5947
+ attach: "Attach files",
5948
+ attachHint: "Up to {{max}} files, {{size}} MB each",
5949
+ removeAttachment: "Remove {{name}}",
5950
+ attachmentNameOnly: "name and type only",
5951
+ attachmentTooLarge: "{{name}} is larger than {{size}} MB and was not attached.",
5952
+ attachmentTooMany: "Only {{max}} files can be attached, so {{name}} was skipped.",
5953
+ noAnswer: "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
5954
+ answerDidNotArrive: "That answer didn't come through. Try asking again.",
5955
+ askHuman: "ask a human",
5956
+ prevSuggestion: "Previous suggestion",
5957
+ nextSuggestion: "Next suggestion",
5958
+ conceptIllustration: "Concept illustration",
5959
+ opensInNewTab: "opens in a new tab",
5960
+ capabilities: [
5961
+ "Grounded in our own docs",
5962
+ "Compare across the ecosystem",
5963
+ "Straight to the right page"
5964
+ ],
5965
+ prompts: [
5966
+ "What does this product actually do?",
5967
+ "Which product fits my team?",
5968
+ "How do I get started, step by step?",
5969
+ "How much does it cost?"
5970
+ ]
5971
+ };
5972
+ var ZH = {
5973
+ badge: "\u57FA\u4E8E\u6211\u4EEC\u6587\u6863\u7684 AI \u56DE\u7B54",
5974
+ welcomeTitle: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE",
5975
+ welcomeBody: "\u63CF\u8FF0\u4F60\u60F3\u505A\u7684\u4E8B\uFF0C\u6211\u4F1A\u4E3A\u4F60\u6307\u51FA\u5BF9\u5E94\u7684\u4EA7\u54C1\u3001\u9875\u9762\u548C\u4E0B\u4E00\u6B65\u3002",
5976
+ tryAsking: "\u8BD5\u7740\u95EE",
5977
+ focusProduct: "\u805A\u7126\u67D0\u4E2A\u4EA7\u54C1",
5978
+ allProducts: "\u5168\u90E8\u4EA7\u54C1",
5979
+ showAll: "\u5168\u90E8",
5980
+ showLess: "\u6536\u8D77",
5981
+ sources: "\u6765\u6E90",
5982
+ nextYouCouldAsk: "\u4F60\u8FD8\u53EF\u4EE5\u95EE",
5983
+ placeholder: "\u5173\u4E8E\u6211\u4EEC\u7684\u4EA7\u54C1\uFF0C\u968F\u4FBF\u95EE\u2026",
5984
+ placeholderProduct: "\u8BE2\u95EE\u5173\u4E8E {product} \u7684\u95EE\u9898\u2026",
5985
+ send: "\u53D1\u9001",
5986
+ stop: "\u505C\u6B62",
5987
+ newChat: "\u65B0\u5BF9\u8BDD",
5988
+ history: "\u5386\u53F2",
5989
+ clearHistory: "\u6E05\u9664\u5386\u53F2",
5990
+ share: "\u5206\u4EAB",
5991
+ copied: "\u5DF2\u590D\u5236",
5992
+ copying: "\u590D\u5236\u4E2D\u2026",
5993
+ shareUnavailable: "\u4E0D\u53EF\u7528",
5994
+ disclaimer: "\u514D\u8D23\u58F0\u660E",
5995
+ disclaimerShort: "\u5185\u5BB9\u57FA\u4E8E\u6211\u4EEC\u7684\u6587\u6863\uFF0C\u91CD\u8981\u4FE1\u606F\u8BF7\u81EA\u884C\u6838\u5BF9\u3002",
5996
+ dictate: "\u8BED\u97F3\u8F93\u5165",
5997
+ stopDictating: "\u505C\u6B62\u8BED\u97F3\u8F93\u5165",
5998
+ attach: "\u6DFB\u52A0\u6587\u4EF6",
5999
+ attachHint: "\u6700\u591A {{max}} \u4E2A\u6587\u4EF6\uFF0C\u6BCF\u4E2A\u4E0D\u8D85\u8FC7 {{size}} MB",
6000
+ removeAttachment: "\u79FB\u9664 {{name}}",
6001
+ attachmentNameOnly: "\u4EC5\u6587\u4EF6\u540D\u548C\u7C7B\u578B",
6002
+ attachmentTooLarge: "{{name}} \u8D85\u8FC7 {{size}} MB\uFF0C\u672A\u80FD\u6DFB\u52A0\u3002",
6003
+ attachmentTooMany: "\u6700\u591A\u53EA\u80FD\u6DFB\u52A0 {{max}} \u4E2A\u6587\u4EF6\uFF0C\u5DF2\u8DF3\u8FC7 {{name}}\u3002",
6004
+ 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",
6005
+ answerDidNotArrive: "\u8FD9\u6761\u56DE\u7B54\u6CA1\u6709\u8FD4\u56DE\u3002\u8BF7\u518D\u95EE\u4E00\u6B21\u3002",
6006
+ askHuman: "\u8054\u7CFB\u6211\u4EEC",
6007
+ prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
6008
+ nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
6009
+ conceptIllustration: "\u6982\u5FF5\u793A\u610F\u56FE",
6010
+ opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
6011
+ capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
6012
+ prompts: [
6013
+ "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
6014
+ "\u54EA\u4E2A\u4EA7\u54C1\u9002\u5408\u6211\u7684\u56E2\u961F\uFF1F",
6015
+ "\u5982\u4F55\u4E00\u6B65\u6B65\u5F00\u59CB\u4F7F\u7528\uFF1F",
6016
+ "\u4EF7\u683C\u662F\u591A\u5C11\uFF1F"
6017
+ ]
6018
+ };
6019
+ var HI = {
6020
+ badge: "\u0939\u092E\u093E\u0930\u0947 \u0926\u0938\u094D\u0924\u093E\u0935\u0947\u091C\u093C\u094B\u0902 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 AI \u0909\u0924\u094D\u0924\u0930",
6021
+ welcomeTitle: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902",
6022
+ welcomeBody: "\u092C\u0924\u093E\u0907\u090F \u0906\u092A \u0915\u094D\u092F\u093E \u0915\u0930\u0928\u093E \u091A\u093E\u0939\u0924\u0947 \u0939\u0948\u0902, \u0914\u0930 \u092E\u0948\u0902 \u0906\u092A\u0915\u094B \u0938\u0939\u0940 \u0909\u0924\u094D\u092A\u093E\u0926, \u092A\u0947\u091C \u0914\u0930 \u0905\u0917\u0932\u093E \u0915\u0926\u092E \u092C\u0924\u093E\u090A\u0901\u0917\u093E\u0964",
6023
+ tryAsking: "\u092F\u0939 \u092A\u0942\u091B\u0915\u0930 \u0926\u0947\u0916\u0947\u0902",
6024
+ focusProduct: "\u0915\u093F\u0938\u0940 \u0909\u0924\u094D\u092A\u093E\u0926 \u092A\u0930 \u0927\u094D\u092F\u093E\u0928 \u0926\u0947\u0902",
6025
+ allProducts: "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926",
6026
+ showAll: "\u0938\u092D\u0940",
6027
+ showLess: "\u0915\u092E \u0926\u093F\u0916\u093E\u090F\u0901",
6028
+ sources: "\u0938\u094D\u0930\u094B\u0924",
6029
+ nextYouCouldAsk: "\u0906\u0917\u0947 \u0906\u092A \u092A\u0942\u091B \u0938\u0915\u0924\u0947 \u0939\u0948\u0902",
6030
+ placeholder: "\u0939\u092E\u093E\u0930\u0947 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u0915\u0941\u091B \u092D\u0940 \u092A\u0942\u091B\u0947\u0902\u2026",
6031
+ placeholderProduct: "{product} \u0915\u0947 \u092C\u093E\u0930\u0947 \u092E\u0947\u0902 \u092A\u0942\u091B\u0947\u0902\u2026",
6032
+ send: "\u092D\u0947\u091C\u0947\u0902",
6033
+ stop: "\u0930\u094B\u0915\u0947\u0902",
6034
+ newChat: "\u0928\u0908 \u092C\u093E\u0924\u091A\u0940\u0924",
6035
+ history: "\u0907\u0924\u093F\u0939\u093E\u0938",
6036
+ clearHistory: "\u0907\u0924\u093F\u0939\u093E\u0938 \u092E\u093F\u091F\u093E\u090F\u0901",
6037
+ share: "\u0938\u093E\u091D\u093E \u0915\u0930\u0947\u0902",
6038
+ copied: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0917\u092F\u093E",
6039
+ copying: "\u0915\u0949\u092A\u0940 \u0939\u094B \u0930\u0939\u093E \u0939\u0948\u2026",
6040
+ shareUnavailable: "\u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902",
6041
+ disclaimer: "\u0905\u0938\u094D\u0935\u0940\u0915\u0930\u0923",
6042
+ 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",
6043
+ dictate: "\u092C\u094B\u0932\u0915\u0930 \u092A\u0942\u091B\u0947\u0902",
6044
+ stopDictating: "\u092C\u094B\u0932\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6045
+ attach: "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
6046
+ 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",
6047
+ removeAttachment: "{{name}} \u0939\u091F\u093E\u090F\u0901",
6048
+ attachmentNameOnly: "\u0915\u0947\u0935\u0932 \u0928\u093E\u092E \u0914\u0930 \u092A\u094D\u0930\u0915\u093E\u0930",
6049
+ 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",
6050
+ 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",
6051
+ 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",
6052
+ answerDidNotArrive: "\u0935\u0939 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0906 \u0938\u0915\u093E\u0964 \u0915\u0943\u092A\u092F\u093E \u0926\u094B\u092C\u093E\u0930\u093E \u092A\u0942\u091B\u0947\u0902\u0964",
6053
+ askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
6054
+ prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
6055
+ nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
6056
+ conceptIllustration: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u091A\u093F\u0924\u094D\u0930\u0923",
6057
+ opensInNewTab: "\u0928\u090F \u091F\u0948\u092C \u092E\u0947\u0902 \u0916\u0941\u0932\u0924\u093E \u0939\u0948",
6058
+ capabilities: [
6059
+ "\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",
6060
+ "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
6061
+ "\u0938\u0940\u0927\u0947 \u0938\u0939\u0940 \u092A\u0947\u091C \u092A\u0930"
6062
+ ],
6063
+ prompts: [
6064
+ "\u092F\u0939 \u0909\u0924\u094D\u092A\u093E\u0926 \u0905\u0938\u0932 \u092E\u0947\u0902 \u0915\u094D\u092F\u093E \u0915\u0930\u0924\u093E \u0939\u0948?",
6065
+ "\u092E\u0947\u0930\u0940 \u091F\u0940\u092E \u0915\u0947 \u0932\u093F\u090F \u0915\u094C\u0928 \u0938\u093E \u0909\u0924\u094D\u092A\u093E\u0926 \u0938\u0939\u0940 \u0939\u0948?",
6066
+ "\u0936\u0941\u0930\u0941\u0906\u0924 \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902, \u091A\u0930\u0923 \u0926\u0930 \u091A\u0930\u0923?",
6067
+ "\u0907\u0938\u0915\u0940 \u0915\u0940\u092E\u0924 \u0915\u093F\u0924\u0928\u0940 \u0939\u0948?"
6068
+ ]
6069
+ };
6070
+ var ES = {
6071
+ badge: "Respuestas de IA basadas en nuestra documentaci\xF3n",
6072
+ welcomeTitle: "Pregunta lo que quieras sobre nuestros productos",
6073
+ welcomeBody: "Cu\xE9ntame qu\xE9 necesitas hacer y te indicar\xE9 el producto, la p\xE1gina y el siguiente paso.",
6074
+ tryAsking: "Prueba a preguntar",
6075
+ focusProduct: "Centrarse en un producto",
6076
+ allProducts: "Todos los productos",
6077
+ showAll: "Todos",
6078
+ showLess: "Ver menos",
6079
+ sources: "Fuentes",
6080
+ nextYouCouldAsk: "Tambi\xE9n puedes preguntar",
6081
+ placeholder: "Pregunta lo que quieras sobre nuestros productos\u2026",
6082
+ placeholderProduct: "Pregunta sobre {product}\u2026",
6083
+ send: "Enviar",
6084
+ stop: "Detener",
6085
+ newChat: "Nueva conversaci\xF3n",
6086
+ history: "Historial",
6087
+ clearHistory: "Borrar historial",
6088
+ share: "Compartir",
4904
6089
  copied: "Copiado",
4905
6090
  copying: "Copiando\u2026",
4906
6091
  shareUnavailable: "No disponible",
@@ -4915,9 +6100,12 @@ var ES = {
4915
6100
  attachmentTooLarge: "{{name}} supera los {{size}} MB y no se adjunt\xF3.",
4916
6101
  attachmentTooMany: "Solo se pueden adjuntar {{max}} archivos, as\xED que se omiti\xF3 {{name}}.",
4917
6102
  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",
6103
+ answerDidNotArrive: "Esa respuesta no lleg\xF3. Int\xE9ntalo de nuevo.",
4918
6104
  askHuman: "habla con una persona",
4919
6105
  prevSuggestion: "Sugerencia anterior",
4920
6106
  nextSuggestion: "Sugerencia siguiente",
6107
+ conceptIllustration: "Ilustraci\xF3n del concepto",
6108
+ opensInNewTab: "se abre en una pesta\xF1a nueva",
4921
6109
  capabilities: [
4922
6110
  "Basado en nuestra documentaci\xF3n",
4923
6111
  "Compara todo el ecosistema",
@@ -4963,9 +6151,12 @@ var AR = {
4963
6151
  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
6152
  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
6153
  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",
6154
+ answerDidNotArrive: "\u0644\u0645 \u062A\u0635\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629. \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649.",
4966
6155
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
4967
6156
  prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
4968
6157
  nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
6158
+ conceptIllustration: "\u0631\u0633\u0645 \u062A\u0648\u0636\u064A\u062D\u064A \u0644\u0644\u0645\u0641\u0647\u0648\u0645",
6159
+ opensInNewTab: "\u064A\u064F\u0641\u062A\u062D \u0641\u064A \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u062C\u062F\u064A\u062F\u0629",
4969
6160
  capabilities: [
4970
6161
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
4971
6162
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -5011,9 +6202,12 @@ var TA = {
5011
6202
  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
6203
  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
6204
  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",
6205
+ answerDidNotArrive: "\u0B85\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0BB5\u0BB0\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8. \u0BAE\u0BC0\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD \u0B95\u0BC7\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0BBE\u0BB0\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD.",
5014
6206
  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
6207
  prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
5016
6208
  nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
6209
+ conceptIllustration: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BB5\u0BBF\u0BB3\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BAE\u0BCD",
6210
+ opensInNewTab: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0BA4\u0BBE\u0BB5\u0BB2\u0BBF\u0BB2\u0BCD \u0BA4\u0BBF\u0BB1\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD",
5017
6211
  capabilities: [
5018
6212
  "\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
6213
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -5372,10 +6566,13 @@ var ECOSYSTEM_PRODUCTS = [
5372
6566
  name: "VibeControls",
5373
6567
  websiteUrl: "https://vibecontrols.com"
5374
6568
  },
6569
+ // FluidGrids ships on www.fluidgrids.ai — fluidgrids.com only redirects there. The explore
6570
+ // catalog and the site's own sitemap use this origin, and so must the fallback catalog
6571
+ // built from this list, or /explore rejects FluidGrids concept images until it loads.
5375
6572
  {
5376
6573
  slug: "fluidgrids",
5377
6574
  name: "FluidGrids",
5378
- websiteUrl: "https://fluidgrids.com"
6575
+ websiteUrl: "https://www.fluidgrids.ai"
5379
6576
  },
5380
6577
  // Botlit ships on botlit.ai — botlit.com does not resolve.
5381
6578
  { slug: "botlit", name: "Botlit", websiteUrl: "https://www.botlit.ai" },
@@ -5626,7 +6823,7 @@ var DEFAULT_EXPLORE_EXAMPLE_PROMPTS = [
5626
6823
  ];
5627
6824
  var FALLBACK_WELCOME_TITLE = "Ask anything about our products";
5628
6825
  var FALLBACK_WELCOME_BODY = "Get straight answers drawn from our product documentation and public pages \u2014 with links back to the exact page each answer came from.";
5629
- function buildFallbackCatalog(examplePrompts) {
6826
+ function buildFallbackCatalog(examplePrompts, welcome) {
5630
6827
  return {
5631
6828
  enabled: true,
5632
6829
  products: ECOSYSTEM_PRODUCTS.map((p) => ({
@@ -5636,8 +6833,8 @@ function buildFallbackCatalog(examplePrompts) {
5636
6833
  website: p.websiteUrl
5637
6834
  })),
5638
6835
  examplePrompts: examplePrompts?.length ? examplePrompts : DEFAULT_EXPLORE_EXAMPLE_PROMPTS,
5639
- welcomeTitle: FALLBACK_WELCOME_TITLE,
5640
- welcomeBody: FALLBACK_WELCOME_BODY,
6836
+ welcomeTitle: welcome?.title ?? FALLBACK_WELCOME_TITLE,
6837
+ welcomeBody: welcome?.body ?? FALLBACK_WELCOME_BODY,
5641
6838
  limits: FALLBACK_EXPLORE_LIMITS,
5642
6839
  captchaRequired: false,
5643
6840
  recaptchaSiteKey: null
@@ -5697,7 +6894,15 @@ function classifyExploreError(code, serverMessage) {
5697
6894
  retryable: true
5698
6895
  };
5699
6896
  }
5700
- if (c === "TIMEOUT" || c === "TOOL_BUDGET") {
6897
+ if (c === "TOOL_BUDGET") {
6898
+ return {
6899
+ kind: "scope",
6900
+ code: c,
6901
+ message: "That question spans more of our products than I can look through in one go. Try asking about two or three specific products.",
6902
+ retryable: false
6903
+ };
6904
+ }
6905
+ if (c === "TIMEOUT") {
5701
6906
  return {
5702
6907
  kind: "timeout",
5703
6908
  code: c,
@@ -5829,6 +7034,7 @@ function useExploreChat(options = {}) {
5829
7034
  pageUrl,
5830
7035
  locale,
5831
7036
  examplePrompts,
7037
+ fallbackWelcome,
5832
7038
  pollIntervalMs = DEFAULT_POLL_INTERVAL_MS,
5833
7039
  pollTimeoutMs = DEFAULT_POLL_TIMEOUT_MS,
5834
7040
  storageKey = DEFAULT_STORAGE_KEY,
@@ -5837,9 +7043,13 @@ function useExploreChat(options = {}) {
5837
7043
  } = options;
5838
7044
  const client = useWebSDK();
5839
7045
  const promptKey = JSON.stringify(examplePrompts ?? []);
7046
+ const welcomeKey = JSON.stringify(fallbackWelcome ?? null);
5840
7047
  const fallbackCatalog = useMemo(
5841
- () => buildFallbackCatalog(JSON.parse(promptKey)),
5842
- [promptKey]
7048
+ () => buildFallbackCatalog(
7049
+ JSON.parse(promptKey),
7050
+ JSON.parse(welcomeKey) ?? void 0
7051
+ ),
7052
+ [promptKey, welcomeKey]
5843
7053
  );
5844
7054
  const [catalog, setCatalog] = useState(fallbackCatalog);
5845
7055
  const [messages, setMessages] = useState([]);
@@ -6999,6 +8209,93 @@ function logoUrlOf(url) {
6999
8209
  return null;
7000
8210
  }
7001
8211
  }
8212
+ function inlineImageOrigins(products) {
8213
+ const origins = /* @__PURE__ */ new Set();
8214
+ for (const product of products) {
8215
+ let url;
8216
+ try {
8217
+ url = new URL(product.website);
8218
+ } catch {
8219
+ continue;
8220
+ }
8221
+ if (url.protocol !== "https:") continue;
8222
+ const apex = url.hostname.replace(/^www\./, "");
8223
+ const port = url.port ? `:${url.port}` : "";
8224
+ origins.add(`https://${apex}${port}`);
8225
+ origins.add(`https://www.${apex}${port}`);
8226
+ }
8227
+ return origins;
8228
+ }
8229
+ function isInlineImageAllowed(src, origins) {
8230
+ if (typeof src !== "string" || src === "") return false;
8231
+ let url;
8232
+ try {
8233
+ url = new URL(src);
8234
+ } catch {
8235
+ return false;
8236
+ }
8237
+ if (url.protocol !== "https:" || url.username || url.password) return false;
8238
+ return origins.has(url.origin);
8239
+ }
8240
+ var InlineImageScopeContext = createContext(null);
8241
+ var InsideLinkContext = createContext(false);
8242
+ function AnswerLink(props) {
8243
+ return /* @__PURE__ */ jsx(InsideLinkContext.Provider, { value: true, children: /* @__PURE__ */ jsx(MarkdownLink, { ...props }) });
8244
+ }
8245
+ var INLINE_IMAGE_FRAME = "relative inline-block max-w-full overflow-hidden rounded-xl border border-border bg-muted align-top shadow-sm";
8246
+ function InlineConceptImage({ src, alt }) {
8247
+ const scope = useContext(InlineImageScopeContext);
8248
+ const insideLink = useContext(InsideLinkContext);
8249
+ if (!scope || !scope.enabled || !isInlineImageAllowed(src, scope.origins) || scope.failed.has(src)) {
8250
+ return null;
8251
+ }
8252
+ const { strings: T, onFailed } = scope;
8253
+ const picture = /* @__PURE__ */ jsxs(Fragment, { children: [
8254
+ /* @__PURE__ */ jsx(
8255
+ "img",
8256
+ {
8257
+ src,
8258
+ alt: alt ?? "",
8259
+ loading: "lazy",
8260
+ decoding: "async",
8261
+ onError: () => onFailed(src),
8262
+ className: "block h-auto max-h-80 w-auto max-w-full object-contain"
8263
+ }
8264
+ ),
8265
+ /* @__PURE__ */ jsx(
8266
+ "span",
8267
+ {
8268
+ "aria-hidden": "true",
8269
+ className: "pointer-events-none absolute left-2 top-2 rounded-full border border-border bg-background/90 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-foreground shadow-sm",
8270
+ children: T.conceptIllustration
8271
+ }
8272
+ )
8273
+ ] });
8274
+ return /* @__PURE__ */ jsx("span", { "data-boff-explore": "inline-image", className: "my-3 block", children: insideLink ? /* @__PURE__ */ jsx("span", { className: INLINE_IMAGE_FRAME, children: picture }) : /* @__PURE__ */ jsxs(
8275
+ "a",
8276
+ {
8277
+ href: src,
8278
+ target: "_blank",
8279
+ rel: "noopener noreferrer",
8280
+ className: cn(
8281
+ INLINE_IMAGE_FRAME,
8282
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
8283
+ ),
8284
+ children: [
8285
+ picture,
8286
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
8287
+ "(",
8288
+ T.opensInNewTab,
8289
+ ")"
8290
+ ] })
8291
+ ]
8292
+ }
8293
+ ) });
8294
+ }
8295
+ var ANSWER_MARKDOWN_COMPONENTS = {
8296
+ a: AnswerLink,
8297
+ img: InlineConceptImage
8298
+ };
7002
8299
  function ReferenceCard({
7003
8300
  reference,
7004
8301
  onFollow
@@ -7181,6 +8478,7 @@ function AssistantBubble({
7181
8478
  strings: T,
7182
8479
  message,
7183
8480
  activity,
8481
+ imageOrigins,
7184
8482
  onNavigate,
7185
8483
  anchorRef,
7186
8484
  onFollow,
@@ -7189,6 +8487,25 @@ function AssistantBubble({
7189
8487
  const streaming = message.status === "PENDING" || message.status === "RUNNING";
7190
8488
  const body = message.content || message.partialContent || "";
7191
8489
  const failed = message.status === "FAILED";
8490
+ const completed = message.status === "COMPLETED";
8491
+ const [failedImages, setFailedImages] = useState(
8492
+ () => /* @__PURE__ */ new Set()
8493
+ );
8494
+ const markImageFailed = useCallback((src) => {
8495
+ setFailedImages(
8496
+ (current) => current.has(src) ? current : new Set(current).add(src)
8497
+ );
8498
+ }, []);
8499
+ const imageScope = useMemo(
8500
+ () => ({
8501
+ strings: T,
8502
+ enabled: completed,
8503
+ origins: imageOrigins,
8504
+ failed: failedImages,
8505
+ onFailed: markImageFailed
8506
+ }),
8507
+ [T, completed, imageOrigins, failedImages, markImageFailed]
8508
+ );
7192
8509
  return /* @__PURE__ */ jsxs(
7193
8510
  "div",
7194
8511
  {
@@ -7214,7 +8531,7 @@ function AssistantBubble({
7214
8531
  children: [
7215
8532
  /* @__PURE__ */ jsx(TriangleAlert, { className: "mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600 dark:text-amber-400" }),
7216
8533
  /* @__PURE__ */ jsxs("span", { children: [
7217
- "I couldn't find this in our documentation, so the answer below is not grounded in a source. Try rephrasing, or",
8534
+ T.noAnswer,
7218
8535
  " ",
7219
8536
  /* @__PURE__ */ jsx(
7220
8537
  "a",
@@ -7235,11 +8552,11 @@ function AssistantBubble({
7235
8552
  }
7236
8553
  ) : null,
7237
8554
  body ? /* @__PURE__ */ jsxs("div", { className: "rounded-2xl rounded-tl-md border border-border bg-card px-4 py-3 shadow-sm", children: [
7238
- /* @__PURE__ */ jsx("div", { className: "boff-prose boff-prose-sm boff-explore-body min-w-0 text-card-foreground", children: /* @__PURE__ */ jsx(Markdown, { children: body }) }),
8555
+ /* @__PURE__ */ jsx("div", { className: "boff-prose boff-prose-sm boff-explore-body min-w-0 text-card-foreground", children: /* @__PURE__ */ jsx(InlineImageScopeContext.Provider, { value: imageScope, children: /* @__PURE__ */ jsx(Markdown, { components: ANSWER_MARKDOWN_COMPONENTS, children: body }) }) }),
7239
8556
  streaming ? /* @__PURE__ */ jsx("span", { className: "boff-explore-caret", "aria-hidden": "true" }) : null
7240
8557
  ] }) : null,
7241
8558
  streaming ? /* @__PURE__ */ jsx(ThinkingIndicator, { activity }) : null,
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,
8559
+ 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: T.answerDidNotArrive }) : null,
7243
8560
  message.references.length > 0 ? /* @__PURE__ */ jsxs("div", { children: [
7244
8561
  /* @__PURE__ */ jsx("p", { className: "mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: T.sources }),
7245
8562
  /* @__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(
@@ -7655,6 +8972,12 @@ function ExplorePage({
7655
8972
  () => typeof window === "undefined" ? void 0 : window.location.href,
7656
8973
  []
7657
8974
  );
8975
+ const activeLocale = useMemo(
8976
+ () => resolveExploreLocale(locale),
8977
+ [locale]
8978
+ );
8979
+ const T = useMemo(() => exploreStrings(activeLocale), [activeLocale]);
8980
+ const rtl = isRtlLocale(activeLocale);
7658
8981
  const {
7659
8982
  phase,
7660
8983
  catalog,
@@ -7676,7 +8999,15 @@ function ExplorePage({
7676
8999
  recordClick,
7677
9000
  createShareLink,
7678
9001
  isSharedView
7679
- } = useExploreChat({ productSlug, pageUrl, onSend, examplePrompts });
9002
+ } = useExploreChat({
9003
+ productSlug,
9004
+ pageUrl,
9005
+ onSend,
9006
+ // Locale-aware, so a catalog outage degrades to a translated welcome rather than an
9007
+ // English one. `T.prompts` seeds the chips the same way.
9008
+ examplePrompts: examplePrompts ?? T.prompts,
9009
+ fallbackWelcome: { title: T.welcomeTitle, body: T.welcomeBody }
9010
+ });
7680
9011
  const [draft, setDraft] = useState("");
7681
9012
  const textareaRef = useRef(null);
7682
9013
  const [historyOpen, setHistoryOpen] = useState(false);
@@ -7694,12 +9025,6 @@ function ExplorePage({
7694
9025
  }
7695
9026
  });
7696
9027
  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);
7703
9028
  const [disclaimerOpen, setDisclaimerOpen] = useState(false);
7704
9029
  const [staged, setStaged] = useState([]);
7705
9030
  const [attachmentNotice, setAttachmentNotice] = useState(null);
@@ -7707,7 +9032,7 @@ function ExplorePage({
7707
9032
  const stagedRef = useRef([]);
7708
9033
  stagedRef.current = staged;
7709
9034
  const pickQueueRef = useRef(Promise.resolve());
7710
- const [shareLabel, setShareLabel] = useState("Share");
9035
+ const [shareLabel, setShareLabel] = useState(T.share);
7711
9036
  const [shareUrl, setShareUrl] = useState(null);
7712
9037
  const scrollRef = useRef(null);
7713
9038
  const latestAssistantRef = useRef(null);
@@ -7726,6 +9051,10 @@ function ExplorePage({
7726
9051
  () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
7727
9052
  [catalog.products, focusProduct]
7728
9053
  );
9054
+ const imageOrigins = useMemo(
9055
+ () => inlineImageOrigins(catalog.products),
9056
+ [catalog.products]
9057
+ );
7729
9058
  useEffect(() => {
7730
9059
  const el = textareaRef.current;
7731
9060
  if (!el) return;
@@ -7764,12 +9093,12 @@ function ExplorePage({
7764
9093
  el.scrollTop = el.scrollHeight;
7765
9094
  }, [activity, latestAssistantId, messages]);
7766
9095
  const handleShare = useCallback(async () => {
7767
- setShareLabel("Copying\u2026");
9096
+ setShareLabel(T.copying);
7768
9097
  setShareUrl(null);
7769
9098
  const token = await createShareLink();
7770
9099
  if (!token) {
7771
- setShareLabel("Unavailable");
7772
- setTimeout(() => setShareLabel("Share"), 2500);
9100
+ setShareLabel(T.shareUnavailable);
9101
+ setTimeout(() => setShareLabel(T.share), 2500);
7773
9102
  return;
7774
9103
  }
7775
9104
  const url = new URL(pageUrl ?? window.location.href);
@@ -7779,13 +9108,20 @@ function ExplorePage({
7779
9108
  const shareable = url.toString();
7780
9109
  try {
7781
9110
  await navigator.clipboard.writeText(shareable);
7782
- setShareLabel("Copied");
7783
- setTimeout(() => setShareLabel("Share"), 2500);
9111
+ setShareLabel(T.copied);
9112
+ setTimeout(() => setShareLabel(T.share), 2500);
7784
9113
  } catch {
7785
9114
  setShareUrl(shareable);
7786
- setShareLabel("Share");
9115
+ setShareLabel(T.share);
7787
9116
  }
7788
- }, [createShareLink, pageUrl]);
9117
+ }, [
9118
+ createShareLink,
9119
+ pageUrl,
9120
+ T.copied,
9121
+ T.copying,
9122
+ T.share,
9123
+ T.shareUnavailable
9124
+ ]);
7789
9125
  const handleFilesPicked = useCallback(
7790
9126
  (picked) => {
7791
9127
  if (!picked || picked.length === 0) return pickQueueRef.current;
@@ -7901,7 +9237,7 @@ function ExplorePage({
7901
9237
  onClick: reset,
7902
9238
  children: [
7903
9239
  /* @__PURE__ */ jsx(RotateCcw, { className: "h-3.5 w-3.5" }),
7904
- /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "New chat" })
9240
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: T.newChat })
7905
9241
  ]
7906
9242
  }
7907
9243
  ),
@@ -7938,7 +9274,8 @@ function ExplorePage({
7938
9274
  children: [
7939
9275
  /* @__PURE__ */ jsx(History, { className: "h-3.5 w-3.5" }),
7940
9276
  /* @__PURE__ */ jsxs("span", { className: "hidden sm:inline", children: [
7941
- "History (",
9277
+ T.history,
9278
+ " (",
7942
9279
  history.length,
7943
9280
  ")"
7944
9281
  ] })
@@ -7968,7 +9305,7 @@ function ExplorePage({
7968
9305
  },
7969
9306
  children: [
7970
9307
  /* @__PURE__ */ jsx(Trash2, { className: "h-3.5 w-3.5" }),
7971
- "Clear history"
9308
+ T.clearHistory
7972
9309
  ]
7973
9310
  }
7974
9311
  )
@@ -8048,6 +9385,7 @@ function ExplorePage({
8048
9385
  strings: T,
8049
9386
  message,
8050
9387
  activity,
9388
+ imageOrigins,
8051
9389
  onNavigate,
8052
9390
  anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
8053
9391
  onFollow: (kind, url) => recordClick(message.id, kind, url),
@@ -8234,7 +9572,7 @@ function ExplorePage({
8234
9572
  type: "button",
8235
9573
  size: "icon",
8236
9574
  variant: "secondary",
8237
- "aria-label": "Stop generating",
9575
+ "aria-label": T.stop,
8238
9576
  onClick: stop,
8239
9577
  children: /* @__PURE__ */ jsx(Square, { className: "h-4 w-4" })
8240
9578
  }
@@ -8245,7 +9583,7 @@ function ExplorePage({
8245
9583
  type: "submit",
8246
9584
  size: "icon",
8247
9585
  disabled: !canSubmit,
8248
- "aria-label": "Send message",
9586
+ "aria-label": T.send,
8249
9587
  children: /* @__PURE__ */ jsx(ArrowUp, { className: "h-4 w-4" })
8250
9588
  }
8251
9589
  )
@@ -13000,6 +14338,6 @@ function StoreProductDetailPage({
13000
14338
  ] });
13001
14339
  }
13002
14340
 
13003
- 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 };
14341
+ export { BlogListPage, BlogPostPage, Button, CONCEPTS_PATH, CONCEPT_ILLUSTRATION_NOTICE, CONCEPT_PATH_PREFIX, CareersApplyForm, CareersSubmissionForm, CaseStudiesListPage, CaseStudyPage, ChangelogPage, ConceptDetailPage, ConceptsPage, 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, conceptPath, detectElectronPlatform, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatDownloads, formatPrice2 as formatPrice, getConceptBySlug, getRecaptchaV3Token, isValidUrl, loadRecaptchaV3, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useWebSDK, useWebSDKConfig };
13004
14342
  //# sourceMappingURL=index.mjs.map
13005
14343
  //# sourceMappingURL=index.mjs.map