@doscientos/ui 0.1.28 → 0.1.30

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
@@ -58,7 +58,10 @@ function useDebouncedValue(value, delay = 250) {
58
58
  // src/hooks/use-form-dirty.ts
59
59
  import { useCallback as useCallback2, useRef as useRef2, useState as useState3 } from "react";
60
60
  function formSnapshot(form) {
61
- const entries = Array.from(new FormData(form), ([key, value]) => [key, typeof value === "string" ? value : value.name]);
61
+ const entries = Array.from(new FormData(form), ([key, value]) => [
62
+ key,
63
+ typeof value === "string" ? value : value.name
64
+ ]);
62
65
  entries.sort(([left], [right]) => left.localeCompare(right));
63
66
  return JSON.stringify(entries);
64
67
  }
@@ -77,29 +80,30 @@ function useFormDirty() {
77
80
  setIsDirty(false);
78
81
  }
79
82
  }, []);
80
- const formRef = useCallback2((form) => {
81
- if (formElement.current) {
82
- formElement.current.removeEventListener("input", recompute);
83
- formElement.current.removeEventListener("change", recompute);
84
- formElement.current.removeEventListener("reset", recompute);
85
- }
86
- formElement.current = form;
87
- if (form) {
88
- baseline.current = formSnapshot(form);
89
- setIsDirty(false);
90
- form.addEventListener("input", recompute);
91
- form.addEventListener("change", recompute);
92
- form.addEventListener("reset", recompute);
93
- }
94
- }, [recompute]);
83
+ const formRef = useCallback2(
84
+ (form) => {
85
+ if (formElement.current) {
86
+ formElement.current.removeEventListener("input", recompute);
87
+ formElement.current.removeEventListener("change", recompute);
88
+ formElement.current.removeEventListener("reset", recompute);
89
+ }
90
+ formElement.current = form;
91
+ if (form) {
92
+ baseline.current = formSnapshot(form);
93
+ setIsDirty(false);
94
+ form.addEventListener("input", recompute);
95
+ form.addEventListener("change", recompute);
96
+ form.addEventListener("reset", recompute);
97
+ }
98
+ },
99
+ [recompute]
100
+ );
95
101
  return { formRef, isDirty, markDirty: () => setIsDirty(true), reset };
96
102
  }
97
103
 
98
104
  // src/lib/action-ripple.ts
99
105
  import { cva } from "class-variance-authority";
100
- var actionRipple = cva(
101
- "relative isolate overflow-hidden"
102
- );
106
+ var actionRipple = cva("relative isolate overflow-hidden");
103
107
 
104
108
  // src/lib/cn.ts
105
109
  import { clsx } from "clsx";
@@ -138,7 +142,8 @@ function getTextMatchParts(text, query) {
138
142
  const rangeStart = ranges[index]?.start;
139
143
  const rangeEnd = ranges[index + term.length - 1]?.end;
140
144
  if (rangeStart === void 0 || rangeEnd === void 0) break;
141
- if (rangeStart > sourceCursor) parts.push({ text: text.slice(sourceCursor, rangeStart), match: false });
145
+ if (rangeStart > sourceCursor)
146
+ parts.push({ text: text.slice(sourceCursor, rangeStart), match: false });
142
147
  parts.push({ text: text.slice(rangeStart, rangeEnd), match: true });
143
148
  sourceCursor = rangeEnd;
144
149
  index = normalized.indexOf(term, index + term.length);
@@ -148,8 +153,8 @@ function getTextMatchParts(text, query) {
148
153
  }
149
154
 
150
155
  // src/ui/accordion/accordion.tsx
151
- import "react";
152
156
  import { ChevronDownIcon, ChevronUpIcon } from "lucide-react";
157
+ import "react";
153
158
  import {
154
159
  DisclosurePanel as AccordionContentPrimitive,
155
160
  Heading as AccordionHeaderPrimitive,
@@ -213,16 +218,12 @@ function AccordionTrigger({
213
218
  }
214
219
  ) });
215
220
  }
216
- function AccordionContent({
217
- className,
218
- children,
219
- ...props
220
- }) {
221
+ function AccordionContent({ className, children, ...props }) {
221
222
  return /* @__PURE__ */ jsx(
222
223
  AccordionContentPrimitive,
223
224
  {
224
225
  "data-slot": "accordion-content",
225
- className: "h-(--disclosure-panel-height) overflow-clip text-sm text-muted-foreground transition-[height] data-open:animate-accordion-down data-closed:animate-accordion-up",
226
+ className: "text-muted-foreground data-open:animate-accordion-down data-closed:animate-accordion-up h-(--disclosure-panel-height) overflow-clip text-sm transition-[height]",
226
227
  ...props,
227
228
  children: /* @__PURE__ */ jsx(
228
229
  "div",
@@ -239,35 +240,64 @@ function AccordionContent({
239
240
  }
240
241
 
241
242
  // src/ui/alert-dialog/alert-dialog.tsx
242
- import * as React2 from "react";
243
- import {
244
- Dialog as AriaDialog,
245
- Heading,
246
- Modal,
247
- ModalOverlay,
248
- Text
249
- } from "react-aria-components";
243
+ import "react";
244
+ import "react-aria-components";
250
245
 
251
246
  // src/ui/button/button.tsx
252
- import { cva as cva2 } from "class-variance-authority";
253
247
  import { useState as useState4 } from "react";
254
248
  import {
255
249
  Button as ButtonPrimitive,
256
250
  Link as LinkPrimitive
257
251
  } from "react-aria-components";
252
+
253
+ // src/ui/button/button-variants.ts
254
+ import { cva as cva2 } from "class-variance-authority";
255
+ var buttonVariants = cva2(
256
+ cn(
257
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
258
+ actionRipple()
259
+ ),
260
+ {
261
+ variants: {
262
+ variant: {
263
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
264
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
265
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
266
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
267
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
268
+ link: "text-primary underline-offset-4 hover:underline after:hidden"
269
+ },
270
+ size: {
271
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
272
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
273
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
274
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
275
+ icon: "size-8",
276
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
277
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
278
+ "icon-lg": "size-9"
279
+ }
280
+ },
281
+ defaultVariants: {
282
+ variant: "default",
283
+ size: "default"
284
+ }
285
+ }
286
+ );
287
+
288
+ // src/ui/button/button.tsx
258
289
  import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
259
290
  var centeredRipplePosition = { x: "50%", y: "50%" };
260
291
  function getRipplePosition(event) {
261
292
  if (event.pointerType === "keyboard" || event.pointerType === "virtual") {
262
293
  return centeredRipplePosition;
263
294
  }
264
- if (!(event.target instanceof Element) || event.x === void 0 || event.y === void 0) {
295
+ if (event.x === void 0 || event.y === void 0) {
265
296
  return centeredRipplePosition;
266
297
  }
267
- const bounds = event.target.getBoundingClientRect();
268
298
  return {
269
- x: `${event.x - bounds.left}px`,
270
- y: `${event.y - bounds.top}px`
299
+ x: `${event.x}px`,
300
+ y: `${event.y}px`
271
301
  };
272
302
  }
273
303
  function useActionRipple(enabled) {
@@ -285,7 +315,7 @@ function useActionRipple(enabled) {
285
315
  {
286
316
  "aria-hidden": "true",
287
317
  "data-slot": "button-ripple",
288
- className: "pointer-events-none absolute aspect-square w-full rounded-full bg-current animate-ui-ripple motion-reduce:hidden",
318
+ className: "animate-ui-ripple pointer-events-none absolute aspect-square w-full rounded-full motion-reduce:hidden",
289
319
  style: { left: ripple.position.x, top: ripple.position.y },
290
320
  onAnimationEnd: () => setRipple((currentRipple) => currentRipple?.id === ripple.id ? null : currentRipple)
291
321
  },
@@ -293,39 +323,17 @@ function useActionRipple(enabled) {
293
323
  ) : null;
294
324
  return { ripple: rippleElement, triggerRipple };
295
325
  }
296
- var buttonVariants = cva2(
297
- cn(
298
- "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
299
- actionRipple()
300
- ),
301
- {
302
- variants: {
303
- variant: {
304
- default: "bg-primary text-primary-foreground hover:bg-primary/80",
305
- outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
306
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
307
- ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
308
- destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
309
- link: "text-primary underline-offset-4 hover:underline after:hidden"
310
- },
311
- size: {
312
- default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
313
- xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
314
- sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
315
- lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
316
- icon: "size-8",
317
- "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
318
- "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
319
- "icon-lg": "size-9"
320
- }
321
- },
322
- defaultVariants: {
323
- variant: "default",
324
- size: "default"
325
- }
326
- }
327
- );
328
- function Button({ className, variant = "default", size = "default", children, disabled, isDisabled, onClick, onPress, ...props }) {
326
+ function Button({
327
+ className,
328
+ variant = "default",
329
+ size = "default",
330
+ children,
331
+ disabled,
332
+ isDisabled,
333
+ onClick,
334
+ onPress,
335
+ ...props
336
+ }) {
329
337
  const { ripple, triggerRipple } = useActionRipple(variant !== "link");
330
338
  return /* @__PURE__ */ jsx2(
331
339
  ButtonPrimitive,
@@ -379,57 +387,300 @@ function LinkButton({
379
387
  );
380
388
  }
381
389
 
382
- // src/ui/alert-dialog/alert-dialog.tsx
383
- import { Fragment as Fragment2, jsx as jsx3 } from "react/jsx-runtime";
384
- var AlertDialogContext = React2.createContext(null);
385
- function useAlertDialogContext() {
386
- const context = React2.useContext(AlertDialogContext);
387
- if (!context) throw new Error("AlertDialog components must be rendered within AlertDialog.");
390
+ // src/ui/dialog/dialog.tsx
391
+ import { XIcon } from "lucide-react";
392
+ import * as React2 from "react";
393
+ import {
394
+ Dialog as AriaDialog,
395
+ Heading,
396
+ Modal,
397
+ ModalOverlay,
398
+ Text
399
+ } from "react-aria-components";
400
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
401
+ var DialogContext = React2.createContext(null);
402
+ function useDialogContext() {
403
+ const context = React2.useContext(DialogContext);
404
+ if (!context) throw new Error("Dialog components must be rendered within Dialog.");
388
405
  return context;
389
406
  }
407
+ function DialogRoot({
408
+ children,
409
+ defaultOpen = false,
410
+ onOpenChange,
411
+ open: controlledOpen
412
+ }) {
413
+ const [uncontrolledOpen, setUncontrolledOpen] = React2.useState(defaultOpen);
414
+ const open = controlledOpen ?? uncontrolledOpen;
415
+ const setOpen = React2.useCallback(
416
+ (nextOpen) => {
417
+ if (controlledOpen === void 0) setUncontrolledOpen(nextOpen);
418
+ onOpenChange?.(nextOpen);
419
+ },
420
+ [controlledOpen, onOpenChange]
421
+ );
422
+ return /* @__PURE__ */ jsx3(DialogContext.Provider, { value: { open, setOpen }, children });
423
+ }
424
+ function DialogTrigger({
425
+ asChild = false,
426
+ children,
427
+ onClick,
428
+ ...props
429
+ }) {
430
+ const { setOpen } = useDialogContext();
431
+ const handleClick = (event) => {
432
+ onClick?.(event);
433
+ if (!event.defaultPrevented) setOpen(true);
434
+ };
435
+ if (asChild && React2.isValidElement(children)) {
436
+ const child = children;
437
+ return React2.cloneElement(child, {
438
+ ...props,
439
+ "data-slot": "dialog-trigger",
440
+ onClick: (event) => {
441
+ child.props.onClick?.(event);
442
+ handleClick(event);
443
+ }
444
+ });
445
+ }
446
+ return /* @__PURE__ */ jsx3(Button, { "data-slot": "dialog-trigger", onPress: () => setOpen(true), ...props, children });
447
+ }
448
+ function DialogPortal({ children }) {
449
+ return /* @__PURE__ */ jsx3(Fragment2, { children });
450
+ }
451
+ function DialogOverlay({ children, className, ...props }) {
452
+ const { open, setOpen } = useDialogContext();
453
+ if (!open) return null;
454
+ return /* @__PURE__ */ jsx3(
455
+ ModalOverlay,
456
+ {
457
+ "data-slot": "dialog-overlay",
458
+ isDismissable: true,
459
+ isOpen: open,
460
+ onOpenChange: setOpen,
461
+ className: cn(
462
+ "fixed inset-0 isolate z-50 grid place-items-center bg-black/10 p-4 supports-backdrop-filter:backdrop-blur-xs motion-safe:data-entering:animate-ui-overlay-in motion-safe:data-exiting:animate-ui-overlay-out",
463
+ className
464
+ ),
465
+ ...props,
466
+ children
467
+ }
468
+ );
469
+ }
470
+ function Dialog(props) {
471
+ if (!("trigger" in props)) return /* @__PURE__ */ jsx3(DialogRoot, { ...props });
472
+ const { children, trigger, triggerProps, defaultOpen, onOpenChange, open, ...contentProps } = props;
473
+ return /* @__PURE__ */ jsxs3(DialogRoot, { defaultOpen, onOpenChange, open, children: [
474
+ typeof trigger === "string" ? /* @__PURE__ */ jsx3(DialogTrigger, { ...triggerProps, children: trigger }) : /* @__PURE__ */ jsx3(DialogTrigger, { asChild: true, ...triggerProps, children: trigger }),
475
+ /* @__PURE__ */ jsx3(DialogContent, { ...contentProps, children })
476
+ ] });
477
+ }
478
+ function DialogContent({
479
+ children,
480
+ className,
481
+ contentSlot = "dialog-content",
482
+ onOverlayClick,
483
+ overlaySlot = "dialog-overlay",
484
+ showCloseButton = true,
485
+ ...props
486
+ }) {
487
+ const { setOpen } = useDialogContext();
488
+ return /* @__PURE__ */ jsx3(DialogPortal, { children: /* @__PURE__ */ jsx3(
489
+ DialogOverlay,
490
+ {
491
+ "data-slot": overlaySlot,
492
+ onClick: (event) => {
493
+ if (event.target === event.currentTarget) onOverlayClick?.(event);
494
+ },
495
+ children: /* @__PURE__ */ jsx3(
496
+ Modal,
497
+ {
498
+ className: "motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out max-h-full min-h-0 w-full",
499
+ onClick: (event) => {
500
+ if (event.target === event.currentTarget) {
501
+ setOpen(false);
502
+ onOverlayClick?.(event);
503
+ }
504
+ },
505
+ children: /* @__PURE__ */ jsxs3(
506
+ AriaDialog,
507
+ {
508
+ "data-slot": contentSlot,
509
+ className: cn(
510
+ "relative mx-auto grid box-border max-h-full min-h-0 w-full max-w-[calc(100%-2rem)] gap-4 overflow-x-hidden overflow-y-auto rounded-xl bg-background p-4 text-sm text-foreground ring-1 ring-foreground/10 outline-none sm:max-w-sm",
511
+ className
512
+ ),
513
+ ...props,
514
+ children: [
515
+ children,
516
+ showCloseButton ? /* @__PURE__ */ jsx3(
517
+ Button,
518
+ {
519
+ "aria-label": "Cerrar di\xE1logo",
520
+ "data-slot": "dialog-close",
521
+ variant: "ghost",
522
+ className: "absolute top-2 right-2",
523
+ size: "icon-sm",
524
+ onPress: () => setOpen(false),
525
+ children: /* @__PURE__ */ jsx3(XIcon, {})
526
+ }
527
+ ) : null
528
+ ]
529
+ }
530
+ )
531
+ }
532
+ )
533
+ }
534
+ ) });
535
+ }
536
+ function DialogClose({ asChild = false, children, onClick, ...props }) {
537
+ const { setOpen } = useDialogContext();
538
+ if (asChild && React2.isValidElement(children)) {
539
+ const child = children;
540
+ return React2.cloneElement(child, {
541
+ ...props,
542
+ "data-slot": "dialog-close",
543
+ onClick: (event) => {
544
+ child.props.onClick?.(event);
545
+ onClick?.(event);
546
+ if (!event.defaultPrevented) setOpen(false);
547
+ }
548
+ });
549
+ }
550
+ return /* @__PURE__ */ jsx3(Button, { "data-slot": "dialog-close", onPress: () => setOpen(false), ...props, children });
551
+ }
552
+ function DialogHeader({ className, ...props }) {
553
+ return /* @__PURE__ */ jsx3("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2", className), ...props });
554
+ }
555
+ function DialogFooter({
556
+ className,
557
+ showCloseButton = false,
558
+ children,
559
+ ...props
560
+ }) {
561
+ return /* @__PURE__ */ jsxs3(
562
+ "div",
563
+ {
564
+ "data-slot": "dialog-footer",
565
+ className: cn(
566
+ "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t border-border bg-muted/50 p-4 sm:flex-row sm:flex-wrap sm:justify-end",
567
+ className
568
+ ),
569
+ ...props,
570
+ children: [
571
+ children,
572
+ showCloseButton ? /* @__PURE__ */ jsx3(DialogClose, { variant: "outline", children: "Cerrar" }) : null
573
+ ]
574
+ }
575
+ );
576
+ }
577
+ function DialogTitle({
578
+ className,
579
+ ...props
580
+ }) {
581
+ return /* @__PURE__ */ jsx3(
582
+ Heading,
583
+ {
584
+ slot: "title",
585
+ "data-slot": "dialog-title",
586
+ className: cn("font-heading text-base leading-none font-medium", className),
587
+ ...props
588
+ }
589
+ );
590
+ }
591
+ function DialogDescription({
592
+ className,
593
+ ...props
594
+ }) {
595
+ return /* @__PURE__ */ jsx3(
596
+ Text,
597
+ {
598
+ slot: "description",
599
+ "data-slot": "dialog-description",
600
+ className: cn(
601
+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
602
+ className
603
+ ),
604
+ ...props
605
+ }
606
+ );
607
+ }
608
+
609
+ // src/ui/alert-dialog/alert-dialog.tsx
610
+ import { jsx as jsx4 } from "react/jsx-runtime";
390
611
  function AlertDialog({ children, open, onOpenChange }) {
391
- return /* @__PURE__ */ jsx3(AlertDialogContext.Provider, { value: { open, setOpen: onOpenChange }, children });
612
+ return /* @__PURE__ */ jsx4(Dialog, { open, onOpenChange, children });
392
613
  }
393
614
  function AlertDialogPortal({ children }) {
394
- return /* @__PURE__ */ jsx3(Fragment2, { children });
615
+ return /* @__PURE__ */ jsx4(DialogPortal, { children });
395
616
  }
396
- function AlertDialogTrigger({ children, ...props }) {
397
- const { setOpen } = useAlertDialogContext();
398
- return /* @__PURE__ */ jsx3(Button, { "data-slot": "alert-dialog-trigger", onPress: () => setOpen(true), ...props, children });
617
+ function AlertDialogTrigger({
618
+ children,
619
+ ...props
620
+ }) {
621
+ return /* @__PURE__ */ jsx4(DialogTrigger, { "data-slot": "alert-dialog-trigger", ...props, children });
399
622
  }
400
- function AlertDialogOverlay({ className, ...props }) {
401
- const { open, setOpen } = useAlertDialogContext();
402
- if (!open) return null;
403
- return /* @__PURE__ */ jsx3(ModalOverlay, { "data-slot": "alert-dialog-overlay", isDismissable: true, isOpen: open, onOpenChange: setOpen, className: cn("fixed inset-0 isolate z-50 grid place-items-center bg-black/10 p-4 backdrop-blur-[1px]", className), ...props });
623
+ function AlertDialogOverlay({
624
+ className,
625
+ ...props
626
+ }) {
627
+ return /* @__PURE__ */ jsx4(DialogOverlay, { "data-slot": "alert-dialog-overlay", className, ...props });
404
628
  }
405
- function AlertDialogContent({ className, size = "default", children }) {
406
- const { open, setOpen } = useAlertDialogContext();
407
- if (!open) return null;
408
- return /* @__PURE__ */ jsx3(AlertDialogPortal, { children: /* @__PURE__ */ jsx3(ModalOverlay, { isDismissable: true, isOpen: open, onOpenChange: setOpen, className: "fixed inset-0 isolate z-50 grid place-items-center bg-black/10 p-4 backdrop-blur-[1px]", children: /* @__PURE__ */ jsx3(Modal, { className: cn("w-full max-w-[calc(100%-2rem)] outline-none", size === "sm" ? "sm:max-w-xs" : "sm:max-w-sm", className), children: /* @__PURE__ */ jsx3(AriaDialog, { role: "alertdialog", "data-slot": "alert-dialog-content", className: "grid gap-4 rounded-xl bg-background p-4 text-sm text-foreground ring-1 ring-foreground/10 outline-none", children }) }) }) });
629
+ function AlertDialogContent({
630
+ className,
631
+ size = "default",
632
+ children
633
+ }) {
634
+ return /* @__PURE__ */ jsx4(
635
+ DialogContent,
636
+ {
637
+ contentSlot: "alert-dialog-content",
638
+ overlaySlot: "alert-dialog-overlay",
639
+ role: "alertdialog",
640
+ showCloseButton: false,
641
+ className: cn(size === "sm" ? "sm:max-w-xs" : "sm:max-w-sm", className),
642
+ children
643
+ }
644
+ );
409
645
  }
410
646
  function AlertDialogHeader({ className, ...props }) {
411
- return /* @__PURE__ */ jsx3("div", { "data-slot": "alert-dialog-header", className: cn("flex flex-col gap-2 text-center sm:text-left", className), ...props });
647
+ return /* @__PURE__ */ jsx4(
648
+ DialogHeader,
649
+ {
650
+ "data-slot": "alert-dialog-header",
651
+ className: cn("flex flex-col gap-2 text-center sm:text-left", className),
652
+ ...props
653
+ }
654
+ );
412
655
  }
413
656
  function AlertDialogFooter({ className, ...props }) {
414
- return /* @__PURE__ */ jsx3("div", { "data-slot": "alert-dialog-footer", className: cn("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end", className), ...props });
657
+ return /* @__PURE__ */ jsx4(DialogFooter, { "data-slot": "alert-dialog-footer", className: cn(className), ...props });
415
658
  }
416
- function AlertDialogTitle({ className, ...props }) {
417
- return /* @__PURE__ */ jsx3(Heading, { slot: "title", "data-slot": "alert-dialog-title", className: cn("font-heading text-base font-medium", className), ...props });
659
+ function AlertDialogTitle({
660
+ className,
661
+ ...props
662
+ }) {
663
+ return /* @__PURE__ */ jsx4(DialogTitle, { "data-slot": "alert-dialog-title", className: cn(className), ...props });
418
664
  }
419
- function AlertDialogDescription({ className, ...props }) {
420
- return /* @__PURE__ */ jsx3(Text, { slot: "description", "data-slot": "alert-dialog-description", className: cn("text-sm text-muted-foreground", className), ...props });
665
+ function AlertDialogDescription({
666
+ className,
667
+ ...props
668
+ }) {
669
+ return /* @__PURE__ */ jsx4(DialogDescription, { "data-slot": "alert-dialog-description", className: cn(className), ...props });
421
670
  }
422
671
  function AlertDialogAction({ className, ...props }) {
423
- return /* @__PURE__ */ jsx3(Button, { "data-slot": "alert-dialog-action", className: cn(className), ...props });
672
+ return /* @__PURE__ */ jsx4(Button, { "data-slot": "alert-dialog-action", className: cn(className), ...props });
424
673
  }
425
- function AlertDialogCancel({ children = "Cancelar", onClick, ...props }) {
426
- const { setOpen } = useAlertDialogContext();
427
- return /* @__PURE__ */ jsx3(Button, { "data-slot": "alert-dialog-cancel", variant: "outline", onClick, onPress: () => setOpen(false), ...props, children });
674
+ function AlertDialogCancel({
675
+ children = "Cancelar",
676
+ onClick,
677
+ ...props
678
+ }) {
679
+ return /* @__PURE__ */ jsx4(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx4(Button, { "data-slot": "alert-dialog-cancel", variant: "outline", onClick, ...props, children }) });
428
680
  }
429
681
 
430
- // src/ui/alert/alert.tsx
682
+ // src/ui/alert/alert-variants.ts
431
683
  import { cva as cva3 } from "class-variance-authority";
432
- import { jsx as jsx4 } from "react/jsx-runtime";
433
684
  var alertVariants = cva3(
434
685
  "group/alert relative grid w-full gap-0.5 rounded-lg border border-border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
435
686
  {
@@ -447,8 +698,11 @@ var alertVariants = cva3(
447
698
  }
448
699
  }
449
700
  );
701
+
702
+ // src/ui/alert/alert.tsx
703
+ import { jsx as jsx5 } from "react/jsx-runtime";
450
704
  function Alert({ className, variant, ...props }) {
451
- return /* @__PURE__ */ jsx4(
705
+ return /* @__PURE__ */ jsx5(
452
706
  "div",
453
707
  {
454
708
  "data-slot": "alert",
@@ -459,7 +713,7 @@ function Alert({ className, variant, ...props }) {
459
713
  );
460
714
  }
461
715
  function AlertTitle({ className, ...props }) {
462
- return /* @__PURE__ */ jsx4(
716
+ return /* @__PURE__ */ jsx5(
463
717
  "div",
464
718
  {
465
719
  "data-slot": "alert-title",
@@ -472,7 +726,7 @@ function AlertTitle({ className, ...props }) {
472
726
  );
473
727
  }
474
728
  function AlertDescription({ className, ...props }) {
475
- return /* @__PURE__ */ jsx4(
729
+ return /* @__PURE__ */ jsx5(
476
730
  "div",
477
731
  {
478
732
  "data-slot": "alert-description",
@@ -485,17 +739,13 @@ function AlertDescription({ className, ...props }) {
485
739
  );
486
740
  }
487
741
  function AlertAction({ className, ...props }) {
488
- return /* @__PURE__ */ jsx4("div", { "data-slot": "alert-action", className: cn("absolute top-2 right-2", className), ...props });
742
+ return /* @__PURE__ */ jsx5("div", { "data-slot": "alert-action", className: cn("absolute top-2 right-2", className), ...props });
489
743
  }
490
744
 
491
745
  // src/ui/app-shell/app-shell.tsx
492
- import { jsx as jsx5 } from "react/jsx-runtime";
493
- function AppShell({
494
- className,
495
- sidebarBreakpoint = "md",
496
- ...props
497
- }) {
498
- return /* @__PURE__ */ jsx5(
746
+ import { jsx as jsx6 } from "react/jsx-runtime";
747
+ function AppShell({ className, sidebarBreakpoint = "md", ...props }) {
748
+ return /* @__PURE__ */ jsx6(
499
749
  "div",
500
750
  {
501
751
  "data-slot": "app-shell",
@@ -506,7 +756,7 @@ function AppShell({
506
756
  );
507
757
  }
508
758
  function AppShellSidebar({ className, ...props }) {
509
- return /* @__PURE__ */ jsx5(
759
+ return /* @__PURE__ */ jsx6(
510
760
  "aside",
511
761
  {
512
762
  "data-slot": "app-shell-sidebar",
@@ -516,10 +766,10 @@ function AppShellSidebar({ className, ...props }) {
516
766
  );
517
767
  }
518
768
  function AppShellMain({ className, ...props }) {
519
- return /* @__PURE__ */ jsx5("main", { "data-slot": "app-shell-main", className: cn("bg-background", className), ...props });
769
+ return /* @__PURE__ */ jsx6("main", { "data-slot": "app-shell-main", className: cn("bg-background", className), ...props });
520
770
  }
521
771
  function AppShellHeader({ className, ...props }) {
522
- return /* @__PURE__ */ jsx5(
772
+ return /* @__PURE__ */ jsx6(
523
773
  "header",
524
774
  {
525
775
  "data-slot": "app-shell-header",
@@ -528,15 +778,15 @@ function AppShellHeader({ className, ...props }) {
528
778
  }
529
779
  );
530
780
  }
531
- function AppShellMobileHeader({
532
- className,
533
- ...props
534
- }) {
535
- return /* @__PURE__ */ jsx5(
781
+ function AppShellMobileHeader({ className, ...props }) {
782
+ return /* @__PURE__ */ jsx6(
536
783
  "header",
537
784
  {
538
785
  "data-slot": "app-shell-mobile-header",
539
- className: cn("h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-3", className),
786
+ className: cn(
787
+ "h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-3",
788
+ className
789
+ ),
540
790
  ...props
541
791
  }
542
792
  );
@@ -548,7 +798,7 @@ function AppShellContent({
548
798
  scrollable = true,
549
799
  ...props
550
800
  }) {
551
- return /* @__PURE__ */ jsx5(
801
+ return /* @__PURE__ */ jsx6(
552
802
  "div",
553
803
  {
554
804
  "data-slot": "app-shell-content",
@@ -562,50 +812,123 @@ function AppShellContent({
562
812
  }
563
813
 
564
814
  // src/ui/avatar/avatar.tsx
565
- import { createContext as createContext2, useContext as useContext2, useEffect as useEffect3, useState as useState5 } from "react";
566
- import { jsx as jsx6 } from "react/jsx-runtime";
567
- var sizes = { xs: "size-5 text-[10px]", sm: "size-6 text-xs", default: "size-8 text-sm", lg: "size-10 text-base" };
815
+ import { createContext as createContext2, useContext as useContext2, useEffect as useEffect3, useState as useState6 } from "react";
816
+ import { jsx as jsx7 } from "react/jsx-runtime";
817
+ var sizes = {
818
+ xs: "size-5 text-[10px]",
819
+ sm: "size-6 text-xs",
820
+ default: "size-8 text-sm",
821
+ lg: "size-10 text-base"
822
+ };
568
823
  var AvatarContext = createContext2(null);
569
824
  function Avatar({ className, size = "default", children, ...props }) {
570
- const [status, setStatus] = useState5("idle");
571
- return /* @__PURE__ */ jsx6(AvatarContext.Provider, { value: { status, setStatus }, children: /* @__PURE__ */ jsx6("div", { "data-slot": "avatar", "data-size": size, className: cn("group/avatar relative flex shrink-0 overflow-hidden rounded-full bg-muted text-muted-foreground", sizes[size], className), ...props, children }) });
825
+ const [status, setStatus] = useState6("idle");
826
+ return /* @__PURE__ */ jsx7(AvatarContext.Provider, { value: { status, setStatus }, children: /* @__PURE__ */ jsx7(
827
+ "div",
828
+ {
829
+ "data-slot": "avatar",
830
+ "data-size": size,
831
+ className: cn(
832
+ "group/avatar relative flex shrink-0 overflow-hidden rounded-full bg-muted text-muted-foreground",
833
+ sizes[size],
834
+ className
835
+ ),
836
+ ...props,
837
+ children
838
+ }
839
+ ) });
572
840
  }
573
- function AvatarImage({ className, src, onError, onLoad, ...props }) {
841
+ function AvatarImage({
842
+ className,
843
+ src,
844
+ onError,
845
+ onLoad,
846
+ ...props
847
+ }) {
574
848
  const avatar = useContext2(AvatarContext);
575
- const [failed, setFailed] = useState5(false);
849
+ const [failed, setFailed] = useState6(false);
576
850
  useEffect3(() => {
577
851
  setFailed(false);
578
852
  avatar?.setStatus(src ? "loading" : "idle");
579
853
  }, [avatar?.setStatus, src]);
580
854
  if (failed || avatar?.status === "error") return null;
581
- return /* @__PURE__ */ jsx6("img", { "data-slot": "avatar-image", src, className: cn("aspect-square size-full object-cover", className), onLoad: (event) => {
582
- avatar?.setStatus("loaded");
583
- onLoad?.(event);
584
- }, onError: (event) => {
585
- setFailed(true);
586
- avatar?.setStatus("error");
587
- onError?.(event);
588
- }, ...props });
855
+ return /* @__PURE__ */ jsx7(
856
+ "img",
857
+ {
858
+ "data-slot": "avatar-image",
859
+ src,
860
+ alt: "",
861
+ className: cn("aspect-square size-full object-cover", className),
862
+ onLoad: (event) => {
863
+ avatar?.setStatus("loaded");
864
+ onLoad?.(event);
865
+ },
866
+ onError: (event) => {
867
+ setFailed(true);
868
+ avatar?.setStatus("error");
869
+ onError?.(event);
870
+ },
871
+ ...props
872
+ }
873
+ );
589
874
  }
590
875
  function AvatarFallback({ className, ...props }) {
591
876
  const avatar = useContext2(AvatarContext);
592
877
  if (avatar?.status === "loaded") return null;
593
- return /* @__PURE__ */ jsx6("span", { "data-slot": "avatar-fallback", className: cn("flex size-full items-center justify-center font-medium", className), ...props });
878
+ return /* @__PURE__ */ jsx7(
879
+ "span",
880
+ {
881
+ "data-slot": "avatar-fallback",
882
+ className: cn("flex size-full items-center justify-center font-medium", className),
883
+ ...props
884
+ }
885
+ );
594
886
  }
595
887
  function AvatarBadge({ className, ...props }) {
596
- return /* @__PURE__ */ jsx6("span", { "data-slot": "avatar-badge", className: cn("absolute right-0 bottom-0 size-2.5 rounded-full bg-success ring-2 ring-background", className), ...props });
888
+ return /* @__PURE__ */ jsx7(
889
+ "span",
890
+ {
891
+ "data-slot": "avatar-badge",
892
+ className: cn(
893
+ "absolute right-0 bottom-0 size-2.5 rounded-full bg-success ring-2 ring-background",
894
+ className
895
+ ),
896
+ ...props
897
+ }
898
+ );
597
899
  }
598
900
  function AvatarGroup({ className, ...props }) {
599
- return /* @__PURE__ */ jsx6("div", { "data-slot": "avatar-group", className: cn("flex -space-x-2 [&>[data-slot=avatar]]:ring-2 [&>[data-slot=avatar]]:ring-background", className), ...props });
901
+ return /* @__PURE__ */ jsx7(
902
+ "div",
903
+ {
904
+ "data-slot": "avatar-group",
905
+ className: cn(
906
+ "flex -space-x-2 [&>[data-slot=avatar]]:ring-2 [&>[data-slot=avatar]]:ring-background",
907
+ className
908
+ ),
909
+ ...props
910
+ }
911
+ );
600
912
  }
601
913
  function AvatarGroupCount({ className, ...props }) {
602
- return /* @__PURE__ */ jsx6("span", { "data-slot": "avatar-group-count", className: cn("flex size-8 items-center justify-center rounded-full bg-muted text-xs font-medium text-muted-foreground ring-2 ring-background", className), ...props });
914
+ return /* @__PURE__ */ jsx7(
915
+ "span",
916
+ {
917
+ "data-slot": "avatar-group-count",
918
+ className: cn(
919
+ "flex size-8 items-center justify-center rounded-full bg-muted text-xs font-medium text-muted-foreground ring-2 ring-background",
920
+ className
921
+ ),
922
+ ...props
923
+ }
924
+ );
603
925
  }
604
926
 
605
927
  // src/ui/badge/badge.tsx
606
- import { cva as cva4 } from "class-variance-authority";
607
928
  import { Link } from "react-aria-components";
608
- import { jsx as jsx7 } from "react/jsx-runtime";
929
+
930
+ // src/ui/badge/badge-variants.ts
931
+ import { cva as cva4 } from "class-variance-authority";
609
932
  var badgeVariants = cva4(
610
933
  "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 [&>svg]:pointer-events-none [&>svg]:size-3",
611
934
  {
@@ -627,8 +950,11 @@ var badgeVariants = cva4(
627
950
  defaultVariants: { variant: "default" }
628
951
  }
629
952
  );
953
+
954
+ // src/ui/badge/badge.tsx
955
+ import { jsx as jsx8 } from "react/jsx-runtime";
630
956
  function Badge({ className, variant, ...props }) {
631
- return /* @__PURE__ */ jsx7(
957
+ return /* @__PURE__ */ jsx8(
632
958
  "span",
633
959
  {
634
960
  "data-slot": "badge",
@@ -639,7 +965,7 @@ function Badge({ className, variant, ...props }) {
639
965
  );
640
966
  }
641
967
  function BadgeLink({ className, variant, ...props }) {
642
- return /* @__PURE__ */ jsx7(
968
+ return /* @__PURE__ */ jsx8(
643
969
  Link,
644
970
  {
645
971
  "data-slot": "badge",
@@ -651,32 +977,75 @@ function BadgeLink({ className, variant, ...props }) {
651
977
  }
652
978
 
653
979
  // src/ui/breadcrumb/breadcrumb.tsx
654
- import { Breadcrumb as AriaBreadcrumb, Breadcrumbs as AriaBreadcrumbs, Link as AriaLink } from "react-aria-components";
655
- import { jsx as jsx8 } from "react/jsx-runtime";
980
+ import {
981
+ Breadcrumb as AriaBreadcrumb,
982
+ Breadcrumbs as AriaBreadcrumbs,
983
+ Link as AriaLink
984
+ } from "react-aria-components";
985
+ import { jsx as jsx9 } from "react/jsx-runtime";
656
986
  function Breadcrumbs({ className, ...props }) {
657
- return /* @__PURE__ */ jsx8(AriaBreadcrumbs, { "data-slot": "breadcrumbs", className: cn("flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground", className), ...props });
987
+ return /* @__PURE__ */ jsx9(
988
+ AriaBreadcrumbs,
989
+ {
990
+ "data-slot": "breadcrumbs",
991
+ className: cn("flex flex-wrap items-center gap-1.5 text-sm text-muted-foreground", className),
992
+ ...props
993
+ }
994
+ );
658
995
  }
659
996
  function Breadcrumb({ className, ...props }) {
660
- return /* @__PURE__ */ jsx8(AriaBreadcrumb, { "data-slot": "breadcrumb", className: cn("inline-flex items-center gap-1.5", className), ...props });
997
+ return /* @__PURE__ */ jsx9(
998
+ AriaBreadcrumb,
999
+ {
1000
+ "data-slot": "breadcrumb",
1001
+ className: cn("inline-flex items-center gap-1.5", className),
1002
+ ...props
1003
+ }
1004
+ );
661
1005
  }
662
1006
  function BreadcrumbLink({ className, ...props }) {
663
- return /* @__PURE__ */ jsx8(AriaLink, { "data-slot": "breadcrumb-link", className: cn("transition-colors hover:text-foreground", className), ...props });
1007
+ return /* @__PURE__ */ jsx9(
1008
+ AriaLink,
1009
+ {
1010
+ "data-slot": "breadcrumb-link",
1011
+ className: cn("transition-colors hover:text-foreground", className),
1012
+ ...props
1013
+ }
1014
+ );
664
1015
  }
665
1016
  function BreadcrumbPage({ className, ...props }) {
666
- return /* @__PURE__ */ jsx8("span", { "data-slot": "breadcrumb-page", "aria-current": "page", className: cn("font-medium text-foreground", className), ...props });
1017
+ return /* @__PURE__ */ jsx9(
1018
+ "span",
1019
+ {
1020
+ "data-slot": "breadcrumb-page",
1021
+ "aria-current": "page",
1022
+ className: cn("font-medium text-foreground", className),
1023
+ ...props
1024
+ }
1025
+ );
667
1026
  }
668
- function BreadcrumbSeparator({ children = "/", className, ...props }) {
669
- return /* @__PURE__ */ jsx8("span", { "data-slot": "breadcrumb-separator", "aria-hidden": "true", className: cn("text-muted-foreground/60", className), ...props, children });
1027
+ function BreadcrumbSeparator({
1028
+ children = "/",
1029
+ className,
1030
+ ...props
1031
+ }) {
1032
+ return /* @__PURE__ */ jsx9(
1033
+ "span",
1034
+ {
1035
+ "data-slot": "breadcrumb-separator",
1036
+ "aria-hidden": "true",
1037
+ className: cn("text-muted-foreground/60", className),
1038
+ ...props,
1039
+ children
1040
+ }
1041
+ );
670
1042
  }
671
1043
 
672
- // src/ui/button-group/button-group.tsx
673
- import { cva as cva5 } from "class-variance-authority";
674
-
675
1044
  // src/ui/separator/separator.tsx
676
1045
  import { Separator as SeparatorPrimitive } from "react-aria-components";
677
- import { jsx as jsx9 } from "react/jsx-runtime";
1046
+ import { jsx as jsx10 } from "react/jsx-runtime";
678
1047
  function Separator({ className, orientation = "horizontal", ...props }) {
679
- return /* @__PURE__ */ jsx9(
1048
+ return /* @__PURE__ */ jsx10(
680
1049
  SeparatorPrimitive,
681
1050
  {
682
1051
  "data-slot": "separator",
@@ -690,8 +1059,8 @@ function Separator({ className, orientation = "horizontal", ...props }) {
690
1059
  );
691
1060
  }
692
1061
 
693
- // src/ui/button-group/button-group.tsx
694
- import { jsx as jsx10 } from "react/jsx-runtime";
1062
+ // src/ui/button-group/button-group-variants.ts
1063
+ import { cva as cva5 } from "class-variance-authority";
695
1064
  var buttonGroupVariants = cva5(
696
1065
  "flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-lg [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1",
697
1066
  {
@@ -706,6 +1075,9 @@ var buttonGroupVariants = cva5(
706
1075
  }
707
1076
  }
708
1077
  );
1078
+
1079
+ // src/ui/button-group/button-group.tsx
1080
+ import { jsx as jsx11 } from "react/jsx-runtime";
709
1081
  function ButtonGroup({
710
1082
  className,
711
1083
  orientation,
@@ -713,7 +1085,7 @@ function ButtonGroup({
713
1085
  }) {
714
1086
  return (
715
1087
  // biome-ignore lint/a11y/useSemanticElements: fieldset would impose form semantics on a generic action group.
716
- /* @__PURE__ */ jsx10(
1088
+ /* @__PURE__ */ jsx11(
717
1089
  "div",
718
1090
  {
719
1091
  role: "group",
@@ -741,7 +1113,7 @@ function ButtonGroupText({
741
1113
  };
742
1114
  return render(renderProps);
743
1115
  }
744
- return /* @__PURE__ */ jsx10(
1116
+ return /* @__PURE__ */ jsx11(
745
1117
  "div",
746
1118
  {
747
1119
  "data-slot": "button-group-text",
@@ -758,7 +1130,7 @@ function ButtonGroupSeparator({
758
1130
  orientation = "vertical",
759
1131
  ...props
760
1132
  }) {
761
- return /* @__PURE__ */ jsx10(
1133
+ return /* @__PURE__ */ jsx11(
762
1134
  Separator,
763
1135
  {
764
1136
  "data-slot": "button-group-separator",
@@ -773,9 +1145,9 @@ function ButtonGroupSeparator({
773
1145
  }
774
1146
 
775
1147
  // src/ui/card/card.tsx
776
- import { jsx as jsx11 } from "react/jsx-runtime";
1148
+ import { jsx as jsx12 } from "react/jsx-runtime";
777
1149
  function Card({ className, size = "default", ...props }) {
778
- return /* @__PURE__ */ jsx11(
1150
+ return /* @__PURE__ */ jsx12(
779
1151
  "div",
780
1152
  {
781
1153
  "data-slot": "card",
@@ -789,7 +1161,7 @@ function Card({ className, size = "default", ...props }) {
789
1161
  );
790
1162
  }
791
1163
  function CardHeader({ className, ...props }) {
792
- return /* @__PURE__ */ jsx11(
1164
+ return /* @__PURE__ */ jsx12(
793
1165
  "div",
794
1166
  {
795
1167
  "data-slot": "card-header",
@@ -802,7 +1174,7 @@ function CardHeader({ className, ...props }) {
802
1174
  );
803
1175
  }
804
1176
  function CardTitle({ className, ...props }) {
805
- return /* @__PURE__ */ jsx11(
1177
+ return /* @__PURE__ */ jsx12(
806
1178
  "div",
807
1179
  {
808
1180
  "data-slot": "card-title",
@@ -815,7 +1187,7 @@ function CardTitle({ className, ...props }) {
815
1187
  );
816
1188
  }
817
1189
  function CardDescription({ className, ...props }) {
818
- return /* @__PURE__ */ jsx11(
1190
+ return /* @__PURE__ */ jsx12(
819
1191
  "div",
820
1192
  {
821
1193
  "data-slot": "card-description",
@@ -825,7 +1197,7 @@ function CardDescription({ className, ...props }) {
825
1197
  );
826
1198
  }
827
1199
  function CardAction({ className, ...props }) {
828
- return /* @__PURE__ */ jsx11(
1200
+ return /* @__PURE__ */ jsx12(
829
1201
  "div",
830
1202
  {
831
1203
  "data-slot": "card-action",
@@ -835,10 +1207,10 @@ function CardAction({ className, ...props }) {
835
1207
  );
836
1208
  }
837
1209
  function CardContent({ className, ...props }) {
838
- return /* @__PURE__ */ jsx11("div", { "data-slot": "card-content", className: cn("px-(--card-spacing)", className), ...props });
1210
+ return /* @__PURE__ */ jsx12("div", { "data-slot": "card-content", className: cn("px-(--card-spacing)", className), ...props });
839
1211
  }
840
1212
  function CardFooter({ className, ...props }) {
841
- return /* @__PURE__ */ jsx11(
1213
+ return /* @__PURE__ */ jsx12(
842
1214
  "div",
843
1215
  {
844
1216
  "data-slot": "card-footer",
@@ -856,9 +1228,9 @@ import { Check } from "lucide-react";
856
1228
  import {
857
1229
  Checkbox as AriaCheckbox
858
1230
  } from "react-aria-components";
859
- import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs3 } from "react/jsx-runtime";
1231
+ import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs4 } from "react/jsx-runtime";
860
1232
  function Checkbox({ className, children, ...props }) {
861
- return /* @__PURE__ */ jsx12(
1233
+ return /* @__PURE__ */ jsx13(
862
1234
  AriaCheckbox,
863
1235
  {
864
1236
  "data-slot": "checkbox",
@@ -867,13 +1239,13 @@ function Checkbox({ className, children, ...props }) {
867
1239
  className
868
1240
  ),
869
1241
  ...props,
870
- children: (state) => /* @__PURE__ */ jsxs3(Fragment3, { children: [
871
- /* @__PURE__ */ jsx12(
1242
+ children: (state) => /* @__PURE__ */ jsxs4(Fragment3, { children: [
1243
+ /* @__PURE__ */ jsx13(
872
1244
  "span",
873
1245
  {
874
1246
  "aria-hidden": "true",
875
- className: "grid size-4 place-items-center rounded border border-border bg-background text-primary-foreground transition-colors group-data-selected:border-primary group-data-selected:bg-primary group-data-focus-visible:ring-3 group-data-focus-visible:ring-ring/50",
876
- children: /* @__PURE__ */ jsx12(Check, { className: "size-3 opacity-0 transition-opacity group-data-selected:opacity-100 motion-reduce:transition-none" })
1247
+ className: "border-border bg-background text-primary-foreground group-data-selected:border-primary group-data-selected:bg-primary group-data-focus-visible:ring-ring/50 grid size-4 place-items-center rounded border transition-colors group-data-focus-visible:ring-3",
1248
+ children: /* @__PURE__ */ jsx13(Check, { className: "size-3 opacity-0 transition-opacity group-data-selected:opacity-100 motion-reduce:transition-none" })
877
1249
  }
878
1250
  ),
879
1251
  typeof children === "function" ? children(state) : children
@@ -883,11 +1255,11 @@ function Checkbox({ className, children, ...props }) {
883
1255
  }
884
1256
 
885
1257
  // src/ui/collapsible/collapsible.tsx
886
- import * as React3 from "react";
887
- import { jsx as jsx13 } from "react/jsx-runtime";
888
- var CollapsibleContext = React3.createContext(null);
1258
+ import * as React4 from "react";
1259
+ import { jsx as jsx14 } from "react/jsx-runtime";
1260
+ var CollapsibleContext = React4.createContext(null);
889
1261
  function useCollapsibleContext() {
890
- const context = React3.useContext(CollapsibleContext);
1262
+ const context = React4.useContext(CollapsibleContext);
891
1263
  if (!context) throw new Error("Collapsible components must be rendered within Collapsible.");
892
1264
  return context;
893
1265
  }
@@ -898,27 +1270,32 @@ function Collapsible({
898
1270
  open: controlledOpen,
899
1271
  ...props
900
1272
  }) {
901
- const [uncontrolledOpen, setUncontrolledOpen] = React3.useState(defaultOpen);
902
- const contentId = React3.useId();
1273
+ const [uncontrolledOpen, setUncontrolledOpen] = React4.useState(defaultOpen);
1274
+ const contentId = React4.useId();
903
1275
  const open = controlledOpen ?? uncontrolledOpen;
904
- const setOpen = React3.useCallback(
1276
+ const setOpen = React4.useCallback(
905
1277
  (nextOpen) => {
906
1278
  if (controlledOpen === void 0) setUncontrolledOpen(nextOpen);
907
1279
  onOpenChange?.(nextOpen);
908
1280
  },
909
1281
  [controlledOpen, onOpenChange]
910
1282
  );
911
- return /* @__PURE__ */ jsx13(CollapsibleContext.Provider, { value: { contentId, open, setOpen }, children: /* @__PURE__ */ jsx13("div", { "data-slot": "collapsible", "data-state": open ? "open" : "closed", ...props, children }) });
1283
+ return /* @__PURE__ */ jsx14(CollapsibleContext.Provider, { value: { contentId, open, setOpen }, children: /* @__PURE__ */ jsx14("div", { "data-slot": "collapsible", "data-state": open ? "open" : "closed", ...props, children }) });
912
1284
  }
913
- function CollapsibleTrigger({ asChild = false, children, onClick, ...props }) {
1285
+ function CollapsibleTrigger({
1286
+ asChild = false,
1287
+ children,
1288
+ onClick,
1289
+ ...props
1290
+ }) {
914
1291
  const { contentId, open, setOpen } = useCollapsibleContext();
915
1292
  const handleClick = (event) => {
916
1293
  onClick?.(event);
917
1294
  if (!event.defaultPrevented) setOpen(!open);
918
1295
  };
919
- if (asChild && React3.isValidElement(children)) {
1296
+ if (asChild && React4.isValidElement(children)) {
920
1297
  const child = children;
921
- return React3.cloneElement(child, {
1298
+ return React4.cloneElement(child, {
922
1299
  ...props,
923
1300
  "aria-controls": contentId,
924
1301
  "aria-expanded": open,
@@ -930,7 +1307,7 @@ function CollapsibleTrigger({ asChild = false, children, onClick, ...props }) {
930
1307
  }
931
1308
  });
932
1309
  }
933
- return /* @__PURE__ */ jsx13(
1310
+ return /* @__PURE__ */ jsx14(
934
1311
  "button",
935
1312
  {
936
1313
  type: "button",
@@ -947,39 +1324,135 @@ function CollapsibleTrigger({ asChild = false, children, onClick, ...props }) {
947
1324
  function CollapsibleContent({ children, ...props }) {
948
1325
  const { contentId, open } = useCollapsibleContext();
949
1326
  if (!open) return null;
950
- return /* @__PURE__ */ jsx13("div", { id: contentId, "data-slot": "collapsible-content", "data-state": "open", ...props, children });
1327
+ return /* @__PURE__ */ jsx14("div", { id: contentId, "data-slot": "collapsible-content", "data-state": "open", ...props, children });
951
1328
  }
952
1329
 
953
1330
  // src/ui/combobox/combobox.tsx
954
- import { Fragment as Fragment4, useMemo, useState as useState7 } from "react";
955
- import { ComboBox as AriaComboBox, ComboBoxValue, FieldError, Input, Label, ListBox, ListBoxItem, Popover, Text as Text2 } from "react-aria-components";
956
- import { jsx as jsx14, jsxs as jsxs4 } from "react/jsx-runtime";
1331
+ import { Fragment as Fragment4, useMemo, useState as useState8 } from "react";
1332
+ import {
1333
+ ComboBox as AriaComboBox,
1334
+ ComboBoxValue,
1335
+ FieldError,
1336
+ Input,
1337
+ Label,
1338
+ ListBox,
1339
+ ListBoxItem,
1340
+ Popover,
1341
+ Text as Text2
1342
+ } from "react-aria-components";
1343
+ import { jsx as jsx15, jsxs as jsxs5 } from "react/jsx-runtime";
957
1344
  var Combobox = AriaComboBox;
958
1345
  function ComboboxInput({ className, ...props }) {
959
- return /* @__PURE__ */ jsx14(Input, { "data-slot": "combobox-input", className: cn("h-9 w-full rounded-lg border border-border bg-background px-2.5 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50", className), ...props });
1346
+ return /* @__PURE__ */ jsx15(
1347
+ Input,
1348
+ {
1349
+ "data-slot": "combobox-input",
1350
+ className: cn(
1351
+ "h-9 w-full rounded-lg border border-border bg-background px-2.5 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50",
1352
+ className
1353
+ ),
1354
+ ...props
1355
+ }
1356
+ );
960
1357
  }
961
1358
  function ComboboxContent({ className, ...props }) {
962
- return /* @__PURE__ */ jsx14(Popover, { "data-slot": "combobox-content", className: cn("max-h-72 w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", className), ...props });
1359
+ return /* @__PURE__ */ jsx15(
1360
+ Popover,
1361
+ {
1362
+ "data-slot": "combobox-content",
1363
+ className: cn(
1364
+ "max-h-72 w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
1365
+ className
1366
+ ),
1367
+ ...props
1368
+ }
1369
+ );
963
1370
  }
964
- function ComboboxList({ className, emptyState, ...props }) {
965
- return /* @__PURE__ */ jsx14(ListBox, { "data-slot": "combobox-list", className: cn("max-h-64 overflow-y-auto", className), renderEmptyState: emptyState ? () => emptyState : void 0, ...props });
1371
+ function ComboboxList({
1372
+ className,
1373
+ emptyState,
1374
+ ...props
1375
+ }) {
1376
+ return /* @__PURE__ */ jsx15(
1377
+ ListBox,
1378
+ {
1379
+ "data-slot": "combobox-list",
1380
+ className: cn("max-h-64 overflow-y-auto", className),
1381
+ renderEmptyState: emptyState ? () => emptyState : void 0,
1382
+ ...props
1383
+ }
1384
+ );
966
1385
  }
967
- function ComboboxItem({ className, children, ...props }) {
968
- return /* @__PURE__ */ jsx14(ListBoxItem, { "data-slot": "combobox-item", className: cn("flex w-full cursor-default items-center justify-between rounded-md px-2 py-2 text-sm outline-none transition-colors data-focused:bg-muted data-focused:text-foreground data-hovered:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50", className), ...props, children });
1386
+ function ComboboxItem({
1387
+ className,
1388
+ children,
1389
+ ...props
1390
+ }) {
1391
+ return /* @__PURE__ */ jsx15(
1392
+ ListBoxItem,
1393
+ {
1394
+ "data-slot": "combobox-item",
1395
+ className: cn(
1396
+ "flex w-full cursor-default items-center justify-between rounded-md px-2 py-2 text-sm outline-none transition-colors data-focused:bg-muted data-focused:text-foreground data-hovered:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50",
1397
+ className
1398
+ ),
1399
+ ...props,
1400
+ children
1401
+ }
1402
+ );
969
1403
  }
970
- function HighlightMatch({ text, query, className }) {
971
- return /* @__PURE__ */ jsx14("span", { className, children: getTextMatchParts(text, query).map((part, index) => part.match ? /* @__PURE__ */ jsx14("mark", { className: "rounded bg-accent px-0.5 text-accent-foreground", children: part.text }, `${part.text}-${index}`) : /* @__PURE__ */ jsx14(Fragment4, { children: part.text }, `${part.text}-${index}`)) });
1404
+ function HighlightMatch({
1405
+ text,
1406
+ query,
1407
+ className
1408
+ }) {
1409
+ return /* @__PURE__ */ jsx15("span", { className, children: getTextMatchParts(text, query).map(
1410
+ (part, index) => part.match ? /* @__PURE__ */ jsx15(
1411
+ "mark",
1412
+ {
1413
+ className: "bg-accent text-accent-foreground rounded px-0.5",
1414
+ children: part.text
1415
+ },
1416
+ `${part.text}-${index}`
1417
+ ) : /* @__PURE__ */ jsx15(Fragment4, { children: part.text }, `${part.text}-${index}`)
1418
+ ) });
972
1419
  }
973
- function AutocompleteCombobox({ items, getItemKey, getItemLabel, renderItem, inputValue: controlledInputValue, onInputChange, selectedKey, onSelectionChange, label, description, errorMessage, emptyState = /* @__PURE__ */ jsx14("p", { className: "px-3 py-7 text-center text-sm text-muted-foreground", children: "No hay resultados." }), suggestion = true, placeholder, className, onKeyDown: _onKeyDown, ...props }) {
974
- const [internalInputValue, setInternalInputValue] = useState7("");
1420
+ function AutocompleteCombobox({
1421
+ items,
1422
+ getItemKey,
1423
+ getItemLabel,
1424
+ renderItem,
1425
+ inputValue: controlledInputValue,
1426
+ onInputChange,
1427
+ selectedKey,
1428
+ onSelectionChange,
1429
+ label,
1430
+ description,
1431
+ errorMessage,
1432
+ emptyState = /* @__PURE__ */ jsx15("p", { className: "text-muted-foreground px-3 py-7 text-center text-sm", children: "No hay resultados." }),
1433
+ suggestion = true,
1434
+ placeholder,
1435
+ className,
1436
+ onKeyDown: _onKeyDown,
1437
+ ...props
1438
+ }) {
1439
+ const [internalInputValue, setInternalInputValue] = useState8("");
975
1440
  const inputValue = controlledInputValue ?? internalInputValue;
976
1441
  const setInputValue = (value) => {
977
1442
  setInternalInputValue(value);
978
1443
  onInputChange?.(value);
979
1444
  };
980
1445
  const normalizedQuery = inputValue.trim().toLocaleLowerCase();
981
- const filteredItems = useMemo(() => normalizedQuery ? items.filter((item) => getItemLabel(item).toLocaleLowerCase().includes(normalizedQuery)) : [...items], [getItemLabel, items, normalizedQuery]);
982
- const suggestedItem = useMemo(() => !suggestion || !normalizedQuery ? void 0 : items.find((item) => getItemLabel(item).toLocaleLowerCase().startsWith(normalizedQuery) && getItemLabel(item).length > inputValue.length), [getItemLabel, inputValue.length, items, normalizedQuery, suggestion]);
1446
+ const filteredItems = useMemo(
1447
+ () => normalizedQuery ? items.filter((item) => getItemLabel(item).toLocaleLowerCase().includes(normalizedQuery)) : [...items],
1448
+ [getItemLabel, items, normalizedQuery]
1449
+ );
1450
+ const suggestedItem = useMemo(
1451
+ () => !suggestion || !normalizedQuery ? void 0 : items.find(
1452
+ (item) => getItemLabel(item).toLocaleLowerCase().startsWith(normalizedQuery) && getItemLabel(item).length > inputValue.length
1453
+ ),
1454
+ [getItemLabel, inputValue.length, items, normalizedQuery, suggestion]
1455
+ );
983
1456
  const suggestionLabel = suggestedItem ? getItemLabel(suggestedItem) : void 0;
984
1457
  const acceptSuggestion = () => {
985
1458
  if (!suggestedItem || !suggestionLabel) return false;
@@ -990,136 +1463,121 @@ function AutocompleteCombobox({ items, getItemKey, getItemLabel, renderItem, inp
990
1463
  const handleKeyDown = (event) => {
991
1464
  if ((event.key === "Tab" || event.key === "Enter") && acceptSuggestion()) event.preventDefault();
992
1465
  };
993
- return /* @__PURE__ */ jsxs4(AriaComboBox, { ...props, className: cn("group/combobox flex w-full flex-col gap-1.5", className), items: filteredItems, selectedKey, inputValue, onInputChange: setInputValue, onSelectionChange: (key) => {
994
- const item = filteredItems.find((candidate) => String(getItemKey(candidate)) === String(key));
995
- if (item) setInputValue(getItemLabel(item));
996
- onSelectionChange?.(key, item);
997
- }, children: [
998
- label && /* @__PURE__ */ jsx14(Label, { className: "text-sm font-medium text-foreground", children: label }),
999
- /* @__PURE__ */ jsxs4("div", { className: "relative", children: [
1000
- suggestionLabel && /* @__PURE__ */ jsxs4("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 left-2.5 z-0 flex items-center whitespace-pre text-sm text-muted-foreground/60", children: [
1001
- /* @__PURE__ */ jsx14("span", { className: "text-transparent", children: inputValue }),
1002
- suggestionLabel.slice(inputValue.length)
1003
- ] }),
1004
- /* @__PURE__ */ jsx14(ComboboxInput, { "aria-autocomplete": suggestionLabel ? "both" : "list", placeholder, onKeyDown: handleKeyDown, className: "relative z-10 bg-transparent" })
1005
- ] }),
1006
- description && /* @__PURE__ */ jsx14(Text2, { slot: "description", className: "text-xs text-muted-foreground", children: description }),
1007
- errorMessage && /* @__PURE__ */ jsx14(FieldError, { className: "text-xs text-destructive", children: errorMessage }),
1008
- /* @__PURE__ */ jsx14(ComboboxContent, { children: /* @__PURE__ */ jsx14(ComboboxList, { emptyState, children: (item) => /* @__PURE__ */ jsx14(ComboboxItem, { id: getItemKey(item), textValue: getItemLabel(item), children: renderItem ? renderItem(item, inputValue) : /* @__PURE__ */ jsx14(HighlightMatch, { text: getItemLabel(item), query: inputValue }) }) }) })
1009
- ] });
1466
+ return /* @__PURE__ */ jsxs5(
1467
+ AriaComboBox,
1468
+ {
1469
+ ...props,
1470
+ className: cn("group/combobox flex w-full flex-col gap-1.5", className),
1471
+ items: filteredItems,
1472
+ selectedKey,
1473
+ inputValue,
1474
+ onInputChange: setInputValue,
1475
+ onSelectionChange: (key) => {
1476
+ const item = filteredItems.find(
1477
+ (candidate) => String(getItemKey(candidate)) === String(key)
1478
+ );
1479
+ if (item) setInputValue(getItemLabel(item));
1480
+ onSelectionChange?.(key, item);
1481
+ },
1482
+ children: [
1483
+ label && /* @__PURE__ */ jsx15(Label, { className: "text-foreground text-sm font-medium", children: label }),
1484
+ /* @__PURE__ */ jsxs5("div", { className: "relative", children: [
1485
+ suggestionLabel && /* @__PURE__ */ jsxs5(
1486
+ "span",
1487
+ {
1488
+ "aria-hidden": "true",
1489
+ className: "text-muted-foreground/60 pointer-events-none absolute inset-y-0 left-2.5 z-0 flex items-center text-sm whitespace-pre",
1490
+ children: [
1491
+ /* @__PURE__ */ jsx15("span", { className: "text-transparent", children: inputValue }),
1492
+ suggestionLabel.slice(inputValue.length)
1493
+ ]
1494
+ }
1495
+ ),
1496
+ /* @__PURE__ */ jsx15(
1497
+ ComboboxInput,
1498
+ {
1499
+ "aria-autocomplete": suggestionLabel ? "both" : "list",
1500
+ placeholder,
1501
+ onKeyDown: handleKeyDown,
1502
+ className: "relative z-10 bg-transparent"
1503
+ }
1504
+ )
1505
+ ] }),
1506
+ description && /* @__PURE__ */ jsx15(Text2, { slot: "description", className: "text-muted-foreground text-xs", children: description }),
1507
+ errorMessage && /* @__PURE__ */ jsx15(FieldError, { className: "text-destructive text-xs", children: errorMessage }),
1508
+ /* @__PURE__ */ jsx15(ComboboxContent, { children: /* @__PURE__ */ jsx15(ComboboxList, { emptyState, children: (item) => /* @__PURE__ */ jsx15(ComboboxItem, { id: getItemKey(item), textValue: getItemLabel(item), children: renderItem ? renderItem(item, inputValue) : /* @__PURE__ */ jsx15(HighlightMatch, { text: getItemLabel(item), query: inputValue }) }) }) })
1509
+ ]
1510
+ }
1511
+ );
1010
1512
  }
1011
1513
 
1012
1514
  // src/ui/command/command.tsx
1013
- import { ComboBox as AriaComboBox2, Input as AriaInput, ListBox as ListBox2, ListBoxItem as ListBoxItem2, Popover as Popover2 } from "react-aria-components";
1014
- import { jsx as jsx15 } from "react/jsx-runtime";
1515
+ import {
1516
+ ComboBox as AriaComboBox2,
1517
+ Input as AriaInput,
1518
+ ListBox as ListBox2,
1519
+ ListBoxItem as ListBoxItem2,
1520
+ Popover as Popover2
1521
+ } from "react-aria-components";
1522
+ import { jsx as jsx16 } from "react/jsx-runtime";
1015
1523
  function Command({ className, ...props }) {
1016
- return /* @__PURE__ */ jsx15(AriaComboBox2, { "data-slot": "command", className: cn("w-full", className), ...props });
1524
+ return /* @__PURE__ */ jsx16(AriaComboBox2, { "data-slot": "command", className: cn("w-full", className), ...props });
1017
1525
  }
1018
1526
  function CommandInput({ className, ...props }) {
1019
- return /* @__PURE__ */ jsx15(AriaInput, { "data-slot": "command-input", className: cn("h-9 w-full border-0 bg-transparent px-3 text-sm text-foreground outline-none placeholder:text-muted-foreground", className), ...props });
1527
+ return /* @__PURE__ */ jsx16(
1528
+ AriaInput,
1529
+ {
1530
+ "data-slot": "command-input",
1531
+ className: cn(
1532
+ "h-9 w-full border-0 bg-transparent px-3 text-sm text-foreground outline-none placeholder:text-muted-foreground",
1533
+ className
1534
+ ),
1535
+ ...props
1536
+ }
1537
+ );
1020
1538
  }
1021
1539
  function CommandContent({ className, ...props }) {
1022
- return /* @__PURE__ */ jsx15(Popover2, { "data-slot": "command-content", className: cn("w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 shadow-lg outline-none", className), ...props });
1023
- }
1024
- function CommandList({ className, ...props }) {
1025
- return /* @__PURE__ */ jsx15(ListBox2, { "data-slot": "command-list", className: cn("max-h-72 overflow-y-auto", className), ...props });
1026
- }
1027
- function CommandItem({ className, ...props }) {
1028
- return /* @__PURE__ */ jsx15(ListBoxItem2, { "data-slot": "command-item", className: cn("flex cursor-default items-center rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50", className), ...props });
1540
+ return /* @__PURE__ */ jsx16(
1541
+ Popover2,
1542
+ {
1543
+ "data-slot": "command-content",
1544
+ className: cn(
1545
+ "w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 shadow-lg outline-none",
1546
+ className
1547
+ ),
1548
+ ...props
1549
+ }
1550
+ );
1029
1551
  }
1030
-
1031
- // src/ui/modal-dialog/modal-dialog.tsx
1032
- import { X } from "lucide-react";
1033
- import {
1034
- Dialog as AriaDialog2,
1035
- Heading as Heading2,
1036
- Modal as Modal2,
1037
- ModalOverlay as ModalOverlay2,
1038
- Text as Text3
1039
- } from "react-aria-components";
1040
- import { Fragment as Fragment5, jsx as jsx16, jsxs as jsxs5 } from "react/jsx-runtime";
1041
- var sizeClasses = {
1042
- sm: "w-[min(calc(100dvw-2rem),24rem)]",
1043
- md: "w-[min(calc(100dvw-2rem),28rem)]",
1044
- lg: "w-[min(calc(100dvw-2rem),36rem)]"
1045
- };
1046
- function ModalDialog({
1047
- open,
1048
- onOpenChange,
1049
- title,
1050
- description,
1051
- children,
1052
- footer,
1053
- size = "sm",
1054
- showCloseButton = true,
1552
+ function CommandList({
1055
1553
  className,
1056
- footerClassName,
1057
1554
  ...props
1058
1555
  }) {
1059
- const layoutClass = children ? footer ? "grid-rows-[auto_minmax(0,1fr)_auto]" : "grid-rows-[auto_minmax(0,1fr)]" : "grid-rows-[auto_auto]";
1060
1556
  return /* @__PURE__ */ jsx16(
1061
- ModalOverlay2,
1557
+ ListBox2,
1062
1558
  {
1063
- isOpen: open,
1064
- onOpenChange,
1065
- className: "fixed inset-0 z-50 grid place-items-center bg-black/20 p-4 backdrop-blur-[1px] motion-safe:data-entering:animate-ui-overlay-in motion-safe:data-exiting:animate-ui-overlay-out",
1066
- ...props,
1067
- children: /* @__PURE__ */ jsx16(
1068
- Modal2,
1069
- {
1070
- className: cn(
1071
- "max-h-[calc(100dvh-2rem)] outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
1072
- sizeClasses[size],
1073
- className
1074
- ),
1075
- children: /* @__PURE__ */ jsx16(
1076
- AriaDialog2,
1077
- {
1078
- className: cn(
1079
- "grid max-h-[calc(100dvh-2rem)] overflow-hidden rounded-xl bg-background text-foreground shadow-xl outline-none",
1080
- layoutClass
1081
- ),
1082
- children: ({ close }) => /* @__PURE__ */ jsxs5(Fragment5, { children: [
1083
- /* @__PURE__ */ jsxs5("header", { "data-slot": "modal-dialog-header", className: "flex items-start gap-3 border-b border-border px-5 py-4", children: [
1084
- /* @__PURE__ */ jsxs5("div", { className: "min-w-0 flex-1", children: [
1085
- /* @__PURE__ */ jsx16(Heading2, { slot: "title", className: "font-heading text-base leading-none font-medium", children: title }),
1086
- description ? /* @__PURE__ */ jsx16(Text3, { slot: "description", className: "mt-2 text-sm text-muted-foreground", children: description }) : null
1087
- ] }),
1088
- showCloseButton ? /* @__PURE__ */ jsx16(
1089
- Button,
1090
- {
1091
- "aria-label": "Cerrar di\xE1logo",
1092
- variant: "ghost",
1093
- size: "icon",
1094
- className: "-mr-2 -mt-1",
1095
- onPress: close,
1096
- children: /* @__PURE__ */ jsx16(X, { "aria-hidden": "true", className: "size-4" })
1097
- }
1098
- ) : null
1099
- ] }),
1100
- children ? /* @__PURE__ */ jsx16("div", { "data-slot": "modal-dialog-body", className: "min-h-0 overflow-y-auto px-5 py-4", children }) : null,
1101
- footer ? /* @__PURE__ */ jsx16(
1102
- "footer",
1103
- {
1104
- "data-slot": "modal-dialog-footer",
1105
- className: cn(
1106
- "flex flex-col-reverse gap-2 border-t border-border bg-muted/50 px-5 py-4 sm:flex-row sm:flex-wrap sm:justify-end",
1107
- footerClassName
1108
- ),
1109
- children: footer
1110
- }
1111
- ) : null
1112
- ] })
1113
- }
1114
- )
1115
- }
1116
- )
1559
+ "data-slot": "command-list",
1560
+ className: cn("max-h-72 overflow-y-auto", className),
1561
+ ...props
1562
+ }
1563
+ );
1564
+ }
1565
+ function CommandItem({ className, ...props }) {
1566
+ return /* @__PURE__ */ jsx16(
1567
+ ListBoxItem2,
1568
+ {
1569
+ "data-slot": "command-item",
1570
+ className: cn(
1571
+ "flex cursor-default items-center rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50",
1572
+ className
1573
+ ),
1574
+ ...props
1117
1575
  }
1118
1576
  );
1119
1577
  }
1120
1578
 
1121
1579
  // src/ui/confirm-dialog/confirm-dialog.tsx
1122
- import { Fragment as Fragment6, jsx as jsx17, jsxs as jsxs6 } from "react/jsx-runtime";
1580
+ import { jsx as jsx17, jsxs as jsxs6 } from "react/jsx-runtime";
1123
1581
  function ConfirmDialog({
1124
1582
  open,
1125
1583
  onOpenChange,
@@ -1131,20 +1589,24 @@ function ConfirmDialog({
1131
1589
  pending = false,
1132
1590
  onConfirm
1133
1591
  }) {
1134
- return /* @__PURE__ */ jsx17(
1135
- ModalDialog,
1136
- {
1137
- open,
1138
- onOpenChange,
1139
- title,
1140
- description,
1141
- showCloseButton: false,
1142
- footer: /* @__PURE__ */ jsxs6(Fragment6, { children: [
1143
- /* @__PURE__ */ jsx17(Button, { variant: "outline", isDisabled: pending, onPress: () => onOpenChange(false), children: cancelLabel }),
1144
- /* @__PURE__ */ jsx17(Button, { variant: destructive ? "destructive" : "default", isDisabled: pending, onPress: onConfirm, children: confirmLabel })
1145
- ] })
1146
- }
1147
- );
1592
+ return /* @__PURE__ */ jsx17(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs6(AlertDialogContent, { children: [
1593
+ /* @__PURE__ */ jsxs6(AlertDialogHeader, { children: [
1594
+ /* @__PURE__ */ jsx17(AlertDialogTitle, { children: title }),
1595
+ description ? /* @__PURE__ */ jsx17(AlertDialogDescription, { children: description }) : null
1596
+ ] }),
1597
+ /* @__PURE__ */ jsxs6(AlertDialogFooter, { children: [
1598
+ /* @__PURE__ */ jsx17(Button, { variant: "outline", isDisabled: pending, onPress: () => onOpenChange(false), children: cancelLabel }),
1599
+ /* @__PURE__ */ jsx17(
1600
+ Button,
1601
+ {
1602
+ variant: destructive ? "destructive" : "default",
1603
+ isDisabled: pending,
1604
+ onPress: onConfirm,
1605
+ children: confirmLabel
1606
+ }
1607
+ )
1608
+ ] })
1609
+ ] }) });
1148
1610
  }
1149
1611
 
1150
1612
  // src/ui/danger-zone/danger-zone.tsx
@@ -1153,7 +1615,7 @@ import {
1153
1615
  Button as DisclosureButton,
1154
1616
  Disclosure,
1155
1617
  DisclosurePanel,
1156
- Heading as Heading3
1618
+ Heading as Heading2
1157
1619
  } from "react-aria-components";
1158
1620
  import { jsx as jsx18, jsxs as jsxs7 } from "react/jsx-runtime";
1159
1621
  function DangerZone({
@@ -1164,19 +1626,19 @@ function DangerZone({
1164
1626
  children
1165
1627
  }) {
1166
1628
  return /* @__PURE__ */ jsx18(Disclosure, { defaultExpanded: defaultOpen, children: /* @__PURE__ */ jsxs7(Card, { className: cn("border-destructive/30", className), children: [
1167
- /* @__PURE__ */ jsx18(Heading3, { className: "flex", children: /* @__PURE__ */ jsxs7(
1629
+ /* @__PURE__ */ jsx18(Heading2, { className: "flex", children: /* @__PURE__ */ jsxs7(
1168
1630
  DisclosureButton,
1169
1631
  {
1170
1632
  slot: "trigger",
1171
1633
  "data-slot": "danger-zone-trigger",
1172
- className: "group/danger flex w-full items-center gap-3 px-4 text-left outline-none focus-visible:ring-3 focus-visible:ring-ring/50",
1634
+ className: "group/danger focus-visible:ring-ring/50 flex w-full items-center gap-3 px-4 text-left outline-none focus-visible:ring-3",
1173
1635
  children: [
1174
- /* @__PURE__ */ jsx18(ShieldAlert, { className: "size-4 shrink-0 text-destructive" }),
1636
+ /* @__PURE__ */ jsx18(ShieldAlert, { className: "text-destructive size-4 shrink-0" }),
1175
1637
  /* @__PURE__ */ jsxs7("span", { className: "flex flex-1 flex-col gap-0.5", children: [
1176
- /* @__PURE__ */ jsx18("span", { className: "font-heading text-base leading-snug font-medium text-destructive", children: title }),
1177
- /* @__PURE__ */ jsx18("span", { className: "text-xs text-muted-foreground", children: description })
1638
+ /* @__PURE__ */ jsx18("span", { className: "font-heading text-destructive text-base leading-snug font-medium", children: title }),
1639
+ /* @__PURE__ */ jsx18("span", { className: "text-muted-foreground text-xs", children: description })
1178
1640
  ] }),
1179
- /* @__PURE__ */ jsx18(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-aria-expanded/danger:rotate-180" })
1641
+ /* @__PURE__ */ jsx18(ChevronDown, { className: "text-muted-foreground size-4 shrink-0 transition-transform group-aria-expanded/danger:rotate-180" })
1180
1642
  ]
1181
1643
  }
1182
1644
  ) }),
@@ -1184,166 +1646,13 @@ function DangerZone({
1184
1646
  ] }) });
1185
1647
  }
1186
1648
 
1187
- // src/ui/dialog/dialog.tsx
1188
- import { XIcon } from "lucide-react";
1189
- import * as React4 from "react";
1190
- import {
1191
- Dialog as AriaDialog3,
1192
- Heading as Heading4,
1193
- Modal as Modal3,
1194
- ModalOverlay as ModalOverlay3,
1195
- Text as Text4
1196
- } from "react-aria-components";
1197
- import { Fragment as Fragment7, jsx as jsx19, jsxs as jsxs8 } from "react/jsx-runtime";
1198
- var DialogContext = React4.createContext(null);
1199
- function useDialogContext() {
1200
- const context = React4.useContext(DialogContext);
1201
- if (!context) throw new Error("Dialog components must be rendered within Dialog.");
1202
- return context;
1203
- }
1204
- function Dialog({ children, defaultOpen = false, onOpenChange, open: controlledOpen }) {
1205
- const [uncontrolledOpen, setUncontrolledOpen] = React4.useState(defaultOpen);
1206
- const open = controlledOpen ?? uncontrolledOpen;
1207
- const setOpen = React4.useCallback(
1208
- (nextOpen) => {
1209
- if (controlledOpen === void 0) setUncontrolledOpen(nextOpen);
1210
- onOpenChange?.(nextOpen);
1211
- },
1212
- [controlledOpen, onOpenChange]
1213
- );
1214
- return /* @__PURE__ */ jsx19(DialogContext.Provider, { value: { open, setOpen }, children });
1215
- }
1216
- function DialogTrigger({ asChild = false, children, onClick, ...props }) {
1217
- const { setOpen } = useDialogContext();
1218
- const handleClick = (event) => {
1219
- onClick?.(event);
1220
- if (!event.defaultPrevented) setOpen(true);
1221
- };
1222
- if (asChild && React4.isValidElement(children)) {
1223
- const child = children;
1224
- return React4.cloneElement(child, {
1225
- ...props,
1226
- "data-slot": "dialog-trigger",
1227
- onClick: (event) => {
1228
- child.props.onClick?.(event);
1229
- handleClick(event);
1230
- }
1231
- });
1232
- }
1233
- return /* @__PURE__ */ jsx19(Button, { "data-slot": "dialog-trigger", onPress: () => setOpen(true), ...props, children });
1234
- }
1235
- function DialogPortal({ children }) {
1236
- return /* @__PURE__ */ jsx19(Fragment7, { children });
1237
- }
1238
- function DialogOverlay({ children, className, ...props }) {
1239
- const { open, setOpen } = useDialogContext();
1240
- if (!open) return null;
1241
- return /* @__PURE__ */ jsx19(
1242
- ModalOverlay3,
1243
- {
1244
- "data-slot": "dialog-overlay",
1245
- isDismissable: true,
1246
- isOpen: open,
1247
- onOpenChange: setOpen,
1248
- className: cn(
1249
- "fixed inset-0 isolate z-50 grid place-items-center bg-black/10 p-4 duration-100 supports-backdrop-filter:backdrop-blur-xs data-entering:animate-ui-overlay-in data-exiting:animate-ui-overlay-out",
1250
- className
1251
- ),
1252
- ...props,
1253
- children
1254
- }
1255
- );
1256
- }
1257
- function DialogContent({
1258
- children,
1259
- className,
1260
- onOverlayClick,
1261
- showCloseButton = true,
1262
- ...props
1263
- }) {
1264
- const { setOpen } = useDialogContext();
1265
- return /* @__PURE__ */ jsx19(DialogPortal, { children: /* @__PURE__ */ jsx19(
1266
- DialogOverlay,
1267
- {
1268
- onClick: (event) => {
1269
- if (event.target === event.currentTarget) onOverlayClick?.(event);
1270
- },
1271
- children: /* @__PURE__ */ jsx19(
1272
- Modal3,
1273
- {
1274
- className: cn(
1275
- "w-full max-w-[calc(100%-2rem)] max-h-[calc(100dvh-2rem)] outline-none sm:max-w-sm",
1276
- className
1277
- ),
1278
- children: /* @__PURE__ */ jsxs8(
1279
- AriaDialog3,
1280
- {
1281
- "data-slot": "dialog-content",
1282
- className: cn(
1283
- "grid max-h-[calc(100dvh-2rem)] gap-4 overflow-y-auto rounded-xl bg-background p-4 text-sm text-foreground ring-1 ring-foreground/10 outline-none",
1284
- className
1285
- ),
1286
- ...props,
1287
- children: [
1288
- children,
1289
- showCloseButton ? /* @__PURE__ */ jsx19(
1290
- Button,
1291
- {
1292
- "aria-label": "Cerrar di\xE1logo",
1293
- "data-slot": "dialog-close",
1294
- variant: "ghost",
1295
- className: "absolute top-2 right-2",
1296
- size: "icon-sm",
1297
- onPress: () => setOpen(false),
1298
- children: /* @__PURE__ */ jsx19(XIcon, {})
1299
- }
1300
- ) : null
1301
- ]
1302
- }
1303
- )
1304
- }
1305
- )
1306
- }
1307
- ) });
1308
- }
1309
- function DialogClose({ asChild = false, children, onClick, ...props }) {
1310
- const { setOpen } = useDialogContext();
1311
- if (asChild && React4.isValidElement(children)) {
1312
- const child = children;
1313
- return React4.cloneElement(child, {
1314
- ...props,
1315
- "data-slot": "dialog-close",
1316
- onClick: (event) => {
1317
- child.props.onClick?.(event);
1318
- if (!event.defaultPrevented) setOpen(false);
1319
- }
1320
- });
1321
- }
1322
- return /* @__PURE__ */ jsx19(Button, { "data-slot": "dialog-close", onPress: () => setOpen(false), ...props, children });
1323
- }
1324
- function DialogHeader({ className, ...props }) {
1325
- return /* @__PURE__ */ jsx19("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2", className), ...props });
1326
- }
1327
- function DialogFooter({ className, showCloseButton = false, children, ...props }) {
1328
- return /* @__PURE__ */ jsxs8("div", { "data-slot": "dialog-footer", className: cn("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:flex-wrap sm:justify-end", className), ...props, children: [
1329
- children,
1330
- showCloseButton ? /* @__PURE__ */ jsx19(DialogClose, { variant: "outline", children: "Cerrar" }) : null
1331
- ] });
1332
- }
1333
- function DialogTitle({ className, ...props }) {
1334
- return /* @__PURE__ */ jsx19(Heading4, { slot: "title", "data-slot": "dialog-title", className: cn("font-heading text-base leading-none font-medium", className), ...props });
1335
- }
1336
- function DialogDescription({ className, ...props }) {
1337
- return /* @__PURE__ */ jsx19(Text4, { slot: "description", "data-slot": "dialog-description", className: cn("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className), ...props });
1338
- }
1339
-
1340
1649
  // src/ui/doc-preview/doc-preview.tsx
1341
1650
  import { FileText, Image } from "lucide-react";
1342
- import { jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
1651
+ import { jsx as jsx19, jsxs as jsxs8 } from "react/jsx-runtime";
1343
1652
  function DocPreview({ url, mimeType, name }) {
1344
- if (!url) return /* @__PURE__ */ jsx20(Fallback, { mimeType, reason: "no-url" });
1653
+ if (!url) return /* @__PURE__ */ jsx19(Fallback, { mimeType, reason: "no-url" });
1345
1654
  if (mimeType === "application/pdf" || mimeType === "text/plain" || mimeType === "text/csv") {
1346
- return /* @__PURE__ */ jsx20(
1655
+ return /* @__PURE__ */ jsx19(
1347
1656
  "iframe",
1348
1657
  {
1349
1658
  src: url,
@@ -1354,45 +1663,28 @@ function DocPreview({ url, mimeType, name }) {
1354
1663
  );
1355
1664
  }
1356
1665
  if (mimeType?.startsWith("image/")) {
1357
- return /* @__PURE__ */ jsx20("div", { className: "flex justify-center rounded-sm bg-muted/30 p-6", children: /* @__PURE__ */ jsx20("img", { src: url, alt: name, className: "max-h-[75vh] max-w-full rounded object-contain" }) });
1666
+ return /* @__PURE__ */ jsx19("div", { className: "bg-muted/30 flex justify-center rounded-sm p-6", children: /* @__PURE__ */ jsx19("img", { src: url, alt: name, className: "max-h-[75vh] max-w-full rounded object-contain" }) });
1358
1667
  }
1359
- return /* @__PURE__ */ jsx20(Fallback, { mimeType, reason: "unsupported" });
1668
+ return /* @__PURE__ */ jsx19(Fallback, { mimeType, reason: "unsupported" });
1360
1669
  }
1361
- function Fallback({ mimeType, reason }) {
1670
+ function Fallback({
1671
+ mimeType,
1672
+ reason
1673
+ }) {
1362
1674
  const Icon = mimeType?.startsWith("image/") ? Image : FileText;
1363
1675
  const message = reason === "no-url" ? "No se pudo generar la URL de preview." : "Preview no disponible para este tipo de archivo.";
1364
- return /* @__PURE__ */ jsxs9("div", { className: "flex flex-col items-center justify-center gap-2 py-14 text-muted-foreground", children: [
1365
- /* @__PURE__ */ jsx20(Icon, { className: "size-9 opacity-30" }),
1366
- /* @__PURE__ */ jsx20("p", { className: "text-sm", children: message }),
1367
- mimeType ? /* @__PURE__ */ jsx20("p", { className: "font-mono text-xs opacity-50", children: mimeType }) : null,
1368
- /* @__PURE__ */ jsx20("p", { className: "text-xs opacity-50", children: "Usa el bot\xF3n Descargar para abrir el archivo." })
1676
+ return /* @__PURE__ */ jsxs8("div", { className: "text-muted-foreground flex flex-col items-center justify-center gap-2 py-14", children: [
1677
+ /* @__PURE__ */ jsx19(Icon, { className: "size-9 opacity-30" }),
1678
+ /* @__PURE__ */ jsx19("p", { className: "text-sm", children: message }),
1679
+ mimeType ? /* @__PURE__ */ jsx19("p", { className: "font-mono text-xs opacity-50", children: mimeType }) : null,
1680
+ /* @__PURE__ */ jsx19("p", { className: "text-xs opacity-50", children: "Usa el bot\xF3n Descargar para abrir el archivo." })
1369
1681
  ] });
1370
1682
  }
1371
1683
 
1372
- // src/ui/drawer/drawer.tsx
1373
- import { Dialog as AriaDialog4, Heading as Heading5, Modal as Modal4, ModalOverlay as ModalOverlay4 } from "react-aria-components";
1374
- import { jsx as jsx21 } from "react/jsx-runtime";
1375
- var sideStyles = { left: "inset-y-0 left-0 h-full w-[min(22rem,calc(100%-2rem))] data-entering:animate-ui-surface-in", right: "inset-y-0 right-0 h-full w-[min(22rem,calc(100%-2rem))] data-entering:animate-ui-surface-in", bottom: "inset-x-0 bottom-0 max-h-[85vh] w-full data-entering:animate-ui-surface-in" };
1376
- function Drawer({ children, side = "right", className, ...props }) {
1377
- return /* @__PURE__ */ jsx21(ModalOverlay4, { isDismissable: true, className: "fixed inset-0 z-50 bg-black/20 backdrop-blur-[1px] motion-safe:data-entering:animate-ui-overlay-in motion-safe:data-exiting:animate-ui-overlay-out", ...props, children: /* @__PURE__ */ jsx21(Modal4, { className: cn("absolute grid gap-4 overflow-y-auto rounded-xl border border-border bg-background p-5 text-foreground shadow-xl outline-none", sideStyles[side], className), children: /* @__PURE__ */ jsx21(AriaDialog4, { "data-slot": "drawer", className: "outline-none", children }) }) });
1378
- }
1379
- function DrawerHeader({ className, ...props }) {
1380
- return /* @__PURE__ */ jsx21("div", { "data-slot": "drawer-header", className: cn("flex flex-col gap-1.5", className), ...props });
1381
- }
1382
- function DrawerFooter({ className, ...props }) {
1383
- return /* @__PURE__ */ jsx21("div", { "data-slot": "drawer-footer", className: cn("mt-auto flex flex-col-reverse gap-2 pt-4 sm:flex-row sm:justify-end", className), ...props });
1384
- }
1385
- function DrawerTitle({ className, ...props }) {
1386
- return /* @__PURE__ */ jsx21(Heading5, { slot: "title", "data-slot": "drawer-title", className: cn("text-base font-semibold", className), ...props });
1387
- }
1388
- function DrawerDescription({ className, ...props }) {
1389
- return /* @__PURE__ */ jsx21("p", { "data-slot": "drawer-description", className: cn("text-sm text-muted-foreground", className), ...props });
1390
- }
1391
-
1392
1684
  // src/ui/dropdown-menu/dropdown-menu.tsx
1393
- import "react";
1394
1685
  import { cva as cva6 } from "class-variance-authority";
1395
1686
  import { CheckIcon, ChevronRightIcon } from "lucide-react";
1687
+ import "react";
1396
1688
  import {
1397
1689
  composeRenderProps,
1398
1690
  Header as HeaderPrimitive,
@@ -1404,13 +1696,11 @@ import {
1404
1696
  Separator as SeparatorPrimitive2,
1405
1697
  SubmenuTrigger as SubmenuTriggerPrimitive
1406
1698
  } from "react-aria-components";
1407
- import { Fragment as Fragment8, jsx as jsx22, jsxs as jsxs10 } from "react/jsx-runtime";
1408
- function DropdownMenuTrigger({
1409
- ...props
1410
- }) {
1411
- return /* @__PURE__ */ jsx22(MenuTriggerPrimitive, { "data-slot": "dropdown-menu-trigger", ...props });
1699
+ import { Fragment as Fragment5, jsx as jsx20, jsxs as jsxs9 } from "react/jsx-runtime";
1700
+ function DropdownMenuTrigger({ ...props }) {
1701
+ return /* @__PURE__ */ jsx20(MenuTriggerPrimitive, { "data-slot": "dropdown-menu-trigger", ...props });
1412
1702
  }
1413
- function DropdownMenu({
1703
+ function DropdownMenuContent({
1414
1704
  "data-slot": dataSlot = "dropdown-menu-content",
1415
1705
  placement = "bottom start",
1416
1706
  offset = 4,
@@ -1419,15 +1709,18 @@ function DropdownMenu({
1419
1709
  children,
1420
1710
  ...props
1421
1711
  }) {
1422
- return /* @__PURE__ */ jsx22(
1712
+ return /* @__PURE__ */ jsx20(
1423
1713
  PopoverPrimitive,
1424
1714
  {
1425
1715
  "data-slot": dataSlot,
1426
1716
  placement,
1427
1717
  offset,
1428
1718
  crossOffset,
1429
- className: cn("z-50 w-(--trigger-width) min-w-32 origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", className),
1430
- children: /* @__PURE__ */ jsx22(
1719
+ className: cn(
1720
+ "z-50 w-(--trigger-width) min-w-32 origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
1721
+ className
1722
+ ),
1723
+ children: /* @__PURE__ */ jsx20(
1431
1724
  MenuPrimitive,
1432
1725
  {
1433
1726
  className: "max-h-[inherit] overflow-x-hidden overflow-y-auto outline-hidden",
@@ -1438,17 +1731,26 @@ function DropdownMenu({
1438
1731
  }
1439
1732
  );
1440
1733
  }
1734
+ function DropdownMenu(props) {
1735
+ if (!("trigger" in props)) return /* @__PURE__ */ jsx20(DropdownMenuContent, { ...props });
1736
+ const { children, trigger, triggerProps, defaultOpen, isOpen, onOpenChange, ...contentProps } = props;
1737
+ const triggerElement = typeof trigger === "string" ? /* @__PURE__ */ jsx20(Button, { ...triggerProps, children: trigger }) : trigger;
1738
+ return /* @__PURE__ */ jsxs9(DropdownMenuTrigger, { defaultOpen, isOpen, onOpenChange, children: [
1739
+ triggerElement,
1740
+ /* @__PURE__ */ jsx20(DropdownMenuContent, { ...contentProps, children })
1741
+ ] });
1742
+ }
1441
1743
  function DropdownMenuGroup({
1442
1744
  ...props
1443
1745
  }) {
1444
- return /* @__PURE__ */ jsx22(MenuSectionPrimitive, { "data-slot": "dropdown-menu-group", ...props });
1746
+ return /* @__PURE__ */ jsx20(MenuSectionPrimitive, { "data-slot": "dropdown-menu-group", ...props });
1445
1747
  }
1446
1748
  function DropdownMenuLabel({
1447
1749
  className,
1448
1750
  inset,
1449
1751
  ...props
1450
1752
  }) {
1451
- return /* @__PURE__ */ jsx22(
1753
+ return /* @__PURE__ */ jsx20(
1452
1754
  HeaderPrimitive,
1453
1755
  {
1454
1756
  "data-slot": "dropdown-menu-label",
@@ -1480,7 +1782,7 @@ function DropdownMenuItem({
1480
1782
  children,
1481
1783
  ...props
1482
1784
  }) {
1483
- return /* @__PURE__ */ jsx22(
1785
+ return /* @__PURE__ */ jsx20(
1484
1786
  MenuItemPrimitive,
1485
1787
  {
1486
1788
  "data-slot": "dropdown-menu-item",
@@ -1492,27 +1794,22 @@ function DropdownMenuItem({
1492
1794
  (className2, { selectionMode }) => cn(dropdownMenuItemVariants({ selectionMode }), className2)
1493
1795
  ),
1494
1796
  ...props,
1495
- children: composeRenderProps(
1496
- children,
1497
- (children2, { isSelected, selectionMode }) => /* @__PURE__ */ jsxs10(Fragment8, { children: [
1498
- selectionMode !== "none" ? /* @__PURE__ */ jsx22(
1499
- "span",
1500
- {
1501
- className: "pointer-events-none absolute right-2 flex items-center justify-center",
1502
- "data-slot": selectionMode === "single" ? "dropdown-menu-radio-item-indicator" : "dropdown-menu-checkbox-item-indicator",
1503
- children: isSelected ? /* @__PURE__ */ jsx22(CheckIcon, {}) : null
1504
- }
1505
- ) : null,
1506
- children2
1507
- ] })
1508
- )
1797
+ children: composeRenderProps(children, (children2, { isSelected, selectionMode }) => /* @__PURE__ */ jsxs9(Fragment5, { children: [
1798
+ selectionMode !== "none" ? /* @__PURE__ */ jsx20(
1799
+ "span",
1800
+ {
1801
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
1802
+ "data-slot": selectionMode === "single" ? "dropdown-menu-radio-item-indicator" : "dropdown-menu-checkbox-item-indicator",
1803
+ children: isSelected ? /* @__PURE__ */ jsx20(CheckIcon, {}) : null
1804
+ }
1805
+ ) : null,
1806
+ children2
1807
+ ] }))
1509
1808
  }
1510
1809
  );
1511
1810
  }
1512
- function DropdownMenuSub({
1513
- ...props
1514
- }) {
1515
- return /* @__PURE__ */ jsx22(SubmenuTriggerPrimitive, { "data-slot": "dropdown-menu-sub", ...props });
1811
+ function DropdownMenuSub({ ...props }) {
1812
+ return /* @__PURE__ */ jsx20(SubmenuTriggerPrimitive, { "data-slot": "dropdown-menu-sub", ...props });
1516
1813
  }
1517
1814
  function DropdownMenuSubTrigger({
1518
1815
  className,
@@ -1520,7 +1817,7 @@ function DropdownMenuSubTrigger({
1520
1817
  children,
1521
1818
  ...props
1522
1819
  }) {
1523
- return /* @__PURE__ */ jsx22(
1820
+ return /* @__PURE__ */ jsx20(
1524
1821
  MenuItemPrimitive,
1525
1822
  {
1526
1823
  "data-slot": "dropdown-menu-sub-trigger",
@@ -1531,9 +1828,9 @@ function DropdownMenuSubTrigger({
1531
1828
  className
1532
1829
  ),
1533
1830
  ...props,
1534
- children: composeRenderProps(children, (children2) => /* @__PURE__ */ jsxs10(Fragment8, { children: [
1831
+ children: composeRenderProps(children, (children2) => /* @__PURE__ */ jsxs9(Fragment5, { children: [
1535
1832
  children2,
1536
- /* @__PURE__ */ jsx22(ChevronRightIcon, { className: "cn-rtl-flip ml-auto" })
1833
+ /* @__PURE__ */ jsx20(ChevronRightIcon, { className: "cn-rtl-flip ml-auto" })
1537
1834
  ] }))
1538
1835
  }
1539
1836
  );
@@ -1545,11 +1842,14 @@ function DropdownMenuSubContent({
1545
1842
  className,
1546
1843
  ...props
1547
1844
  }) {
1548
- return /* @__PURE__ */ jsx22(
1549
- DropdownMenu,
1845
+ return /* @__PURE__ */ jsx20(
1846
+ DropdownMenuContent,
1550
1847
  {
1551
1848
  "data-slot": "dropdown-menu-sub-content",
1552
- className: cn("w-auto min-w-24 rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg", className),
1849
+ className: cn(
1850
+ "w-auto min-w-24 rounded-lg border border-border bg-popover p-1 text-popover-foreground shadow-lg",
1851
+ className
1852
+ ),
1553
1853
  placement,
1554
1854
  crossOffset,
1555
1855
  offset,
@@ -1561,7 +1861,7 @@ function DropdownMenuSeparator({
1561
1861
  className,
1562
1862
  ...props
1563
1863
  }) {
1564
- return /* @__PURE__ */ jsx22(
1864
+ return /* @__PURE__ */ jsx20(
1565
1865
  SeparatorPrimitive2,
1566
1866
  {
1567
1867
  "data-slot": "dropdown-menu-separator",
@@ -1570,11 +1870,8 @@ function DropdownMenuSeparator({
1570
1870
  }
1571
1871
  );
1572
1872
  }
1573
- function DropdownMenuShortcut({
1574
- className,
1575
- ...props
1576
- }) {
1577
- return /* @__PURE__ */ jsx22(
1873
+ function DropdownMenuShortcut({ className, ...props }) {
1874
+ return /* @__PURE__ */ jsx20(
1578
1875
  "span",
1579
1876
  {
1580
1877
  "data-slot": "dropdown-menu-shortcut",
@@ -1587,11 +1884,25 @@ function DropdownMenuShortcut({
1587
1884
  );
1588
1885
  }
1589
1886
 
1590
- // src/ui/empty-state/empty-state.tsx
1887
+ // src/ui/empty-state/empty-state-variants.ts
1591
1888
  import { cva as cva7 } from "class-variance-authority";
1592
- import { jsx as jsx23 } from "react/jsx-runtime";
1889
+ var emptyStateMediaVariants = cva7(
1890
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
1891
+ {
1892
+ variants: {
1893
+ variant: {
1894
+ default: "bg-transparent",
1895
+ icon: "size-8 rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4"
1896
+ }
1897
+ },
1898
+ defaultVariants: { variant: "default" }
1899
+ }
1900
+ );
1901
+
1902
+ // src/ui/empty-state/empty-state.tsx
1903
+ import { jsx as jsx21 } from "react/jsx-runtime";
1593
1904
  function EmptyState({ className, ...props }) {
1594
- return /* @__PURE__ */ jsx23(
1905
+ return /* @__PURE__ */ jsx21(
1595
1906
  "div",
1596
1907
  {
1597
1908
  "data-slot": "empty-state",
@@ -1604,7 +1915,7 @@ function EmptyState({ className, ...props }) {
1604
1915
  );
1605
1916
  }
1606
1917
  function EmptyStateHeader({ className, ...props }) {
1607
- return /* @__PURE__ */ jsx23(
1918
+ return /* @__PURE__ */ jsx21(
1608
1919
  "div",
1609
1920
  {
1610
1921
  "data-slot": "empty-state-header",
@@ -1613,24 +1924,12 @@ function EmptyStateHeader({ className, ...props }) {
1613
1924
  }
1614
1925
  );
1615
1926
  }
1616
- var emptyStateMediaVariants = cva7(
1617
- "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
1618
- {
1619
- variants: {
1620
- variant: {
1621
- default: "bg-transparent",
1622
- icon: "size-8 rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4"
1623
- }
1624
- },
1625
- defaultVariants: { variant: "default" }
1626
- }
1627
- );
1628
1927
  function EmptyStateMedia({
1629
1928
  className,
1630
1929
  variant = "default",
1631
1930
  ...props
1632
1931
  }) {
1633
- return /* @__PURE__ */ jsx23(
1932
+ return /* @__PURE__ */ jsx21(
1634
1933
  "div",
1635
1934
  {
1636
1935
  "data-slot": "empty-state-media",
@@ -1640,18 +1939,19 @@ function EmptyStateMedia({
1640
1939
  }
1641
1940
  );
1642
1941
  }
1643
- function EmptyStateTitle({ className, ...props }) {
1644
- return /* @__PURE__ */ jsx23(
1942
+ function EmptyStateTitle({ className, children, ...props }) {
1943
+ return /* @__PURE__ */ jsx21(
1645
1944
  "h3",
1646
1945
  {
1647
1946
  "data-slot": "empty-state-title",
1648
1947
  className: cn("text-sm font-medium tracking-tight text-foreground", className),
1649
- ...props
1948
+ ...props,
1949
+ children
1650
1950
  }
1651
1951
  );
1652
1952
  }
1653
1953
  function EmptyStateDescription({ className, ...props }) {
1654
- return /* @__PURE__ */ jsx23(
1954
+ return /* @__PURE__ */ jsx21(
1655
1955
  "p",
1656
1956
  {
1657
1957
  "data-slot": "empty-state-description",
@@ -1664,7 +1964,7 @@ function EmptyStateDescription({ className, ...props }) {
1664
1964
  );
1665
1965
  }
1666
1966
  function EmptyStateContent({ className, ...props }) {
1667
- return /* @__PURE__ */ jsx23(
1967
+ return /* @__PURE__ */ jsx21(
1668
1968
  "div",
1669
1969
  {
1670
1970
  "data-slot": "empty-state-content",
@@ -1677,28 +1977,54 @@ function EmptyStateContent({ className, ...props }) {
1677
1977
  );
1678
1978
  }
1679
1979
 
1680
- // src/ui/field/field.tsx
1980
+ // src/ui/label/label.tsx
1981
+ import { forwardRef } from "react";
1982
+ import { Label as LabelPrimitive } from "react-aria-components";
1983
+ import { jsx as jsx22 } from "react/jsx-runtime";
1984
+ var Label2 = forwardRef(
1985
+ function Label3({ className, ...props }, ref) {
1986
+ return /* @__PURE__ */ jsx22(
1987
+ LabelPrimitive,
1988
+ {
1989
+ ref,
1990
+ "data-slot": "label",
1991
+ className: cn(
1992
+ "flex items-center gap-2 text-sm font-medium leading-none select-none",
1993
+ className
1994
+ ),
1995
+ ...props
1996
+ }
1997
+ );
1998
+ }
1999
+ );
2000
+
2001
+ // src/ui/field/field-variants.ts
1681
2002
  import { cva as cva8 } from "class-variance-authority";
1682
-
1683
- // src/ui/label/label.tsx
1684
- import { forwardRef } from "react";
1685
- import { Label as LabelPrimitive } from "react-aria-components";
1686
- import { jsx as jsx24 } from "react/jsx-runtime";
1687
- var Label2 = forwardRef(function Label3({ className, ...props }, ref) {
1688
- return /* @__PURE__ */ jsx24(LabelPrimitive, { ref, "data-slot": "label", className: cn("flex items-center gap-2 text-sm font-medium leading-none select-none", className), ...props });
1689
- });
2003
+ var fieldVariants = cva8(
2004
+ "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
2005
+ {
2006
+ variants: {
2007
+ orientation: {
2008
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
2009
+ horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto",
2010
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:*:data-[slot=field-label]:flex-auto"
2011
+ }
2012
+ },
2013
+ defaultVariants: { orientation: "vertical" }
2014
+ }
2015
+ );
1690
2016
 
1691
2017
  // src/ui/field/field.tsx
1692
- import { jsx as jsx25, jsxs as jsxs11 } from "react/jsx-runtime";
2018
+ import { jsx as jsx23, jsxs as jsxs10 } from "react/jsx-runtime";
1693
2019
  function FieldSet({ className, ...props }) {
1694
- return /* @__PURE__ */ jsx25("fieldset", { "data-slot": "field-set", className: cn("flex flex-col gap-4", className), ...props });
2020
+ return /* @__PURE__ */ jsx23("fieldset", { "data-slot": "field-set", className: cn("flex flex-col gap-4", className), ...props });
1695
2021
  }
1696
2022
  function FieldLegend({
1697
2023
  className,
1698
2024
  variant = "legend",
1699
2025
  ...props
1700
2026
  }) {
1701
- return /* @__PURE__ */ jsx25(
2027
+ return /* @__PURE__ */ jsx23(
1702
2028
  "legend",
1703
2029
  {
1704
2030
  "data-slot": "field-legend",
@@ -1712,7 +2038,7 @@ function FieldLegend({
1712
2038
  );
1713
2039
  }
1714
2040
  function FieldGroup({ className, ...props }) {
1715
- return /* @__PURE__ */ jsx25(
2041
+ return /* @__PURE__ */ jsx23(
1716
2042
  "div",
1717
2043
  {
1718
2044
  "data-slot": "field-group",
@@ -1724,23 +2050,10 @@ function FieldGroup({ className, ...props }) {
1724
2050
  }
1725
2051
  );
1726
2052
  }
1727
- var fieldVariants = cva8(
1728
- "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
1729
- {
1730
- variants: {
1731
- orientation: {
1732
- vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
1733
- horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto",
1734
- responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:*:data-[slot=field-label]:flex-auto"
1735
- }
1736
- },
1737
- defaultVariants: { orientation: "vertical" }
1738
- }
1739
- );
1740
2053
  function Field({ className, orientation = "vertical", ...props }) {
1741
2054
  return (
1742
2055
  // biome-ignore lint/a11y/useSemanticElements: FieldSet provides native fieldset semantics when they are appropriate.
1743
- /* @__PURE__ */ jsx25(
2056
+ /* @__PURE__ */ jsx23(
1744
2057
  "div",
1745
2058
  {
1746
2059
  role: "group",
@@ -1753,7 +2066,7 @@ function Field({ className, orientation = "vertical", ...props }) {
1753
2066
  );
1754
2067
  }
1755
2068
  function FieldContent({ className, ...props }) {
1756
- return /* @__PURE__ */ jsx25(
2069
+ return /* @__PURE__ */ jsx23(
1757
2070
  "div",
1758
2071
  {
1759
2072
  "data-slot": "field-content",
@@ -1763,7 +2076,7 @@ function FieldContent({ className, ...props }) {
1763
2076
  );
1764
2077
  }
1765
2078
  function FieldLabel({ className, ...props }) {
1766
- return /* @__PURE__ */ jsx25(
2079
+ return /* @__PURE__ */ jsx23(
1767
2080
  Label2,
1768
2081
  {
1769
2082
  "data-slot": "field-label",
@@ -1776,7 +2089,7 @@ function FieldLabel({ className, ...props }) {
1776
2089
  );
1777
2090
  }
1778
2091
  function FieldTitle({ className, ...props }) {
1779
- return /* @__PURE__ */ jsx25(
2092
+ return /* @__PURE__ */ jsx23(
1780
2093
  "div",
1781
2094
  {
1782
2095
  "data-slot": "field-title",
@@ -1786,7 +2099,7 @@ function FieldTitle({ className, ...props }) {
1786
2099
  );
1787
2100
  }
1788
2101
  function FieldDescription({ className, ...props }) {
1789
- return /* @__PURE__ */ jsx25(
2102
+ return /* @__PURE__ */ jsx23(
1790
2103
  "p",
1791
2104
  {
1792
2105
  "data-slot": "field-description",
@@ -1799,7 +2112,7 @@ function FieldDescription({ className, ...props }) {
1799
2112
  );
1800
2113
  }
1801
2114
  function FieldSeparator({ className, children, ...props }) {
1802
- return /* @__PURE__ */ jsxs11(
2115
+ return /* @__PURE__ */ jsxs10(
1803
2116
  "div",
1804
2117
  {
1805
2118
  "data-slot": "field-separator",
@@ -1807,12 +2120,12 @@ function FieldSeparator({ className, children, ...props }) {
1807
2120
  className: cn("relative -my-2 h-5 text-sm", className),
1808
2121
  ...props,
1809
2122
  children: [
1810
- /* @__PURE__ */ jsx25(Separator, { className: "absolute inset-0 top-1/2" }),
1811
- children ? /* @__PURE__ */ jsx25(
2123
+ /* @__PURE__ */ jsx23(Separator, { className: "absolute inset-0 top-1/2" }),
2124
+ children ? /* @__PURE__ */ jsx23(
1812
2125
  "span",
1813
2126
  {
1814
2127
  "data-slot": "field-separator-content",
1815
- className: "relative mx-auto block w-fit bg-background px-2 text-muted-foreground",
2128
+ className: "bg-background text-muted-foreground relative mx-auto block w-fit px-2",
1816
2129
  children
1817
2130
  }
1818
2131
  ) : null
@@ -1822,9 +2135,9 @@ function FieldSeparator({ className, children, ...props }) {
1822
2135
  }
1823
2136
  function FieldError2({ className, children, errors, ...props }) {
1824
2137
  const messages = [...new Set(errors?.flatMap((error) => error?.message ?? []) ?? [])];
1825
- const content = children ?? (messages.length === 1 ? messages[0] : messages.length > 1 ? /* @__PURE__ */ jsx25("ul", { className: "ml-4 list-disc", children: messages.map((message) => /* @__PURE__ */ jsx25("li", { children: message }, message)) }) : null);
2138
+ const content = children ?? (messages.length === 1 ? messages[0] : messages.length > 1 ? /* @__PURE__ */ jsx23("ul", { className: "ml-4 list-disc", children: messages.map((message) => /* @__PURE__ */ jsx23("li", { children: message }, message)) }) : null);
1826
2139
  if (!content) return null;
1827
- return /* @__PURE__ */ jsx25(
2140
+ return /* @__PURE__ */ jsx23(
1828
2141
  "div",
1829
2142
  {
1830
2143
  role: "alert",
@@ -1837,9 +2150,42 @@ function FieldError2({ className, children, errors, ...props }) {
1837
2150
  }
1838
2151
 
1839
2152
  // src/ui/form-feedback/form-feedback.tsx
2153
+ import { CheckCircle, CircleAlert, LoaderCircle } from "lucide-react";
2154
+ import { jsx as jsx24, jsxs as jsxs11 } from "react/jsx-runtime";
2155
+ function FormFeedback({
2156
+ state,
2157
+ className,
2158
+ pendingLabel = "Guardando\u2026",
2159
+ successLabel = "Guardado"
2160
+ }) {
2161
+ if (state.status === "idle")
2162
+ return /* @__PURE__ */ jsx24("span", { "aria-hidden": "true", className: cn("inline-flex h-5 items-center", className) });
2163
+ const error = state.status === "error";
2164
+ const success = state.status === "success";
2165
+ return /* @__PURE__ */ jsxs11(
2166
+ "span",
2167
+ {
2168
+ role: error ? "alert" : "status",
2169
+ "aria-live": "polite",
2170
+ className: cn(
2171
+ "inline-flex h-5 items-center gap-1.5 text-xs",
2172
+ error && "text-destructive",
2173
+ success && "text-success",
2174
+ state.status === "pending" && "text-muted-foreground",
2175
+ className
2176
+ ),
2177
+ children: [
2178
+ state.status === "pending" && /* @__PURE__ */ jsx24(LoaderCircle, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
2179
+ success && /* @__PURE__ */ jsx24(CheckCircle, { "aria-hidden": "true", className: "size-3.5" }),
2180
+ error && /* @__PURE__ */ jsx24(CircleAlert, { "aria-hidden": "true", className: "size-3.5" }),
2181
+ /* @__PURE__ */ jsx24("span", { children: state.status === "pending" ? pendingLabel : success ? state.message ?? successLabel : state.message })
2182
+ ]
2183
+ }
2184
+ );
2185
+ }
2186
+
2187
+ // src/ui/form-feedback/use-form-feedback.ts
1840
2188
  import { useCallback as useCallback5, useEffect as useEffect4, useRef as useRef3, useState as useState9 } from "react";
1841
- import { CheckCircle, LoaderCircle, CircleAlert } from "lucide-react";
1842
- import { jsx as jsx26, jsxs as jsxs12 } from "react/jsx-runtime";
1843
2189
  function useFormFeedback(options) {
1844
2190
  const resetMs = options?.successResetMs ?? 2500;
1845
2191
  const [state, setState] = useState9({ status: "idle" });
@@ -1853,49 +2199,52 @@ function useFormFeedback(options) {
1853
2199
  clearTimer();
1854
2200
  setState({ status: "pending" });
1855
2201
  }, [clearTimer]);
1856
- const setSuccess = useCallback5((message) => {
1857
- clearTimer();
1858
- setState({ status: "success", message });
1859
- if (resetMs > 0) timer.current = setTimeout(() => setState({ status: "idle" }), resetMs);
1860
- }, [clearTimer, resetMs]);
1861
- const setError = useCallback5((message) => {
1862
- clearTimer();
1863
- setState({ status: "error", message });
1864
- }, [clearTimer]);
2202
+ const setSuccess = useCallback5(
2203
+ (message) => {
2204
+ clearTimer();
2205
+ setState({ status: "success", message });
2206
+ if (resetMs > 0) timer.current = setTimeout(() => setState({ status: "idle" }), resetMs);
2207
+ },
2208
+ [clearTimer, resetMs]
2209
+ );
2210
+ const setError = useCallback5(
2211
+ (message) => {
2212
+ clearTimer();
2213
+ setState({ status: "error", message });
2214
+ },
2215
+ [clearTimer]
2216
+ );
1865
2217
  const reset = useCallback5(() => {
1866
2218
  clearTimer();
1867
2219
  setState({ status: "idle" });
1868
2220
  }, [clearTimer]);
1869
2221
  return { state, pending: state.status === "pending", setPending, setSuccess, setError, reset };
1870
2222
  }
1871
- function FormFeedback({ state, className, pendingLabel = "Guardando\u2026", successLabel = "Guardado" }) {
1872
- if (state.status === "idle") return /* @__PURE__ */ jsx26("span", { "aria-hidden": "true", className: cn("inline-flex h-5 items-center", className) });
1873
- const error = state.status === "error";
1874
- const success = state.status === "success";
1875
- return /* @__PURE__ */ jsxs12("span", { role: error ? "alert" : "status", "aria-live": "polite", className: cn("inline-flex h-5 items-center gap-1.5 text-xs", error && "text-destructive", success && "text-success", state.status === "pending" && "text-muted-foreground", className), children: [
1876
- state.status === "pending" && /* @__PURE__ */ jsx26(LoaderCircle, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
1877
- success && /* @__PURE__ */ jsx26(CheckCircle, { "aria-hidden": "true", className: "size-3.5" }),
1878
- error && /* @__PURE__ */ jsx26(CircleAlert, { "aria-hidden": "true", className: "size-3.5" }),
1879
- /* @__PURE__ */ jsx26("span", { children: state.status === "pending" ? pendingLabel : success ? state.message ?? successLabel : state.message })
1880
- ] });
1881
- }
1882
2223
 
1883
2224
  // src/ui/form-row/form-row.tsx
1884
- import { Fragment as Fragment9, jsx as jsx27, jsxs as jsxs13 } from "react/jsx-runtime";
1885
- function FormRow({ label, htmlFor, required, hint, error, className, children }) {
2225
+ import { Fragment as Fragment6, jsx as jsx25, jsxs as jsxs12 } from "react/jsx-runtime";
2226
+ function FormRow({
2227
+ label,
2228
+ htmlFor,
2229
+ required,
2230
+ hint,
2231
+ error,
2232
+ className,
2233
+ children
2234
+ }) {
1886
2235
  const hintId = hint ? `${htmlFor}-hint` : void 0;
1887
2236
  const errorId = error ? `${htmlFor}-error` : void 0;
1888
- return /* @__PURE__ */ jsxs13("div", { "data-slot": "form-row", className: cn("flex flex-col gap-1.5", className), children: [
1889
- /* @__PURE__ */ jsxs13("label", { htmlFor, className: "text-sm font-medium text-foreground", children: [
2237
+ return /* @__PURE__ */ jsxs12("div", { "data-slot": "form-row", className: cn("flex flex-col gap-1.5", className), children: [
2238
+ /* @__PURE__ */ jsxs12("label", { htmlFor, className: "text-foreground text-sm font-medium", children: [
1890
2239
  label,
1891
- required && /* @__PURE__ */ jsxs13(Fragment9, { children: [
1892
- /* @__PURE__ */ jsx27("span", { "aria-hidden": "true", className: "ml-0.5 text-destructive", children: "*" }),
1893
- /* @__PURE__ */ jsx27("span", { className: "sr-only", children: " (obligatorio)" })
2240
+ required && /* @__PURE__ */ jsxs12(Fragment6, { children: [
2241
+ /* @__PURE__ */ jsx25("span", { "aria-hidden": "true", className: "text-destructive ml-0.5", children: "*" }),
2242
+ /* @__PURE__ */ jsx25("span", { className: "sr-only", children: " (obligatorio)" })
1894
2243
  ] })
1895
2244
  ] }),
1896
2245
  children,
1897
- hint && /* @__PURE__ */ jsx27("p", { id: hintId, className: "text-xs text-muted-foreground", children: hint }),
1898
- error && /* @__PURE__ */ jsx27("p", { id: errorId, role: "alert", className: "text-xs font-medium text-destructive", children: error })
2246
+ hint && /* @__PURE__ */ jsx25("p", { id: hintId, className: "text-muted-foreground text-xs", children: hint }),
2247
+ error && /* @__PURE__ */ jsx25("p", { id: errorId, role: "alert", className: "text-destructive text-xs font-medium", children: error })
1899
2248
  ] });
1900
2249
  }
1901
2250
 
@@ -1903,34 +2252,25 @@ function FormRow({ label, htmlFor, required, hint, error, className, children })
1903
2252
  import { Link as Link2 } from "react-aria-components";
1904
2253
 
1905
2254
  // src/ui/tooltip/tooltip.tsx
1906
- import * as React6 from "react";
1907
2255
  import {
1908
- Focusable,
1909
2256
  OverlayArrow,
1910
2257
  Tooltip as TooltipPrimitive,
1911
2258
  TooltipTrigger as TooltipTriggerPrimitive
1912
2259
  } from "react-aria-components";
1913
- import { jsx as jsx28, jsxs as jsxs14 } from "react/jsx-runtime";
2260
+ import { jsx as jsx26, jsxs as jsxs13 } from "react/jsx-runtime";
1914
2261
  function TooltipTrigger({
1915
2262
  delay = 0,
1916
- children,
1917
2263
  ...props
1918
2264
  }) {
1919
- const [trigger, tooltip] = React6.Children.toArray(children);
1920
- return /* @__PURE__ */ jsxs14(
1921
- TooltipTriggerPrimitive,
1922
- {
1923
- "data-slot": "tooltip-trigger",
1924
- delay,
1925
- ...props,
1926
- children: [
1927
- /* @__PURE__ */ jsx28(Focusable, { children: trigger }),
1928
- tooltip
1929
- ]
1930
- }
1931
- );
2265
+ return /* @__PURE__ */ jsx26(TooltipTriggerPrimitive, { "data-slot": "tooltip-trigger", delay, ...props });
1932
2266
  }
1933
- function Tooltip({
2267
+ function Tooltip({ label, children, delay, ...props }) {
2268
+ return /* @__PURE__ */ jsxs13(TooltipTrigger, { delay, children: [
2269
+ children,
2270
+ /* @__PURE__ */ jsx26(TooltipContent, { ...props, children: label })
2271
+ ] });
2272
+ }
2273
+ function TooltipContent({
1934
2274
  className,
1935
2275
  placement = "top",
1936
2276
  offset = 4,
@@ -1938,7 +2278,7 @@ function Tooltip({
1938
2278
  children,
1939
2279
  ...props
1940
2280
  }) {
1941
- return /* @__PURE__ */ jsxs14(
2281
+ return /* @__PURE__ */ jsxs13(
1942
2282
  TooltipPrimitive,
1943
2283
  {
1944
2284
  "data-slot": "tooltip-content",
@@ -1952,10 +2292,10 @@ function Tooltip({
1952
2292
  ...props,
1953
2293
  children: [
1954
2294
  children,
1955
- /* @__PURE__ */ jsx28(
2295
+ /* @__PURE__ */ jsx26(
1956
2296
  OverlayArrow,
1957
2297
  {
1958
- className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs bg-foreground fill-foreground",
2298
+ className: "bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs",
1959
2299
  style: ({ placement: placement2, defaultStyle }) => ({
1960
2300
  ...defaultStyle,
1961
2301
  rotate: "0deg",
@@ -1970,7 +2310,7 @@ function Tooltip({
1970
2310
  }
1971
2311
 
1972
2312
  // src/ui/icon-button/icon-button.tsx
1973
- import { jsx as jsx29, jsxs as jsxs15 } from "react/jsx-runtime";
2313
+ import { jsx as jsx27 } from "react/jsx-runtime";
1974
2314
  function IconButton({
1975
2315
  label,
1976
2316
  children,
@@ -1979,63 +2319,90 @@ function IconButton({
1979
2319
  variant,
1980
2320
  ...props
1981
2321
  }) {
1982
- const linkClassName = cn(
1983
- buttonVariants({ variant, size: "icon" }),
1984
- className
1985
- );
1986
- return /* @__PURE__ */ jsxs15(TooltipTrigger, { children: [
1987
- href ? /* @__PURE__ */ jsx29(
1988
- Link2,
1989
- {
1990
- "data-slot": "icon-button",
1991
- "aria-label": label,
1992
- href,
1993
- className: linkClassName,
1994
- children
1995
- }
1996
- ) : /* @__PURE__ */ jsx29(
1997
- Button,
1998
- {
1999
- "data-slot": "icon-button",
2000
- "aria-label": label,
2001
- variant,
2002
- size: "icon",
2003
- className,
2004
- ...props,
2005
- children
2006
- }
2007
- ),
2008
- /* @__PURE__ */ jsx29(Tooltip, { children: label })
2009
- ] });
2322
+ const linkClassName = cn(buttonVariants({ variant, size: "icon" }), className);
2323
+ return /* @__PURE__ */ jsx27(Tooltip, { label, children: href ? /* @__PURE__ */ jsx27(Link2, { "data-slot": "icon-button", "aria-label": label, href, className: linkClassName, children }) : /* @__PURE__ */ jsx27(
2324
+ Button,
2325
+ {
2326
+ "data-slot": "icon-button",
2327
+ "aria-label": label,
2328
+ variant,
2329
+ size: "icon",
2330
+ className,
2331
+ ...props,
2332
+ children
2333
+ }
2334
+ ) });
2010
2335
  }
2011
2336
 
2012
2337
  // src/ui/input-group/input-group.tsx
2013
- import { cva as cva9 } from "class-variance-authority";
2338
+ import { cva as cva10 } from "class-variance-authority";
2014
2339
 
2015
2340
  // src/ui/input/input.tsx
2016
2341
  import { forwardRef as forwardRef2 } from "react";
2017
2342
  import { Input as AriaInput2 } from "react-aria-components";
2018
- import { jsx as jsx30 } from "react/jsx-runtime";
2343
+ import { jsx as jsx28 } from "react/jsx-runtime";
2019
2344
  var InputImpl = forwardRef2(function Input2({ className, type, ...props }, ref) {
2020
- return /* @__PURE__ */ jsx30(AriaInput2, { ref, type, "data-slot": "input", className: cn("h-8 w-full min-w-0 rounded-lg border border-border bg-background px-2.5 py-1 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive", className), ...props });
2345
+ return /* @__PURE__ */ jsx28(
2346
+ AriaInput2,
2347
+ {
2348
+ ref,
2349
+ type,
2350
+ "data-slot": "input",
2351
+ className: cn(
2352
+ "box-border h-8 w-full min-w-0 rounded-lg border border-border bg-background px-2.5 py-1 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive",
2353
+ className
2354
+ ),
2355
+ ...props
2356
+ }
2357
+ );
2021
2358
  });
2022
2359
  var Input3 = InputImpl;
2023
2360
 
2024
2361
  // src/ui/textarea/textarea.tsx
2025
2362
  import { forwardRef as forwardRef3 } from "react";
2026
- import { TextArea as AriaTextArea } from "react-aria-components";
2027
- import { jsx as jsx31 } from "react/jsx-runtime";
2363
+ import {
2364
+ TextArea as AriaTextArea
2365
+ } from "react-aria-components";
2366
+ import { jsx as jsx29 } from "react/jsx-runtime";
2028
2367
  var TextareaImpl = forwardRef3(function Textarea({ className, ...props }, ref) {
2029
- return /* @__PURE__ */ jsx31(AriaTextArea, { ref, "data-slot": "textarea", className: cn("min-h-20 w-full rounded-lg border border-border bg-background px-2.5 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive", className), ...props });
2368
+ return /* @__PURE__ */ jsx29(
2369
+ AriaTextArea,
2370
+ {
2371
+ ref,
2372
+ "data-slot": "textarea",
2373
+ className: cn(
2374
+ "box-border min-h-20 w-full rounded-lg border border-border bg-background px-2.5 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive",
2375
+ className
2376
+ ),
2377
+ ...props
2378
+ }
2379
+ );
2030
2380
  });
2031
2381
  var Textarea2 = TextareaImpl;
2032
2382
 
2383
+ // src/ui/input-group/input-group-addon-variants.ts
2384
+ import { cva as cva9 } from "class-variance-authority";
2385
+ var inputGroupAddonVariants = cva9(
2386
+ "flex cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none [&_svg:not([class*='size-'])]:size-4",
2387
+ {
2388
+ variants: {
2389
+ align: {
2390
+ "inline-start": "order-first pl-2",
2391
+ "inline-end": "order-last pr-2",
2392
+ "block-start": "order-first w-full justify-start px-2.5 pt-2",
2393
+ "block-end": "order-last w-full justify-start px-2.5 pb-2"
2394
+ }
2395
+ },
2396
+ defaultVariants: { align: "inline-start" }
2397
+ }
2398
+ );
2399
+
2033
2400
  // src/ui/input-group/input-group.tsx
2034
- import { jsx as jsx32 } from "react/jsx-runtime";
2401
+ import { jsx as jsx30 } from "react/jsx-runtime";
2035
2402
  function InputGroup({ className, ...props }) {
2036
2403
  return (
2037
2404
  // biome-ignore lint/a11y/useSemanticElements: fieldset cannot preserve this inline control composition.
2038
- /* @__PURE__ */ jsx32(
2405
+ /* @__PURE__ */ jsx30(
2039
2406
  "div",
2040
2407
  {
2041
2408
  role: "group",
@@ -2049,20 +2416,6 @@ function InputGroup({ className, ...props }) {
2049
2416
  )
2050
2417
  );
2051
2418
  }
2052
- var inputGroupAddonVariants = cva9(
2053
- "flex cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none [&_svg:not([class*='size-'])]:size-4",
2054
- {
2055
- variants: {
2056
- align: {
2057
- "inline-start": "order-first pl-2",
2058
- "inline-end": "order-last pr-2",
2059
- "block-start": "order-first w-full justify-start px-2.5 pt-2",
2060
- "block-end": "order-last w-full justify-start px-2.5 pb-2"
2061
- }
2062
- },
2063
- defaultVariants: { align: "inline-start" }
2064
- }
2065
- );
2066
2419
  function InputGroupAddon({
2067
2420
  className,
2068
2421
  align = "inline-start",
@@ -2071,7 +2424,7 @@ function InputGroupAddon({
2071
2424
  }) {
2072
2425
  return (
2073
2426
  // biome-ignore lint/a11y/useSemanticElements: this addon delegates focus to its associated input.
2074
- /* @__PURE__ */ jsx32(
2427
+ /* @__PURE__ */ jsx30(
2075
2428
  "div",
2076
2429
  {
2077
2430
  role: "group",
@@ -2088,7 +2441,7 @@ function InputGroupAddon({
2088
2441
  )
2089
2442
  );
2090
2443
  }
2091
- var inputGroupButtonVariants = cva9("shrink-0 shadow-none", {
2444
+ var inputGroupButtonVariants = cva10("shrink-0 shadow-none", {
2092
2445
  variants: {
2093
2446
  size: { xs: "h-6 px-1.5 text-xs", sm: "h-7 px-2", "icon-xs": "size-6", "icon-sm": "size-7" }
2094
2447
  },
@@ -2102,7 +2455,7 @@ function InputGroupButton({
2102
2455
  ...props
2103
2456
  }) {
2104
2457
  const buttonSize = size === "icon-xs" || size === "icon-sm" ? size : size;
2105
- return /* @__PURE__ */ jsx32(
2458
+ return /* @__PURE__ */ jsx30(
2106
2459
  Button,
2107
2460
  {
2108
2461
  "data-slot": "input-group-button",
@@ -2115,7 +2468,7 @@ function InputGroupButton({
2115
2468
  );
2116
2469
  }
2117
2470
  function InputGroupText({ className, ...props }) {
2118
- return /* @__PURE__ */ jsx32(
2471
+ return /* @__PURE__ */ jsx30(
2119
2472
  "span",
2120
2473
  {
2121
2474
  "data-slot": "input-group-text",
@@ -2128,7 +2481,7 @@ function InputGroupText({ className, ...props }) {
2128
2481
  );
2129
2482
  }
2130
2483
  function InputGroupInput({ className, ...props }) {
2131
- return /* @__PURE__ */ jsx32(
2484
+ return /* @__PURE__ */ jsx30(
2132
2485
  Input3,
2133
2486
  {
2134
2487
  "data-slot": "input-group-control",
@@ -2141,7 +2494,7 @@ function InputGroupInput({ className, ...props }) {
2141
2494
  );
2142
2495
  }
2143
2496
  function InputGroupTextarea({ className, ...props }) {
2144
- return /* @__PURE__ */ jsx32(
2497
+ return /* @__PURE__ */ jsx30(
2145
2498
  Textarea2,
2146
2499
  {
2147
2500
  "data-slot": "input-group-control",
@@ -2154,23 +2507,146 @@ function InputGroupTextarea({ className, ...props }) {
2154
2507
  );
2155
2508
  }
2156
2509
 
2510
+ // src/ui/kanban/kanban.tsx
2511
+ import { jsx as jsx31 } from "react/jsx-runtime";
2512
+ var columnSize = {
2513
+ compact: "w-56",
2514
+ default: "w-72",
2515
+ wide: "w-80"
2516
+ };
2517
+ function KanbanViewport({
2518
+ children,
2519
+ className,
2520
+ contentClassName,
2521
+ ...props
2522
+ }) {
2523
+ return /* @__PURE__ */ jsx31(
2524
+ "div",
2525
+ {
2526
+ "data-slot": "kanban-viewport",
2527
+ className: cn("-mx-1 overflow-x-auto pb-3", className),
2528
+ ...props,
2529
+ children: /* @__PURE__ */ jsx31(
2530
+ "div",
2531
+ {
2532
+ "data-slot": "kanban-viewport-content",
2533
+ className: cn("flex min-w-max items-start gap-3 px-1", contentClassName),
2534
+ children
2535
+ }
2536
+ )
2537
+ }
2538
+ );
2539
+ }
2540
+ function KanbanColumn({
2541
+ className,
2542
+ size = "default",
2543
+ ...props
2544
+ }) {
2545
+ return /* @__PURE__ */ jsx31(
2546
+ "section",
2547
+ {
2548
+ "data-slot": "kanban-column",
2549
+ "data-size": size,
2550
+ className: cn("shrink-0 rounded-lg border border-border/70 p-2", columnSize[size], className),
2551
+ ...props
2552
+ }
2553
+ );
2554
+ }
2555
+ function KanbanColumnHeader({ className, ...props }) {
2556
+ return /* @__PURE__ */ jsx31(
2557
+ "header",
2558
+ {
2559
+ "data-slot": "kanban-column-header",
2560
+ className: cn("mb-2 flex items-center justify-between gap-2 px-1 py-1", className),
2561
+ ...props
2562
+ }
2563
+ );
2564
+ }
2565
+ function KanbanColumnTitle({ className, ...props }) {
2566
+ return /* @__PURE__ */ jsx31(
2567
+ "span",
2568
+ {
2569
+ "data-slot": "kanban-column-title",
2570
+ className: cn(
2571
+ "text-foreground truncate text-[11px] font-semibold tracking-wide uppercase",
2572
+ className
2573
+ ),
2574
+ ...props
2575
+ }
2576
+ );
2577
+ }
2578
+ function KanbanColumnBody({ className, ...props }) {
2579
+ return /* @__PURE__ */ jsx31("div", { "data-slot": "kanban-column-body", className: cn("space-y-2", className), ...props });
2580
+ }
2581
+ function KanbanEmpty({
2582
+ className,
2583
+ compact = false,
2584
+ ...props
2585
+ }) {
2586
+ return /* @__PURE__ */ jsx31(
2587
+ "p",
2588
+ {
2589
+ "data-slot": "kanban-empty",
2590
+ "data-compact": compact || void 0,
2591
+ className: cn(
2592
+ "border-border text-muted-foreground rounded-md border border-dashed py-6 text-center",
2593
+ compact ? "px-2 text-[11px]" : "px-3 text-xs",
2594
+ className
2595
+ ),
2596
+ ...props
2597
+ }
2598
+ );
2599
+ }
2600
+
2157
2601
  // src/ui/kbd/kbd.tsx
2158
- import { jsx as jsx33 } from "react/jsx-runtime";
2602
+ import { jsx as jsx32 } from "react/jsx-runtime";
2159
2603
  function Kbd({ className, ...props }) {
2160
- return /* @__PURE__ */ jsx33("kbd", { "data-slot": "kbd", className: cn("pointer-events-none inline-flex h-5 min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none", className), ...props });
2604
+ return /* @__PURE__ */ jsx32(
2605
+ "kbd",
2606
+ {
2607
+ "data-slot": "kbd",
2608
+ className: cn(
2609
+ "pointer-events-none inline-flex h-5 min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none",
2610
+ className
2611
+ ),
2612
+ ...props
2613
+ }
2614
+ );
2161
2615
  }
2162
2616
  function KbdGroup({ className, ...props }) {
2163
- return /* @__PURE__ */ jsx33("span", { "data-slot": "kbd-group", className: cn("inline-flex items-center gap-1", className), ...props });
2617
+ return /* @__PURE__ */ jsx32(
2618
+ "span",
2619
+ {
2620
+ "data-slot": "kbd-group",
2621
+ className: cn("inline-flex items-center gap-1", className),
2622
+ ...props
2623
+ }
2624
+ );
2164
2625
  }
2165
2626
 
2166
2627
  // src/ui/loading-overlay/loading-overlay.tsx
2167
2628
  import { LoaderCircle as LoaderCircle2 } from "lucide-react";
2168
- import { jsx as jsx34, jsxs as jsxs16 } from "react/jsx-runtime";
2169
- function LoadingOverlay({ label = "Cargando", className, ...props }) {
2170
- return /* @__PURE__ */ jsx34("div", { role: "status", "aria-live": "polite", className: cn("absolute inset-0 z-10 flex items-center justify-center bg-background/70 backdrop-blur-[2px]", className), ...props, children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 rounded-lg border border-border bg-background px-3 py-2 text-sm shadow-sm", children: [
2171
- /* @__PURE__ */ jsx34(LoaderCircle2, { className: "animate-spin", "aria-hidden": "true" }),
2172
- /* @__PURE__ */ jsx34("span", { children: label })
2173
- ] }) });
2629
+ import { jsx as jsx33, jsxs as jsxs14 } from "react/jsx-runtime";
2630
+ function LoadingOverlay({
2631
+ label = "Cargando",
2632
+ className,
2633
+ ...props
2634
+ }) {
2635
+ return /* @__PURE__ */ jsx33(
2636
+ "output",
2637
+ {
2638
+ "aria-live": "polite",
2639
+ className: cn(
2640
+ "absolute inset-0 z-10 flex items-center justify-center bg-background/70 backdrop-blur-[2px]",
2641
+ className
2642
+ ),
2643
+ ...props,
2644
+ children: /* @__PURE__ */ jsxs14("div", { className: "border-border bg-background flex items-center gap-2 rounded-lg border px-3 py-2 text-sm shadow-sm", children: [
2645
+ /* @__PURE__ */ jsx33(LoaderCircle2, { className: "animate-spin", "aria-hidden": "true" }),
2646
+ /* @__PURE__ */ jsx33("span", { children: label })
2647
+ ] })
2648
+ }
2649
+ );
2174
2650
  }
2175
2651
 
2176
2652
  // src/ui/menu/menu.tsx
@@ -2180,20 +2656,41 @@ import {
2180
2656
  MenuTrigger as AriaMenuTrigger,
2181
2657
  Popover as Popover3
2182
2658
  } from "react-aria-components";
2183
- import { jsx as jsx35 } from "react/jsx-runtime";
2659
+ import { jsx as jsx34 } from "react/jsx-runtime";
2184
2660
  var MenuTrigger = AriaMenuTrigger;
2185
2661
  function MenuContent({ className, ...props }) {
2186
- return /* @__PURE__ */ jsx35(Popover3, { "data-slot": "menu-content", className: cn("min-w-40 overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", className), ...props });
2662
+ return /* @__PURE__ */ jsx34(
2663
+ Popover3,
2664
+ {
2665
+ "data-slot": "menu-content",
2666
+ className: cn(
2667
+ "min-w-40 overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
2668
+ className
2669
+ ),
2670
+ ...props
2671
+ }
2672
+ );
2187
2673
  }
2188
2674
  function Menu({ className, ...props }) {
2189
- return /* @__PURE__ */ jsx35(AriaMenu, { "data-slot": "menu", className: cn("outline-none", className), ...props });
2675
+ return /* @__PURE__ */ jsx34(AriaMenu, { "data-slot": "menu", className: cn("outline-none", className), ...props });
2190
2676
  }
2191
2677
  function MenuItem({ className, children, ...props }) {
2192
- return /* @__PURE__ */ jsx35(AriaMenuItem, { "data-slot": "menu-item", className: cn("flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50", className), ...props, children });
2678
+ return /* @__PURE__ */ jsx34(
2679
+ AriaMenuItem,
2680
+ {
2681
+ "data-slot": "menu-item",
2682
+ className: cn(
2683
+ "flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50",
2684
+ className
2685
+ ),
2686
+ ...props,
2687
+ children
2688
+ }
2689
+ );
2193
2690
  }
2194
2691
 
2195
2692
  // src/ui/metric-card/metric-card.tsx
2196
- import { jsx as jsx36, jsxs as jsxs17 } from "react/jsx-runtime";
2693
+ import { jsx as jsx35, jsxs as jsxs15 } from "react/jsx-runtime";
2197
2694
  function MetricCard({
2198
2695
  className,
2199
2696
  label,
@@ -2203,12 +2700,19 @@ function MetricCard({
2203
2700
  tone = "default",
2204
2701
  ...props
2205
2702
  }) {
2206
- return /* @__PURE__ */ jsx36(Card, { "data-slot": "metric-card", "data-tone": tone, className: cn("min-w-0", className), ...props, children: /* @__PURE__ */ jsxs17(CardContent, { className: "flex items-start gap-3", children: [
2207
- icon ? /* @__PURE__ */ jsx36("div", { "data-slot": "metric-card-icon", className: "shrink-0 text-muted-foreground", children: icon }) : null,
2208
- /* @__PURE__ */ jsxs17("div", { className: "min-w-0", children: [
2209
- /* @__PURE__ */ jsx36("p", { "data-slot": "metric-card-label", className: "text-sm text-muted-foreground", children: label }),
2210
- /* @__PURE__ */ jsx36("strong", { "data-slot": "metric-card-value", className: "mt-1 block text-2xl font-semibold tracking-tight", children: value }),
2211
- description ? /* @__PURE__ */ jsx36("p", { "data-slot": "metric-card-description", className: "mt-1 text-xs text-muted-foreground", children: description }) : null
2703
+ return /* @__PURE__ */ jsx35(Card, { "data-slot": "metric-card", "data-tone": tone, className: cn("min-w-0", className), ...props, children: /* @__PURE__ */ jsxs15(CardContent, { className: "flex items-start gap-3", children: [
2704
+ icon ? /* @__PURE__ */ jsx35("div", { "data-slot": "metric-card-icon", className: "text-muted-foreground shrink-0", children: icon }) : null,
2705
+ /* @__PURE__ */ jsxs15("div", { className: "min-w-0", children: [
2706
+ /* @__PURE__ */ jsx35("p", { "data-slot": "metric-card-label", className: "text-muted-foreground text-sm", children: label }),
2707
+ /* @__PURE__ */ jsx35(
2708
+ "strong",
2709
+ {
2710
+ "data-slot": "metric-card-value",
2711
+ className: "mt-1 block text-2xl font-semibold tracking-tight",
2712
+ children: value
2713
+ }
2714
+ ),
2715
+ description ? /* @__PURE__ */ jsx35("p", { "data-slot": "metric-card-description", className: "text-muted-foreground mt-1 text-xs", children: description }) : null
2212
2716
  ] })
2213
2717
  ] }) });
2214
2718
  }
@@ -2221,7 +2725,7 @@ import {
2221
2725
  useState as useState10
2222
2726
  } from "react";
2223
2727
  import { Input as AriaInput3 } from "react-aria-components";
2224
- import { jsx as jsx37, jsxs as jsxs18 } from "react/jsx-runtime";
2728
+ import { jsx as jsx36, jsxs as jsxs16 } from "react/jsx-runtime";
2225
2729
  function normalizeOtp(value, length) {
2226
2730
  return value.replace(/[^0-9]/g, "").slice(0, length);
2227
2731
  }
@@ -2273,7 +2777,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2273
2777
  input.setSelectionRange(position, position);
2274
2778
  setSelectionStart(position);
2275
2779
  }
2276
- return /* @__PURE__ */ jsxs18(
2780
+ return /* @__PURE__ */ jsxs16(
2277
2781
  "div",
2278
2782
  {
2279
2783
  "data-slot": "otp-input",
@@ -2283,7 +2787,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2283
2787
  style: { gridTemplateColumns: `repeat(${slotCount}, minmax(0, 2.5rem))` },
2284
2788
  onPointerDown: handlePointerDown,
2285
2789
  children: [
2286
- /* @__PURE__ */ jsx37(
2790
+ /* @__PURE__ */ jsx36(
2287
2791
  AriaInput3,
2288
2792
  {
2289
2793
  ...props,
@@ -2323,7 +2827,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2323
2827
  }
2324
2828
  }
2325
2829
  ),
2326
- slots.map((slot, index) => /* @__PURE__ */ jsx37(
2830
+ slots.map((slot, index) => /* @__PURE__ */ jsx36(
2327
2831
  "span",
2328
2832
  {
2329
2833
  "aria-hidden": "true",
@@ -2346,27 +2850,59 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2346
2850
  var OtpInput2 = OtpInputImpl;
2347
2851
 
2348
2852
  // src/ui/page-header/page-header.tsx
2349
- import { jsx as jsx38 } from "react/jsx-runtime";
2853
+ import { jsx as jsx37 } from "react/jsx-runtime";
2350
2854
  function PageHeader({ className, ...props }) {
2351
- return /* @__PURE__ */ jsx38("header", { "data-slot": "page-header", className: cn("flex flex-col gap-4 py-2 sm:flex-row sm:items-center sm:justify-between", className), ...props });
2855
+ return /* @__PURE__ */ jsx37(
2856
+ "header",
2857
+ {
2858
+ "data-slot": "page-header",
2859
+ className: cn(
2860
+ "flex flex-col gap-4 py-2 sm:flex-row sm:items-center sm:justify-between",
2861
+ className
2862
+ ),
2863
+ ...props
2864
+ }
2865
+ );
2352
2866
  }
2353
2867
  function PageHeaderHeading({ className, ...props }) {
2354
- return /* @__PURE__ */ jsx38("div", { "data-slot": "page-header-heading", className: cn("min-w-0", className), ...props });
2868
+ return /* @__PURE__ */ jsx37("div", { "data-slot": "page-header-heading", className: cn("min-w-0", className), ...props });
2355
2869
  }
2356
- function PageHeaderTitle({ className, ...props }) {
2357
- return /* @__PURE__ */ jsx38("h1", { "data-slot": "page-header-title", className: cn("truncate text-xl font-semibold tracking-tight md:text-2xl", className), ...props });
2870
+ function PageHeaderTitle({ className, children, ...props }) {
2871
+ return /* @__PURE__ */ jsx37(
2872
+ "h1",
2873
+ {
2874
+ "data-slot": "page-header-title",
2875
+ className: cn("truncate text-xl font-semibold tracking-tight md:text-2xl", className),
2876
+ ...props,
2877
+ children
2878
+ }
2879
+ );
2358
2880
  }
2359
2881
  function PageHeaderDescription({ className, ...props }) {
2360
- return /* @__PURE__ */ jsx38("p", { "data-slot": "page-header-description", className: cn("mt-1 text-sm text-muted-foreground", className), ...props });
2882
+ return /* @__PURE__ */ jsx37(
2883
+ "p",
2884
+ {
2885
+ "data-slot": "page-header-description",
2886
+ className: cn("mt-1 text-sm text-muted-foreground", className),
2887
+ ...props
2888
+ }
2889
+ );
2361
2890
  }
2362
2891
  function PageHeaderActions({ className, ...props }) {
2363
- return /* @__PURE__ */ jsx38("div", { "data-slot": "page-header-actions", className: cn("flex shrink-0 items-center gap-2", className), ...props });
2892
+ return /* @__PURE__ */ jsx37(
2893
+ "div",
2894
+ {
2895
+ "data-slot": "page-header-actions",
2896
+ className: cn("flex shrink-0 items-center gap-2", className),
2897
+ ...props
2898
+ }
2899
+ );
2364
2900
  }
2365
2901
 
2366
2902
  // src/ui/pagination/pagination.tsx
2367
2903
  import { ChevronLeft, ChevronRight } from "lucide-react";
2368
- import * as React7 from "react";
2369
- import { jsx as jsx39, jsxs as jsxs19 } from "react/jsx-runtime";
2904
+ import * as React6 from "react";
2905
+ import { jsx as jsx38, jsxs as jsxs17 } from "react/jsx-runtime";
2370
2906
  function visiblePages(page, pageCount, siblingCount) {
2371
2907
  return [
2372
2908
  .../* @__PURE__ */ new Set([
@@ -2387,15 +2923,15 @@ function Pagination({
2387
2923
  }) {
2388
2924
  if (pageCount <= 1) return null;
2389
2925
  const pages = visiblePages(page, pageCount, siblingCount);
2390
- return /* @__PURE__ */ jsxs19(
2926
+ return /* @__PURE__ */ jsxs17(
2391
2927
  "nav",
2392
2928
  {
2393
2929
  "aria-label": ariaLabel,
2394
2930
  className: cn("flex flex-wrap items-center justify-between gap-4", className),
2395
2931
  children: [
2396
- /* @__PURE__ */ jsx39("p", { className: "text-sm text-muted-foreground", children: summary ?? `P\xE1gina ${page} de ${pageCount}` }),
2397
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-1", children: [
2398
- /* @__PURE__ */ jsx39(
2932
+ /* @__PURE__ */ jsx38("p", { className: "text-muted-foreground text-sm", children: summary ?? `P\xE1gina ${page} de ${pageCount}` }),
2933
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-1", children: [
2934
+ /* @__PURE__ */ jsx38(
2399
2935
  Button,
2400
2936
  {
2401
2937
  "aria-label": "P\xE1gina anterior",
@@ -2403,14 +2939,14 @@ function Pagination({
2403
2939
  onPress: () => onPageChange(page - 1),
2404
2940
  size: "icon",
2405
2941
  variant: "ghost",
2406
- children: /* @__PURE__ */ jsx39(ChevronLeft, {})
2942
+ children: /* @__PURE__ */ jsx38(ChevronLeft, {})
2407
2943
  }
2408
2944
  ),
2409
2945
  pages.map((item, index) => {
2410
2946
  const previousPage = pages[index - 1];
2411
- return /* @__PURE__ */ jsxs19(React7.Fragment, { children: [
2412
- previousPage !== void 0 && item > previousPage + 1 ? /* @__PURE__ */ jsx39("span", { "aria-hidden": "true", className: "px-1 text-muted-foreground", children: "\u2026" }) : null,
2413
- /* @__PURE__ */ jsx39(
2947
+ return /* @__PURE__ */ jsxs17(React6.Fragment, { children: [
2948
+ previousPage !== void 0 && item > previousPage + 1 ? /* @__PURE__ */ jsx38("span", { "aria-hidden": "true", className: "text-muted-foreground px-1", children: "\u2026" }) : null,
2949
+ /* @__PURE__ */ jsx38(
2414
2950
  Button,
2415
2951
  {
2416
2952
  "aria-current": item === page ? "page" : void 0,
@@ -2423,7 +2959,7 @@ function Pagination({
2423
2959
  )
2424
2960
  ] }, item);
2425
2961
  }),
2426
- /* @__PURE__ */ jsx39(
2962
+ /* @__PURE__ */ jsx38(
2427
2963
  Button,
2428
2964
  {
2429
2965
  "aria-label": "P\xE1gina siguiente",
@@ -2431,7 +2967,7 @@ function Pagination({
2431
2967
  onPress: () => onPageChange(page + 1),
2432
2968
  size: "icon",
2433
2969
  variant: "ghost",
2434
- children: /* @__PURE__ */ jsx39(ChevronRight, {})
2970
+ children: /* @__PURE__ */ jsx38(ChevronRight, {})
2435
2971
  }
2436
2972
  )
2437
2973
  ] })
@@ -2445,12 +2981,31 @@ import {
2445
2981
  DialogTrigger as AriaDialogTrigger,
2446
2982
  Popover as AriaPopover
2447
2983
  } from "react-aria-components";
2448
- import { jsx as jsx40 } from "react/jsx-runtime";
2984
+ import { jsx as jsx39, jsxs as jsxs18 } from "react/jsx-runtime";
2449
2985
  var PopoverTrigger = AriaDialogTrigger;
2450
- function Popover4({ className, ...props }) {
2451
- return /* @__PURE__ */ jsx40(AriaPopover, { "data-slot": "popover", offset: 6, className: cn("min-w-48 rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", className), ...props });
2986
+ function PopoverContent({ className, ...props }) {
2987
+ return /* @__PURE__ */ jsx39(
2988
+ AriaPopover,
2989
+ {
2990
+ "data-slot": "popover",
2991
+ offset: 6,
2992
+ className: cn(
2993
+ "z-50 min-w-48 rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
2994
+ className
2995
+ ),
2996
+ ...props
2997
+ }
2998
+ );
2999
+ }
3000
+ function Popover4(props) {
3001
+ if (!("trigger" in props)) return /* @__PURE__ */ jsx39(PopoverContent, { ...props });
3002
+ const { children, trigger, triggerProps, defaultOpen, isOpen, onOpenChange, ...contentProps } = props;
3003
+ const triggerElement = typeof trigger === "string" ? /* @__PURE__ */ jsx39(Button, { ...triggerProps, children: trigger }) : trigger;
3004
+ return /* @__PURE__ */ jsxs18(PopoverTrigger, { defaultOpen, isOpen, onOpenChange, children: [
3005
+ triggerElement,
3006
+ /* @__PURE__ */ jsx39(PopoverContent, { ...contentProps, children })
3007
+ ] });
2452
3008
  }
2453
- var PopoverContent = Popover4;
2454
3009
 
2455
3010
  // src/ui/quantity-input/quantity-input.tsx
2456
3011
  import { Minus, Plus } from "lucide-react";
@@ -2460,7 +3015,7 @@ import {
2460
3015
  Input as AriaInput4,
2461
3016
  NumberField as AriaNumberField
2462
3017
  } from "react-aria-components";
2463
- import { jsx as jsx41, jsxs as jsxs20 } from "react/jsx-runtime";
3018
+ import { jsx as jsx40, jsxs as jsxs19 } from "react/jsx-runtime";
2464
3019
  function QuantityInput({
2465
3020
  className,
2466
3021
  inputClassName,
@@ -2470,23 +3025,53 @@ function QuantityInput({
2470
3025
  step = 1,
2471
3026
  ...props
2472
3027
  }) {
2473
- return /* @__PURE__ */ jsx41(
3028
+ return /* @__PURE__ */ jsx40(
2474
3029
  AriaNumberField,
2475
3030
  {
2476
3031
  ...props,
2477
3032
  minValue,
2478
3033
  step,
2479
3034
  "data-slot": "quantity-input",
2480
- className: cn("group/quantity-input inline-flex min-w-0 data-disabled:cursor-not-allowed data-disabled:opacity-50", className),
2481
- children: /* @__PURE__ */ jsxs20(
3035
+ className: cn(
3036
+ "group/quantity-input inline-flex min-w-0 data-disabled:cursor-not-allowed data-disabled:opacity-50",
3037
+ className
3038
+ ),
3039
+ children: /* @__PURE__ */ jsxs19(
2482
3040
  AriaGroup,
2483
3041
  {
2484
3042
  "data-slot": "quantity-input-group",
2485
- className: "flex h-8 min-w-0 items-stretch overflow-hidden rounded-lg border border-border bg-background text-foreground transition-[border-color,box-shadow] focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 group-data-invalid/quantity-input:border-destructive",
3043
+ className: "border-border bg-background text-foreground focus-within:border-ring focus-within:ring-ring/50 group-data-invalid/quantity-input:border-destructive flex h-8 min-w-0 items-stretch overflow-hidden rounded-lg border transition-[border-color,box-shadow] focus-within:ring-3",
2486
3044
  children: [
2487
- /* @__PURE__ */ jsx41(AriaButton, { slot: "decrement", "aria-label": decrementAriaLabel, "data-slot": "quantity-input-decrement", className: "flex size-8 shrink-0 cursor-pointer items-center justify-center border-r border-border text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground data-focus-visible:bg-muted data-pressed:bg-muted data-disabled:pointer-events-none", children: /* @__PURE__ */ jsx41(Minus, { "aria-hidden": "true", className: "size-4" }) }),
2488
- /* @__PURE__ */ jsx41(AriaInput4, { "data-slot": "quantity-input-value", className: cn("w-14 min-w-0 bg-transparent px-1 text-center text-sm tabular-nums outline-none", inputClassName) }),
2489
- /* @__PURE__ */ jsx41(AriaButton, { slot: "increment", "aria-label": incrementAriaLabel, "data-slot": "quantity-input-increment", className: "flex size-8 shrink-0 cursor-pointer items-center justify-center border-l border-border text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground data-focus-visible:bg-muted data-pressed:bg-muted data-disabled:pointer-events-none", children: /* @__PURE__ */ jsx41(Plus, { "aria-hidden": "true", className: "size-4" }) })
3045
+ /* @__PURE__ */ jsx40(
3046
+ AriaButton,
3047
+ {
3048
+ slot: "decrement",
3049
+ "aria-label": decrementAriaLabel,
3050
+ "data-slot": "quantity-input-decrement",
3051
+ className: "border-border text-muted-foreground hover:bg-muted hover:text-foreground data-focus-visible:bg-muted data-pressed:bg-muted flex size-8 shrink-0 cursor-pointer items-center justify-center border-r transition-colors outline-none data-disabled:pointer-events-none",
3052
+ children: /* @__PURE__ */ jsx40(Minus, { "aria-hidden": "true", className: "size-4" })
3053
+ }
3054
+ ),
3055
+ /* @__PURE__ */ jsx40(
3056
+ AriaInput4,
3057
+ {
3058
+ "data-slot": "quantity-input-value",
3059
+ className: cn(
3060
+ "w-14 min-w-0 bg-transparent px-1 text-center text-sm tabular-nums outline-none",
3061
+ inputClassName
3062
+ )
3063
+ }
3064
+ ),
3065
+ /* @__PURE__ */ jsx40(
3066
+ AriaButton,
3067
+ {
3068
+ slot: "increment",
3069
+ "aria-label": incrementAriaLabel,
3070
+ "data-slot": "quantity-input-increment",
3071
+ className: "border-border text-muted-foreground hover:bg-muted hover:text-foreground data-focus-visible:bg-muted data-pressed:bg-muted flex size-8 shrink-0 cursor-pointer items-center justify-center border-l transition-colors outline-none data-disabled:pointer-events-none",
3072
+ children: /* @__PURE__ */ jsx40(Plus, { "aria-hidden": "true", className: "size-4" })
3073
+ }
3074
+ )
2490
3075
  ]
2491
3076
  }
2492
3077
  )
@@ -2495,6 +3080,7 @@ function QuantityInput({
2495
3080
  }
2496
3081
 
2497
3082
  // src/ui/select/select.tsx
3083
+ import { ChevronDown as ChevronDown2 } from "lucide-react";
2498
3084
  import {
2499
3085
  Button as AriaButton2,
2500
3086
  Select as AriaSelect,
@@ -2503,44 +3089,99 @@ import {
2503
3089
  ListBoxItem as ListBoxItem3,
2504
3090
  Popover as Popover5
2505
3091
  } from "react-aria-components";
2506
- import { ChevronDown as ChevronDown2 } from "lucide-react";
2507
- import { Fragment as Fragment11, jsx as jsx42, jsxs as jsxs21 } from "react/jsx-runtime";
3092
+ import { Fragment as Fragment8, jsx as jsx41, jsxs as jsxs20 } from "react/jsx-runtime";
2508
3093
  var Select = AriaSelect;
2509
3094
  function SelectTrigger({ className, children, ...props }) {
2510
- return /* @__PURE__ */ jsx42(AriaButton2, { "data-slot": "select-trigger", className: cn("group/select-trigger flex h-8 w-full min-w-36 items-center gap-2 rounded-lg border border-border bg-background px-2.5 text-left text-sm text-foreground outline-none data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-disabled:cursor-not-allowed data-disabled:opacity-50", className), ...props, children: (state) => /* @__PURE__ */ jsxs21(Fragment11, { children: [
2511
- typeof children === "function" ? children(state) : children,
2512
- /* @__PURE__ */ jsx42(ChevronDown2, { "aria-hidden": "true", className: "ml-auto size-4 text-muted-foreground transition-transform group-data-pressed/select-trigger:rotate-180 motion-reduce:transition-none" })
2513
- ] }) });
3095
+ return /* @__PURE__ */ jsx41(
3096
+ AriaButton2,
3097
+ {
3098
+ "data-slot": "select-trigger",
3099
+ className: cn(
3100
+ "group/select-trigger box-border flex h-8 w-full min-w-36 items-center gap-2 rounded-lg border border-border bg-background px-2.5 text-left text-sm text-foreground outline-none data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-disabled:cursor-not-allowed data-disabled:opacity-50",
3101
+ className
3102
+ ),
3103
+ ...props,
3104
+ children: (state) => /* @__PURE__ */ jsxs20(Fragment8, { children: [
3105
+ typeof children === "function" ? children(state) : children,
3106
+ /* @__PURE__ */ jsx41(
3107
+ ChevronDown2,
3108
+ {
3109
+ "aria-hidden": "true",
3110
+ className: "text-muted-foreground ml-auto size-4 transition-transform group-data-pressed/select-trigger:rotate-180 motion-reduce:transition-none"
3111
+ }
3112
+ )
3113
+ ] })
3114
+ }
3115
+ );
2514
3116
  }
2515
3117
  function SelectValue({ className, ...props }) {
2516
- return /* @__PURE__ */ jsx42(AriaSelectValue, { "data-slot": "select-value", className: cn("flex-1 truncate data-placeholder:text-muted-foreground", className), ...props });
3118
+ return /* @__PURE__ */ jsx41(
3119
+ AriaSelectValue,
3120
+ {
3121
+ "data-slot": "select-value",
3122
+ className: cn("flex-1 truncate data-placeholder:text-muted-foreground", className),
3123
+ ...props
3124
+ }
3125
+ );
2517
3126
  }
2518
3127
  function SelectContent({ className, ...props }) {
2519
- return /* @__PURE__ */ jsx42(Popover5, { "data-slot": "select-content", className: cn("w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", className), ...props });
3128
+ return /* @__PURE__ */ jsx41(
3129
+ Popover5,
3130
+ {
3131
+ "data-slot": "select-content",
3132
+ className: cn(
3133
+ "w-(--trigger-width) overflow-hidden rounded-xl border border-border bg-background p-1.5 text-foreground shadow-lg motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
3134
+ className
3135
+ ),
3136
+ ...props
3137
+ }
3138
+ );
2520
3139
  }
2521
3140
  function SelectList({ className, ...props }) {
2522
- return /* @__PURE__ */ jsx42(ListBox3, { "data-slot": "select-list", className: cn("max-h-64 overflow-y-auto", className), ...props });
3141
+ return /* @__PURE__ */ jsx41(
3142
+ ListBox3,
3143
+ {
3144
+ "data-slot": "select-list",
3145
+ className: cn("max-h-64 overflow-y-auto", className),
3146
+ ...props
3147
+ }
3148
+ );
2523
3149
  }
2524
- function SelectItem({ className, children, ...props }) {
2525
- return /* @__PURE__ */ jsx42(ListBoxItem3, { "data-slot": "select-item", className: cn("flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-selected:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50", className), ...props, children });
3150
+ function SelectItem({
3151
+ className,
3152
+ children,
3153
+ ...props
3154
+ }) {
3155
+ return /* @__PURE__ */ jsx41(
3156
+ ListBoxItem3,
3157
+ {
3158
+ "data-slot": "select-item",
3159
+ className: cn(
3160
+ "flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-none data-focused:bg-muted data-selected:bg-muted data-disabled:pointer-events-none data-disabled:opacity-50",
3161
+ className
3162
+ ),
3163
+ ...props,
3164
+ children
3165
+ }
3166
+ );
2526
3167
  }
2527
3168
 
2528
3169
  // src/ui/sheet/sheet.tsx
2529
3170
  import { XIcon as XIcon2 } from "lucide-react";
2530
3171
  import {
2531
- Heading as Heading6,
3172
+ Heading as Heading3,
2532
3173
  ModalOverlay as ModalOverlayPrimitive,
2533
3174
  Modal as ModalPrimitive,
2534
3175
  Dialog as SheetPrimitive,
2535
3176
  DialogTrigger as SheetTriggerPrimitive,
2536
- Text as Text5
3177
+ Text as Text3
2537
3178
  } from "react-aria-components";
2538
- import { jsx as jsx43, jsxs as jsxs22 } from "react/jsx-runtime";
3179
+ import { jsx as jsx42, jsxs as jsxs21 } from "react/jsx-runtime";
2539
3180
  function SheetTrigger({ ...props }) {
2540
- return /* @__PURE__ */ jsx43(SheetTriggerPrimitive, { "data-slot": "sheet-trigger", ...props });
3181
+ return /* @__PURE__ */ jsx42(SheetTriggerPrimitive, { "data-slot": "sheet-trigger", ...props });
2541
3182
  }
2542
3183
  function SheetClose({ className, variant = "outline", size = "default", ...props }) {
2543
- return /* @__PURE__ */ jsx43(
3184
+ return /* @__PURE__ */ jsx42(
2544
3185
  Button,
2545
3186
  {
2546
3187
  slot: "close",
@@ -2557,7 +3198,7 @@ function SheetOverlay({
2557
3198
  children,
2558
3199
  ...props
2559
3200
  }) {
2560
- return /* @__PURE__ */ jsx43(
3201
+ return /* @__PURE__ */ jsx42(
2561
3202
  ModalOverlayPrimitive,
2562
3203
  {
2563
3204
  "data-slot": "sheet-overlay",
@@ -2578,7 +3219,7 @@ function Sheet({
2578
3219
  showCloseButton = true,
2579
3220
  ...props
2580
3221
  }) {
2581
- return /* @__PURE__ */ jsx43(SheetOverlay, { ...props, children: /* @__PURE__ */ jsx43(
3222
+ return /* @__PURE__ */ jsx42(SheetOverlay, { ...props, children: /* @__PURE__ */ jsx42(
2582
3223
  ModalPrimitive,
2583
3224
  {
2584
3225
  "data-slot": "sheet-content",
@@ -2587,16 +3228,16 @@ function Sheet({
2587
3228
  "fixed z-50 flex flex-col gap-4 border-border bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-entering:opacity-0 data-exiting:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-entering:translate-y-10 data-[side=bottom]:data-exiting:translate-y-10 data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-entering:-translate-x-10 data-[side=left]:data-exiting:-translate-x-10 data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-entering:translate-x-10 data-[side=right]:data-exiting:translate-x-10 data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-entering:-translate-y-10 data-[side=top]:data-exiting:-translate-y-10 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
2588
3229
  className
2589
3230
  ),
2590
- children: /* @__PURE__ */ jsxs22(
3231
+ children: /* @__PURE__ */ jsxs21(
2591
3232
  SheetPrimitive,
2592
3233
  {
2593
3234
  "data-slot": "sheet",
2594
3235
  className: "[display:inherit] h-full max-h-[inherit] [flex-direction:inherit] gap-[inherit] outline-none",
2595
3236
  children: [
2596
3237
  children,
2597
- showCloseButton && /* @__PURE__ */ jsxs22(SheetClose, { variant: "ghost", className: "absolute top-3 right-3", size: "icon-sm", children: [
2598
- /* @__PURE__ */ jsx43(XIcon2, {}),
2599
- /* @__PURE__ */ jsx43("span", { className: "sr-only", children: "Cerrar" })
3238
+ showCloseButton && /* @__PURE__ */ jsxs21(SheetClose, { variant: "ghost", className: "absolute top-3 right-3", size: "icon-sm", children: [
3239
+ /* @__PURE__ */ jsx42(XIcon2, {}),
3240
+ /* @__PURE__ */ jsx42("span", { className: "sr-only", children: "Cerrar" })
2600
3241
  ] })
2601
3242
  ]
2602
3243
  }
@@ -2611,10 +3252,25 @@ function SheetContent({
2611
3252
  showCloseButton = true,
2612
3253
  ...props
2613
3254
  }) {
2614
- return /* @__PURE__ */ jsx43(Sheet, { className, side, showCloseButton, ...props, children });
3255
+ return /* @__PURE__ */ jsx42(Sheet, { className, side, showCloseButton, ...props, children });
3256
+ }
3257
+ function Drawer({
3258
+ children,
3259
+ trigger,
3260
+ triggerProps,
3261
+ defaultOpen,
3262
+ isOpen,
3263
+ onOpenChange,
3264
+ ...contentProps
3265
+ }) {
3266
+ const triggerElement = typeof trigger === "string" ? /* @__PURE__ */ jsx42(Button, { ...triggerProps, children: trigger }) : trigger;
3267
+ return /* @__PURE__ */ jsxs21(SheetTrigger, { defaultOpen, isOpen, onOpenChange, children: [
3268
+ triggerElement,
3269
+ /* @__PURE__ */ jsx42(SheetContent, { ...contentProps, children })
3270
+ ] });
2615
3271
  }
2616
3272
  function SheetHeader({ className, ...props }) {
2617
- return /* @__PURE__ */ jsx43(
3273
+ return /* @__PURE__ */ jsx42(
2618
3274
  "div",
2619
3275
  {
2620
3276
  "data-slot": "sheet-header",
@@ -2624,7 +3280,7 @@ function SheetHeader({ className, ...props }) {
2624
3280
  );
2625
3281
  }
2626
3282
  function SheetFooter({ className, ...props }) {
2627
- return /* @__PURE__ */ jsx43(
3283
+ return /* @__PURE__ */ jsx42(
2628
3284
  "div",
2629
3285
  {
2630
3286
  "data-slot": "sheet-footer",
@@ -2634,8 +3290,8 @@ function SheetFooter({ className, ...props }) {
2634
3290
  );
2635
3291
  }
2636
3292
  function SheetTitle({ className, ...props }) {
2637
- return /* @__PURE__ */ jsx43(
2638
- Heading6,
3293
+ return /* @__PURE__ */ jsx42(
3294
+ Heading3,
2639
3295
  {
2640
3296
  slot: "title",
2641
3297
  "data-slot": "sheet-title",
@@ -2648,8 +3304,8 @@ function SheetDescription({
2648
3304
  className,
2649
3305
  ...props
2650
3306
  }) {
2651
- return /* @__PURE__ */ jsx43(
2652
- Text5,
3307
+ return /* @__PURE__ */ jsx42(
3308
+ Text3,
2653
3309
  {
2654
3310
  slot: "description",
2655
3311
  "data-slot": "sheet-description",
@@ -2658,29 +3314,30 @@ function SheetDescription({
2658
3314
  }
2659
3315
  );
2660
3316
  }
3317
+ var DrawerTrigger = SheetTrigger;
3318
+ var DrawerContent = SheetContent;
3319
+ var DrawerClose = SheetClose;
3320
+ var DrawerHeader = SheetHeader;
3321
+ var DrawerFooter = SheetFooter;
3322
+ var DrawerTitle = SheetTitle;
3323
+ var DrawerDescription = SheetDescription;
2661
3324
 
2662
3325
  // src/ui/sidebar/sidebar.tsx
2663
- import {
2664
- ChevronLeft as ChevronLeft2,
2665
- ChevronRight as ChevronRight2,
2666
- Ellipsis,
2667
- Search
2668
- } from "lucide-react";
2669
- import {
2670
- createContext as createContext5,
2671
- useContext as useContext5,
2672
- useMemo as useMemo2,
2673
- useState as useState11
2674
- } from "react";
3326
+ import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight2, Ellipsis, Search } from "lucide-react";
3327
+ import { useMemo as useMemo2, useState as useState11 } from "react";
2675
3328
  import { Link as Link3 } from "react-aria-components";
2676
- import { Fragment as Fragment12, jsx as jsx44, jsxs as jsxs23 } from "react/jsx-runtime";
2677
- var SidebarContext = createContext5(null);
3329
+
3330
+ // src/ui/sidebar/sidebar-context.ts
3331
+ import { createContext as createContext4, useContext as useContext4 } from "react";
3332
+ var SidebarContext = createContext4(null);
2678
3333
  function useSidebar() {
2679
- const context = useContext5(SidebarContext);
2680
- if (!context)
2681
- throw new Error("useSidebar must be used inside SidebarProvider");
3334
+ const context = useContext4(SidebarContext);
3335
+ if (!context) throw new Error("useSidebar must be used inside SidebarProvider");
2682
3336
  return context;
2683
3337
  }
3338
+
3339
+ // src/ui/sidebar/sidebar.tsx
3340
+ import { Fragment as Fragment9, jsx as jsx43, jsxs as jsxs22 } from "react/jsx-runtime";
2684
3341
  function SidebarProvider({
2685
3342
  defaultCollapsed = false,
2686
3343
  children
@@ -2694,14 +3351,11 @@ function SidebarProvider({
2694
3351
  }),
2695
3352
  [collapsed]
2696
3353
  );
2697
- return /* @__PURE__ */ jsx44(SidebarContext.Provider, { value, children });
3354
+ return /* @__PURE__ */ jsx43(SidebarContext.Provider, { value, children });
2698
3355
  }
2699
- function Sidebar({
2700
- className,
2701
- ...props
2702
- }) {
3356
+ function Sidebar({ className, ...props }) {
2703
3357
  const { collapsed } = useSidebar();
2704
- return /* @__PURE__ */ jsx44(
3358
+ return /* @__PURE__ */ jsx43(
2705
3359
  "aside",
2706
3360
  {
2707
3361
  "data-slot": "sidebar",
@@ -2714,11 +3368,8 @@ function Sidebar({
2714
3368
  }
2715
3369
  );
2716
3370
  }
2717
- function SidebarHeader({
2718
- className,
2719
- ...props
2720
- }) {
2721
- return /* @__PURE__ */ jsx44(
3371
+ function SidebarHeader({ className, ...props }) {
3372
+ return /* @__PURE__ */ jsx43(
2722
3373
  "div",
2723
3374
  {
2724
3375
  "data-slot": "sidebar-header",
@@ -2733,7 +3384,7 @@ function SidebarSearch({
2733
3384
  className,
2734
3385
  ...props
2735
3386
  }) {
2736
- return /* @__PURE__ */ jsxs23(
3387
+ return /* @__PURE__ */ jsxs22(
2737
3388
  "button",
2738
3389
  {
2739
3390
  type: "button",
@@ -2744,18 +3395,15 @@ function SidebarSearch({
2744
3395
  ),
2745
3396
  ...props,
2746
3397
  children: [
2747
- /* @__PURE__ */ jsx44(Search, { className: "size-4 shrink-0" }),
2748
- /* @__PURE__ */ jsx44("span", { className: "flex-1 text-left", children: label }),
2749
- /* @__PURE__ */ jsx44("kbd", { className: "rounded bg-secondary px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: shortcut })
3398
+ /* @__PURE__ */ jsx43(Search, { className: "size-4 shrink-0" }),
3399
+ /* @__PURE__ */ jsx43("span", { className: "flex-1 text-left", children: label }),
3400
+ /* @__PURE__ */ jsx43("kbd", { className: "bg-secondary text-muted-foreground rounded px-1.5 py-0.5 font-mono text-[10px]", children: shortcut })
2750
3401
  ]
2751
3402
  }
2752
3403
  );
2753
3404
  }
2754
- function SidebarContent({
2755
- className,
2756
- ...props
2757
- }) {
2758
- return /* @__PURE__ */ jsx44(
3405
+ function SidebarContent({ className, ...props }) {
3406
+ return /* @__PURE__ */ jsx43(
2759
3407
  "nav",
2760
3408
  {
2761
3409
  "data-slot": "sidebar-content",
@@ -2765,18 +3413,12 @@ function SidebarContent({
2765
3413
  }
2766
3414
  );
2767
3415
  }
2768
- function SidebarFooter({
2769
- className,
2770
- ...props
2771
- }) {
2772
- return /* @__PURE__ */ jsx44(
3416
+ function SidebarFooter({ className, ...props }) {
3417
+ return /* @__PURE__ */ jsx43(
2773
3418
  "div",
2774
3419
  {
2775
3420
  "data-slot": "sidebar-footer",
2776
- className: cn(
2777
- "mt-auto flex flex-col gap-2 border-t border-border p-2",
2778
- className
2779
- ),
3421
+ className: cn("mt-auto flex flex-col gap-2 border-t border-border p-2", className),
2780
3422
  ...props
2781
3423
  }
2782
3424
  );
@@ -2788,27 +3430,19 @@ function SidebarGroup({
2788
3430
  ...props
2789
3431
  }) {
2790
3432
  const { collapsed } = useSidebar();
2791
- return /* @__PURE__ */ jsxs23(
2792
- "section",
2793
- {
2794
- "data-slot": "sidebar-group",
2795
- className: cn("mb-4 last:mb-0", className),
2796
- ...props,
2797
- children: [
2798
- label && /* @__PURE__ */ jsx44(
2799
- "h2",
2800
- {
2801
- className: cn(
2802
- "mb-1 px-3 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",
2803
- collapsed && "sr-only"
2804
- ),
2805
- children: label
2806
- }
3433
+ return /* @__PURE__ */ jsxs22("section", { "data-slot": "sidebar-group", className: cn("mb-4 last:mb-0", className), ...props, children: [
3434
+ label && /* @__PURE__ */ jsx43(
3435
+ "h2",
3436
+ {
3437
+ className: cn(
3438
+ "mb-1 px-3 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",
3439
+ collapsed && "sr-only"
2807
3440
  ),
2808
- children
2809
- ]
2810
- }
2811
- );
3441
+ children: label
3442
+ }
3443
+ ),
3444
+ children
3445
+ ] });
2812
3446
  }
2813
3447
  function SidebarItem({
2814
3448
  icon,
@@ -2821,7 +3455,7 @@ function SidebarItem({
2821
3455
  }) {
2822
3456
  const { collapsed } = useSidebar();
2823
3457
  const content = typeof children === "function" ? label : children ?? label;
2824
- return /* @__PURE__ */ jsx44(
3458
+ return /* @__PURE__ */ jsx43(
2825
3459
  Link3,
2826
3460
  {
2827
3461
  "data-slot": "sidebar-item",
@@ -2833,25 +3467,16 @@ function SidebarItem({
2833
3467
  typeof className === "function" ? className : className
2834
3468
  ),
2835
3469
  ...props,
2836
- children: (values) => /* @__PURE__ */ jsxs23(Fragment12, { children: [
2837
- /* @__PURE__ */ jsx44("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
2838
- /* @__PURE__ */ jsx44(
2839
- "span",
2840
- {
2841
- className: cn("min-w-0 flex-1 truncate", collapsed && "sr-only"),
2842
- children: typeof children === "function" ? children(values) : content
2843
- }
2844
- ),
2845
- badge && !collapsed && /* @__PURE__ */ jsx44("span", { className: "text-xs text-muted-foreground", children: badge })
3470
+ children: (values) => /* @__PURE__ */ jsxs22(Fragment9, { children: [
3471
+ /* @__PURE__ */ jsx43("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
3472
+ /* @__PURE__ */ jsx43("span", { className: cn("min-w-0 flex-1 truncate", collapsed && "sr-only"), children: typeof children === "function" ? children(values) : content }),
3473
+ badge && !collapsed && /* @__PURE__ */ jsx43("span", { className: "text-muted-foreground text-xs", children: badge })
2846
3474
  ] })
2847
3475
  }
2848
3476
  );
2849
3477
  }
2850
- function SidebarSeparator({
2851
- className,
2852
- ...props
2853
- }) {
2854
- return /* @__PURE__ */ jsx44(
3478
+ function SidebarSeparator({ className, ...props }) {
3479
+ return /* @__PURE__ */ jsx43(
2855
3480
  "hr",
2856
3481
  {
2857
3482
  "data-slot": "sidebar-separator",
@@ -2862,7 +3487,7 @@ function SidebarSeparator({
2862
3487
  }
2863
3488
  function SidebarTrigger({ className, ...props }) {
2864
3489
  const { collapsed, toggle } = useSidebar();
2865
- return /* @__PURE__ */ jsx44(
3490
+ return /* @__PURE__ */ jsx43(
2866
3491
  Button,
2867
3492
  {
2868
3493
  "aria-label": collapsed ? "Expandir navegaci\xF3n" : "Colapsar navegaci\xF3n",
@@ -2871,16 +3496,13 @@ function SidebarTrigger({ className, ...props }) {
2871
3496
  variant: "ghost",
2872
3497
  className: cn("ml-auto", className),
2873
3498
  ...props,
2874
- children: collapsed ? /* @__PURE__ */ jsx44(ChevronRight2, {}) : /* @__PURE__ */ jsx44(ChevronLeft2, {})
3499
+ children: collapsed ? /* @__PURE__ */ jsx43(ChevronRight2, {}) : /* @__PURE__ */ jsx43(ChevronLeft2, {})
2875
3500
  }
2876
3501
  );
2877
3502
  }
2878
- function SidebarRail({
2879
- className,
2880
- ...props
2881
- }) {
3503
+ function SidebarRail({ className, ...props }) {
2882
3504
  const { toggle } = useSidebar();
2883
- return /* @__PURE__ */ jsx44(
3505
+ return /* @__PURE__ */ jsx43(
2884
3506
  "button",
2885
3507
  {
2886
3508
  type: "button",
@@ -2895,7 +3517,7 @@ function SidebarRail({
2895
3517
  );
2896
3518
  }
2897
3519
  function SidebarMore({ className, ...props }) {
2898
- return /* @__PURE__ */ jsx44(
3520
+ return /* @__PURE__ */ jsx43(
2899
3521
  Button,
2900
3522
  {
2901
3523
  "aria-label": "M\xE1s opciones",
@@ -2903,36 +3525,85 @@ function SidebarMore({ className, ...props }) {
2903
3525
  variant: "ghost",
2904
3526
  className: cn("size-7", className),
2905
3527
  ...props,
2906
- children: /* @__PURE__ */ jsx44(Ellipsis, {})
3528
+ children: /* @__PURE__ */ jsx43(Ellipsis, {})
2907
3529
  }
2908
3530
  );
2909
3531
  }
2910
3532
 
2911
3533
  // src/ui/skeleton/skeleton.tsx
2912
- import { jsx as jsx45 } from "react/jsx-runtime";
3534
+ import { jsx as jsx44 } from "react/jsx-runtime";
2913
3535
  function Skeleton({ className, ...props }) {
2914
- return /* @__PURE__ */ jsx45("div", { "aria-hidden": "true", "data-slot": "skeleton", className: cn("animate-pulse rounded-md bg-muted", className), ...props });
3536
+ return /* @__PURE__ */ jsx44(
3537
+ "div",
3538
+ {
3539
+ "aria-hidden": "true",
3540
+ "data-slot": "skeleton",
3541
+ className: cn("animate-pulse rounded-md bg-muted", className),
3542
+ ...props
3543
+ }
3544
+ );
2915
3545
  }
2916
3546
 
2917
3547
  // src/ui/submit-button/submit-button.tsx
2918
- import { useFormStatus } from "react-dom";
2919
3548
  import { LoaderCircle as LoaderCircle3 } from "lucide-react";
2920
- import { Fragment as Fragment13, jsx as jsx46, jsxs as jsxs24 } from "react/jsx-runtime";
2921
- function SubmitButton({ pendingLabel = "Guardando\u2026", loading = false, children, isDisabled, size = "sm", ...props }) {
3549
+ import { useCallback as useCallback6, useLayoutEffect, useRef as useRef5 } from "react";
3550
+ import { useFormStatus } from "react-dom";
3551
+ import { Fragment as Fragment10, jsx as jsx45, jsxs as jsxs23 } from "react/jsx-runtime";
3552
+ function assignRef(ref, node) {
3553
+ if (typeof ref === "function") {
3554
+ ref(node);
3555
+ } else if (ref) {
3556
+ ref.current = node;
3557
+ }
3558
+ }
3559
+ function SubmitButton({
3560
+ loadingLabel,
3561
+ pendingLabel,
3562
+ loading = false,
3563
+ children,
3564
+ isDisabled,
3565
+ ref: forwardedRef,
3566
+ size = "sm",
3567
+ ...props
3568
+ }) {
2922
3569
  const { pending } = useFormStatus();
2923
3570
  const busy = pending || loading;
2924
- return /* @__PURE__ */ jsx46(Button, { type: "submit", size, isDisabled: busy || isDisabled, "aria-busy": busy || void 0, ...props, children: busy ? /* @__PURE__ */ jsxs24(Fragment13, { children: [
2925
- /* @__PURE__ */ jsx46(LoaderCircle3, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
2926
- pendingLabel
2927
- ] }) : children });
3571
+ const label = loadingLabel ?? pendingLabel ?? "Guardando\u2026";
3572
+ const buttonRef = useRef5(null);
3573
+ const setButtonRef = useCallback6(
3574
+ (node) => {
3575
+ buttonRef.current = node;
3576
+ assignRef(forwardedRef, node);
3577
+ },
3578
+ [forwardedRef]
3579
+ );
3580
+ useLayoutEffect(() => {
3581
+ const button = buttonRef.current;
3582
+ if (!button) return;
3583
+ if (busy) button.setAttribute("aria-busy", "true");
3584
+ else button.removeAttribute("aria-busy");
3585
+ }, [busy]);
3586
+ return /* @__PURE__ */ jsx45(
3587
+ Button,
3588
+ {
3589
+ ref: setButtonRef,
3590
+ type: "submit",
3591
+ size,
3592
+ isDisabled: busy || isDisabled,
3593
+ "aria-busy": busy || void 0,
3594
+ ...props,
3595
+ children: busy ? /* @__PURE__ */ jsxs23(Fragment10, { children: [
3596
+ /* @__PURE__ */ jsx45(LoaderCircle3, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
3597
+ label
3598
+ ] }) : children
3599
+ }
3600
+ );
2928
3601
  }
2929
3602
 
2930
3603
  // src/ui/switch/switch.tsx
2931
- import { useEffect as useEffect5, useRef as useRef5 } from "react";
2932
- import {
2933
- Switch as AriaSwitch
2934
- } from "react-aria-components";
2935
- import { Fragment as Fragment14, jsx as jsx47, jsxs as jsxs25 } from "react/jsx-runtime";
3604
+ import { useEffect as useEffect5, useRef as useRef6 } from "react";
3605
+ import { Switch as AriaSwitch } from "react-aria-components";
3606
+ import { Fragment as Fragment11, jsx as jsx46, jsxs as jsxs24 } from "react/jsx-runtime";
2936
3607
  var switchSizes = {
2937
3608
  sm: {
2938
3609
  control: "h-4 w-[1.875rem] p-0.5",
@@ -2972,13 +3643,14 @@ function Switch({
2972
3643
  ...props
2973
3644
  }) {
2974
3645
  const styles = switchSizes[size];
2975
- const fallbackInputRef = useRef5(null);
3646
+ const fallbackInputRef = useRef6(null);
2976
3647
  const resolvedInputRef = inputRef ?? fallbackInputRef;
2977
3648
  useEffect5(() => {
2978
3649
  const input = resolvedInputRef.current;
2979
3650
  if (!input) return;
2980
3651
  const handleDirectionalKey = (event) => {
2981
- if (event.target !== input || event.defaultPrevented || isDisabled || isReadOnly || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
3652
+ if (event.target !== input || event.defaultPrevented || isDisabled || isReadOnly || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
3653
+ return;
2982
3654
  const nextSelected = event.key === "ArrowRight" ? true : event.key === "ArrowLeft" ? false : null;
2983
3655
  if (nextSelected === null) return;
2984
3656
  event.preventDefault();
@@ -2988,7 +3660,7 @@ function Switch({
2988
3660
  ownerDocument.addEventListener("keydown", handleDirectionalKey);
2989
3661
  return () => ownerDocument.removeEventListener("keydown", handleDirectionalKey);
2990
3662
  }, [isDisabled, isReadOnly, resolvedInputRef]);
2991
- return /* @__PURE__ */ jsx47(
3663
+ return /* @__PURE__ */ jsx46(
2992
3664
  AriaSwitch,
2993
3665
  {
2994
3666
  "data-slot": "switch",
@@ -3003,10 +3675,10 @@ function Switch({
3003
3675
  ),
3004
3676
  ...props,
3005
3677
  children: (state) => {
3006
- const isThumbActive = state.isHovered || state.isPressed;
3007
- const thumbOffset = state.isSelected ? isThumbActive ? styles.activeSelectedOffset : styles.selectedOffset : "0";
3008
- return /* @__PURE__ */ jsxs25(Fragment14, { children: [
3009
- /* @__PURE__ */ jsx47(
3678
+ const isThumbPressed = state.isPressed;
3679
+ const thumbOffset = state.isSelected ? isThumbPressed ? styles.activeSelectedOffset : styles.selectedOffset : "0";
3680
+ return /* @__PURE__ */ jsxs24(Fragment11, { children: [
3681
+ /* @__PURE__ */ jsx46(
3010
3682
  "span",
3011
3683
  {
3012
3684
  "aria-hidden": "true",
@@ -3020,13 +3692,13 @@ function Switch({
3020
3692
  "group-data-focus-visible/switch:ring-3 group-data-focus-visible/switch:ring-ring/50",
3021
3693
  styles.control
3022
3694
  ),
3023
- children: /* @__PURE__ */ jsx47(
3695
+ children: /* @__PURE__ */ jsx46(
3024
3696
  "span",
3025
3697
  {
3026
3698
  "data-slot": "switch-thumb",
3027
3699
  style: {
3028
3700
  transform: `translate3d(${thumbOffset}, 0, 0)`,
3029
- width: isThumbActive ? styles.activeWidth : styles.idleWidth
3701
+ width: isThumbPressed ? styles.activeWidth : styles.idleWidth
3030
3702
  },
3031
3703
  className: cn(
3032
3704
  "grid shrink-0 place-items-center rounded-full border border-border/60 bg-background text-[0.625rem] text-muted-foreground shadow-sm",
@@ -3040,9 +3712,16 @@ function Switch({
3040
3712
  )
3041
3713
  }
3042
3714
  ),
3043
- children || description ? /* @__PURE__ */ jsxs25("span", { className: "grid gap-0.5 leading-tight", children: [
3044
- children ? /* @__PURE__ */ jsx47("span", { "data-slot": "switch-label", className: "font-medium", children: typeof children === "function" ? children(state) : children }) : null,
3045
- description ? /* @__PURE__ */ jsx47("span", { "data-slot": "switch-description", className: "text-xs font-normal text-muted-foreground", children: description }) : null
3715
+ children || description ? /* @__PURE__ */ jsxs24("span", { className: "grid gap-0.5 leading-tight", children: [
3716
+ children ? /* @__PURE__ */ jsx46("span", { "data-slot": "switch-label", className: "font-medium", children: typeof children === "function" ? children(state) : children }) : null,
3717
+ description ? /* @__PURE__ */ jsx46(
3718
+ "span",
3719
+ {
3720
+ "data-slot": "switch-description",
3721
+ className: "text-muted-foreground text-xs font-normal",
3722
+ children: description
3723
+ }
3724
+ ) : null
3046
3725
  ] }) : null
3047
3726
  ] });
3048
3727
  }
@@ -3051,9 +3730,9 @@ function Switch({
3051
3730
  }
3052
3731
 
3053
3732
  // src/ui/table/table.tsx
3054
- import { jsx as jsx48 } from "react/jsx-runtime";
3733
+ import { jsx as jsx47 } from "react/jsx-runtime";
3055
3734
  function Table({ className, ...props }) {
3056
- return /* @__PURE__ */ jsx48("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx48(
3735
+ return /* @__PURE__ */ jsx47("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx47(
3057
3736
  "table",
3058
3737
  {
3059
3738
  "data-slot": "table",
@@ -3063,10 +3742,10 @@ function Table({ className, ...props }) {
3063
3742
  ) });
3064
3743
  }
3065
3744
  function TableHeader({ className, ...props }) {
3066
- return /* @__PURE__ */ jsx48("thead", { "data-slot": "table-header", className: cn("[&_tr]:border-b", className), ...props });
3745
+ return /* @__PURE__ */ jsx47("thead", { "data-slot": "table-header", className: cn("[&_tr]:border-b", className), ...props });
3067
3746
  }
3068
3747
  function TableBody({ className, ...props }) {
3069
- return /* @__PURE__ */ jsx48(
3748
+ return /* @__PURE__ */ jsx47(
3070
3749
  "tbody",
3071
3750
  {
3072
3751
  "data-slot": "table-body",
@@ -3076,7 +3755,7 @@ function TableBody({ className, ...props }) {
3076
3755
  );
3077
3756
  }
3078
3757
  function TableRow({ className, ...props }) {
3079
- return /* @__PURE__ */ jsx48(
3758
+ return /* @__PURE__ */ jsx47(
3080
3759
  "tr",
3081
3760
  {
3082
3761
  "data-slot": "table-row",
@@ -3089,7 +3768,7 @@ function TableRow({ className, ...props }) {
3089
3768
  );
3090
3769
  }
3091
3770
  function TableHead({ className, ...props }) {
3092
- return /* @__PURE__ */ jsx48(
3771
+ return /* @__PURE__ */ jsx47(
3093
3772
  "th",
3094
3773
  {
3095
3774
  "data-slot": "table-head",
@@ -3102,7 +3781,7 @@ function TableHead({ className, ...props }) {
3102
3781
  );
3103
3782
  }
3104
3783
  function TableCell({ className, ...props }) {
3105
- return /* @__PURE__ */ jsx48(
3784
+ return /* @__PURE__ */ jsx47(
3106
3785
  "td",
3107
3786
  {
3108
3787
  "data-slot": "table-cell",
@@ -3112,7 +3791,7 @@ function TableCell({ className, ...props }) {
3112
3791
  );
3113
3792
  }
3114
3793
  function TableCaption({ className, ...props }) {
3115
- return /* @__PURE__ */ jsx48(
3794
+ return /* @__PURE__ */ jsx47(
3116
3795
  "caption",
3117
3796
  {
3118
3797
  "data-slot": "table-caption",
@@ -3122,11 +3801,14 @@ function TableCaption({ className, ...props }) {
3122
3801
  );
3123
3802
  }
3124
3803
  function TableFooter({ className, ...props }) {
3125
- return /* @__PURE__ */ jsx48(
3804
+ return /* @__PURE__ */ jsx47(
3126
3805
  "tfoot",
3127
3806
  {
3128
3807
  "data-slot": "table-footer",
3129
- className: cn("border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0", className),
3808
+ className: cn(
3809
+ "border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0",
3810
+ className
3811
+ ),
3130
3812
  ...props
3131
3813
  }
3132
3814
  );
@@ -3141,27 +3823,72 @@ import {
3141
3823
  Tabs as AriaTabs,
3142
3824
  composeRenderProps as composeRenderProps2
3143
3825
  } from "react-aria-components";
3144
- import { jsx as jsx49 } from "react/jsx-runtime";
3826
+ import { jsx as jsx48 } from "react/jsx-runtime";
3145
3827
  function Tabs({ className, ...props }) {
3146
- return /* @__PURE__ */ jsx49(AriaTabs, { "data-slot": "tabs", className: composeRenderProps2(className, (value) => cn("flex flex-col gap-2", value)), ...props });
3828
+ return /* @__PURE__ */ jsx48(
3829
+ AriaTabs,
3830
+ {
3831
+ "data-slot": "tabs",
3832
+ className: composeRenderProps2(className, (value) => cn("flex flex-col gap-2", value)),
3833
+ ...props
3834
+ }
3835
+ );
3147
3836
  }
3148
3837
  function TabsList({ className, ...props }) {
3149
- return /* @__PURE__ */ jsx49(AriaTabList, { "data-slot": "tabs-list", className: composeRenderProps2(className, (value) => cn("inline-flex w-fit items-center gap-1 rounded-lg bg-muted p-1 text-muted-foreground", value)), ...props });
3838
+ return /* @__PURE__ */ jsx48(
3839
+ AriaTabList,
3840
+ {
3841
+ "data-slot": "tabs-list",
3842
+ className: composeRenderProps2(
3843
+ className,
3844
+ (value) => cn(
3845
+ "inline-flex w-fit items-center gap-1 rounded-lg bg-muted p-1 text-muted-foreground",
3846
+ value
3847
+ )
3848
+ ),
3849
+ ...props
3850
+ }
3851
+ );
3150
3852
  }
3151
3853
  function TabsTrigger({ className, ...props }) {
3152
- return /* @__PURE__ */ jsx49(AriaTab, { "data-slot": "tabs-trigger", className: composeRenderProps2(className, (value) => cn("inline-flex h-7 items-center justify-center gap-1.5 rounded-md px-2.5 text-sm font-medium outline-none transition-colors data-hovered:text-foreground data-selected:bg-background data-selected:text-foreground data-selected:shadow-sm data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-disabled:cursor-not-allowed data-disabled:opacity-50", value)), ...props });
3854
+ return /* @__PURE__ */ jsx48(
3855
+ AriaTab,
3856
+ {
3857
+ "data-slot": "tabs-trigger",
3858
+ className: composeRenderProps2(
3859
+ className,
3860
+ (value) => cn(
3861
+ "inline-flex h-7 items-center justify-center gap-1.5 rounded-md px-2.5 text-sm font-medium outline-none transition-colors data-hovered:text-foreground data-selected:bg-background data-selected:text-foreground data-selected:shadow-sm data-focus-visible:ring-3 data-focus-visible:ring-ring/50 data-disabled:cursor-not-allowed data-disabled:opacity-50",
3862
+ value
3863
+ )
3864
+ ),
3865
+ ...props
3866
+ }
3867
+ );
3153
3868
  }
3154
3869
  function TabsPanels({ className, ...props }) {
3155
- return /* @__PURE__ */ jsx49(AriaTabPanels, { "data-slot": "tabs-panels", className: cn("min-w-0", className), ...props });
3870
+ return /* @__PURE__ */ jsx48(AriaTabPanels, { "data-slot": "tabs-panels", className: cn("min-w-0", className), ...props });
3156
3871
  }
3157
3872
  function TabsContent({ className, ...props }) {
3158
- return /* @__PURE__ */ jsx49(AriaTabPanel, { "data-slot": "tabs-content", className: composeRenderProps2(className, (value) => cn("text-sm outline-none data-focus-visible:ring-3 data-focus-visible:ring-ring/50", value)), ...props });
3873
+ return /* @__PURE__ */ jsx48(
3874
+ AriaTabPanel,
3875
+ {
3876
+ "data-slot": "tabs-content",
3877
+ className: composeRenderProps2(
3878
+ className,
3879
+ (value) => cn("text-sm outline-none data-focus-visible:ring-3 data-focus-visible:ring-ring/50", value)
3880
+ ),
3881
+ ...props
3882
+ }
3883
+ );
3159
3884
  }
3160
3885
 
3161
3886
  // src/ui/toast/toast.tsx
3162
3887
  import { useEffect as useEffect6 } from "react";
3163
- import { sileo, Toaster as SileoToaster } from "sileo";
3164
- import { Fragment as Fragment15, jsx as jsx50, jsxs as jsxs26 } from "react/jsx-runtime";
3888
+ import { sileo as sileo2, Toaster as SileoToaster } from "sileo";
3889
+
3890
+ // src/ui/toast/toast-store.ts
3891
+ import { sileo } from "sileo";
3165
3892
  function toSileoOptions({ title, description, duration, position, action }) {
3166
3893
  return {
3167
3894
  title,
@@ -3190,8 +3917,14 @@ var toast = Object.assign((options) => create(options), {
3190
3917
  const shared = { description: options.description, position: options.position };
3191
3918
  return sileo.promise(promise, {
3192
3919
  loading: { ...shared, title: options.loading },
3193
- success: (value) => ({ ...shared, title: typeof options.success === "function" ? options.success(value) : options.success }),
3194
- error: (error) => ({ ...shared, title: typeof options.error === "function" ? options.error(error) : options.error }),
3920
+ success: (value) => ({
3921
+ ...shared,
3922
+ title: typeof options.success === "function" ? options.success(value) : options.success
3923
+ }),
3924
+ error: (error) => ({
3925
+ ...shared,
3926
+ title: typeof options.error === "function" ? options.error(error) : options.error
3927
+ }),
3195
3928
  position: options.position
3196
3929
  });
3197
3930
  }
@@ -3199,26 +3932,43 @@ var toast = Object.assign((options) => create(options), {
3199
3932
  function useToast() {
3200
3933
  return toast;
3201
3934
  }
3935
+
3936
+ // src/ui/toast/toast.tsx
3937
+ import { Fragment as Fragment12, jsx as jsx49, jsxs as jsxs25 } from "react/jsx-runtime";
3202
3938
  function ToastProvider({ children }) {
3203
- return /* @__PURE__ */ jsxs26(Fragment15, { children: [
3939
+ return /* @__PURE__ */ jsxs25(Fragment12, { children: [
3204
3940
  children,
3205
- /* @__PURE__ */ jsx50(Toaster, {})
3941
+ /* @__PURE__ */ jsx49(Toaster, {})
3206
3942
  ] });
3207
3943
  }
3208
3944
  function Toaster({ position }) {
3209
- return /* @__PURE__ */ jsx50(SileoToaster, { position, options: { fill: "var(--ui-secondary)" } });
3945
+ return /* @__PURE__ */ jsx49(SileoToaster, { position, options: { fill: "var(--ui-secondary)" } });
3210
3946
  }
3211
- function ToastViewport({ position, visiblePosition, className }) {
3947
+ function ToastViewport({
3948
+ position,
3949
+ visiblePosition,
3950
+ className
3951
+ }) {
3212
3952
  void className;
3213
3953
  if (visiblePosition && visiblePosition !== position) return null;
3214
- return /* @__PURE__ */ jsx50(Toaster, { position });
3954
+ return /* @__PURE__ */ jsx49(Toaster, { position });
3215
3955
  }
3216
- function Toast({ id, title, description, variant = "default", action, state = "open", duration = 0, position, onDismiss }) {
3956
+ function Toast({
3957
+ id,
3958
+ title,
3959
+ description,
3960
+ variant = "default",
3961
+ action,
3962
+ state,
3963
+ duration = 0,
3964
+ position,
3965
+ onDismiss
3966
+ }) {
3217
3967
  useEffect6(() => {
3218
3968
  if (state !== "open") return;
3219
- const toastId = create({ title, description, variant, action, duration, position });
3969
+ const toastId = toast({ title, description, variant, action, duration, position });
3220
3970
  return () => {
3221
- sileo.dismiss(toastId);
3971
+ sileo2.dismiss(toastId);
3222
3972
  onDismiss?.();
3223
3973
  };
3224
3974
  }, [action, description, duration, id, onDismiss, position, state, title, variant]);
@@ -3226,15 +3976,30 @@ function Toast({ id, title, description, variant = "default", action, state = "o
3226
3976
  }
3227
3977
 
3228
3978
  // src/ui/toolbar/toolbar.tsx
3229
- import { jsx as jsx51 } from "react/jsx-runtime";
3979
+ import { jsx as jsx50 } from "react/jsx-runtime";
3230
3980
  function Toolbar({ className, ...props }) {
3231
- return /* @__PURE__ */ jsx51("div", { role: "toolbar", "data-slot": "toolbar", className: cn("flex flex-wrap items-center gap-2", className), ...props });
3981
+ return /* @__PURE__ */ jsx50(
3982
+ "div",
3983
+ {
3984
+ role: "toolbar",
3985
+ "data-slot": "toolbar",
3986
+ className: cn("flex flex-wrap items-center gap-2", className),
3987
+ ...props
3988
+ }
3989
+ );
3232
3990
  }
3233
3991
  function ToolbarGroup({ className, ...props }) {
3234
- return /* @__PURE__ */ jsx51("div", { "data-slot": "toolbar-group", className: cn("flex items-center gap-2", className), ...props });
3992
+ return /* @__PURE__ */ jsx50(
3993
+ "div",
3994
+ {
3995
+ "data-slot": "toolbar-group",
3996
+ className: cn("flex items-center gap-2", className),
3997
+ ...props
3998
+ }
3999
+ );
3235
4000
  }
3236
4001
  function ToolbarSpacer({ className, ...props }) {
3237
- return /* @__PURE__ */ jsx51("div", { "aria-hidden": "true", className: cn("hidden flex-1 sm:block", className), ...props });
4002
+ return /* @__PURE__ */ jsx50("div", { "aria-hidden": "true", className: cn("hidden flex-1 sm:block", className), ...props });
3238
4003
  }
3239
4004
  export {
3240
4005
  Accordion,
@@ -3312,15 +4077,20 @@ export {
3312
4077
  DialogHeader,
3313
4078
  DialogOverlay,
3314
4079
  DialogPortal,
4080
+ DialogRoot,
3315
4081
  DialogTitle,
3316
4082
  DialogTrigger,
3317
4083
  DocPreview,
3318
4084
  Drawer,
4085
+ DrawerClose,
4086
+ DrawerContent,
3319
4087
  DrawerDescription,
3320
4088
  DrawerFooter,
3321
4089
  DrawerHeader,
3322
4090
  DrawerTitle,
4091
+ DrawerTrigger,
3323
4092
  DropdownMenu,
4093
+ DropdownMenuContent,
3324
4094
  DropdownMenuGroup,
3325
4095
  DropdownMenuItem,
3326
4096
  DropdownMenuLabel,
@@ -3357,6 +4127,12 @@ export {
3357
4127
  InputGroupInput,
3358
4128
  InputGroupText,
3359
4129
  InputGroupTextarea,
4130
+ KanbanColumn,
4131
+ KanbanColumnBody,
4132
+ KanbanColumnHeader,
4133
+ KanbanColumnTitle,
4134
+ KanbanEmpty,
4135
+ KanbanViewport,
3360
4136
  Kbd,
3361
4137
  KbdGroup,
3362
4138
  Label2 as Label,
@@ -3367,7 +4143,6 @@ export {
3367
4143
  MenuItem,
3368
4144
  MenuTrigger,
3369
4145
  MetricCard,
3370
- ModalDialog,
3371
4146
  OtpInput2 as OtpInput,
3372
4147
  PageHeader,
3373
4148
  PageHeaderActions,
@@ -3396,6 +4171,7 @@ export {
3396
4171
  SheetTrigger,
3397
4172
  Sidebar,
3398
4173
  SidebarContent,
4174
+ SidebarContext,
3399
4175
  SidebarFooter,
3400
4176
  SidebarGroup,
3401
4177
  SidebarHeader,
@@ -3431,6 +4207,7 @@ export {
3431
4207
  ToolbarGroup,
3432
4208
  ToolbarSpacer,
3433
4209
  Tooltip,
4210
+ TooltipContent,
3434
4211
  TooltipTrigger,
3435
4212
  actionRipple,
3436
4213
  alertVariants,