@burdenoff/website-sdk 2026.925.1 → 2026.925.3

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 (39) hide show
  1. package/dist/client/index.js +2 -0
  2. package/dist/client/index.js.map +1 -1
  3. package/dist/client/index.mjs +2 -0
  4. package/dist/client/index.mjs.map +1 -1
  5. package/dist/components/explore.d.mts +1 -1
  6. package/dist/components/explore.d.ts +1 -1
  7. package/dist/components/explore.js +1049 -502
  8. package/dist/components/explore.js.map +1 -1
  9. package/dist/components/explore.mjs +1051 -505
  10. package/dist/components/explore.mjs.map +1 -1
  11. package/dist/components/partners.js +3 -2
  12. package/dist/components/partners.js.map +1 -1
  13. package/dist/components/partners.mjs +3 -2
  14. package/dist/components/partners.mjs.map +1 -1
  15. package/dist/content/index.d.mts +1 -1
  16. package/dist/content/index.d.ts +1 -1
  17. package/dist/content/index.js +3 -2
  18. package/dist/content/index.js.map +1 -1
  19. package/dist/content/index.mjs +3 -2
  20. package/dist/content/index.mjs.map +1 -1
  21. package/dist/{explore-C3SEP5K6.d.ts → explore-Cam_ElSJ.d.ts} +71 -13
  22. package/dist/{explore-Crc41y0j.d.mts → explore-hTQm-_SF.d.mts} +71 -13
  23. package/dist/hooks/index.js +24 -14
  24. package/dist/hooks/index.js.map +1 -1
  25. package/dist/hooks/index.mjs +24 -14
  26. package/dist/hooks/index.mjs.map +1 -1
  27. package/dist/{index-BMWQNZDX.d.mts → index-gm3pBCJT.d.mts} +8 -2
  28. package/dist/{index-BqHF-G-S.d.ts → index-ySbOLSD5.d.ts} +8 -2
  29. package/dist/index.d.mts +30 -9
  30. package/dist/index.d.ts +30 -9
  31. package/dist/index.js +829 -260
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +829 -262
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/store/index.js +3 -2
  36. package/dist/store/index.js.map +1 -1
  37. package/dist/store/index.mjs +3 -2
  38. package/dist/store/index.mjs.map +1 -1
  39. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { createContext, useMemo, useContext, useState, useCallback, useLayoutEffect, useRef, useEffect, useId, version, Children, isValidElement, cloneElement } 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, ImageIcon, ChevronRight, Maximize2, Check, ArrowLeft, Sparkles, RotateCcw, Link2, History, Trash2, Paperclip, X, Mic, Square, ArrowUp, Info, ExternalLink, ChevronLeft, BookOpenText, Layers, TriangleAlert, FileText, Copy, ThumbsUp, ThumbsDown, Volume2 } 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, ExternalLink, ChevronLeft, BookOpenText, Layers, TriangleAlert, FileText, Film, Play, Copy, ThumbsUp, ThumbsDown, Minimize, Maximize, VideoOff, Volume2 } 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';
@@ -18,6 +18,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
18
18
  import { useForm } from 'react-hook-form';
19
19
  import { z } from 'zod';
20
20
  import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
21
+ import { createPortal } from 'react-dom';
21
22
 
22
23
  var __defProp = Object.defineProperty;
23
24
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -250,7 +251,9 @@ var PRODUCT_DOMAINS = [
250
251
  "algoshred.com",
251
252
  "vibecontrols.com",
252
253
  "fluidgrids.com",
254
+ "botmanor.com",
253
255
  "botlit.ai",
256
+ // legacy BotManor domain, still served
254
257
  "bigconsole.com",
255
258
  "gethealthybowl.com",
256
259
  "headshotmarketing.com",
@@ -1106,13 +1109,14 @@ function Markdown({
1106
1109
  children,
1107
1110
  className,
1108
1111
  inline,
1109
- components
1112
+ components,
1113
+ rehypePlugins
1110
1114
  }) {
1111
1115
  const content = /* @__PURE__ */ jsx(
1112
1116
  ReactMarkdown,
1113
1117
  {
1114
1118
  remarkPlugins: [remarkGfm],
1115
- rehypePlugins: [rehypeSanitize],
1119
+ rehypePlugins: [rehypeSanitize, ...rehypePlugins ?? []],
1116
1120
  components: { ...defaultComponents, ...components },
1117
1121
  ...inline ? { disallowedElements: ["p"], unwrapDisallowed: true } : {},
1118
1122
  children
@@ -6133,6 +6137,13 @@ var EN = {
6133
6137
  readAloud: "Read aloud",
6134
6138
  stopReading: "Stop reading",
6135
6139
  answerTable: "Table",
6140
+ productVideo: "Product video",
6141
+ productVideoTitle: "{product} product video",
6142
+ playVideo: "Play {title}",
6143
+ closeVideo: "Close video",
6144
+ enterFullScreen: "Full screen",
6145
+ exitFullScreen: "Exit full screen",
6146
+ videoUnavailable: "This video can't be played right now.",
6136
6147
  groundedIn: "What this answer is based on",
6137
6148
  sourceCountOne: "1 source",
6138
6149
  sourceCountMany: "{count} sources",
@@ -6234,6 +6245,13 @@ var ZH = {
6234
6245
  readAloud: "\u6717\u8BFB",
6235
6246
  stopReading: "\u505C\u6B62\u6717\u8BFB",
6236
6247
  answerTable: "\u8868\u683C",
6248
+ productVideo: "\u4EA7\u54C1\u89C6\u9891",
6249
+ productVideoTitle: "{product} \u4EA7\u54C1\u89C6\u9891",
6250
+ playVideo: "\u64AD\u653E {title}",
6251
+ closeVideo: "\u5173\u95ED\u89C6\u9891",
6252
+ enterFullScreen: "\u5168\u5C4F",
6253
+ exitFullScreen: "\u9000\u51FA\u5168\u5C4F",
6254
+ videoUnavailable: "\u6682\u65F6\u65E0\u6CD5\u64AD\u653E\u6B64\u89C6\u9891\u3002",
6237
6255
  groundedIn: "\u8FD9\u4E2A\u56DE\u7B54\u7684\u4F9D\u636E",
6238
6256
  sourceCountOne: "1 \u4E2A\u6765\u6E90",
6239
6257
  sourceCountMany: "{count} \u4E2A\u6765\u6E90",
@@ -6331,6 +6349,13 @@ var HI = {
6331
6349
  readAloud: "\u091C\u093C\u094B\u0930 \u0938\u0947 \u092A\u0922\u093C\u0947\u0902",
6332
6350
  stopReading: "\u092A\u0922\u093C\u0928\u093E \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6333
6351
  answerTable: "\u0924\u093E\u0932\u093F\u0915\u093E",
6352
+ productVideo: "\u0909\u0924\u094D\u092A\u093E\u0926 \u0935\u0940\u0921\u093F\u092F\u094B",
6353
+ productVideoTitle: "{product} \u0909\u0924\u094D\u092A\u093E\u0926 \u0935\u0940\u0921\u093F\u092F\u094B",
6354
+ playVideo: "{title} \u091A\u0932\u093E\u090F\u0901",
6355
+ closeVideo: "\u0935\u0940\u0921\u093F\u092F\u094B \u092C\u0902\u0926 \u0915\u0930\u0947\u0902",
6356
+ enterFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928",
6357
+ exitFullScreen: "\u092A\u0942\u0930\u094D\u0923 \u0938\u094D\u0915\u094D\u0930\u0940\u0928 \u0938\u0947 \u092C\u093E\u0939\u0930 \u0928\u093F\u0915\u0932\u0947\u0902",
6358
+ videoUnavailable: "\u092F\u0939 \u0935\u0940\u0921\u093F\u092F\u094B \u0905\u092D\u0940 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u0924\u093E\u0964",
6334
6359
  groundedIn: "\u092F\u0939 \u0909\u0924\u094D\u0924\u0930 \u0915\u093F\u0938 \u092A\u0930 \u0906\u0927\u093E\u0930\u093F\u0924 \u0939\u0948",
6335
6360
  sourceCountOne: "1 \u0938\u094D\u0930\u094B\u0924",
6336
6361
  sourceCountMany: "{count} \u0938\u094D\u0930\u094B\u0924",
@@ -6432,6 +6457,13 @@ var ES = {
6432
6457
  readAloud: "Leer en voz alta",
6433
6458
  stopReading: "Dejar de leer",
6434
6459
  answerTable: "Tabla",
6460
+ productVideo: "V\xEDdeo del producto",
6461
+ productVideoTitle: "V\xEDdeo de {product}",
6462
+ playVideo: "Reproducir {title}",
6463
+ closeVideo: "Cerrar v\xEDdeo",
6464
+ enterFullScreen: "Pantalla completa",
6465
+ exitFullScreen: "Salir de pantalla completa",
6466
+ videoUnavailable: "Ahora mismo no se puede reproducir este v\xEDdeo.",
6435
6467
  groundedIn: "En qu\xE9 se basa esta respuesta",
6436
6468
  sourceCountOne: "1 fuente",
6437
6469
  sourceCountMany: "{count} fuentes",
@@ -6533,6 +6565,13 @@ var AR = {
6533
6565
  readAloud: "\u0627\u0642\u0631\u0623 \u0628\u0635\u0648\u062A \u0639\u0627\u0644\u064D",
6534
6566
  stopReading: "\u0625\u064A\u0642\u0627\u0641 \u0627\u0644\u0642\u0631\u0627\u0621\u0629",
6535
6567
  answerTable: "\u062C\u062F\u0648\u0644",
6568
+ productVideo: "\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0645\u0646\u062A\u062C",
6569
+ productVideoTitle: "\u0641\u064A\u062F\u064A\u0648 {product}",
6570
+ playVideo: "\u062A\u0634\u063A\u064A\u0644 {title}",
6571
+ closeVideo: "\u0625\u063A\u0644\u0627\u0642 \u0627\u0644\u0641\u064A\u062F\u064A\u0648",
6572
+ enterFullScreen: "\u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
6573
+ exitFullScreen: "\u0627\u0644\u062E\u0631\u0648\u062C \u0645\u0646 \u0645\u0644\u0621 \u0627\u0644\u0634\u0627\u0634\u0629",
6574
+ videoUnavailable: "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u0641\u064A\u062F\u064A\u0648 \u0627\u0644\u0622\u0646.",
6536
6575
  groundedIn: "\u0639\u0644\u0649 \u0645\u0627\u0630\u0627 \u062A\u0633\u062A\u0646\u062F \u0647\u0630\u0647 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
6537
6576
  sourceCountOne: "\u0645\u0635\u062F\u0631 \u0648\u0627\u062D\u062F",
6538
6577
  sourceCountMany: "{count} \u0645\u0635\u0627\u062F\u0631",
@@ -6634,6 +6673,13 @@ var TA = {
6634
6673
  readAloud: "\u0B9A\u0BA4\u0BCD\u0BA4\u0BAE\u0BBE\u0B95\u0BAA\u0BCD \u0BAA\u0B9F\u0BBF",
6635
6674
  stopReading: "\u0BAA\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0BA4\u0BC8 \u0BA8\u0BBF\u0BB1\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1",
6636
6675
  answerTable: "\u0B85\u0B9F\u0BCD\u0B9F\u0BB5\u0BA3\u0BC8",
6676
+ productVideo: "\u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB",
6677
+ productVideoTitle: "{product} \u0BA4\u0BAF\u0BBE\u0BB0\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1 \u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB",
6678
+ playVideo: "{title} \u0B87\u0BAF\u0B95\u0BCD\u0B95\u0BC1",
6679
+ closeVideo: "\u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0BAE\u0BC2\u0B9F\u0BC1",
6680
+ enterFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8",
6681
+ exitFullScreen: "\u0BAE\u0BC1\u0BB4\u0BC1\u0BA4\u0BCD \u0BA4\u0BBF\u0BB0\u0BC8\u0BAF\u0BBF\u0BB2\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1 \u0BB5\u0BC6\u0BB3\u0BBF\u0BAF\u0BC7\u0BB1\u0BC1",
6682
+ videoUnavailable: "\u0B87\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC0\u0B9F\u0BBF\u0BAF\u0BCB\u0BB5\u0BC8 \u0B87\u0BAA\u0BCD\u0BAA\u0BCB\u0BA4\u0BC1 \u0B87\u0BAF\u0B95\u0BCD\u0B95 \u0BAE\u0BC1\u0B9F\u0BBF\u0BAF\u0BB5\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8.",
6637
6683
  groundedIn: "\u0B87\u0BA8\u0BCD\u0BA4\u0BAA\u0BCD \u0BAA\u0BA4\u0BBF\u0BB2\u0BCD \u0B8E\u0BA4\u0BC8 \u0B85\u0B9F\u0BBF\u0BAA\u0BCD\u0BAA\u0B9F\u0BC8\u0BAF\u0BBE\u0B95\u0B95\u0BCD \u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BA4\u0BC1",
6638
6684
  sourceCountOne: "1 \u0BAE\u0BC2\u0BB2\u0BAE\u0BCD",
6639
6685
  sourceCountMany: "{count} \u0BAE\u0BC2\u0BB2\u0B99\u0BCD\u0B95\u0BB3\u0BCD",
@@ -6923,7 +6969,14 @@ function answerStrings(locale) {
6923
6969
  ...chrome,
6924
6970
  answerTable: explore.answerTable,
6925
6971
  conceptIllustration: explore.conceptIllustration,
6926
- opensInNewTab: explore.opensInNewTab
6972
+ opensInNewTab: explore.opensInNewTab,
6973
+ productVideo: explore.productVideo,
6974
+ productVideoTitle: explore.productVideoTitle,
6975
+ playVideo: explore.playVideo,
6976
+ closeVideo: explore.closeVideo,
6977
+ enterFullScreen: explore.enterFullScreen,
6978
+ exitFullScreen: explore.exitFullScreen,
6979
+ videoUnavailable: explore.videoUnavailable
6927
6980
  };
6928
6981
  }
6929
6982
  var DATE_TAGS = {
@@ -6991,6 +7044,253 @@ function answerSourceHost(url) {
6991
7044
  return "";
6992
7045
  }
6993
7046
  }
7047
+ function fullscreenSupport() {
7048
+ if (typeof document === "undefined") return null;
7049
+ if (document.fullscreenEnabled && typeof document.documentElement.requestFullscreen === "function") {
7050
+ return "element";
7051
+ }
7052
+ if (typeof HTMLVideoElement !== "undefined" && "webkitEnterFullscreen" in HTMLVideoElement.prototype) {
7053
+ return "video";
7054
+ }
7055
+ return null;
7056
+ }
7057
+ function ignoreRejection(result) {
7058
+ result?.catch(() => void 0);
7059
+ }
7060
+ var VIDEO_DIALOG_CSS = `
7061
+ .boff-explore-video-panel:fullscreen {
7062
+ display: flex;
7063
+ flex-direction: column;
7064
+ gap: 0.75rem;
7065
+ padding: 1rem;
7066
+ background-color: hsl(var(--background));
7067
+ color: hsl(var(--foreground));
7068
+ }
7069
+ .boff-explore-video-panel:fullscreen .boff-explore-video-frame {
7070
+ display: flex;
7071
+ flex: 1 1 auto;
7072
+ min-height: 0;
7073
+ align-items: center;
7074
+ justify-content: center;
7075
+ border: 0;
7076
+ border-radius: 0;
7077
+ box-shadow: none;
7078
+ background-color: hsl(var(--background));
7079
+ }
7080
+ .boff-explore-video-panel:fullscreen video {
7081
+ width: 100%;
7082
+ height: 100%;
7083
+ max-height: none;
7084
+ }
7085
+ `;
7086
+ var DIALOG_BUTTON = "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";
7087
+ function ExploreVideoDialog({
7088
+ videoUrl,
7089
+ posterUrl,
7090
+ title,
7091
+ strings: T,
7092
+ dir,
7093
+ onClose
7094
+ }) {
7095
+ const dialogRef = useRef(null);
7096
+ const panelRef = useRef(null);
7097
+ const videoRef = useRef(null);
7098
+ const closeRef = useRef(null);
7099
+ const nativeModalRef = useRef(false);
7100
+ const titleId = useId();
7101
+ const [support] = useState(fullscreenSupport);
7102
+ const [fullscreen, setFullscreen] = useState(false);
7103
+ const [failed, setFailed] = useState(false);
7104
+ useEffect(() => {
7105
+ const dialog = dialogRef.current;
7106
+ if (!dialog) return;
7107
+ if (typeof dialog.showModal === "function") {
7108
+ if (!dialog.open) dialog.showModal();
7109
+ nativeModalRef.current = true;
7110
+ } else {
7111
+ dialog.setAttribute("open", "");
7112
+ nativeModalRef.current = false;
7113
+ }
7114
+ closeRef.current?.focus();
7115
+ ignoreRejection(videoRef.current?.play());
7116
+ return () => {
7117
+ if (dialog.open && typeof dialog.close === "function") dialog.close();
7118
+ };
7119
+ }, []);
7120
+ useEffect(() => {
7121
+ const sync = () => {
7122
+ const current = document.fullscreenElement;
7123
+ setFullscreen(
7124
+ current !== null && dialogRef.current?.contains(current) === true
7125
+ );
7126
+ };
7127
+ const enter = () => setFullscreen(true);
7128
+ const leave = () => setFullscreen(false);
7129
+ const video = videoRef.current;
7130
+ document.addEventListener("fullscreenchange", sync);
7131
+ video?.addEventListener("webkitbeginfullscreen", enter);
7132
+ video?.addEventListener("webkitendfullscreen", leave);
7133
+ return () => {
7134
+ document.removeEventListener("fullscreenchange", sync);
7135
+ video?.removeEventListener("webkitbeginfullscreen", enter);
7136
+ video?.removeEventListener("webkitendfullscreen", leave);
7137
+ };
7138
+ }, [failed]);
7139
+ const leaveFullscreen = useCallback(() => {
7140
+ const current = document.fullscreenElement;
7141
+ if (current && dialogRef.current?.contains(current) && typeof document.exitFullscreen === "function") {
7142
+ ignoreRejection(document.exitFullscreen());
7143
+ }
7144
+ const video = videoRef.current;
7145
+ if (video?.webkitDisplayingFullscreen) video.webkitExitFullscreen?.();
7146
+ }, []);
7147
+ const requestClose = useCallback(() => {
7148
+ videoRef.current?.pause();
7149
+ leaveFullscreen();
7150
+ onClose();
7151
+ }, [leaveFullscreen, onClose]);
7152
+ const toggleFullscreen = useCallback(() => {
7153
+ if (fullscreen) {
7154
+ leaveFullscreen();
7155
+ return;
7156
+ }
7157
+ if (support === "element") {
7158
+ const panel = panelRef.current;
7159
+ if (panel) ignoreRejection(panel.requestFullscreen());
7160
+ return;
7161
+ }
7162
+ const video = videoRef.current;
7163
+ video?.webkitEnterFullscreen?.();
7164
+ }, [fullscreen, leaveFullscreen, support]);
7165
+ const handleClose = useCallback(
7166
+ (event) => {
7167
+ if (event.currentTarget.open) return;
7168
+ requestClose();
7169
+ },
7170
+ [requestClose]
7171
+ );
7172
+ const handleKeyDown = useCallback(
7173
+ (event) => {
7174
+ if (event.key === "Escape" && !nativeModalRef.current) {
7175
+ event.preventDefault();
7176
+ requestClose();
7177
+ }
7178
+ },
7179
+ [requestClose]
7180
+ );
7181
+ const handleStageClick = useCallback(
7182
+ (event) => {
7183
+ if (event.target === event.currentTarget) requestClose();
7184
+ },
7185
+ [requestClose]
7186
+ );
7187
+ if (typeof document === "undefined") return null;
7188
+ const fullscreenLabel = fullscreen ? T.exitFullScreen : T.enterFullScreen;
7189
+ return createPortal(
7190
+ /* @__PURE__ */ jsxs(
7191
+ "dialog",
7192
+ {
7193
+ ref: dialogRef,
7194
+ "data-boff-explore": "video-dialog",
7195
+ "aria-labelledby": titleId,
7196
+ dir,
7197
+ onClose: handleClose,
7198
+ onKeyDown: handleKeyDown,
7199
+ 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",
7200
+ children: [
7201
+ /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: VIDEO_DIALOG_CSS } }),
7202
+ /* @__PURE__ */ jsx(
7203
+ "div",
7204
+ {
7205
+ onClick: handleStageClick,
7206
+ className: "flex min-h-full items-center justify-center p-4 sm:p-6",
7207
+ children: /* @__PURE__ */ jsxs(
7208
+ "div",
7209
+ {
7210
+ ref: panelRef,
7211
+ className: "boff-explore-video-panel flex w-full min-w-0 max-w-[960px] flex-col gap-3",
7212
+ children: [
7213
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
7214
+ /* @__PURE__ */ jsx(
7215
+ "h2",
7216
+ {
7217
+ id: titleId,
7218
+ className: "min-w-0 flex-1 truncate text-sm font-semibold text-foreground sm:text-base",
7219
+ children: title
7220
+ }
7221
+ ),
7222
+ support !== null && !failed ? (
7223
+ // A plain button whose name says what pressing it does NOW, and no
7224
+ // `aria-pressed`: a toggle button's name must not change with its state, or it
7225
+ // announces "Exit full screen, pressed" — two answers to one question.
7226
+ /* @__PURE__ */ jsx(
7227
+ "button",
7228
+ {
7229
+ type: "button",
7230
+ "data-boff-explore": "video-fullscreen",
7231
+ "aria-label": fullscreenLabel,
7232
+ title: fullscreenLabel,
7233
+ onClick: toggleFullscreen,
7234
+ className: DIALOG_BUTTON,
7235
+ children: fullscreen ? /* @__PURE__ */ jsx(Minimize, { "aria-hidden": "true", className: "h-5 w-5" }) : /* @__PURE__ */ jsx(Maximize, { "aria-hidden": "true", className: "h-5 w-5" })
7236
+ }
7237
+ )
7238
+ ) : null,
7239
+ /* @__PURE__ */ jsx(
7240
+ "button",
7241
+ {
7242
+ ref: closeRef,
7243
+ type: "button",
7244
+ "data-boff-explore": "video-close",
7245
+ "aria-label": T.closeVideo,
7246
+ title: T.closeVideo,
7247
+ onClick: requestClose,
7248
+ className: DIALOG_BUTTON,
7249
+ children: /* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "h-5 w-5" })
7250
+ }
7251
+ )
7252
+ ] }),
7253
+ /* @__PURE__ */ jsx("div", { className: "boff-explore-video-frame overflow-hidden rounded-xl border border-border bg-muted shadow-lg", children: failed ? (
7254
+ // A black box with a spinning control tells the visitor nothing; this says
7255
+ // what happened, in their language.
7256
+ /* @__PURE__ */ jsxs(
7257
+ "div",
7258
+ {
7259
+ role: "alert",
7260
+ className: "flex aspect-video w-full flex-col items-center justify-center gap-2 p-6 text-center text-sm text-muted-foreground",
7261
+ children: [
7262
+ /* @__PURE__ */ jsx(VideoOff, { "aria-hidden": "true", className: "h-6 w-6" }),
7263
+ /* @__PURE__ */ jsx("p", { children: T.videoUnavailable })
7264
+ ]
7265
+ }
7266
+ )
7267
+ ) : /* @__PURE__ */ jsx(
7268
+ "video",
7269
+ {
7270
+ ref: videoRef,
7271
+ "data-boff-explore": "video-player",
7272
+ src: videoUrl,
7273
+ poster: posterUrl,
7274
+ controls: true,
7275
+ controlsList: support === "element" ? "nofullscreen" : void 0,
7276
+ playsInline: true,
7277
+ autoPlay: true,
7278
+ preload: "metadata",
7279
+ onError: () => setFailed(true),
7280
+ className: "block max-h-[80vh] w-full bg-muted object-contain"
7281
+ }
7282
+ ) })
7283
+ ]
7284
+ }
7285
+ )
7286
+ }
7287
+ )
7288
+ ]
7289
+ }
7290
+ ),
7291
+ document.body
7292
+ );
7293
+ }
6994
7294
  var EXPLORE_ANSWER_CSS = `
6995
7295
  /* Nothing inside an answer may widen the page. Model output carries long URLs, code and
6996
7296
  tables \u2014 each of those overflows a phone by default, and one overflowing child makes the
@@ -7023,6 +7323,14 @@ var EXPLORE_ANSWER_CSS = `
7023
7323
  max-width: 100%;
7024
7324
  height: auto;
7025
7325
  }
7326
+ /* A product-video poster fills the card's reserved 16:9 frame and is cropped to it. The
7327
+ blanket \`img { height: auto }\` above \u2014 and ProseStyles' own \u2014 outrank a height utility,
7328
+ and would size it by its own aspect ratio instead, leaving a band of the frame showing
7329
+ whenever a poster is not exactly 16:9. */
7330
+ .boff-explore-body .boff-explore-video-poster {
7331
+ height: 100%;
7332
+ max-width: none;
7333
+ }
7026
7334
 
7027
7335
  /* ---- Comparison and pricing tables ----------------------------------------------------
7028
7336
  The harness emits a comparison, and a set of plans, as a GFM table whose FIRST column is
@@ -7153,28 +7461,81 @@ function inlineImageOrigins(products) {
7153
7461
  }
7154
7462
  return origins;
7155
7463
  }
7156
- function isInlineImageAllowed(src, origins) {
7157
- if (typeof src !== "string" || src === "") return false;
7464
+ var VIDEO_FILE_PATH = /\.(?:mp4|webm|m4v|mov|vtt)$/i;
7465
+ function catalogUrlOf(value, origins) {
7466
+ if (typeof value !== "string" || value === "") return null;
7158
7467
  let url;
7159
7468
  try {
7160
- url = new URL(src);
7469
+ url = new URL(value);
7470
+ } catch {
7471
+ return null;
7472
+ }
7473
+ if (url.protocol !== "https:" || url.username || url.password) return null;
7474
+ return origins.has(url.origin) ? url : null;
7475
+ }
7476
+ function isInlineImageAllowed(src, origins) {
7477
+ const url = catalogUrlOf(src, origins);
7478
+ return url !== null && !VIDEO_FILE_PATH.test(url.pathname);
7479
+ }
7480
+ var INLINE_VIDEO_PATH = /\.(?:mp4|webm)$/i;
7481
+ function isInlineVideoAllowed(href, origins) {
7482
+ const url = catalogUrlOf(href, origins);
7483
+ return url !== null && INLINE_VIDEO_PATH.test(url.pathname);
7484
+ }
7485
+ function apexOriginOf(url) {
7486
+ const apex = url.hostname.replace(/^www\./, "");
7487
+ const port = url.port ? `:${url.port}` : "";
7488
+ return `https://${apex}${port}`;
7489
+ }
7490
+ function productSlugsByOrigin(products) {
7491
+ const slugs = /* @__PURE__ */ new Map();
7492
+ for (const product of products) {
7493
+ let url;
7494
+ try {
7495
+ url = new URL(product.website);
7496
+ } catch {
7497
+ continue;
7498
+ }
7499
+ if (url.protocol !== "https:") continue;
7500
+ const key = apexOriginOf(url);
7501
+ if (!slugs.has(key)) slugs.set(key, product.slug);
7502
+ }
7503
+ return slugs;
7504
+ }
7505
+ function videoProductOf(href, slugs) {
7506
+ const url = new URL(href);
7507
+ return slugs.get(apexOriginOf(url)) ?? url.hostname.replace(/^www\./, "");
7508
+ }
7509
+ function isVideoFileTarget(href) {
7510
+ if (typeof href !== "string") return false;
7511
+ try {
7512
+ return VIDEO_FILE_PATH.test(
7513
+ new URL(href, "https://answer.invalid").pathname
7514
+ );
7161
7515
  } catch {
7162
7516
  return false;
7163
7517
  }
7164
- if (url.protocol !== "https:" || url.username || url.password) return false;
7165
- return origins.has(url.origin);
7166
7518
  }
7167
7519
  var CODE_FENCE = /^\s*(?:```|~~~)/;
7168
7520
  var TABLE_ROW_LINE = /^\s{0,3}\|/;
7169
7521
  var TABLE_DELIMITER_ROW = /^\s{0,3}\|[\s:|-]*-[\s:|-]*$/;
7522
+ var LINKED_IMAGE = /\[!\[([^[\]]*)\]\([^)\s]*(?:\s+"[^"]*")?\)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
7523
+ var IMAGE = /!\[[^[\]]*\]\([^)\s]*(?:\s+"[^"]*")?\)/g;
7524
+ var LINK = /\[([^[\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
7170
7525
  function readableLine(raw, mode) {
7171
7526
  let line = raw;
7172
- line = line.replace(/!\[[^\]]*\]\([^)\s]*(?:\s+"[^"]*")?\)/g, "");
7173
- line = mode === "speech" ? (
7174
- // A voice reading "h-t-t-p-s colon slash slash…" mid-sentence is noise, and the
7175
- // prompt asks for two to five links in every answer. The label IS the words.
7176
- line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1")
7177
- ) : line.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g, "$1 ($2)");
7527
+ if (line.includes("](")) {
7528
+ line = line.replace(LINKED_IMAGE, (_match, alt, href) => {
7529
+ if (mode === "speech") return "";
7530
+ return alt.trim() === "" ? href : `${alt.trim()} (${href})`;
7531
+ });
7532
+ line = line.replace(IMAGE, "");
7533
+ line = mode === "speech" ? (
7534
+ // A voice reading "h-t-t-p-s colon slash slash…" mid-sentence is noise, and the
7535
+ // prompt asks for two to five links in every answer. The label IS the words.
7536
+ line.replace(LINK, "$1")
7537
+ ) : line.replace(LINK, "$1 ($2)");
7538
+ }
7178
7539
  line = mode === "speech" ? line.replace(/<(https?:\/\/[^>\s]+)>/g, "") : line.replace(/<(https?:\/\/[^>\s]+)>/g, "$1");
7179
7540
  line = line.replace(/^\s{0,3}#{1,6}\s+/, "");
7180
7541
  line = line.replace(/^\s{0,3}>\s?/, "");
@@ -7265,6 +7626,21 @@ function answerSpeechText(markdown) {
7265
7626
  var AnswerScopeContext = createContext(null);
7266
7627
  var InsideLinkContext = createContext(false);
7267
7628
  function AnswerLink(props) {
7629
+ const scope = useContext(AnswerScopeContext);
7630
+ const role = videoRoleOf(props.node);
7631
+ if (role !== void 0 && scope !== null) {
7632
+ const video = role === "card" && scope.enabled ? productVideoOf(props.node) : null;
7633
+ if (video === null) return null;
7634
+ return /* @__PURE__ */ jsx(
7635
+ InlineVideoCard,
7636
+ {
7637
+ href: video.href,
7638
+ poster: video.poster,
7639
+ alt: video.alt,
7640
+ scope
7641
+ }
7642
+ );
7643
+ }
7268
7644
  return /* @__PURE__ */ jsx(InsideLinkContext.Provider, { value: true, children: /* @__PURE__ */ jsx(MarkdownLink, { ...props }) });
7269
7645
  }
7270
7646
  var INLINE_IMAGE_FRAME = "relative inline-block max-w-full overflow-hidden rounded-xl border border-border bg-muted align-top shadow-sm";
@@ -7376,16 +7752,173 @@ function AnswerTableRow({
7376
7752
  });
7377
7753
  return /* @__PURE__ */ jsx("tr", { ...props, children: cells });
7378
7754
  }
7755
+ function linkedImageOf(node) {
7756
+ if (node?.tagName !== "a") return null;
7757
+ const content = (node.children ?? []).filter(
7758
+ (child) => child.tagName !== void 0 || (child.value ?? "").trim() !== ""
7759
+ );
7760
+ const image = content.length === 1 ? content[0] : void 0;
7761
+ if (image?.tagName !== "img") return null;
7762
+ const alt = image.properties?.alt;
7763
+ return {
7764
+ href: node.properties?.href,
7765
+ src: image.properties?.src,
7766
+ alt: typeof alt === "string" ? alt.trim() : ""
7767
+ };
7768
+ }
7769
+ function isCardableVideo(embed, origins) {
7770
+ if (!isInlineVideoAllowed(embed.href, origins) || !isInlineImageAllowed(embed.src, origins)) {
7771
+ return false;
7772
+ }
7773
+ return apexOriginOf(new URL(embed.href)) === apexOriginOf(new URL(embed.src));
7774
+ }
7775
+ var NO_VIDEO_CONTAINERS = /* @__PURE__ */ new Set(["li", "table"]);
7776
+ function rehypeProductVideo(options) {
7777
+ return (tree) => {
7778
+ let claimed = false;
7779
+ const visit = (node, parent, contained) => {
7780
+ const embed = linkedImageOf(node);
7781
+ if (embed !== null && isVideoFileTarget(embed.href)) {
7782
+ const card = !claimed && !contained && parent?.tagName === "p" && isCardableVideo(embed, options.origins);
7783
+ if (card) claimed = true;
7784
+ const data = typeof node.data === "object" ? node.data : null;
7785
+ node.data = { ...data, boffVideo: card ? "card" : "drop" };
7786
+ return;
7787
+ }
7788
+ const inside = contained || node.tagName !== void 0 && NO_VIDEO_CONTAINERS.has(node.tagName);
7789
+ for (const child of node.children ?? []) visit(child, node, inside);
7790
+ };
7791
+ visit(tree, null, false);
7792
+ };
7793
+ }
7794
+ function videoRoleOf(node) {
7795
+ const data = node?.data;
7796
+ if (typeof data !== "object" || data === null || !("boffVideo" in data)) {
7797
+ return void 0;
7798
+ }
7799
+ return data.boffVideo === "card" || data.boffVideo === "drop" ? data.boffVideo : void 0;
7800
+ }
7801
+ function productVideoOf(node) {
7802
+ const embed = linkedImageOf(node);
7803
+ if (embed === null || typeof embed.href !== "string" || typeof embed.src !== "string") {
7804
+ return null;
7805
+ }
7806
+ return { href: embed.href, poster: embed.src, alt: embed.alt };
7807
+ }
7808
+ var CANONICAL_VIDEO_ALT = /^(.+?)\s+product video$/i;
7809
+ function videoTitleOf(alt, T) {
7810
+ const product = CANONICAL_VIDEO_ALT.exec(alt)?.[1]?.trim();
7811
+ if (product) return fill(T.productVideoTitle, { product });
7812
+ return alt === "" ? T.productVideo : alt;
7813
+ }
7814
+ var INLINE_VIDEO_FRAME = "group relative block aspect-video w-full max-w-md overflow-hidden rounded-xl border border-border bg-muted shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
7815
+ function InlineVideoCard({
7816
+ href,
7817
+ poster,
7818
+ alt,
7819
+ scope
7820
+ }) {
7821
+ const { strings: T, failed, onFailed, productSlugs } = scope;
7822
+ const [dialogDir, setDialogDir] = useState(null);
7823
+ const buttonRef = useRef(null);
7824
+ const returnFocusRef = useRef(false);
7825
+ const open = dialogDir !== null;
7826
+ useEffect(() => {
7827
+ if (open || !returnFocusRef.current) return;
7828
+ returnFocusRef.current = false;
7829
+ const button = buttonRef.current;
7830
+ if (button?.isConnected) button.focus();
7831
+ }, [open]);
7832
+ const openPlayer = useCallback((event) => {
7833
+ const dir = event.currentTarget.closest("[dir]")?.getAttribute("dir");
7834
+ returnFocusRef.current = true;
7835
+ setDialogDir(dir === "rtl" ? "rtl" : "ltr");
7836
+ }, []);
7837
+ const closePlayer = useCallback(() => setDialogDir(null), []);
7838
+ const name = videoTitleOf(alt, T);
7839
+ const posterFailed = failed.has(poster);
7840
+ return /* @__PURE__ */ jsxs(
7841
+ "span",
7842
+ {
7843
+ "data-boff-explore": "inline-video",
7844
+ "data-product": videoProductOf(href, productSlugs),
7845
+ className: "my-3 block",
7846
+ children: [
7847
+ /* @__PURE__ */ jsxs(
7848
+ "button",
7849
+ {
7850
+ ref: buttonRef,
7851
+ type: "button",
7852
+ "aria-haspopup": "dialog",
7853
+ "aria-label": fill(T.playVideo, { title: name }),
7854
+ onClick: openPlayer,
7855
+ className: INLINE_VIDEO_FRAME,
7856
+ children: [
7857
+ posterFailed ? /* @__PURE__ */ jsx(
7858
+ "span",
7859
+ {
7860
+ "aria-hidden": "true",
7861
+ className: "absolute inset-0 flex items-center justify-center bg-muted text-muted-foreground",
7862
+ children: /* @__PURE__ */ jsx(Film, { className: "h-10 w-10" })
7863
+ }
7864
+ ) : /* @__PURE__ */ jsx(
7865
+ "img",
7866
+ {
7867
+ src: poster,
7868
+ alt: "",
7869
+ loading: "lazy",
7870
+ decoding: "async",
7871
+ onError: () => onFailed(poster),
7872
+ className: "boff-explore-video-poster absolute inset-0 h-full w-full object-cover"
7873
+ }
7874
+ ),
7875
+ /* @__PURE__ */ jsx(
7876
+ "span",
7877
+ {
7878
+ "aria-hidden": "true",
7879
+ className: "pointer-events-none absolute inset-0 flex items-center justify-center",
7880
+ children: /* @__PURE__ */ jsx("span", { className: "flex h-14 w-14 items-center justify-center rounded-full border border-border bg-background/90 text-foreground shadow-md transition-transform group-hover:scale-105", children: /* @__PURE__ */ jsx(Play, { className: "h-6 w-6 fill-current" }) })
7881
+ }
7882
+ ),
7883
+ /* @__PURE__ */ jsx(
7884
+ "span",
7885
+ {
7886
+ "aria-hidden": "true",
7887
+ className: "pointer-events-none absolute start-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",
7888
+ children: T.productVideo
7889
+ }
7890
+ )
7891
+ ]
7892
+ }
7893
+ ),
7894
+ open ? /* @__PURE__ */ jsx(
7895
+ ExploreVideoDialog,
7896
+ {
7897
+ videoUrl: href,
7898
+ posterUrl: poster,
7899
+ title: name,
7900
+ strings: T,
7901
+ dir: dialogDir,
7902
+ onClose: closePlayer
7903
+ }
7904
+ ) : null
7905
+ ]
7906
+ }
7907
+ );
7908
+ }
7379
7909
  var ANSWER_MARKDOWN_COMPONENTS = {
7380
7910
  a: AnswerLink,
7381
7911
  img: InlineConceptImage,
7382
7912
  table: AnswerTable,
7383
7913
  tr: AnswerTableRow
7384
7914
  };
7915
+ var NO_PRODUCT_SLUGS = /* @__PURE__ */ new Map();
7385
7916
  function ExploreAnswerBody({
7386
7917
  children,
7387
7918
  strings,
7388
7919
  imageOrigins,
7920
+ videoOrigins = imageOrigins,
7921
+ productSlugs = NO_PRODUCT_SLUGS,
7389
7922
  enabled = true,
7390
7923
  components,
7391
7924
  className
@@ -7401,16 +7934,21 @@ function ExploreAnswerBody({
7401
7934
  strings,
7402
7935
  enabled,
7403
7936
  origins: imageOrigins,
7937
+ productSlugs,
7404
7938
  failed,
7405
7939
  onFailed
7406
7940
  }),
7407
- [strings, enabled, imageOrigins, failed, onFailed]
7941
+ [strings, enabled, imageOrigins, productSlugs, failed, onFailed]
7942
+ );
7943
+ const rehypePlugins = useMemo(
7944
+ () => [[rehypeProductVideo, { origins: videoOrigins }]],
7945
+ [videoOrigins]
7408
7946
  );
7409
7947
  const overrides = useMemo(
7410
7948
  () => components ? { ...ANSWER_MARKDOWN_COMPONENTS, ...components } : ANSWER_MARKDOWN_COMPONENTS,
7411
7949
  [components]
7412
7950
  );
7413
- return /* @__PURE__ */ jsx("div", { className: cn("boff-prose boff-explore-body min-w-0", className), children: /* @__PURE__ */ jsx(AnswerScopeContext.Provider, { value: scope, children: /* @__PURE__ */ jsx(Markdown, { components: overrides, children }) }) });
7951
+ return /* @__PURE__ */ jsx("div", { className: cn("boff-prose boff-explore-body min-w-0", className), children: /* @__PURE__ */ jsx(AnswerScopeContext.Provider, { value: scope, children: /* @__PURE__ */ jsx(Markdown, { components: overrides, rehypePlugins, children }) }) });
7414
7952
  }
7415
7953
  var PROSE_CSS = `
7416
7954
  .boff-prose {
@@ -7588,60 +8126,239 @@ var PROSE_CSS = `
7588
8126
  function ProseStyles() {
7589
8127
  return /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: PROSE_CSS } });
7590
8128
  }
7591
- var META_DESCRIPTION_LIMIT2 = 160;
7592
- var TITLE_LIMIT = 100;
7593
- var RELATED_LIMIT2 = 4;
7594
- function normaliseSiteUrl2(siteUrl) {
7595
- return siteUrl.trim().replace(/\/+$/, "");
7596
- }
7597
- function absoluteUrl2(base, path) {
7598
- if (/^https?:\/\//i.test(path)) return path;
7599
- return `${base}${path.startsWith("/") ? path : `/${path}`}`;
7600
- }
7601
- function sortByOrder2(answers) {
7602
- return [...answers].sort(
7603
- (a, b) => a.order - b.order || a.slug.localeCompare(b.slug)
7604
- );
7605
- }
7606
- function clampText2(text, limit) {
7607
- if (text.length <= limit) return text;
7608
- const cut = text.slice(0, limit - 1);
7609
- const lastSpace = cut.lastIndexOf(" ");
7610
- return `${(lastSpace > 0 ? cut.slice(0, lastSpace) : cut).replace(/[\s,;:—–-]+$/, "")}\u2026`;
7611
- }
7612
- function questionCount(T, count) {
7613
- return count === 1 ? T.questionCountOne : fill(T.questionCountMany, { count: String(count) });
7614
- }
7615
- function sourceCount(T, count) {
7616
- return count === 1 ? T.sourceCountOne : fill(T.sourceCountMany, { count: String(count) });
7617
- }
7618
- function slugifyAnchor2(value) {
7619
- return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
7620
- }
7621
- function publishableSources(sources) {
7622
- const seen = /* @__PURE__ */ new Set();
7623
- const kept = [];
7624
- for (const source of sources) {
7625
- if (!isPublishedSourceUrl(source.url) || seen.has(source.url)) continue;
7626
- seen.add(source.url);
7627
- kept.push(source);
7628
- }
7629
- return kept;
7630
- }
7631
- function groupByTopic(ordered, topics) {
7632
- const byName = /* @__PURE__ */ new Map();
7633
- for (const answer of ordered) {
7634
- const list = byName.get(answer.topic);
7635
- if (list) list.push(answer);
7636
- else byName.set(answer.topic, [answer]);
7637
- }
7638
- const described = [];
7639
- for (const topic of topics ?? []) {
7640
- const list = byName.get(topic.name);
7641
- if (!list) continue;
7642
- described.push({
7643
- name: topic.name,
7644
- description: topic.description,
8129
+
8130
+ // src/data/products.ts
8131
+ var ECOSYSTEM_PRODUCTS = [
8132
+ {
8133
+ slug: "workspaces",
8134
+ name: "Workspaces",
8135
+ websiteUrl: "https://burdenoff.com"
8136
+ },
8137
+ {
8138
+ slug: "vibecontrols",
8139
+ name: "VibeControls",
8140
+ websiteUrl: "https://vibecontrols.com"
8141
+ },
8142
+ // FluidGrids ships on www.fluidgrids.ai — fluidgrids.com only redirects there. The explore
8143
+ // catalog and the site's own sitemap use this origin, and so must the fallback catalog
8144
+ // built from this list, or /explore rejects FluidGrids concept images until it loads.
8145
+ {
8146
+ slug: "fluidgrids",
8147
+ name: "FluidGrids",
8148
+ websiteUrl: "https://www.fluidgrids.ai"
8149
+ },
8150
+ // BotManor ships on www.botmanor.com (the apex redirects there; the old botlit.ai domain
8151
+ // still serves the same site but is no longer the name we link to).
8152
+ { slug: "botlit", name: "BotManor", websiteUrl: "https://www.botmanor.com" },
8153
+ {
8154
+ slug: "bigconsole",
8155
+ name: "BigConsole",
8156
+ websiteUrl: "https://bigconsole.com"
8157
+ },
8158
+ {
8159
+ slug: "semanticfed",
8160
+ name: "SemanticFed",
8161
+ websiteUrl: "https://semanticfed.com"
8162
+ },
8163
+ {
8164
+ slug: "intelwatchtower",
8165
+ name: "IntelWatchtower",
8166
+ websiteUrl: "https://intelwatchtower.com"
8167
+ },
8168
+ { slug: "buildmyiq", name: "BuildMyIQ", websiteUrl: "https://buildmyiq.com" },
8169
+ {
8170
+ slug: "assethandler",
8171
+ name: "AssetHandler",
8172
+ websiteUrl: "https://assethandler.com"
8173
+ },
8174
+ {
8175
+ slug: "crewfoundry",
8176
+ name: "CrewFoundry",
8177
+ websiteUrl: "https://crewfoundry.com"
8178
+ },
8179
+ {
8180
+ slug: "planmagnet",
8181
+ name: "PlanMagnet",
8182
+ websiteUrl: "https://planmagnet.com"
8183
+ },
8184
+ {
8185
+ slug: "eventfullymanaged",
8186
+ name: "EventfullyManaged",
8187
+ websiteUrl: "https://eventfullymanaged.com"
8188
+ },
8189
+ {
8190
+ slug: "headshotmarketing",
8191
+ name: "HeadshotMarketing",
8192
+ websiteUrl: "https://headshotmarketing.com"
8193
+ },
8194
+ {
8195
+ slug: "technospam",
8196
+ name: "TechnoSpam",
8197
+ websiteUrl: "https://technospam.com"
8198
+ },
8199
+ { slug: "kadaikodi", name: "Kadaikodi", websiteUrl: "https://kadaikodi.com" },
8200
+ {
8201
+ slug: "movethewheels",
8202
+ name: "MoveTheWheels",
8203
+ websiteUrl: "https://movethewheels.com"
8204
+ },
8205
+ {
8206
+ slug: "healthybowl",
8207
+ name: "Healthy Bowl",
8208
+ websiteUrl: "https://gethealthybowl.com"
8209
+ },
8210
+ { slug: "ggnomad", name: "GGNomad", websiteUrl: "https://ggnomad.com" },
8211
+ {
8212
+ slug: "timecampus",
8213
+ name: "TimeCampus",
8214
+ websiteUrl: "https://timecampus.com"
8215
+ },
8216
+ {
8217
+ slug: "manufacturedops",
8218
+ name: "ManufacturedOps",
8219
+ websiteUrl: "https://manufacturedops.com"
8220
+ },
8221
+ {
8222
+ slug: "theglobalfuel",
8223
+ name: "TheGlobalFuel",
8224
+ websiteUrl: "https://theglobalfuel.com"
8225
+ },
8226
+ {
8227
+ slug: "housingvista",
8228
+ name: "HousingVista",
8229
+ websiteUrl: "https://housingvista.com"
8230
+ },
8231
+ {
8232
+ slug: "proserviceworld",
8233
+ name: "ProServiceWorld",
8234
+ websiteUrl: "https://proserviceworld.com"
8235
+ },
8236
+ {
8237
+ slug: "mybodyshield",
8238
+ name: "MyBodyShield",
8239
+ websiteUrl: "https://mybodyshield.com"
8240
+ },
8241
+ {
8242
+ slug: "artistrybase",
8243
+ name: "ArtistryBase",
8244
+ websiteUrl: "https://artistrybase.com"
8245
+ },
8246
+ {
8247
+ slug: "theculturepost",
8248
+ name: "TheCulturePost",
8249
+ websiteUrl: "https://theculturepost.com"
8250
+ },
8251
+ { slug: "collabkin", name: "CollabKin", websiteUrl: "https://collabkin.com" },
8252
+ {
8253
+ slug: "comradecircle",
8254
+ name: "ComradeCircle",
8255
+ websiteUrl: "https://comradecircle.com"
8256
+ },
8257
+ {
8258
+ slug: "brainyrich",
8259
+ name: "BrainyRich",
8260
+ websiteUrl: "https://brainyrich.com"
8261
+ },
8262
+ {
8263
+ slug: "cosmicintersection",
8264
+ name: "CosmicIntersection",
8265
+ websiteUrl: "https://cosmicintersection.com"
8266
+ },
8267
+ {
8268
+ slug: "govcitizenhub",
8269
+ name: "GovCitizenHub",
8270
+ websiteUrl: "https://govcitizenhub.com"
8271
+ },
8272
+ {
8273
+ slug: "adaptercloud",
8274
+ name: "AdapterCloud",
8275
+ websiteUrl: "https://adaptercloud.com"
8276
+ },
8277
+ {
8278
+ slug: "subscriberbot",
8279
+ name: "Subscriber Bot",
8280
+ websiteUrl: "https://subscriberbot.com"
8281
+ },
8282
+ {
8283
+ slug: "hookmovies",
8284
+ name: "HookMovies",
8285
+ websiteUrl: "https://hookmovies.com"
8286
+ },
8287
+ {
8288
+ slug: "coolandlovely",
8289
+ name: "CoolAndLovely",
8290
+ websiteUrl: "https://coolandlovely.com"
8291
+ },
8292
+ {
8293
+ slug: "atheletebridge",
8294
+ name: "AthleteBridge",
8295
+ websiteUrl: "https://atheletebridge.com"
8296
+ },
8297
+ {
8298
+ slug: "labsofscience",
8299
+ name: "LabsOfScience",
8300
+ websiteUrl: "https://labsofscience.com"
8301
+ },
8302
+ {
8303
+ slug: "ecoimpacthub",
8304
+ name: "EcoImpactHub",
8305
+ websiteUrl: "https://ecoimpacthub.com"
8306
+ }
8307
+ ];
8308
+ var META_DESCRIPTION_LIMIT2 = 160;
8309
+ var TITLE_LIMIT = 100;
8310
+ var RELATED_LIMIT2 = 4;
8311
+ function normaliseSiteUrl2(siteUrl) {
8312
+ return siteUrl.trim().replace(/\/+$/, "");
8313
+ }
8314
+ function absoluteUrl2(base, path) {
8315
+ if (/^https?:\/\//i.test(path)) return path;
8316
+ return `${base}${path.startsWith("/") ? path : `/${path}`}`;
8317
+ }
8318
+ function sortByOrder2(answers) {
8319
+ return [...answers].sort(
8320
+ (a, b) => a.order - b.order || a.slug.localeCompare(b.slug)
8321
+ );
8322
+ }
8323
+ function clampText2(text, limit) {
8324
+ if (text.length <= limit) return text;
8325
+ const cut = text.slice(0, limit - 1);
8326
+ const lastSpace = cut.lastIndexOf(" ");
8327
+ return `${(lastSpace > 0 ? cut.slice(0, lastSpace) : cut).replace(/[\s,;:—–-]+$/, "")}\u2026`;
8328
+ }
8329
+ function questionCount(T, count) {
8330
+ return count === 1 ? T.questionCountOne : fill(T.questionCountMany, { count: String(count) });
8331
+ }
8332
+ function sourceCount(T, count) {
8333
+ return count === 1 ? T.sourceCountOne : fill(T.sourceCountMany, { count: String(count) });
8334
+ }
8335
+ function slugifyAnchor2(value) {
8336
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
8337
+ }
8338
+ function publishableSources(sources) {
8339
+ const seen = /* @__PURE__ */ new Set();
8340
+ const kept = [];
8341
+ for (const source of sources) {
8342
+ if (!isPublishedSourceUrl(source.url) || seen.has(source.url)) continue;
8343
+ seen.add(source.url);
8344
+ kept.push(source);
8345
+ }
8346
+ return kept;
8347
+ }
8348
+ function groupByTopic(ordered, topics) {
8349
+ const byName = /* @__PURE__ */ new Map();
8350
+ for (const answer of ordered) {
8351
+ const list = byName.get(answer.topic);
8352
+ if (list) list.push(answer);
8353
+ else byName.set(answer.topic, [answer]);
8354
+ }
8355
+ const described = [];
8356
+ for (const topic of topics ?? []) {
8357
+ const list = byName.get(topic.name);
8358
+ if (!list) continue;
8359
+ described.push({
8360
+ name: topic.name,
8361
+ description: topic.description,
7645
8362
  answers: list
7646
8363
  });
7647
8364
  byName.delete(topic.name);
@@ -7693,6 +8410,12 @@ var ANSWER_HEADING_SHIFT = {
7693
8410
  h6: demoteHeading("h6")
7694
8411
  };
7695
8412
  var ENGLISH_TEXT = { lang: "en" };
8413
+ var ECOSYSTEM_SITES = ECOSYSTEM_PRODUCTS.map((product) => ({
8414
+ slug: product.slug,
8415
+ website: product.websiteUrl
8416
+ }));
8417
+ var ECOSYSTEM_PRODUCT_SLUGS = productSlugsByOrigin(ECOSYSTEM_SITES);
8418
+ var ECOSYSTEM_ORIGINS = inlineImageOrigins(ECOSYSTEM_SITES);
7696
8419
  function DefaultAnswerLink({
7697
8420
  href,
7698
8421
  className,
@@ -8191,6 +8914,10 @@ function AnswerDetail({
8191
8914
  ]),
8192
8915
  [base, sources, imageOrigins]
8193
8916
  );
8917
+ const answerVideoOrigins = useMemo(
8918
+ () => /* @__PURE__ */ new Set([...answerImageOrigins, ...ECOSYSTEM_ORIGINS]),
8919
+ [answerImageOrigins]
8920
+ );
8194
8921
  const canonical = absoluteUrl2(base, answerPath(answer.slug));
8195
8922
  const answerText = useMemo(
8196
8923
  () => answerSpeechText(answer.answer),
@@ -8352,6 +9079,8 @@ function AnswerDetail({
8352
9079
  {
8353
9080
  strings: T,
8354
9081
  imageOrigins: answerImageOrigins,
9082
+ videoOrigins: answerVideoOrigins,
9083
+ productSlugs: ECOSYSTEM_PRODUCT_SLUGS,
8355
9084
  components: ANSWER_HEADING_SHIFT,
8356
9085
  className: "mt-4",
8357
9086
  children: answer.answer
@@ -8713,184 +9442,6 @@ var EXPLORE_SHARED_CONVERSATION_QUERY = (
8713
9442
  `
8714
9443
  );
8715
9444
 
8716
- // src/data/products.ts
8717
- var ECOSYSTEM_PRODUCTS = [
8718
- {
8719
- slug: "workspaces",
8720
- name: "Workspaces",
8721
- websiteUrl: "https://burdenoff.com"
8722
- },
8723
- {
8724
- slug: "vibecontrols",
8725
- name: "VibeControls",
8726
- websiteUrl: "https://vibecontrols.com"
8727
- },
8728
- // FluidGrids ships on www.fluidgrids.ai — fluidgrids.com only redirects there. The explore
8729
- // catalog and the site's own sitemap use this origin, and so must the fallback catalog
8730
- // built from this list, or /explore rejects FluidGrids concept images until it loads.
8731
- {
8732
- slug: "fluidgrids",
8733
- name: "FluidGrids",
8734
- websiteUrl: "https://www.fluidgrids.ai"
8735
- },
8736
- // BotManor ships on botlit.ai — botlit.com does not resolve.
8737
- { slug: "botlit", name: "BotManor", websiteUrl: "https://www.botlit.ai" },
8738
- {
8739
- slug: "bigconsole",
8740
- name: "BigConsole",
8741
- websiteUrl: "https://bigconsole.com"
8742
- },
8743
- {
8744
- slug: "semanticfed",
8745
- name: "SemanticFed",
8746
- websiteUrl: "https://semanticfed.com"
8747
- },
8748
- {
8749
- slug: "intelwatchtower",
8750
- name: "IntelWatchtower",
8751
- websiteUrl: "https://intelwatchtower.com"
8752
- },
8753
- { slug: "buildmyiq", name: "BuildMyIQ", websiteUrl: "https://buildmyiq.com" },
8754
- {
8755
- slug: "assethandler",
8756
- name: "AssetHandler",
8757
- websiteUrl: "https://assethandler.com"
8758
- },
8759
- {
8760
- slug: "crewfoundry",
8761
- name: "CrewFoundry",
8762
- websiteUrl: "https://crewfoundry.com"
8763
- },
8764
- {
8765
- slug: "planmagnet",
8766
- name: "PlanMagnet",
8767
- websiteUrl: "https://planmagnet.com"
8768
- },
8769
- {
8770
- slug: "eventfullymanaged",
8771
- name: "EventfullyManaged",
8772
- websiteUrl: "https://eventfullymanaged.com"
8773
- },
8774
- {
8775
- slug: "headshotmarketing",
8776
- name: "HeadshotMarketing",
8777
- websiteUrl: "https://headshotmarketing.com"
8778
- },
8779
- {
8780
- slug: "technospam",
8781
- name: "TechnoSpam",
8782
- websiteUrl: "https://technospam.com"
8783
- },
8784
- { slug: "kadaikodi", name: "Kadaikodi", websiteUrl: "https://kadaikodi.com" },
8785
- {
8786
- slug: "movethewheels",
8787
- name: "MoveTheWheels",
8788
- websiteUrl: "https://movethewheels.com"
8789
- },
8790
- {
8791
- slug: "healthybowl",
8792
- name: "Healthy Bowl",
8793
- websiteUrl: "https://gethealthybowl.com"
8794
- },
8795
- { slug: "ggnomad", name: "GGNomad", websiteUrl: "https://ggnomad.com" },
8796
- {
8797
- slug: "timecampus",
8798
- name: "TimeCampus",
8799
- websiteUrl: "https://timecampus.com"
8800
- },
8801
- {
8802
- slug: "manufacturedops",
8803
- name: "ManufacturedOps",
8804
- websiteUrl: "https://manufacturedops.com"
8805
- },
8806
- {
8807
- slug: "theglobalfuel",
8808
- name: "TheGlobalFuel",
8809
- websiteUrl: "https://theglobalfuel.com"
8810
- },
8811
- {
8812
- slug: "housingvista",
8813
- name: "HousingVista",
8814
- websiteUrl: "https://housingvista.com"
8815
- },
8816
- {
8817
- slug: "proserviceworld",
8818
- name: "ProServiceWorld",
8819
- websiteUrl: "https://proserviceworld.com"
8820
- },
8821
- {
8822
- slug: "mybodyshield",
8823
- name: "MyBodyShield",
8824
- websiteUrl: "https://mybodyshield.com"
8825
- },
8826
- {
8827
- slug: "artistrybase",
8828
- name: "ArtistryBase",
8829
- websiteUrl: "https://artistrybase.com"
8830
- },
8831
- {
8832
- slug: "theculturepost",
8833
- name: "TheCulturePost",
8834
- websiteUrl: "https://theculturepost.com"
8835
- },
8836
- { slug: "collabkin", name: "CollabKin", websiteUrl: "https://collabkin.com" },
8837
- {
8838
- slug: "comradecircle",
8839
- name: "ComradeCircle",
8840
- websiteUrl: "https://comradecircle.com"
8841
- },
8842
- {
8843
- slug: "brainyrich",
8844
- name: "BrainyRich",
8845
- websiteUrl: "https://brainyrich.com"
8846
- },
8847
- {
8848
- slug: "cosmicintersection",
8849
- name: "CosmicIntersection",
8850
- websiteUrl: "https://cosmicintersection.com"
8851
- },
8852
- {
8853
- slug: "govcitizenhub",
8854
- name: "GovCitizenHub",
8855
- websiteUrl: "https://govcitizenhub.com"
8856
- },
8857
- {
8858
- slug: "adaptercloud",
8859
- name: "AdapterCloud",
8860
- websiteUrl: "https://adaptercloud.com"
8861
- },
8862
- {
8863
- slug: "subscriberbot",
8864
- name: "Subscriber Bot",
8865
- websiteUrl: "https://subscriberbot.com"
8866
- },
8867
- {
8868
- slug: "hookmovies",
8869
- name: "HookMovies",
8870
- websiteUrl: "https://hookmovies.com"
8871
- },
8872
- {
8873
- slug: "coolandlovely",
8874
- name: "CoolAndLovely",
8875
- websiteUrl: "https://coolandlovely.com"
8876
- },
8877
- {
8878
- slug: "atheletebridge",
8879
- name: "AthleteBridge",
8880
- websiteUrl: "https://atheletebridge.com"
8881
- },
8882
- {
8883
- slug: "labsofscience",
8884
- name: "LabsOfScience",
8885
- websiteUrl: "https://labsofscience.com"
8886
- },
8887
- {
8888
- slug: "ecoimpacthub",
8889
- name: "EcoImpactHub",
8890
- websiteUrl: "https://ecoimpacthub.com"
8891
- }
8892
- ];
8893
-
8894
9445
  // src/utils/recaptcha-v3.ts
8895
9446
  var SCRIPT_ID = "boff-recaptcha-v3";
8896
9447
  var SCRIPT_SRC = "https://www.google.com/recaptcha/api.js?render=";
@@ -10008,7 +10559,7 @@ function isHighSurrogate(code) {
10008
10559
  }
10009
10560
  function safeInlineEnd(line) {
10010
10561
  let codeSpan = null;
10011
- let link = null;
10562
+ const links = [];
10012
10563
  const emphasis = [];
10013
10564
  let at = 0;
10014
10565
  while (at < line.length) {
@@ -10017,6 +10568,13 @@ function safeInlineEnd(line) {
10017
10568
  at += 2;
10018
10569
  continue;
10019
10570
  }
10571
+ const innermost = links[links.length - 1];
10572
+ if (innermost !== void 0 && innermost.kind !== "label") {
10573
+ if (char === "(") links.push({ kind: "paren", start: innermost.start });
10574
+ else if (char === ")") links.pop();
10575
+ at += 1;
10576
+ continue;
10577
+ }
10020
10578
  if (char === "`") {
10021
10579
  let run = 1;
10022
10580
  while (line[at + run] === "`") run += 1;
@@ -10029,17 +10587,17 @@ function safeInlineEnd(line) {
10029
10587
  continue;
10030
10588
  }
10031
10589
  if (char === "[") {
10032
- if (link === null) link = line[at - 1] === "!" ? at - 1 : at;
10590
+ links.push({ kind: "label", start: line[at - 1] === "!" ? at - 1 : at });
10033
10591
  at += 1;
10034
10592
  continue;
10035
10593
  }
10036
- if (char === "]") {
10037
- if (link !== null && line[at + 1] !== "(") link = null;
10038
- at += 1;
10039
- continue;
10040
- }
10041
- if (char === ")") {
10042
- link = null;
10594
+ if (char === "]" && innermost !== void 0) {
10595
+ links.pop();
10596
+ if (line[at + 1] === "(") {
10597
+ links.push({ kind: "destination", start: innermost.start });
10598
+ at += 2;
10599
+ continue;
10600
+ }
10043
10601
  at += 1;
10044
10602
  continue;
10045
10603
  }
@@ -10066,9 +10624,11 @@ function safeInlineEnd(line) {
10066
10624
  }
10067
10625
  at += 1;
10068
10626
  }
10069
- const open = [codeSpan, link, emphasis[0]?.start ?? null].filter(
10070
- (value) => value !== null
10071
- );
10627
+ const open = [
10628
+ codeSpan,
10629
+ links[0]?.start ?? null,
10630
+ emphasis[0]?.start ?? null
10631
+ ].filter((value) => value !== null);
10072
10632
  return open.length === 0 ? line.length : Math.min(...open);
10073
10633
  }
10074
10634
  function revealBoundary(text, limit) {
@@ -11930,6 +12490,7 @@ function AssistantBubble({
11930
12490
  message,
11931
12491
  activity,
11932
12492
  imageOrigins,
12493
+ productSlugs,
11933
12494
  productNames,
11934
12495
  speechLang,
11935
12496
  onNavigate,
@@ -12044,6 +12605,7 @@ function AssistantBubble({
12044
12605
  {
12045
12606
  strings: T,
12046
12607
  imageOrigins,
12608
+ productSlugs,
12047
12609
  enabled: completed,
12048
12610
  className: "boff-prose-sm text-card-foreground",
12049
12611
  children: visible
@@ -12801,6 +13363,10 @@ function ExplorePage({
12801
13363
  () => productNamesByOrigin(catalog.products),
12802
13364
  [catalog.products]
12803
13365
  );
13366
+ const productSlugs = useMemo(
13367
+ () => productSlugsByOrigin(catalog.products),
13368
+ [catalog.products]
13369
+ );
12804
13370
  useEffect(() => {
12805
13371
  const el = textareaRef.current;
12806
13372
  if (!el) return;
@@ -13363,6 +13929,7 @@ function ExplorePage({
13363
13929
  message,
13364
13930
  activity,
13365
13931
  imageOrigins,
13932
+ productSlugs,
13366
13933
  productNames,
13367
13934
  speechLang,
13368
13935
  onNavigate,
@@ -18358,6 +18925,6 @@ function shouldRenderSiteFooter(pathname) {
18358
18925
  return !isFooterlessPath(pathname);
18359
18926
  }
18360
18927
 
18361
- export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, 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, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PUBLISHED_ANSWER_FIELDS, 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, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, buttonVariants, classifyExploreError, cn, conceptPath, detectElectronPlatform, exploreQuestionHref, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatAnswerDate, formatDownloads, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isPublishedSourceUrl, isValidUrl, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeRoutePath, shouldRenderSiteFooter, speechLocaleOf, stopSpeaking, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
18928
+ export { ANSWERS_PATH, ANSWER_HEADING_SHIFT, ANSWER_PATH_PREFIX, AnswerDetailPage, AnswersPage, 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, DOMAINS_URL, ECOSYSTEM_PRODUCTS, ESCALATE_EXPLORE_CONVERSATION_MUTATION, EXPLORE_CATALOG_QUERY, EXPLORE_CATALOG_QUERY_WITHOUT_HIGHLIGHTS, EXPLORE_ESCALATION_NOTE_SOFT_MAX, EXPLORE_LOCALES, EXPLORE_MESSAGE_QUERY, EXPLORE_PREFILL_MAX_LENGTH, EXPLORE_RECAPTCHA_ACTION, ElectronDownloadLink, ExploreAnswerBody, ExploreAnswerStyles, ExploreCta, ExplorePage, FALLBACK_EXPLORE_LIMITS, FOOTERLESS_ROUTES, Input, Label, LaunchCountdown, Markdown, NewsletterForm, NewsletterPage, PUBLISHED_ANSWER_FIELDS, 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, answerPath, answerPlainText, answerSourceHost, answerSpeechText, answerStrings, buttonVariants, classifyExploreError, cn, conceptPath, detectElectronPlatform, exploreQuestionHref, fetchPublicJobPosting, fetchPublicJobPostings, fetchPublicJobPostingsForSubmission, formatAnswerDate, formatDownloads, formatPrice2 as formatPrice, getAnswerBySlug, getConceptBySlug, getRecaptchaV3Token, inlineImageOrigins, isFooterlessPath, isInlineImageAllowed, isInlineVideoAllowed, isPublishedSourceUrl, isValidUrl, loadRecaptchaV3, looksLikeDeliverableEmail, normalizeRoutePath, productSlugsByOrigin, shouldRenderSiteFooter, speechLocaleOf, stopSpeaking, useContentPage, useContentPages, useExploreChat, useProduct, useProductConfig, useProgressiveReveal, usePublicJobPosting, usePublicJobPostings, usePublicJobPostingsForSubmission, useSpeechOutput, useWebSDK, useWebSDKConfig };
18362
18929
  //# sourceMappingURL=index.mjs.map
18363
18930
  //# sourceMappingURL=index.mjs.map