@keboola/design 9.0.0 → 10.1.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 (84) hide show
  1. package/AGENTS.md +117 -40
  2. package/COMPONENT-API.md +31 -9
  3. package/README.md +3 -3
  4. package/dist/MermaidDiagram-EOKJHQQV.js +10 -0
  5. package/dist/MermaidDiagram-EOKJHQQV.js.map +1 -0
  6. package/dist/charts.d.ts +31 -2
  7. package/dist/charts.js +6 -9
  8. package/dist/charts.js.map +1 -1
  9. package/dist/chunk-63NSN2VL.js +274 -0
  10. package/dist/chunk-63NSN2VL.js.map +1 -0
  11. package/dist/{rjsf.cjs → chunk-6FPEI4EM.js} +1560 -5712
  12. package/dist/chunk-6FPEI4EM.js.map +1 -0
  13. package/dist/chunk-7PUUHEJQ.js +1313 -0
  14. package/dist/chunk-7PUUHEJQ.js.map +1 -0
  15. package/dist/chunk-BOHNXTMM.js +606 -0
  16. package/dist/chunk-BOHNXTMM.js.map +1 -0
  17. package/dist/{testing.cjs → chunk-C3L3TBBT.js} +33 -164
  18. package/dist/chunk-C3L3TBBT.js.map +1 -0
  19. package/dist/chunk-CTCFYWJC.js +407 -0
  20. package/dist/chunk-CTCFYWJC.js.map +1 -0
  21. package/dist/chunk-ESBL3IPF.js +23 -0
  22. package/dist/chunk-ESBL3IPF.js.map +1 -0
  23. package/dist/chunk-IJTHFNNJ.js +261 -0
  24. package/dist/chunk-IJTHFNNJ.js.map +1 -0
  25. package/dist/chunk-JP7PNHLH.js +40 -0
  26. package/dist/chunk-JP7PNHLH.js.map +1 -0
  27. package/dist/chunk-KPNAW5MU.js +229 -0
  28. package/dist/chunk-KPNAW5MU.js.map +1 -0
  29. package/dist/chunk-L37JJ6MR.js +152 -0
  30. package/dist/chunk-L37JJ6MR.js.map +1 -0
  31. package/dist/chunk-Q7NWXLCT.js +90 -0
  32. package/dist/chunk-Q7NWXLCT.js.map +1 -0
  33. package/dist/chunk-SYIEF644.js +1016 -0
  34. package/dist/chunk-SYIEF644.js.map +1 -0
  35. package/dist/chunk-VMFSRV5H.js +16 -0
  36. package/dist/chunk-VMFSRV5H.js.map +1 -0
  37. package/dist/chunk-VPPM7UUQ.js +47 -0
  38. package/dist/chunk-VPPM7UUQ.js.map +1 -0
  39. package/dist/chunk-XV3UUOYF.js +845 -0
  40. package/dist/chunk-XV3UUOYF.js.map +1 -0
  41. package/dist/editors.d.ts +53 -5
  42. package/dist/editors.js +85 -2097
  43. package/dist/editors.js.map +1 -1
  44. package/dist/icons.d.ts +29 -8
  45. package/dist/icons.js +2 -361
  46. package/dist/icons.js.map +1 -1
  47. package/dist/index.d.ts +735 -426
  48. package/dist/index.js +5029 -13796
  49. package/dist/index.js.map +1 -1
  50. package/dist/markdown-editor.js +41 -3426
  51. package/dist/markdown-editor.js.map +1 -1
  52. package/dist/mermaid.js +8 -1129
  53. package/dist/mermaid.js.map +1 -1
  54. package/dist/rjsf.js +97 -9240
  55. package/dist/rjsf.js.map +1 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/testing.js +5 -357
  58. package/dist/testing.js.map +1 -1
  59. package/package.json +29 -74
  60. package/src/styles.css +60 -3
  61. package/src/theme.css +1 -0
  62. package/dist/charts.cjs +0 -268
  63. package/dist/charts.cjs.map +0 -1
  64. package/dist/charts.d.cts +0 -181
  65. package/dist/constants-D3gaMY-W.d.cts +0 -39
  66. package/dist/editors.cjs +0 -2456
  67. package/dist/editors.cjs.map +0 -1
  68. package/dist/editors.d.cts +0 -141
  69. package/dist/icons.cjs +0 -23888
  70. package/dist/icons.cjs.map +0 -1
  71. package/dist/icons.d.cts +0 -20
  72. package/dist/index.cjs +0 -24817
  73. package/dist/index.cjs.map +0 -1
  74. package/dist/index.d.cts +0 -10413
  75. package/dist/markdown-editor.cjs +0 -4636
  76. package/dist/markdown-editor.cjs.map +0 -1
  77. package/dist/markdown-editor.d.cts +0 -75
  78. package/dist/mermaid.cjs +0 -1138
  79. package/dist/mermaid.cjs.map +0 -1
  80. package/dist/mermaid.d.cts +0 -15
  81. package/dist/rjsf.cjs.map +0 -1
  82. package/dist/rjsf.d.cts +0 -55
  83. package/dist/testing.cjs.map +0 -1
  84. package/dist/testing.d.cts +0 -25
package/dist/mermaid.js CHANGED
@@ -1,1131 +1,10 @@
1
- import { createContext, useId, useState, useRef, useEffect, useMemo, useCallback, use } from 'react';
2
- import { renderMermaidSVG } from 'beautiful-mermaid';
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';
8
- import { clsx } from 'clsx';
9
- import { extendTailwindMerge } from 'tailwind-merge';
10
- import { Root as Root$1, Trigger, Portal, Content } from '@radix-ui/react-tooltip';
11
- import { cva } from 'class-variance-authority';
12
- import { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
13
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
14
-
15
- // src/blocks/MermaidDiagram/MermaidDiagram.tsx
16
- var twMerge = extendTailwindMerge({
17
- prefix: "tw"
18
- });
19
- var cn = (...classes) => twMerge(clsx(...classes));
20
-
21
- // src/utils/copyToClipboard.ts
22
- var copyToClipboard = (text) => {
23
- return navigator.clipboard.writeText(text);
24
- };
25
-
26
- // src/constants/keyCodes.ts
27
- var keyCodes = {
28
- ENTER: "Enter",
29
- SPACE: " "
30
- };
31
-
32
- // src/components/ThemeProvider/utils.ts
33
- var createTheme = (brand) => ({
34
- id: brand.id,
35
- name: brand.name,
36
- shell: brand.shell,
37
- logo: brand.logo
38
- });
39
-
40
- // src/components/ThemeProvider/defaults.ts
41
- [keboolaLegacySidebar.id, keboolaLegacyTopnav.id];
42
- var DEFAULT_COLOR_SCHEME = "light";
43
- var DEFAULT_BRAND_ID = "design-system";
44
- var defaultBrand = {
45
- id: DEFAULT_BRAND_ID,
46
- name: "Design System",
47
- shell: "sidebar"};
48
- var defaultTheme = createTheme(defaultBrand);
49
-
50
- // src/components/ThemeProvider/context.tsx
51
- var noop = () => void 0;
52
- var defaultContext = {
53
- scheme: DEFAULT_COLOR_SCHEME,
54
- resolvedScheme: DEFAULT_COLOR_SCHEME,
55
- setScheme: noop,
56
- brandId: defaultTheme.id,
57
- setBrand: noop,
58
- themes: [defaultTheme],
59
- currentTheme: defaultTheme
60
- };
61
- createContext(defaultContext);
62
- var ArgoDesignContext = createContext(true);
63
- var useArgoDesign = () => use(ArgoDesignContext);
64
- var tooltipVariants = cva(
65
- [
66
- "tailwindcss-preflight",
67
- "tw:inline-block",
68
- "tw:break-anywhere",
69
- "tw:max-h-96",
70
- "tw:overflow-y-auto",
71
- "tw:z-[1060]",
72
- // legacy (dark) chrome — default
73
- "tw:rounded",
74
- "tw:bg-neutral-800",
75
- "tw:text-white",
76
- // argo chrome overrides — semantic floating-panel tokens
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",
84
- // argo open animation
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",
91
- // argo closed animation
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",
95
- // argo position animation
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"
100
- ],
101
- {
102
- defaultVariants: {
103
- variant: "action"
104
- },
105
- variants: {
106
- variant: {
107
- action: [
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"
120
- ],
121
- explanatory: [
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"
128
- ]
129
- }
130
- }
131
- }
132
- );
133
- var TooltipContent = ({
134
- className,
135
- variant,
136
- keepOpenOnPointerDownOutside = false,
137
- children,
138
- onPointerDownOutside,
139
- sideOffset = 8,
140
- collisionPadding = 8,
141
- hideWhenDetached = true,
142
- placement = "right",
143
- ...rest
144
- }) => {
145
- const renderArgo = useArgoDesign();
146
- const handlePointerDownOutside = (event) => {
147
- if (keepOpenOnPointerDownOutside) event.preventDefault();
148
- onPointerDownOutside?.(event);
149
- };
150
- return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
151
- Content,
152
- {
153
- ...rest,
154
- "data-tooltip-content": renderArgo ? void 0 : true,
155
- "data-argo": renderArgo,
156
- sideOffset,
157
- collisionPadding,
158
- onPointerDownOutside: handlePointerDownOutside,
159
- className: tooltipVariants({ className, variant }),
160
- hideWhenDetached,
161
- side: placement,
162
- children
163
- }
164
- ) });
165
- };
166
- var DELAY_SHOW_TOOLTIP = 300;
167
- var TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsx(Root$1, { ...rest, delayDuration, children });
168
- var TooltipTrigger = ({
169
- ref,
170
- children,
171
- className,
172
- keepOpenOnClick = false,
173
- onClick,
174
- onPointerDown,
175
- asChild,
176
- ...rest
177
- }) => {
178
- const handleClick = (event) => {
179
- if (keepOpenOnClick) event.preventDefault();
180
- onClick?.(event);
181
- };
182
- const handlePointerDown = (event) => {
183
- if (keepOpenOnClick) event.preventDefault();
184
- onPointerDown?.(event);
185
- };
186
- return /* @__PURE__ */ jsx(
187
- Trigger,
188
- {
189
- ...rest,
190
- asChild: true,
191
- ref,
192
- className: cn("tailwindcss-preflight", className),
193
- onClick: handleClick,
194
- onPointerDown: handlePointerDown,
195
- children: asChild ? children : (
196
- // Default-mode trigger wraps children in a span so Radix has a
197
- // single DOM element to attach handlers to. `tailwindcss-preflight`
198
- // (merged in via Slot) activates Tailwind's preflight inside the
199
- // span, which sets `svg { display: block }` — without an inline-flex
200
- // container that would stack any bare Lucide icon onto its own
201
- // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
202
- /* @__PURE__ */ jsx("span", { className: "tw:inline-flex tw:items-center", children })
203
- )
204
- }
205
- );
206
- };
207
- var ACTION_TOOLTIP_LIMIT = 30;
208
- var Tooltip = ({
209
- tooltip,
210
- children,
211
- className,
212
- keepOpenOnTriggerClick = false,
213
- variant,
214
- placement = "right",
215
- forceHide = false,
216
- forceShow = false,
217
- delayDuration,
218
- // trigger props
219
- triggerAsChild = false
220
- }) => {
221
- const [open, setOpen] = useState(false);
222
- const resolvedVariant = (() => {
223
- if (!!variant) return variant;
224
- if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
225
- return "action";
226
- })();
227
- const isActionVariant = resolvedVariant === "action";
228
- const handleKeyUp = (event) => {
229
- if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
230
- event.stopPropagation();
231
- };
232
- return /* @__PURE__ */ jsxs(
233
- TooltipRoot,
234
- {
235
- open: !!tooltip && (open || forceShow) && !forceHide,
236
- onOpenChange: setOpen,
237
- delayDuration,
238
- disableHoverableContent: isActionVariant,
239
- children: [
240
- /* @__PURE__ */ jsx(
241
- TooltipTrigger,
242
- {
243
- asChild: triggerAsChild,
244
- keepOpenOnClick: keepOpenOnTriggerClick,
245
- onKeyUp: handleKeyUp,
246
- children
247
- }
248
- ),
249
- /* @__PURE__ */ jsx(
250
- TooltipContent,
251
- {
252
- className,
253
- variant: resolvedVariant,
254
- placement,
255
- keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
256
- children: tooltip
257
- }
258
- )
259
- ]
260
- }
261
- );
262
- };
263
- Tooltip.Root = TooltipRoot;
264
- Tooltip.Content = TooltipContent;
265
- Tooltip.Trigger = TooltipTrigger;
266
- var variants = cva(
267
- [
268
- "tailwindcss-preflight",
269
- "tw:group/button",
270
- "tw:border-box",
271
- // layout
272
- "tw:relative",
273
- "tw:flex",
274
- "tw:items-center",
275
- "tw:justify-center",
276
- "tw:gap-2",
277
- // text — chrome weight/tracking are brand-overridable tokens
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",
287
- // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
288
- "tw:rounded",
289
- "tw:border",
290
- "tw:border-transparent",
291
- // styling
292
- "tw:shadow-none",
293
- "tw:[a]:cursor-pointer",
294
- // explicitly set for anchor
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",
301
- // disabled
302
- "tw:disabled:opacity-40",
303
- "tw:disabled:cursor-not-allowed",
304
- // anchor support
305
- "tw:!no-underline",
306
- "tw:aria-disabled:opacity-40",
307
- "tw:aria-disabled:cursor-not-allowed",
308
- "tw:[&_svg]:shrink-0"
309
- ],
310
- {
311
- defaultVariants: {
312
- size: "medium",
313
- variant: "primary",
314
- block: false
315
- },
316
- variants: {
317
- block: {
318
- true: ["tw:w-full"]
319
- },
320
- variant: {
321
- primary: [
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",
328
- // anchor disabled override
329
- "tw:aria-disabled:!bg-primary-500"
330
- ],
331
- secondary: [
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",
338
- // anchor disabled override
339
- "tw:aria-disabled:!bg-secondary-500"
340
- ],
341
- danger: [
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",
348
- // anchor disabled override
349
- "tw:aria-disabled:!bg-error-500"
350
- ],
351
- invisible: [
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",
358
- // contrasting icon on hover/active
359
- "tw:[&_svg]:text-neutral-400",
360
- "tw:hover:not-disabled:[&_svg]:text-secondary-600",
361
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
362
- // anchor disabled override
363
- "tw:aria-disabled:!bg-transparent"
364
- ],
365
- outline: [
366
- "tw:text-neutral-800",
367
- "tw:bg-white",
368
- // border
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",
375
- // contrasting icon hover, same as invisible
376
- "tw:[&_svg]:text-neutral-400",
377
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
378
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
379
- // anchor disabled override
380
- "tw:aria-disabled:!bg-white",
381
- "tw:aria-disabled:!border-neutral-200"
382
- ],
383
- inline: [
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"
390
- ]
391
- },
392
- size: {
393
- medium: [
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'
399
- ],
400
- small: [
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'
406
- ],
407
- large: [
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'
413
- ],
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'],
418
- "icon-2xs": [
419
- "tw:!inline-flex",
420
- "tw:size-5",
421
- "tw:max-h-5",
422
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
423
- ],
424
- "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
425
- }
426
- }
427
- }
428
- );
429
- var argoVariants = cva(
430
- [
431
- "tailwindcss-preflight",
432
- // layout
433
- "tw:relative",
434
- "tw:inline-flex",
435
- "tw:items-center",
436
- "tw:justify-center",
437
- "tw:whitespace-nowrap",
438
- "tw:gap-2",
439
- // border
440
- "tw:border",
441
- "tw:border-transparent",
442
- "tw:rounded-[var(--radius-lg,0.25rem)]",
443
- // text
444
- "tw:font-medium",
445
- "tw:select-none",
446
- // focus visible
447
- "tw:!outline-hidden",
448
- "tw:focus-visible:ring-2",
449
- // disabled
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",
455
- // anchor support
456
- "tw:!no-underline",
457
- "tw:aria-disabled:cursor-not-allowed",
458
- "tw:aria-disabled:opacity-50",
459
- // icon
460
- "tw:shrink-0",
461
- "tw:[&_svg]:pointer-events-none",
462
- "tw:[&_svg]:shrink-0",
463
- "tw:[&_svg:not([class*='tw:size-'])]:size-4"
464
- ],
465
- {
466
- defaultVariants: {
467
- variant: "primary",
468
- size: "medium"
469
- },
470
- variants: {
471
- block: {
472
- true: ["tw:w-full"]
473
- },
474
- variant: {
475
- primary: [
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"
484
- ],
485
- secondary: [
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"
491
- ],
492
- // should be called "destructive" by Figma
493
- danger: [
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"
500
- ],
501
- outline: [
502
- "tw:!border-input",
503
- "tw:bg-background",
504
- // Semantic base text color so the label/icon flips in dark mode
505
- // (matches `invisible`); previously unset → inherited a fixed dark color.
506
- "tw:text-foreground",
507
- // Hover follows the brand primary (translucent tint), matching the
508
- // `secondary` variant — not the fixed `accent` blue.
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"
514
- ],
515
- // should be called "ghost" by Figma
516
- invisible: [
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"
523
- ],
524
- // should be called "link" by Figma
525
- inline: [
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"
531
- ]
532
- },
533
- size: {
534
- // should be called "default" by Figma
535
- medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
536
- // should be called "small" by Figma
537
- small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
538
- // should be called "large" by Figma
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"],
543
- // unsupported in ARGO, remove when old design is gone
544
- "icon-xs": [],
545
- "icon-2xs": [],
546
- "icon-3xs": []
547
- }
548
- }
549
- }
550
- );
551
- var Button = ({
552
- ref,
553
- children,
554
- disabled = false,
555
- className,
556
- type = "button",
557
- isLoading = false,
558
- asChild = false,
559
- onClick,
560
- variant = "primary",
561
- size = "medium",
562
- block = false,
563
- ...buttonProps
564
- }) => {
565
- const renderArgo = useArgoDesign();
566
- const Comp = asChild ? Root : "button";
567
- const isIconOnly = String(size).startsWith("icon");
568
- const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
569
- const handleClick = (event) => {
570
- const isAnchor = event.currentTarget.tagName === "A";
571
- if (isAnchor && disabled) {
572
- event.preventDefault();
573
- return;
574
- }
575
- onClick?.(event);
576
- };
577
- return /* @__PURE__ */ jsxs(
578
- Comp,
579
- {
580
- ...buttonProps,
581
- ref,
582
- disabled,
583
- "aria-disabled": disabled,
584
- "data-variant": variant,
585
- "data-icon-only": isIconOnly,
586
- type,
587
- onClick: handleClick,
588
- className: cn(classNames),
589
- children: [
590
- isLoading && /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
591
- /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
592
- ]
593
- }
594
- );
595
- };
596
- var Clipboard2 = ({
597
- ref,
598
- text: textProp,
599
- children,
600
- tooltip = "Copy to Clipboard",
601
- tooltipPlacement = "top",
602
- tooltipVariant: tooltipVariantProp = "action",
603
- asChild = false,
604
- onClick,
605
- className,
606
- ...restButtonProps
607
- }) => {
608
- const [isTooltipOpen, setIsTooltipOpen] = useState(false);
609
- const [state, setState] = useState("ready");
610
- const text = typeof textProp === "function" ? textProp() : textProp;
611
- const copy = async (text2) => {
612
- try {
613
- if (!document.hasFocus()) window.focus();
614
- await copyToClipboard(text2);
615
- setState("copied");
616
- } catch {
617
- setState("error");
618
- }
619
- };
620
- const handleOnClick = (event) => {
621
- setIsTooltipOpen(true);
622
- if (text && state === "ready") void copy(text);
623
- onClick?.(event);
624
- };
625
- const handleOnOpenChange = (open) => {
626
- if (!open && state !== "ready") setState("ready");
627
- setIsTooltipOpen(open);
628
- };
629
- const tooltipContent = (() => {
630
- if (!text) return "Nothing to copy";
631
- if (state === "error") return "Failed to copy";
632
- if (state === "copied") return "Copied to Clipboard";
633
- return tooltip;
634
- })();
635
- const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
636
- const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
637
- return /* @__PURE__ */ jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
638
- /* @__PURE__ */ jsx(
639
- Tooltip.Trigger,
640
- {
641
- ...restButtonProps,
642
- asChild,
643
- keepOpenOnClick: true,
644
- onClick: handleOnClick,
645
- className: cn("tw:cursor-pointer", className),
646
- ref,
647
- children: children ?? text
648
- }
649
- ),
650
- hasTooltipContent && /* @__PURE__ */ jsx(
651
- Tooltip.Content,
652
- {
653
- keepOpenOnPointerDownOutside: true,
654
- placement: tooltipPlacement,
655
- variant: tooltipVariant,
656
- children: tooltipContent
657
- }
658
- )
659
- ] });
660
- };
661
- var DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
662
- var DEFAULT_ARIA_LABEL = "Copy";
663
- var ClipboardButton = ({
664
- // clipboard props
665
- text,
666
- tooltip,
667
- tooltipPlacement,
668
- tooltipVariant,
669
- // button props
670
- icon = DEFAULT_ICON,
671
- variant = "outline",
672
- children,
673
- ...rest
674
- }) => {
675
- const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
676
- const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
677
- return /* @__PURE__ */ jsx(
678
- Clipboard2,
679
- {
680
- asChild: true,
681
- tooltip,
682
- tooltipPlacement,
683
- tooltipVariant,
684
- text,
685
- children: /* @__PURE__ */ jsxs(Button, { ...rest, "aria-label": ariaLabel, variant, disabled: !text, children: [
686
- icon,
687
- children
688
- ] })
689
- }
690
- );
691
- };
692
- var MIN_SCALE = 0.5;
693
- var MAX_SCALE = 3;
694
- var ZOOM_STEP = 0.1;
695
- var ZoomableSvg = ({
696
- html,
697
- copyText,
698
- className,
699
- allowForeignObject,
700
- renderActions
701
- }) => {
702
- const safeHtml = useMemo(
703
- () => DOMPurify.sanitize(html, {
704
- USE_PROFILES: { svg: true, svgFilters: true },
705
- ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
706
- }),
707
- [html, allowForeignObject]
708
- );
709
- const containerRef = useRef(null);
710
- const [scale, setScale] = useState(1);
711
- const [translate, setTranslate] = useState({ x: 0, y: 0 });
712
- const [isFullscreen, setIsFullscreen] = useState(false);
713
- useEffect(() => {
714
- if (!isFullscreen) return;
715
- const onKeyDown = (e) => {
716
- if (e.key === "Escape") {
717
- e.stopPropagation();
718
- setIsFullscreen(false);
719
- }
720
- };
721
- document.addEventListener("keydown", onKeyDown, { capture: true });
722
- return () => document.removeEventListener("keydown", onKeyDown, { capture: true });
723
- }, [isFullscreen]);
724
- const dragRef = useRef(null);
725
- useEffect(() => {
726
- const el = containerRef.current;
727
- if (!el) return;
728
- const onWheel = (e) => {
729
- if (!e.ctrlKey && !e.metaKey) return;
730
- e.preventDefault();
731
- const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;
732
- setScale((s) => Math.min(MAX_SCALE, Math.max(MIN_SCALE, s + delta)));
733
- };
734
- el.addEventListener("wheel", onWheel, { passive: false });
735
- return () => el.removeEventListener("wheel", onWheel);
736
- }, [isFullscreen]);
737
- const didDragRef = useRef(false);
738
- const handleMouseDown = useCallback(
739
- (e) => {
740
- if (e.button !== 0) return;
741
- e.preventDefault();
742
- didDragRef.current = false;
743
- dragRef.current = {
744
- startX: e.clientX,
745
- startY: e.clientY,
746
- startTx: translate.x,
747
- startTy: translate.y
748
- };
749
- },
750
- [translate]
751
- );
752
- const handleMouseMove = useCallback((e) => {
753
- if (!dragRef.current) return;
754
- didDragRef.current = true;
755
- setTranslate({
756
- x: dragRef.current.startTx + e.clientX - dragRef.current.startX,
757
- y: dragRef.current.startTy + e.clientY - dragRef.current.startY
758
- });
759
- }, []);
760
- const handleMouseUp = useCallback(() => {
761
- dragRef.current = null;
762
- }, []);
763
- const handleReset = useCallback(() => {
764
- setScale(1);
765
- setTranslate({ x: 0, y: 0 });
766
- }, []);
767
- const isZoomed = Math.abs(scale - 1) > 1e-3 || translate.x !== 0 || translate.y !== 0;
768
- const handleClick = useCallback((e) => {
769
- if (didDragRef.current) {
770
- e.stopPropagation();
771
- }
772
- }, []);
773
- const stopPropagation = useCallback((e) => {
774
- e.stopPropagation();
775
- }, []);
776
- const diagramContent = /* @__PURE__ */ jsxs(
777
- "div",
778
- {
779
- role: "presentation",
780
- className: cn("tw:group/zoom tw:relative", isFullscreen && "tw:h-full"),
781
- onClick: handleClick,
782
- children: [
783
- /* @__PURE__ */ jsx(
784
- "div",
785
- {
786
- role: "presentation",
787
- ref: containerRef,
788
- className: cn(
789
- "tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3",
790
- isFullscreen && "tw:h-full"
791
- ),
792
- onMouseDown: handleMouseDown,
793
- onMouseMove: handleMouseMove,
794
- onMouseUp: handleMouseUp,
795
- onMouseLeave: handleMouseUp,
796
- children: /* @__PURE__ */ jsx(
797
- "div",
798
- {
799
- className: cn(
800
- "tw:flex tw:justify-center tw:origin-center",
801
- isFullscreen && "tw:h-full tw:[&>svg]:h-full"
802
- ),
803
- style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
804
- dangerouslySetInnerHTML: { __html: safeHtml }
805
- }
806
- )
807
- }
808
- ),
809
- /* @__PURE__ */ jsxs(
810
- "div",
811
- {
812
- role: "presentation",
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",
814
- onClick: stopPropagation,
815
- children: [
816
- isZoomed && /* @__PURE__ */ jsx(Tooltip, { tooltip: "Reset zoom", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "outline", onClick: handleReset, children: "Reset" }) }),
817
- copyText && /* @__PURE__ */ jsx(ClipboardButton, { text: copyText, tooltip: "Copy code", size: "icon-sm", variant: "outline" }),
818
- renderActions?.(safeHtml),
819
- /* @__PURE__ */ jsx(
820
- Tooltip,
821
- {
822
- tooltip: isFullscreen ? "Exit fullscreen" : "Fullscreen",
823
- placement: "top",
824
- triggerAsChild: true,
825
- children: /* @__PURE__ */ jsx(
826
- Button,
827
- {
828
- size: "icon-sm",
829
- variant: "outline",
830
- "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
831
- onClick: () => setIsFullscreen((f) => !f),
832
- children: isFullscreen ? /* @__PURE__ */ jsx(Minimize2, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Maximize2, { className: "tw:size-4" })
833
- }
834
- )
835
- }
836
- )
837
- ]
838
- }
839
- )
840
- ]
841
- }
842
- );
843
- if (isFullscreen) {
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
856
- );
857
- }
858
- return /* @__PURE__ */ jsx(
859
- "div",
860
- {
861
- className: cn(
862
- "tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted",
863
- className
864
- ),
865
- children: diagramContent
866
- }
867
- );
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
- };
932
- var PRIMARY_FALLBACK_CHANNELS = "31 143 255";
933
- var resolvePrimary = () => {
934
- const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--primary").trim() || PRIMARY_FALLBACK_CHANNELS;
935
- return `rgb(${channels})`;
936
- };
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
- };
946
- var getMermaid = () => {
947
- if (!mermaidPromise) {
948
- mermaidPromise = import('mermaid').then((m) => {
949
- registerLucideIconPack(m.default);
950
- m.default.initialize({
951
- startOnLoad: false,
952
- securityLevel: "strict",
953
- theme: "base",
954
- themeVariables: {
955
- primaryColor: colors.blue[100],
956
- primaryTextColor: colors.neutral[800],
957
- primaryBorderColor: colors.blue[700],
958
- secondaryColor: colors.white,
959
- secondaryTextColor: colors.neutral[800],
960
- secondaryBorderColor: colors.neutral[150],
961
- tertiaryColor: colors.warning[100],
962
- tertiaryTextColor: colors.neutral[800],
963
- tertiaryBorderColor: colors.warning[500],
964
- lineColor: colors.neutral[300],
965
- textColor: colors.neutral[800],
966
- mainBkg: colors.blue[100],
967
- nodeBorder: colors.blue[700],
968
- clusterBkg: colors.white,
969
- clusterBorder: colors.neutral[150],
970
- titleColor: colors.neutral[800],
971
- edgeLabelBackground: colors.white,
972
- nodeTextColor: colors.neutral[800],
973
- actorBorder: colors.blue[700],
974
- actorBkg: colors.blue[100],
975
- actorTextColor: colors.neutral[800],
976
- actorLineColor: colors.neutral[300],
977
- signalColor: colors.neutral[800],
978
- signalTextColor: colors.neutral[800],
979
- labelBoxBkgColor: colors.blue[100],
980
- labelBoxBorderColor: colors.blue[700],
981
- labelTextColor: colors.neutral[800],
982
- loopTextColor: colors.neutral[800],
983
- noteBorderColor: colors.warning[500],
984
- noteBkgColor: colors.warning[100],
985
- noteTextColor: colors.neutral[800],
986
- sectionBkgColor: colors.blue[100],
987
- altSectionBkgColor: colors.white,
988
- sectionBkgColor2: colors.neutral[100],
989
- taskBorderColor: colors.blue[700],
990
- taskBkgColor: colors.blue[100],
991
- taskTextColor: colors.neutral[800],
992
- taskTextDarkColor: colors.neutral[800],
993
- taskTextLightColor: colors.neutral[800],
994
- activeTaskBorderColor: resolvePrimary(),
995
- activeTaskBkgColor: colors.blue[200],
996
- doneTaskBorderColor: colors.green[600],
997
- doneTaskBkgColor: colors.green[100],
998
- critBorderColor: colors.error[500],
999
- critBkgColor: colors.error[100],
1000
- fontFamily: "Inter, system-ui, sans-serif",
1001
- fontSize: "14px"
1002
- }
1003
- });
1004
- return m;
1005
- }).catch((err) => {
1006
- mermaidPromise = null;
1007
- throw err;
1008
- });
1009
- }
1010
- return mermaidPromise;
1011
- };
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);
1014
- var tryFastRender = (code) => {
1015
- if (hasIconSyntax(code)) return null;
1016
- try {
1017
- return stripFontImports(
1018
- renderMermaidSVG(code, {
1019
- bg: colors.white,
1020
- fg: colors.neutral[800],
1021
- transparent: true,
1022
- font: "Inter, system-ui, sans-serif"
1023
- })
1024
- );
1025
- } catch (err) {
1026
- console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1027
- return null;
1028
- }
1029
- };
1030
- var RENDER_DEBOUNCE_MS = 300;
1031
- var svgCache = /* @__PURE__ */ new Map();
1032
- var resolveSyncSvg = (code) => {
1033
- const cached = svgCache.get(code);
1034
- if (cached) return cached;
1035
- const fast = tryFastRender(code);
1036
- if (fast) svgCache.set(code, fast);
1037
- return fast;
1038
- };
1039
- var MermaidDiagram = ({ code, renderActions }) => {
1040
- const id = useId();
1041
- const [svg, setSvg] = useState(() => resolveSyncSvg(code));
1042
- const [renderFailed, setRenderFailed] = useState(false);
1043
- const debounceRef = useRef(null);
1044
- const renderIdRef = useRef(0);
1045
- const [prevCode, setPrevCode] = useState(code);
1046
- if (code !== prevCode) {
1047
- setPrevCode(code);
1048
- setSvg(resolveSyncSvg(code));
1049
- setRenderFailed(false);
1050
- }
1051
- useEffect(() => {
1052
- if (svgCache.has(code)) return;
1053
- const currentRenderId = ++renderIdRef.current;
1054
- if (debounceRef.current) {
1055
- clearTimeout(debounceRef.current);
1056
- }
1057
- debounceRef.current = setTimeout(() => {
1058
- getMermaid().then(async (mermaidModule) => {
1059
- if (renderIdRef.current !== currentRenderId) return;
1060
- const rendererId = `mermaid-${id.replaceAll(":", "")}`;
1061
- const container = document.createElement("div");
1062
- container.style.visibility = "hidden";
1063
- container.style.position = "absolute";
1064
- container.style.top = "-9999px";
1065
- container.style.width = "900px";
1066
- document.body.appendChild(container);
1067
- try {
1068
- const result = await mermaidModule.default.render(rendererId, code, container);
1069
- if (renderIdRef.current === currentRenderId && result) {
1070
- const svgOutput = flattenForeignObjectLabels(result.svg);
1071
- svgCache.set(code, svgOutput);
1072
- setSvg(svgOutput);
1073
- setRenderFailed(false);
1074
- }
1075
- } finally {
1076
- container.remove();
1077
- }
1078
- }).catch((err) => {
1079
- if (renderIdRef.current === currentRenderId) {
1080
- console.error("[MermaidDiagram] fallback failed:", err);
1081
- setSvg(null);
1082
- setRenderFailed(true);
1083
- }
1084
- });
1085
- }, RENDER_DEBOUNCE_MS);
1086
- const timer = debounceRef.current;
1087
- const renderId = renderIdRef;
1088
- return () => {
1089
- renderId.current++;
1090
- if (timer) {
1091
- clearTimeout(timer);
1092
- }
1093
- };
1094
- }, [code, id]);
1095
- const processedSvg = svg ? makeResponsive(svg) : null;
1096
- if (renderFailed) {
1097
- return /* @__PURE__ */ jsx(
1098
- "pre",
1099
- {
1100
- className: cn(
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"
1106
- ),
1107
- children: /* @__PURE__ */ jsx("code", { children: code })
1108
- }
1109
- );
1110
- }
1111
- if (processedSvg) {
1112
- return /* @__PURE__ */ jsx(
1113
- ZoomableSvg,
1114
- {
1115
- html: processedSvg,
1116
- copyText: `\`\`\`mermaid
1117
- ${code}
1118
- \`\`\``,
1119
- className: "tw:my-3",
1120
- allowForeignObject: true,
1121
- renderActions
1122
- },
1123
- code
1124
- );
1125
- }
1126
- return /* @__PURE__ */ jsx(DiagramSkeleton, {});
1127
- };
1128
-
1129
- export { MermaidDiagram };
1
+ export { MermaidDiagram } from './chunk-KPNAW5MU.js';
2
+ import './chunk-IJTHFNNJ.js';
3
+ import './chunk-VPPM7UUQ.js';
4
+ import './chunk-L37JJ6MR.js';
5
+ import './chunk-CTCFYWJC.js';
6
+ import './chunk-BOHNXTMM.js';
7
+ import './chunk-63NSN2VL.js';
8
+ import './chunk-JP7PNHLH.js';
1130
9
  //# sourceMappingURL=mermaid.js.map
1131
10
  //# sourceMappingURL=mermaid.js.map