@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.cjs CHANGED
@@ -3,59 +3,25 @@
3
3
  var react = require('react');
4
4
  var beautifulMermaid = require('beautiful-mermaid');
5
5
  var colors = require('@keboola/tailwind-config/colors');
6
+ var reactDom = require('react-dom');
7
+ var DOMPurify = require('dompurify');
8
+ var reactSlot = require('@radix-ui/react-slot');
9
+ var lucideReact = require('lucide-react');
6
10
  var clsx = require('clsx');
7
11
  var tailwindMerge = require('tailwind-merge');
8
12
  var reactTooltip = require('@radix-ui/react-tooltip');
9
13
  var classVarianceAuthority = require('class-variance-authority');
10
14
  var brandRegistry = require('@keboola/brand-registry');
11
15
  var jsxRuntime = require('react/jsx-runtime');
12
- var DOMPurify = require('dompurify');
13
- var reactSlot = require('@radix-ui/react-slot');
14
- var lucide_react_star = require('lucide-react');
15
16
 
16
17
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
17
18
 
18
- function _interopNamespace(e) {
19
- if (e && e.__esModule) return e;
20
- var n = Object.create(null);
21
- if (e) {
22
- Object.keys(e).forEach(function (k) {
23
- if (k !== 'default') {
24
- var d = Object.getOwnPropertyDescriptor(e, k);
25
- Object.defineProperty(n, k, d.get ? d : {
26
- enumerable: true,
27
- get: function () { return e[k]; }
28
- });
29
- }
30
- });
31
- }
32
- n.default = e;
33
- return Object.freeze(n);
34
- }
35
-
36
19
  var colors__default = /*#__PURE__*/_interopDefault(colors);
37
20
  var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
38
- var lucide_react_star__namespace = /*#__PURE__*/_interopNamespace(lucide_react_star);
39
21
 
40
- var __defProp = Object.defineProperty;
41
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
42
- var __getOwnPropNames = Object.getOwnPropertyNames;
43
- var __hasOwnProp = Object.prototype.hasOwnProperty;
44
- var __export = (target, all) => {
45
- for (var name in all)
46
- __defProp(target, name, { get: all[name], enumerable: true });
47
- };
48
- var __copyProps = (to, from, except, desc) => {
49
- if (from && typeof from === "object" || typeof from === "function") {
50
- for (let key of __getOwnPropNames(from))
51
- if (!__hasOwnProp.call(to, key) && key !== except)
52
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
53
- }
54
- return to;
55
- };
56
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
22
+ // src/blocks/MermaidDiagram/MermaidDiagram.tsx
57
23
  var twMerge = tailwindMerge.extendTailwindMerge({
58
- prefix: "tw-"
24
+ prefix: "tw"
59
25
  });
60
26
  var cn = (...classes) => twMerge(clsx.clsx(...classes));
61
27
 
@@ -105,39 +71,39 @@ var useArgoDesign = () => react.use(ArgoDesignContext);
105
71
  var tooltipVariants = classVarianceAuthority.cva(
106
72
  [
107
73
  "tailwindcss-preflight",
108
- "tw-inline-block",
109
- "tw-break-anywhere",
110
- "tw-max-h-96",
111
- "tw-overflow-y-auto",
112
- "tw-z-[1060]",
74
+ "tw:inline-block",
75
+ "tw:break-anywhere",
76
+ "tw:max-h-96",
77
+ "tw:overflow-y-auto",
78
+ "tw:z-[1060]",
113
79
  // legacy (dark) chrome — default
114
- "tw-rounded",
115
- "tw-bg-neutral-800",
116
- "tw-text-white",
80
+ "tw:rounded",
81
+ "tw:bg-neutral-800",
82
+ "tw:text-white",
117
83
  // argo chrome overrides — semantic floating-panel tokens
118
- "data-[argo=true]:tw-rounded-2xl",
119
- "data-[argo=true]:tw-border",
120
- "data-[argo=true]:tw-border-solid",
121
- "data-[argo=true]:tw-border-border",
122
- "data-[argo=true]:tw-bg-popover",
123
- "data-[argo=true]:tw-text-popover-foreground",
124
- "data-[argo=true]:tw-shadow-md",
84
+ "tw:data-[argo=true]:rounded-2xl",
85
+ "tw:data-[argo=true]:border",
86
+ "tw:data-[argo=true]:border-solid",
87
+ "tw:data-[argo=true]:border-border",
88
+ "tw:data-[argo=true]:bg-popover",
89
+ "tw:data-[argo=true]:text-popover-foreground",
90
+ "tw:data-[argo=true]:shadow-md",
125
91
  // argo open animation
126
- "data-[argo=true]:data-[state=delayed-open]:tw-animate-in",
127
- "data-[argo=true]:data-[state=instant-open]:tw-animate-in",
128
- "data-[argo=true]:data-[state=delayed-open]:tw-fade-in-0",
129
- "data-[argo=true]:data-[state=instant-open]:tw-fade-in-0",
130
- "data-[argo=true]:data-[state=delayed-open]:tw-zoom-in-95",
131
- "data-[argo=true]:data-[state=instant-open]:tw-zoom-in-95",
92
+ "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
93
+ "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
94
+ "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
95
+ "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
96
+ "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
97
+ "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
132
98
  // argo closed animation
133
- "data-[argo=true]:data-[state=closed]:tw-animate-out",
134
- "data-[argo=true]:data-[state=closed]:tw-fade-out-0",
135
- "data-[argo=true]:data-[state=closed]:tw-zoom-out-95",
99
+ "tw:data-[argo=true]:data-[state=closed]:animate-out",
100
+ "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
101
+ "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
136
102
  // argo position animation
137
- "data-[argo=true]:data-[side=bottom]:tw-slide-in-from-top-2",
138
- "data-[argo=true]:data-[side=left]:tw-slide-in-from-right-2",
139
- "data-[argo=true]:data-[side=right]:tw-slide-in-from-left-2",
140
- "data-[argo=true]:data-[side=top]:tw-slide-in-from-bottom-2"
103
+ "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
104
+ "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
105
+ "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
106
+ "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
141
107
  ],
142
108
  {
143
109
  defaultVariants: {
@@ -146,22 +112,26 @@ var tooltipVariants = classVarianceAuthority.cva(
146
112
  variants: {
147
113
  variant: {
148
114
  action: [
149
- "tw-max-w-fit",
150
- "tw-px-3",
151
- "tw-py-2",
152
- "tw-text-center",
153
- "tw-text-xs",
154
- "tw-font-medium",
155
- "tw-uppercase",
156
- "tw-tracking-wider"
115
+ "tw:max-w-fit",
116
+ "tw:px-3",
117
+ "tw:py-2",
118
+ "tw:text-center",
119
+ "tw:text-xs",
120
+ "tw:font-medium",
121
+ // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
122
+ // (`data-brand="keboola"`) renders it in standard case instead.
123
+ "tw:uppercase",
124
+ "tw:tracking-wider",
125
+ "tw:[[data-brand=keboola]_&]:normal-case",
126
+ "tw:[[data-brand=keboola]_&]:tracking-normal"
157
127
  ],
158
128
  explanatory: [
159
- "tw-max-w-80",
160
- "tw-px-4",
161
- "tw-py-3",
162
- "tw-text-left",
163
- "tw-text-sm",
164
- "tw-font-normal"
129
+ "tw:max-w-80",
130
+ "tw:px-4",
131
+ "tw:py-3",
132
+ "tw:text-left",
133
+ "tw:text-sm",
134
+ "tw:font-normal"
165
135
  ]
166
136
  }
167
137
  }
@@ -235,8 +205,8 @@ var TooltipTrigger = ({
235
205
  // (merged in via Slot) activates Tailwind's preflight inside the
236
206
  // span, which sets `svg { display: block }` — without an inline-flex
237
207
  // container that would stack any bare Lucide icon onto its own
238
- // line. `tw-inline-flex tw-items-center` keeps icon + text aligned.
239
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw-inline-flex tw-items-center", children })
208
+ // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
209
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tw:inline-flex tw:items-center", children })
240
210
  )
241
211
  }
242
212
  );
@@ -251,6 +221,7 @@ var Tooltip = ({
251
221
  placement = "right",
252
222
  forceHide = false,
253
223
  forceShow = false,
224
+ delayDuration,
254
225
  // trigger props
255
226
  triggerAsChild = false
256
227
  }) => {
@@ -270,6 +241,7 @@ var Tooltip = ({
270
241
  {
271
242
  open: !!tooltip && (open || forceShow) && !forceHide,
272
243
  onOpenChange: setOpen,
244
+ delayDuration,
273
245
  disableHoverableContent: isActionVariant,
274
246
  children: [
275
247
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -298,184 +270,49 @@ var Tooltip = ({
298
270
  Tooltip.Root = TooltipRoot;
299
271
  Tooltip.Content = TooltipContent;
300
272
  Tooltip.Trigger = TooltipTrigger;
301
- var HEIGHT_CLASS_NAME = {
302
- xxs: "tw-h-3 tw-rounded",
303
- xs: "tw-h-4 tw-rounded",
304
- sm: "tw-h-5 tw-rounded",
305
- md: "tw-h-6 tw-rounded-md",
306
- lg: "tw-h-8 tw-rounded-lg",
307
- xl: "tw-h-10 tw-rounded-lg",
308
- "2xl": "tw-h-12 tw-rounded-lg"
309
- };
310
- var ANIMATION_CLASS_NAME = cn(
311
- // base styles
312
- "tw-relative",
313
- "tw-overflow-hidden",
314
- "tw-pointer-events-none",
315
- "tw-bg-skeleton",
316
- // before
317
- 'before:tw-content-[""]',
318
- "before:tw-opacity-100",
319
- "before:tw-absolute",
320
- "before:tw-inset-0",
321
- "before:-tw-translate-x-full",
322
- "before:tw-animate-[shimmer_2s_infinite]",
323
- "before:tw-bg-gradient-to-r",
324
- "before:tw-from-transparent",
325
- "before:tw-to-transparent",
326
- "before:tw-via-white/40"
327
- );
328
- var Skeleton = ({ height = "md", className, count = 1 }) => {
329
- const prefixId = react.useId();
330
- const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
331
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: keys.map((key) => /* @__PURE__ */ jsxRuntime.jsx(
332
- "div",
333
- {
334
- "data-skeleton": "true",
335
- className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
336
- },
337
- key
338
- )) });
339
- };
340
-
341
- // src/icons/index.ts
342
- var icons_exports = {};
343
- __export(icons_exports, {
344
- Google: () => Google,
345
- Keboola: () => Keboola,
346
- Microsoft: () => Microsoft
347
- });
348
- __reExport(icons_exports, lucide_react_star__namespace);
349
- var Google = react.forwardRef(
350
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
351
- "svg",
352
- {
353
- ref,
354
- xmlns: "http://www.w3.org/2000/svg",
355
- width: size,
356
- height: size,
357
- viewBox: "12 10 20 20",
358
- fill: "none",
359
- className: cn("lucide", className),
360
- ...rest,
361
- children: [
362
- /* @__PURE__ */ jsxRuntime.jsx(
363
- "path",
364
- {
365
- 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",
366
- fill: "#4285F4"
367
- }
368
- ),
369
- /* @__PURE__ */ jsxRuntime.jsx(
370
- "path",
371
- {
372
- 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",
373
- fill: "#34A853"
374
- }
375
- ),
376
- /* @__PURE__ */ jsxRuntime.jsx(
377
- "path",
378
- {
379
- 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",
380
- fill: "#FBBC04"
381
- }
382
- ),
383
- /* @__PURE__ */ jsxRuntime.jsx(
384
- "path",
385
- {
386
- 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",
387
- fill: "#EA4335"
388
- }
389
- ),
390
- children
391
- ]
392
- }
393
- )
394
- );
395
- Google.displayName = "Google";
396
- var Keboola = react.forwardRef(
397
- ({ size = 24, color = "currentColor", className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
398
- "svg",
399
- {
400
- ref,
401
- xmlns: "http://www.w3.org/2000/svg",
402
- width: size,
403
- height: size,
404
- viewBox: "0 0 300 512",
405
- fill: color,
406
- className: cn("lucide", className),
407
- ...rest,
408
- children: [
409
- /* @__PURE__ */ jsxRuntime.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" }),
410
- children
411
- ]
412
- }
413
- )
414
- );
415
- Keboola.displayName = "Keboola";
416
- var Microsoft = react.forwardRef(
417
- ({ size = 24, className, children, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
418
- "svg",
419
- {
420
- ref,
421
- xmlns: "http://www.w3.org/2000/svg",
422
- width: size,
423
- height: size,
424
- viewBox: "0 0 21 21",
425
- fill: "none",
426
- className: cn("lucide", className),
427
- ...rest,
428
- children: [
429
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "0", width: "10", height: "10", fill: "#F25022" }),
430
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "0", width: "10", height: "10", fill: "#7FBA00" }),
431
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "0", y: "11", width: "10", height: "10", fill: "#00A4EF" }),
432
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "11", y: "11", width: "10", height: "10", fill: "#FFB900" }),
433
- children
434
- ]
435
- }
436
- )
437
- );
438
- Microsoft.displayName = "Microsoft";
439
273
  var variants = classVarianceAuthority.cva(
440
274
  [
441
275
  "tailwindcss-preflight",
442
- "tw-group/button",
443
- "tw-border-box",
276
+ "tw:group/button",
277
+ "tw:border-box",
444
278
  // layout
445
- "tw-relative",
446
- "tw-flex",
447
- "tw-items-center",
448
- "tw-justify-center",
449
- "tw-gap-2",
279
+ "tw:relative",
280
+ "tw:flex",
281
+ "tw:items-center",
282
+ "tw:justify-center",
283
+ "tw:gap-2",
450
284
  // text — chrome weight/tracking are brand-overridable tokens
451
- // (`--font-weight-medium` / `--letter-spacing-chrome`); casing stays `tw-uppercase`.
452
- "tw-text-xs",
453
- "tw-leading-5",
454
- "tw-font-medium",
455
- "tw-tracking-chrome",
456
- "tw-uppercase",
285
+ // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
286
+ // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
287
+ // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
288
+ // treatment shipped for Tooltip/Badge (PR 7629).
289
+ "tw:text-xs",
290
+ "tw:leading-5",
291
+ "tw:font-medium",
292
+ "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
293
+ "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
457
294
  // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
458
- "tw-rounded",
459
- "tw-border",
460
- "tw-border-transparent",
295
+ "tw:rounded",
296
+ "tw:border",
297
+ "tw:border-transparent",
461
298
  // styling
462
- "tw-shadow-none",
463
- "[a]:tw-cursor-pointer",
299
+ "tw:shadow-none",
300
+ "tw:[a]:cursor-pointer",
464
301
  // explicitly set for anchor
465
- "focus-visible:tw-outline",
466
- "focus-visible:tw-outline-1",
467
- "focus-visible:-tw-outline-offset-1",
468
- "focus-visible:tw-outline-ring",
469
- "focus-visible:tw-ring-4",
470
- "focus-visible:tw-ring-ring/30",
302
+ "tw:focus-visible:outline",
303
+ "tw:focus-visible:outline-1",
304
+ "tw:focus-visible:-outline-offset-1",
305
+ "tw:focus-visible:outline-ring",
306
+ "tw:focus-visible:ring-4",
307
+ "tw:focus-visible:ring-ring/30",
471
308
  // disabled
472
- "disabled:tw-opacity-40",
473
- "disabled:tw-cursor-not-allowed",
309
+ "tw:disabled:opacity-40",
310
+ "tw:disabled:cursor-not-allowed",
474
311
  // anchor support
475
- "!tw-no-underline",
476
- "aria-disabled:tw-opacity-40",
477
- "aria-disabled:tw-cursor-not-allowed",
478
- "[&_svg]:tw-shrink-0"
312
+ "tw:!no-underline",
313
+ "tw:aria-disabled:opacity-40",
314
+ "tw:aria-disabled:cursor-not-allowed",
315
+ "tw:[&_svg]:shrink-0"
479
316
  ],
480
317
  {
481
318
  defaultVariants: {
@@ -485,113 +322,113 @@ var variants = classVarianceAuthority.cva(
485
322
  },
486
323
  variants: {
487
324
  block: {
488
- true: ["tw-w-full"]
325
+ true: ["tw:w-full"]
489
326
  },
490
327
  variant: {
491
328
  primary: [
492
- "tw-text-white",
493
- "tw-bg-primary-500",
494
- "focus:tw-text-white",
495
- "hover:tw-text-white",
496
- "hover:not-disabled:tw-bg-primary-600",
497
- "active:not-disabled:tw-bg-primary-800",
329
+ "tw:text-white",
330
+ "tw:bg-primary-500",
331
+ "tw:focus:text-white",
332
+ "tw:hover:text-white",
333
+ "tw:hover:not-disabled:bg-primary-600",
334
+ "tw:active:not-disabled:bg-primary-800",
498
335
  // anchor disabled override
499
- "aria-disabled:!tw-bg-primary-500"
336
+ "tw:aria-disabled:!bg-primary-500"
500
337
  ],
501
338
  secondary: [
502
- "tw-text-white",
503
- "tw-bg-secondary-500",
504
- "focus:tw-text-white",
505
- "hover:tw-text-white",
506
- "hover:not-disabled:tw-bg-secondary-700",
507
- "active:not-disabled:tw-bg-secondary-800",
339
+ "tw:text-white",
340
+ "tw:bg-secondary-500",
341
+ "tw:focus:text-white",
342
+ "tw:hover:text-white",
343
+ "tw:hover:not-disabled:bg-secondary-700",
344
+ "tw:active:not-disabled:bg-secondary-800",
508
345
  // anchor disabled override
509
- "aria-disabled:!tw-bg-secondary-500"
346
+ "tw:aria-disabled:!bg-secondary-500"
510
347
  ],
511
348
  danger: [
512
- "tw-text-white",
513
- "tw-bg-error-500",
514
- "focus:tw-text-white",
515
- "hover:tw-text-white",
516
- "hover:not-disabled:tw-bg-error-600",
517
- "active:not-disabled:tw-bg-error-700",
349
+ "tw:text-white",
350
+ "tw:bg-error-500",
351
+ "tw:focus:text-white",
352
+ "tw:hover:text-white",
353
+ "tw:hover:not-disabled:bg-error-600",
354
+ "tw:active:not-disabled:bg-error-700",
518
355
  // anchor disabled override
519
- "aria-disabled:!tw-bg-error-500"
356
+ "tw:aria-disabled:!bg-error-500"
520
357
  ],
521
358
  invisible: [
522
- "tw-text-neutral-800",
523
- "tw-bg-transparent",
524
- "focus:tw-text-neutral-800",
525
- "hover:not-disabled:tw-bg-neutral-100",
526
- "hover:tw-text-neutral-800",
527
- "active:not-disabled:tw-bg-neutral-150",
359
+ "tw:text-neutral-800",
360
+ "tw:bg-transparent",
361
+ "tw:focus:text-neutral-800",
362
+ "tw:hover:not-disabled:bg-neutral-100",
363
+ "tw:hover:text-neutral-800",
364
+ "tw:active:not-disabled:bg-neutral-150",
528
365
  // contrasting icon on hover/active
529
- "[&_svg]:tw-text-neutral-400",
530
- "[&_svg]:hover:not-disabled:tw-text-secondary-600",
531
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
366
+ "tw:[&_svg]:text-neutral-400",
367
+ "tw:hover:not-disabled:[&_svg]:text-secondary-600",
368
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
532
369
  // anchor disabled override
533
- "aria-disabled:!tw-bg-transparent"
370
+ "tw:aria-disabled:!bg-transparent"
534
371
  ],
535
372
  outline: [
536
- "tw-text-neutral-800",
537
- "tw-bg-white",
373
+ "tw:text-neutral-800",
374
+ "tw:bg-white",
538
375
  // border
539
- "!tw-border-neutral-200",
540
- "hover:tw-text-neutral-800",
541
- "focus:tw-text-neutral-800",
542
- "hover:not-disabled:!tw-border-neutral-300",
543
- "hover:not-disabled:tw-bg-neutral-100",
544
- "active:not-disabled:tw-bg-neutral-200",
376
+ "tw:!border-neutral-200",
377
+ "tw:hover:text-neutral-800",
378
+ "tw:focus:text-neutral-800",
379
+ "tw:hover:not-disabled:!border-neutral-300",
380
+ "tw:hover:not-disabled:bg-neutral-100",
381
+ "tw:active:not-disabled:bg-neutral-200",
545
382
  // contrasting icon hover, same as invisible
546
- "[&_svg]:tw-text-neutral-400",
547
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
548
- "[&_svg]:active:not-disabled:tw-text-secondary-600",
383
+ "tw:[&_svg]:text-neutral-400",
384
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
385
+ "tw:active:not-disabled:[&_svg]:text-secondary-600",
549
386
  // anchor disabled override
550
- "aria-disabled:!tw-bg-white",
551
- "aria-disabled:!tw-border-neutral-200"
387
+ "tw:aria-disabled:!bg-white",
388
+ "tw:aria-disabled:!border-neutral-200"
552
389
  ],
553
390
  inline: [
554
- "tw-text-neutral-800",
555
- "tw-bg-transparent",
556
- "tw-rounded-full",
557
- "[&_svg]:tw-text-neutral-400",
558
- "[&_svg]:not-disabled:hover:tw-text-secondary-600",
559
- "[&_svg]:not-disabled:focus:tw-text-secondary-600"
391
+ "tw:text-neutral-800",
392
+ "tw:bg-transparent",
393
+ "tw:rounded-full",
394
+ "tw:[&_svg]:text-neutral-400",
395
+ "tw:not-disabled:hover:[&_svg]:text-secondary-600",
396
+ "tw:not-disabled:focus:[&_svg]:text-secondary-600"
560
397
  ]
561
398
  },
562
399
  size: {
563
400
  medium: [
564
- "tw-max-h-10",
565
- "tw-min-h-10",
566
- "tw-px-4",
567
- "tw-py-2.5",
568
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
401
+ "tw:max-h-10",
402
+ "tw:min-h-10",
403
+ "tw:px-4",
404
+ "tw:py-2.5",
405
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
569
406
  ],
570
407
  small: [
571
- "tw-max-h-8",
572
- "tw-min-h-8",
573
- "tw-px-4",
574
- "tw-py-1.5",
575
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
408
+ "tw:max-h-8",
409
+ "tw:min-h-8",
410
+ "tw:px-4",
411
+ "tw:py-1.5",
412
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
576
413
  ],
577
414
  large: [
578
- "tw-max-h-12",
579
- "tw-min-h-12",
580
- "tw-px-4",
581
- "tw-py-3.5",
582
- '[&_svg:not([class*="tw-size-"])]:tw-size-4'
415
+ "tw:max-h-12",
416
+ "tw:min-h-12",
417
+ "tw:px-4",
418
+ "tw:py-3.5",
419
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
583
420
  ],
584
- "icon-lg": ["tw-size-12", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-6'],
585
- icon: ["tw-size-10", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
586
- "icon-sm": ["tw-size-8", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
587
- "icon-xs": ["tw-size-6", "tw-p-0", '[&_svg:not([class*="tw-size-"])]:tw-size-4'],
421
+ "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
422
+ icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
423
+ "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
424
+ "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
588
425
  "icon-2xs": [
589
- "!tw-inline-flex",
590
- "tw-size-5",
591
- "tw-max-h-5",
592
- '[&_svg:not([class*="tw-size-"])]:tw-size-3'
426
+ "tw:!inline-flex",
427
+ "tw:size-5",
428
+ "tw:max-h-5",
429
+ 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
593
430
  ],
594
- "icon-3xs": ["tw-h-fit", "tw-w-fit", '[&_svg:not([class*="tw-size-"])]:tw-size-4']
431
+ "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
595
432
  }
596
433
  }
597
434
  }
@@ -600,37 +437,37 @@ var argoVariants = classVarianceAuthority.cva(
600
437
  [
601
438
  "tailwindcss-preflight",
602
439
  // layout
603
- "tw-relative",
604
- "tw-inline-flex",
605
- "tw-items-center",
606
- "tw-justify-center",
607
- "tw-whitespace-nowrap",
608
- "tw-gap-2",
440
+ "tw:relative",
441
+ "tw:inline-flex",
442
+ "tw:items-center",
443
+ "tw:justify-center",
444
+ "tw:whitespace-nowrap",
445
+ "tw:gap-2",
609
446
  // border
610
- "tw-border",
611
- "tw-border-transparent",
612
- "tw-rounded-[var(--radius-lg,0.25rem)]",
447
+ "tw:border",
448
+ "tw:border-transparent",
449
+ "tw:rounded-[var(--radius-lg,0.25rem)]",
613
450
  // text
614
- "tw-font-medium",
615
- "tw-select-none",
451
+ "tw:font-medium",
452
+ "tw:select-none",
616
453
  // focus visible
617
- "!tw-outline-none",
618
- "focus-visible:tw-ring-2",
454
+ "tw:!outline-hidden",
455
+ "tw:focus-visible:ring-2",
619
456
  // disabled
620
- "disabled:tw-cursor-not-allowed",
621
- "disabled:tw-opacity-50",
622
- "active:tw-opacity-60",
623
- "tw-transition-all",
624
- "tw-bg-clip-padding",
457
+ "tw:disabled:cursor-not-allowed",
458
+ "tw:disabled:opacity-50",
459
+ "tw:active:opacity-60",
460
+ "tw:transition-all",
461
+ "tw:bg-clip-padding",
625
462
  // anchor support
626
- "!tw-no-underline",
627
- "aria-disabled:tw-cursor-not-allowed",
628
- "aria-disabled:tw-opacity-50",
463
+ "tw:!no-underline",
464
+ "tw:aria-disabled:cursor-not-allowed",
465
+ "tw:aria-disabled:opacity-50",
629
466
  // icon
630
- "tw-shrink-0",
631
- "[&_svg]:tw-pointer-events-none",
632
- "[&_svg]:tw-shrink-0",
633
- "[&_svg:not([class*='tw-size-'])]:tw-size-4"
467
+ "tw:shrink-0",
468
+ "tw:[&_svg]:pointer-events-none",
469
+ "tw:[&_svg]:shrink-0",
470
+ "tw:[&_svg:not([class*='tw:size-'])]:size-4"
634
471
  ],
635
472
  {
636
473
  defaultVariants: {
@@ -639,77 +476,77 @@ var argoVariants = classVarianceAuthority.cva(
639
476
  },
640
477
  variants: {
641
478
  block: {
642
- true: ["tw-w-full"]
479
+ true: ["tw:w-full"]
643
480
  },
644
481
  variant: {
645
482
  primary: [
646
- "tw-bg-primary",
647
- "tw-text-primary-foreground",
648
- "[a]:hover:tw-bg-primary/80",
649
- "hover:not-disabled:tw-bg-primary/90",
650
- "hover:tw-text-primary-foreground",
651
- "focus:tw-text-primary-foreground",
652
- "focus-visible:tw-border-primary",
653
- "focus-visible:tw-ring-ring/50"
483
+ "tw:bg-primary",
484
+ "tw:text-primary-foreground",
485
+ "tw:[a]:hover:bg-primary/80",
486
+ "tw:hover:not-disabled:bg-primary/90",
487
+ "tw:hover:text-primary-foreground",
488
+ "tw:focus:text-primary-foreground",
489
+ "tw:focus-visible:border-primary",
490
+ "tw:focus-visible:ring-ring/50"
654
491
  ],
655
492
  secondary: [
656
- "tw-bg-primary/10",
657
- "tw-text-primary",
658
- "hover:not-disabled:tw-bg-primary/20",
659
- "focus-visible:tw-border-primary",
660
- "focus-visible:tw-ring-ring/50"
493
+ "tw:bg-primary/10",
494
+ "tw:text-primary",
495
+ "tw:hover:not-disabled:bg-primary/20",
496
+ "tw:focus-visible:border-primary",
497
+ "tw:focus-visible:ring-ring/50"
661
498
  ],
662
499
  // should be called "destructive" by Figma
663
500
  danger: [
664
- "tw-bg-destructive",
665
- "tw-text-destructive-foreground",
666
- "hover:tw-text-destructive-foreground",
667
- "focus:tw-text-destructive-foreground",
668
- "focus-visible:tw-border-destructive",
669
- "focus-visible:tw-ring-destructive/20"
501
+ "tw:bg-destructive",
502
+ "tw:text-destructive-foreground",
503
+ "tw:hover:text-destructive-foreground",
504
+ "tw:focus:text-destructive-foreground",
505
+ "tw:focus-visible:border-destructive",
506
+ "tw:focus-visible:ring-destructive/20"
670
507
  ],
671
508
  outline: [
672
- "!tw-border-input",
673
- "tw-bg-background",
509
+ "tw:!border-input",
510
+ "tw:bg-background",
674
511
  // Semantic base text color so the label/icon flips in dark mode
675
512
  // (matches `invisible`); previously unset → inherited a fixed dark color.
676
- "tw-text-foreground",
513
+ "tw:text-foreground",
677
514
  // Hover follows the brand primary (translucent tint), matching the
678
515
  // `secondary` variant — not the fixed `accent` blue.
679
- "hover:not-disabled:tw-bg-primary/10",
680
- "hover:not-disabled:tw-text-primary",
681
- "hover:active:tw-bg-background",
682
- "focus-visible:!tw-border-primary",
683
- "focus-visible:tw-ring-ring/50"
516
+ "tw:hover:not-disabled:bg-primary/10",
517
+ "tw:hover:not-disabled:text-primary",
518
+ "tw:hover:active:bg-background",
519
+ "tw:focus-visible:!border-primary",
520
+ "tw:focus-visible:ring-ring/50"
684
521
  ],
685
522
  // should be called "ghost" by Figma
686
523
  invisible: [
687
- "tw-bg-transparent",
688
- "tw-text-foreground",
689
- "hover:not-disabled:tw-bg-primary/10",
690
- "hover:not-disabled:tw-text-primary",
691
- "hover:not-disabled:tw-border-primary/10",
692
- "focus-visible:tw-ring-ring/50"
524
+ "tw:bg-transparent",
525
+ "tw:text-foreground",
526
+ "tw:hover:not-disabled:bg-primary/10",
527
+ "tw:hover:not-disabled:text-primary",
528
+ "tw:hover:not-disabled:border-primary/10",
529
+ "tw:focus-visible:ring-ring/50"
693
530
  ],
694
531
  // should be called "link" by Figma
695
532
  inline: [
696
- "tw-bg-transparent",
697
- "tw-text-primary",
698
- "hover:tw-underline",
699
- "hover:active:tw-bg-transparent",
700
- "focus-visible:tw-ring-ring/50"
533
+ "tw:bg-transparent",
534
+ "tw:text-primary",
535
+ "tw:hover:underline",
536
+ "tw:hover:active:bg-transparent",
537
+ "tw:focus-visible:ring-ring/50"
701
538
  ]
702
539
  },
703
540
  size: {
704
541
  // should be called "default" by Figma
705
- medium: ["tw-max-h-9", "tw-py-2", "tw-px-4", "tw-text-sm"],
542
+ medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
706
543
  // should be called "small" by Figma
707
- small: ["tw-max-h-8", "tw-py-2", "tw-px-3", "tw-text-xs"],
544
+ small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
708
545
  // should be called "large" by Figma
709
- large: ["tw-max-h-10", "tw-py-2.5", "tw-px-6", "tw-text-sm"],
710
- "icon-lg": ["tw-size-10"],
711
- icon: ["tw-size-9"],
712
- "icon-sm": ["tw-size-8"],
546
+ large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
547
+ "icon-lg": ["tw:size-10"],
548
+ icon: ["tw:size-9"],
549
+ "icon-sm": ["tw:size-8"],
713
550
  // unsupported in ARGO, remove when old design is gone
714
551
  "icon-xs": [],
715
552
  "icon-2xs": [],
@@ -757,13 +594,13 @@ var Button = ({
757
594
  onClick: handleClick,
758
595
  className: cn(classNames),
759
596
  children: [
760
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Loader2, { className: "tw-size-4 tw-shrink-0 tw-animate-spin" }),
597
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
761
598
  /* @__PURE__ */ jsxRuntime.jsx(reactSlot.Slottable, { children: isLoading && isIconOnly ? null : children })
762
599
  ]
763
600
  }
764
601
  );
765
602
  };
766
- var Clipboard = ({
603
+ var Clipboard2 = ({
767
604
  ref,
768
605
  text: textProp,
769
606
  children,
@@ -788,6 +625,7 @@ var Clipboard = ({
788
625
  }
789
626
  };
790
627
  const handleOnClick = (event) => {
628
+ setIsTooltipOpen(true);
791
629
  if (text && state === "ready") void copy(text);
792
630
  onClick?.(event);
793
631
  };
@@ -802,6 +640,7 @@ var Clipboard = ({
802
640
  return tooltip;
803
641
  })();
804
642
  const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
643
+ const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
805
644
  return /* @__PURE__ */ jsxRuntime.jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
806
645
  /* @__PURE__ */ jsxRuntime.jsx(
807
646
  Tooltip.Trigger,
@@ -810,12 +649,12 @@ var Clipboard = ({
810
649
  asChild,
811
650
  keepOpenOnClick: true,
812
651
  onClick: handleOnClick,
813
- className: cn("tw-cursor-pointer", className),
652
+ className: cn("tw:cursor-pointer", className),
814
653
  ref,
815
654
  children: children ?? text
816
655
  }
817
656
  ),
818
- /* @__PURE__ */ jsxRuntime.jsx(
657
+ hasTooltipContent && /* @__PURE__ */ jsxRuntime.jsx(
819
658
  Tooltip.Content,
820
659
  {
821
660
  keepOpenOnPointerDownOutside: true,
@@ -826,7 +665,7 @@ var Clipboard = ({
826
665
  )
827
666
  ] });
828
667
  };
829
- var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Copy, {});
668
+ var DEFAULT_ICON = /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, {});
830
669
  var DEFAULT_ARIA_LABEL = "Copy";
831
670
  var ClipboardButton = ({
832
671
  // clipboard props
@@ -843,7 +682,7 @@ var ClipboardButton = ({
843
682
  const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
844
683
  const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
845
684
  return /* @__PURE__ */ jsxRuntime.jsx(
846
- Clipboard,
685
+ Clipboard2,
847
686
  {
848
687
  asChild: true,
849
688
  tooltip,
@@ -860,10 +699,19 @@ var ClipboardButton = ({
860
699
  var MIN_SCALE = 0.5;
861
700
  var MAX_SCALE = 3;
862
701
  var ZOOM_STEP = 0.1;
863
- var ZoomableSvg = ({ html, copyText, className }) => {
702
+ var ZoomableSvg = ({
703
+ html,
704
+ copyText,
705
+ className,
706
+ allowForeignObject,
707
+ renderActions
708
+ }) => {
864
709
  const safeHtml = react.useMemo(
865
- () => DOMPurify__default.default.sanitize(html, { USE_PROFILES: { svg: true, svgFilters: true } }),
866
- [html]
710
+ () => DOMPurify__default.default.sanitize(html, {
711
+ USE_PROFILES: { svg: true, svgFilters: true },
712
+ ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
713
+ }),
714
+ [html, allowForeignObject]
867
715
  );
868
716
  const containerRef = react.useRef(null);
869
717
  const [scale, setScale] = react.useState(1);
@@ -892,7 +740,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
892
740
  };
893
741
  el.addEventListener("wheel", onWheel, { passive: false });
894
742
  return () => el.removeEventListener("wheel", onWheel);
895
- }, []);
743
+ }, [isFullscreen]);
896
744
  const didDragRef = react.useRef(false);
897
745
  const handleMouseDown = react.useCallback(
898
746
  (e) => {
@@ -936,7 +784,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
936
784
  "div",
937
785
  {
938
786
  role: "presentation",
939
- className: cn("tw-group/zoom tw-relative", isFullscreen && "tw-h-full"),
787
+ className: cn("tw:group/zoom tw:relative", isFullscreen && "tw:h-full"),
940
788
  onClick: handleClick,
941
789
  children: [
942
790
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -945,8 +793,8 @@ var ZoomableSvg = ({ html, copyText, className }) => {
945
793
  role: "presentation",
946
794
  ref: containerRef,
947
795
  className: cn(
948
- "tw-overflow-hidden tw-cursor-grab active:tw-cursor-grabbing tw-p-3",
949
- isFullscreen && "tw-h-full"
796
+ "tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3",
797
+ isFullscreen && "tw:h-full"
950
798
  ),
951
799
  onMouseDown: handleMouseDown,
952
800
  onMouseMove: handleMouseMove,
@@ -956,8 +804,8 @@ var ZoomableSvg = ({ html, copyText, className }) => {
956
804
  "div",
957
805
  {
958
806
  className: cn(
959
- "tw-flex tw-justify-center tw-origin-center",
960
- isFullscreen && "tw-h-full [&>svg]:tw-h-full"
807
+ "tw:flex tw:justify-center tw:origin-center",
808
+ isFullscreen && "tw:h-full tw:[&>svg]:h-full"
961
809
  ),
962
810
  style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
963
811
  dangerouslySetInnerHTML: { __html: safeHtml }
@@ -969,11 +817,12 @@ var ZoomableSvg = ({ html, copyText, className }) => {
969
817
  "div",
970
818
  {
971
819
  role: "presentation",
972
- 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",
820
+ 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",
973
821
  onClick: stopPropagation,
974
822
  children: [
975
823
  isZoomed && /* @__PURE__ */ jsxRuntime.jsx(Tooltip, { tooltip: "Reset zoom", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "small", variant: "outline", onClick: handleReset, children: "Reset" }) }),
976
824
  copyText && /* @__PURE__ */ jsxRuntime.jsx(ClipboardButton, { text: copyText, tooltip: "Copy code", size: "icon-sm", variant: "outline" }),
825
+ renderActions?.(safeHtml),
977
826
  /* @__PURE__ */ jsxRuntime.jsx(
978
827
  Tooltip,
979
828
  {
@@ -987,7 +836,7 @@ var ZoomableSvg = ({ html, copyText, className }) => {
987
836
  variant: "outline",
988
837
  "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
989
838
  onClick: () => setIsFullscreen((f) => !f),
990
- children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Minimize2, { className: "tw-size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(icons_exports.Maximize2, { className: "tw-size-4" })
839
+ children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { className: "tw:size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "tw:size-4" })
991
840
  }
992
841
  )
993
842
  }
@@ -999,36 +848,112 @@ var ZoomableSvg = ({ html, copyText, className }) => {
999
848
  }
1000
849
  );
1001
850
  if (isFullscreen) {
1002
- return /* @__PURE__ */ jsxRuntime.jsx(
1003
- "div",
1004
- {
1005
- role: "presentation",
1006
- className: "tw-fixed tw-inset-0 tw-z-[1060] tw-bg-muted tw-p-4",
1007
- onClick: stopPropagation,
1008
- children: diagramContent
1009
- }
851
+ return reactDom.createPortal(
852
+ /* @__PURE__ */ jsxRuntime.jsx(
853
+ "div",
854
+ {
855
+ role: "presentation",
856
+ "data-testid": "zoomable-svg-fullscreen",
857
+ className: "tw:fixed tw:inset-0 tw:z-[1060] tw:bg-muted tw:p-4 tailwindcss-preflight",
858
+ onClick: stopPropagation,
859
+ children: diagramContent
860
+ }
861
+ ),
862
+ document.body
1010
863
  );
1011
864
  }
1012
865
  return /* @__PURE__ */ jsxRuntime.jsx(
1013
866
  "div",
1014
867
  {
1015
868
  className: cn(
1016
- "tw-overflow-hidden tw-rounded-md tw-border tw-border-border tw-bg-muted",
869
+ "tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted",
1017
870
  className
1018
871
  ),
1019
872
  children: diagramContent
1020
873
  }
1021
874
  );
1022
875
  };
876
+ var HEIGHT_CLASS_NAME = {
877
+ xxs: "tw:h-3 tw:rounded",
878
+ xs: "tw:h-4 tw:rounded",
879
+ sm: "tw:h-5 tw:rounded",
880
+ md: "tw:h-6 tw:rounded-md",
881
+ lg: "tw:h-8 tw:rounded-lg",
882
+ xl: "tw:h-10 tw:rounded-lg",
883
+ "2xl": "tw:h-12 tw:rounded-lg"
884
+ };
885
+ var ANIMATION_CLASS_NAME = cn(
886
+ // base styles
887
+ "tw:relative",
888
+ "tw:overflow-hidden",
889
+ "tw:pointer-events-none",
890
+ "tw:bg-skeleton",
891
+ // before
892
+ 'tw:before:content-[""]',
893
+ "tw:before:opacity-100",
894
+ "tw:before:absolute",
895
+ "tw:before:inset-0",
896
+ "tw:before:-translate-x-full",
897
+ "tw:before:animate-[shimmer_2s_infinite]",
898
+ "tw:before:bg-gradient-to-r",
899
+ "tw:before:from-transparent",
900
+ "tw:before:to-transparent",
901
+ "tw:before:via-white/40"
902
+ );
903
+ var Skeleton = ({ height = "md", className, count = 1 }) => {
904
+ const prefixId = react.useId();
905
+ const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
906
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: keys.map((key) => /* @__PURE__ */ jsxRuntime.jsx(
907
+ "div",
908
+ {
909
+ "data-skeleton": "true",
910
+ className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
911
+ },
912
+ key
913
+ )) });
914
+ };
915
+ var DiagramSkeleton = () => /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(Skeleton, { className: "tw:h-40" }) });
916
+
917
+ // src/blocks/MermaidDiagram/svgTransforms.ts
918
+ var HTML_TAG = /<[^>]+>/g;
919
+ var FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
920
+ var ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
921
+ var flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
922
+ const text = inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim();
923
+ return `${open}${text}${close}`;
924
+ });
925
+ var STYLE_ATTR = /\s+style="([^"]*)"/i;
926
+ var makeResponsive = (svgString) => {
927
+ const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
928
+ const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
929
+ return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
930
+ const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? "";
931
+ const styleDecls = existingStyle.replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
932
+ let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
933
+ nextAttrs += ' width="100%"';
934
+ const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
935
+ if (styleParts) nextAttrs += ` style="${styleParts}"`;
936
+ return `${open}${nextAttrs}${close}`;
937
+ });
938
+ };
1023
939
  var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
1024
940
  var resolvePrimary = () => {
1025
- const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim() || PRIMARY_FALLBACK_CHANNELS;
941
+ const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--primary").trim() || PRIMARY_FALLBACK_CHANNELS;
1026
942
  return `rgb(${channels})`;
1027
943
  };
1028
944
  var mermaidPromise = null;
945
+ var registerLucideIconPack = (m) => {
946
+ m.registerIconPacks([
947
+ {
948
+ name: "lucide",
949
+ loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default)
950
+ }
951
+ ]);
952
+ };
1029
953
  var getMermaid = () => {
1030
954
  if (!mermaidPromise) {
1031
955
  mermaidPromise = import('mermaid').then((m) => {
956
+ registerLucideIconPack(m.default);
1032
957
  m.default.initialize({
1033
958
  startOnLoad: false,
1034
959
  securityLevel: "strict",
@@ -1092,7 +1017,9 @@ var getMermaid = () => {
1092
1017
  return mermaidPromise;
1093
1018
  };
1094
1019
  var stripFontImports = (svg) => svg.replace(/@import\s+url\([^)]*fonts\.googleapis\.com[^)]*\);?\s*/g, "");
1020
+ var hasIconSyntax = (code) => /@\{[^}]*\bicon\s*:/.test(code) || /\b(?:icon|service|group)\b[^\n(]*\(\s*[\w-]+:/.test(code) || /\bfa[bslr]?:fa-/.test(code);
1095
1021
  var tryFastRender = (code) => {
1022
+ if (hasIconSyntax(code)) return null;
1096
1023
  try {
1097
1024
  return stripFontImports(
1098
1025
  beautifulMermaid.renderMermaidSVG(code, {
@@ -1102,27 +1029,11 @@ var tryFastRender = (code) => {
1102
1029
  font: "Inter, system-ui, sans-serif"
1103
1030
  })
1104
1031
  );
1105
- } catch {
1032
+ } catch (err) {
1033
+ console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1106
1034
  return null;
1107
1035
  }
1108
1036
  };
1109
- var makeResponsive = (svgString) => {
1110
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1111
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1112
- let result = svgString.replace(/(<svg[^>]*?)\s+width="[^"]*"/i, '$1 width="100%"').replace(/(<svg[^>]*?)\s+height="[^"]*"/i, "$1");
1113
- if (!vbWidth) return result;
1114
- const hasStyle = /(<svg[^>]*?)\s+style="([^"]*)"/i.test(result);
1115
- if (hasStyle) {
1116
- result = result.replace(/(<svg[^>]*?)\s+style="([^"]*)"/i, (_m, pre, styles) => {
1117
- const cleaned = styles.replace(/max-width:\s*[^;"]*;?\s*/g, "").trim();
1118
- const combined = [cleaned, `max-width: ${vbWidth}px`].filter(Boolean).join("; ");
1119
- return `${pre} style="${combined}"`;
1120
- });
1121
- } else {
1122
- result = result.replace(/<svg/, `<svg style="max-width: ${vbWidth}px"`);
1123
- }
1124
- return result;
1125
- };
1126
1037
  var RENDER_DEBOUNCE_MS = 300;
1127
1038
  var svgCache = /* @__PURE__ */ new Map();
1128
1039
  var resolveSyncSvg = (code) => {
@@ -1132,7 +1043,7 @@ var resolveSyncSvg = (code) => {
1132
1043
  if (fast) svgCache.set(code, fast);
1133
1044
  return fast;
1134
1045
  };
1135
- var MermaidDiagram = ({ code }) => {
1046
+ var MermaidDiagram = ({ code, renderActions }) => {
1136
1047
  const id = react.useId();
1137
1048
  const [svg, setSvg] = react.useState(() => resolveSyncSvg(code));
1138
1049
  const [renderFailed, setRenderFailed] = react.useState(false);
@@ -1163,8 +1074,9 @@ var MermaidDiagram = ({ code }) => {
1163
1074
  try {
1164
1075
  const result = await mermaidModule.default.render(rendererId, code, container);
1165
1076
  if (renderIdRef.current === currentRenderId && result) {
1166
- svgCache.set(code, result.svg);
1167
- setSvg(result.svg);
1077
+ const svgOutput = flattenForeignObjectLabels(result.svg);
1078
+ svgCache.set(code, svgOutput);
1079
+ setSvg(svgOutput);
1168
1080
  setRenderFailed(false);
1169
1081
  }
1170
1082
  } finally {
@@ -1193,11 +1105,11 @@ var MermaidDiagram = ({ code }) => {
1193
1105
  "pre",
1194
1106
  {
1195
1107
  className: cn(
1196
- "tw-my-3 tw-overflow-auto tw-whitespace-pre-wrap tw-break-all",
1197
- "tw-py-3 tw-px-4",
1198
- "tw-bg-neutral-50",
1199
- "tw-rounded-md tw-text-neutral-400",
1200
- "tw-text-sm tw-font-mono"
1108
+ "tw:my-3 tw:overflow-auto tw:whitespace-pre-wrap tw:break-all",
1109
+ "tw:py-3 tw:px-4",
1110
+ "tw:bg-neutral-50",
1111
+ "tw:rounded-md tw:text-neutral-400",
1112
+ "tw:text-sm tw:font-mono"
1201
1113
  ),
1202
1114
  children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: code })
1203
1115
  }
@@ -1211,12 +1123,14 @@ var MermaidDiagram = ({ code }) => {
1211
1123
  copyText: `\`\`\`mermaid
1212
1124
  ${code}
1213
1125
  \`\`\``,
1214
- className: "tw-my-3"
1126
+ className: "tw:my-3",
1127
+ allowForeignObject: true,
1128
+ renderActions
1215
1129
  },
1216
1130
  code
1217
1131
  );
1218
1132
  }
1219
- return /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(Skeleton, { className: "tw-h-40" }) });
1133
+ return /* @__PURE__ */ jsxRuntime.jsx(DiagramSkeleton, {});
1220
1134
  };
1221
1135
 
1222
1136
  exports.MermaidDiagram = MermaidDiagram;