@burdenoff/website-sdk 2026.830.1 → 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 +154 -15
  9. package/dist/components/explore.js.map +1 -1
  10. package/dist/components/explore.mjs +154 -17
  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-B8xKGid5.d.mts → explore-types-CLw19R76.d.mts} +1 -143
  37. package/dist/{use-explore-chat-B8xKGid5.d.ts → explore-types-CLw19R76.d.ts} +1 -143
  38. package/dist/hooks/index.d.mts +2 -1
  39. package/dist/hooks/index.d.ts +2 -1
  40. package/dist/hooks/index.js +4 -1
  41. package/dist/hooks/index.js.map +1 -1
  42. package/dist/hooks/index.mjs +4 -1
  43. package/dist/hooks/index.mjs.map +1 -1
  44. package/dist/index.d.mts +141 -2
  45. package/dist/index.d.ts +141 -2
  46. package/dist/index.js +1489 -179
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +1485 -182
  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
@@ -84,6 +84,8 @@ var EN = {
84
84
  askHuman: "ask a human",
85
85
  prevSuggestion: "Previous suggestion",
86
86
  nextSuggestion: "Next suggestion",
87
+ conceptIllustration: "Concept illustration",
88
+ opensInNewTab: "opens in a new tab",
87
89
  capabilities: [
88
90
  "Grounded in our own docs",
89
91
  "Compare across the ecosystem",
@@ -133,6 +135,8 @@ var ZH = {
133
135
  askHuman: "\u8054\u7CFB\u6211\u4EEC",
134
136
  prevSuggestion: "\u4E0A\u4E00\u4E2A\u5EFA\u8BAE",
135
137
  nextSuggestion: "\u4E0B\u4E00\u4E2A\u5EFA\u8BAE",
138
+ conceptIllustration: "\u6982\u5FF5\u793A\u610F\u56FE",
139
+ opensInNewTab: "\u5728\u65B0\u6807\u7B7E\u9875\u4E2D\u6253\u5F00",
136
140
  capabilities: ["\u57FA\u4E8E\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u6863", "\u8DE8\u4EA7\u54C1\u5BF9\u6BD4", "\u76F4\u8FBE\u6B63\u786E\u7684\u9875\u9762"],
137
141
  prompts: [
138
142
  "\u8FD9\u4E2A\u4EA7\u54C1\u5230\u5E95\u80FD\u505A\u4EC0\u4E48\uFF1F",
@@ -178,6 +182,8 @@ var HI = {
178
182
  askHuman: "\u0939\u092E\u0938\u0947 \u0938\u0902\u092A\u0930\u094D\u0915 \u0915\u0930\u0947\u0902",
179
183
  prevSuggestion: "\u092A\u093F\u091B\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
180
184
  nextSuggestion: "\u0905\u0917\u0932\u093E \u0938\u0941\u091D\u093E\u0935",
185
+ conceptIllustration: "\u0905\u0935\u0927\u093E\u0930\u0923\u093E \u091A\u093F\u0924\u094D\u0930\u0923",
186
+ opensInNewTab: "\u0928\u090F \u091F\u0948\u092C \u092E\u0947\u0902 \u0916\u0941\u0932\u0924\u093E \u0939\u0948",
181
187
  capabilities: [
182
188
  "\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",
183
189
  "\u0938\u092D\u0940 \u0909\u0924\u094D\u092A\u093E\u0926\u094B\u0902 \u0915\u0940 \u0924\u0941\u0932\u0928\u093E \u0915\u0930\u0947\u0902",
@@ -227,6 +233,8 @@ var ES = {
227
233
  askHuman: "habla con una persona",
228
234
  prevSuggestion: "Sugerencia anterior",
229
235
  nextSuggestion: "Sugerencia siguiente",
236
+ conceptIllustration: "Ilustraci\xF3n del concepto",
237
+ opensInNewTab: "se abre en una pesta\xF1a nueva",
230
238
  capabilities: [
231
239
  "Basado en nuestra documentaci\xF3n",
232
240
  "Compara todo el ecosistema",
@@ -276,6 +284,8 @@ var AR = {
276
284
  askHuman: "\u062A\u062D\u062F\u0651\u062B \u0625\u0644\u0649 \u0634\u062E\u0635",
277
285
  prevSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u0633\u0627\u0628\u0642",
278
286
  nextSuggestion: "\u0627\u0644\u0627\u0642\u062A\u0631\u0627\u062D \u0627\u0644\u062A\u0627\u0644\u064A",
287
+ conceptIllustration: "\u0631\u0633\u0645 \u062A\u0648\u0636\u064A\u062D\u064A \u0644\u0644\u0645\u0641\u0647\u0648\u0645",
288
+ opensInNewTab: "\u064A\u064F\u0641\u062A\u062D \u0641\u064A \u0639\u0644\u0627\u0645\u0629 \u062A\u0628\u0648\u064A\u0628 \u062C\u062F\u064A\u062F\u0629",
279
289
  capabilities: [
280
290
  "\u0645\u0628\u0646\u064A \u0639\u0644\u0649 \u0648\u062B\u0627\u0626\u0642\u0646\u0627",
281
291
  "\u0642\u0627\u0631\u0646 \u0639\u0628\u0631 \u0627\u0644\u0645\u0646\u0638\u0648\u0645\u0629",
@@ -325,6 +335,8 @@ var TA = {
325
335
  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",
326
336
  prevSuggestion: "\u0BAE\u0BC1\u0BA8\u0BCD\u0BA4\u0BC8\u0BAF \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
327
337
  nextSuggestion: "\u0B85\u0B9F\u0BC1\u0BA4\u0BCD\u0BA4 \u0BAA\u0BB0\u0BBF\u0BA8\u0BCD\u0BA4\u0BC1\u0BB0\u0BC8",
338
+ conceptIllustration: "\u0B95\u0BB0\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1 \u0BB5\u0BBF\u0BB3\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BAE\u0BCD",
339
+ opensInNewTab: "\u0BAA\u0BC1\u0BA4\u0BBF\u0BAF \u0BA4\u0BBE\u0BB5\u0BB2\u0BBF\u0BB2\u0BCD \u0BA4\u0BBF\u0BB1\u0B95\u0BCD\u0B95\u0BC1\u0BAE\u0BCD",
328
340
  capabilities: [
329
341
  "\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",
330
342
  "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BC8 \u0B92\u0BAA\u0BCD\u0BAA\u0BBF\u0B9F\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -365,19 +377,26 @@ function exploreStrings(locale) {
365
377
  function fill(template, values) {
366
378
  return template.replace(/\{(\w+)\}/g, (match, key) => values[key] ?? match);
367
379
  }
380
+ function MarkdownLink({
381
+ href,
382
+ children,
383
+ // react-markdown passes the hast node to every override; it is not a DOM attribute.
384
+ node: _node,
385
+ ...props
386
+ }) {
387
+ const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
388
+ return /* @__PURE__ */ jsxRuntime.jsx(
389
+ "a",
390
+ {
391
+ href,
392
+ ...props,
393
+ ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : { rel: "noopener noreferrer" },
394
+ children
395
+ }
396
+ );
397
+ }
368
398
  var defaultComponents = {
369
- a: ({ href, children, ...props }) => {
370
- const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
371
- return /* @__PURE__ */ jsxRuntime.jsx(
372
- "a",
373
- {
374
- href,
375
- ...props,
376
- ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : { rel: "noopener noreferrer" },
377
- children
378
- }
379
- );
380
- }
399
+ a: MarkdownLink
381
400
  };
382
401
  function Markdown({
383
402
  children,
@@ -938,10 +957,13 @@ var ECOSYSTEM_PRODUCTS = [
938
957
  name: "VibeControls",
939
958
  websiteUrl: "https://vibecontrols.com"
940
959
  },
960
+ // FluidGrids ships on www.fluidgrids.ai — fluidgrids.com only redirects there. The explore
961
+ // catalog and the site's own sitemap use this origin, and so must the fallback catalog
962
+ // built from this list, or /explore rejects FluidGrids concept images until it loads.
941
963
  {
942
964
  slug: "fluidgrids",
943
965
  name: "FluidGrids",
944
- websiteUrl: "https://fluidgrids.com"
966
+ websiteUrl: "https://www.fluidgrids.ai"
945
967
  },
946
968
  // Botlit ships on botlit.ai — botlit.com does not resolve.
947
969
  { slug: "botlit", name: "Botlit", websiteUrl: "https://www.botlit.ai" },
@@ -2245,6 +2267,9 @@ function resolveImageUrl(image, base) {
2245
2267
  return image;
2246
2268
  }
2247
2269
  }
2270
+ function serializeJsonLd(data) {
2271
+ return JSON.stringify(data).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
2272
+ }
2248
2273
  function PageHead({
2249
2274
  title,
2250
2275
  description,
@@ -2286,7 +2311,7 @@ function PageHead({
2286
2311
  fullImageUrl && /* @__PURE__ */ jsxRuntime.jsx("meta", { name: "twitter:image", content: fullImageUrl }),
2287
2312
  twitterHandle && /* @__PURE__ */ jsxRuntime.jsx("meta", { name: "twitter:creator", content: twitterHandle }),
2288
2313
  /* @__PURE__ */ jsxRuntime.jsx("meta", { name: "theme-color", content: themeColor }),
2289
- structuredDataItems.map((data, index) => /* @__PURE__ */ jsxRuntime.jsx("script", { type: "application/ld+json", children: JSON.stringify(data) }, `ld-${index}`)),
2314
+ structuredDataItems.map((data, index) => /* @__PURE__ */ jsxRuntime.jsx("script", { type: "application/ld+json", children: serializeJsonLd(data) }, `ld-${index}`)),
2290
2315
  additionalMeta?.map((meta, index) => /* @__PURE__ */ jsxRuntime.jsx(
2291
2316
  "meta",
2292
2317
  {
@@ -2703,6 +2728,93 @@ function logoUrlOf(url) {
2703
2728
  return null;
2704
2729
  }
2705
2730
  }
2731
+ function inlineImageOrigins(products) {
2732
+ const origins = /* @__PURE__ */ new Set();
2733
+ for (const product of products) {
2734
+ let url;
2735
+ try {
2736
+ url = new URL(product.website);
2737
+ } catch {
2738
+ continue;
2739
+ }
2740
+ if (url.protocol !== "https:") continue;
2741
+ const apex = url.hostname.replace(/^www\./, "");
2742
+ const port = url.port ? `:${url.port}` : "";
2743
+ origins.add(`https://${apex}${port}`);
2744
+ origins.add(`https://www.${apex}${port}`);
2745
+ }
2746
+ return origins;
2747
+ }
2748
+ function isInlineImageAllowed(src, origins) {
2749
+ if (typeof src !== "string" || src === "") return false;
2750
+ let url;
2751
+ try {
2752
+ url = new URL(src);
2753
+ } catch {
2754
+ return false;
2755
+ }
2756
+ if (url.protocol !== "https:" || url.username || url.password) return false;
2757
+ return origins.has(url.origin);
2758
+ }
2759
+ var InlineImageScopeContext = React.createContext(null);
2760
+ var InsideLinkContext = React.createContext(false);
2761
+ function AnswerLink(props) {
2762
+ return /* @__PURE__ */ jsxRuntime.jsx(InsideLinkContext.Provider, { value: true, children: /* @__PURE__ */ jsxRuntime.jsx(MarkdownLink, { ...props }) });
2763
+ }
2764
+ var INLINE_IMAGE_FRAME = "relative inline-block max-w-full overflow-hidden rounded-xl border border-border bg-muted align-top shadow-sm";
2765
+ function InlineConceptImage({ src, alt }) {
2766
+ const scope = React.useContext(InlineImageScopeContext);
2767
+ const insideLink = React.useContext(InsideLinkContext);
2768
+ if (!scope || !scope.enabled || !isInlineImageAllowed(src, scope.origins) || scope.failed.has(src)) {
2769
+ return null;
2770
+ }
2771
+ const { strings: T, onFailed } = scope;
2772
+ const picture = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2773
+ /* @__PURE__ */ jsxRuntime.jsx(
2774
+ "img",
2775
+ {
2776
+ src,
2777
+ alt: alt ?? "",
2778
+ loading: "lazy",
2779
+ decoding: "async",
2780
+ onError: () => onFailed(src),
2781
+ className: "block h-auto max-h-80 w-auto max-w-full object-contain"
2782
+ }
2783
+ ),
2784
+ /* @__PURE__ */ jsxRuntime.jsx(
2785
+ "span",
2786
+ {
2787
+ "aria-hidden": "true",
2788
+ 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",
2789
+ children: T.conceptIllustration
2790
+ }
2791
+ )
2792
+ ] });
2793
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-boff-explore": "inline-image", className: "my-3 block", children: insideLink ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: INLINE_IMAGE_FRAME, children: picture }) : /* @__PURE__ */ jsxRuntime.jsxs(
2794
+ "a",
2795
+ {
2796
+ href: src,
2797
+ target: "_blank",
2798
+ rel: "noopener noreferrer",
2799
+ className: cn(
2800
+ INLINE_IMAGE_FRAME,
2801
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
2802
+ ),
2803
+ children: [
2804
+ picture,
2805
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sr-only", children: [
2806
+ "(",
2807
+ T.opensInNewTab,
2808
+ ")"
2809
+ ] })
2810
+ ]
2811
+ }
2812
+ ) });
2813
+ }
2814
+ var ANSWER_MARKDOWN_COMPONENTS = {
2815
+ a: AnswerLink,
2816
+ img: InlineConceptImage
2817
+ };
2706
2818
  function ReferenceCard({
2707
2819
  reference,
2708
2820
  onFollow
@@ -2885,6 +2997,7 @@ function AssistantBubble({
2885
2997
  strings: T,
2886
2998
  message,
2887
2999
  activity,
3000
+ imageOrigins,
2888
3001
  onNavigate,
2889
3002
  anchorRef,
2890
3003
  onFollow,
@@ -2893,6 +3006,25 @@ function AssistantBubble({
2893
3006
  const streaming = message.status === "PENDING" || message.status === "RUNNING";
2894
3007
  const body = message.content || message.partialContent || "";
2895
3008
  const failed = message.status === "FAILED";
3009
+ const completed = message.status === "COMPLETED";
3010
+ const [failedImages, setFailedImages] = React.useState(
3011
+ () => /* @__PURE__ */ new Set()
3012
+ );
3013
+ const markImageFailed = React.useCallback((src) => {
3014
+ setFailedImages(
3015
+ (current) => current.has(src) ? current : new Set(current).add(src)
3016
+ );
3017
+ }, []);
3018
+ const imageScope = React.useMemo(
3019
+ () => ({
3020
+ strings: T,
3021
+ enabled: completed,
3022
+ origins: imageOrigins,
3023
+ failed: failedImages,
3024
+ onFailed: markImageFailed
3025
+ }),
3026
+ [T, completed, imageOrigins, failedImages, markImageFailed]
3027
+ );
2896
3028
  return /* @__PURE__ */ jsxRuntime.jsxs(
2897
3029
  "div",
2898
3030
  {
@@ -2939,7 +3071,7 @@ function AssistantBubble({
2939
3071
  }
2940
3072
  ) : null,
2941
3073
  body ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl rounded-tl-md border border-border bg-card px-4 py-3 shadow-sm", children: [
2942
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "boff-prose boff-prose-sm boff-explore-body min-w-0 text-card-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { children: body }) }),
3074
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "boff-prose boff-prose-sm boff-explore-body min-w-0 text-card-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(InlineImageScopeContext.Provider, { value: imageScope, children: /* @__PURE__ */ jsxRuntime.jsx(Markdown, { components: ANSWER_MARKDOWN_COMPONENTS, children: body }) }) }),
2943
3075
  streaming ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "boff-explore-caret", "aria-hidden": "true" }) : null
2944
3076
  ] }) : null,
2945
3077
  streaming ? /* @__PURE__ */ jsxRuntime.jsx(ThinkingIndicator, { activity }) : null,
@@ -3438,6 +3570,10 @@ function ExplorePage({
3438
3570
  () => catalog.products.find((p) => p.slug === focusProduct)?.name ?? null,
3439
3571
  [catalog.products, focusProduct]
3440
3572
  );
3573
+ const imageOrigins = React.useMemo(
3574
+ () => inlineImageOrigins(catalog.products),
3575
+ [catalog.products]
3576
+ );
3441
3577
  React.useEffect(() => {
3442
3578
  const el = textareaRef.current;
3443
3579
  if (!el) return;
@@ -3768,6 +3904,7 @@ function ExplorePage({
3768
3904
  strings: T,
3769
3905
  message,
3770
3906
  activity,
3907
+ imageOrigins,
3771
3908
  onNavigate,
3772
3909
  anchorRef: message.id === latestAssistantId ? latestAssistantRef : void 0,
3773
3910
  onFollow: (kind, url) => recordClick(message.id, kind, url),
@@ -4062,6 +4199,8 @@ function ExplorePage({
4062
4199
  }
4063
4200
 
4064
4201
  exports.ExplorePage = ExplorePage;
4202
+ exports.inlineImageOrigins = inlineImageOrigins;
4203
+ exports.isInlineImageAllowed = isInlineImageAllowed;
4065
4204
  exports.logoUrlOf = logoUrlOf;
4066
4205
  //# sourceMappingURL=explore.js.map
4067
4206
  //# sourceMappingURL=explore.js.map