@flamingo-stack/openframe-frontend-core 0.0.744 → 0.0.746

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 (118) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-LJ46XYYP.cjs → chunk-2ZVNXD74.cjs} +24 -24
  3. package/dist/{chunk-FTYQS6VI.cjs → chunk-3AUTORMB.cjs} +13 -13
  4. package/dist/{chunk-2JRCJV3M.cjs → chunk-3KVB5FQZ.cjs} +5 -5
  5. package/dist/{chunk-2UBR53AN.cjs → chunk-3OAACQQG.cjs} +4 -4
  6. package/dist/{chunk-QSO56JZ2.cjs → chunk-5X3F2KL7.cjs} +90 -90
  7. package/dist/{chunk-AT6ZI4CO.cjs → chunk-7AKFKPBV.cjs} +12 -12
  8. package/dist/{chunk-4N7KGOBS.cjs → chunk-B24U6KNJ.cjs} +3 -3
  9. package/dist/{chunk-H62FNZGG.cjs → chunk-DJ4YDVBF.cjs} +18 -18
  10. package/dist/{chunk-QZYF2YQ3.cjs → chunk-FAN73OTP.cjs} +6 -6
  11. package/dist/{chunk-HJ4KGA2M.cjs → chunk-GPSHFEF2.cjs} +1084 -890
  12. package/dist/{chunk-OC2LBQQJ.cjs → chunk-GSFANY2L.cjs} +80 -80
  13. package/dist/{chunk-URVIPSAJ.cjs → chunk-HNLI4OU5.cjs} +14 -14
  14. package/dist/{chunk-PYWHDPVC.cjs → chunk-IRKUFXVV.cjs} +38 -38
  15. package/dist/{chunk-ABLUMGCI.cjs → chunk-JHQNUWFM.cjs} +83 -33
  16. package/dist/{chunk-4A6OF4HI.cjs → chunk-KVPSV4ZI.cjs} +44 -44
  17. package/dist/{chunk-UY6A6TEY.cjs → chunk-L2IQESTQ.cjs} +2 -2
  18. package/dist/{chunk-YIOWV7LS.cjs → chunk-NZMQIAQC.cjs} +2 -2
  19. package/dist/{chunk-YJRMCFX3.cjs → chunk-O4J4NIMB.cjs} +7 -7
  20. package/dist/{chunk-GAGNKWOC.cjs → chunk-OWABNVDV.cjs} +2 -2
  21. package/dist/{chunk-HTQJYN47.cjs → chunk-PLBJ3XVC.cjs} +32 -32
  22. package/dist/{chunk-OWGLRE74.cjs → chunk-PSIKUDUV.cjs} +8 -8
  23. package/dist/{chunk-NURAL5HD.cjs → chunk-SDDZHPVK.cjs} +24 -24
  24. package/dist/{chunk-HHL23RFC.cjs → chunk-SLODGX6D.cjs} +35 -35
  25. package/dist/{chunk-7YDF3QBN.cjs → chunk-TILK7SC4.cjs} +320 -207
  26. package/dist/{chunk-U2O5YQRP.cjs → chunk-U6XWGK53.cjs} +33 -33
  27. package/dist/{chunk-JGZEHBBD.cjs → chunk-VZGCSVH7.cjs} +10 -10
  28. package/dist/{chunk-35IQLGV3.cjs → chunk-X4Y74M5K.cjs} +74 -74
  29. package/dist/{chunk-HMSUYWSB.cjs → chunk-XQJOYPPN.cjs} +4 -4
  30. package/dist/{chunk-65LJNDR2.cjs → chunk-YKF66VQY.cjs} +20 -20
  31. package/dist/{chunk-5TCIRWHL.cjs → chunk-YRULLK7N.cjs} +5 -5
  32. package/dist/{cloud-tenants-JPXAXSPE.cjs → cloud-tenants-OKUFSNPW.cjs} +13 -13
  33. package/dist/components/case-studies/index.cjs +25 -25
  34. package/dist/components/chat/index.cjs +9 -9
  35. package/dist/components/contact/index.cjs +14 -14
  36. package/dist/components/docs/index.cjs +17 -17
  37. package/dist/components/embeds/index.cjs +14 -14
  38. package/dist/components/embeds/reddit-embed-client.d.ts +3 -1
  39. package/dist/components/embeds/reddit-embed-client.d.ts.map +1 -1
  40. package/dist/components/embeds/reddit-embed-client.js +5 -3
  41. package/dist/components/embeds/twitter-embed-client.d.ts +3 -1
  42. package/dist/components/embeds/twitter-embed-client.d.ts.map +1 -1
  43. package/dist/components/embeds/twitter-embed-client.js +5 -3
  44. package/dist/components/faq/index.cjs +15 -15
  45. package/dist/components/features/index.cjs +13 -13
  46. package/dist/components/help-center-pages/index.cjs +116 -116
  47. package/dist/components/index.cjs +123 -125
  48. package/dist/components/meeting-scheduler/index.cjs +63 -63
  49. package/dist/components/navigation/index.cjs +16 -16
  50. package/dist/components/onboarding-guides/index.cjs +16 -16
  51. package/dist/components/product-demo/index.cjs +9 -9
  52. package/dist/components/related-content/index.cjs +7 -7
  53. package/dist/components/tickets/index.cjs +19 -19
  54. package/dist/components/ui/filter-checkbox-item.d.ts +8 -2
  55. package/dist/components/ui/filter-checkbox-item.d.ts.map +1 -1
  56. package/dist/components/ui/filter-checkbox-item.js +14 -4
  57. package/dist/components/ui/index.cjs +17 -13
  58. package/dist/components/ui/index.d.ts +1 -0
  59. package/dist/components/ui/index.d.ts.map +1 -1
  60. package/dist/components/ui/index.js +1 -0
  61. package/dist/components/ui/markdown/base-components.d.ts.map +1 -1
  62. package/dist/components/ui/markdown/base-components.js +3 -2
  63. package/dist/components/ui/markdown/rich/embed-overrides.d.ts.map +1 -1
  64. package/dist/components/ui/markdown/rich/embed-overrides.js +11 -8
  65. package/dist/components/ui/markdown-editor.d.ts.map +1 -1
  66. package/dist/components/ui/markdown-editor.js +4 -0
  67. package/dist/components/ui/markdown-link-command.d.ts +37 -0
  68. package/dist/components/ui/markdown-link-command.d.ts.map +1 -0
  69. package/dist/components/ui/markdown-link-command.js +180 -0
  70. package/dist/components/unified-filter-logic.js +1 -1
  71. package/dist/components/vendor-tag.d.ts +12 -0
  72. package/dist/components/vendor-tag.d.ts.map +1 -1
  73. package/dist/components/vendor-tag.js +50 -47
  74. package/dist/{devices-ONC4JOVH.cjs → devices-URCDMYFU.cjs} +14 -14
  75. package/dist/{embeddable-chat-7ZEGCDVF.cjs → embeddable-chat-B35GB5B6.cjs} +80 -80
  76. package/dist/index.cjs +36 -18
  77. package/dist/{knowledge-G7XU5YST.cjs → knowledge-5MW2PREQ.cjs} +14 -14
  78. package/dist/{logs-5B7NY4G6.cjs → logs-LJJK5CK4.cjs} +21 -21
  79. package/dist/{policies-OYR3SLJN.cjs → policies-6TCEWQYG.cjs} +17 -17
  80. package/dist/{remote-session-N4PJB5FW.cjs → remote-session-IYT4LWJC.cjs} +7 -7
  81. package/dist/{scripts-6CWHTY6U.cjs → scripts-ABB2P6PT.cjs} +20 -20
  82. package/dist/{software-update-AJPIY4SQ.cjs → software-update-4427ZRMO.cjs} +17 -17
  83. package/dist/{tickets-board-O753S4ZB.cjs → tickets-board-4MT6ZB4F.cjs} +8 -8
  84. package/dist/utils/format.d.ts.map +1 -1
  85. package/dist/utils/format.js +2 -3
  86. package/dist/utils/index.cjs +193 -28
  87. package/dist/utils/index.d.ts +2 -1
  88. package/dist/utils/index.d.ts.map +1 -1
  89. package/dist/utils/index.js +9 -6
  90. package/dist/utils/markdown-link.d.ts +44 -0
  91. package/dist/utils/markdown-link.d.ts.map +1 -0
  92. package/dist/utils/markdown-link.js +83 -0
  93. package/dist/utils/markdown-to-plain.d.ts +3 -16
  94. package/dist/utils/markdown-to-plain.d.ts.map +1 -1
  95. package/dist/utils/markdown-to-plain.js +33 -3
  96. package/dist/utils/vendor-classification.d.ts +43 -17
  97. package/dist/utils/vendor-classification.d.ts.map +1 -1
  98. package/dist/utils/vendor-classification.js +73 -22
  99. package/package.json +3 -1
  100. package/src/components/embeds/reddit-embed-client.tsx +7 -3
  101. package/src/components/embeds/twitter-embed-client.tsx +7 -3
  102. package/src/components/ui/filter-checkbox-item.tsx +21 -5
  103. package/src/components/ui/index.ts +1 -0
  104. package/src/components/ui/markdown/base-components.tsx +5 -2
  105. package/src/components/ui/markdown/rich/embed-overrides.tsx +12 -9
  106. package/src/components/ui/markdown-editor.tsx +6 -0
  107. package/src/components/ui/markdown-link-command.tsx +252 -0
  108. package/src/components/unified-filter-logic.tsx +1 -1
  109. package/src/components/vendor-tag.tsx +73 -69
  110. package/src/utils/format.ts +2 -3
  111. package/src/utils/index.ts +8 -5
  112. package/src/utils/markdown-link.ts +148 -0
  113. package/src/utils/markdown-to-plain.ts +64 -22
  114. package/src/utils/vendor-classification.ts +113 -34
  115. package/dist/utils/format-text-stub.d.ts +0 -5
  116. package/dist/utils/format-text-stub.d.ts.map +0 -1
  117. package/dist/utils/format-text-stub.js +0 -20
  118. package/src/utils/format-text-stub.ts +0 -17
@@ -5,6 +5,7 @@ import Link from "../../../embed-shims/next-link.js";
5
5
  import { useAuthedImageSrc } from "../../../hooks/use-authed-image-src.js";
6
6
  import { cn } from "../../../utils/cn.js";
7
7
  import { slugifyHeadingText } from "../../../utils/markdown-heading-id.js";
8
+ import { renderedLinkRel } from "../../../utils/markdown-link.js";
8
9
  import { getHashTargetElement, navigateSamePageHash, HUB_HEADER_OFFSET_PX } from "../../../utils/same-page-hash-nav.js";
9
10
  import { extractText, resolveFallbackHeadingId, useAssignedHeadingIds, useHeadingId } from "./heading-ids.js";
10
11
  import { MermaidDiagram } from "./mermaid-diagram.js";
@@ -105,7 +106,7 @@ function buildBaseComponents({
105
106
  // --- paragraph ---
106
107
  p: ({ children }) => /* @__PURE__ */ jsx("p", { className: cn("mb-4 leading-relaxed text-ods-text-primary first:mt-0 last:mb-0", textSizes.p), children }),
107
108
  // --- links ---
108
- a: ({ href, children, className: linkClassName }) => {
109
+ a: ({ href, children, className: linkClassName, rel: authoredRel }) => {
109
110
  const isBroken = href !== void 0 && brokenLinks.includes(href);
110
111
  const isInternalDocLink = propCurrentPath !== void 0 && propCurrentPath !== null && !!href && !href.startsWith("http") && !href.startsWith("#");
111
112
  if (isBroken) {
@@ -168,7 +169,7 @@ function buildBaseComponents({
168
169
  href,
169
170
  className: `relative text-ods-accent no-underline transition-colors duration-200 after:absolute after:-bottom-0.5 after:left-0 after:h-0.5 after:w-0 after:bg-ods-accent after:transition-all after:duration-300 after:content-[''] hover:after:w-full ${linkClassName || ""}`,
170
171
  target: href?.startsWith("http") ? "_blank" : void 0,
171
- rel: href?.startsWith("http") ? "noopener noreferrer" : void 0,
172
+ rel: renderedLinkRel(authoredRel, href?.startsWith("http") ?? false),
172
173
  onClick: inPageAnchorId !== null ? handleAnchorClick : void 0,
173
174
  children
174
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"embed-overrides.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/markdown/rich/embed-overrides.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA+BpD,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,cAAc,EACd,SAAS,GACV,EAAE,8BAA8B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwKtD"}
1
+ {"version":3,"file":"embed-overrides.d.ts","sourceRoot":"","sources":["../../../../../src/components/ui/markdown/rich/embed-overrides.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAkCpD,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,cAAc,EACd,SAAS,GACV,EAAE,8BAA8B,GAAG,OAAO,CAAC,UAAU,CAAC,CAwKtD"}
@@ -9,14 +9,17 @@ import { RedditEmbedClient } from "../../../embeds/reddit-embed-client.js";
9
9
  import { TwitterEmbedClient } from "../../../embeds/twitter-embed-client.js";
10
10
  import { Video } from "../../../features/video.js";
11
11
  import { buildStandardLeafRenderers, hasRenderableSrc } from "../base-components.js";
12
- function findFirstHref(node, hostRe) {
12
+ function findFirstLink(node, hostRe) {
13
13
  if (!node || node.type !== "element") return null;
14
14
  if (node.tagName === "a") {
15
- const href = node.properties.href;
16
- if (typeof href === "string" && hostRe.test(href)) return href;
15
+ const { href, rel } = node.properties;
16
+ if (typeof href === "string" && hostRe.test(href)) {
17
+ const relText = Array.isArray(rel) ? rel.join(" ") : typeof rel === "string" ? rel : void 0;
18
+ return { href, rel: relText };
19
+ }
17
20
  }
18
21
  for (const child of node.children) {
19
- const found = findFirstHref(child, hostRe);
22
+ const found = findFirstLink(child, hostRe);
20
23
  if (found) return found;
21
24
  }
22
25
  return null;
@@ -149,12 +152,12 @@ function buildRichEmbedOverrides({
149
152
  const { node, className } = bqProps;
150
153
  const classNames = Array.isArray(className) ? className.join(" ") : className ?? "";
151
154
  if (classNames.includes("reddit-embed-bq")) {
152
- const postUrl = findFirstHref(node, /reddit\.com/);
153
- if (postUrl) return /* @__PURE__ */ jsx(RedditEmbedClient, { url: postUrl });
155
+ const post = findFirstLink(node, /reddit\.com/);
156
+ if (post) return /* @__PURE__ */ jsx(RedditEmbedClient, { url: post.href, rel: post.rel });
154
157
  }
155
158
  if (classNames.includes("twitter-tweet")) {
156
- const tweetUrl = findFirstHref(node, /(?:twitter\.com|x\.com)\/[^/]+\/status\//);
157
- if (tweetUrl) return /* @__PURE__ */ jsx(TwitterEmbedClient, { url: tweetUrl });
159
+ const tweet = findFirstLink(node, /(?:twitter\.com|x\.com)\/[^/]+\/status\//);
160
+ if (tweet) return /* @__PURE__ */ jsx(TwitterEmbedClient, { url: tweet.href, rel: tweet.rel });
158
161
  }
159
162
  return standard.blockquote(bqProps);
160
163
  },
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-editor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA2F/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAgB,EAChB,QAAgB,EAChB,MAAY,EACZ,SAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,GACd,EAAE,mBAAmB,qBAoQrB"}
1
+ {"version":3,"file":"markdown-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-editor.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA4F/B,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,gEAAgE;IAChE,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAgB,EAChB,QAAgB,EAChB,MAAY,EACZ,SAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,aAAa,GACd,EAAE,mBAAmB,qBAyQrB"}
@@ -5,6 +5,7 @@ import { useRef, useCallback, useState, useEffect } from "react";
5
5
  import dynamic from "../../embed-shims/next-dynamic.js";
6
6
  import { cn } from "../../utils/cn.js";
7
7
  import { IMAGE_FILE_ACCEPT, fileMediaType } from "../../utils/media-type.js";
8
+ import { useMarkdownLinkCommand } from "./markdown-link-command.js";
8
9
  const MDEditor = dynamic(() => import("@uiw/react-md-editor"), { ssr: false });
9
10
  const MARKDOWN_EDITOR_STYLE_ID = "ods-markdown-editor-styles";
10
11
  const mdEditorCSS = `
@@ -102,6 +103,7 @@ function MarkdownEditor({
102
103
  const [isUploading, setIsUploading] = useState(false);
103
104
  const [uploadProgress, setUploadProgress] = useState("");
104
105
  const [defaultExtraCommands, setDefaultExtraCommands] = useState([]);
106
+ const { commands: toolbarCommands, linkDialog } = useMarkdownLinkCommand();
105
107
  useEffect(() => {
106
108
  let cancelled = false;
107
109
  void (async () => {
@@ -287,6 +289,7 @@ function MarkdownEditor({
287
289
  visibleDragbar: true,
288
290
  height,
289
291
  minHeight,
292
+ commands: toolbarCommands,
290
293
  extraCommands,
291
294
  style: {
292
295
  "--md-editor-text-color": "var(--color-text-primary)",
@@ -314,6 +317,7 @@ function MarkdownEditor({
314
317
  }
315
318
  ),
316
319
  uploadProgress && /* @__PURE__ */ jsx("p", { className: "mt-1 text-ods-text-secondary text-h6", children: uploadProgress }),
320
+ linkDialog,
317
321
  /* @__PURE__ */ jsx(MarkdownEditorStyles, {})
318
322
  ] });
319
323
  }
@@ -0,0 +1,37 @@
1
+ import type { ICommand } from '@uiw/react-md-editor';
2
+ import { type ReactNode } from 'react';
3
+ import { type MarkdownLinkFields } from '../../utils/markdown-link';
4
+ export interface MarkdownLinkDialogProps {
5
+ isOpen: boolean;
6
+ /** The link being edited, or the selection a new link starts from. */
7
+ initial: MarkdownLinkFields;
8
+ /** True when `initial` is a link already in the text: the dialog then offers to remove it. */
9
+ editing: boolean;
10
+ onSubmit: (link: MarkdownLinkFields) => void;
11
+ /** Replaces the link with its text. */
12
+ onRemove: () => void;
13
+ onClose: () => void;
14
+ }
15
+ /**
16
+ * The link dialog of the markdown editors: the link's text, its address, and what it tells search
17
+ * engines: Follow (the default), Nofollow, Sponsored or UGC. Any choice but Follow writes the link
18
+ * as `<a rel="…">`. A link that carries several values (`rel="ugc nofollow"`) keeps them all until
19
+ * the choice is changed.
20
+ */
21
+ export declare function MarkdownLinkDialog({ isOpen, initial, editing, onSubmit, onRemove, onClose }: MarkdownLinkDialogProps): import("react").JSX.Element;
22
+ export interface MarkdownLinkCommand {
23
+ /**
24
+ * The editor's toolbar: the vendor's commands with its `link` command replaced by this dialog.
25
+ * `undefined` until the vendor's commands have loaded (the editor then shows its own defaults).
26
+ */
27
+ commands: ICommand[] | undefined;
28
+ /** The dialog. Render it beside the editor. */
29
+ linkDialog: ReactNode;
30
+ }
31
+ /**
32
+ * The link command every markdown editor uses: the toolbar's link button and Ctrl/Cmd+L open
33
+ * {@link MarkdownLinkDialog} on the link under the caret (markdown or HTML), or on the selection
34
+ * for a new link, and write the result back as one undoable edit.
35
+ */
36
+ export declare function useMarkdownLinkCommand(): MarkdownLinkCommand;
37
+ //# sourceMappingURL=markdown-link-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-link-command.d.ts","sourceRoot":"","sources":["../../../src/components/ui/markdown-link-command.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAA8B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,KAAK,SAAS,EAAuC,MAAM,OAAO,CAAC;AAC5E,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,2BAA2B,CAAC;AAkCnC,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,OAAO,EAAE,kBAAkB,CAAC;IAC5B,8FAA8F;IAC9F,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,uCAAuC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,uBAAuB,+BAiFpH;AAkBD,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,UAAU,EAAE,SAAS,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CA4E5D"}
@@ -0,0 +1,180 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useMemo, useState } from "react";
4
+ import {
5
+ findMarkdownLinkAt,
6
+ formatMarkdownLink
7
+ } from "../../utils/markdown-link.js";
8
+ import { Button } from "./button/index.js";
9
+ import { Input } from "./input.js";
10
+ import { ModalV2, ModalV2Footer, ModalV2Header, ModalV2Title } from "./modal-v2.js";
11
+ import { TabSelector } from "./tab-selector.js";
12
+ const LINK_REL_CHOICES = [
13
+ { id: "follow", label: "Follow", hint: "Search engines follow this link. This is the default." },
14
+ {
15
+ id: "nofollow",
16
+ label: "Nofollow",
17
+ hint: 'Search engines are asked not to follow this link (rel="nofollow").'
18
+ },
19
+ {
20
+ id: "sponsored",
21
+ label: "Sponsored",
22
+ hint: 'For ads, paid placements and sponsorships (rel="sponsored").'
23
+ },
24
+ { id: "ugc", label: "UGC", hint: 'For links in content written by users, such as comments (rel="ugc").' }
25
+ ];
26
+ const LINK_REL_ITEMS = LINK_REL_CHOICES.map(({ id, label }) => ({ id, label }));
27
+ function choiceOf(rel) {
28
+ if (rel.includes("sponsored")) return "sponsored";
29
+ if (rel.includes("ugc")) return "ugc";
30
+ if (rel.includes("nofollow")) return "nofollow";
31
+ return "follow";
32
+ }
33
+ function MarkdownLinkDialog({ isOpen, initial, editing, onSubmit, onRemove, onClose }) {
34
+ const formId = useId();
35
+ const [text, setText] = useState(initial.text);
36
+ const [url, setUrl] = useState(initial.url);
37
+ const [rel, setRel] = useState(initial.rel);
38
+ const [seededWith, setSeededWith] = useState({ isOpen, initial });
39
+ if (seededWith.isOpen !== isOpen || seededWith.initial !== initial) {
40
+ setSeededWith({ isOpen, initial });
41
+ if (isOpen) {
42
+ setText(initial.text);
43
+ setUrl(initial.url);
44
+ setRel(initial.rel);
45
+ }
46
+ }
47
+ const choice = choiceOf(rel);
48
+ const trimmedUrl = url.trim();
49
+ const submit = () => {
50
+ if (!trimmedUrl) return;
51
+ onSubmit({ text: text.trim(), url: trimmedUrl, rel });
52
+ };
53
+ return /* @__PURE__ */ jsxs(ModalV2, { isOpen, onClose, className: "text-left md:max-w-[560px]", children: [
54
+ /* @__PURE__ */ jsx(ModalV2Header, { children: /* @__PURE__ */ jsx(ModalV2Title, { children: editing ? "Edit link" : "Add link" }) }),
55
+ /* @__PURE__ */ jsxs(
56
+ "form",
57
+ {
58
+ id: formId,
59
+ className: "flex w-full flex-col gap-[var(--spacing-system-l)]",
60
+ onSubmit: (event) => {
61
+ event.preventDefault();
62
+ submit();
63
+ },
64
+ children: [
65
+ /* @__PURE__ */ jsx(Input, { label: "Text", value: text, onChange: (event) => setText(event.target.value), placeholder: "Link text" }),
66
+ /* @__PURE__ */ jsx(
67
+ Input,
68
+ {
69
+ label: "URL",
70
+ value: url,
71
+ onChange: (event) => setUrl(event.target.value),
72
+ placeholder: "https://",
73
+ autoFocus: true,
74
+ inputMode: "url"
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-xsf)]", children: [
78
+ /* @__PURE__ */ jsx(
79
+ TabSelector,
80
+ {
81
+ label: "Search engines",
82
+ value: choice,
83
+ onValueChange: (value) => {
84
+ const next = LINK_REL_CHOICES.find((option) => option.id === value)?.id ?? "follow";
85
+ setRel(next === "follow" ? [] : [next]);
86
+ },
87
+ items: LINK_REL_ITEMS,
88
+ variant: "secondary"
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx("p", { className: "text-ods-text-secondary text-h6", children: LINK_REL_CHOICES.find((option) => option.id === choice)?.hint })
92
+ ] })
93
+ ]
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsxs(ModalV2Footer, { children: [
97
+ editing ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: onRemove, className: "flex-1", children: "Remove link" }) : /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: onClose, className: "flex-1", children: "Cancel" }),
98
+ /* @__PURE__ */ jsx(Button, { type: "submit", form: formId, variant: "accent", disabled: !trimmedUrl, className: "flex-1", children: editing ? "Save" : "Add link" })
99
+ ] })
100
+ ] });
101
+ }
102
+ const EMPTY_LINK = { text: "", url: "", rel: [] };
103
+ const LOOKS_LIKE_URL = /^(?:https?:\/\/|www\.|mailto:|\/|#)\S*$/i;
104
+ function initialFieldsFromSelection(selectedText) {
105
+ const selected = selectedText.trim();
106
+ return LOOKS_LIKE_URL.test(selected) ? { text: "", url: selected, rel: [] } : { text: selected, url: "", rel: [] };
107
+ }
108
+ function useMarkdownLinkCommand() {
109
+ const [vendorCommands, setVendorCommands] = useState(void 0);
110
+ const [pending, setPending] = useState(null);
111
+ useEffect(() => {
112
+ let cancelled = false;
113
+ void (async () => {
114
+ try {
115
+ const mod = await import("@uiw/react-md-editor");
116
+ if (!cancelled && mod.commands?.getCommands) setVendorCommands(mod.commands.getCommands());
117
+ } catch (error) {
118
+ console.error("Failed to load markdown editor toolbar commands:", error);
119
+ }
120
+ })();
121
+ return () => {
122
+ cancelled = true;
123
+ };
124
+ }, []);
125
+ const commands = useMemo(() => {
126
+ if (!vendorCommands) return void 0;
127
+ return vendorCommands.map((command) => {
128
+ if (command.name !== "link") return command;
129
+ const linkCommand = {
130
+ name: "link",
131
+ keyCommand: "link",
132
+ shortcuts: "ctrlcmd+l",
133
+ buttonProps: { "aria-label": "Add or edit a link (ctrl + l)", title: "Add or edit a link (ctrl + l)" },
134
+ icon: command.icon,
135
+ execute: (state, api) => {
136
+ const existing = findMarkdownLinkAt(state.text, state.selection.start, state.selection.end);
137
+ setPending(
138
+ existing ? {
139
+ api,
140
+ range: { start: existing.start, end: existing.end },
141
+ initial: { text: existing.text, url: existing.url, rel: existing.rel },
142
+ editing: true
143
+ } : {
144
+ api,
145
+ range: state.selection,
146
+ initial: initialFieldsFromSelection(state.selectedText),
147
+ editing: false
148
+ }
149
+ );
150
+ }
151
+ };
152
+ return linkCommand;
153
+ });
154
+ }, [vendorCommands]);
155
+ const write = (current, text) => {
156
+ setPending(null);
157
+ current.api.setSelectionRange(current.range);
158
+ current.api.replaceSelection(text);
159
+ };
160
+ const linkDialog = /* @__PURE__ */ jsx(
161
+ MarkdownLinkDialog,
162
+ {
163
+ isOpen: pending !== null,
164
+ initial: pending?.initial ?? EMPTY_LINK,
165
+ editing: pending?.editing ?? false,
166
+ onSubmit: (link) => {
167
+ if (pending) write(pending, formatMarkdownLink(link));
168
+ },
169
+ onRemove: () => {
170
+ if (pending) write(pending, pending.initial.text);
171
+ },
172
+ onClose: () => setPending(null)
173
+ }
174
+ );
175
+ return { commands, linkDialog };
176
+ }
177
+ export {
178
+ MarkdownLinkDialog,
179
+ useMarkdownLinkCommand
180
+ };
@@ -264,7 +264,7 @@ function useUnifiedFiltering(config) {
264
264
  isPending
265
265
  };
266
266
  }
267
- import { formatClassification, formatPricingModel } from "../utils/format-text-stub.js";
267
+ import { formatClassification, formatPricingModel } from "../utils/format.js";
268
268
  function getFilterLabel(filterKey) {
269
269
  const customLabels = {
270
270
  recommended: "Recommended",
@@ -6,5 +6,17 @@ export interface VendorTagProps {
6
6
  hidden?: boolean;
7
7
  accentColor?: string;
8
8
  }
9
+ /**
10
+ * A classification's icon, from its config (`VENDOR_CLASSIFICATION_COPY[value].icon`): the
11
+ * icon is resolved by NAME through the shared resolver, never imported here. A license icon
12
+ * sits on a small tile (the accent tile for an `accent` tone); an OpenFrame mark and a
13
+ * lifecycle icon are drawn bare in their tone. A value with no icon draws nothing.
14
+ */
15
+ export declare function VendorClassificationIcon({ classification, accentColor, className, }: {
16
+ classification: string;
17
+ /** The accent tile's colour, for a host that tints its hover accent (a vendor card). */
18
+ accentColor?: string;
19
+ className?: string;
20
+ }): import("react").JSX.Element | null;
9
21
  export declare function VendorTag({ type, text, className, hidden, size, accentColor }: VendorTagProps): import("react").JSX.Element;
10
22
  //# sourceMappingURL=vendor-tag.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vendor-tag.d.ts","sourceRoot":"","sources":["../../src/components/vendor-tag.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,aAAa,GACb,YAAY,GACZ,MAAM,GACN,UAAU,GACV,MAAM,GACN,YAAY,GACZ,aAAa,GACb,gBAAgB,GAChB,IAAI,GACJ,QAAQ,GACR,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,GACnB,aAAa,GACb,KAAK,GACL,MAAM,GACN,KAAK,GACL,SAAS,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAc,EAAE,MAAc,EAAE,IAAW,EAAE,WAAW,EAAE,EAAE,cAAc,+BAyMjH"}
1
+ {"version":3,"file":"vendor-tag.d.ts","sourceRoot":"","sources":["../../src/components/vendor-tag.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,aAAa,GACb,YAAY,GACZ,MAAM,GACN,UAAU,GACV,MAAM,GACN,YAAY,GACZ,aAAa,GACb,gBAAgB,GAChB,IAAI,GACJ,QAAQ,GACR,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,GACnB,aAAa,GACb,KAAK,GACL,MAAM,GACN,KAAK,GACL,SAAS,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,cAAc,EACd,WAAW,EACX,SAAS,GACV,EAAE;IACD,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sCAyBA;AAoBD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAc,EAAE,MAAc,EAAE,IAAW,EAAE,WAAW,EAAE,EAAE,cAAc,+BAsJjH"}
@@ -1,17 +1,51 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Boxes, Code, Database, DollarSign, Hand, Plug, ShieldCheck, Sparkles } from "lucide-react";
3
+ import { Boxes, Database, DollarSign, Hand, Plug, ShieldCheck, Sparkles } from "lucide-react";
4
+ import { createElement } from "react";
4
5
  import { cn } from "../utils/cn.js";
5
- import {
6
- OPENFRAME_CLASSIFICATIONS,
7
- isOpenFrameClassification
8
- } from "../utils/vendor-classification.js";
9
- import { OpenframeLogoIcon } from "./icons-v2-generated/logos/openframe-logo-icon.js";
10
- function openFrameTag(classification, text) {
6
+ import { formatClassification } from "../utils/format.js";
7
+ import { vendorClassificationCopy } from "../utils/vendor-classification.js";
8
+ import { resolveIcon } from "./chat/utils/icon-library.js";
9
+ const TONE_CLASS = {
10
+ accent: "text-ods-text-on-accent",
11
+ neutral: "text-ods-text-secondary",
12
+ warning: "text-ods-warning"
13
+ };
14
+ function VendorClassificationIcon({
15
+ classification,
16
+ accentColor,
17
+ className
18
+ }) {
19
+ const copy = vendorClassificationCopy(classification);
20
+ if (!copy?.icon) return null;
21
+ const icon = resolveIcon(copy.icon.name);
22
+ if (copy.group !== "license") {
23
+ const bareClass = copy.icon.tone === "accent" ? "text-ods-accent" : TONE_CLASS[copy.icon.tone];
24
+ return createElement(icon, {
25
+ size: copy.group === "openframe" ? 16 : 12,
26
+ className: cn("shrink-0", bareClass, className)
27
+ });
28
+ }
29
+ const accent = copy.icon.tone === "accent";
30
+ return /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ className: cn(
34
+ "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm",
35
+ accent ? "bg-ods-accent" : "bg-ods-border",
36
+ className
37
+ ),
38
+ style: accent && accentColor ? { backgroundColor: accentColor } : void 0,
39
+ children: createElement(icon, { size: 10, className: TONE_CLASS[copy.icon.tone] })
40
+ }
41
+ );
42
+ }
43
+ function classificationTag(value, text, accentColor) {
44
+ const copy = vendorClassificationCopy(value);
11
45
  return {
12
- text: text || OPENFRAME_CLASSIFICATIONS[classification].word,
13
- textColor: void 0,
14
- icon: /* @__PURE__ */ jsx(OpenframeLogoIcon, { secondaryColor: "currentColor", color: "currentColor", className: "h-4 w-4 text-ods-accent" })
46
+ text: text || (copy?.group === "openframe" ? copy.word : void 0) || copy?.label || formatClassification(value),
47
+ textColor: copy?.group === "lifecycle" ? "text-ods-warning" : void 0,
48
+ icon: /* @__PURE__ */ jsx(VendorClassificationIcon, { classification: value, accentColor })
15
49
  };
16
50
  }
17
51
  function VendorTag({ type, text, className = "", hidden = false, size = "md", accentColor }) {
@@ -40,22 +74,9 @@ function VendorTag({ type, text, className = "", hidden = false, size = "md", ac
40
74
  icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm", children: /* @__PURE__ */ jsx(Hand, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
41
75
  };
42
76
  case "open-source":
43
- return {
44
- text: text || "Open Source",
45
- icon: /* @__PURE__ */ jsx(
46
- "div",
47
- {
48
- className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-accent",
49
- style: accentColor ? { backgroundColor: accentColor } : void 0,
50
- children: /* @__PURE__ */ jsx(Code, { width: 10, height: 10, className: "text-ods-text-on-accent" })
51
- }
52
- )
53
- };
77
+ return classificationTag("open_source", text, accentColor);
54
78
  case "commercial":
55
- return {
56
- text: text || "Commercial Vendor",
57
- icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-border", children: /* @__PURE__ */ jsx(DollarSign, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
58
- };
79
+ return classificationTag("commercial", text);
59
80
  // platform-capability tags — same neutral icon-box chrome as 'commercial'
60
81
  case "api":
61
82
  return {
@@ -102,31 +123,12 @@ function VendorTag({ type, text, className = "", hidden = false, size = "md", ac
102
123
  text: text || "Recommended",
103
124
  icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-accent", children: /* @__PURE__ */ jsx("span", { className: "text-[8px] font-bold text-ods-text-on-accent", children: "\u2605" }) })
104
125
  };
105
- case "classification": {
106
- const classificationType = text?.toLowerCase();
107
- if (classificationType === "open_source") {
108
- return {
109
- text: "Open Source",
110
- icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-accent", children: /* @__PURE__ */ jsx(Code, { width: 10, height: 10, className: "text-ods-text-on-accent" }) })
111
- };
112
- } else if (classificationType === "commercial") {
113
- return {
114
- text: "Commercial Vendor",
115
- icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-border", children: /* @__PURE__ */ jsx(DollarSign, { width: 10, height: 10, className: "text-ods-text-secondary" }) })
116
- };
117
- } else if (isOpenFrameClassification(classificationType)) {
118
- return openFrameTag(classificationType);
119
- } else {
120
- return {
121
- text: text || "Classification",
122
- icon: /* @__PURE__ */ jsx("div", { className: "flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-sm bg-ods-accent", children: /* @__PURE__ */ jsx("span", { className: "text-[8px] font-bold text-ods-text-on-accent", children: "C" }) })
123
- };
124
- }
125
- }
126
+ case "classification":
127
+ return classificationTag((text ?? "").toLowerCase(), void 0, accentColor);
126
128
  case "openframe_selected":
127
129
  case "openframe_connect":
128
130
  case "openframe_shipped":
129
- return openFrameTag(type, text);
131
+ return classificationTag(type, text);
130
132
  default:
131
133
  return {
132
134
  text: text || type,
@@ -141,5 +143,6 @@ function VendorTag({ type, text, className = "", hidden = false, size = "md", ac
141
143
  ] });
142
144
  }
143
145
  export {
146
+ VendorClassificationIcon,
144
147
  VendorTag
145
148
  };
@@ -11,10 +11,10 @@ require('./chunk-DKOLQPE7.cjs');
11
11
 
12
12
 
13
13
 
14
- var _chunkHJ4KGA2Mcjs = require('./chunk-HJ4KGA2M.cjs');
15
- require('./chunk-URVIPSAJ.cjs');
14
+ var _chunkGPSHFEF2cjs = require('./chunk-GPSHFEF2.cjs');
15
+ require('./chunk-HNLI4OU5.cjs');
16
16
  require('./chunk-NTGIQP7O.cjs');
17
- require('./chunk-U2O5YQRP.cjs');
17
+ require('./chunk-U6XWGK53.cjs');
18
18
  require('./chunk-HQQE74RO.cjs');
19
19
  require('./chunk-DEY6XXGO.cjs');
20
20
  require('./chunk-4FWURR3W.cjs');
@@ -22,13 +22,13 @@ require('./chunk-LU7TD6QS.cjs');
22
22
  require('./chunk-24I6RFVU.cjs');
23
23
  require('./chunk-A6P6DHEZ.cjs');
24
24
  require('./chunk-MZ4KBSH7.cjs');
25
- require('./chunk-GAGNKWOC.cjs');
25
+ require('./chunk-OWABNVDV.cjs');
26
26
  require('./chunk-YUMFVQIN.cjs');
27
- require('./chunk-OC2LBQQJ.cjs');
28
- require('./chunk-7YDF3QBN.cjs');
29
- require('./chunk-OWGLRE74.cjs');
27
+ require('./chunk-GSFANY2L.cjs');
28
+ require('./chunk-TILK7SC4.cjs');
29
+ require('./chunk-PSIKUDUV.cjs');
30
30
  require('./chunk-3RFQPQ7Z.cjs');
31
- require('./chunk-5TCIRWHL.cjs');
31
+ require('./chunk-YRULLK7N.cjs');
32
32
  require('./chunk-B27QEHYR.cjs');
33
33
  require('./chunk-ZOZR3QI2.cjs');
34
34
  require('./chunk-OMV5S5PI.cjs');
@@ -1826,12 +1826,12 @@ require('./chunk-7DNL734S.cjs');
1826
1826
  require('./chunk-WWUSFOJ7.cjs');
1827
1827
  require('./chunk-SKI6NKOE.cjs');
1828
1828
  require('./chunk-EWPR7662.cjs');
1829
- require('./chunk-JGZEHBBD.cjs');
1830
- require('./chunk-LJ46XYYP.cjs');
1829
+ require('./chunk-VZGCSVH7.cjs');
1830
+ require('./chunk-2ZVNXD74.cjs');
1831
1831
  require('./chunk-QYLIHZKZ.cjs');
1832
1832
  require('./chunk-63N4FN5V.cjs');
1833
- require('./chunk-UY6A6TEY.cjs');
1834
- require('./chunk-ABLUMGCI.cjs');
1833
+ require('./chunk-L2IQESTQ.cjs');
1834
+ require('./chunk-JHQNUWFM.cjs');
1835
1835
  require('./chunk-S5C3OZCO.cjs');
1836
1836
  require('./chunk-32ASZMTV.cjs');
1837
1837
  require('./chunk-OOYBIS7D.cjs');
@@ -1865,14 +1865,14 @@ require('./chunk-3ATAYP36.cjs');
1865
1865
  // src/components/product-demo/screens/devices.tsx
1866
1866
  var _react = require('react');
1867
1867
  var _jsxruntime = require('react/jsx-runtime');
1868
- var TOOLBAR = { ..._chunkHJ4KGA2Mcjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunk7AM3AFM4cjs.DEVICES_SEARCH_QUERY };
1868
+ var TOOLBAR = { ..._chunkGPSHFEF2cjs.IDLE_DEVICES_TOOLBAR, searchValue: _chunk7AM3AFM4cjs.DEVICES_SEARCH_QUERY };
1869
1869
  var NO_HEADER = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, {});
1870
1870
  var HIDDEN_WHEN_COMPACT = ["organization"];
1871
1871
  function DevicesScreen({ compact = false }) {
1872
1872
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1873
1873
  const fixture = _react.useMemo.call(void 0, () => _chunk7AM3AFM4cjs.buildWindowsDevicesFixture.call(void 0, cast), [cast]);
1874
1874
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1875
- _chunkHJ4KGA2Mcjs.DevicesPanelView,
1875
+ _chunkGPSHFEF2cjs.DevicesPanelView,
1876
1876
  {
1877
1877
  className: "p-[var(--spacing-system-l)]",
1878
1878
  headerSlot: NO_HEADER,