@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
@@ -1,16 +1,12 @@
1
- import { clsx } from 'clsx';
2
- import { extendTailwindMerge } from 'tailwind-merge';
3
- import { keboolaLegacySidebar, keboolaLegacyTopnav } from '@keboola/brand-registry';
4
- import { createContext, lazy, Suspense, use, useId, useState, useRef, useEffect, useCallback, useMemo } from 'react';
5
- import { Portal, Content, Root, Trigger } from '@radix-ui/react-tooltip';
6
- import { cva } from 'class-variance-authority';
7
- import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
8
- import { AlignLeft, AlignCenter, AlignRight, AlignJustify, SquareCode, Quote, ListOrdered, List, Heading3, Heading2, Heading1, Type, Bold, Italic, Underline, Strikethrough, Code, Minimize2, Maximize2, ChevronDown, Link, X, Copy, Loader2, AlertCircle, CircleCheck, Info, AlertTriangle, ChevronRight, Pipette, ToggleRight, Circle, Check } from 'lucide-react';
9
- import { Root as Root$2, Slottable } from '@radix-ui/react-slot';
10
- import { createPortal } from 'react-dom';
11
- import DOMPurify from 'dompurify';
12
- import { renderMermaidSVG } from 'beautiful-mermaid';
13
- import colors from '@keboola/tailwind-config/colors';
1
+ import { DropdownMenu, ButtonGroup, toast } from './chunk-XV3UUOYF.js';
2
+ import { Skeleton } from './chunk-VPPM7UUQ.js';
3
+ import { FormGroup, Label, TextInput } from './chunk-SYIEF644.js';
4
+ import './chunk-ESBL3IPF.js';
5
+ import { Button } from './chunk-CTCFYWJC.js';
6
+ import { AlignLeft, AlignCenter, AlignRight, AlignJustify, SquareCode, Quote, ListOrdered, List, Heading3, Heading2, Heading1, Type, Bold, Italic, Underline, Strikethrough, Code, ChevronDown, Link } from './chunk-BOHNXTMM.js';
7
+ import { Tooltip } from './chunk-63NSN2VL.js';
8
+ import { cn } from './chunk-JP7PNHLH.js';
9
+ import { createContext, lazy, Suspense, use, useState, useRef, useCallback, useEffect } from 'react';
14
10
  import { CodeNode, $isCodeNode, $createCodeNode } from '@lexical/code';
15
11
  import { LinkNode, $isLinkNode, TOGGLE_LINK_COMMAND, $createLinkNode } from '@lexical/link';
16
12
  import { ListNode, ListItemNode, $isListNode, REMOVE_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND } from '@lexical/list';
@@ -31,1473 +27,11 @@ import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin';
31
27
  import { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin';
32
28
  import { HeadingNode, QuoteNode, $isHeadingNode, $isQuoteNode, $createQuoteNode, $createHeadingNode } from '@lexical/rich-text';
33
29
  import { DecoratorNode, $getSelection, $isRangeSelection, FORMAT_TEXT_COMMAND, $createParagraphNode, PASTE_COMMAND, COMMAND_PRIORITY_CRITICAL, DROP_COMMAND, KEY_DOWN_COMMAND, COMMAND_PRIORITY_HIGH, $insertNodes, $getNodeByKey, $setSelection, FORMAT_ELEMENT_COMMAND, $createTextNode } from 'lexical';
30
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
34
31
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
35
- import { toast as toast$1 } from 'sonner';
32
+ import { createPortal } from 'react-dom';
36
33
  import { $getNearestBlockElementAncestorOrThrow } from '@lexical/utils';
37
- import * as DropdownMenuPrimitive3 from '@radix-ui/react-dropdown-menu';
38
- import { Root as Root$1, Group, Trigger as Trigger$1 } from '@radix-ui/react-dropdown-menu';
39
- import * as ScrollAreaPrimitive2 from '@radix-ui/react-scroll-area';
40
- import TextareaAutosize from 'react-textarea-autosize';
41
- import * as RLabel from '@radix-ui/react-label';
42
-
43
- var __defProp = Object.defineProperty;
44
- var __getOwnPropNames = Object.getOwnPropertyNames;
45
- var __esm = (fn, res) => function __init() {
46
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
47
- };
48
- var __export = (target, all) => {
49
- for (var name in all)
50
- __defProp(target, name, { get: all[name], enumerable: true });
51
- };
52
- var twMerge, cn;
53
- var init_classNames = __esm({
54
- "src/utils/classNames.ts"() {
55
- twMerge = extendTailwindMerge({
56
- prefix: "tw"
57
- });
58
- cn = (...classes) => twMerge(clsx(...classes));
59
- }
60
- });
61
-
62
- // src/utils/copyToClipboard.ts
63
- var copyToClipboard;
64
- var init_copyToClipboard = __esm({
65
- "src/utils/copyToClipboard.ts"() {
66
- copyToClipboard = (text) => {
67
- return navigator.clipboard.writeText(text);
68
- };
69
- }
70
- });
71
-
72
- // src/utils/createChangeInputEvent.ts
73
- var createChangeInputEvent;
74
- var init_createChangeInputEvent = __esm({
75
- "src/utils/createChangeInputEvent.ts"() {
76
- createChangeInputEvent = (input) => {
77
- const changeEvent = {
78
- target: input,
79
- currentTarget: input,
80
- type: "change",
81
- nativeEvent: new Event("change", { bubbles: true }),
82
- bubbles: true,
83
- cancelable: false,
84
- defaultPrevented: false,
85
- eventPhase: 2,
86
- // AT_TARGET
87
- isTrusted: false,
88
- // Synthetic events are not trusted
89
- preventDefault: () => {
90
- },
91
- // Provide dummy functions if not needed
92
- isDefaultPrevented: () => false,
93
- stopPropagation: () => {
94
- },
95
- isPropagationStopped: () => false,
96
- persist: () => {
97
- },
98
- timeStamp: Date.now()
99
- };
100
- Object.defineProperty(changeEvent, "target", {
101
- value: input,
102
- writable: false
103
- });
104
- return changeEvent;
105
- };
106
- }
107
- });
108
-
109
- // src/constants/keyCodes.ts
110
- var keyCodes;
111
- var init_keyCodes = __esm({
112
- "src/constants/keyCodes.ts"() {
113
- keyCodes = {
114
- ENTER: "Enter",
115
- ESCAPE: "Escape",
116
- SPACE: " "
117
- };
118
- }
119
- });
120
-
121
- // src/components/ThemeProvider/utils.ts
122
- var createTheme;
123
- var init_utils = __esm({
124
- "src/components/ThemeProvider/utils.ts"() {
125
- createTheme = (brand) => ({
126
- id: brand.id,
127
- name: brand.name,
128
- shell: brand.shell,
129
- logo: brand.logo
130
- });
131
- }
132
- });
133
- var DEFAULT_COLOR_SCHEME, DEFAULT_BRAND_ID, defaultBrand, defaultTheme;
134
- var init_defaults = __esm({
135
- "src/components/ThemeProvider/defaults.ts"() {
136
- init_utils();
137
- [keboolaLegacySidebar.id, keboolaLegacyTopnav.id];
138
- DEFAULT_COLOR_SCHEME = "light";
139
- DEFAULT_BRAND_ID = "design-system";
140
- defaultBrand = {
141
- id: DEFAULT_BRAND_ID,
142
- name: "Design System",
143
- shell: "sidebar",
144
- theme: {}
145
- };
146
- defaultTheme = createTheme(defaultBrand);
147
- }
148
- });
149
- var noop, defaultContext, ArgoDesignContext, useArgoDesign;
150
- var init_context = __esm({
151
- "src/components/ThemeProvider/context.tsx"() {
152
- init_defaults();
153
- noop = () => void 0;
154
- defaultContext = {
155
- scheme: DEFAULT_COLOR_SCHEME,
156
- resolvedScheme: DEFAULT_COLOR_SCHEME,
157
- setScheme: noop,
158
- brandId: defaultTheme.id,
159
- setBrand: noop,
160
- themes: [defaultTheme],
161
- currentTheme: defaultTheme
162
- };
163
- createContext(defaultContext);
164
- ArgoDesignContext = createContext(true);
165
- useArgoDesign = () => use(ArgoDesignContext);
166
- }
167
- });
168
- var tooltipVariants, TooltipContent;
169
- var init_TooltipContent = __esm({
170
- "src/components/Tooltip/TooltipContent.tsx"() {
171
- init_context();
172
- tooltipVariants = cva(
173
- [
174
- "tailwindcss-preflight",
175
- "tw:inline-block",
176
- "tw:break-anywhere",
177
- "tw:max-h-96",
178
- "tw:overflow-y-auto",
179
- "tw:z-[1060]",
180
- // legacy (dark) chrome — default
181
- "tw:rounded",
182
- "tw:bg-neutral-800",
183
- "tw:text-white",
184
- // argo chrome overrides — semantic floating-panel tokens
185
- "tw:data-[argo=true]:rounded-2xl",
186
- "tw:data-[argo=true]:border",
187
- "tw:data-[argo=true]:border-solid",
188
- "tw:data-[argo=true]:border-border",
189
- "tw:data-[argo=true]:bg-popover",
190
- "tw:data-[argo=true]:text-popover-foreground",
191
- "tw:data-[argo=true]:shadow-md",
192
- // argo open animation
193
- "tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
194
- "tw:data-[argo=true]:data-[state=instant-open]:animate-in",
195
- "tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
196
- "tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
197
- "tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
198
- "tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
199
- // argo closed animation
200
- "tw:data-[argo=true]:data-[state=closed]:animate-out",
201
- "tw:data-[argo=true]:data-[state=closed]:fade-out-0",
202
- "tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
203
- // argo position animation
204
- "tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
205
- "tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
206
- "tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
207
- "tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
208
- ],
209
- {
210
- defaultVariants: {
211
- variant: "action"
212
- },
213
- variants: {
214
- variant: {
215
- action: [
216
- "tw:max-w-fit",
217
- "tw:px-3",
218
- "tw:py-2",
219
- "tw:text-center",
220
- "tw:text-xs",
221
- "tw:font-medium",
222
- // Legacy chrome uppercases the action tooltip; the Keboola V2 brand
223
- // (`data-brand="keboola"`) renders it in standard case instead.
224
- "tw:uppercase",
225
- "tw:tracking-wider",
226
- "tw:[[data-brand=keboola]_&]:normal-case",
227
- "tw:[[data-brand=keboola]_&]:tracking-normal"
228
- ],
229
- explanatory: [
230
- "tw:max-w-80",
231
- "tw:px-4",
232
- "tw:py-3",
233
- "tw:text-left",
234
- "tw:text-sm",
235
- "tw:font-normal"
236
- ]
237
- }
238
- }
239
- }
240
- );
241
- TooltipContent = ({
242
- className,
243
- variant,
244
- keepOpenOnPointerDownOutside = false,
245
- children,
246
- onPointerDownOutside,
247
- sideOffset = 8,
248
- collisionPadding = 8,
249
- hideWhenDetached = true,
250
- placement = "right",
251
- ...rest
252
- }) => {
253
- const renderArgo = useArgoDesign();
254
- const handlePointerDownOutside = (event) => {
255
- if (keepOpenOnPointerDownOutside) event.preventDefault();
256
- onPointerDownOutside?.(event);
257
- };
258
- return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(
259
- Content,
260
- {
261
- ...rest,
262
- "data-tooltip-content": renderArgo ? void 0 : true,
263
- "data-argo": renderArgo,
264
- sideOffset,
265
- collisionPadding,
266
- onPointerDownOutside: handlePointerDownOutside,
267
- className: tooltipVariants({ className, variant }),
268
- hideWhenDetached,
269
- side: placement,
270
- children
271
- }
272
- ) });
273
- };
274
- }
275
- });
276
- var DELAY_SHOW_TOOLTIP, TooltipRoot;
277
- var init_TooltipRoot = __esm({
278
- "src/components/Tooltip/TooltipRoot.tsx"() {
279
- DELAY_SHOW_TOOLTIP = 300;
280
- TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsx(Root, { ...rest, delayDuration, children });
281
- }
282
- });
283
- var TooltipTrigger;
284
- var init_TooltipTrigger = __esm({
285
- "src/components/Tooltip/TooltipTrigger.tsx"() {
286
- init_utils2();
287
- TooltipTrigger = ({
288
- ref,
289
- children,
290
- className,
291
- keepOpenOnClick = false,
292
- onClick,
293
- onPointerDown,
294
- asChild,
295
- ...rest
296
- }) => {
297
- const handleClick = (event) => {
298
- if (keepOpenOnClick) event.preventDefault();
299
- onClick?.(event);
300
- };
301
- const handlePointerDown = (event) => {
302
- if (keepOpenOnClick) event.preventDefault();
303
- onPointerDown?.(event);
304
- };
305
- return /* @__PURE__ */ jsx(
306
- Trigger,
307
- {
308
- ...rest,
309
- asChild: true,
310
- ref,
311
- className: cn("tailwindcss-preflight", className),
312
- onClick: handleClick,
313
- onPointerDown: handlePointerDown,
314
- children: asChild ? children : (
315
- // Default-mode trigger wraps children in a span so Radix has a
316
- // single DOM element to attach handlers to. `tailwindcss-preflight`
317
- // (merged in via Slot) activates Tailwind's preflight inside the
318
- // span, which sets `svg { display: block }` — without an inline-flex
319
- // container that would stack any bare Lucide icon onto its own
320
- // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.
321
- /* @__PURE__ */ jsx("span", { className: "tw:inline-flex tw:items-center", children })
322
- )
323
- }
324
- );
325
- };
326
- }
327
- });
328
- var ACTION_TOOLTIP_LIMIT, Tooltip;
329
- var init_Tooltip = __esm({
330
- "src/components/Tooltip/Tooltip.tsx"() {
331
- init_keyCodes();
332
- init_TooltipContent();
333
- init_TooltipRoot();
334
- init_TooltipTrigger();
335
- ACTION_TOOLTIP_LIMIT = 30;
336
- Tooltip = ({
337
- tooltip,
338
- children,
339
- className,
340
- keepOpenOnTriggerClick = false,
341
- variant,
342
- placement = "right",
343
- forceHide = false,
344
- forceShow = false,
345
- delayDuration,
346
- // trigger props
347
- triggerAsChild = false
348
- }) => {
349
- const [open, setOpen] = useState(false);
350
- const resolvedVariant = (() => {
351
- if (!!variant) return variant;
352
- if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
353
- return "action";
354
- })();
355
- const isActionVariant = resolvedVariant === "action";
356
- const handleKeyUp = (event) => {
357
- if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
358
- event.stopPropagation();
359
- };
360
- return /* @__PURE__ */ jsxs(
361
- TooltipRoot,
362
- {
363
- open: !!tooltip && (open || forceShow) && !forceHide,
364
- onOpenChange: setOpen,
365
- delayDuration,
366
- disableHoverableContent: isActionVariant,
367
- children: [
368
- /* @__PURE__ */ jsx(
369
- TooltipTrigger,
370
- {
371
- asChild: triggerAsChild,
372
- keepOpenOnClick: keepOpenOnTriggerClick,
373
- onKeyUp: handleKeyUp,
374
- children
375
- }
376
- ),
377
- /* @__PURE__ */ jsx(
378
- TooltipContent,
379
- {
380
- className,
381
- variant: resolvedVariant,
382
- placement,
383
- keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
384
- children: tooltip
385
- }
386
- )
387
- ]
388
- }
389
- );
390
- };
391
- Tooltip.Root = TooltipRoot;
392
- Tooltip.Content = TooltipContent;
393
- Tooltip.Trigger = TooltipTrigger;
394
- }
395
- });
396
-
397
- // src/components/Tooltip/index.ts
398
- var init_Tooltip2 = __esm({
399
- "src/components/Tooltip/index.ts"() {
400
- init_Tooltip();
401
- }
402
- });
403
- var init_decorators = __esm({
404
- "src/utils/decorators.tsx"() {
405
- }
406
- });
407
-
408
- // src/utils/createPrefixedString.ts
409
- var createPrefixedString;
410
- var init_createPrefixedString = __esm({
411
- "src/utils/createPrefixedString.ts"() {
412
- createPrefixedString = (prefix) => (literals) => literals.reduce((acc, literal) => acc + literal, `${prefix}-`);
413
- }
414
- });
415
-
416
- // src/utils/escapeStringRegexp.ts
417
- var init_escapeStringRegexp = __esm({
418
- "src/utils/escapeStringRegexp.ts"() {
419
- }
420
- });
421
-
422
- // src/utils/mergeRefs.ts
423
- function setRef(ref, value) {
424
- if (typeof ref === "function") {
425
- ref(value);
426
- } else if (ref != null) {
427
- ref.current = value;
428
- }
429
- }
430
- var mergeRefs;
431
- var init_mergeRefs = __esm({
432
- "src/utils/mergeRefs.ts"() {
433
- mergeRefs = (...refs) => {
434
- return (node) => refs.forEach((ref) => setRef(ref, node));
435
- };
436
- }
437
- });
438
-
439
- // src/utils/noop.ts
440
- var init_noop = __esm({
441
- "src/utils/noop.ts"() {
442
- }
443
- });
444
-
445
- // src/utils/debounce.ts
446
- var init_debounce = __esm({
447
- "src/utils/debounce.ts"() {
448
- }
449
- });
450
-
451
- // src/utils/isMac.ts
452
- var getIsMac;
453
- var init_isMac = __esm({
454
- "src/utils/isMac.ts"() {
455
- getIsMac = () => {
456
- if (typeof navigator !== "undefined" && "userAgentData" in navigator) {
457
- const platform = navigator.userAgentData.platform;
458
- if (typeof platform === "string") {
459
- return platform.toLowerCase() === "macos";
460
- }
461
- }
462
- if (typeof navigator !== "undefined" && typeof navigator.platform === "string") {
463
- return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
464
- }
465
- return false;
466
- };
467
- getIsMac();
468
- }
469
- });
470
- var init_useSHA256 = __esm({
471
- "src/utils/useSHA256.ts"() {
472
- }
473
- });
474
-
475
- // src/utils/index.ts
476
- var init_utils2 = __esm({
477
- "src/utils/index.ts"() {
478
- init_classNames();
479
- init_copyToClipboard();
480
- init_createChangeInputEvent();
481
- init_decorators();
482
- init_createPrefixedString();
483
- init_escapeStringRegexp();
484
- init_mergeRefs();
485
- init_noop();
486
- init_debounce();
487
- init_isMac();
488
- init_useSHA256();
489
- }
490
- });
491
- var HEIGHT_CLASS_NAME, ANIMATION_CLASS_NAME, Skeleton;
492
- var init_Skeleton = __esm({
493
- "src/components/Skeleton/Skeleton.tsx"() {
494
- init_utils2();
495
- HEIGHT_CLASS_NAME = {
496
- xxs: "tw:h-3 tw:rounded",
497
- xs: "tw:h-4 tw:rounded",
498
- sm: "tw:h-5 tw:rounded",
499
- md: "tw:h-6 tw:rounded-md",
500
- lg: "tw:h-8 tw:rounded-lg",
501
- xl: "tw:h-10 tw:rounded-lg",
502
- "2xl": "tw:h-12 tw:rounded-lg"
503
- };
504
- ANIMATION_CLASS_NAME = cn(
505
- // base styles
506
- "tw:relative",
507
- "tw:overflow-hidden",
508
- "tw:pointer-events-none",
509
- "tw:bg-skeleton",
510
- // before
511
- 'tw:before:content-[""]',
512
- "tw:before:opacity-100",
513
- "tw:before:absolute",
514
- "tw:before:inset-0",
515
- "tw:before:-translate-x-full",
516
- "tw:before:animate-[shimmer_2s_infinite]",
517
- "tw:before:bg-gradient-to-r",
518
- "tw:before:from-transparent",
519
- "tw:before:to-transparent",
520
- "tw:before:via-white/40"
521
- );
522
- Skeleton = ({ height = "md", className, count = 1 }) => {
523
- const prefixId = useId();
524
- const keys = Array.from({ length: count }, (_, i) => `${prefixId}-${i}`);
525
- return /* @__PURE__ */ jsx(Fragment, { children: keys.map((key) => /* @__PURE__ */ jsx(
526
- "div",
527
- {
528
- "data-skeleton": "true",
529
- className: cn(HEIGHT_CLASS_NAME[height], ANIMATION_CLASS_NAME, className)
530
- },
531
- key
532
- )) });
533
- };
534
- }
535
- });
536
- var init_icons = __esm({
537
- "src/icons/index.ts"() {
538
- }
539
- });
540
- var variants, argoVariants;
541
- var init_styles = __esm({
542
- "src/components/Button/styles.ts"() {
543
- variants = cva(
544
- [
545
- "tailwindcss-preflight",
546
- "tw:group/button",
547
- "tw:border-box",
548
- // layout
549
- "tw:relative",
550
- "tw:flex",
551
- "tw:items-center",
552
- "tw:justify-center",
553
- "tw:gap-2",
554
- // text — chrome weight/tracking are brand-overridable tokens
555
- // (`--font-weight-medium` / `--letter-spacing-chrome`). Casing: standard case is
556
- // the default; only legacy brands (`keboola-legacy-*`) uppercase the chrome, so
557
- // modern brands (incl. Keboola V2) read naturally. Mirrors the V2 standard-case
558
- // treatment shipped for Tooltip/Badge (PR 7629).
559
- "tw:text-xs",
560
- "tw:leading-5",
561
- "tw:font-medium",
562
- "tw:[[data-brand^=keboola-legacy]_&]:tracking-chrome",
563
- "tw:[[data-brand^=keboola-legacy]_&]:uppercase",
564
- // border — legacy (non-argo) chrome uses a fixed radius, not the brand token.
565
- "tw:rounded",
566
- "tw:border",
567
- "tw:border-transparent",
568
- // styling
569
- "tw:shadow-none",
570
- "tw:[a]:cursor-pointer",
571
- // explicitly set for anchor
572
- "tw:focus-visible:outline",
573
- "tw:focus-visible:outline-1",
574
- "tw:focus-visible:-outline-offset-1",
575
- "tw:focus-visible:outline-ring",
576
- "tw:focus-visible:ring-4",
577
- "tw:focus-visible:ring-ring/30",
578
- // disabled
579
- "tw:disabled:opacity-40",
580
- "tw:disabled:cursor-not-allowed",
581
- // anchor support
582
- "tw:!no-underline",
583
- "tw:aria-disabled:opacity-40",
584
- "tw:aria-disabled:cursor-not-allowed",
585
- "tw:[&_svg]:shrink-0"
586
- ],
587
- {
588
- defaultVariants: {
589
- size: "medium",
590
- variant: "primary",
591
- block: false
592
- },
593
- variants: {
594
- block: {
595
- true: ["tw:w-full"]
596
- },
597
- variant: {
598
- primary: [
599
- "tw:text-white",
600
- "tw:bg-primary-500",
601
- "tw:focus:text-white",
602
- "tw:hover:text-white",
603
- "tw:hover:not-disabled:bg-primary-600",
604
- "tw:active:not-disabled:bg-primary-800",
605
- // anchor disabled override
606
- "tw:aria-disabled:!bg-primary-500"
607
- ],
608
- secondary: [
609
- "tw:text-white",
610
- "tw:bg-secondary-500",
611
- "tw:focus:text-white",
612
- "tw:hover:text-white",
613
- "tw:hover:not-disabled:bg-secondary-700",
614
- "tw:active:not-disabled:bg-secondary-800",
615
- // anchor disabled override
616
- "tw:aria-disabled:!bg-secondary-500"
617
- ],
618
- danger: [
619
- "tw:text-white",
620
- "tw:bg-error-500",
621
- "tw:focus:text-white",
622
- "tw:hover:text-white",
623
- "tw:hover:not-disabled:bg-error-600",
624
- "tw:active:not-disabled:bg-error-700",
625
- // anchor disabled override
626
- "tw:aria-disabled:!bg-error-500"
627
- ],
628
- invisible: [
629
- "tw:text-neutral-800",
630
- "tw:bg-transparent",
631
- "tw:focus:text-neutral-800",
632
- "tw:hover:not-disabled:bg-neutral-100",
633
- "tw:hover:text-neutral-800",
634
- "tw:active:not-disabled:bg-neutral-150",
635
- // contrasting icon on hover/active
636
- "tw:[&_svg]:text-neutral-400",
637
- "tw:hover:not-disabled:[&_svg]:text-secondary-600",
638
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
639
- // anchor disabled override
640
- "tw:aria-disabled:!bg-transparent"
641
- ],
642
- outline: [
643
- "tw:text-neutral-800",
644
- "tw:bg-white",
645
- // border
646
- "tw:!border-neutral-200",
647
- "tw:hover:text-neutral-800",
648
- "tw:focus:text-neutral-800",
649
- "tw:hover:not-disabled:!border-neutral-300",
650
- "tw:hover:not-disabled:bg-neutral-100",
651
- "tw:active:not-disabled:bg-neutral-200",
652
- // contrasting icon hover, same as invisible
653
- "tw:[&_svg]:text-neutral-400",
654
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
655
- "tw:active:not-disabled:[&_svg]:text-secondary-600",
656
- // anchor disabled override
657
- "tw:aria-disabled:!bg-white",
658
- "tw:aria-disabled:!border-neutral-200"
659
- ],
660
- inline: [
661
- "tw:text-neutral-800",
662
- "tw:bg-transparent",
663
- "tw:rounded-full",
664
- "tw:[&_svg]:text-neutral-400",
665
- "tw:not-disabled:hover:[&_svg]:text-secondary-600",
666
- "tw:not-disabled:focus:[&_svg]:text-secondary-600"
667
- ]
668
- },
669
- size: {
670
- medium: [
671
- "tw:max-h-10",
672
- "tw:min-h-10",
673
- "tw:px-4",
674
- "tw:py-2.5",
675
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
676
- ],
677
- small: [
678
- "tw:max-h-8",
679
- "tw:min-h-8",
680
- "tw:px-4",
681
- "tw:py-1.5",
682
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
683
- ],
684
- large: [
685
- "tw:max-h-12",
686
- "tw:min-h-12",
687
- "tw:px-4",
688
- "tw:py-3.5",
689
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4'
690
- ],
691
- "icon-lg": ["tw:size-12", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-6'],
692
- icon: ["tw:size-10", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
693
- "icon-sm": ["tw:size-8", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
694
- "icon-xs": ["tw:size-6", "tw:p-0", 'tw:[&_svg:not([class*="tw:size-"])]:size-4'],
695
- "icon-2xs": [
696
- "tw:!inline-flex",
697
- "tw:size-5",
698
- "tw:max-h-5",
699
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3'
700
- ],
701
- "icon-3xs": ["tw:h-fit", "tw:w-fit", 'tw:[&_svg:not([class*="tw:size-"])]:size-4']
702
- }
703
- }
704
- }
705
- );
706
- argoVariants = cva(
707
- [
708
- "tailwindcss-preflight",
709
- // layout
710
- "tw:relative",
711
- "tw:inline-flex",
712
- "tw:items-center",
713
- "tw:justify-center",
714
- "tw:whitespace-nowrap",
715
- "tw:gap-2",
716
- // border
717
- "tw:border",
718
- "tw:border-transparent",
719
- "tw:rounded-[var(--radius-lg,0.25rem)]",
720
- // text
721
- "tw:font-medium",
722
- "tw:select-none",
723
- // focus visible
724
- "tw:!outline-hidden",
725
- "tw:focus-visible:ring-2",
726
- // disabled
727
- "tw:disabled:cursor-not-allowed",
728
- "tw:disabled:opacity-50",
729
- "tw:active:opacity-60",
730
- "tw:transition-all",
731
- "tw:bg-clip-padding",
732
- // anchor support
733
- "tw:!no-underline",
734
- "tw:aria-disabled:cursor-not-allowed",
735
- "tw:aria-disabled:opacity-50",
736
- // icon
737
- "tw:shrink-0",
738
- "tw:[&_svg]:pointer-events-none",
739
- "tw:[&_svg]:shrink-0",
740
- "tw:[&_svg:not([class*='tw:size-'])]:size-4"
741
- ],
742
- {
743
- defaultVariants: {
744
- variant: "primary",
745
- size: "medium"
746
- },
747
- variants: {
748
- block: {
749
- true: ["tw:w-full"]
750
- },
751
- variant: {
752
- primary: [
753
- "tw:bg-primary",
754
- "tw:text-primary-foreground",
755
- "tw:[a]:hover:bg-primary/80",
756
- "tw:hover:not-disabled:bg-primary/90",
757
- "tw:hover:text-primary-foreground",
758
- "tw:focus:text-primary-foreground",
759
- "tw:focus-visible:border-primary",
760
- "tw:focus-visible:ring-ring/50"
761
- ],
762
- secondary: [
763
- "tw:bg-primary/10",
764
- "tw:text-primary",
765
- "tw:hover:not-disabled:bg-primary/20",
766
- "tw:focus-visible:border-primary",
767
- "tw:focus-visible:ring-ring/50"
768
- ],
769
- // should be called "destructive" by Figma
770
- danger: [
771
- "tw:bg-destructive",
772
- "tw:text-destructive-foreground",
773
- "tw:hover:text-destructive-foreground",
774
- "tw:focus:text-destructive-foreground",
775
- "tw:focus-visible:border-destructive",
776
- "tw:focus-visible:ring-destructive/20"
777
- ],
778
- outline: [
779
- "tw:!border-input",
780
- "tw:bg-background",
781
- // Semantic base text color so the label/icon flips in dark mode
782
- // (matches `invisible`); previously unset → inherited a fixed dark color.
783
- "tw:text-foreground",
784
- // Hover follows the brand primary (translucent tint), matching the
785
- // `secondary` variant — not the fixed `accent` blue.
786
- "tw:hover:not-disabled:bg-primary/10",
787
- "tw:hover:not-disabled:text-primary",
788
- "tw:hover:active:bg-background",
789
- "tw:focus-visible:!border-primary",
790
- "tw:focus-visible:ring-ring/50"
791
- ],
792
- // should be called "ghost" by Figma
793
- invisible: [
794
- "tw:bg-transparent",
795
- "tw:text-foreground",
796
- "tw:hover:not-disabled:bg-primary/10",
797
- "tw:hover:not-disabled:text-primary",
798
- "tw:hover:not-disabled:border-primary/10",
799
- "tw:focus-visible:ring-ring/50"
800
- ],
801
- // should be called "link" by Figma
802
- inline: [
803
- "tw:bg-transparent",
804
- "tw:text-primary",
805
- "tw:hover:underline",
806
- "tw:hover:active:bg-transparent",
807
- "tw:focus-visible:ring-ring/50"
808
- ]
809
- },
810
- size: {
811
- // should be called "default" by Figma
812
- medium: ["tw:max-h-9", "tw:py-2", "tw:px-4", "tw:text-sm"],
813
- // should be called "small" by Figma
814
- small: ["tw:max-h-8", "tw:py-2", "tw:px-3", "tw:text-xs"],
815
- // should be called "large" by Figma
816
- large: ["tw:max-h-10", "tw:py-2.5", "tw:px-6", "tw:text-sm"],
817
- "icon-lg": ["tw:size-10"],
818
- icon: ["tw:size-9"],
819
- "icon-sm": ["tw:size-8"],
820
- // unsupported in ARGO, remove when old design is gone
821
- "icon-xs": [],
822
- "icon-2xs": [],
823
- "icon-3xs": []
824
- }
825
- }
826
- }
827
- );
828
- }
829
- });
830
- var Button;
831
- var init_Button = __esm({
832
- "src/components/Button/Button.tsx"() {
833
- init_icons();
834
- init_utils2();
835
- init_context();
836
- init_styles();
837
- Button = ({
838
- ref,
839
- children,
840
- disabled = false,
841
- className,
842
- type = "button",
843
- isLoading = false,
844
- asChild = false,
845
- onClick,
846
- variant = "primary",
847
- size = "medium",
848
- block = false,
849
- ...buttonProps
850
- }) => {
851
- const renderArgo = useArgoDesign();
852
- const Comp = asChild ? Root$2 : "button";
853
- const isIconOnly = String(size).startsWith("icon");
854
- const classNames = renderArgo ? argoVariants({ variant, size, block, className }) : variants({ size, variant, block, className });
855
- const handleClick = (event) => {
856
- const isAnchor = event.currentTarget.tagName === "A";
857
- if (isAnchor && disabled) {
858
- event.preventDefault();
859
- return;
860
- }
861
- onClick?.(event);
862
- };
863
- return /* @__PURE__ */ jsxs(
864
- Comp,
865
- {
866
- ...buttonProps,
867
- ref,
868
- disabled,
869
- "aria-disabled": disabled,
870
- "data-variant": variant,
871
- "data-icon-only": isIconOnly,
872
- type,
873
- onClick: handleClick,
874
- className: cn(classNames),
875
- children: [
876
- isLoading && /* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:shrink-0 tw:animate-spin" }),
877
- /* @__PURE__ */ jsx(Slottable, { children: isLoading && isIconOnly ? null : children })
878
- ]
879
- }
880
- );
881
- };
882
- }
883
- });
884
- var init_ButtonInline = __esm({
885
- "src/components/Button/ButtonInline.tsx"() {
886
- cva(
887
- [
888
- "tailwindcss-preflight",
889
- "tw:inline-flex",
890
- "tw:items-center",
891
- "tw:gap-2",
892
- "tw:underline-offset-2",
893
- "tw:disabled:opacity-40",
894
- "tw:disabled:cursor-not-allowed",
895
- "tw:disabled:text-neutral-500",
896
- "tw:disabled:no-underline",
897
- "tw:disabled:[&_svg]:text-neutral-400",
898
- // Default size for nested Lucide icons; callers can override on the icon.
899
- "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4",
900
- "tw:[&_svg]:shrink-0"
901
- ],
902
- {
903
- defaultVariants: {
904
- variant: "link",
905
- color: "link"
906
- },
907
- variants: {
908
- color: {
909
- link: ["tw:text-primary", "tw:hover:text-primary/90", "tw:[&_svg]:text-primary"],
910
- dark: ["tw:text-neutral-800 tw:[&_svg]:text-neutral-400"],
911
- danger: ["tw:text-error-500 tw:[&_svg]:text-error-500"],
912
- muted: ["tw:text-muted-foreground tw:[&_svg]:text-muted-foreground"],
913
- custom: []
914
- },
915
- variant: {
916
- link: ["tw:underline", "tw:hover:no-underline"],
917
- "link-reverse": ["tw:no-underline", "", "tw:hover:underline"],
918
- custom: []
919
- }
920
- }
921
- }
922
- );
923
- }
924
- });
925
-
926
- // src/components/Button/index.ts
927
- var init_Button2 = __esm({
928
- "src/components/Button/index.ts"() {
929
- init_Button();
930
- init_ButtonInline();
931
- }
932
- });
933
- var Clipboard2;
934
- var init_Clipboard = __esm({
935
- "src/components/Clipboard/Clipboard.tsx"() {
936
- init_utils2();
937
- init_Tooltip2();
938
- Clipboard2 = ({
939
- ref,
940
- text: textProp,
941
- children,
942
- tooltip = "Copy to Clipboard",
943
- tooltipPlacement = "top",
944
- tooltipVariant: tooltipVariantProp = "action",
945
- asChild = false,
946
- onClick,
947
- className,
948
- ...restButtonProps
949
- }) => {
950
- const [isTooltipOpen, setIsTooltipOpen] = useState(false);
951
- const [state, setState] = useState("ready");
952
- const text = typeof textProp === "function" ? textProp() : textProp;
953
- const copy = async (text2) => {
954
- try {
955
- if (!document.hasFocus()) window.focus();
956
- await copyToClipboard(text2);
957
- setState("copied");
958
- } catch {
959
- setState("error");
960
- }
961
- };
962
- const handleOnClick = (event) => {
963
- setIsTooltipOpen(true);
964
- if (text && state === "ready") void copy(text);
965
- onClick?.(event);
966
- };
967
- const handleOnOpenChange = (open) => {
968
- if (!open && state !== "ready") setState("ready");
969
- setIsTooltipOpen(open);
970
- };
971
- const tooltipContent = (() => {
972
- if (!text) return "Nothing to copy";
973
- if (state === "error") return "Failed to copy";
974
- if (state === "copied") return "Copied to Clipboard";
975
- return tooltip;
976
- })();
977
- const tooltipVariant = state === "ready" && !!text ? tooltipVariantProp : "action";
978
- const hasTooltipContent = tooltipContent !== null && tooltipContent !== void 0;
979
- return /* @__PURE__ */ jsxs(Tooltip.Root, { open: isTooltipOpen, onOpenChange: handleOnOpenChange, children: [
980
- /* @__PURE__ */ jsx(
981
- Tooltip.Trigger,
982
- {
983
- ...restButtonProps,
984
- asChild,
985
- keepOpenOnClick: true,
986
- onClick: handleOnClick,
987
- className: cn("tw:cursor-pointer", className),
988
- ref,
989
- children: children ?? text
990
- }
991
- ),
992
- hasTooltipContent && /* @__PURE__ */ jsx(
993
- Tooltip.Content,
994
- {
995
- keepOpenOnPointerDownOutside: true,
996
- placement: tooltipPlacement,
997
- variant: tooltipVariant,
998
- children: tooltipContent
999
- }
1000
- )
1001
- ] });
1002
- };
1003
- }
1004
- });
1005
-
1006
- // src/components/Clipboard/index.ts
1007
- var init_Clipboard2 = __esm({
1008
- "src/components/Clipboard/index.ts"() {
1009
- init_Clipboard();
1010
- }
1011
- });
1012
- var DEFAULT_ICON, DEFAULT_ARIA_LABEL, ClipboardButton;
1013
- var init_ClipboardButton = __esm({
1014
- "src/blocks/ClipboardButton/ClipboardButton.tsx"() {
1015
- init_Button2();
1016
- init_Clipboard2();
1017
- init_icons();
1018
- DEFAULT_ICON = /* @__PURE__ */ jsx(Copy, {});
1019
- DEFAULT_ARIA_LABEL = "Copy";
1020
- ClipboardButton = ({
1021
- // clipboard props
1022
- text,
1023
- tooltip,
1024
- tooltipPlacement,
1025
- tooltipVariant,
1026
- // button props
1027
- icon = DEFAULT_ICON,
1028
- variant = "outline",
1029
- children,
1030
- ...rest
1031
- }) => {
1032
- const defaultAriaLabel = typeof tooltip === "string" && tooltip.trim() ? tooltip : DEFAULT_ARIA_LABEL;
1033
- const ariaLabel = rest["aria-label"] ?? (children == null ? defaultAriaLabel : void 0);
1034
- return /* @__PURE__ */ jsx(
1035
- Clipboard2,
1036
- {
1037
- asChild: true,
1038
- tooltip,
1039
- tooltipPlacement,
1040
- tooltipVariant,
1041
- text,
1042
- children: /* @__PURE__ */ jsxs(Button, { ...rest, "aria-label": ariaLabel, variant, disabled: !text, children: [
1043
- icon,
1044
- children
1045
- ] })
1046
- }
1047
- );
1048
- };
1049
- }
1050
- });
1051
-
1052
- // src/blocks/ClipboardButton/index.ts
1053
- var init_ClipboardButton2 = __esm({
1054
- "src/blocks/ClipboardButton/index.ts"() {
1055
- init_ClipboardButton();
1056
- }
1057
- });
1058
- var MIN_SCALE, MAX_SCALE, ZOOM_STEP, ZoomableSvg;
1059
- var init_ZoomableSvg = __esm({
1060
- "src/components/ZoomableSvg/ZoomableSvg.tsx"() {
1061
- init_ClipboardButton2();
1062
- init_icons();
1063
- init_utils2();
1064
- init_Button2();
1065
- init_Tooltip2();
1066
- MIN_SCALE = 0.5;
1067
- MAX_SCALE = 3;
1068
- ZOOM_STEP = 0.1;
1069
- ZoomableSvg = ({
1070
- html,
1071
- copyText,
1072
- className,
1073
- allowForeignObject,
1074
- renderActions
1075
- }) => {
1076
- const safeHtml = useMemo(
1077
- () => DOMPurify.sanitize(html, {
1078
- USE_PROFILES: { svg: true, svgFilters: true },
1079
- ...allowForeignObject ? { ADD_TAGS: ["foreignObject"] } : {}
1080
- }),
1081
- [html, allowForeignObject]
1082
- );
1083
- const containerRef = useRef(null);
1084
- const [scale, setScale] = useState(1);
1085
- const [translate, setTranslate] = useState({ x: 0, y: 0 });
1086
- const [isFullscreen, setIsFullscreen] = useState(false);
1087
- useEffect(() => {
1088
- if (!isFullscreen) return;
1089
- const onKeyDown = (e) => {
1090
- if (e.key === "Escape") {
1091
- e.stopPropagation();
1092
- setIsFullscreen(false);
1093
- }
1094
- };
1095
- document.addEventListener("keydown", onKeyDown, { capture: true });
1096
- return () => document.removeEventListener("keydown", onKeyDown, { capture: true });
1097
- }, [isFullscreen]);
1098
- const dragRef = useRef(null);
1099
- useEffect(() => {
1100
- const el = containerRef.current;
1101
- if (!el) return;
1102
- const onWheel = (e) => {
1103
- if (!e.ctrlKey && !e.metaKey) return;
1104
- e.preventDefault();
1105
- const delta = e.deltaY > 0 ? -ZOOM_STEP : ZOOM_STEP;
1106
- setScale((s) => Math.min(MAX_SCALE, Math.max(MIN_SCALE, s + delta)));
1107
- };
1108
- el.addEventListener("wheel", onWheel, { passive: false });
1109
- return () => el.removeEventListener("wheel", onWheel);
1110
- }, [isFullscreen]);
1111
- const didDragRef = useRef(false);
1112
- const handleMouseDown = useCallback(
1113
- (e) => {
1114
- if (e.button !== 0) return;
1115
- e.preventDefault();
1116
- didDragRef.current = false;
1117
- dragRef.current = {
1118
- startX: e.clientX,
1119
- startY: e.clientY,
1120
- startTx: translate.x,
1121
- startTy: translate.y
1122
- };
1123
- },
1124
- [translate]
1125
- );
1126
- const handleMouseMove = useCallback((e) => {
1127
- if (!dragRef.current) return;
1128
- didDragRef.current = true;
1129
- setTranslate({
1130
- x: dragRef.current.startTx + e.clientX - dragRef.current.startX,
1131
- y: dragRef.current.startTy + e.clientY - dragRef.current.startY
1132
- });
1133
- }, []);
1134
- const handleMouseUp = useCallback(() => {
1135
- dragRef.current = null;
1136
- }, []);
1137
- const handleReset = useCallback(() => {
1138
- setScale(1);
1139
- setTranslate({ x: 0, y: 0 });
1140
- }, []);
1141
- const isZoomed = Math.abs(scale - 1) > 1e-3 || translate.x !== 0 || translate.y !== 0;
1142
- const handleClick = useCallback((e) => {
1143
- if (didDragRef.current) {
1144
- e.stopPropagation();
1145
- }
1146
- }, []);
1147
- const stopPropagation = useCallback((e) => {
1148
- e.stopPropagation();
1149
- }, []);
1150
- const diagramContent = /* @__PURE__ */ jsxs(
1151
- "div",
1152
- {
1153
- role: "presentation",
1154
- className: cn("tw:group/zoom tw:relative", isFullscreen && "tw:h-full"),
1155
- onClick: handleClick,
1156
- children: [
1157
- /* @__PURE__ */ jsx(
1158
- "div",
1159
- {
1160
- role: "presentation",
1161
- ref: containerRef,
1162
- className: cn(
1163
- "tw:overflow-hidden tw:cursor-grab tw:active:cursor-grabbing tw:p-3",
1164
- isFullscreen && "tw:h-full"
1165
- ),
1166
- onMouseDown: handleMouseDown,
1167
- onMouseMove: handleMouseMove,
1168
- onMouseUp: handleMouseUp,
1169
- onMouseLeave: handleMouseUp,
1170
- children: /* @__PURE__ */ jsx(
1171
- "div",
1172
- {
1173
- className: cn(
1174
- "tw:flex tw:justify-center tw:origin-center",
1175
- isFullscreen && "tw:h-full tw:[&>svg]:h-full"
1176
- ),
1177
- style: { transform: `translate(${translate.x}px, ${translate.y}px) scale(${scale})` },
1178
- dangerouslySetInnerHTML: { __html: safeHtml }
1179
- }
1180
- )
1181
- }
1182
- ),
1183
- /* @__PURE__ */ jsxs(
1184
- "div",
1185
- {
1186
- role: "presentation",
1187
- 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",
1188
- onClick: stopPropagation,
1189
- children: [
1190
- isZoomed && /* @__PURE__ */ jsx(Tooltip, { tooltip: "Reset zoom", placement: "top", triggerAsChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "outline", onClick: handleReset, children: "Reset" }) }),
1191
- copyText && /* @__PURE__ */ jsx(ClipboardButton, { text: copyText, tooltip: "Copy code", size: "icon-sm", variant: "outline" }),
1192
- renderActions?.(safeHtml),
1193
- /* @__PURE__ */ jsx(
1194
- Tooltip,
1195
- {
1196
- tooltip: isFullscreen ? "Exit fullscreen" : "Fullscreen",
1197
- placement: "top",
1198
- triggerAsChild: true,
1199
- children: /* @__PURE__ */ jsx(
1200
- Button,
1201
- {
1202
- size: "icon-sm",
1203
- variant: "outline",
1204
- "aria-label": isFullscreen ? "Exit fullscreen" : "Fullscreen",
1205
- onClick: () => setIsFullscreen((f) => !f),
1206
- children: isFullscreen ? /* @__PURE__ */ jsx(Minimize2, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Maximize2, { className: "tw:size-4" })
1207
- }
1208
- )
1209
- }
1210
- )
1211
- ]
1212
- }
1213
- )
1214
- ]
1215
- }
1216
- );
1217
- if (isFullscreen) {
1218
- return createPortal(
1219
- /* @__PURE__ */ jsx(
1220
- "div",
1221
- {
1222
- role: "presentation",
1223
- "data-testid": "zoomable-svg-fullscreen",
1224
- className: "tw:fixed tw:inset-0 tw:z-[1060] tw:bg-muted tw:p-4 tailwindcss-preflight",
1225
- onClick: stopPropagation,
1226
- children: diagramContent
1227
- }
1228
- ),
1229
- document.body
1230
- );
1231
- }
1232
- return /* @__PURE__ */ jsx(
1233
- "div",
1234
- {
1235
- className: cn(
1236
- "tw:overflow-hidden tw:rounded-md tw:border tw:border-border tw:bg-muted",
1237
- className
1238
- ),
1239
- children: diagramContent
1240
- }
1241
- );
1242
- };
1243
- }
1244
- });
1245
-
1246
- // src/components/ZoomableSvg/index.ts
1247
- var init_ZoomableSvg2 = __esm({
1248
- "src/components/ZoomableSvg/index.ts"() {
1249
- init_ZoomableSvg();
1250
- }
1251
- });
1252
- var DiagramSkeleton;
1253
- var init_DiagramSkeleton = __esm({
1254
- "src/blocks/MermaidDiagram/DiagramSkeleton.tsx"() {
1255
- init_Skeleton();
1256
- 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" }) });
1257
- }
1258
- });
1259
-
1260
- // src/blocks/MermaidDiagram/svgTransforms.ts
1261
- var HTML_TAG, FOREIGN_OBJECT, ROOT_SVG_TAG, flattenForeignObjectLabels, STYLE_ATTR, makeResponsive;
1262
- var init_svgTransforms = __esm({
1263
- "src/blocks/MermaidDiagram/svgTransforms.ts"() {
1264
- HTML_TAG = /<[^>]+>/g;
1265
- FOREIGN_OBJECT = /(<foreignObject\b[^>]*>)([\s\S]*?)(<\/foreignObject>)/g;
1266
- ROOT_SVG_TAG = /^(\s*<svg\b)([^>]*)(>)/i;
1267
- flattenForeignObjectLabels = (svg) => svg.replace(FOREIGN_OBJECT, (_match, open, inner, close) => {
1268
- const text = inner.replace(HTML_TAG, " ").replace(/\s+/g, " ").trim();
1269
- return `${open}${text}${close}`;
1270
- });
1271
- STYLE_ATTR = /\s+style="([^"]*)"/i;
1272
- makeResponsive = (svgString) => {
1273
- const viewBoxMatch = svgString.match(/viewBox="[^"]*\s([\d.]+)\s[\d.]+"/);
1274
- const vbWidth = viewBoxMatch ? Math.round(Number(viewBoxMatch[1])) : void 0;
1275
- return svgString.replace(ROOT_SVG_TAG, (_match, open, attrs, close) => {
1276
- const existingStyle = attrs.match(STYLE_ATTR)?.[1] ?? "";
1277
- const styleDecls = existingStyle.replace(/max-width:\s*[^;"]*;?\s*/gi, "").replace(/\s+/g, " ").trim().replace(/;$/, "");
1278
- let nextAttrs = attrs.replace(/\s+width="[^"]*"/i, "").replace(/\s+height="[^"]*"/i, "").replace(STYLE_ATTR, "");
1279
- nextAttrs += ' width="100%"';
1280
- const styleParts = [styleDecls, vbWidth ? `max-width: ${vbWidth}px` : ""].filter(Boolean).join("; ");
1281
- if (styleParts) nextAttrs += ` style="${styleParts}"`;
1282
- return `${open}${nextAttrs}${close}`;
1283
- });
1284
- };
1285
- }
1286
- });
1287
-
1288
- // src/blocks/MermaidDiagram/MermaidDiagram.tsx
1289
- var MermaidDiagram_exports = {};
1290
- __export(MermaidDiagram_exports, {
1291
- MermaidDiagram: () => MermaidDiagram
1292
- });
1293
- var PRIMARY_FALLBACK_CHANNELS, resolvePrimary, mermaidPromise, registerLucideIconPack, getMermaid, stripFontImports, hasIconSyntax, tryFastRender, RENDER_DEBOUNCE_MS, svgCache, resolveSyncSvg, MermaidDiagram;
1294
- var init_MermaidDiagram = __esm({
1295
- "src/blocks/MermaidDiagram/MermaidDiagram.tsx"() {
1296
- init_ZoomableSvg2();
1297
- init_utils2();
1298
- init_DiagramSkeleton();
1299
- init_svgTransforms();
1300
- PRIMARY_FALLBACK_CHANNELS = "31 143 255";
1301
- resolvePrimary = () => {
1302
- const channels = typeof document === "undefined" ? PRIMARY_FALLBACK_CHANNELS : getComputedStyle(document.documentElement).getPropertyValue("--primary").trim() || PRIMARY_FALLBACK_CHANNELS;
1303
- return `rgb(${channels})`;
1304
- };
1305
- mermaidPromise = null;
1306
- registerLucideIconPack = (m) => {
1307
- m.registerIconPacks([
1308
- {
1309
- name: "lucide",
1310
- loader: () => import('@iconify-json/lucide/icons.json').then((mod) => mod.default)
1311
- }
1312
- ]);
1313
- };
1314
- getMermaid = () => {
1315
- if (!mermaidPromise) {
1316
- mermaidPromise = import('mermaid').then((m) => {
1317
- registerLucideIconPack(m.default);
1318
- m.default.initialize({
1319
- startOnLoad: false,
1320
- securityLevel: "strict",
1321
- theme: "base",
1322
- themeVariables: {
1323
- primaryColor: colors.blue[100],
1324
- primaryTextColor: colors.neutral[800],
1325
- primaryBorderColor: colors.blue[700],
1326
- secondaryColor: colors.white,
1327
- secondaryTextColor: colors.neutral[800],
1328
- secondaryBorderColor: colors.neutral[150],
1329
- tertiaryColor: colors.warning[100],
1330
- tertiaryTextColor: colors.neutral[800],
1331
- tertiaryBorderColor: colors.warning[500],
1332
- lineColor: colors.neutral[300],
1333
- textColor: colors.neutral[800],
1334
- mainBkg: colors.blue[100],
1335
- nodeBorder: colors.blue[700],
1336
- clusterBkg: colors.white,
1337
- clusterBorder: colors.neutral[150],
1338
- titleColor: colors.neutral[800],
1339
- edgeLabelBackground: colors.white,
1340
- nodeTextColor: colors.neutral[800],
1341
- actorBorder: colors.blue[700],
1342
- actorBkg: colors.blue[100],
1343
- actorTextColor: colors.neutral[800],
1344
- actorLineColor: colors.neutral[300],
1345
- signalColor: colors.neutral[800],
1346
- signalTextColor: colors.neutral[800],
1347
- labelBoxBkgColor: colors.blue[100],
1348
- labelBoxBorderColor: colors.blue[700],
1349
- labelTextColor: colors.neutral[800],
1350
- loopTextColor: colors.neutral[800],
1351
- noteBorderColor: colors.warning[500],
1352
- noteBkgColor: colors.warning[100],
1353
- noteTextColor: colors.neutral[800],
1354
- sectionBkgColor: colors.blue[100],
1355
- altSectionBkgColor: colors.white,
1356
- sectionBkgColor2: colors.neutral[100],
1357
- taskBorderColor: colors.blue[700],
1358
- taskBkgColor: colors.blue[100],
1359
- taskTextColor: colors.neutral[800],
1360
- taskTextDarkColor: colors.neutral[800],
1361
- taskTextLightColor: colors.neutral[800],
1362
- activeTaskBorderColor: resolvePrimary(),
1363
- activeTaskBkgColor: colors.blue[200],
1364
- doneTaskBorderColor: colors.green[600],
1365
- doneTaskBkgColor: colors.green[100],
1366
- critBorderColor: colors.error[500],
1367
- critBkgColor: colors.error[100],
1368
- fontFamily: "Inter, system-ui, sans-serif",
1369
- fontSize: "14px"
1370
- }
1371
- });
1372
- return m;
1373
- }).catch((err) => {
1374
- mermaidPromise = null;
1375
- throw err;
1376
- });
1377
- }
1378
- return mermaidPromise;
1379
- };
1380
- stripFontImports = (svg) => svg.replace(/@import\s+url\([^)]*fonts\.googleapis\.com[^)]*\);?\s*/g, "");
1381
- hasIconSyntax = (code) => /@\{[^}]*\bicon\s*:/.test(code) || /\b(?:icon|service|group)\b[^\n(]*\(\s*[\w-]+:/.test(code) || /\bfa[bslr]?:fa-/.test(code);
1382
- tryFastRender = (code) => {
1383
- if (hasIconSyntax(code)) return null;
1384
- try {
1385
- return stripFontImports(
1386
- renderMermaidSVG(code, {
1387
- bg: colors.white,
1388
- fg: colors.neutral[800],
1389
- transparent: true,
1390
- font: "Inter, system-ui, sans-serif"
1391
- })
1392
- );
1393
- } catch (err) {
1394
- console.debug("[MermaidDiagram] fast render unavailable, using async fallback:", err);
1395
- return null;
1396
- }
1397
- };
1398
- RENDER_DEBOUNCE_MS = 300;
1399
- svgCache = /* @__PURE__ */ new Map();
1400
- resolveSyncSvg = (code) => {
1401
- const cached = svgCache.get(code);
1402
- if (cached) return cached;
1403
- const fast = tryFastRender(code);
1404
- if (fast) svgCache.set(code, fast);
1405
- return fast;
1406
- };
1407
- MermaidDiagram = ({ code, renderActions }) => {
1408
- const id = useId();
1409
- const [svg, setSvg] = useState(() => resolveSyncSvg(code));
1410
- const [renderFailed, setRenderFailed] = useState(false);
1411
- const debounceRef = useRef(null);
1412
- const renderIdRef = useRef(0);
1413
- const [prevCode, setPrevCode] = useState(code);
1414
- if (code !== prevCode) {
1415
- setPrevCode(code);
1416
- setSvg(resolveSyncSvg(code));
1417
- setRenderFailed(false);
1418
- }
1419
- useEffect(() => {
1420
- if (svgCache.has(code)) return;
1421
- const currentRenderId = ++renderIdRef.current;
1422
- if (debounceRef.current) {
1423
- clearTimeout(debounceRef.current);
1424
- }
1425
- debounceRef.current = setTimeout(() => {
1426
- getMermaid().then(async (mermaidModule) => {
1427
- if (renderIdRef.current !== currentRenderId) return;
1428
- const rendererId = `mermaid-${id.replaceAll(":", "")}`;
1429
- const container = document.createElement("div");
1430
- container.style.visibility = "hidden";
1431
- container.style.position = "absolute";
1432
- container.style.top = "-9999px";
1433
- container.style.width = "900px";
1434
- document.body.appendChild(container);
1435
- try {
1436
- const result = await mermaidModule.default.render(rendererId, code, container);
1437
- if (renderIdRef.current === currentRenderId && result) {
1438
- const svgOutput = flattenForeignObjectLabels(result.svg);
1439
- svgCache.set(code, svgOutput);
1440
- setSvg(svgOutput);
1441
- setRenderFailed(false);
1442
- }
1443
- } finally {
1444
- container.remove();
1445
- }
1446
- }).catch((err) => {
1447
- if (renderIdRef.current === currentRenderId) {
1448
- console.error("[MermaidDiagram] fallback failed:", err);
1449
- setSvg(null);
1450
- setRenderFailed(true);
1451
- }
1452
- });
1453
- }, RENDER_DEBOUNCE_MS);
1454
- const timer = debounceRef.current;
1455
- const renderId = renderIdRef;
1456
- return () => {
1457
- renderId.current++;
1458
- if (timer) {
1459
- clearTimeout(timer);
1460
- }
1461
- };
1462
- }, [code, id]);
1463
- const processedSvg = svg ? makeResponsive(svg) : null;
1464
- if (renderFailed) {
1465
- return /* @__PURE__ */ jsx(
1466
- "pre",
1467
- {
1468
- className: cn(
1469
- "tw:my-3 tw:overflow-auto tw:whitespace-pre-wrap tw:break-all",
1470
- "tw:py-3 tw:px-4",
1471
- "tw:bg-neutral-50",
1472
- "tw:rounded-md tw:text-neutral-400",
1473
- "tw:text-sm tw:font-mono"
1474
- ),
1475
- children: /* @__PURE__ */ jsx("code", { children: code })
1476
- }
1477
- );
1478
- }
1479
- if (processedSvg) {
1480
- return /* @__PURE__ */ jsx(
1481
- ZoomableSvg,
1482
- {
1483
- html: processedSvg,
1484
- copyText: `\`\`\`mermaid
1485
- ${code}
1486
- \`\`\``,
1487
- className: "tw:my-3",
1488
- allowForeignObject: true,
1489
- renderActions
1490
- },
1491
- code
1492
- );
1493
- }
1494
- return /* @__PURE__ */ jsx(DiagramSkeleton, {});
1495
- };
1496
- }
1497
- });
1498
34
 
1499
- // src/blocks/MarkdownEditor/MarkdownEditor.tsx
1500
- init_utils2();
1501
35
  var ImageRendererContext = createContext(null);
1502
36
  var ImageRendererProvider = ImageRendererContext;
1503
37
  var useImageRenderer = () => use(ImageRendererContext);
@@ -1591,11 +125,8 @@ var $createImageNode = (src, altText) => {
1591
125
  var $isImageNode = (node) => {
1592
126
  return node instanceof ImageNode;
1593
127
  };
1594
-
1595
- // src/blocks/MarkdownEditor/nodes/MermaidNodeComponent.tsx
1596
- init_Skeleton();
1597
- var MermaidDiagram2 = lazy(
1598
- () => Promise.resolve().then(() => (init_MermaidDiagram(), MermaidDiagram_exports)).then(
128
+ var MermaidDiagram = lazy(
129
+ () => import('./MermaidDiagram-EOKJHQQV.js').then(
1599
130
  (m) => ({ default: m.MermaidDiagram }),
1600
131
  (error) => {
1601
132
  console.error("[MarkdownEditor] failed to load MermaidDiagram chunk", error);
@@ -1610,7 +141,7 @@ var MermaidNodeComponent = ({ code }) => {
1610
141
  Suspense,
1611
142
  {
1612
143
  fallback: /* @__PURE__ */ jsx("div", { className: "tw:my-3 tw:overflow-hidden tw:rounded-card tw:border tw:border-neutral-150 tw:bg-neutral-50 tw:p-6", children: /* @__PURE__ */ jsx(Skeleton, { className: "tw:h-40" }) }),
1613
- children: /* @__PURE__ */ jsx(MermaidDiagram2, { code })
144
+ children: /* @__PURE__ */ jsx(MermaidDiagram, { code })
1614
145
  }
1615
146
  );
1616
147
  };
@@ -1664,343 +195,33 @@ var $createMermaidNode = (code) => {
1664
195
  var $isMermaidNode = (node) => {
1665
196
  return node instanceof MermaidNode;
1666
197
  };
1667
-
1668
- // src/components/Toast/toast.tsx
1669
- init_utils2();
1670
-
1671
- // src/components/Toast/ToastRoot.tsx
1672
- init_icons();
1673
- init_utils2();
1674
- init_context();
1675
-
1676
- // src/components/Toast/ToastAction.tsx
1677
- init_utils2();
1678
- var ToastAction = ({ ref, className, ...rest }) => /* @__PURE__ */ jsx(
1679
- "button",
1680
- {
1681
- ...rest,
1682
- ref,
1683
- "data-slot": "toast-action",
1684
- type: "button",
1685
- className: cn(
1686
- // layout
1687
- "tw:col-start-3",
1688
- "tw:row-start-1",
1689
- "tw:flex",
1690
- "tw:items-center",
1691
- "tw:justify-center",
1692
- // font
1693
- "tw:text-xs",
1694
- "tw:font-medium",
1695
- "tw:text-primary",
1696
- // sizing
1697
- "tw:px-2",
1698
- "tw:h-6",
1699
- // styles
1700
- "tw:bg-primary-foreground",
1701
- "tw:rounded",
1702
- className
1703
- )
1704
- }
1705
- );
1706
-
1707
- // src/components/Toast/ToastDescription.tsx
1708
- init_utils2();
1709
- var ToastDescription = ({ ref, className, children, ...rest }) => /* @__PURE__ */ jsx(
1710
- "div",
1711
- {
1712
- ref,
1713
- "data-slot": "toast-description",
1714
- className: cn(
1715
- "tw:col-start-2",
1716
- "tw:font-normal",
1717
- "tw:break-words",
1718
- "tw:text-white",
1719
- "tw:group-data-[variant=default]/toast:text-muted-foreground",
1720
- className
1721
- ),
1722
- ...rest,
1723
- children
1724
- }
1725
- );
1726
-
1727
- // src/components/Toast/ToastDismiss.tsx
1728
- init_icons();
1729
- init_utils2();
1730
- var ToastDismiss = ({ ref, className, ...rest }) => /* @__PURE__ */ jsxs(
1731
- "button",
1732
- {
1733
- ref,
1734
- "data-slot": "toast-dismiss",
1735
- className: cn(
1736
- "tw:flex",
1737
- "tw:justify-center",
1738
- "tw:col-start-4",
1739
- "tw:row-start-1",
1740
- "tailwindcss-preflight",
1741
- "tw:[&_svg]:aspect-square",
1742
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
1743
- "tw:[&_svg]:m-1",
1744
- "tw:text-white",
1745
- "tw:group-data-[variant=default]/toast:[&_svg]:text-popover-foreground",
1746
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:[&_svg]:text-foreground",
1747
- className
1748
- ),
1749
- type: "button",
1750
- ...rest,
1751
- children: [
1752
- /* @__PURE__ */ jsx(X, {}),
1753
- /* @__PURE__ */ jsx("span", { className: "tw:sr-only", children: "Dismiss" })
1754
- ]
198
+ var ACCEPTED_IMAGE_TYPES = [
199
+ "image/png",
200
+ "image/jpeg",
201
+ "image/gif",
202
+ "image/webp",
203
+ "image/svg+xml"
204
+ ];
205
+ var MAX_IMAGE_SIZE = 10 * 1024 * 1024;
206
+ var PLACEHOLDER_PREFIX = "upload-placeholder-";
207
+ var generatePlaceholderId = () => {
208
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
209
+ return crypto.randomUUID();
1755
210
  }
1756
- );
1757
-
1758
- // src/components/Toast/ToastDuration.tsx
1759
- init_utils2();
1760
- var ToastDuration = ({ ref, duration, className, style, ...rest }) => /* @__PURE__ */ jsx(
1761
- "span",
1762
- {
1763
- ...rest,
1764
- ref,
1765
- className: cn(
1766
- "tw:bg-white/30",
1767
- "tw:group-data-[variant=default]/toast:bg-popover-foreground/20",
1768
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:bg-foreground/20",
1769
- "tw:rounded-bl-lg",
1770
- "tw:mx-px",
1771
- // positioning
1772
- "tw:absolute",
1773
- "tw:bottom-0",
1774
- "tw:left-0",
1775
- // sizing
1776
- "tw:h-1",
1777
- // animation
1778
- "tw:animate-toast-progress",
1779
- "tw:group-hover/toast:[animation-play-state:paused]",
1780
- className
1781
- ),
1782
- style: {
1783
- animationDuration: `${duration}ms`,
1784
- ...style
211
+ return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
212
+ };
213
+ var isAcceptedImageType = (type) => ACCEPTED_IMAGE_TYPES.includes(type);
214
+ var getImageFilesFromDataTransfer = (dataTransfer) => {
215
+ if (!dataTransfer) return [];
216
+ if (dataTransfer.items.length > 0) {
217
+ const files = [];
218
+ for (const item of dataTransfer.items) {
219
+ if (item.kind === "file" && isAcceptedImageType(item.type)) {
220
+ const file = item.getAsFile();
221
+ if (file) files.push(file);
222
+ }
1785
223
  }
1786
- }
1787
- );
1788
-
1789
- // src/components/Toast/ToastTitle.tsx
1790
- init_utils2();
1791
- var ToastTitle = ({ ref, className, children, ...rest }) => /* @__PURE__ */ jsx(
1792
- "div",
1793
- {
1794
- ref,
1795
- "data-slot": "toast-title",
1796
- className: cn(
1797
- "tw:col-start-2",
1798
- "tw:text-sm",
1799
- "tw:leading-6",
1800
- "tw:min-h-6",
1801
- "tw:self-center",
1802
- "tw:text-white",
1803
- "tw:group-data-[variant=default]/toast:text-popover-foreground",
1804
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground",
1805
- "tw:break-words",
1806
- "tw:font-medium",
1807
- className
1808
- ),
1809
- ...rest,
1810
- children
1811
- }
1812
- );
1813
- var variants2 = cva(
1814
- [
1815
- "tailwindcss-preflight",
1816
- "tw:group/toast",
1817
- "tw:relative",
1818
- // layout
1819
- "tw:grid",
1820
- "tw:grid-cols-[0_1fr_auto_auto]",
1821
- "tw:items-start",
1822
- "tw:has-[[data-slot=toast-description]]:grid-rows-[auto_auto]",
1823
- "tw:has-[[data-slot=toast-icon]]:grid-cols-[auto_1fr_auto_auto]",
1824
- "tw:[&_[data-slot=toast-icon]]:mr-2",
1825
- "tw:[&_[data-slot=toast-title]]:mr-2.5",
1826
- "tw:[&_[data-slot=toast-description]]:mr-2.5",
1827
- "tw:[&_[data-slot=toast-action]]:mr-2",
1828
- "tw:[&_[data-slot=toast-description]]:col-end-3",
1829
- "tw:gap-y-0",
1830
- // styles
1831
- "tw:p-4",
1832
- "tw:rounded-lg",
1833
- "tw:shadow-md"
1834
- ],
1835
- {
1836
- defaultVariants: {
1837
- variant: "info"
1838
- },
1839
- variants: {
1840
- variant: {
1841
- default: "tw:border tw:border-border tw:bg-popover",
1842
- error: "tw:bg-error-550",
1843
- info: "tw:bg-blue-600",
1844
- success: "tw:bg-green-700",
1845
- warning: "tw:bg-warning-550"
1846
- }
1847
- }
1848
- }
1849
- );
1850
- var DEFAULT_VARIANT_ICON = {
1851
- error: /* @__PURE__ */ jsx(AlertTriangle, {}),
1852
- info: /* @__PURE__ */ jsx(Info, {}),
1853
- success: /* @__PURE__ */ jsx(CircleCheck, {}),
1854
- warning: /* @__PURE__ */ jsx(AlertCircle, {})
1855
- };
1856
- var ToastRoot = ({
1857
- id,
1858
- title,
1859
- description,
1860
- action,
1861
- duration = Infinity,
1862
- variant = "info",
1863
- loading = false,
1864
- icon: iconProp
1865
- }) => {
1866
- const renderArgo = useArgoDesign();
1867
- const icon = (() => {
1868
- if (loading) return /* @__PURE__ */ jsx(Loader2, { className: "tw:animate-spin" });
1869
- if (iconProp) return iconProp;
1870
- if (variant === "default" || variant === null) return null;
1871
- return DEFAULT_VARIANT_ICON[variant];
1872
- })();
1873
- const handleActionClick = (event) => {
1874
- toast$1.dismiss(id);
1875
- action?.onClick(event);
1876
- };
1877
- return /* @__PURE__ */ jsxs(
1878
- "div",
1879
- {
1880
- "data-variant": variant,
1881
- "data-argo": renderArgo,
1882
- className: cn(
1883
- variants2({ variant }),
1884
- "tw:data-[variant=default]:data-[argo=true]:bg-background"
1885
- ),
1886
- children: [
1887
- icon && /* @__PURE__ */ jsx(
1888
- "span",
1889
- {
1890
- "data-slot": "toast-icon",
1891
- className: cn(
1892
- "tw:inline-flex",
1893
- "tw:items-center",
1894
- "tw:justify-center",
1895
- "tw:self-center",
1896
- "tw:aspect-square",
1897
- "tw:size-5",
1898
- "tw:shrink-0",
1899
- 'tw:[&_svg:not([class*="tw:size-"])]:size-5',
1900
- "tw:text-white",
1901
- "tw:group-data-[variant=default]/toast:text-popover-foreground",
1902
- "tw:group-data-[variant=default]/toast:group-data-[argo=true]/toast:text-foreground"
1903
- ),
1904
- children: icon
1905
- }
1906
- ),
1907
- /* @__PURE__ */ jsx(ToastTitle, { children: title }),
1908
- description && /* @__PURE__ */ jsx(ToastDescription, { children: description }),
1909
- action && /* @__PURE__ */ jsx(ToastAction, { style: action?.actionButtonStyle, onClick: handleActionClick, children: action.label }),
1910
- /* @__PURE__ */ jsx(ToastDismiss, { onClick: () => toast$1.dismiss(id) }),
1911
- duration !== Infinity && /* @__PURE__ */ jsx(ToastDuration, { duration })
1912
- ]
1913
- }
1914
- );
1915
- };
1916
- var toast = ({
1917
- onAutoClose,
1918
- onDismiss,
1919
- testId,
1920
- toasterId,
1921
- dismissible = true,
1922
- position,
1923
- title: titleProp,
1924
- ...toast2
1925
- }) => {
1926
- const duration = (() => {
1927
- if (typeof toast2.duration === "number") return toast2.duration;
1928
- if (toast2.variant === "error" || toast2.variant === "warning") return Infinity;
1929
- return toast2.duration ?? 5e3;
1930
- })();
1931
- const renderCustomToast = (id) => {
1932
- const title = typeof titleProp === "function" ? titleProp({ dismiss: () => toast$1.dismiss(id) }) : titleProp;
1933
- return /* @__PURE__ */ jsx(ToastRoot, { ...toast2, id, title, duration });
1934
- };
1935
- return toast$1.custom(renderCustomToast, {
1936
- // toast generated by sonner will always have an id, but we want to allow users to specify their own id if they want to
1937
- // can not pass undefined, as it will break dismiss
1938
- ...toast2.id != null ? { id: toast2.id } : {},
1939
- unstyled: true,
1940
- position,
1941
- onAutoClose,
1942
- onDismiss,
1943
- testId,
1944
- toasterId,
1945
- dismissible,
1946
- duration,
1947
- // override default focus-visible styles to match our design
1948
- className: cn("tw:rounded-lg", "tw:focus-visible:!ring-4", "tw:focus-visible:!ring-ring/50")
1949
- });
1950
- };
1951
- toast.success = (title, options) => toast({
1952
- ...options,
1953
- title,
1954
- variant: "success"
1955
- });
1956
- toast.error = (title, options) => toast({
1957
- ...options,
1958
- title,
1959
- variant: "error",
1960
- duration: options?.duration ?? Infinity
1961
- });
1962
- toast.warning = (title, options) => toast({
1963
- ...options,
1964
- title,
1965
- variant: "warning",
1966
- duration: options?.duration ?? Infinity
1967
- });
1968
- toast.info = (title, options) => toast({
1969
- ...options,
1970
- title,
1971
- variant: "info"
1972
- });
1973
- toast.dismiss = (toastId) => toast$1.dismiss(toastId);
1974
- toast.dismissAll = () => toast$1.dismiss();
1975
-
1976
- // src/blocks/MarkdownEditor/plugins/ImagePastePlugin.tsx
1977
- var ACCEPTED_IMAGE_TYPES = [
1978
- "image/png",
1979
- "image/jpeg",
1980
- "image/gif",
1981
- "image/webp",
1982
- "image/svg+xml"
1983
- ];
1984
- var MAX_IMAGE_SIZE = 10 * 1024 * 1024;
1985
- var PLACEHOLDER_PREFIX = "upload-placeholder-";
1986
- var generatePlaceholderId = () => {
1987
- if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
1988
- return crypto.randomUUID();
1989
- }
1990
- return `${Date.now()}-${Math.random().toString(36).slice(2)}`;
1991
- };
1992
- var isAcceptedImageType = (type) => ACCEPTED_IMAGE_TYPES.includes(type);
1993
- var getImageFilesFromDataTransfer = (dataTransfer) => {
1994
- if (!dataTransfer) return [];
1995
- if (dataTransfer.items.length > 0) {
1996
- const files = [];
1997
- for (const item of dataTransfer.items) {
1998
- if (item.kind === "file" && isAcceptedImageType(item.type)) {
1999
- const file = item.getAsFile();
2000
- if (file) files.push(file);
2001
- }
2002
- }
2003
- if (files.length > 0) return files;
224
+ if (files.length > 0) return files;
2004
225
  }
2005
226
  return Array.from(dataTransfer.files).filter((file) => isAcceptedImageType(file.type));
2006
227
  };
@@ -2296,604 +517,6 @@ var MarkdownSyncPlugin = ({
2296
517
  }, [editor]);
2297
518
  return null;
2298
519
  };
2299
-
2300
- // src/blocks/MarkdownEditor/plugins/ToolbarPlugin.tsx
2301
- init_icons();
2302
-
2303
- // src/components/DropdownMenu/DropdownMenu.tsx
2304
- init_context();
2305
-
2306
- // src/components/DropdownMenu/DropdownMenuCheckboxItem.tsx
2307
- init_icons();
2308
- init_utils2();
2309
-
2310
- // src/components/DropdownMenu/DropdownMenuItemIndicator.tsx
2311
- init_icons();
2312
- var variants3 = cva(
2313
- [
2314
- "tailwindcss-preflight",
2315
- "tw:pointer-events-none",
2316
- // sizing
2317
- "tw:size-4",
2318
- "tw:aspect-square",
2319
- "tw:shrink-0",
2320
- // layout
2321
- "tw:flex",
2322
- "tw:items-center",
2323
- "tw:justify-center"
2324
- ],
2325
- {
2326
- variants: {
2327
- variant: {
2328
- none: [],
2329
- radio: [
2330
- "tw:border",
2331
- "tw:border-solid",
2332
- "tw:border-border",
2333
- "tw:rounded-full",
2334
- "tw:group-data-[variant=default]/dropdown-menu-content:bg-white",
2335
- "tw:group-data-[variant=argo]/dropdown-menu-content:bg-background",
2336
- 'tw:[&_svg:not([class*="tw:size-"])]:size-2',
2337
- "tw:data-[state=unchecked]:[&_svg]:hidden",
2338
- // Lucide Circle is stroke-only — force fill to match the stroke
2339
- // (currentColor) so the indicator reads as a solid dot.
2340
- "tw:[&_svg]:fill-current",
2341
- "tw:group-data-[variant=argo]/dropdown-menu-content:[&_svg]:text-primary",
2342
- "tw:group-data-[variant=default]/dropdown-menu-content:[&_svg]:text-primary"
2343
- ],
2344
- check: ['tw:[&_svg:not([class*="tw:size-"])]:size-3.5', "tw:[&_svg]:text-primary"],
2345
- checkbox: [
2346
- "tw:[&_svg]:text-primary-foreground",
2347
- "tw:border",
2348
- "tw:border-solid",
2349
- "tw:rounded",
2350
- "tw:group-data-[variant=default]/dropdown-menu-content:border-neutral-200",
2351
- "tw:group-data-[variant=argo]/dropdown-menu-content:border-input",
2352
- 'tw:[&_svg:not([class*="tw:size-"])]:size-3',
2353
- "tw:data-[state=unchecked]:[&_svg]:hidden",
2354
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:border-primary",
2355
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary",
2356
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:border-primary",
2357
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:bg-primary"
2358
- ],
2359
- switch: [
2360
- "tw:size-5",
2361
- // Lucide SVGs default to 24×24 — constrain the rendered ToggleRight
2362
- // to the indicator slot so it doesn't overflow.
2363
- 'tw:[&_svg:not([class*="tw:size-"])]:size-5',
2364
- "tw:text-neutral-400",
2365
- "tw:data-[state=unchecked]:rotate-180",
2366
- "tw:group-data-[variant=default]/dropdown-menu-content:data-[state=checked]:text-primary",
2367
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:text-primary"
2368
- ]
2369
- }
2370
- }
2371
- }
2372
- );
2373
- var DropdownMenuItemIndicator = ({
2374
- variant,
2375
- className,
2376
- forceMount: forceMountProp,
2377
- ...rest
2378
- }) => {
2379
- const IconComp = (() => {
2380
- if (variant === "switch") return ToggleRight;
2381
- if (variant === "radio") return Circle;
2382
- return Check;
2383
- })();
2384
- const forceMount = (() => {
2385
- if (forceMountProp) return true;
2386
- return variant === "check" ? void 0 : true;
2387
- })();
2388
- if (variant === "none") return null;
2389
- return /* @__PURE__ */ jsx(
2390
- DropdownMenuPrimitive3.ItemIndicator,
2391
- {
2392
- ...rest,
2393
- forceMount,
2394
- className: variants3({ variant, className }),
2395
- children: /* @__PURE__ */ jsx(IconComp, {})
2396
- }
2397
- );
2398
- };
2399
-
2400
- // src/components/DropdownMenu/ItemIcon.tsx
2401
- init_utils2();
2402
- var ItemIcon = ({ className, children, ...props }) => /* @__PURE__ */ jsx(
2403
- "span",
2404
- {
2405
- ...props,
2406
- className: cn(
2407
- "tw:inline-flex",
2408
- "tw:items-center",
2409
- "tw:justify-center",
2410
- "tw:aspect-square",
2411
- // 20px container fits the 16px Lucide glyph plus 2px breathing room
2412
- // each side — the previous tw:size-4 + tw:p-0.5 clipped the 16px child.
2413
- "tw:size-5",
2414
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
2415
- "tw:group-data-[variant=default]/dropdown-menu-content:text-neutral-400",
2416
- "tw:group-data-[variant=argo]/dropdown-menu-content:text-primary",
2417
- "tw:group-data-[variant=argo]/dropdown-menu-content:group-aria-disabled:text-muted-foreground",
2418
- "tw:group-data-[variant=default]/dropdown-menu-content:group-hover:text-primary",
2419
- className
2420
- ),
2421
- children
2422
- }
2423
- );
2424
-
2425
- // src/components/DropdownMenu/styles.ts
2426
- init_utils2();
2427
- var itemVariants = cn(
2428
- // reset
2429
- "tailwindcss-preflight",
2430
- "tw:outline-hidden",
2431
- "tw:group",
2432
- "tw:peer",
2433
- "tw:relative",
2434
- // positioning
2435
- "tw:flex",
2436
- "tw:flex-1",
2437
- "tw:items-center",
2438
- "tw:gap-2",
2439
- "tw:cursor-pointer",
2440
- "tw:select-none",
2441
- "tw:transition-colors",
2442
- // spacing
2443
- "tw:p-2",
2444
- // typography
2445
- "tw:font-sans",
2446
- "tw:text-sm",
2447
- "tw:aria-disabled:pointer-events-none",
2448
- "tw:aria-disabled:opacity-50",
2449
- "tw:focus-visible:outline-hidden",
2450
- "tw:group-data-[variant=default]/dropdown-menu-content:rounded",
2451
- "tw:group-data-[variant=default]/dropdown-menu-content:focus:bg-neutral-100",
2452
- "tw:group-data-[variant=default]/dropdown-menu-content:focus:text-neutral-900",
2453
- "tw:group-data-[variant=default]/dropdown-menu-content:hover:bg-neutral-100",
2454
- "tw:group-data-[variant=default]/dropdown-menu-content:hover:text-neutral-900",
2455
- "tw:group-data-[variant=argo]/dropdown-menu-content:rounded-md",
2456
- "tw:group-data-[variant=argo]/dropdown-menu-content:text-popover-foreground",
2457
- "tw:group-data-[variant=argo]/dropdown-menu-content:focus:text-primary",
2458
- "tw:group-data-[variant=argo]/dropdown-menu-content:focus:bg-primary/10",
2459
- "tw:group-data-[variant=argo]/dropdown-menu-content:hover:text-primary",
2460
- "tw:group-data-[variant=argo]/dropdown-menu-content:hover:bg-primary/10"
2461
- );
2462
- var contentVariants = cn(
2463
- "tailwindcss-preflight",
2464
- "tw:group/dropdown-menu-content",
2465
- // Sit above Modal/Sheet (z-1051), matching the other floating overlays (Popover/Select z-1055)
2466
- "tw:z-[1055]",
2467
- // positioning
2468
- "tw:flex",
2469
- "tw:flex-col",
2470
- "tw:origin-(--radix-dropdown-menu-content-transform-origin)",
2471
- // sizing
2472
- "tw:max-h-[var(--radix-dropdown-menu-content-available-height)]",
2473
- "tw:min-w-32",
2474
- // border
2475
- "tw:border",
2476
- "tw:shadow-md",
2477
- // Legacy surface — fixed white panel.
2478
- "tw:data-[variant=default]:rounded-md",
2479
- "tw:data-[variant=default]:bg-white",
2480
- "tw:data-[variant=default]:border-neutral-100",
2481
- "tw:data-[variant=default]:text-neutral-800",
2482
- // Argo surface — semantic popover tokens (brand + dark aware).
2483
- "tw:data-[variant=argo]:rounded-2xl",
2484
- "tw:data-[variant=argo]:bg-popover",
2485
- "tw:data-[variant=argo]:text-popover-foreground",
2486
- "tw:data-[variant=argo]:border-border",
2487
- // animations
2488
- "tw:data-[state=open]:animate-in",
2489
- "tw:data-[state=open]:fade-in-0",
2490
- "tw:data-[state=open]:zoom-in-95",
2491
- "tw:data-[state=closed]:animate-out",
2492
- "tw:data-[state=closed]:fade-out-0",
2493
- "tw:data-[state=closed]:zoom-out-95",
2494
- "tw:data-[side=bottom]:slide-in-from-top-2",
2495
- "tw:data-[side=left]:slide-in-from-right-2",
2496
- "tw:data-[side=right]:slide-in-from-left-2",
2497
- "tw:data-[side=top]:slide-in-from-bottom-2"
2498
- );
2499
- var DropdownMenuCheckboxItem = ({
2500
- className,
2501
- children,
2502
- checked,
2503
- closeOnSelect = false,
2504
- onSelect,
2505
- indicatorAlign = "start",
2506
- indicator = "checkbox",
2507
- isLoading = false,
2508
- ...props
2509
- }) => {
2510
- const isAtStart = indicatorAlign === "start";
2511
- const indicatorEle = isLoading ? /* @__PURE__ */ jsx(ItemIcon, { className: isAtStart ? "" : "tw:ml-auto", children: /* @__PURE__ */ jsx(Loader2, { className: "tw:animate-spin" }) }) : /* @__PURE__ */ jsx(DropdownMenuItemIndicator, { variant: indicator, className: isAtStart ? "" : "tw:ml-auto" });
2512
- const handleSelect = (event) => {
2513
- if (!closeOnSelect) event.preventDefault();
2514
- onSelect?.(event);
2515
- };
2516
- return /* @__PURE__ */ jsxs(
2517
- DropdownMenuPrimitive3.CheckboxItem,
2518
- {
2519
- className: cn(itemVariants, className),
2520
- checked,
2521
- onSelect: handleSelect,
2522
- ...props,
2523
- children: [
2524
- isAtStart && indicatorEle,
2525
- children,
2526
- !isAtStart && indicatorEle
2527
- ]
2528
- }
2529
- );
2530
- };
2531
-
2532
- // src/components/DropdownMenu/DropdownMenuContent.tsx
2533
- init_utils2();
2534
-
2535
- // src/components/ScrollArea/ScrollArea.tsx
2536
- init_utils2();
2537
-
2538
- // src/components/ScrollArea/ScrollBar.tsx
2539
- init_utils2();
2540
- var ScrollBar = ({ className, orientation = "vertical", ...props }) => /* @__PURE__ */ jsx(
2541
- ScrollAreaPrimitive2.ScrollAreaScrollbar,
2542
- {
2543
- orientation,
2544
- className: cn(
2545
- "tw:flex tw:touch-none tw:select-none tw:transition-color",
2546
- {
2547
- "tw:h-full tw:w-2.5 tw:p-px": orientation === "vertical",
2548
- "tw:h-2.5 tw:flex-col tw:p-px": orientation === "horizontal"
2549
- },
2550
- className
2551
- ),
2552
- ...props,
2553
- children: /* @__PURE__ */ jsx(
2554
- ScrollAreaPrimitive2.ScrollAreaThumb,
2555
- {
2556
- className: cn(
2557
- "tw:relative",
2558
- "tw:flex-1",
2559
- "tw:rounded-full",
2560
- "tw:bg-border",
2561
- "tw:hover:bg-muted-foreground"
2562
- )
2563
- }
2564
- )
2565
- }
2566
- );
2567
- var ScrollArea = ({
2568
- ref,
2569
- className,
2570
- children,
2571
- viewPortClassName,
2572
- orientation,
2573
- scrollBarClassName,
2574
- ...props
2575
- }) => /* @__PURE__ */ jsxs(
2576
- ScrollAreaPrimitive2.Root,
2577
- {
2578
- "data-slot": "scroll-area",
2579
- className: cn(
2580
- "tw:peer/scroll-area tw:relative tw:overflow-hidden tw:focus-visible:outline-hidden",
2581
- className
2582
- ),
2583
- ...props,
2584
- children: [
2585
- /* @__PURE__ */ jsx(
2586
- ScrollAreaPrimitive2.Viewport,
2587
- {
2588
- ref,
2589
- className: cn(
2590
- "tw:h-full tw:w-full tw:rounded-[inherit] tw:focus-visible:outline-hidden",
2591
- viewPortClassName
2592
- ),
2593
- children
2594
- }
2595
- ),
2596
- orientation ? /* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2597
- /* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation: "vertical" }),
2598
- /* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation: "horizontal" })
2599
- ] }),
2600
- /* @__PURE__ */ jsx(ScrollAreaPrimitive2.Corner, {})
2601
- ]
2602
- }
2603
- );
2604
- var DropdownMenuContext = createContext({
2605
- variant: "default"
2606
- });
2607
- var useDropdownMenuContext = () => use(DropdownMenuContext);
2608
- var DropdownMenuContent = ({
2609
- className,
2610
- sideOffset = 4,
2611
- forceMount,
2612
- children,
2613
- viewPortClassName,
2614
- container,
2615
- ...props
2616
- }) => {
2617
- const { variant } = useDropdownMenuContext();
2618
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive3.Portal, { forceMount: forceMount || void 0, container, children: /* @__PURE__ */ jsx(
2619
- DropdownMenuPrimitive3.Content,
2620
- {
2621
- ...props,
2622
- "data-variant": variant,
2623
- sideOffset,
2624
- className: contentVariants,
2625
- children: /* @__PURE__ */ jsx(
2626
- ScrollArea,
2627
- {
2628
- className,
2629
- viewPortClassName: cn(
2630
- "tw:p-2",
2631
- "tw:max-h-[var(--radix-dropdown-menu-content-available-height)]",
2632
- viewPortClassName
2633
- ),
2634
- scrollBarClassName: "tw:w-1.5",
2635
- children
2636
- }
2637
- )
2638
- }
2639
- ) });
2640
- };
2641
-
2642
- // src/components/DropdownMenu/DropdownMenuItem.tsx
2643
- init_icons();
2644
- init_utils2();
2645
- var DropdownMenuItem = ({
2646
- ref,
2647
- className,
2648
- asModalTrigger = false,
2649
- onSelect,
2650
- onPointerLeave,
2651
- onPointerMove,
2652
- children,
2653
- asChild,
2654
- icon,
2655
- iconClassName,
2656
- isLoading = false,
2657
- ...props
2658
- }) => {
2659
- const Comp = asChild ? Root$2 : "div";
2660
- const adornment = isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "tw:animate-spin" }) : icon;
2661
- const handleOnSelect = (event) => {
2662
- if (asModalTrigger) event.preventDefault();
2663
- onSelect?.(event);
2664
- };
2665
- const handlePointerLeave = (event) => {
2666
- if (asModalTrigger) event.preventDefault();
2667
- onPointerLeave?.(event);
2668
- };
2669
- const handlePointerMove = (event) => {
2670
- if (asModalTrigger) event.preventDefault();
2671
- onPointerMove?.(event);
2672
- };
2673
- return /* @__PURE__ */ jsx(
2674
- DropdownMenuPrimitive3.Item,
2675
- {
2676
- ...props,
2677
- ref,
2678
- onSelect: handleOnSelect,
2679
- onPointerLeave: handlePointerLeave,
2680
- onPointerMove: handlePointerMove,
2681
- className: cn(itemVariants, asChild && "tw:text-inherit", className),
2682
- asChild: true,
2683
- children: /* @__PURE__ */ jsxs(Comp, { children: [
2684
- adornment && /* @__PURE__ */ jsx(ItemIcon, { className: iconClassName, children: adornment }),
2685
- /* @__PURE__ */ jsx(Slottable, { children })
2686
- ] })
2687
- }
2688
- );
2689
- };
2690
-
2691
- // src/components/DropdownMenu/DropdownMenuItemDescription.tsx
2692
- init_utils2();
2693
- var descriptionVariants = cva(
2694
- [
2695
- "tw:box-border",
2696
- "tw:ml-auto",
2697
- "tw:font-sans",
2698
- "tw:tracking-normal",
2699
- "tw:font-normal",
2700
- "tw:text-xs",
2701
- "tw:text-muted-foreground"
2702
- ],
2703
- {
2704
- variants: {
2705
- hideOnHover: {
2706
- true: ["tw:group-focus-within:hidden", "tw:group-hover:hidden"],
2707
- false: []
2708
- }
2709
- },
2710
- defaultVariants: {}
2711
- }
2712
- );
2713
- var DropdownMenuItemDescription = ({
2714
- className,
2715
- children,
2716
- hideOnHover = false,
2717
- ...props
2718
- }) => {
2719
- return /* @__PURE__ */ jsx("span", { ...props, className: cn(descriptionVariants({ hideOnHover }), className), children });
2720
- };
2721
-
2722
- // src/components/DropdownMenu/DropdownMenuLabel.tsx
2723
- init_utils2();
2724
- var DropdownMenuLabel = ({ className, ...props }) => {
2725
- return /* @__PURE__ */ jsx(
2726
- DropdownMenuPrimitive3.Label,
2727
- {
2728
- className: cn(
2729
- "tw:p-2",
2730
- "tw:font-medium",
2731
- "tw:text-xs",
2732
- "tw:text-muted-foreground",
2733
- className
2734
- ),
2735
- ...props
2736
- }
2737
- );
2738
- };
2739
- var DropdownMenuRadioGroup = ({
2740
- value,
2741
- defaultValue,
2742
- onValueChange,
2743
- ...props
2744
- }) => {
2745
- const handleChange = (value2) => {
2746
- onValueChange?.(value2);
2747
- };
2748
- return /* @__PURE__ */ jsx(
2749
- DropdownMenuPrimitive3.RadioGroup,
2750
- {
2751
- ...props,
2752
- value,
2753
- defaultValue,
2754
- onValueChange: handleChange
2755
- }
2756
- );
2757
- };
2758
-
2759
- // src/components/DropdownMenu/DropdownMenuRadioGroup/DropdownMenuRadioItem.tsx
2760
- init_icons();
2761
- init_utils2();
2762
- var DropdownMenuRadioItem = ({
2763
- className,
2764
- children,
2765
- closeOnSelect,
2766
- onSelect,
2767
- indicatorAlign = "start",
2768
- indicator = "radio",
2769
- icon,
2770
- iconClassName,
2771
- isLoading = false,
2772
- ...props
2773
- }) => {
2774
- const isAtStart = indicatorAlign === "start";
2775
- const indicatorEle = isLoading ? /* @__PURE__ */ jsx(ItemIcon, { className: iconClassName, children: /* @__PURE__ */ jsx(Loader2, { className: "tw:animate-spin" }) }) : /* @__PURE__ */ jsx(DropdownMenuItemIndicator, { variant: indicator });
2776
- const handleSelect = (event) => {
2777
- if (!closeOnSelect) event.preventDefault();
2778
- onSelect?.(event);
2779
- };
2780
- return /* @__PURE__ */ jsxs(
2781
- DropdownMenuPrimitive3.RadioItem,
2782
- {
2783
- className: cn(
2784
- itemVariants,
2785
- "tw:data-[state=checked]:cursor-default",
2786
- {
2787
- "tw:data-[state=checked]:bg-neutral-100": indicator === "none",
2788
- // Semantic brand tint (flips under `[data-theme='dark']`) instead of a
2789
- // hardcoded `tw:bg-sky-100`, which stayed light in dark mode and left the
2790
- // checked item's text near-invisible.
2791
- "tw:group-data-[variant=argo]/dropdown-menu-content:data-[state=checked]:bg-primary/10": indicator === "check"
2792
- },
2793
- className
2794
- ),
2795
- onSelect: handleSelect,
2796
- ...props,
2797
- children: [
2798
- isAtStart && indicatorEle,
2799
- icon && /* @__PURE__ */ jsx(ItemIcon, { className: iconClassName, children: icon }),
2800
- /* @__PURE__ */ jsx("span", { className: "tw:flex tw:min-w-0 tw:flex-1 tw:items-center tw:gap-2", children }),
2801
- !isAtStart && indicatorEle
2802
- ]
2803
- }
2804
- );
2805
- };
2806
-
2807
- // src/components/DropdownMenu/DropdownMenuSeparator.tsx
2808
- init_utils2();
2809
- var DropdownMenuSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx(
2810
- DropdownMenuPrimitive3.Separator,
2811
- {
2812
- className: cn(
2813
- "tw:relative",
2814
- "tw:z-10",
2815
- // layout
2816
- "tw:flex",
2817
- "tw:items-center",
2818
- "tw:justify-center",
2819
- "tw:w-full",
2820
- // separator line
2821
- 'tw:before:content-[""]',
2822
- "tw:before:w-full",
2823
- "tw:before:h-px",
2824
- "tw:group-data-[variant=default]/dropdown-menu-content:py-2",
2825
- "tw:group-data-[variant=default]/dropdown-menu-content:before:bg-neutral-150",
2826
- "tw:group-data-[variant=argo]/dropdown-menu-content:py-1",
2827
- "tw:group-data-[variant=argo]/dropdown-menu-content:before:bg-border",
2828
- className
2829
- ),
2830
- ...props
2831
- }
2832
- );
2833
- var DropdownMenuSub = DropdownMenuPrimitive3.Sub;
2834
-
2835
- // src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubContent.tsx
2836
- init_utils2();
2837
- var DropdownMenuSubContent = ({ className, ...props }) => {
2838
- const { variant } = useDropdownMenuContext();
2839
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive3.Portal, { children: /* @__PURE__ */ jsx(
2840
- DropdownMenuPrimitive3.SubContent,
2841
- {
2842
- "data-variant": variant,
2843
- className: cn(contentVariants, "tw:z-[1041]", "tw:p-2", className),
2844
- ...props
2845
- }
2846
- ) });
2847
- };
2848
-
2849
- // src/components/DropdownMenu/DropdownMenuSub/DropdownMenuSubTrigger.tsx
2850
- init_icons();
2851
- init_utils2();
2852
- var DropdownMenuSubTrigger = ({ className, children, ...props }) => {
2853
- return /* @__PURE__ */ jsxs(DropdownMenuPrimitive3.SubTrigger, { className: cn(itemVariants, className), ...props, children: [
2854
- children,
2855
- /* @__PURE__ */ jsx(ChevronRight, { className: "tw:ml-auto tw:size-5" })
2856
- ] });
2857
- };
2858
-
2859
- // src/components/DropdownMenu/DropdownMenuTrigger.tsx
2860
- init_utils2();
2861
- var DropdownMenuTrigger = ({ ref, className, ...props }) => /* @__PURE__ */ jsx(
2862
- Trigger$1,
2863
- {
2864
- ...props,
2865
- ref,
2866
- "data-slot": "dropdown-menu-trigger",
2867
- className: cn("tw:group/dropdown-menu-trigger", className)
2868
- }
2869
- );
2870
- var DropdownMenu = ({
2871
- // change a default value to false, for modal property, as it is not used in most cases
2872
- modal = false,
2873
- ...props
2874
- }) => {
2875
- const effectiveVariant = useArgoDesign() ? "argo" : "default";
2876
- const contextValue = useMemo(() => ({ variant: effectiveVariant }), [effectiveVariant]);
2877
- return /* @__PURE__ */ jsx(DropdownMenuContext, { value: contextValue, children: /* @__PURE__ */ jsx(Root$1, { ...props, modal }) });
2878
- };
2879
- DropdownMenu.Trigger = DropdownMenuTrigger;
2880
- DropdownMenu.Content = DropdownMenuContent;
2881
- DropdownMenu.Group = Group;
2882
- DropdownMenu.Sub = DropdownMenuSub;
2883
- DropdownMenu.SubContent = DropdownMenuSubContent;
2884
- DropdownMenu.SubTrigger = DropdownMenuSubTrigger;
2885
- DropdownMenu.Separator = DropdownMenuSeparator;
2886
- DropdownMenu.Label = DropdownMenuLabel;
2887
- DropdownMenu.Item = DropdownMenuItem;
2888
- DropdownMenu.CheckboxItem = DropdownMenuCheckboxItem;
2889
- DropdownMenu.RadioGroup = DropdownMenuRadioGroup;
2890
- DropdownMenu.RadioItem = DropdownMenuRadioItem;
2891
- DropdownMenu.ItemDescription = DropdownMenuItemDescription;
2892
-
2893
- // src/blocks/MarkdownEditor/plugins/toolbar/AlignmentDropdown.tsx
2894
- init_Tooltip2();
2895
- init_icons();
2896
- init_utils2();
2897
520
  var ALIGNMENT_OPTIONS = [
2898
521
  { value: "left", label: "Left", icon: AlignLeft },
2899
522
  { value: "center", label: "Center", icon: AlignCenter },
@@ -2957,9 +580,6 @@ var AlignmentDropdown = ({
2957
580
  )) })
2958
581
  ] });
2959
582
  };
2960
- init_Tooltip2();
2961
- init_icons();
2962
- init_utils2();
2963
583
  var BLOCK_TYPE_META = {
2964
584
  paragraph: { label: "Normal", icon: Type, selectable: true },
2965
585
  h1: { label: "Heading 1", icon: Heading1, selectable: true },
@@ -3042,1011 +662,6 @@ var BlockTypeDropdown = ({
3042
662
  )) })
3043
663
  ] });
3044
664
  };
3045
-
3046
- // src/blocks/FormGroup/FormGroup.tsx
3047
- init_utils2();
3048
- var FormGroupContext = createContext({
3049
- state: "default"
3050
- });
3051
- var FormGroupProvider = FormGroupContext;
3052
- var useFormGroupContext = () => use(FormGroupContext);
3053
-
3054
- // src/components/InputGroup/InputGroup.tsx
3055
- init_utils2();
3056
- init_context();
3057
-
3058
- // src/components/InputGroup/InputGroupAddon.tsx
3059
- init_utils2();
3060
- var addonVariants = cva(
3061
- [
3062
- "tw:flex",
3063
- "tw:items-center",
3064
- "tw:gap-1",
3065
- // Default size for nested Lucide icons in prefix/suffix slots; callers can override on the icon.
3066
- "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4",
3067
- "tw:[&_svg]:shrink-0"
3068
- ],
3069
- {
3070
- defaultVariants: {
3071
- align: "inline-start"
3072
- },
3073
- variants: {
3074
- align: {
3075
- "inline-start": ["tw:order-first", "tw:[&:not(:empty)]:pl-4"],
3076
- "inline-end": ["tw:order-last", "tw:[&:not(:empty)]:pr-4"],
3077
- "block-start": [
3078
- "tw:order-first",
3079
- // `tw:w-full` needs to be empty-conditional too — when the addon
3080
- // has no content the root stays in flex-row, and a 100%-wide
3081
- // empty addon would claim half of the input row beside the input.
3082
- "tw:[&:not(:empty)]:w-full",
3083
- "tw:[&:not(:empty)]:px-4",
3084
- "tw:[&:not(:empty)]:py-1.5"
3085
- ],
3086
- "block-end": [
3087
- "tw:order-last",
3088
- "tw:[&:not(:empty)]:w-full",
3089
- "tw:[&:not(:empty)]:px-4",
3090
- "tw:[&:not(:empty)]:py-1.5"
3091
- ]
3092
- }
3093
- }
3094
- }
3095
- );
3096
- var InputGroupAddon = ({
3097
- children,
3098
- align = "inline-start",
3099
- className,
3100
- ...props
3101
- }) => /* @__PURE__ */ jsx("div", { ...props, "data-align": align, className: cn(addonVariants({ align, className })), children });
3102
-
3103
- // src/components/InputGroup/InputGroupButton.tsx
3104
- init_utils2();
3105
- init_Button2();
3106
- var InputGroupButton = ({ ref, className, tabIndex = -1, ...props }) => /* @__PURE__ */ jsx(
3107
- Button,
3108
- {
3109
- ...props,
3110
- tabIndex,
3111
- ref,
3112
- variant: "invisible",
3113
- size: "icon-sm",
3114
- className: cn("tw:size-5", "tw:[&_svg]:text-muted-foreground", className)
3115
- }
3116
- );
3117
-
3118
- // src/components/InputGroup/InputGroupInput.tsx
3119
- init_utils2();
3120
- var InputGroupInput = ({ ref, className, ...inputProps }) => /* @__PURE__ */ jsx(
3121
- "input",
3122
- {
3123
- ...inputProps,
3124
- ref,
3125
- className: cn(
3126
- "tw:w-full",
3127
- "tw:bg-transparent",
3128
- "tw:outline-hidden",
3129
- // font
3130
- "tw:font-sans",
3131
- "tw:text-sm",
3132
- // placeholder
3133
- "tw:placeholder:text-neutral-400",
3134
- "tw:placeholder:font-normal",
3135
- // disabled
3136
- "tw:disabled:cursor-not-allowed",
3137
- className
3138
- )
3139
- }
3140
- );
3141
-
3142
- // src/components/InputGroup/InputGroupText.tsx
3143
- init_utils2();
3144
- var InputGroupText = ({ className, ...props }) => /* @__PURE__ */ jsx(
3145
- "span",
3146
- {
3147
- className: cn(
3148
- "tw:flex",
3149
- "tw:items-center",
3150
- "tw:gap-2",
3151
- "tw:text-sm",
3152
- "tw:text-muted-foreground",
3153
- "tw:[&_svg]:pointer-events-none",
3154
- 'tw:[&_svg:not([class*="tw:size-"])]:size-4',
3155
- className
3156
- ),
3157
- ...props
3158
- }
3159
- );
3160
-
3161
- // src/components/InputGroup/InputGroupTextArea.tsx
3162
- init_utils2();
3163
- var InputGroupTextArea = ({
3164
- ref,
3165
- className,
3166
- onChange,
3167
- onValueChange,
3168
- value,
3169
- defaultValue,
3170
- onBlur,
3171
- onValueBlur,
3172
- disableResize = false,
3173
- minRows = 1,
3174
- maxRows = 4,
3175
- ...props
3176
- }) => {
3177
- const handleChange = (event) => {
3178
- onValueChange?.(event.target.value);
3179
- onChange?.(event);
3180
- };
3181
- const handleBlur = (event) => {
3182
- onValueBlur?.(event.target.value);
3183
- onBlur?.(event);
3184
- };
3185
- return /* @__PURE__ */ jsx(
3186
- TextareaAutosize,
3187
- {
3188
- ...props,
3189
- ref,
3190
- value: value ?? void 0,
3191
- defaultValue: defaultValue ?? void 0,
3192
- onChange: handleChange,
3193
- onBlur: handleBlur,
3194
- minRows,
3195
- maxRows: maxRows === "unlimited" ? void 0 : maxRows,
3196
- className: cn(
3197
- "tw:w-full",
3198
- "tw:bg-transparent",
3199
- "tw:outline-hidden",
3200
- "tw:px-4",
3201
- // font
3202
- "tw:font-sans",
3203
- "tw:text-sm",
3204
- // placeholder
3205
- "tw:placeholder:text-neutral-400",
3206
- "tw:placeholder:font-normal",
3207
- // disabled
3208
- "tw:disabled:cursor-not-allowed",
3209
- {
3210
- "tw:resize-none": disableResize
3211
- },
3212
- className
3213
- )
3214
- }
3215
- );
3216
- };
3217
- var inputGroupVariants = cva(
3218
- [
3219
- "tailwindcss-preflight",
3220
- "tw:group",
3221
- "tw:overflow-hidden",
3222
- "tw:box-border",
3223
- // positioning
3224
- "tw:flex",
3225
- "tw:items-center",
3226
- // base — legacy (non-argo) chrome uses a fixed radius; argo overrides it with
3227
- // the brand radius token in the `argo` variant below.
3228
- "tw:rounded",
3229
- "tw:border",
3230
- "tw:border-solid",
3231
- "tw:border-neutral-200",
3232
- "tw:text-neutral-800",
3233
- "tw:transition",
3234
- // focus
3235
- "tw:has-[:is(input,textarea):focus]:ring-4",
3236
- // readonly
3237
- "tw:has-[:is(input,textarea)[readonly]]:bg-neutral-150",
3238
- "tw:has-[:is(input,textarea)[readonly]]:focus-within:ring-0",
3239
- "tw:has-[:is(input,textarea)[readonly]]:border-neutral-150",
3240
- // disabled cursor (opacity owned by variant)
3241
- "tw:has-[:is(input,textarea):disabled]:cursor-not-allowed",
3242
- // textarea: top-align addons, allow vertical expansion, own its y-padding
3243
- "tw:has-[textarea]:items-start",
3244
- "tw:has-[[data-align=block-start]:not(:empty)]:flex-wrap",
3245
- "tw:has-[[data-align=block-end]:not(:empty)]:flex-wrap",
3246
- "tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:w-auto",
3247
- "tw:[&>input]:has-[[data-align=block-start]:not(:empty)]:flex-1",
3248
- "tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:w-auto",
3249
- "tw:[&>input]:has-[[data-align=block-end]:not(:empty)]:flex-1",
3250
- "tw:[&>input]:px-4",
3251
- "tw:[&>input]:has-[[data-align=inline-start]:not(:empty)]:pl-2",
3252
- "tw:[&>input]:has-[[data-align=inline-end]:not(:empty)]:pr-2"
3253
- ],
3254
- {
3255
- defaultVariants: {
3256
- variant: "primary",
3257
- state: "default",
3258
- sizing: "medium",
3259
- focusVariant: "default"
3260
- },
3261
- compoundVariants: [
3262
- {
3263
- variant: "secondary",
3264
- state: "error",
3265
- className: ["tw:bg-error-100"]
3266
- },
3267
- {
3268
- variant: "secondary",
3269
- state: "warning",
3270
- className: ["tw:bg-warning-100"]
3271
- },
3272
- {
3273
- variant: "primary",
3274
- state: "default",
3275
- focusVariant: "off",
3276
- className: ["tw:has-[:is(input,textarea):focus]:border-neutral-200"]
3277
- },
3278
- {
3279
- variant: "secondary",
3280
- state: "default",
3281
- focusVariant: "off",
3282
- className: ["tw:has-[:is(input,textarea):focus]:border-neutral-100"]
3283
- },
3284
- {
3285
- variant: ["primary", "secondary"],
3286
- state: "error",
3287
- focusVariant: "on",
3288
- className: ["tw:!border-error-500", "tw:!ring-error-200"]
3289
- },
3290
- {
3291
- variant: ["primary", "secondary"],
3292
- state: "warning",
3293
- focusVariant: "on",
3294
- className: ["tw:!border-warning-500", "tw:!ring-warning-200"]
3295
- },
3296
- // --- argo ---
3297
- {
3298
- variant: "argo",
3299
- state: "default",
3300
- className: [
3301
- "tw:has-[:is(input,textarea):focus]:border-primary",
3302
- "tw:has-[:is(input,textarea):focus]:ring-ring/50"
3303
- ]
3304
- },
3305
- {
3306
- variant: "argo",
3307
- state: "error",
3308
- className: [
3309
- "tw:border-destructive",
3310
- "tw:has-[:is(input,textarea):focus]:border-destructive",
3311
- "tw:has-[:is(input,textarea):focus]:ring-destructive/20"
3312
- ]
3313
- },
3314
- {
3315
- variant: "argo",
3316
- focusVariant: "on",
3317
- className: ["tw:!border-primary", "tw:!ring-ring/50"]
3318
- },
3319
- {
3320
- variant: "argo",
3321
- state: "error",
3322
- focusVariant: "on",
3323
- className: ["tw:!border-destructive", "tw:!ring-destructive/20"]
3324
- },
3325
- {
3326
- variant: "argo",
3327
- state: "default",
3328
- focusVariant: "off",
3329
- className: ["tw:has-[:is(input,textarea):focus]:border-input"]
3330
- }
3331
- ],
3332
- variants: {
3333
- focusVariant: {
3334
- default: [],
3335
- on: ["tw:!border-ring", "tw:!ring-ring/30", "tw:!ring-4"],
3336
- off: ["tw:has-[:is(input,textarea):focus]:!ring-0"]
3337
- },
3338
- variant: {
3339
- primary: [
3340
- "tw:bg-white",
3341
- "tw:has-[:is(input,textarea):disabled]:opacity-40",
3342
- // aria-invalid on the control surfaces the error chrome without a `state` prop — the
3343
- // accessible path (mirrors the `state="error"` legacy tokens). Higher specificity than
3344
- // the default focus selector, so it wins without `!important`.
3345
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500",
3346
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500",
3347
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200"
3348
- ],
3349
- secondary: [
3350
- "tw:bg-neutral-100",
3351
- "tw:border-neutral-100",
3352
- "tw:has-[:is(input,textarea):disabled]:opacity-40",
3353
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-error-500",
3354
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-error-500",
3355
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-error-200"
3356
- ],
3357
- argo: [
3358
- // argo follows the brand radius token (overrides the static base)
3359
- "tw:rounded-[var(--radius-lg,0.25rem)]",
3360
- // muted filled input surface — gray, distinct from white containers; not the app-background token
3361
- "tw:bg-muted",
3362
- "tw:border-input",
3363
- "tw:text-foreground",
3364
- "tw:has-[:is(input,textarea):disabled]:opacity-50",
3365
- // readonly: keep the themed input surface/border. The base layer's fixed
3366
- // `neutral-150` (a light grey) is correct for the legacy light chrome but
3367
- // collides with argo's themed `foreground` text — light-on-light, invisible
3368
- // in dark mode. Re-pin to the same `muted`/`input` tokens the editable argo
3369
- // input uses (validated AA), so readonly stays legible in every scheme.
3370
- "tw:has-[:is(input,textarea)[readonly]]:bg-muted",
3371
- "tw:has-[:is(input,textarea)[readonly]]:border-input",
3372
- // higher specificity than has-[:is(input,textarea):focus] — prevents focus border on readonly
3373
- "tw:has-[:is(input,textarea)[readonly]:focus]:border-input",
3374
- // aria-invalid on the control surfaces the error chrome without a `state` prop — the
3375
- // accessible path (uses the themeable `destructive` status token).
3376
- "tw:has-[:is(input,textarea)[aria-invalid=true]]:border-destructive",
3377
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:border-destructive",
3378
- "tw:has-[:is(input,textarea)[aria-invalid=true]:focus]:ring-destructive/20"
3379
- ]
3380
- },
3381
- sizing: {
3382
- default: [
3383
- "tw:[&>:is(input,textarea)]:py-2.5",
3384
- "tw:[&>:is(input,textarea)]:leading-[18px]",
3385
- "tw:[&>textarea]:!min-h-[calc(2.5rem-2px)]"
3386
- ],
3387
- small: [
3388
- "tw:[&>:is(input,textarea)]:py-2",
3389
- "tw:[&>:is(input,textarea)]:leading-[16px]",
3390
- "tw:[&>textarea]:!min-h-[calc(2rem-2px)]"
3391
- ],
3392
- medium: [
3393
- "tw:[&>:is(input,textarea)]:py-2",
3394
- "tw:[&>:is(input,textarea)]:leading-[18px]",
3395
- "tw:[&>textarea]:!min-h-[calc(2.25rem-2px)]"
3396
- ]
3397
- },
3398
- state: {
3399
- default: [
3400
- "tw:has-[:is(input,textarea):focus]:border-ring",
3401
- "tw:has-[:is(input,textarea):focus]:ring-ring/30"
3402
- ],
3403
- error: [
3404
- "tw:border-error-500",
3405
- "tw:has-[:is(input,textarea):focus]:border-error-500",
3406
- "tw:has-[:is(input,textarea):focus]:ring-error-200"
3407
- ],
3408
- warning: [
3409
- "tw:border-warning-500",
3410
- "tw:has-[:is(input,textarea):focus]:border-warning-500",
3411
- "tw:has-[:is(input,textarea):focus]:ring-warning-200"
3412
- ]
3413
- }
3414
- }
3415
- }
3416
- );
3417
- var InputGroupRoot = ({
3418
- ref,
3419
- children,
3420
- state,
3421
- variant,
3422
- sizing,
3423
- focusVariant,
3424
- className,
3425
- ...props
3426
- }) => {
3427
- const isArgo = useArgoDesign();
3428
- const effectiveVariant = isArgo ? "argo" : variant;
3429
- const effectiveSizing = effectiveVariant === "argo" ? "medium" : sizing;
3430
- return /* @__PURE__ */ jsx(
3431
- "div",
3432
- {
3433
- ...props,
3434
- ref,
3435
- className: cn(
3436
- inputGroupVariants({
3437
- state,
3438
- variant: effectiveVariant,
3439
- sizing: effectiveSizing,
3440
- focusVariant,
3441
- className
3442
- })
3443
- ),
3444
- children
3445
- }
3446
- );
3447
- };
3448
- var InputGroup = InputGroupRoot;
3449
- InputGroup.Input = InputGroupInput;
3450
- InputGroup.Addon = InputGroupAddon;
3451
- InputGroup.Button = InputGroupButton;
3452
- InputGroup.TextArea = InputGroupTextArea;
3453
- InputGroup.Text = InputGroupText;
3454
- var useControllableState = ({
3455
- prop,
3456
- defaultProp,
3457
- onChange
3458
- }) => {
3459
- const [uncontrolled, setUncontrolled] = useState(defaultProp);
3460
- const isControlled = prop !== void 0;
3461
- const value = prop !== void 0 ? prop : uncontrolled;
3462
- const valueRef = useRef(value);
3463
- valueRef.current = value;
3464
- const onChangeRef = useRef(onChange);
3465
- onChangeRef.current = onChange;
3466
- const setValue = useCallback(
3467
- (next) => {
3468
- const nextValue = typeof next === "function" ? next(valueRef.current) : next;
3469
- valueRef.current = nextValue;
3470
- if (!isControlled) setUncontrolled(nextValue);
3471
- onChangeRef.current?.(nextValue);
3472
- },
3473
- [isControlled]
3474
- );
3475
- return [value, setValue];
3476
- };
3477
-
3478
- // src/blocks/ColorInput/ColorInput.tsx
3479
- init_icons();
3480
- init_utils2();
3481
- init_icons();
3482
-
3483
- // src/blocks/ColorInput/utils.ts
3484
- var HEX_CHARSET = /^[0-9a-fA-F]+$/;
3485
- var COMPLETE_HEX_PATTERN = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
3486
- var MAX_HEX_BODY_LENGTH = 8;
3487
- var PICKER_FALLBACK = "#000000";
3488
- var extractHexBody = (value) => {
3489
- if (typeof value !== "string") return null;
3490
- const trimmed = value.trim();
3491
- if (trimmed === "") return null;
3492
- return trimmed.startsWith("#") ? trimmed.slice(1) : trimmed;
3493
- };
3494
- var isCompleteHexColor = (value) => COMPLETE_HEX_PATTERN.test(value);
3495
- var showPicker = (input) => {
3496
- const isShowPickerSupported = "showPicker" in HTMLInputElement.prototype;
3497
- isShowPickerSupported ? input.showPicker() : input.click();
3498
- };
3499
- var coerceHexInputValue = (value) => {
3500
- const body = extractHexBody(value);
3501
- if (body === null) return "";
3502
- const [validBody] = body.match(/^[0-9a-fA-F]+/) ?? [];
3503
- if (!validBody) return "";
3504
- return `#${validBody.slice(0, MAX_HEX_BODY_LENGTH)}`;
3505
- };
3506
- var coerceColorPickerValue = (value) => {
3507
- const body = extractHexBody(value);
3508
- if (body === null || !HEX_CHARSET.test(body)) return PICKER_FALLBACK;
3509
- if (body.length === 3 || body.length === 4) {
3510
- const [r, g, b] = body;
3511
- return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();
3512
- }
3513
- if (body.length === 6 || body.length === 8) {
3514
- return `#${body.slice(0, 6).toLowerCase()}`;
3515
- }
3516
- return PICKER_FALLBACK;
3517
- };
3518
- var ColorPicker = ({ value, disabled, readOnly, ...props }) => {
3519
- const pickerRef = useRef(null);
3520
- const handleOpenPicker = () => {
3521
- if (!pickerRef.current) return;
3522
- showPicker(pickerRef.current);
3523
- };
3524
- return /* @__PURE__ */ jsxs("div", { className: "tw:relative", children: [
3525
- /* @__PURE__ */ jsx(
3526
- "input",
3527
- {
3528
- ...props,
3529
- ref: pickerRef,
3530
- type: "color",
3531
- value: coerceColorPickerValue(value),
3532
- tabIndex: -1,
3533
- "aria-hidden": true,
3534
- className: "tw:pointer-events-none tw:absolute tw:left-0 tw:top-full tw:size-0 tw:opacity-0",
3535
- disabled,
3536
- readOnly
3537
- }
3538
- ),
3539
- /* @__PURE__ */ jsx(
3540
- InputGroup.Button,
3541
- {
3542
- onMouseDown: (event) => event.preventDefault(),
3543
- disabled: disabled || readOnly,
3544
- onClick: handleOpenPicker,
3545
- "aria-label": "Pick color",
3546
- children: /* @__PURE__ */ jsx(Pipette, { className: "tw:size-4" })
3547
- }
3548
- )
3549
- ] });
3550
- };
3551
- var ColorInput = ({
3552
- ref,
3553
- // group props
3554
- state,
3555
- variant,
3556
- focusVariant,
3557
- sizing,
3558
- className,
3559
- // own props
3560
- value: valueProp,
3561
- onValueChange,
3562
- onValueBlur,
3563
- onChange,
3564
- onBlur,
3565
- defaultValue,
3566
- allowClear = false,
3567
- // input props
3568
- disabled,
3569
- readOnly,
3570
- ...restInputProps
3571
- }) => {
3572
- const inputRef = useRef(null);
3573
- const [value, setValue] = useControllableState({
3574
- // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.
3575
- prop: valueProp === null ? "" : valueProp,
3576
- defaultProp: defaultValue ?? "",
3577
- onChange: onValueChange
3578
- });
3579
- const isControlled = valueProp !== void 0;
3580
- const canClear = allowClear && !!value && !disabled && !readOnly;
3581
- const swatchColor = coerceHexInputValue(value);
3582
- const isValidSwatch = isCompleteHexColor(swatchColor);
3583
- const handleChange = (event) => {
3584
- setValue(event.target.value);
3585
- onChange?.(event);
3586
- };
3587
- const handleBlur = (event) => {
3588
- const newValue = event.target.value;
3589
- const sanitizedNewValue = coerceHexInputValue(newValue);
3590
- if (sanitizedNewValue !== newValue) {
3591
- if (!isControlled) event.target.value = sanitizedNewValue;
3592
- setValue(sanitizedNewValue);
3593
- }
3594
- onValueBlur?.(sanitizedNewValue);
3595
- onBlur?.(event);
3596
- };
3597
- const handlePickerChange = (event) => {
3598
- setValue(coerceHexInputValue(event.target.value));
3599
- onChange?.(event);
3600
- };
3601
- const handleClear = () => {
3602
- if (!inputRef.current) return;
3603
- inputRef.current.value = "";
3604
- setValue("");
3605
- onChange?.(createChangeInputEvent(inputRef.current));
3606
- };
3607
- return /* @__PURE__ */ jsxs(
3608
- InputGroup,
3609
- {
3610
- state,
3611
- variant,
3612
- sizing,
3613
- focusVariant,
3614
- className,
3615
- children: [
3616
- /* @__PURE__ */ jsx(
3617
- InputGroup.Addon,
3618
- {
3619
- align: "inline-start",
3620
- className: cn(
3621
- { "tw:-ml-7 tw:opacity-0": !value },
3622
- "tw:transition-[opacity,margin]",
3623
- "tw:ease-linear",
3624
- "tw:duration-200"
3625
- ),
3626
- children: /* @__PURE__ */ jsx(
3627
- "div",
3628
- {
3629
- style: isValidSwatch ? { background: swatchColor } : void 0,
3630
- className: cn(
3631
- "tw:size-5",
3632
- "tw:shrink-0",
3633
- "tw:rounded-sm",
3634
- "tw:border",
3635
- "tw:border-solid",
3636
- "tw:border-neutral-300",
3637
- {
3638
- "tw:bg-[linear-gradient(to_top_right,transparent_calc(50%_-_1px),theme(colors.red.300)_calc(50%_-_1px),theme(colors.red.300)_calc(50%_+_1px),transparent_calc(50%_+_1px))]": !isValidSwatch
3639
- }
3640
- )
3641
- }
3642
- )
3643
- }
3644
- ),
3645
- /* @__PURE__ */ jsx(
3646
- InputGroup.Input,
3647
- {
3648
- ...restInputProps,
3649
- type: "text",
3650
- ref: mergeRefs(ref ?? null, inputRef),
3651
- value,
3652
- onChange: handleChange,
3653
- onBlur: handleBlur,
3654
- disabled,
3655
- readOnly
3656
- }
3657
- ),
3658
- /* @__PURE__ */ jsxs(InputGroup.Addon, { align: "inline-end", children: [
3659
- canClear && /* @__PURE__ */ jsx(
3660
- InputGroup.Button,
3661
- {
3662
- onMouseDown: (event) => event.preventDefault(),
3663
- onClick: handleClear,
3664
- "aria-label": "Clear color",
3665
- children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
3666
- }
3667
- ),
3668
- /* @__PURE__ */ jsx(
3669
- ColorPicker,
3670
- {
3671
- disabled,
3672
- readOnly,
3673
- value,
3674
- onChange: handlePickerChange
3675
- }
3676
- )
3677
- ] })
3678
- ]
3679
- }
3680
- );
3681
- };
3682
- var FormGroupColorInput = ({ ref, ...props }) => {
3683
- const { state } = useFormGroupContext();
3684
- return /* @__PURE__ */ jsx(ColorInput, { state, ...props, ref });
3685
- };
3686
-
3687
- // src/blocks/FormGroup/FormGroupError.tsx
3688
- init_utils2();
3689
- var toMessage = (entry) => typeof entry === "string" ? entry : entry?.message;
3690
- var FormGroupError = ({ children, className, errors, ...rest }) => {
3691
- const content = useMemo(() => {
3692
- if (children) return children;
3693
- const messages = (errors ?? []).map(toMessage).filter((message) => !!message);
3694
- if (messages.length === 0) return null;
3695
- if (messages.length === 1) return messages[0];
3696
- return /* @__PURE__ */ jsx("ul", { className: "tw:m-0 tw:flex tw:list-disc tw:flex-col tw:gap-0 tw:pl-4", children: messages.map((message, index) => /* @__PURE__ */ jsx("li", { children: message }, index)) });
3697
- }, [children, errors]);
3698
- if (!content) return null;
3699
- return /* @__PURE__ */ jsx("div", { ...rest, role: "alert", className: cn("tw:m-0 tw:text-xs tw:text-destructive", className), children: content });
3700
- };
3701
- var helpVariants = cva(["tw:m-0", "tw:text-xs"], {
3702
- defaultVariants: {
3703
- state: "default"
3704
- },
3705
- variants: {
3706
- state: {
3707
- default: ["tw:text-muted-foreground"],
3708
- warning: ["tw:text-warning"]
3709
- }
3710
- }
3711
- });
3712
- var HelpBlock = ({ children, className, state = "default", ...rest }) => {
3713
- if (!children) return null;
3714
- return /* @__PURE__ */ jsx("p", { ...rest, className: helpVariants({ state, className }), children });
3715
- };
3716
- var FormGroupHelp = ({ children, ...rest }) => {
3717
- const formGroupContext = useFormGroupContext();
3718
- return /* @__PURE__ */ jsx(HelpBlock, { state: formGroupContext.state === "warning" ? "warning" : "default", ...rest, children });
3719
- };
3720
- var toNumberOrNull = (event) => Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;
3721
- var NumberInput = ({
3722
- ref,
3723
- state,
3724
- variant,
3725
- focusVariant,
3726
- sizing,
3727
- className,
3728
- value,
3729
- defaultValue,
3730
- onValueChange,
3731
- onValueBlur,
3732
- onChange,
3733
- onBlur,
3734
- prefix,
3735
- suffix,
3736
- ...inputProps
3737
- }) => {
3738
- const handleChange = (event) => {
3739
- onValueChange?.(toNumberOrNull(event));
3740
- onChange?.(event);
3741
- };
3742
- const handleBlur = (event) => {
3743
- onValueBlur?.(toNumberOrNull(event));
3744
- onBlur?.(event);
3745
- };
3746
- const isControlled = value !== void 0;
3747
- const valueProp = isControlled ? { value: value ?? "" } : { defaultValue: defaultValue ?? "" };
3748
- return /* @__PURE__ */ jsxs(
3749
- InputGroup,
3750
- {
3751
- state,
3752
- variant,
3753
- sizing,
3754
- focusVariant,
3755
- className,
3756
- children: [
3757
- prefix && /* @__PURE__ */ jsx(InputGroup.Addon, { align: "inline-start", children: prefix }),
3758
- /* @__PURE__ */ jsx(
3759
- InputGroup.Input,
3760
- {
3761
- ...inputProps,
3762
- ...valueProp,
3763
- ref,
3764
- type: "number",
3765
- onChange: handleChange,
3766
- onBlur: handleBlur
3767
- }
3768
- ),
3769
- suffix && /* @__PURE__ */ jsx(InputGroup.Addon, { align: "inline-end", children: suffix })
3770
- ]
3771
- }
3772
- );
3773
- };
3774
- var FormGroupNumberInput = ({ ref, ...props }) => {
3775
- const { state } = useFormGroupContext();
3776
- return /* @__PURE__ */ jsx(NumberInput, { ...props, ref, state });
3777
- };
3778
- var Textarea = ({
3779
- ref,
3780
- containerClassName,
3781
- // group props
3782
- state = "default",
3783
- variant,
3784
- sizing,
3785
- focusVariant,
3786
- // value handling
3787
- value: valueProp,
3788
- defaultValue,
3789
- onValueChange,
3790
- ...rest
3791
- }) => {
3792
- const [value, setValue] = useControllableState({
3793
- // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.
3794
- prop: valueProp === void 0 ? void 0 : valueProp ?? "",
3795
- defaultProp: defaultValue ?? "",
3796
- onChange: onValueChange
3797
- });
3798
- return /* @__PURE__ */ jsx(
3799
- InputGroup,
3800
- {
3801
- state,
3802
- sizing,
3803
- focusVariant,
3804
- variant,
3805
- className: containerClassName,
3806
- children: /* @__PURE__ */ jsx(InputGroup.TextArea, { ...rest, ref, value, onValueChange: setValue })
3807
- }
3808
- );
3809
- };
3810
- var FormGroupTextarea = (props) => {
3811
- const { state } = useFormGroupContext();
3812
- return /* @__PURE__ */ jsx(Textarea, { state, ...props });
3813
- };
3814
- init_icons();
3815
- init_utils2();
3816
-
3817
- // src/blocks/TextInput/utils.ts
3818
- init_utils2();
3819
- var genInputTestId = (prefix = "") => {
3820
- const ps = createPrefixedString(prefix);
3821
- return {
3822
- toString: () => prefix,
3823
- inputWrapper: ps`input-wrapper`,
3824
- input: ps`input`,
3825
- clearButton: ps`clear-button`
3826
- };
3827
- };
3828
- var sanitizeTextInputValue = (value) => {
3829
- if (typeof value === "string" && value.trim() === "") return "";
3830
- return value;
3831
- };
3832
- var TextInput = ({
3833
- ref: forwardedRef,
3834
- state = "default",
3835
- sizing = "default",
3836
- className,
3837
- prefix = null,
3838
- rightSuffix = null,
3839
- rightSuffixVariant = "default",
3840
- leftSuffix = null,
3841
- allowClear = false,
3842
- onClear,
3843
- disabled = false,
3844
- testId: prefixTestId = "",
3845
- autoFocus = false,
3846
- id,
3847
- name,
3848
- variant,
3849
- readOnly,
3850
- type = "text",
3851
- focusVariant = "default",
3852
- onChange,
3853
- onBlur,
3854
- onValueChange,
3855
- onValueBlur,
3856
- value: valueProp,
3857
- defaultValue,
3858
- ...inputProps
3859
- }) => {
3860
- const inputRef = useRef(null);
3861
- const [value, setValue] = useControllableState({
3862
- // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced
3863
- // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.
3864
- prop: valueProp === void 0 ? void 0 : sanitizeTextInputValue(valueProp) ?? "",
3865
- defaultProp: sanitizeTextInputValue(defaultValue) ?? "",
3866
- onChange: onValueChange
3867
- });
3868
- const testId = genInputTestId(prefixTestId);
3869
- const isClearButtonVisible = !!value && !disabled && !readOnly || !!onClear;
3870
- const handleChange = (event) => {
3871
- setValue(event.target.value);
3872
- onChange?.(event);
3873
- };
3874
- const handleBlur = (event) => {
3875
- onValueBlur?.(event.target.value);
3876
- onBlur?.(event);
3877
- };
3878
- const handleClear = () => {
3879
- if (inputRef.current === null) return;
3880
- inputRef.current.value = "";
3881
- inputRef.current.focus();
3882
- onClear?.();
3883
- handleChange(createChangeInputEvent(inputRef.current));
3884
- };
3885
- return /* @__PURE__ */ jsxs(
3886
- InputGroup,
3887
- {
3888
- state,
3889
- variant,
3890
- sizing,
3891
- focusVariant,
3892
- className,
3893
- "data-testid": testId.inputWrapper,
3894
- children: [
3895
- prefix && /* @__PURE__ */ jsx(InputGroup.Addon, { align: "inline-start", children: prefix }),
3896
- /* @__PURE__ */ jsx(
3897
- InputGroup.Input,
3898
- {
3899
- ...inputProps,
3900
- value,
3901
- autoFocus,
3902
- type,
3903
- onChange: handleChange,
3904
- onBlur: handleBlur,
3905
- ref: mergeRefs(forwardedRef ?? null, inputRef),
3906
- disabled,
3907
- id,
3908
- name,
3909
- readOnly,
3910
- "data-testid": testId.input
3911
- }
3912
- ),
3913
- (leftSuffix || allowClear || rightSuffix) && /* @__PURE__ */ jsxs(InputGroup.Addon, { align: "inline-end", children: [
3914
- leftSuffix,
3915
- allowClear && isClearButtonVisible && /* @__PURE__ */ jsx(
3916
- InputGroup.Button,
3917
- {
3918
- "aria-label": "Clear",
3919
- onMouseDown: (e) => e.preventDefault(),
3920
- onClick: handleClear,
3921
- "data-testid": testId.clearButton,
3922
- children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
3923
- }
3924
- ),
3925
- rightSuffix && /* @__PURE__ */ jsx(
3926
- "div",
3927
- {
3928
- className: cn({
3929
- "tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5": rightSuffixVariant === "addon"
3930
- }),
3931
- children: rightSuffix
3932
- }
3933
- )
3934
- ] })
3935
- ]
3936
- }
3937
- );
3938
- };
3939
- var FormGroupTextInput = ({ ref, ...props }) => {
3940
- const { state } = useFormGroupContext();
3941
- return /* @__PURE__ */ jsx(TextInput, { state, ...props, ref });
3942
- };
3943
- var FormGroup = ({ className, children, state, ...rest }) => {
3944
- return /* @__PURE__ */ jsx(FormGroupProvider, { value: { state }, children: /* @__PURE__ */ jsx("div", { ...rest, className: cn("tw:flex tw:flex-col tw:gap-1", className), children }) });
3945
- };
3946
- FormGroup.Help = FormGroupHelp;
3947
- FormGroup.Error = FormGroupError;
3948
- FormGroup.TextInput = FormGroupTextInput;
3949
- FormGroup.NumberInput = FormGroupNumberInput;
3950
- FormGroup.ColorInput = FormGroupColorInput;
3951
- FormGroup.Textarea = FormGroupTextarea;
3952
-
3953
- // src/blocks/MarkdownEditor/plugins/toolbar/LinkPanel.tsx
3954
- init_Button2();
3955
-
3956
- // src/components/ButtonGroup/ButtonGroup.tsx
3957
- init_utils2();
3958
- var buttonGroupVariant = cva(
3959
- ["tailwindcss-preflight", "tw:inline-flex", "tw:items-center", "tw:group/button-group"],
3960
- {
3961
- defaultVariants: {
3962
- variant: "inline",
3963
- space: "small"
3964
- },
3965
- variants: {
3966
- variant: {
3967
- inline: [],
3968
- block: [
3969
- "tw:w-full",
3970
- "tw:flex-col",
3971
- "tw:sm:flex-row",
3972
- "tw:[&_a]:flex-1",
3973
- "tw:[&>button:not([data-icon-only=true])]:flex-1"
3974
- ]
3975
- },
3976
- space: {
3977
- "extra-small": "tw:gap-1",
3978
- "little-small": "tw:gap-2",
3979
- small: "tw:gap-3",
3980
- medium: "tw:gap-4",
3981
- large: "tw:gap-6",
3982
- compact: [
3983
- "tw:border-collapse",
3984
- "tw:!gap-0",
3985
- // ensure that focus visible outline is at the top
3986
- "tw:[&>*:focus-visible]:!z-10",
3987
- "tw:[&>*:not(:first-child)]:rounded-l-none",
3988
- "tw:[&>*:not(:last-child)]:rounded-r-none",
3989
- "tw:[&>*:not(:last-child)]:border-r-0",
3990
- "tw:[&>*:not(:first-child)]:border-l-0",
3991
- // separator
3992
- "tw:[&>*:not(:first-child)]:before:content",
3993
- "tw:[&>*:not(:first-child)]:before:absolute",
3994
- "tw:[&>*:not(:first-child)]:before:left-0",
3995
- "tw:[&>*:not(:first-child)]:before:h-full",
3996
- "tw:[&>*:not(:first-child)]:before:w-px",
3997
- "tw:[&>*:not(:first-child)]:before:bg-black/10"
3998
- ]
3999
- }
4000
- }
4001
- }
4002
- );
4003
- var ButtonGroup = ({
4004
- ref,
4005
- children,
4006
- space = "small",
4007
- className,
4008
- variant,
4009
- ...rest
4010
- }) => {
4011
- return /* @__PURE__ */ jsx(
4012
- "div",
4013
- {
4014
- ref,
4015
- ...rest,
4016
- role: "group",
4017
- "data-variant": variant,
4018
- className: cn(buttonGroupVariant({ variant, space }), className),
4019
- children
4020
- }
4021
- );
4022
- };
4023
-
4024
- // src/components/Label/Label.tsx
4025
- init_utils2();
4026
- var Optional = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-muted-foreground", className), children: "(optional)" });
4027
- var Required = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-primary", className), children: "*" });
4028
- var Label2 = ({ className, children, id, htmlFor, ...rest }) => /* @__PURE__ */ jsx(
4029
- RLabel.Root,
4030
- {
4031
- ...rest,
4032
- id: id?.toString(),
4033
- htmlFor: htmlFor?.toString(),
4034
- className: cn(
4035
- "tw:m-0 tw:text-foreground tw:font-normal tw:peer-disabled:opacity-50",
4036
- className
4037
- ),
4038
- children
4039
- }
4040
- );
4041
- Label2.Optional = Optional;
4042
- Label2.Required = Required;
4043
-
4044
- // src/blocks/MarkdownEditor/plugins/toolbar/LinkPanel.tsx
4045
- init_icons();
4046
-
4047
- // src/blocks/MarkdownEditor/plugins/toolbar/ToolbarButton.tsx
4048
- init_Tooltip2();
4049
- init_utils2();
4050
665
  var ToolbarButton = ({
4051
666
  active,
4052
667
  disabled,
@@ -4148,7 +763,7 @@ var LinkPanel = ({ editor, isLink }) => {
4148
763
  className: "tw:absolute tw:left-0 tw:top-full tw:z-50 tw:mt-1 tw:w-80 tw:rounded-md tw:border tw:border-border tw:bg-popover tw:p-3 tw:text-popover-foreground tw:shadow-lg",
4149
764
  children: /* @__PURE__ */ jsxs("div", { className: "tw:flex tw:flex-col tw:gap-2", children: [
4150
765
  /* @__PURE__ */ jsxs(FormGroup, { children: [
4151
- /* @__PURE__ */ jsx(Label2, { htmlFor: "link-label", className: "tw:mb-1 tw:text-xs", children: "Label" }),
766
+ /* @__PURE__ */ jsx(Label, { htmlFor: "link-label", className: "tw:mb-1 tw:text-xs", children: "Label" }),
4152
767
  /* @__PURE__ */ jsx(
4153
768
  TextInput,
4154
769
  {
@@ -4163,7 +778,7 @@ var LinkPanel = ({ editor, isLink }) => {
4163
778
  )
4164
779
  ] }),
4165
780
  /* @__PURE__ */ jsxs(FormGroup, { children: [
4166
- /* @__PURE__ */ jsx(Label2, { htmlFor: "link-url", className: "tw:mb-1 tw:text-xs", children: "URL" }),
781
+ /* @__PURE__ */ jsx(Label, { htmlFor: "link-url", className: "tw:mb-1 tw:text-xs", children: "URL" }),
4167
782
  /* @__PURE__ */ jsx(
4168
783
  TextInput,
4169
784
  {