@lindle/linoardo 1.0.9 → 1.0.10

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.
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as React5 from 'react';
2
2
  import { twMerge } from 'tailwind-merge';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
+ import { createPortal } from 'react-dom';
4
5
 
5
6
  // src/Containment/Button/index.tsx
6
7
 
@@ -8,60 +9,90 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
9
  var iconBaseClasses = {
9
10
  mdi: ["mdi"]
10
11
  };
11
-
12
- // src/Containment/Button/states.button.ts
13
- var base = "btn-base focus-visible:outline-none focus-visible:ring-2 rounded-md transition-colors duration-200 font-medium disabled:opacity-50 disabled:cursor-not-allowed";
14
- var blackAndWhiteVariantClass = "bg-white text-black border border-black focus-visible:ring-black/40 focus-visible:ring-offset-white";
12
+ var base = "btn-base focus-visible:outline-none focus-visible:ring-2 rounded-lg transition-colors duration-200 font-medium disabled:opacity-50 disabled:cursor-not-allowed";
13
+ var blackAndWhiteVariantClass = "bg-white text-black border border-black focus-visible:ring-black/40 focus-visible:ring-offset-white";
14
+ var blackAndWhitePaletteClasses = {
15
+ solid: twMerge(blackAndWhiteVariantClass, "bg-black text-white"),
16
+ outline: blackAndWhiteVariantClass,
17
+ ghost: "bg-neutral-300 text-white",
18
+ text: blackAndWhiteVariantClass,
19
+ filled: "bg-black text-white",
20
+ underlined: twMerge(blackAndWhiteVariantClass, "b"),
21
+ rounded: blackAndWhiteVariantClass,
22
+ sharp: "bg-black text-white rounded-none"
23
+ };
15
24
  var paletteVariantClasses = {
16
25
  primary: {
17
26
  solid: "bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary",
27
+ sharp: "rounded-none bg-primary text-white hover:bg-primary/90 focus-visible:ring-primary",
18
28
  outline: "border border-primary text-primary bg-white hover:bg-primary hover:text-white focus-visible:ring-primary",
19
- ghost: "text-primary bg-primary/10 hover:bg-primary/20 focus-visible:ring-primary/40",
20
- text: "bg-transparent text-primary hover:bg-primary/10 focus-visible:ring-primary/30 underline-offset-2",
21
- bw: blackAndWhiteVariantClass
29
+ ghost: "text-primary bg-primary/10 hover:bg-primary/20 focus-visible:ring-primary/40 border border-transparent",
30
+ text: "bg-transparent text-primary hover:bg-primary/10 focus-visible:ring-primary/30 underline-offset-2 border border-transparent",
31
+ filled: "bg-primary/15 text-primary border border-primary/30 hover:bg-primary/25 focus-visible:ring-primary/25",
32
+ underlined: "bg-transparent text-primary border border-transparent underline decoration-2 underline-offset-4 hover:bg-primary/5 focus-visible:ring-primary/25",
33
+ rounded: "rounded-full border border-primary/60 bg-primary/10 text-primary hover:bg-primary/20 focus-visible:ring-primary/25"
22
34
  },
23
35
  neutral: {
24
36
  solid: "bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500",
37
+ sharp: "rounded-none bg-gray-600 text-white hover:bg-gray-700 focus-visible:ring-gray-500",
25
38
  outline: "border border-gray-400 text-gray-700 bg-white hover:bg-gray-700 hover:text-white focus-visible:ring-gray-400",
26
- ghost: "text-gray-700 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-300",
27
- text: "bg-transparent text-gray-700 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2",
28
- bw: blackAndWhiteVariantClass
39
+ ghost: "text-gray-700 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-300 border border-transparent",
40
+ text: "bg-transparent text-gray-700 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent",
41
+ filled: "bg-gray-200 text-gray-900 border border-gray-300 hover:bg-gray-300 focus-visible:ring-gray-300",
42
+ underlined: "bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-300",
43
+ rounded: "rounded-full border border-gray-400 bg-white text-gray-800 hover:bg-gray-100 focus-visible:ring-gray-300"
29
44
  },
30
45
  info: {
31
46
  solid: "bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400",
47
+ sharp: "rounded-none bg-sky-500 text-white hover:bg-sky-600 focus-visible:ring-sky-400",
32
48
  outline: "border border-sky-500 text-sky-600 bg-white hover:bg-sky-500 hover:text-white focus-visible:ring-sky-400",
33
- ghost: "text-sky-600 bg-sky-100 hover:bg-sky-200 focus-visible:ring-sky-300",
34
- text: "bg-transparent text-sky-600 hover:bg-sky-100 focus-visible:ring-sky-200 underline-offset-2",
35
- bw: blackAndWhiteVariantClass
49
+ ghost: "text-sky-600 bg-sky-100 hover:bg-sky-200 focus-visible:ring-sky-300 border border-transparent",
50
+ text: "bg-transparent text-sky-600 hover:bg-sky-100 focus-visible:ring-sky-200 underline-offset-2 border border-transparent",
51
+ filled: "bg-sky-100 text-sky-700 border border-sky-200 hover:bg-sky-200 focus-visible:ring-sky-200",
52
+ underlined: "bg-transparent text-sky-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-sky-50 focus-visible:ring-sky-200",
53
+ rounded: "rounded-full border border-sky-500/70 bg-sky-50 text-sky-700 hover:bg-sky-100 focus-visible:ring-sky-200"
36
54
  },
37
55
  success: {
38
56
  solid: "bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400",
57
+ sharp: "rounded-none bg-emerald-500 text-white hover:bg-emerald-600 focus-visible:ring-emerald-400",
39
58
  outline: "border border-emerald-500 text-emerald-600 bg-white hover:bg-emerald-500 hover:text-white focus-visible:ring-emerald-400",
40
- ghost: "text-emerald-600 bg-emerald-100 hover:bg-emerald-200 focus-visible:ring-emerald-300",
41
- text: "bg-transparent text-emerald-600 hover:bg-emerald-100 focus-visible:ring-emerald-200 underline-offset-2",
42
- bw: blackAndWhiteVariantClass
59
+ ghost: "text-emerald-600 bg-emerald-100 hover:bg-emerald-200 focus-visible:ring-emerald-300 border border-transparent",
60
+ text: "bg-transparent text-emerald-600 hover:bg-emerald-100 focus-visible:ring-emerald-200 underline-offset-2 border border-transparent",
61
+ filled: "bg-emerald-100 text-emerald-700 border border-emerald-200 hover:bg-emerald-200 focus-visible:ring-emerald-200",
62
+ underlined: "bg-transparent text-emerald-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-emerald-50 focus-visible:ring-emerald-200",
63
+ rounded: "rounded-full border border-emerald-500/70 bg-emerald-50 text-emerald-700 hover:bg-emerald-100 focus-visible:ring-emerald-200"
43
64
  },
44
65
  warning: {
45
66
  solid: "bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400",
67
+ sharp: "rounded-none bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-400",
46
68
  outline: "border border-amber-500 text-amber-600 bg-white hover:bg-amber-500 hover:text-white focus-visible:ring-amber-400",
47
- ghost: "text-amber-600 bg-amber-100 hover:bg-amber-200 focus-visible:ring-amber-300",
48
- text: "bg-transparent text-amber-600 hover:bg-amber-100 focus-visible:ring-amber-200 underline-offset-2",
49
- bw: blackAndWhiteVariantClass
69
+ ghost: "text-amber-600 bg-amber-100 hover:bg-amber-200 focus-visible:ring-amber-300 border border-transparent",
70
+ text: "bg-transparent text-amber-600 hover:bg-amber-100 focus-visible:ring-amber-200 underline-offset-2 border border-transparent",
71
+ filled: "bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200 focus-visible:ring-amber-200",
72
+ underlined: "bg-transparent text-amber-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-amber-50 focus-visible:ring-amber-200",
73
+ rounded: "rounded-full border border-amber-500/70 bg-amber-50 text-amber-700 hover:bg-amber-100 focus-visible:ring-amber-200"
50
74
  },
51
75
  danger: {
52
76
  solid: "bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400",
77
+ sharp: "rounded-none bg-red-500 text-white hover:bg-red-600 focus-visible:ring-red-400",
53
78
  outline: "border border-red-500 text-red-600 bg-white hover:bg-red-500 hover:text-white focus-visible:ring-red-400",
54
- ghost: "text-red-600 bg-red-100 hover:bg-red-200 focus-visible:ring-red-300",
55
- text: "bg-transparent text-red-600 hover:bg-red-100 focus-visible:ring-red-200 underline-offset-2",
56
- bw: blackAndWhiteVariantClass
79
+ ghost: "text-red-600 bg-red-100 hover:bg-red-200 focus-visible:ring-red-300 border border-transparent",
80
+ text: "bg-transparent text-red-600 hover:bg-red-100 focus-visible:ring-red-200 underline-offset-2 border border-transparent",
81
+ filled: "bg-red-100 text-red-700 border border-red-200 hover:bg-red-200 focus-visible:ring-red-200",
82
+ underlined: "bg-transparent text-red-600 border border-transparent underline decoration-2 underline-offset-4 hover:bg-red-50 focus-visible:ring-red-200",
83
+ rounded: "rounded-full border border-red-500/70 bg-red-50 text-red-700 hover:bg-red-100 focus-visible:ring-red-200"
57
84
  },
58
85
  surface: {
59
86
  solid: "bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200",
87
+ sharp: "rounded-none bg-white text-gray-900 border border-gray-200 hover:bg-gray-50 focus-visible:ring-gray-200",
60
88
  outline: "border border-gray-300 text-gray-900 bg-white hover:bg-gray-100 focus-visible:ring-gray-200",
61
- ghost: "text-gray-900 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-200",
62
- text: "bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2",
63
- bw: blackAndWhiteVariantClass
64
- }
89
+ ghost: "text-gray-900 bg-gray-100 hover:bg-gray-200 focus-visible:ring-gray-200 border border-transparent",
90
+ text: "bg-transparent text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-200 underline-offset-2 border border-transparent",
91
+ filled: "bg-gray-50 text-gray-900 border border-gray-200 hover:bg-white focus-visible:ring-gray-200",
92
+ underlined: "bg-transparent text-gray-900 border border-transparent underline decoration-2 underline-offset-4 hover:bg-gray-100 focus-visible:ring-gray-200",
93
+ rounded: "rounded-full border border-gray-300 bg-white text-gray-900 hover:bg-gray-50 focus-visible:ring-gray-200"
94
+ },
95
+ bw: blackAndWhitePaletteClasses
65
96
  };
66
97
  var resolveVariantClass = (variant, palette) => {
67
98
  const paletteVariants = paletteVariantClasses[palette] ?? paletteVariantClasses.primary;
@@ -134,7 +165,7 @@ var Button = React5.forwardRef(
134
165
  ref,
135
166
  onClick,
136
167
  disabled: isDisabled,
137
- className: twMerge(base, cursor, variantClass, sizeClass, blockClass, gapClass, className, "border-2 border-l"),
168
+ className: twMerge(base, cursor, variantClass, sizeClass, blockClass, gapClass, className),
138
169
  "data-loading": loading || void 0,
139
170
  "aria-busy": loading || void 0,
140
171
  children: [
@@ -158,56 +189,88 @@ var chipSizeClasses = {
158
189
  };
159
190
  var closeButtonClasses = "ml-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-transparent text-current/70 transition-colors duration-200 hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-current/30 focus-visible:ring-offset-2";
160
191
  var blackAndWhiteChipVariantClass = "bg-white text-black border border-black hover:bg-white focus-visible:ring-black/40 focus-visible:ring-offset-white";
192
+ var blackAndWhitePaletteClasses2 = {
193
+ solid: blackAndWhiteChipVariantClass,
194
+ outline: blackAndWhiteChipVariantClass,
195
+ ghost: blackAndWhiteChipVariantClass,
196
+ text: blackAndWhiteChipVariantClass,
197
+ filled: blackAndWhiteChipVariantClass,
198
+ underlined: blackAndWhiteChipVariantClass,
199
+ rounded: blackAndWhiteChipVariantClass,
200
+ sharp: `${blackAndWhiteChipVariantClass} rounded-none`
201
+ };
161
202
  var paletteVariantClasses2 = {
162
203
  primary: {
163
204
  solid: "bg-primary text-white border border-primary hover:bg-primary/90",
205
+ sharp: "rounded-none bg-primary text-white border border-primary hover:bg-primary/90",
164
206
  outline: "bg-transparent text-primary border border-primary hover:bg-primary/10",
165
207
  ghost: "bg-primary/15 text-primary border border-transparent hover:bg-primary/25",
166
208
  text: "bg-transparent text-primary border border-transparent hover:text-primary/80",
167
- bw: blackAndWhiteChipVariantClass
209
+ filled: "bg-primary/10 text-primary border border-primary/30 hover:bg-primary/20",
210
+ underlined: "bg-transparent text-primary border-0 border-b-2 border-primary px-0 rounded-none hover:text-primary/80",
211
+ rounded: "bg-white text-primary border border-primary/40 shadow-sm hover:bg-primary/5"
168
212
  },
169
213
  neutral: {
170
214
  solid: "bg-gray-900 text-white border border-gray-900 hover:bg-gray-800",
215
+ sharp: "rounded-none bg-gray-900 text-white border border-gray-900 hover:bg-gray-800",
171
216
  outline: "bg-transparent text-gray-900 border border-gray-500 hover:bg-gray-100",
172
217
  ghost: "bg-gray-100 text-gray-900 border border-transparent hover:bg-gray-200",
173
218
  text: "bg-transparent text-gray-900 border border-transparent hover:text-gray-700",
174
- bw: blackAndWhiteChipVariantClass
219
+ filled: "bg-gray-200 text-gray-900 border border-gray-300 hover:bg-gray-300",
220
+ underlined: "bg-transparent text-gray-900 border-0 border-b-2 border-gray-500 px-0 rounded-none hover:text-gray-700",
221
+ rounded: "bg-white text-gray-900 border border-gray-300 shadow-sm hover:bg-gray-100"
175
222
  },
176
223
  info: {
177
224
  solid: "bg-sky-500 text-white border border-sky-500 hover:bg-sky-600",
225
+ sharp: "rounded-none bg-sky-500 text-white border border-sky-500 hover:bg-sky-600",
178
226
  outline: "bg-transparent text-sky-600 border border-sky-500 hover:bg-sky-50",
179
227
  ghost: "bg-sky-100 text-sky-700 border border-transparent hover:bg-sky-200",
180
228
  text: "bg-transparent text-sky-600 border border-transparent hover:text-sky-700",
181
- bw: blackAndWhiteChipVariantClass
229
+ filled: "bg-sky-100 text-sky-700 border border-sky-200 hover:bg-sky-200",
230
+ underlined: "bg-transparent text-sky-600 border-0 border-b-2 border-sky-500 px-0 rounded-none hover:text-sky-700",
231
+ rounded: "bg-white text-sky-700 border border-sky-200 shadow-sm hover:bg-sky-50"
182
232
  },
183
233
  success: {
184
234
  solid: "bg-emerald-500 text-white border border-emerald-500 hover:bg-emerald-600",
235
+ sharp: "rounded-none bg-emerald-500 text-white border border-emerald-500 hover:bg-emerald-600",
185
236
  outline: "bg-transparent text-emerald-600 border border-emerald-500 hover:bg-emerald-50",
186
237
  ghost: "bg-emerald-100 text-emerald-700 border border-transparent hover:bg-emerald-200",
187
238
  text: "bg-transparent text-emerald-600 border border-transparent hover:text-emerald-700",
188
- bw: blackAndWhiteChipVariantClass
239
+ filled: "bg-emerald-100 text-emerald-700 border border-emerald-200 hover:bg-emerald-200",
240
+ underlined: "bg-transparent text-emerald-600 border-0 border-b-2 border-emerald-500 px-0 rounded-none hover:text-emerald-700",
241
+ rounded: "bg-white text-emerald-700 border border-emerald-200 shadow-sm hover:bg-emerald-50"
189
242
  },
190
243
  warning: {
191
244
  solid: "bg-amber-500 text-white border border-amber-500 hover:bg-amber-600",
245
+ sharp: "rounded-none bg-amber-500 text-white border border-amber-500 hover:bg-amber-600",
192
246
  outline: "bg-transparent text-amber-700 border border-amber-500 hover:bg-amber-50",
193
247
  ghost: "bg-amber-100 text-amber-800 border border-transparent hover:bg-amber-200",
194
248
  text: "bg-transparent text-amber-700 border border-transparent hover:text-amber-800",
195
- bw: blackAndWhiteChipVariantClass
249
+ filled: "bg-amber-100 text-amber-800 border border-amber-200 hover:bg-amber-200",
250
+ underlined: "bg-transparent text-amber-700 border-0 border-b-2 border-amber-500 px-0 rounded-none hover:text-amber-800",
251
+ rounded: "bg-white text-amber-700 border border-amber-200 shadow-sm hover:bg-amber-50"
196
252
  },
197
253
  danger: {
198
254
  solid: "bg-red-500 text-white border border-red-500 hover:bg-red-600",
255
+ sharp: "rounded-none bg-red-500 text-white border border-red-500 hover:bg-red-600",
199
256
  outline: "bg-transparent text-red-600 border border-red-500 hover:bg-red-50",
200
257
  ghost: "bg-red-100 text-red-700 border border-transparent hover:bg-red-200",
201
258
  text: "bg-transparent text-red-600 border border-transparent hover:text-red-700",
202
- bw: blackAndWhiteChipVariantClass
259
+ filled: "bg-red-100 text-red-700 border border-red-200 hover:bg-red-200",
260
+ underlined: "bg-transparent text-red-600 border-0 border-b-2 border-red-500 px-0 rounded-none hover:text-red-700",
261
+ rounded: "bg-white text-red-600 border border-red-200 shadow-sm hover:bg-red-50"
203
262
  },
204
263
  surface: {
205
264
  solid: "bg-white text-gray-900 border border-gray-200 hover:bg-gray-50",
265
+ sharp: "rounded-none bg-white text-gray-900 border border-gray-200 hover:bg-gray-50",
206
266
  outline: "bg-transparent text-gray-900 border border-gray-300 hover:bg-gray-50",
207
267
  ghost: "bg-gray-100 text-gray-900 border border-transparent hover:bg-gray-200",
208
268
  text: "bg-transparent text-gray-900 border border-transparent hover:text-gray-600",
209
- bw: blackAndWhiteChipVariantClass
210
- }
269
+ filled: "bg-gray-50 text-gray-900 border border-gray-200 hover:bg-white",
270
+ underlined: "bg-transparent text-gray-900 border-0 border-b-2 border-gray-400 px-0 rounded-none hover:text-gray-600",
271
+ rounded: "bg-white text-gray-900 border border-gray-200 shadow-sm hover:bg-gray-50"
272
+ },
273
+ bw: blackAndWhitePaletteClasses2
211
274
  };
212
275
  var resolveVariantClass2 = (variant, palette) => {
213
276
  const variants = paletteVariantClasses2[palette] ?? paletteVariantClasses2.primary;
@@ -374,7 +437,8 @@ var accentClasses = {
374
437
  success: { text: "text-emerald-600", bg: "bg-emerald-50", indicator: "bg-emerald-500" },
375
438
  warning: { text: "text-amber-700", bg: "bg-amber-50", indicator: "bg-amber-500" },
376
439
  danger: { text: "text-red-600", bg: "bg-red-50", indicator: "bg-red-500" },
377
- surface: { text: "text-gray-900", bg: "bg-gray-100", indicator: "bg-gray-900" }
440
+ surface: { text: "text-gray-900", bg: "bg-gray-100", indicator: "bg-gray-900" },
441
+ bw: { text: "text-gray-900", bg: "bg-gray-100", indicator: "bg-gray-900" }
378
442
  };
379
443
  var ListItem = React5.forwardRef((props, ref) => {
380
444
  const {
@@ -396,6 +460,7 @@ var ListItem = React5.forwardRef((props, ref) => {
396
460
  nav: navOverride,
397
461
  divided: dividedOverride,
398
462
  color: colorOverride,
463
+ sharp: sharpOverride,
399
464
  className,
400
465
  children,
401
466
  tabIndex,
@@ -407,8 +472,9 @@ var ListItem = React5.forwardRef((props, ref) => {
407
472
  const nav = navOverride ?? false;
408
473
  const divided = dividedOverride ?? false;
409
474
  const color = colorOverride ?? "primary";
475
+ const sharp = sharpOverride ?? false;
410
476
  const accent = accentClasses[color] ?? accentClasses.primary;
411
- const shapeClass = divided ? "rounded-none" : "rounded-lg";
477
+ const shapeClass = divided || sharp ? "rounded-none" : "rounded-lg";
412
478
  const Component = component ?? (href ? "a" : "div");
413
479
  const interactive = typeof rest.onClick === "function" || Component === "a" || Component === "button";
414
480
  const resolvedRole = role ?? "listitem";
@@ -474,10 +540,13 @@ var Item_default = ListItem;
474
540
  var listBaseClasses = "flex w-full min-w-0 flex-col text-gray-900 transition-colors duration-150";
475
541
  var listVariantClasses = {
476
542
  solid: "bg-white border border-gray-200 shadow-sm shadow-gray-900/5",
543
+ sharp: "bg-white border border-gray-200 shadow-sm shadow-gray-900/5 rounded-none",
477
544
  outline: "bg-transparent border border-gray-300",
478
545
  ghost: "bg-gray-50 border border-transparent",
479
546
  text: "bg-transparent border border-transparent",
480
- bw: "bg-white text-black border border-black shadow-none"
547
+ filled: "bg-gray-50 border border-gray-200 shadow-inner shadow-gray-900/5",
548
+ underlined: "bg-transparent border border-transparent border-b border-gray-200 rounded-none",
549
+ rounded: "bg-white border border-gray-200 shadow-lg shadow-gray-900/10"
481
550
  };
482
551
  var listRoundedClasses = {
483
552
  none: "rounded-none",
@@ -508,12 +577,13 @@ var List = React5.forwardRef((props, ref) => {
508
577
  children,
509
578
  ...rest
510
579
  } = props;
580
+ const isSharpVariant = variant === "sharp";
511
581
  const variantClass = listVariantClasses[variant] ?? listVariantClasses.solid;
512
- const roundedClass = listRoundedClasses[rounded] ?? listRoundedClasses.lg;
582
+ const roundedClass = isSharpVariant ? "rounded-none" : listRoundedClasses[rounded] ?? listRoundedClasses.lg;
513
583
  const dividerClass = divided ? "divide-y divide-gray-100" : void 0;
514
584
  const gapClass = divided ? "p-0" : "gap-1 p-1";
515
585
  const navClass = nav ? "py-1" : void 0;
516
- const accentColor = variant === "bw" ? "surface" : color;
586
+ const accentColor = color;
517
587
  const enhanceChild = (child) => {
518
588
  if (!React5.isValidElement(child)) {
519
589
  return child;
@@ -524,7 +594,8 @@ var List = React5.forwardRef((props, ref) => {
524
594
  lines: child.props.lines ?? lines,
525
595
  nav: child.props.nav ?? nav,
526
596
  divided: child.props.divided ?? divided,
527
- color: child.props.color ?? accentColor
597
+ color: child.props.color ?? accentColor,
598
+ sharp: child.props.sharp ?? isSharpVariant
528
599
  });
529
600
  }
530
601
  if (child.props && typeof child.props === "object" && "children" in child.props) {
@@ -917,6 +988,847 @@ var Menu = React5.forwardRef((props, ref) => {
917
988
  });
918
989
  Menu.displayName = "Menu";
919
990
  var Menu_default = Menu;
991
+ var ExpansionPanelContext = React5.createContext(null);
992
+ var densityClasses2 = {
993
+ comfortable: "py-5",
994
+ default: "py-4",
995
+ compact: "py-3"
996
+ };
997
+ var roundedClasses = {
998
+ none: "rounded-none",
999
+ sm: "rounded-sm",
1000
+ md: "rounded-md",
1001
+ lg: "rounded-lg",
1002
+ xl: "rounded-xl"
1003
+ };
1004
+ var itemVariantClasses = {
1005
+ elevated: "bg-white border border-gray-200 shadow-sm shadow-gray-900/5",
1006
+ outlined: "bg-white border border-gray-200",
1007
+ tonal: "bg-gray-50 border border-gray-100",
1008
+ plain: "bg-transparent border border-transparent"
1009
+ };
1010
+ var accentClasses2 = {
1011
+ primary: { text: "text-primary", bg: "bg-primary/5", border: "border-primary/30" },
1012
+ neutral: { text: "text-gray-900", bg: "bg-gray-100", border: "border-gray-200" },
1013
+ info: { text: "text-sky-600", bg: "bg-sky-50", border: "border-sky-200" },
1014
+ success: { text: "text-emerald-600", bg: "bg-emerald-50", border: "border-emerald-200" },
1015
+ warning: { text: "text-amber-600", bg: "bg-amber-50", border: "border-amber-200" },
1016
+ danger: { text: "text-red-600", bg: "bg-red-50", border: "border-red-200" },
1017
+ surface: { text: "text-gray-900", bg: "bg-gray-100", border: "border-gray-200" },
1018
+ bw: { text: "text-gray-900", bg: "bg-gray-100", border: "border-gray-200" }
1019
+ };
1020
+ var ExpansionPanelItem = React5.forwardRef((props, ref) => {
1021
+ const {
1022
+ value,
1023
+ title,
1024
+ subtitle,
1025
+ text,
1026
+ prepend,
1027
+ append,
1028
+ expandIcon,
1029
+ collapseIcon,
1030
+ hideToggleIcon = false,
1031
+ headerClassName,
1032
+ contentClassName,
1033
+ className,
1034
+ disabled = false,
1035
+ children,
1036
+ color: colorOverride,
1037
+ ...rest
1038
+ } = props;
1039
+ const context = React5.useContext(ExpansionPanelContext);
1040
+ const generatedValue = React5.useId();
1041
+ const panelValue = value ?? generatedValue;
1042
+ const density = context?.density ?? "default";
1043
+ const color = colorOverride ?? context?.color ?? "primary";
1044
+ const divider = context?.divider ?? true;
1045
+ const variant = context?.variant ?? "elevated";
1046
+ const rounded = context?.rounded ?? "lg";
1047
+ const accent = accentClasses2[color] ?? accentClasses2.primary;
1048
+ const headerId = React5.useId();
1049
+ const contentId = React5.useId();
1050
+ const [standaloneExpanded, setStandaloneExpanded] = React5.useState(false);
1051
+ const isExpanded = context ? context.expandedValues.includes(panelValue) : standaloneExpanded;
1052
+ const handleToggle = () => {
1053
+ if (disabled) {
1054
+ return;
1055
+ }
1056
+ if (context) {
1057
+ context.toggle(panelValue, disabled);
1058
+ } else {
1059
+ setStandaloneExpanded((prev) => !prev);
1060
+ }
1061
+ };
1062
+ const rootSurface = divider ? "bg-transparent border-0 shadow-none" : itemVariantClasses[variant];
1063
+ const shapeClass = divider ? void 0 : roundedClasses[rounded] ?? roundedClasses.lg;
1064
+ const densityPadding = densityClasses2[density] ?? densityClasses2.default;
1065
+ const disabledClass = disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer";
1066
+ const titleClass = isExpanded ? accent.text : void 0;
1067
+ const activeBorderClass = twMerge("border-l-2 border-transparent", isExpanded ? accent.border : void 0);
1068
+ const defaultToggleIcon = /* @__PURE__ */ jsx("i", { className: "mdi mdi-chevron-down text-lg leading-none transition-transform duration-200", "aria-hidden": true });
1069
+ const hasContent = Boolean(children ?? text);
1070
+ const contentAnimationClass = isExpanded ? "pb-5 opacity-100" : "pb-0 opacity-0";
1071
+ const toggleIconNode = hideToggleIcon ? null : isExpanded && collapseIcon ? collapseIcon : expandIcon ?? defaultToggleIcon;
1072
+ const shouldRotateDefaultIcon = !expandIcon && !collapseIcon && !hideToggleIcon;
1073
+ const toggleWrapperClass = twMerge(
1074
+ "ml-3 flex h-6 w-6 items-center justify-center text-gray-500 transition-transform duration-200",
1075
+ shouldRotateDefaultIcon && isExpanded ? "rotate-180" : void 0
1076
+ );
1077
+ return /* @__PURE__ */ jsxs(
1078
+ "div",
1079
+ {
1080
+ ...rest,
1081
+ ref,
1082
+ className: twMerge(
1083
+ "expansion-panel-item flex flex-col overflow-hidden transition-colors duration-200",
1084
+ rootSurface,
1085
+ shapeClass,
1086
+ className
1087
+ ),
1088
+ "data-state": isExpanded ? "open" : "closed",
1089
+ "data-disabled": disabled || void 0,
1090
+ children: [
1091
+ /* @__PURE__ */ jsxs(
1092
+ "button",
1093
+ {
1094
+ type: "button",
1095
+ id: headerId,
1096
+ onClick: handleToggle,
1097
+ disabled,
1098
+ "aria-expanded": isExpanded,
1099
+ "aria-controls": hasContent ? contentId : void 0,
1100
+ className: twMerge(
1101
+ "flex w-full items-center gap-4 px-4 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
1102
+ densityPadding,
1103
+ disabledClass,
1104
+ isExpanded ? accent.bg : void 0,
1105
+ headerClassName
1106
+ ),
1107
+ "data-state": isExpanded ? "open" : "closed",
1108
+ children: [
1109
+ prepend && /* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 items-center justify-center text-gray-500", children: prepend }),
1110
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5 text-left", children: [
1111
+ title && /* @__PURE__ */ jsx("span", { className: twMerge("truncate font-medium text-gray-900", titleClass), children: title }),
1112
+ subtitle && /* @__PURE__ */ jsx("span", { className: "text-sm text-gray-500", children: subtitle })
1113
+ ] }),
1114
+ append && /* @__PURE__ */ jsx("span", { className: "ml-auto flex items-center gap-2 text-sm text-gray-500", children: append }),
1115
+ !hideToggleIcon && /* @__PURE__ */ jsx("span", { className: toggleWrapperClass, children: toggleIconNode })
1116
+ ]
1117
+ }
1118
+ ),
1119
+ hasContent && /* @__PURE__ */ jsx(
1120
+ "div",
1121
+ {
1122
+ className: "grid overflow-hidden border-t border-gray-100 transition-all duration-200 ease-in-out",
1123
+ style: { gridTemplateRows: isExpanded ? "1fr" : "0fr" },
1124
+ "aria-hidden": isExpanded ? void 0 : true,
1125
+ "data-state": isExpanded ? "open" : "closed",
1126
+ children: /* @__PURE__ */ jsx(
1127
+ "div",
1128
+ {
1129
+ id: contentId,
1130
+ role: "region",
1131
+ "aria-labelledby": headerId,
1132
+ "data-state": isExpanded ? "open" : "closed",
1133
+ className: twMerge(
1134
+ "min-h-0 px-4 pt-0 text-sm text-gray-600 transition-all duration-200",
1135
+ activeBorderClass,
1136
+ contentAnimationClass,
1137
+ isExpanded ? "pointer-events-auto" : "pointer-events-none",
1138
+ contentClassName
1139
+ ),
1140
+ children: children ?? text
1141
+ }
1142
+ )
1143
+ }
1144
+ )
1145
+ ]
1146
+ }
1147
+ );
1148
+ });
1149
+ ExpansionPanelItem.displayName = "ExpansionPanelItem";
1150
+ var ExpansionPanelItem_default = ExpansionPanelItem;
1151
+ var variantContainerClasses = {
1152
+ elevated: "bg-white border border-gray-200 shadow-lg shadow-gray-900/10",
1153
+ outlined: "bg-white border border-gray-200",
1154
+ tonal: "bg-gray-50 border border-gray-100",
1155
+ plain: "bg-transparent border border-transparent"
1156
+ };
1157
+ var roundedClasses2 = {
1158
+ none: "rounded-none",
1159
+ sm: "rounded-sm",
1160
+ md: "rounded-md",
1161
+ lg: "rounded-lg",
1162
+ xl: "rounded-xl"
1163
+ };
1164
+ var uniqueValues = (values) => Array.from(new Set(values));
1165
+ var normalizeValues = (value, allowMultiple) => {
1166
+ if (value === void 0 || value === null) {
1167
+ return [];
1168
+ }
1169
+ const normalized = Array.isArray(value) ? value : [value];
1170
+ if (allowMultiple) {
1171
+ return uniqueValues(normalized);
1172
+ }
1173
+ return normalized.length ? [normalized[0]] : [];
1174
+ };
1175
+ var clampValues = (values, allowMultiple) => allowMultiple ? uniqueValues(values) : values.length ? [values[0]] : [];
1176
+ var ExpansionPanel = React5.forwardRef((props, ref) => {
1177
+ const {
1178
+ variant = "elevated",
1179
+ rounded = "lg",
1180
+ density = "default",
1181
+ color = "primary",
1182
+ divider = true,
1183
+ multiple = false,
1184
+ value,
1185
+ defaultValue,
1186
+ onChange,
1187
+ className,
1188
+ children,
1189
+ ...rest
1190
+ } = props;
1191
+ const isControlled = value !== void 0;
1192
+ const controlledValues = React5.useMemo(() => {
1193
+ if (!isControlled) {
1194
+ return void 0;
1195
+ }
1196
+ return normalizeValues(value, multiple);
1197
+ }, [isControlled, value, multiple]);
1198
+ const [internalValues, setInternalValues] = React5.useState(
1199
+ () => normalizeValues(defaultValue, multiple)
1200
+ );
1201
+ const expandedValues = controlledValues ?? internalValues;
1202
+ React5.useEffect(() => {
1203
+ if (!isControlled) {
1204
+ setInternalValues((prev) => clampValues(prev, multiple));
1205
+ }
1206
+ }, [multiple, isControlled]);
1207
+ const handleValueChange = React5.useCallback(
1208
+ (next) => {
1209
+ if (!isControlled) {
1210
+ setInternalValues(next);
1211
+ }
1212
+ if (onChange) {
1213
+ if (multiple) {
1214
+ onChange(next);
1215
+ } else {
1216
+ onChange(next[0] ?? null);
1217
+ }
1218
+ }
1219
+ },
1220
+ [isControlled, multiple, onChange]
1221
+ );
1222
+ const toggle = React5.useCallback(
1223
+ (panelValue, disabled) => {
1224
+ if (disabled) {
1225
+ return;
1226
+ }
1227
+ const isActive = expandedValues.includes(panelValue);
1228
+ const next = multiple ? isActive ? expandedValues.filter((v) => v !== panelValue) : [...expandedValues, panelValue] : isActive ? [] : [panelValue];
1229
+ handleValueChange(next);
1230
+ },
1231
+ [expandedValues, handleValueChange, multiple]
1232
+ );
1233
+ const providerValue = React5.useMemo(
1234
+ () => ({ expandedValues, toggle, density, color, divider, rounded, variant }),
1235
+ [expandedValues, toggle, density, color, divider, rounded, variant]
1236
+ );
1237
+ const variantClass = divider ? variantContainerClasses[variant] : "bg-transparent border border-transparent shadow-none";
1238
+ const shapeClass = roundedClasses2[rounded] ?? roundedClasses2.lg;
1239
+ const layoutClass = divider ? "divide-y divide-gray-100 overflow-hidden" : "gap-4";
1240
+ return /* @__PURE__ */ jsx(ExpansionPanelContext.Provider, { value: providerValue, children: /* @__PURE__ */ jsx(
1241
+ "div",
1242
+ {
1243
+ ...rest,
1244
+ ref,
1245
+ className: twMerge("expansion-panel flex w-full flex-col text-gray-900", variantClass, shapeClass, layoutClass, className),
1246
+ children
1247
+ }
1248
+ ) });
1249
+ });
1250
+ ExpansionPanel.displayName = "ExpansionPanel";
1251
+ var ExpansionPanel_default = ExpansionPanel;
1252
+ var isBrowser2 = typeof window !== "undefined";
1253
+ var useIsomorphicLayoutEffect2 = isBrowser2 ? React5.useLayoutEffect : React5.useEffect;
1254
+ var containerBaseClasses = "fixed inset-0 z-[70] flex items-center justify-center p-4 sm:p-8 data-[state=closed]:pointer-events-none";
1255
+ var overlayBaseClasses2 = "absolute inset-0 bg-gray-900/55 backdrop-blur-[2px] transition-opacity duration-200 data-[state=closed]:opacity-0 data-[state=open]:opacity-100";
1256
+ var panelWrapperClasses = "relative z-10 flex w-full max-h-[95vh] justify-center transition-transform transition-opacity duration-200 data-[state=closed]:translate-y-4 data-[state=closed]:opacity-0 data-[state=open]:translate-y-0 data-[state=open]:opacity-100";
1257
+ var panelBaseClasses = "pointer-events-auto w-full max-h-[90vh] overflow-auto rounded-2xl bg-white p-6 text-gray-900 shadow-2xl shadow-black/20 ring-1 ring-black/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40";
1258
+ var resolveSizeValue = (value) => {
1259
+ if (value === void 0) {
1260
+ return void 0;
1261
+ }
1262
+ return typeof value === "number" ? `${value}px` : value;
1263
+ };
1264
+ var Dialog = React5.forwardRef((props, forwardedRef) => {
1265
+ const {
1266
+ activator,
1267
+ children,
1268
+ open: openProp,
1269
+ defaultOpen = false,
1270
+ onOpenChange,
1271
+ persistent = false,
1272
+ closeOnEsc = true,
1273
+ closeOnOutsideClick = true,
1274
+ closeOnContentClick = false,
1275
+ scrim = true,
1276
+ keepMounted = false,
1277
+ fullscreen = false,
1278
+ maxWidth = "32rem",
1279
+ width,
1280
+ containerClassName,
1281
+ overlayClassName,
1282
+ overlayProps,
1283
+ scrollLock = true,
1284
+ disabled = false,
1285
+ className,
1286
+ style,
1287
+ tabIndex: tabIndexProp,
1288
+ role: roleProp,
1289
+ id: idProp,
1290
+ ["aria-modal"]: ariaModalProp,
1291
+ ...rest
1292
+ } = props;
1293
+ const { onClick: panelOnClick, ...panelProps } = rest;
1294
+ const {
1295
+ className: overlayPropsClassName,
1296
+ onPointerDown: overlayOnPointerDown,
1297
+ ...overlayRestProps
1298
+ } = overlayProps ?? {};
1299
+ const baseId = React5.useId();
1300
+ const panelId = idProp ?? `${baseId}-dialog`;
1301
+ const activatorId = `${panelId}-activator`;
1302
+ const role = roleProp ?? "dialog";
1303
+ const resolvedTabIndex = tabIndexProp ?? -1;
1304
+ const isControlled = typeof openProp === "boolean";
1305
+ const [internalOpen, setInternalOpen] = React5.useState(defaultOpen);
1306
+ const open = isControlled ? Boolean(openProp) : internalOpen;
1307
+ const state = open ? "open" : "closed";
1308
+ const panelRef = React5.useRef(null);
1309
+ const activatorRef = React5.useRef(null);
1310
+ const previouslyFocusedElement = React5.useRef(null);
1311
+ const [mounted, setMounted] = React5.useState(false);
1312
+ useIsomorphicLayoutEffect2(() => {
1313
+ setMounted(true);
1314
+ }, []);
1315
+ const setPanelRef = React5.useCallback(
1316
+ (node) => {
1317
+ panelRef.current = node;
1318
+ if (typeof forwardedRef === "function") {
1319
+ forwardedRef(node);
1320
+ } else if (forwardedRef) {
1321
+ forwardedRef.current = node;
1322
+ }
1323
+ },
1324
+ [forwardedRef]
1325
+ );
1326
+ const setActivatorNode = React5.useCallback((node) => {
1327
+ activatorRef.current = node;
1328
+ }, []);
1329
+ const updateOpen = React5.useCallback(
1330
+ (nextOpen, options) => {
1331
+ if (disabled && nextOpen) {
1332
+ return;
1333
+ }
1334
+ if (!options?.force && !nextOpen && persistent) {
1335
+ return;
1336
+ }
1337
+ if (!isControlled) {
1338
+ setInternalOpen(nextOpen);
1339
+ }
1340
+ onOpenChange?.(nextOpen);
1341
+ },
1342
+ [disabled, isControlled, onOpenChange, persistent]
1343
+ );
1344
+ React5.useEffect(() => {
1345
+ if (!disabled || !open) {
1346
+ return;
1347
+ }
1348
+ updateOpen(false, { force: true });
1349
+ }, [disabled, open, updateOpen]);
1350
+ React5.useEffect(() => {
1351
+ if (!isBrowser2) {
1352
+ return;
1353
+ }
1354
+ if (open) {
1355
+ previouslyFocusedElement.current = document.activeElement;
1356
+ const node = panelRef.current;
1357
+ if (node) {
1358
+ if (!node.hasAttribute("tabindex")) {
1359
+ node.setAttribute("tabindex", resolvedTabIndex.toString());
1360
+ }
1361
+ requestAnimationFrame(() => node.focus({ preventScroll: true }));
1362
+ }
1363
+ return;
1364
+ }
1365
+ const previous = previouslyFocusedElement.current ?? activatorRef.current;
1366
+ if (previous && typeof previous.focus === "function") {
1367
+ previous.focus();
1368
+ }
1369
+ }, [open, resolvedTabIndex]);
1370
+ React5.useEffect(() => {
1371
+ if (!open || !closeOnEsc || persistent || !isBrowser2) {
1372
+ return;
1373
+ }
1374
+ const handleKeyDown = (event) => {
1375
+ if (event.key !== "Escape") {
1376
+ return;
1377
+ }
1378
+ event.stopPropagation();
1379
+ updateOpen(false);
1380
+ };
1381
+ document.addEventListener("keydown", handleKeyDown);
1382
+ return () => document.removeEventListener("keydown", handleKeyDown);
1383
+ }, [closeOnEsc, open, persistent, updateOpen]);
1384
+ React5.useEffect(() => {
1385
+ if (!scrollLock || !open || !isBrowser2) {
1386
+ return;
1387
+ }
1388
+ const { body, documentElement } = document;
1389
+ const previousOverflow = body.style.overflow;
1390
+ const previousPaddingRight = body.style.paddingRight;
1391
+ const scrollbarWidth = window.innerWidth - documentElement.clientWidth;
1392
+ body.style.overflow = "hidden";
1393
+ if (scrollbarWidth > 0) {
1394
+ const computedPaddingRight = parseFloat(window.getComputedStyle(body).paddingRight) || 0;
1395
+ body.style.paddingRight = `${computedPaddingRight + scrollbarWidth}px`;
1396
+ }
1397
+ return () => {
1398
+ body.style.overflow = previousOverflow;
1399
+ body.style.paddingRight = previousPaddingRight;
1400
+ };
1401
+ }, [open, scrollLock]);
1402
+ const handleOverlayPointerDown = React5.useCallback(
1403
+ (event) => {
1404
+ overlayOnPointerDown?.(event);
1405
+ if (event.defaultPrevented) {
1406
+ return;
1407
+ }
1408
+ if (!closeOnOutsideClick || event.button > 0) {
1409
+ return;
1410
+ }
1411
+ updateOpen(false);
1412
+ },
1413
+ [closeOnOutsideClick, overlayOnPointerDown, updateOpen]
1414
+ );
1415
+ const handleContentClick = React5.useCallback(
1416
+ (event) => {
1417
+ panelOnClick?.(event);
1418
+ if (event.defaultPrevented) {
1419
+ return;
1420
+ }
1421
+ if (closeOnContentClick) {
1422
+ updateOpen(false, { force: true });
1423
+ }
1424
+ },
1425
+ [closeOnContentClick, panelOnClick, updateOpen]
1426
+ );
1427
+ const handleActivatorClick = React5.useCallback(
1428
+ (event) => {
1429
+ if (disabled) {
1430
+ event.preventDefault();
1431
+ event.stopPropagation();
1432
+ return;
1433
+ }
1434
+ updateOpen(!open, { force: true });
1435
+ },
1436
+ [disabled, open, updateOpen]
1437
+ );
1438
+ const handleActivatorKeyDown = React5.useCallback(
1439
+ (event) => {
1440
+ if (event.key !== "Enter" && event.key !== " ") {
1441
+ return;
1442
+ }
1443
+ event.preventDefault();
1444
+ if (disabled) {
1445
+ return;
1446
+ }
1447
+ updateOpen(!open, { force: true });
1448
+ },
1449
+ [disabled, open, updateOpen]
1450
+ );
1451
+ const shouldRenderOverlay = (scrim || closeOnOutsideClick) && isBrowser2;
1452
+ const portalReady = mounted && isBrowser2 && (open || keepMounted);
1453
+ const resolvedPanelStyle = React5.useMemo(() => {
1454
+ const nextStyle = { ...style };
1455
+ if (fullscreen) {
1456
+ if (nextStyle.maxWidth === void 0) {
1457
+ nextStyle.maxWidth = "none";
1458
+ }
1459
+ if (nextStyle.width === void 0) {
1460
+ nextStyle.width = "100%";
1461
+ }
1462
+ if (nextStyle.height === void 0) {
1463
+ nextStyle.height = "100%";
1464
+ }
1465
+ if (nextStyle.maxHeight === void 0) {
1466
+ nextStyle.maxHeight = "100%";
1467
+ }
1468
+ } else {
1469
+ if (nextStyle.maxWidth === void 0) {
1470
+ nextStyle.maxWidth = resolveSizeValue(maxWidth);
1471
+ }
1472
+ if (width !== void 0 && nextStyle.width === void 0) {
1473
+ nextStyle.width = resolveSizeValue(width);
1474
+ }
1475
+ }
1476
+ return nextStyle;
1477
+ }, [fullscreen, maxWidth, style, width]);
1478
+ const ariaModal = ariaModalProp ?? (role === "dialog" || role === "alertdialog" ? true : void 0);
1479
+ const overlayNode = shouldRenderOverlay && portalReady ? /* @__PURE__ */ jsx(
1480
+ "div",
1481
+ {
1482
+ ...overlayRestProps,
1483
+ className: twMerge(
1484
+ overlayBaseClasses2,
1485
+ scrim ? void 0 : "bg-transparent backdrop-blur-none",
1486
+ overlayClassName,
1487
+ overlayPropsClassName
1488
+ ),
1489
+ "data-state": state,
1490
+ "aria-hidden": true,
1491
+ onPointerDown: handleOverlayPointerDown
1492
+ }
1493
+ ) : null;
1494
+ const dialogNode = portalReady && document.body ? createPortal(
1495
+ /* @__PURE__ */ jsxs("div", { className: twMerge(containerBaseClasses, containerClassName), "data-state": state, "aria-hidden": !open, children: [
1496
+ overlayNode,
1497
+ /* @__PURE__ */ jsx("div", { className: twMerge(panelWrapperClasses, fullscreen ? "h-full items-stretch" : "mx-auto"), "data-state": state, children: /* @__PURE__ */ jsx(
1498
+ "div",
1499
+ {
1500
+ ...panelProps,
1501
+ ref: setPanelRef,
1502
+ id: panelId,
1503
+ role,
1504
+ tabIndex: resolvedTabIndex,
1505
+ "aria-modal": ariaModal,
1506
+ className: twMerge(
1507
+ panelBaseClasses,
1508
+ fullscreen ? "h-full w-full max-w-none rounded-none" : void 0,
1509
+ className
1510
+ ),
1511
+ style: resolvedPanelStyle,
1512
+ "data-state": state,
1513
+ onClick: handleContentClick,
1514
+ children
1515
+ }
1516
+ ) })
1517
+ ] }),
1518
+ document.body
1519
+ ) : null;
1520
+ const activatorNode = activator ? activator({
1521
+ ref: setActivatorNode,
1522
+ id: activatorId,
1523
+ disabled,
1524
+ open,
1525
+ "aria-haspopup": "dialog",
1526
+ "aria-expanded": open,
1527
+ "aria-controls": panelId,
1528
+ onClick: handleActivatorClick,
1529
+ onKeyDown: handleActivatorKeyDown
1530
+ }) : null;
1531
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1532
+ activatorNode,
1533
+ dialogNode
1534
+ ] });
1535
+ });
1536
+ Dialog.displayName = "Dialog";
1537
+ var Dialog_default = Dialog;
1538
+ var tooltipBaseClasses = "absolute z-[60] max-w-xs rounded-lg border border-white/10 bg-gray-900 px-3 py-2 text-xs font-medium text-white shadow-lg shadow-black/30 ring-1 ring-black/40 transition-all duration-150 data-[state=closed]:pointer-events-none data-[state=closed]:scale-95 data-[state=closed]:opacity-0 data-[state=open]:opacity-100 data-[state=open]:scale-100";
1539
+ var wrapperBaseClasses = "relative inline-flex max-w-full align-middle";
1540
+ var arrowBaseClasses = "pointer-events-none absolute h-2 w-2 rotate-45 border border-white/10 bg-gray-900 shadow-lg shadow-black/20";
1541
+ var resolveSizeValue2 = (value) => {
1542
+ if (value === void 0) {
1543
+ return void 0;
1544
+ }
1545
+ return typeof value === "number" ? `${value}px` : value;
1546
+ };
1547
+ var placementClasses2 = {
1548
+ top: "bottom-full left-1/2 -translate-x-1/2 -translate-y-2 origin-bottom",
1549
+ "top-start": "bottom-full left-0 -translate-y-2 origin-bottom-left",
1550
+ "top-end": "bottom-full right-0 -translate-y-2 origin-bottom-right",
1551
+ bottom: "top-full left-1/2 -translate-x-1/2 translate-y-2 origin-top",
1552
+ "bottom-start": "top-full left-0 translate-y-2 origin-top-left",
1553
+ "bottom-end": "top-full right-0 translate-y-2 origin-top-right",
1554
+ left: "right-full top-1/2 -translate-y-1/2 -translate-x-2 origin-right",
1555
+ "left-start": "right-full top-0 -translate-x-2 origin-top-right",
1556
+ "left-end": "right-full bottom-0 -translate-x-2 origin-bottom-right",
1557
+ right: "left-full top-1/2 -translate-y-1/2 translate-x-2 origin-left",
1558
+ "right-start": "left-full top-0 translate-x-2 origin-top-left",
1559
+ "right-end": "left-full bottom-0 translate-x-2 origin-bottom-left"
1560
+ };
1561
+ var arrowPlacementClasses = {
1562
+ top: "left-1/2 top-full -translate-x-1/2 -translate-y-1/2",
1563
+ "top-start": "left-4 top-full -translate-y-1/2",
1564
+ "top-end": "right-4 top-full -translate-y-1/2",
1565
+ bottom: "left-1/2 bottom-full -translate-x-1/2 translate-y-1/2",
1566
+ "bottom-start": "left-4 bottom-full translate-y-1/2",
1567
+ "bottom-end": "right-4 bottom-full translate-y-1/2",
1568
+ left: "right-full top-1/2 -translate-y-1/2 translate-x-1/2",
1569
+ "left-start": "right-full top-4 translate-x-1/2",
1570
+ "left-end": "right-full bottom-4 translate-x-1/2",
1571
+ right: "left-full top-1/2 -translate-y-1/2 -translate-x-1/2",
1572
+ "right-start": "left-full top-4 -translate-x-1/2",
1573
+ "right-end": "left-full bottom-4 -translate-x-1/2"
1574
+ };
1575
+ var ToolTip = React5.forwardRef((props, forwardedRef) => {
1576
+ const {
1577
+ activator,
1578
+ children,
1579
+ open: openProp,
1580
+ defaultOpen = false,
1581
+ onOpenChange,
1582
+ placement = "top",
1583
+ openDelay = 120,
1584
+ closeDelay = 100,
1585
+ openOnHover = true,
1586
+ openOnFocus = true,
1587
+ openOnClick = false,
1588
+ interactive = false,
1589
+ arrow = true,
1590
+ disabled = false,
1591
+ keepMounted = false,
1592
+ maxWidth = "18rem",
1593
+ wrapperClassName,
1594
+ closeOnContentClick = false,
1595
+ className,
1596
+ style,
1597
+ id: idProp,
1598
+ ...rest
1599
+ } = props;
1600
+ const { onPointerEnter: tooltipPointerEnter, onPointerLeave: tooltipPointerLeave, onClick: tooltipOnClick, ...tooltipProps } = rest;
1601
+ const baseId = React5.useId();
1602
+ const tooltipId = idProp ?? `${baseId}-tooltip`;
1603
+ const isControlled = typeof openProp === "boolean";
1604
+ const [internalOpen, setInternalOpen] = React5.useState(defaultOpen);
1605
+ const open = isControlled ? Boolean(openProp) : internalOpen;
1606
+ const state = open ? "open" : "closed";
1607
+ const describedBy = open || keepMounted ? tooltipId : void 0;
1608
+ const openTimeoutRef = React5.useRef(null);
1609
+ const closeTimeoutRef = React5.useRef(null);
1610
+ const clearOpenTimer = React5.useCallback(() => {
1611
+ if (openTimeoutRef.current !== null) {
1612
+ window.clearTimeout(openTimeoutRef.current);
1613
+ openTimeoutRef.current = null;
1614
+ }
1615
+ }, []);
1616
+ const clearCloseTimer = React5.useCallback(() => {
1617
+ if (closeTimeoutRef.current !== null) {
1618
+ window.clearTimeout(closeTimeoutRef.current);
1619
+ closeTimeoutRef.current = null;
1620
+ }
1621
+ }, []);
1622
+ const setOpen = React5.useCallback(
1623
+ (nextOpen) => {
1624
+ if (!isControlled) {
1625
+ setInternalOpen(nextOpen);
1626
+ }
1627
+ onOpenChange?.(nextOpen);
1628
+ },
1629
+ [isControlled, onOpenChange]
1630
+ );
1631
+ const scheduleOpen = React5.useCallback(
1632
+ (source) => {
1633
+ if (disabled) {
1634
+ return;
1635
+ }
1636
+ clearCloseTimer();
1637
+ const delay = source === "click" ? 0 : openDelay;
1638
+ if (delay <= 0) {
1639
+ setOpen(true);
1640
+ return;
1641
+ }
1642
+ openTimeoutRef.current = window.setTimeout(() => setOpen(true), delay);
1643
+ },
1644
+ [clearCloseTimer, disabled, openDelay, setOpen]
1645
+ );
1646
+ const scheduleClose = React5.useCallback(
1647
+ (source) => {
1648
+ clearOpenTimer();
1649
+ const delay = source === "click" ? 0 : closeDelay;
1650
+ if (delay <= 0) {
1651
+ setOpen(false);
1652
+ return;
1653
+ }
1654
+ closeTimeoutRef.current = window.setTimeout(() => setOpen(false), delay);
1655
+ },
1656
+ [clearOpenTimer, closeDelay, setOpen]
1657
+ );
1658
+ React5.useEffect(() => {
1659
+ if (!disabled) {
1660
+ return;
1661
+ }
1662
+ clearOpenTimer();
1663
+ clearCloseTimer();
1664
+ if (open) {
1665
+ setOpen(false);
1666
+ }
1667
+ }, [clearCloseTimer, clearOpenTimer, disabled, open, setOpen]);
1668
+ React5.useEffect(
1669
+ () => () => {
1670
+ clearOpenTimer();
1671
+ clearCloseTimer();
1672
+ },
1673
+ [clearCloseTimer, clearOpenTimer]
1674
+ );
1675
+ const handleActivatorPointerEnter = React5.useCallback(
1676
+ (event) => {
1677
+ if (event.pointerType === "touch") {
1678
+ return;
1679
+ }
1680
+ if (openOnHover) {
1681
+ scheduleOpen("hover");
1682
+ }
1683
+ },
1684
+ [openOnHover, scheduleOpen]
1685
+ );
1686
+ const handleActivatorPointerLeave = React5.useCallback(
1687
+ (event) => {
1688
+ if (event.pointerType === "touch") {
1689
+ return;
1690
+ }
1691
+ if (openOnHover) {
1692
+ scheduleClose("hover");
1693
+ }
1694
+ },
1695
+ [openOnHover, scheduleClose]
1696
+ );
1697
+ const handleActivatorFocus = React5.useCallback(
1698
+ () => {
1699
+ if (openOnFocus) {
1700
+ scheduleOpen("focus");
1701
+ }
1702
+ },
1703
+ [openOnFocus, scheduleOpen]
1704
+ );
1705
+ const handleActivatorBlur = React5.useCallback(
1706
+ () => {
1707
+ if (openOnFocus) {
1708
+ scheduleClose("focus");
1709
+ }
1710
+ },
1711
+ [openOnFocus, scheduleClose]
1712
+ );
1713
+ const handleActivatorClick = React5.useCallback(
1714
+ (event) => {
1715
+ if (!openOnClick) {
1716
+ return;
1717
+ }
1718
+ event.preventDefault();
1719
+ event.stopPropagation();
1720
+ if (disabled) {
1721
+ return;
1722
+ }
1723
+ if (open) {
1724
+ scheduleClose("click");
1725
+ } else {
1726
+ scheduleOpen("click");
1727
+ }
1728
+ },
1729
+ [disabled, open, openOnClick, scheduleClose, scheduleOpen]
1730
+ );
1731
+ const handleActivatorKeyDown = React5.useCallback(
1732
+ (event) => {
1733
+ if (!openOnClick) {
1734
+ return;
1735
+ }
1736
+ if (event.key !== "Enter" && event.key !== " ") {
1737
+ return;
1738
+ }
1739
+ event.preventDefault();
1740
+ if (open) {
1741
+ scheduleClose("click");
1742
+ } else {
1743
+ scheduleOpen("click");
1744
+ }
1745
+ },
1746
+ [open, openOnClick, scheduleClose, scheduleOpen]
1747
+ );
1748
+ const handleTooltipPointerEnter = React5.useCallback(
1749
+ (event) => {
1750
+ tooltipPointerEnter?.(event);
1751
+ if (event.defaultPrevented) {
1752
+ return;
1753
+ }
1754
+ if (interactive) {
1755
+ clearCloseTimer();
1756
+ }
1757
+ },
1758
+ [clearCloseTimer, interactive, tooltipPointerEnter]
1759
+ );
1760
+ const handleTooltipPointerLeave = React5.useCallback(
1761
+ (event) => {
1762
+ tooltipPointerLeave?.(event);
1763
+ if (event.defaultPrevented) {
1764
+ return;
1765
+ }
1766
+ if (interactive) {
1767
+ scheduleClose("hover");
1768
+ }
1769
+ },
1770
+ [interactive, scheduleClose, tooltipPointerLeave]
1771
+ );
1772
+ const handleTooltipClick = React5.useCallback(
1773
+ (event) => {
1774
+ tooltipOnClick?.(event);
1775
+ if (event.defaultPrevented) {
1776
+ return;
1777
+ }
1778
+ if (closeOnContentClick) {
1779
+ scheduleClose("click");
1780
+ }
1781
+ },
1782
+ [closeOnContentClick, scheduleClose, tooltipOnClick]
1783
+ );
1784
+ const hasRenderableContent = children !== void 0 && children !== null;
1785
+ const shouldRenderTooltip = hasRenderableContent && (open || keepMounted);
1786
+ const pointerClass = interactive ? "pointer-events-auto" : "pointer-events-none";
1787
+ const resolvedStyle = React5.useMemo(() => {
1788
+ const nextStyle = { ...style };
1789
+ if (nextStyle.maxWidth === void 0) {
1790
+ nextStyle.maxWidth = resolveSizeValue2(maxWidth);
1791
+ }
1792
+ return nextStyle;
1793
+ }, [maxWidth, style]);
1794
+ const activatorNode = activator({
1795
+ id: `${tooltipId}-activator`,
1796
+ open,
1797
+ disabled,
1798
+ "aria-describedby": describedBy,
1799
+ onPointerEnter: handleActivatorPointerEnter,
1800
+ onPointerLeave: handleActivatorPointerLeave,
1801
+ onFocus: handleActivatorFocus,
1802
+ onBlur: handleActivatorBlur,
1803
+ onClick: openOnClick ? handleActivatorClick : void 0,
1804
+ onKeyDown: openOnClick ? handleActivatorKeyDown : void 0
1805
+ });
1806
+ return /* @__PURE__ */ jsxs("span", { className: twMerge(wrapperBaseClasses, wrapperClassName), children: [
1807
+ activatorNode,
1808
+ shouldRenderTooltip && /* @__PURE__ */ jsxs(
1809
+ "div",
1810
+ {
1811
+ ...tooltipProps,
1812
+ ref: forwardedRef,
1813
+ role: "tooltip",
1814
+ id: tooltipId,
1815
+ "aria-hidden": !open,
1816
+ "data-state": state,
1817
+ className: twMerge(tooltipBaseClasses, placementClasses2[placement], pointerClass, className),
1818
+ style: resolvedStyle,
1819
+ onPointerEnter: handleTooltipPointerEnter,
1820
+ onPointerLeave: handleTooltipPointerLeave,
1821
+ onClick: handleTooltipClick,
1822
+ children: [
1823
+ children,
1824
+ arrow && /* @__PURE__ */ jsx("span", { className: twMerge(arrowBaseClasses, arrowPlacementClasses[placement]), "aria-hidden": true, "data-arrow": true })
1825
+ ]
1826
+ }
1827
+ )
1828
+ ] });
1829
+ });
1830
+ ToolTip.displayName = "ToolTip";
1831
+ var ToolTip_default = ToolTip;
920
1832
 
921
1833
  // src/Form/Input/states.input.ts
922
1834
  var resolveIconClassName3 = (icon) => {
@@ -944,6 +1856,17 @@ var resolveIconClassName3 = (icon) => {
944
1856
  const classes = [...baseClasses, normalizedName];
945
1857
  return Array.from(new Set(classes)).join(" ");
946
1858
  };
1859
+
1860
+ // src/utils/helpers/randomStr.ts
1861
+ var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
1862
+ function generateString(length = 5) {
1863
+ let result = "";
1864
+ const charactersLength = characters.length;
1865
+ for (let i = 0; i < length; i++) {
1866
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
1867
+ }
1868
+ return result;
1869
+ }
947
1870
  var Input = ({
948
1871
  variant = "outline",
949
1872
  success,
@@ -956,9 +1879,14 @@ var Input = ({
956
1879
  }) => {
957
1880
  const classBase = "input-base px-3 py-2 focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed w-full";
958
1881
  const variantClasses = {
959
- outline: "rounded border border-gray-300 focus:border-primary focus:ring-1 focus:ring-primary",
960
- filled: "rounded bg-gray-100 border border-gray-300 focus:border-primary focus:ring-1 focus:ring-primary",
961
- underlined: "border-b-1 border-gray-300 focus:border-red-400 focus:outline-none focus:ring-none"
1882
+ solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
1883
+ sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
1884
+ outline: "rounded border border-gray-300 bg-transparent focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30",
1885
+ text: "rounded-none border-0 border-b border-transparent px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
1886
+ ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15",
1887
+ filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25",
1888
+ underlined: "rounded-none border-0 border-b border-gray-300 px-0 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent",
1889
+ rounded: "rounded-full px-4 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm"
962
1890
  };
963
1891
  const status = error ? { tone: "error", message: error } : warn ? { tone: "warn", message: warn } : success ? { tone: "success", message: success } : void 0;
964
1892
  const statusClasses = {
@@ -975,16 +1903,24 @@ var Input = ({
975
1903
  const toneClass = status ? statusClasses[status.tone] : void 0;
976
1904
  const prependIconClass = resolveIconClassName3(icon);
977
1905
  const prependPadding = prependIconClass ? "pl-10" : void 0;
1906
+ const inputName = props.name || generateString();
978
1907
  return /* @__PURE__ */ jsxs("div", { className: twMerge("flex flex-col gap-1", wrapperClassName), children: [
979
1908
  /* @__PURE__ */ jsxs("div", { className: "relative flex items-center", children: [
980
1909
  prependIconClass && /* @__PURE__ */ jsx("i", { className: twMerge("pointer-events-none absolute left-3 ", prependIconClass), "aria-hidden": true }),
981
- /* @__PURE__ */ jsx("input", { ...props, className: twMerge(classBase, variantClass, toneClass, prependPadding, className) })
1910
+ /* @__PURE__ */ jsx(
1911
+ "input",
1912
+ {
1913
+ ...props,
1914
+ className: twMerge(classBase, variantClass, toneClass, prependPadding, className),
1915
+ name: inputName
1916
+ }
1917
+ )
982
1918
  ] }),
983
1919
  status?.message && /* @__PURE__ */ jsx("span", { className: twMerge("text-sm", statusMessageClasses[status.tone]), children: status.message })
984
1920
  ] });
985
1921
  };
986
1922
  var Input_default = Input;
987
1923
 
988
- export { Button_default as Button, Chip_default as Chip, Input_default as Input, List_default as List, Item_default as ListItem, Menu_default as Menu };
1924
+ export { Button_default as Button, Chip_default as Chip, Dialog_default as Dialog, ExpansionPanel_default as ExpansionPanel, ExpansionPanelItem_default as ExpansionPanelItem, Input_default as Input, List_default as List, Item_default as ListItem, Menu_default as Menu, ToolTip_default as ToolTip };
989
1925
  //# sourceMappingURL=index.js.map
990
1926
  //# sourceMappingURL=index.js.map