@keboola/design 6.4.0 → 8.0.0

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 (49) hide show
  1. package/AGENTS.md +9 -10
  2. package/COMPONENT-API.md +162 -160
  3. package/README.md +3 -3
  4. package/dist/charts.cjs +22 -22
  5. package/dist/charts.cjs.map +1 -1
  6. package/dist/charts.d.cts +5 -5
  7. package/dist/charts.d.ts +5 -5
  8. package/dist/charts.js +22 -22
  9. package/dist/charts.js.map +1 -1
  10. package/dist/editors.cjs +594 -438
  11. package/dist/editors.cjs.map +1 -1
  12. package/dist/editors.d.cts +8 -4
  13. package/dist/editors.d.ts +8 -4
  14. package/dist/editors.js +595 -422
  15. package/dist/editors.js.map +1 -1
  16. package/dist/icons.cjs +23818 -45
  17. package/dist/icons.cjs.map +1 -1
  18. package/dist/icons.d.cts +12 -3
  19. package/dist/icons.d.ts +12 -3
  20. package/dist/icons.js +298 -40
  21. package/dist/icons.js.map +1 -1
  22. package/dist/index.cjs +11519 -11718
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +679 -1227
  25. package/dist/index.d.ts +679 -1227
  26. package/dist/index.js +10315 -10516
  27. package/dist/index.js.map +1 -1
  28. package/dist/markdown-editor.cjs +1015 -1134
  29. package/dist/markdown-editor.cjs.map +1 -1
  30. package/dist/markdown-editor.js +1016 -1134
  31. package/dist/markdown-editor.js.map +1 -1
  32. package/dist/mermaid.cjs +366 -452
  33. package/dist/mermaid.cjs.map +1 -1
  34. package/dist/mermaid.d.cts +5 -1
  35. package/dist/mermaid.d.ts +5 -1
  36. package/dist/mermaid.js +368 -435
  37. package/dist/mermaid.js.map +1 -1
  38. package/dist/rjsf.cjs +2540 -2419
  39. package/dist/rjsf.cjs.map +1 -1
  40. package/dist/rjsf.js +2541 -2419
  41. package/dist/rjsf.js.map +1 -1
  42. package/dist/styles.css +2 -5
  43. package/dist/testing.cjs +86 -82
  44. package/dist/testing.cjs.map +1 -1
  45. package/dist/testing.js +86 -82
  46. package/dist/testing.js.map +1 -1
  47. package/package.json +30 -22
  48. package/src/styles.css +125 -105
  49. package/src/theme.css +264 -0
package/dist/mermaid.js CHANGED
@@ -1,35 +1,20 @@
1
- import { createContext, forwardRef, useId, useState, useRef, useEffect, useMemo, useCallback, use } from 'react';
1
+ import { createContext, useId, useState, useRef, useEffect, useMemo, useCallback, use } from 'react';
2
2
  import { renderMermaidSVG } from 'beautiful-mermaid';
3
3
  import colors from '@keboola/tailwind-config/colors';
4
+ import { createPortal } from 'react-dom';
5
+ import DOMPurify from 'dompurify';
6
+ import { Root, Slottable } from '@radix-ui/react-slot';
7
+ import { Minimize2, Maximize2, Loader2, Copy } from 'lucide-react';
4
8
  import { clsx } from 'clsx';
5
9
  import { extendTailwindMerge } from 'tailwind-merge';
6
10
  import { Root as Root$1, Trigger, Portal, Content } from '@radix-ui/react-tooltip';
7
11
  import { cva } from 'class-variance-authority';
8
12
  import { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
9
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
10
- import DOMPurify from 'dompurify';
11
- import { Root, Slottable } from '@radix-ui/react-slot';
12
- import * as lucide_react_star from 'lucide-react';
13
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
13
14
 
14
- var __defProp = Object.defineProperty;
15
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
16
- var __getOwnPropNames = Object.getOwnPropertyNames;
17
- var __hasOwnProp = Object.prototype.hasOwnProperty;
18
- var __export = (target, all) => {
19
- for (var name in all)
20
- __defProp(target, name, { get: all[name], enumerable: true });
21
- };
22
- var __copyProps = (to, from, except, desc) => {
23
- if (from && typeof from === "object" || typeof from === "function") {
24
- for (let key of __getOwnPropNames(from))
25
- if (!__hasOwnProp.call(to, key) && key !== except)
26
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
27
- }
28
- return to;
29
- };
30
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
15
+ // src/blocks/MermaidDiagram/MermaidDiagram.tsx
31
16
  var twMerge = extendTailwindMerge({
32
- prefix: "tw-"
17
+ prefix: "tw"
33
18
  });
34
19
  var cn = (...classes) => twMerge(clsx(...classes));
35
20
 
@@ -79,39 +64,39 @@ var useArgoDesign = () => use(ArgoDesignContext);
79
64
  var tooltipVariants = cva(
80
65
  [
81
66
  "tailwindcss-preflight",
82
- "tw-inline-block",
83
- "tw-break-anywhere",
84
- "tw-max-h-96",
85
- "tw-overflow-y-auto",
86
- "tw-z-[1060]",
67
+ "tw:inline-block",
68
+ "tw:break-anywhere",
69
+ "tw:max-h-96",
70
+ "tw:overflow-y-auto",
71
+ "tw:z-[1060]",
87
72
  // legacy (dark) chrome — default
88
- "tw-rounded",
89
- "tw-bg-neutral-800",
90
- "tw-text-white",
73
+ "tw:rounded",
74
+ "tw:bg-neutral-800",
75
+ "tw:text-white",
91
76
  // argo chrome overrides — semantic floating-panel tokens
92
- "data-[argo=true]:tw-rounded-2xl",
93
- "data-[argo=true]:tw-border",
94
- "data-[argo=true]:tw-border-solid",
95
- "data-[argo=true]:tw-border-border",
96
- "data-[argo=true]:tw-bg-popover",
97
- "data-[argo=true]:tw-text-popover-foreground",
98
- "data-[argo=true]:tw-shadow-md",
77
+ "tw:data-[argo=true]:rounded-2xl",
78
+ "tw:data-[argo=true]:border",
79
+ "tw:data-[argo=true]:border-solid",
80
+ "tw:data-[argo=true]:border-border",
81
+ "tw:data-[argo=true]:bg-popover",
82
+ "tw:data-[argo=true]:text-popover-foreground",
83
+ "tw:data-[argo=true]:shadow-md",
99
84
  // argo open animation
100
- "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
101
- "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
102
- "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
103
- "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
104
- "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
105
- "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
85
+ "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
86
+ "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
87
+ "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
88
+ "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
89
+ "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
90
+ "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
106
91
  // argo closed animation
107
- "data-[argo=true]:data-[state=closed]:tw-animate-out",
108
- "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
109
- "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
92
+ "tw:data-[argo=true]:data-[state=closed]:animate-out",
93
+ "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
94
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
110
95
  // argo position animation
111
- "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
112
- "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
113
- "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
114
- "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
96
+ "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
97
+ "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
98
+ "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
99
+ "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
115
100
  ],
116
101
  {
117
102
  defaultVariants: {
@@ -120,22 +105,26 @@ var tooltipVariants = cva(
120
105
  variants: {
121
106
  variant: {
122
107
  action: [
123
- "tw-max-w-fit",
124
- "tw-px-3",
125
- "tw-py-2",
126
- "tw-text-center",
127
- "tw-text-xs",
128
- "tw-font-medium",
129
- "tw-uppercase",
130
- "tw-tracking-wider"
108
+ "tw:max-w-fit",
109
+ "tw:px-3",
110
+ "tw:py-2",
111
+ "tw:text-center",
112
+ "tw:text-xs",
113
+ "tw:font-medium",
114
+ // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
115
+ // (`data-brand="keboola"`) renders it in standard case instead.
116
+ "tw:uppercase",
117
+ "tw:tracking-wider",
118
+ "tw:[[data-brand=keboola]_&]:normal-case",
119
+ "tw:[[data-brand=keboola]_&]:tracking-normal"
131
120
  ],
132
121
  explanatory: [
133
- "tw-max-w-80",
134
- "tw-px-4",
135
- "tw-py-3",
136
- "tw-text-left",
137
- "tw-text-sm",
138
- "tw-font-normal"
122
+ "tw:max-w-80",
123
+ "tw:px-4",
124
+ "tw:py-3",
125
+ "tw:text-left",
126
+ "tw:text-sm",
127
+ "tw:font-normal"
139
128
  ]
140
129
  }
141
130
  }
@@ -209,8 +198,8 @@ var TooltipTrigger = ({
209
198
  // (merged in via Slot) activates Tailwind's preflight inside the
210
199
  // span, which sets `svg { display: block }` — without an inline-flex
211
200
  // container that would stack any bare Lucide icon onto its own
212
- // line. `tw-inline-flex tw-items-center` keeps icon + text aligned.
213
- /* @__PURE__ */ jsx("span", { className: "tw-inline-flex tw-items-center", children })
201
+ // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
202
+ /* @__PURE__ */ jsx("span", { className: "tw:inline-flex tw:items-center", children })
214
203
  )
215
204
  }
216
205
  );
@@ -225,6 +214,7 @@ var Tooltip = ({
225
214
  placement = "right",
226
215
  forceHide = false,
227
216
  forceShow = false,
217
+ delayDuration,
228
218
  // trigger props
229
219
  triggerAsChild = false
230
220
  }) => {
@@ -244,6 +234,7 @@ var Tooltip = ({
244
234
  {
245
235
  open: !!tooltip && (open || forceShow) && !forceHide,
246
236
  onOpenChange: setOpen,
237
+ delayDuration,
247
238
  disableHoverableContent: isActionVariant,
248
239
  children: [
249
240
  /* @__PURE__ */ jsx(
@@ -272,184 +263,49 @@ var Tooltip = ({
272
263
  Tooltip.Root = TooltipRoot;
273
264
  Tooltip.Content = TooltipContent;
274
265
  Tooltip.Trigger = TooltipTrigger;
275
- var HEIGHT_CLASS_NAME = {
276
- xxs: "tw-h-3 tw-rounded",
277
- xs: "tw-h-4 tw-rounded",
278
- sm: "tw-h-5 tw-rounded",
279
- md: "tw-h-6 tw-rounded-md",
280
- lg: "tw-h-8 tw-rounded-lg",
281
- xl: "tw-h-10 tw-rounded-lg",
282
- "2xl": "tw-h-12 tw-rounded-lg"
283
- };
284
- var ANIMATION_CLASS_NAME = cn(
285
- // base styles
286
- "tw-relative",
287
- "tw-overflow-hidden",
288
- "tw-pointer-events-none",
289
- "tw-bg-skeleton",
290
- // before
291
- 'before:tw-content-[""]',
292
- "before:tw-opacity-100",
293
- "before:tw-absolute",
294
- "before:tw-inset-0",
295
- "before:-tw-translate-x-full",
296
- "before:tw-animate-[shimmer_2s_infinite]",
297
- "before:tw-bg-gradient-to-r",
298
- "before:tw-from-transparent",
299
- "before:tw-to-transparent",
300
- "before:tw-via-white/40"
301
- );
302
- var Skeleton = ({ height = "md", className, count = 1 }) => {
303
- const prefixId = useId();
304
- const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
305
- return /* @__PURE__ */ jsx(Fragment, { children: keys.map((key) => /* @__PURE__ */ jsx(
306
- "div",
307
- {
308
- "data-skeleton": "true",
309
- className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
310
- },
311
- key
312
- )) });
313
- };
314
-
315
- // src/icons/index.ts
316
- var icons_exports = {};
317
- __export(icons_exports, {
318
- Google: () => Google,
319
- Keboola: () => Keboola,
320
- Microsoft: () => Microsoft
321
- });
322
- __reExport(icons_exports, lucide_react_star);
323
- var Google = forwardRef(
324
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
325
- "svg",
326
- {
327
- ref,
328
- xmlns: "http://www.w3.org/2000/svg",
329
- width: size,
330
- height: size,
331
- viewBox: "12 10 20 20",
332
- fill: "none",
333
- className: cn("lucide", className),
334
- ...rest,
335
- children: [
336
- /* @__PURE__ */ jsx(
337
- "path",
338
- {
339
- d: "M31.6 20.2273C31.6 19.5182 31.5364 18.8364 31.4182 18.1818H22V22.05H27.3818C27.15 23.3 26.4455 24.3591 25.3864 25.0682V27.5773H28.6182C30.5091 25.8364 31.6 23.2727 31.6 20.2273Z",
340
- fill: "#4285F4"
341
- }
342
- ),
343
- /* @__PURE__ */ jsx(
344
- "path",
345
- {
346
- d: "M22 30C24.7 30 26.9636 29.1045 28.6181 27.5773L25.3863 25.0682C24.4909 25.6682 23.3454 26.0227 22 26.0227C19.3954 26.0227 17.1909 24.2636 16.4045 21.9H13.0636V24.4909C14.7091 27.7591 18.0909 30 22 30Z",
347
- fill: "#34A853"
348
- }
349
- ),
350
- /* @__PURE__ */ jsx(
351
- "path",
352
- {
353
- d: "M16.4045 21.9C16.2045 21.3 16.0909 20.6591 16.0909 20C16.0909 19.3409 16.2045 18.7 16.4045 18.1V15.5091H13.0636C12.3864 16.8591 12 18.3864 12 20C12 21.6136 12.3864 23.1409 13.0636 24.4909L16.4045 21.9Z",
354
- fill: "#FBBC04"
355
- }
356
- ),
357
- /* @__PURE__ */ jsx(
358
- "path",
359
- {
360
- d: "M22 13.9773C23.4681 13.9773 24.7863 14.4818 25.8227 15.4727L28.6909 12.6045C26.9591 10.9909 24.6954 10 22 10C18.0909 10 14.7091 12.2409 13.0636 15.5091L16.4045 18.1C17.1909 15.7364 19.3954 13.9773 22 13.9773Z",
361
- fill: "#EA4335"
362
- }
363
- ),
364
- children
365
- ]
366
- }
367
- )
368
- );
369
- Google.displayName = "Google";
370
- var Keboola = forwardRef(
371
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
372
- "svg",
373
- {
374
- ref,
375
- xmlns: "http://www.w3.org/2000/svg",
376
- width: size,
377
- height: size,
378
- viewBox: "0 0 300 512",
379
- fill: color,
380
- className: cn("lucide", className),
381
- ...rest,
382
- children: [
383
- /* @__PURE__ */ jsx("path", { d: "M152 320C79.7 320 24.5 233.9 24.5 124.7C24.5 15.6 70.5 0 152 0s123.6 15.6 123.6 124.7C275.5 233.9 217.7 320 152 320zm-8.7-50.5c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm55.7 0c0-11.2-9.5-20.3-21.2-20.3s-21.2 9.1-21.2 20.3c0 11.2 9.5 20.3 21.2 20.3s21.2-9.1 21.2-20.3zm68.9 115.1c10.2 9.3 20.2 20.5 29 35c5.9 9.7 2.6 22.1-7.5 27.8c-3.4 1.9-7.1 2.8-10.7 2.8c-7.2 0-14.3-3.6-18.3-10c-6.8-11.1-13.8-18.9-21.7-26.1c-7.3-6.7-15.6-12.7-24.9-19.5c-.7-.5-1.4-1-2.1-1.5c-5-3.6-10-6.8-14.9-9.4c.6 1 1.2 2.1 1.8 3.2c14.4 26.4 29.2 63.1 29.2 104.9c0 11.2-9.5 20.3-21.2 20.3c-11.7 0-21.2-9.1-21.2-20.3c.1-31.8-11.6-62.3-23.8-84.9c-4-7.4-8-13.9-11.6-19.3c-3.4 5.2-7.2 11.3-11 18.3c-12.5 22.7-24.5 53.8-24.4 86c0 11.2-9.5 20.3-21.2 20.3s-21.2-9.1-21.2-20.3c.1-41.8 14.9-78.4 29.2-104.9c.6-1.1 1.2-2.1 1.8-3.2c-5 2.7-9.9 5.8-14.9 9.4c-.6 .5-1.3 .9-1.9 1.4c-9.5 6.9-17.8 12.9-25.1 19.7c-7.9 7.2-14.9 15.1-21.7 26.1c-5.9 9.7-18.9 12.9-29 7.2C.5 441.8-2.9 429.3 3.1 419.7c8.9-14.4 18.8-25.7 29-35c9.2-8.4 18.5-15.1 27.6-21.7c1-.7 2-1.4 3-2.2c4.7-3.5 9.6-6.7 14.6-9.6c-5-2.9-9.8-6.1-14.6-9.6C39.8 325 19.9 302.5 3.1 275.1c-5.9-9.7-2.6-22.1 7.5-27.8c10.1-5.7 23.1-2.5 29 7.2c14.6 23.7 31.1 42 48.7 54.9c18.9 13.7 37.4 20.5 56.5 21.5c1.7-.1 3.5-.1 5.2-.1c1.8 0 3.5 .1 5.2 .1c0 0 0 0 0 0c19.1-1.1 37.6-7.9 56.5-21.5c17.6-12.8 34.2-31.2 48.7-54.9c6-9.7 18.9-12.9 29-7.2c10.1 5.7 13.4 18.1 7.5 27.8c-16.8 27.4-36.7 49.9-59.6 66.6c-4.7 3.5-9.6 6.7-14.5 9.6c4.9 2.9 9.8 6.1 14.5 9.6c.9 .7 1.8 1.3 2.7 2c9.2 6.7 18.5 13.5 27.9 22z" }),
384
- children
385
- ]
386
- }
387
- )
388
- );
389
- Keboola.displayName = "Keboola";
390
- var Microsoft = forwardRef(
391
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxs(
392
- "svg",
393
- {
394
- ref,
395
- xmlns: "http://www.w3.org/2000/svg",
396
- width: size,
397
- height: size,
398
- viewBox: "0 0 21 21",
399
- fill: "none",
400
- className: cn("lucide", className),
401
- ...rest,
402
- children: [
403
- /* @__PURE__ */ jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
404
- /* @__PURE__ */ jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
405
- /* @__PURE__ */ jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
406
- /* @__PURE__ */ jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
407
- children
408
- ]
409
- }
410
- )
411
- );
412
- Microsoft.displayName = "Microsoft";
413
266
  var variants = cva(
414
267
  [
415
268
  "tailwindcss-preflight",
416
- "tw-group/button",
417
- "tw-border-box",
269
+ "tw:group/button",
270
+ "tw:border-box",
418
271
  // layout
419
- "tw-relative",
420
- "tw-flex",
421
- "tw-items-center",
422
- "tw-justify-center",
423
- "tw-gap-2",
272
+ "tw:relative",
273
+ "tw:flex",
274
+ "tw:items-center",
275
+ "tw:justify-center",
276
+ "tw:gap-2",
424
277
  // text — chrome weight/tracking are brand-overridable tokens
425
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
426
- "tw-text-xs",
427
- "tw-leading-5",
428
- "tw-font-medium",
429
- "tw-tracking-chrome",
430
- "tw-uppercase",
278
+ // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
279
+ // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
280
+ // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
281
+ // treatment shipped for Tooltip/Badge (PR 7629).
282
+ "tw:text-xs",
283
+ "tw:leading-5",
284
+ "tw:font-medium",
285
+ "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
286
+ "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
431
287
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
432
- "tw-rounded",
433
- "tw-border",
434
- "tw-border-transparent",
288
+ "tw:rounded",
289
+ "tw:border",
290
+ "tw:border-transparent",
435
291
  // styling
436
- "tw-shadow-none",
437
- "[a]:tw-cursor-pointer",
292
+ "tw:shadow-none",
293
+ "tw:[a]:cursor-pointer",
438
294
  // explicitly set for anchor
439
- "focus-visible:tw-outline",
440
- "focus-visible:tw-outline-1",
441
- "focus-visible:-tw-outline-offset-1",
442
- "focus-visible:tw-outline-ring",
443
- "focus-visible:tw-ring-4",
444
- "focus-visible:tw-ring-ring/30",
295
+ "tw:focus-visible:outline",
296
+ "tw:focus-visible:outline-1",
297
+ "tw:focus-visible:-outline-offset-1",
298
+ "tw:focus-visible:outline-ring",
299
+ "tw:focus-visible:ring-4",
300
+ "tw:focus-visible:ring-ring/30",
445
301
  // disabled
446
- "disabled:tw-opacity-40",
447
- "disabled:tw-cursor-not-allowed",
302
+ "tw:disabled:opacity-40",
303
+ "tw:disabled:cursor-not-allowed",
448
304
  // anchor support
449
- "!tw-no-underline",
450
- "aria-disabled:tw-opacity-40",
451
- "aria-disabled:tw-cursor-not-allowed",
452
- "[&_svg]:tw-shrink-0"
305
+ "tw:!no-underline",
306
+ "tw:aria-disabled:opacity-40",
307
+ "tw:aria-disabled:cursor-not-allowed",
308
+ "tw:[&_svg]:shrink-0"
453
309
  ],
454
310
  {
455
311
  defaultVariants: {
@@ -459,113 +315,113 @@ var variants = cva(
459
315
  },
460
316
  variants: {
461
317
  block: {
462
- true: ["tw-w-full"]
318
+ true: ["tw:w-full"]
463
319
  },
464
320
  variant: {
465
321
  primary: [
466
- "tw-text-white",
467
- "tw-bg-primary-500",
468
- "focus:tw-text-white",
469
- "hover:tw-text-white",
470
- "hover:not-disabled:tw-bg-primary-600",
471
- "active:not-disabled:tw-bg-primary-800",
322
+ "tw:text-white",
323
+ "tw:bg-primary-500",
324
+ "tw:focus:text-white",
325
+ "tw:hover:text-white",
326
+ "tw:hover:not-disabled:bg-primary-600",
327
+ "tw:active:not-disabled:bg-primary-800",
472
328
  // anchor disabled override
473
- "aria-disabled:!tw-bg-primary-500"
329
+ "tw:aria-disabled:!bg-primary-500"
474
330
  ],
475
331
  secondary: [
476
- "tw-text-white",
477
- "tw-bg-secondary-500",
478
- "focus:tw-text-white",
479
- "hover:tw-text-white",
480
- "hover:not-disabled:tw-bg-secondary-700",
481
- "active:not-disabled:tw-bg-secondary-800",
332
+ "tw:text-white",
333
+ "tw:bg-secondary-500",
334
+ "tw:focus:text-white",
335
+ "tw:hover:text-white",
336
+ "tw:hover:not-disabled:bg-secondary-700",
337
+ "tw:active:not-disabled:bg-secondary-800",
482
338
  // anchor disabled override
483
- "aria-disabled:!tw-bg-secondary-500"
339
+ "tw:aria-disabled:!bg-secondary-500"
484
340
  ],
485
341
  danger: [
486
- "tw-text-white",
487
- "tw-bg-error-500",
488
- "focus:tw-text-white",
489
- "hover:tw-text-white",
490
- "hover:not-disabled:tw-bg-error-600",
491
- "active:not-disabled:tw-bg-error-700",
342
+ "tw:text-white",
343
+ "tw:bg-error-500",
344
+ "tw:focus:text-white",
345
+ "tw:hover:text-white",
346
+ "tw:hover:not-disabled:bg-error-600",
347
+ "tw:active:not-disabled:bg-error-700",
492
348
  // anchor disabled override
493
- "aria-disabled:!tw-bg-error-500"
349
+ "tw:aria-disabled:!bg-error-500"
494
350
  ],
495
351
  invisible: [
496
- "tw-text-neutral-800",
497
- "tw-bg-transparent",
498
- "focus:tw-text-neutral-800",
499
- "hover:not-disabled:tw-bg-neutral-100",
500
- "hover:tw-text-neutral-800",
501
- "active:not-disabled:tw-bg-neutral-150",
352
+ "tw:text-neutral-800",
353
+ "tw:bg-transparent",
354
+ "tw:focus:text-neutral-800",
355
+ "tw:hover:not-disabled:bg-neutral-100",
356
+ "tw:hover:text-neutral-800",
357
+ "tw:active:not-disabled:bg-neutral-150",
502
358
  // contrasting icon on hover/active
503
- "[&_svg]:tw-text-neutral-400",
504
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
505
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
359
+ "tw:[&_svg]:text-neutral-400",
360
+ "tw:hover:not-disabled:[&_svg]:text-secondary-600",
361
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
506
362
  // anchor disabled override
507
- "aria-disabled:!tw-bg-transparent"
363
+ "tw:aria-disabled:!bg-transparent"
508
364
  ],
509
365
  outline: [
510
- "tw-text-neutral-800",
511
- "tw-bg-white",
366
+ "tw:text-neutral-800",
367
+ "tw:bg-white",
512
368
  // border
513
- "!tw-border-neutral-200",
514
- "hover:tw-text-neutral-800",
515
- "focus:tw-text-neutral-800",
516
- "hover:not-disabled:!tw-border-neutral-300",
517
- "hover:not-disabled:tw-bg-neutral-100",
518
- "active:not-disabled:tw-bg-neutral-200",
369
+ "tw:!border-neutral-200",
370
+ "tw:hover:text-neutral-800",
371
+ "tw:focus:text-neutral-800",
372
+ "tw:hover:not-disabled:!border-neutral-300",
373
+ "tw:hover:not-disabled:bg-neutral-100",
374
+ "tw:active:not-disabled:bg-neutral-200",
519
375
  // contrasting icon hover, same as invisible
520
- "[&_svg]:tw-text-neutral-400",
521
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
522
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
376
+ "tw:[&_svg]:text-neutral-400",
377
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
378
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
523
379
  // anchor disabled override
524
- "aria-disabled:!tw-bg-white",
525
- "aria-disabled:!tw-border-neutral-200"
380
+ "tw:aria-disabled:!bg-white",
381
+ "tw:aria-disabled:!border-neutral-200"
526
382
  ],
527
383
  inline: [
528
- "tw-text-neutral-800",
529
- "tw-bg-transparent",
530
- "tw-rounded-full",
531
- "[&_svg]:tw-text-neutral-400",
532
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
533
- "[&_svg]:not-disabled:focus:tw-text-secondary-600"
384
+ "tw:text-neutral-800",
385
+ "tw:bg-transparent",
386
+ "tw:rounded-full",
387
+ "tw:[&_svg]:text-neutral-400",
388
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
389
+ "tw:not-disabled:focus:[&_svg]:text-secondary-600"
534
390
  ]
535
391
  },
536
392
  size: {
537
393
  medium: [
538
- "tw-max-h-10",
539
- "tw-min-h-10",
540
- "tw-px-4",
541
- "tw-py-2.5",
542
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
394
+ "tw:max-h-10",
395
+ "tw:min-h-10",
396
+ "tw:px-4",
397
+ "tw:py-2.5",
398
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
543
399
  ],
544
400
  small: [
545
- "tw-max-h-8",
546
- "tw-min-h-8",
547
- "tw-px-4",
548
- "tw-py-1.5",
549
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
401
+ "tw:max-h-8",
402
+ "tw:min-h-8",
403
+ "tw:px-4",
404
+ "tw:py-1.5",
405
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
550
406
  ],
551
407
  large: [
552
- "tw-max-h-12",
553
- "tw-min-h-12",
554
- "tw-px-4",
555
- "tw-py-3.5",
556
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
408
+ "tw:max-h-12",
409
+ "tw:min-h-12",
410
+ "tw:px-4",
411
+ "tw:py-3.5",
412
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
557
413
  ],
558
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
559
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
560
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
561
- "icon-xs": ["tw-size-6", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
414
+ "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
415
+ icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
416
+ "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
417
+ "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
562
418
  "icon-2xs": [
563
- "!tw-inline-flex",
564
- "tw-size-5",
565
- "tw-max-h-5",
566
- '[&_svg:not([class*="tw-size-"])]:tw-size-3'
419
+ "tw:!inline-flex",
420
+ "tw:size-5",
421
+ "tw:max-h-5",
422
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
567
423
  ],
568
- "icon-3xs": ["tw-h-fit", "tw-w-fit", '[&_svg:not([class*="tw-size-"])]:tw-size-4']
424
+ "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
569
425
  }
570
426
  }
571
427
  }
@@ -574,37 +430,37 @@ var argoVariants = cva(
574
430
  [
575
431
  "tailwindcss-preflight",
576
432
  // layout
577
- "tw-relative",
578
- "tw-inline-flex",
579
- "tw-items-center",
580
- "tw-justify-center",
581
- "tw-whitespace-nowrap",
582
- "tw-gap-2",
433
+ "tw:relative",
434
+ "tw:inline-flex",
435
+ "tw:items-center",
436
+ "tw:justify-center",
437
+ "tw:whitespace-nowrap",
438
+ "tw:gap-2",
583
439
  // border
584
- "tw-border",
585
- "tw-border-transparent",
586
- "tw-rounded-[var(--radius-lg,0.25rem)]",
440
+ "tw:border",
441
+ "tw:border-transparent",
442
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
587
443
  // text
588
- "tw-font-medium",
589
- "tw-select-none",
444
+ "tw:font-medium",
445
+ "tw:select-none",
590
446
  // focus visible
591
- "!tw-outline-none",
592
- "focus-visible:tw-ring-2",
447
+ "tw:!outline-hidden",
448
+ "tw:focus-visible:ring-2",
593
449
  // disabled
594
- "disabled:tw-cursor-not-allowed",
595
- "disabled:tw-opacity-50",
596
- "active:tw-opacity-60",
597
- "tw-transition-all",
598
- "tw-bg-clip-padding",
450
+ "tw:disabled:cursor-not-allowed",
451
+ "tw:disabled:opacity-50",
452
+ "tw:active:opacity-60",
453
+ "tw:transition-all",
454
+ "tw:bg-clip-padding",
599
455
  // anchor support
600
- "!tw-no-underline",
601
- "aria-disabled:tw-cursor-not-allowed",
602
- "aria-disabled:tw-opacity-50",
456
+ "tw:!no-underline",
457
+ "tw:aria-disabled:cursor-not-allowed",
458
+ "tw:aria-disabled:opacity-50",
603
459
  // icon
604
- "tw-shrink-0",
605
- "[&_svg]:tw-pointer-events-none",
606
- "[&_svg]:tw-shrink-0",
607
- "[&_svg:not([class*='tw-size-'])]:tw-size-4"
460
+ "tw:shrink-0",
461
+ "tw:[&_svg]:pointer-events-none",
462
+ "tw:[&_svg]:shrink-0",
463
+ "tw:[&_svg:not([class*='tw:size-'])]:size-4"
608
464
  ],
609
465
  {
610
466
  defaultVariants: {
@@ -613,77 +469,77 @@ var argoVariants = cva(
613
469
  },
614
470
  variants: {
615
471
  block: {
616
- true: ["tw-w-full"]
472
+ true: ["tw:w-full"]
617
473
  },
618
474
  variant: {
619
475
  primary: [
620
- "tw-bg-primary",
621
- "tw-text-primary-foreground",
622
- "[a]:hover:tw-bg-primary/80",
623
- "hover:not-disabled:tw-bg-primary/90",
624
- "hover:tw-text-primary-foreground",
625
- "focus:tw-text-primary-foreground",
626
- "focus-visible:tw-border-primary",
627
- "focus-visible:tw-ring-ring/50"
476
+ "tw:bg-primary",
477
+ "tw:text-primary-foreground",
478
+ "tw:[a]:hover:bg-primary/80",
479
+ "tw:hover:not-disabled:bg-primary/90",
480
+ "tw:hover:text-primary-foreground",
481
+ "tw:focus:text-primary-foreground",
482
+ "tw:focus-visible:border-primary",
483
+ "tw:focus-visible:ring-ring/50"
628
484
  ],
629
485
  secondary: [
630
- "tw-bg-primary/10",
631
- "tw-text-primary",
632
- "hover:not-disabled:tw-bg-primary/20",
633
- "focus-visible:tw-border-primary",
634
- "focus-visible:tw-ring-ring/50"
486
+ "tw:bg-primary/10",
487
+ "tw:text-primary",
488
+ "tw:hover:not-disabled:bg-primary/20",
489
+ "tw:focus-visible:border-primary",
490
+ "tw:focus-visible:ring-ring/50"
635
491
  ],
636
492
  // should be called "destructive" by Figma
637
493
  danger: [
638
- "tw-bg-destructive",
639
- "tw-text-destructive-foreground",
640
- "hover:tw-text-destructive-foreground",
641
- "focus:tw-text-destructive-foreground",
642
- "focus-visible:tw-border-destructive",
643
- "focus-visible:tw-ring-destructive/20"
494
+ "tw:bg-destructive",
495
+ "tw:text-destructive-foreground",
496
+ "tw:hover:text-destructive-foreground",
497
+ "tw:focus:text-destructive-foreground",
498
+ "tw:focus-visible:border-destructive",
499
+ "tw:focus-visible:ring-destructive/20"
644
500
  ],
645
501
  outline: [
646
- "!tw-border-input",
647
- "tw-bg-background",
502
+ "tw:!border-input",
503
+ "tw:bg-background",
648
504
  // Semantic base text color so the label/icon flips in dark mode
649
505
  // (matches `invisible`); previously unset → inherited a fixed dark color.
650
- "tw-text-foreground",
506
+ "tw:text-foreground",
651
507
  // Hover follows the brand primary (translucent tint), matching the
652
508
  // `secondary` variant — not the fixed `accent` blue.
653
- "hover:not-disabled:tw-bg-primary/10",
654
- "hover:not-disabled:tw-text-primary",
655
- "hover:active:tw-bg-background",
656
- "focus-visible:!tw-border-primary",
657
- "focus-visible:tw-ring-ring/50"
509
+ "tw:hover:not-disabled:bg-primary/10",
510
+ "tw:hover:not-disabled:text-primary",
511
+ "tw:hover:active:bg-background",
512
+ "tw:focus-visible:!border-primary",
513
+ "tw:focus-visible:ring-ring/50"
658
514
  ],
659
515
  // should be called "ghost" by Figma
660
516
  invisible: [
661
- "tw-bg-transparent",
662
- "tw-text-foreground",
663
- "hover:not-disabled:tw-bg-primary/10",
664
- "hover:not-disabled:tw-text-primary",
665
- "hover:not-disabled:tw-border-primary/10",
666
- "focus-visible:tw-ring-ring/50"
517
+ "tw:bg-transparent",
518
+ "tw:text-foreground",
519
+ "tw:hover:not-disabled:bg-primary/10",
520
+ "tw:hover:not-disabled:text-primary",
521
+ "tw:hover:not-disabled:border-primary/10",
522
+ "tw:focus-visible:ring-ring/50"
667
523
  ],
668
524
  // should be called "link" by Figma
669
525
  inline: [
670
- "tw-bg-transparent",
671
- "tw-text-primary",
672
- "hover:tw-underline",
673
- "hover:active:tw-bg-transparent",
674
- "focus-visible:tw-ring-ring/50"
526
+ "tw:bg-transparent",
527
+ "tw:text-primary",
528
+ "tw:hover:underline",
529
+ "tw:hover:active:bg-transparent",
530
+ "tw:focus-visible:ring-ring/50"
675
531
  ]
676
532
  },
677
533
  size: {
678
534
  // should be called "default" by Figma
679
- medium: ["tw-max-h-9", "tw-py-2", "tw-px-4", "tw-text-sm"],
535
+ medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
680
536
  // should be called "small" by Figma
681
- small: ["tw-max-h-8", "tw-py-2", "tw-px-3", "tw-text-xs"],
537
+ small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
682
538
  // should be called "large" by Figma
683
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
684
- "icon-lg": ["tw-size-10"],
685
- icon: ["tw-size-9"],
686
- "icon-sm": ["tw-size-8"],
539
+ large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
540
+ "icon-lg": ["tw:size-10"],
541
+ icon: ["tw:size-9"],
542
+ "icon-sm": ["tw:size-8"],
687
543
  // unsupported in ARGO, remove when old design is gone
688
544
  "icon-xs": [],
689
545
  "icon-2xs": [],
@@ -731,13 +587,13 @@ var Button = ({
731
587
  onClick: handleClick,
732
588
  className: cn(classNames),
733
589
  children: [
734
- isLoading && /* @__PURE__ */ jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
590
+ isLoading && /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
735
591
  /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
736
592
  ]
737
593
  }
738
594
  );
739
595
  };
740
- var Clipboard = ({
596
+ var Clipboard2 = ({
741
597
  ref,
742
598
  text: textProp,
743
599
  children,
@@ -762,6 +618,7 @@ var Clipboard = ({
762
618
  }
763
619
  };
764
620
  const handleOnClick = (event) => {
621
+ setIsTooltipOpen(true);
765
622
  if (text && state === "ready") void copy(text);
766
623
  onClick?.(event);
767
624
  };
@@ -776,6 +633,7 @@ var Clipboard = ({
776
633
  return tooltip;
777
634
  })();
778
635
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
636
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
779
637
  return /* @__PURE__ */ jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
780
638
  /* @__PURE__ */ jsx(
781
639
  Tooltip.Trigger,
@@ -784,12 +642,12 @@ var Clipboard = ({
784
642
  asChild,
785
643
  keepOpenOnClick: true,
786
644
  onClick: handleOnClick,
787
- className: cn("tw-cursor-pointer", className),
645
+ className: cn("tw:cursor-pointer", className),
788
646
  ref,
789
647
  children: children ?? text
790
648
  }
791
649
  ),
792
- /* @__PURE__ */ jsx(
650
+ hasTooltipContent && /* @__PURE__ */ jsx(
793
651
  Tooltip.Content,
794
652
  {
795
653
  keepOpenOnPointerDownOutside: true,
@@ -800,7 +658,7 @@ var Clipboard = ({
800
658
  )
801
659
  ] });
802
660
  };
803
- var DEFAULT_ICON = /* @__PURE__ */ jsx(icons_exports.Copy, {});
661
+ var DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
804
662
  var DEFAULT_ARIA_LABEL = "Copy";
805
663
  var ClipboardButton = ({
806
664
  // clipboard props
@@ -817,7 +675,7 @@ var ClipboardButton = ({
817
675
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
818
676
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
819
677
  return /* @__PURE__ */ jsx(
820
- Clipboard,
678
+ Clipboard2,
821
679
  {
822
680
  asChild: true,
823
681
  tooltip,
@@ -834,10 +692,19 @@ var ClipboardButton = ({
834
692
  var MIN_SCALE = 0.5;
835
693
  var MAX_SCALE = 3;
836
694
  var ZOOM_STEP = 0.1;
837
- var ZoomableSvg = ({ html, copyText, className }) => {
695
+ var ZoomableSvg = ({
696
+ html,
697
+ copyText,
698
+ className,
699
+ allowForeignObject,
700
+ renderActions
701
+ }) => {
838
702
  const safeHtml = useMemo(
839
- () => DOMPurify.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
840
- [html]
703
+ () => DOMPurify.sanitize(html, {
704
+ USE_PROFILES: { svg: true, svgFilters: true },
705
+ ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
706
+ }),
707
+ [html, allowForeignObject]
841
708
  );
842
709
  const containerRef = useRef(null);
843
710
  const [scale, setScale] = useState(1);
@@ -866,7 +733,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
866
733
  };
867
734
  el.addEventListener("wheel", onWheel, { passive: false });
868
735
  return () => el.removeEventListener("wheel", onWheel);
869
- }, []);
736
+ }, [isFullscreen]);
870
737
  const didDragRef = useRef(false);
871
738
  const handleMouseDown = useCallback(
872
739
  (e) => {
@@ -910,7 +777,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
910
777
  "div",
911
778
  {
912
779
  role: "presentation",
913
- className: cn("tw-group/zoom tw-relative", isFullscreen && "tw-h-full"),
780
+ className: cn("tw:group/zoom tw:relative", isFullscreen && "tw:h-full"),
914
781
  onClick: handleClick,
915
782
  children: [
916
783
  /* @__PURE__ */ jsx(
@@ -919,8 +786,8 @@ var ZoomableSvg = ({ html, copyText, className }) => {
919
786
  role: "presentation",
920
787
  ref: containerRef,
921
788
  className: cn(
922
- "tw-overflow-hidden tw-cursor-grab active:tw-cursor-grabbing tw-p-3",
923
- isFullscreen && "tw-h-full"
789
+ "tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3",
790
+ isFullscreen && "tw:h-full"
924
791
  ),
925
792
  onMouseDown: handleMouseDown,
926
793
  onMouseMove: handleMouseMove,
@@ -930,8 +797,8 @@ var ZoomableSvg = ({ html, copyText, className }) => {
930
797
  "div",
931
798
  {
932
799
  className: cn(
933
- "tw-flex tw-justify-center tw-origin-center",
934
- isFullscreen && "tw-h-full [&>svg]:tw-h-full"
800
+ "tw:flex tw:justify-center tw:origin-center",
801
+ isFullscreen && "tw:h-full tw:[&>svg]:h-full"
935
802
  ),
936
803
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
937
804
  dangerouslySetInnerHTML: { __html: safeHtml }
@@ -943,11 +810,12 @@ var ZoomableSvg = ({ html, copyText, className }) => {
943
810
  "div",
944
811
  {
945
812
  role: "presentation",
946
- className: "tw-absolute tw-right-1 tw-top-1 tw-flex tw-gap-1 tw-opacity-0 tw-transition-opacity group-hover/zoom:tw-opacity-100",
813
+ className: "tw:absolute tw:right-1 tw:top-1 tw:flex tw:gap-1 tw:opacity-0 tw:transition-opacity tw:focus-within:opacity-100 tw:group-hover/zoom:opacity-100",
947
814
  onClick: stopPropagation,
948
815
  children: [
949
816
  isZoomed && /* @__PURE__ */ jsx(Tooltip, { tooltip: "Reset zoom", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "outline", onClick: handleReset, children: "Reset" }) }),
950
817
  copyText && /* @__PURE__ */ jsx(ClipboardButton, { text: copyText, tooltip: "Copy code", size: "icon-sm", variant: "outline" }),
818
+ renderActions?.(safeHtml),
951
819
  /* @__PURE__ */ jsx(
952
820
  Tooltip,
953
821
  {
@@ -961,7 +829,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
961
829
  variant: "outline",
962
830
  "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
963
831
  onClick: () => setIsFullscreen((f) => !f),
964
- children: isFullscreen ? /* @__PURE__ */ jsx(icons_exports.Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsx(icons_exports.Maximize2, { className: "tw-size-4" })
832
+ children: isFullscreen ? /* @__PURE__ */ jsx(Minimize2, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Maximize2, { className: "tw:size-4" })
965
833
  }
966
834
  )
967
835
  }
@@ -973,36 +841,112 @@ var ZoomableSvg = ({ html, copyText, className }) => {
973
841
  }
974
842
  );
975
843
  if (isFullscreen) {
976
- return /* @__PURE__ */ jsx(
977
- "div",
978
- {
979
- role: "presentation",
980
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
981
- onClick: stopPropagation,
982
- children: diagramContent
983
- }
844
+ return createPortal(
845
+ /* @__PURE__ */ jsx(
846
+ "div",
847
+ {
848
+ role: "presentation",
849
+ "data-testid": "zoomable-svg-fullscreen",
850
+ className: "tw:fixed tw:inset-0 tw:z-[1060] tw:bg-muted tw:p-4 tailwindcss-preflight",
851
+ onClick: stopPropagation,
852
+ children: diagramContent
853
+ }
854
+ ),
855
+ document.body
984
856
  );
985
857
  }
986
858
  return /* @__PURE__ */ jsx(
987
859
  "div",
988
860
  {
989
861
  className: cn(
990
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
862
+ "tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted",
991
863
  className
992
864
  ),
993
865
  children: diagramContent
994
866
  }
995
867
  );
996
868
  };
869
+ var HEIGHT_CLASS_NAME = {
870
+ xxs: "tw:h-3 tw:rounded",
871
+ xs: "tw:h-4 tw:rounded",
872
+ sm: "tw:h-5 tw:rounded",
873
+ md: "tw:h-6 tw:rounded-md",
874
+ lg: "tw:h-8 tw:rounded-lg",
875
+ xl: "tw:h-10 tw:rounded-lg",
876
+ "2xl": "tw:h-12 tw:rounded-lg"
877
+ };
878
+ var ANIMATION_CLASS_NAME = cn(
879
+ // base styles
880
+ "tw:relative",
881
+ "tw:overflow-hidden",
882
+ "tw:pointer-events-none",
883
+ "tw:bg-skeleton",
884
+ // before
885
+ 'tw:before:content-[""]',
886
+ "tw:before:opacity-100",
887
+ "tw:before:absolute",
888
+ "tw:before:inset-0",
889
+ "tw:before:-translate-x-full",
890
+ "tw:before:animate-[shimmer_2s_infinite]",
891
+ "tw:before:bg-gradient-to-r",
892
+ "tw:before:from-transparent",
893
+ "tw:before:to-transparent",
894
+ "tw:before:via-white/40"
895
+ );
896
+ var Skeleton = ({ height = "md", className, count = 1 }) => {
897
+ const prefixId = useId();
898
+ const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
899
+ return /* @__PURE__ */ jsx(Fragment, { children: keys.map((key) => /* @__PURE__ */ jsx(
900
+ "div",
901
+ {
902
+ "data-skeleton": "true",
903
+ className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
904
+ },
905
+ key
906
+ )) });
907
+ };
908
+ var DiagramSkeleton = () => /* @__PURE__ */ jsx("div", { className: "tw:my-3 tw:overflow-hidden tw:rounded-md tw:border tw:border-neutral-150 tw:bg-neutral-50 tw:p-6", children: /* @__PURE__ */ jsx(Skeleton, { className: "tw:h-40" }) });
909
+
910
+ // src/blocks/MermaidDiagram/svgTransforms.ts
911
+ var HTML_TAG = /<[^>]+>/g;
912
+ var FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
913
+ var ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
914
+ var flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
915
+ const text = inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim();
916
+ return `${open}${text}${close}`;
917
+ });
918
+ var STYLE_ATTR = /\s+style="([^"]*)"/i;
919
+ var makeResponsive = (svgString) => {
920
+ const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
921
+ const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
922
+ return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
923
+ const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? "";
924
+ const styleDecls = existingStyle.replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
925
+ let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
926
+ nextAttrs += ' width="100%"';
927
+ const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
928
+ if (styleParts) nextAttrs += ` style="${styleParts}"`;
929
+ return `${open}${nextAttrs}${close}`;
930
+ });
931
+ };
997
932
  var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
998
933
  var resolvePrimary = () => {
999
- const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
934
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--primary").trim() || PRIMARY_FALLBACK_CHANNELS;
1000
935
  return `rgb(${channels})`;
1001
936
  };
1002
937
  var mermaidPromise = null;
938
+ var registerLucideIconPack = (m) => {
939
+ m.registerIconPacks([
940
+ {
941
+ name: "lucide",
942
+ loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default)
943
+ }
944
+ ]);
945
+ };
1003
946
  var getMermaid = () => {
1004
947
  if (!mermaidPromise) {
1005
948
  mermaidPromise = import('mermaid').then((m) => {
949
+ registerLucideIconPack(m.default);
1006
950
  m.default.initialize({
1007
951
  startOnLoad: false,
1008
952
  securityLevel: "strict",
@@ -1066,7 +1010,9 @@ var getMermaid = () => {
1066
1010
  return mermaidPromise;
1067
1011
  };
1068
1012
  var stripFontImports = (svg) => svg.replace(/@import\s+url\([^)]*fonts\.googleapis\.com[^)]*\);?\s*/g, "");
1013
+ var hasIconSyntax = (code) => /@\{[^}]*\bicon\s*:/.test(code) || /\b(?:icon|service|group)\b[^\n(]*\(\s*[\w-]+:/.test(code) || /\bfa[bslr]?:fa-/.test(code);
1069
1014
  var tryFastRender = (code) => {
1015
+ if (hasIconSyntax(code)) return null;
1070
1016
  try {
1071
1017
  return stripFontImports(
1072
1018
  renderMermaidSVG(code, {
@@ -1076,27 +1022,11 @@ var tryFastRender = (code) => {
1076
1022
  font: "Inter, system-ui, sans-serif"
1077
1023
  })
1078
1024
  );
1079
- } catch {
1025
+ } catch (err) {
1026
+ console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1080
1027
  return null;
1081
1028
  }
1082
1029
  };
1083
- var makeResponsive = (svgString) => {
1084
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1085
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1086
- let result = svgString.replace(/(<svg[^>]*?)\s+width="[^"]*"/i, '$1 width="100%"').replace(/(<svg[^>]*?)\s+height="[^"]*"/i, "$1");
1087
- if (!vbWidth) return result;
1088
- const hasStyle = /(<svg[^>]*?)\s+style="([^"]*)"/i.test(result);
1089
- if (hasStyle) {
1090
- result = result.replace(/(<svg[^>]*?)\s+style="([^"]*)"/i, (_m, pre, styles) => {
1091
- const cleaned = styles.replace(/max-width:\s*[^;"]*;?\s*/g, "").trim();
1092
- const combined = [cleaned, `max-width: ${vbWidth}px`].filter(Boolean).join("; ");
1093
- return `${pre} style="${combined}"`;
1094
- });
1095
- } else {
1096
- result = result.replace(/<svg/, `<svg style="max-width: ${vbWidth}px"`);
1097
- }
1098
- return result;
1099
- };
1100
1030
  var RENDER_DEBOUNCE_MS = 300;
1101
1031
  var svgCache = /* @__PURE__ */ new Map();
1102
1032
  var resolveSyncSvg = (code) => {
@@ -1106,7 +1036,7 @@ var resolveSyncSvg = (code) => {
1106
1036
  if (fast) svgCache.set(code, fast);
1107
1037
  return fast;
1108
1038
  };
1109
- var MermaidDiagram = ({ code }) => {
1039
+ var MermaidDiagram = ({ code, renderActions }) => {
1110
1040
  const id = useId();
1111
1041
  const [svg, setSvg] = useState(() => resolveSyncSvg(code));
1112
1042
  const [renderFailed, setRenderFailed] = useState(false);
@@ -1137,8 +1067,9 @@ var MermaidDiagram = ({ code }) => {
1137
1067
  try {
1138
1068
  const result = await mermaidModule.default.render(rendererId, code, container);
1139
1069
  if (renderIdRef.current === currentRenderId && result) {
1140
- svgCache.set(code, result.svg);
1141
- setSvg(result.svg);
1070
+ const svgOutput = flattenForeignObjectLabels(result.svg);
1071
+ svgCache.set(code, svgOutput);
1072
+ setSvg(svgOutput);
1142
1073
  setRenderFailed(false);
1143
1074
  }
1144
1075
  } finally {
@@ -1167,11 +1098,11 @@ var MermaidDiagram = ({ code }) => {
1167
1098
  "pre",
1168
1099
  {
1169
1100
  className: cn(
1170
- "tw-my-3 tw-overflow-auto tw-whitespace-pre-wrap tw-break-all",
1171
- "tw-py-3 tw-px-4",
1172
- "tw-bg-neutral-50",
1173
- "tw-rounded-md tw-text-neutral-400",
1174
- "tw-text-sm tw-font-mono"
1101
+ "tw:my-3 tw:overflow-auto tw:whitespace-pre-wrap tw:break-all",
1102
+ "tw:py-3 tw:px-4",
1103
+ "tw:bg-neutral-50",
1104
+ "tw:rounded-md tw:text-neutral-400",
1105
+ "tw:text-sm tw:font-mono"
1175
1106
  ),
1176
1107
  children: /* @__PURE__ */ jsx("code", { children: code })
1177
1108
  }
@@ -1185,12 +1116,14 @@ var MermaidDiagram = ({ code }) => {
1185
1116
  copyText: `\`\`\`mermaid
1186
1117
  ${code}
1187
1118
  \`\`\``,
1188
- className: "tw-my-3"
1119
+ className: "tw:my-3",
1120
+ allowForeignObject: true,
1121
+ renderActions
1189
1122
  },
1190
1123
  code
1191
1124
  );
1192
1125
  }
1193
- return /* @__PURE__ */ jsx("div", { className: "tw-my-3 tw-overflow-hidden tw-rounded-md tw-border tw-border-neutral-150 tw-bg-neutral-50 tw-p-6", children: /* @__PURE__ */ jsx(Skeleton, { className: "tw-h-40" }) });
1126
+ return /* @__PURE__ */ jsx(DiagramSkeleton, {});
1194
1127
  };
1195
1128
 
1196
1129
  export { MermaidDiagram };