@doscientos/ui 0.1.28 → 0.1.29

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,164 +387,406 @@ 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
  }
390
- function AlertDialog({ children, open, onOpenChange }) {
391
- return /* @__PURE__ */ jsx3(AlertDialogContext.Provider, { value: { open, setOpen: onOpenChange }, children });
392
- }
393
- function AlertDialogPortal({ children }) {
394
- return /* @__PURE__ */ jsx3(Fragment2, { children });
395
- }
396
- function AlertDialogTrigger({ children, ...props }) {
397
- const { setOpen } = useAlertDialogContext();
398
- return /* @__PURE__ */ jsx3(Button, { "data-slot": "alert-dialog-trigger", onPress: () => setOpen(true), ...props, children });
399
- }
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 });
404
- }
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 }) }) }) });
409
- }
410
- 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 });
412
- }
413
- 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 });
415
- }
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 });
418
- }
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 });
421
- }
422
- function AlertDialogAction({ className, ...props }) {
423
- return /* @__PURE__ */ jsx3(Button, { "data-slot": "alert-dialog-action", className: cn(className), ...props });
424
- }
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 });
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 });
428
423
  }
429
-
430
- // src/ui/alert/alert.tsx
431
- import { cva as cva3 } from "class-variance-authority";
432
- import { jsx as jsx4 } from "react/jsx-runtime";
433
- var alertVariants = cva3(
434
- "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
- {
436
- variants: {
437
- variant: {
438
- default: "bg-card text-card-foreground",
439
- info: "border-info/30 bg-info/5 text-info",
440
- success: "border-success/30 bg-success/5 text-success",
441
- warning: "border-warning/30 bg-warning/5 text-warning",
442
- destructive: "border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
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
443
  }
444
- },
445
- defaultVariants: {
446
- variant: "default"
447
- }
444
+ });
448
445
  }
449
- );
450
- function Alert({ className, variant, ...props }) {
451
- return /* @__PURE__ */ jsx4(
452
- "div",
453
- {
454
- "data-slot": "alert",
455
- role: "alert",
456
- className: cn(alertVariants({ variant }), className),
457
- ...props
458
- }
459
- );
446
+ return /* @__PURE__ */ jsx3(Button, { "data-slot": "dialog-trigger", onPress: () => setOpen(true), ...props, children });
460
447
  }
461
- function AlertTitle({ className, ...props }) {
462
- return /* @__PURE__ */ jsx4(
463
- "div",
464
- {
465
- "data-slot": "alert-title",
466
- className: cn(
467
- "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
468
- className
469
- ),
470
- ...props
471
- }
472
- );
448
+ function DialogPortal({ children }) {
449
+ return /* @__PURE__ */ jsx3(Fragment2, { children });
473
450
  }
474
- function AlertDescription({ className, ...props }) {
475
- return /* @__PURE__ */ jsx4(
476
- "div",
451
+ function DialogOverlay({ children, className, ...props }) {
452
+ const { open, setOpen } = useDialogContext();
453
+ if (!open) return null;
454
+ return /* @__PURE__ */ jsx3(
455
+ ModalOverlay,
477
456
  {
478
- "data-slot": "alert-description",
457
+ "data-slot": "dialog-overlay",
458
+ isDismissable: true,
459
+ isOpen: open,
460
+ onOpenChange: setOpen,
479
461
  className: cn(
480
- "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
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",
481
463
  className
482
464
  ),
483
- ...props
465
+ ...props,
466
+ children
484
467
  }
485
468
  );
486
469
  }
487
- function AlertAction({ className, ...props }) {
488
- return /* @__PURE__ */ jsx4("div", { "data-slot": "alert-action", className: cn("absolute top-2 right-2", className), ...props });
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
+ ] });
489
477
  }
490
-
491
- // src/ui/app-shell/app-shell.tsx
492
- import { jsx as jsx5 } from "react/jsx-runtime";
493
- function AppShell({
478
+ function DialogContent({
479
+ children,
494
480
  className,
495
- sidebarBreakpoint = "md",
481
+ contentSlot = "dialog-content",
482
+ onOverlayClick,
483
+ overlaySlot = "dialog-overlay",
484
+ showCloseButton = true,
496
485
  ...props
497
486
  }) {
498
- return /* @__PURE__ */ jsx5(
499
- "div",
500
- {
501
- "data-slot": "app-shell",
502
- "data-sidebar-breakpoint": sidebarBreakpoint,
503
- className: cn("bg-background text-foreground", className),
504
- ...props
505
- }
506
- );
507
- }
508
- function AppShellSidebar({ className, ...props }) {
509
- return /* @__PURE__ */ jsx5(
510
- "aside",
511
- {
512
- "data-slot": "app-shell-sidebar",
513
- className: cn("w-56 shrink-0 border-r border-border bg-card text-foreground", className),
514
- ...props
515
- }
516
- );
517
- }
518
- function AppShellMain({ className, ...props }) {
519
- return /* @__PURE__ */ jsx5("main", { "data-slot": "app-shell-main", className: cn("bg-background", className), ...props });
520
- }
521
- function AppShellHeader({ className, ...props }) {
522
- return /* @__PURE__ */ jsx5(
523
- "header",
487
+ const { setOpen } = useDialogContext();
488
+ return /* @__PURE__ */ jsx3(DialogPortal, { children: /* @__PURE__ */ jsx3(
489
+ DialogOverlay,
524
490
  {
525
- "data-slot": "app-shell-header",
526
- className: cn("border-b border-border bg-background px-4", className),
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
+ ),
527
604
  ...props
528
605
  }
529
606
  );
530
607
  }
531
- function AppShellMobileHeader({
608
+
609
+ // src/ui/alert-dialog/alert-dialog.tsx
610
+ import { jsx as jsx4 } from "react/jsx-runtime";
611
+ function AlertDialog({ children, open, onOpenChange }) {
612
+ return /* @__PURE__ */ jsx4(Dialog, { open, onOpenChange, children });
613
+ }
614
+ function AlertDialogPortal({ children }) {
615
+ return /* @__PURE__ */ jsx4(DialogPortal, { children });
616
+ }
617
+ function AlertDialogTrigger({
618
+ children,
619
+ ...props
620
+ }) {
621
+ return /* @__PURE__ */ jsx4(DialogTrigger, { "data-slot": "alert-dialog-trigger", ...props, children });
622
+ }
623
+ function AlertDialogOverlay({
532
624
  className,
533
625
  ...props
534
626
  }) {
627
+ return /* @__PURE__ */ jsx4(DialogOverlay, { "data-slot": "alert-dialog-overlay", className, ...props });
628
+ }
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
+ );
645
+ }
646
+ function AlertDialogHeader({ 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
+ );
655
+ }
656
+ function AlertDialogFooter({ className, ...props }) {
657
+ return /* @__PURE__ */ jsx4(DialogFooter, { "data-slot": "alert-dialog-footer", className: cn(className), ...props });
658
+ }
659
+ function AlertDialogTitle({
660
+ className,
661
+ ...props
662
+ }) {
663
+ return /* @__PURE__ */ jsx4(DialogTitle, { "data-slot": "alert-dialog-title", className: cn(className), ...props });
664
+ }
665
+ function AlertDialogDescription({
666
+ className,
667
+ ...props
668
+ }) {
669
+ return /* @__PURE__ */ jsx4(DialogDescription, { "data-slot": "alert-dialog-description", className: cn(className), ...props });
670
+ }
671
+ function AlertDialogAction({ className, ...props }) {
672
+ return /* @__PURE__ */ jsx4(Button, { "data-slot": "alert-dialog-action", className: cn(className), ...props });
673
+ }
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 }) });
680
+ }
681
+
682
+ // src/ui/alert/alert-variants.ts
683
+ import { cva as cva3 } from "class-variance-authority";
684
+ var alertVariants = cva3(
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",
686
+ {
687
+ variants: {
688
+ variant: {
689
+ default: "bg-card text-card-foreground",
690
+ info: "border-info/30 bg-info/5 text-info",
691
+ success: "border-success/30 bg-success/5 text-success",
692
+ warning: "border-warning/30 bg-warning/5 text-warning",
693
+ destructive: "border-destructive/30 bg-destructive/5 text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
694
+ }
695
+ },
696
+ defaultVariants: {
697
+ variant: "default"
698
+ }
699
+ }
700
+ );
701
+
702
+ // src/ui/alert/alert.tsx
703
+ import { jsx as jsx5 } from "react/jsx-runtime";
704
+ function Alert({ className, variant, ...props }) {
535
705
  return /* @__PURE__ */ jsx5(
706
+ "div",
707
+ {
708
+ "data-slot": "alert",
709
+ role: "alert",
710
+ className: cn(alertVariants({ variant }), className),
711
+ ...props
712
+ }
713
+ );
714
+ }
715
+ function AlertTitle({ className, ...props }) {
716
+ return /* @__PURE__ */ jsx5(
717
+ "div",
718
+ {
719
+ "data-slot": "alert-title",
720
+ className: cn(
721
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
722
+ className
723
+ ),
724
+ ...props
725
+ }
726
+ );
727
+ }
728
+ function AlertDescription({ className, ...props }) {
729
+ return /* @__PURE__ */ jsx5(
730
+ "div",
731
+ {
732
+ "data-slot": "alert-description",
733
+ className: cn(
734
+ "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
735
+ className
736
+ ),
737
+ ...props
738
+ }
739
+ );
740
+ }
741
+ function AlertAction({ className, ...props }) {
742
+ return /* @__PURE__ */ jsx5("div", { "data-slot": "alert-action", className: cn("absolute top-2 right-2", className), ...props });
743
+ }
744
+
745
+ // src/ui/app-shell/app-shell.tsx
746
+ import { jsx as jsx6 } from "react/jsx-runtime";
747
+ function AppShell({ className, sidebarBreakpoint = "md", ...props }) {
748
+ return /* @__PURE__ */ jsx6(
749
+ "div",
750
+ {
751
+ "data-slot": "app-shell",
752
+ "data-sidebar-breakpoint": sidebarBreakpoint,
753
+ className: cn("bg-background text-foreground", className),
754
+ ...props
755
+ }
756
+ );
757
+ }
758
+ function AppShellSidebar({ className, ...props }) {
759
+ return /* @__PURE__ */ jsx6(
760
+ "aside",
761
+ {
762
+ "data-slot": "app-shell-sidebar",
763
+ className: cn("w-56 shrink-0 border-r border-border bg-card text-foreground", className),
764
+ ...props
765
+ }
766
+ );
767
+ }
768
+ function AppShellMain({ className, ...props }) {
769
+ return /* @__PURE__ */ jsx6("main", { "data-slot": "app-shell-main", className: cn("bg-background", className), ...props });
770
+ }
771
+ function AppShellHeader({ className, ...props }) {
772
+ return /* @__PURE__ */ jsx6(
773
+ "header",
774
+ {
775
+ "data-slot": "app-shell-header",
776
+ className: cn("border-b border-border bg-background px-4", className),
777
+ ...props
778
+ }
779
+ );
780
+ }
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,56 +1307,152 @@ 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
- type: "button",
937
- "data-slot": "collapsible-trigger",
938
- "data-state": open ? "open" : "closed",
939
- "aria-controls": contentId,
940
- "aria-expanded": open,
941
- onClick: handleClick,
1313
+ type: "button",
1314
+ "data-slot": "collapsible-trigger",
1315
+ "data-state": open ? "open" : "closed",
1316
+ "aria-controls": contentId,
1317
+ "aria-expanded": open,
1318
+ onClick: handleClick,
1319
+ ...props,
1320
+ children
1321
+ }
1322
+ );
1323
+ }
1324
+ function CollapsibleContent({ children, ...props }) {
1325
+ const { contentId, open } = useCollapsibleContext();
1326
+ if (!open) return null;
1327
+ return /* @__PURE__ */ jsx14("div", { id: contentId, "data-slot": "collapsible-content", "data-state": "open", ...props, children });
1328
+ }
1329
+
1330
+ // src/ui/combobox/combobox.tsx
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";
1344
+ var Combobox = AriaComboBox;
1345
+ function ComboboxInput({ 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
+ );
1357
+ }
1358
+ function ComboboxContent({ 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
+ );
1370
+ }
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
+ );
1385
+ }
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
+ ),
942
1399
  ...props,
943
1400
  children
944
1401
  }
945
1402
  );
946
1403
  }
947
- function CollapsibleContent({ children, ...props }) {
948
- const { contentId, open } = useCollapsibleContext();
949
- if (!open) return null;
950
- return /* @__PURE__ */ jsx13("div", { id: contentId, "data-slot": "collapsible-content", "data-state": "open", ...props, children });
951
- }
952
-
953
- // 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";
957
- var Combobox = AriaComboBox;
958
- 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 });
960
- }
961
- 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 });
963
- }
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 });
966
- }
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 });
969
- }
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" });
1360
- }
1361
- function Fallback({ mimeType, reason }) {
1362
- const Icon = mimeType?.startsWith("image/") ? Image : FileText;
1363
- 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." })
1369
- ] });
1370
- }
1371
-
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 }) }) });
1668
+ return /* @__PURE__ */ jsx19(Fallback, { mimeType, reason: "unsupported" });
1378
1669
  }
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 });
1670
+ function Fallback({
1671
+ mimeType,
1672
+ reason
1673
+ }) {
1674
+ const Icon = mimeType?.startsWith("image/") ? Image : FileText;
1675
+ const message = reason === "no-url" ? "No se pudo generar la URL de preview." : "Preview no disponible para este tipo de 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." })
1681
+ ] });
1390
1682
  }
1391
1683
 
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
1681
- import { cva as cva8 } from "class-variance-authority";
1682
-
1683
1980
  // src/ui/label/label.tsx
1684
1981
  import { forwardRef } from "react";
1685
1982
  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
- });
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
2002
+ import { cva as cva8 } from "class-variance-authority";
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 });
2266
+ }
2267
+ function Tooltip({ label, children, delay, ...props }) {
2268
+ return /* @__PURE__ */ jsxs13(TooltipTrigger, { delay, children: [
2269
+ children,
2270
+ /* @__PURE__ */ jsx26(TooltipContent, { ...props, children: label })
2271
+ ] });
1932
2272
  }
1933
- function Tooltip({
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",
@@ -2155,22 +2508,54 @@ function InputGroupTextarea({ className, ...props }) {
2155
2508
  }
2156
2509
 
2157
2510
  // src/ui/kbd/kbd.tsx
2158
- import { jsx as jsx33 } from "react/jsx-runtime";
2511
+ import { jsx as jsx31 } from "react/jsx-runtime";
2159
2512
  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 });
2513
+ return /* @__PURE__ */ jsx31(
2514
+ "kbd",
2515
+ {
2516
+ "data-slot": "kbd",
2517
+ className: cn(
2518
+ "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",
2519
+ className
2520
+ ),
2521
+ ...props
2522
+ }
2523
+ );
2161
2524
  }
2162
2525
  function KbdGroup({ className, ...props }) {
2163
- return /* @__PURE__ */ jsx33("span", { "data-slot": "kbd-group", className: cn("inline-flex items-center gap-1", className), ...props });
2526
+ return /* @__PURE__ */ jsx31(
2527
+ "span",
2528
+ {
2529
+ "data-slot": "kbd-group",
2530
+ className: cn("inline-flex items-center gap-1", className),
2531
+ ...props
2532
+ }
2533
+ );
2164
2534
  }
2165
2535
 
2166
2536
  // src/ui/loading-overlay/loading-overlay.tsx
2167
2537
  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
- ] }) });
2538
+ import { jsx as jsx32, jsxs as jsxs14 } from "react/jsx-runtime";
2539
+ function LoadingOverlay({
2540
+ label = "Cargando",
2541
+ className,
2542
+ ...props
2543
+ }) {
2544
+ return /* @__PURE__ */ jsx32(
2545
+ "output",
2546
+ {
2547
+ "aria-live": "polite",
2548
+ className: cn(
2549
+ "absolute inset-0 z-10 flex items-center justify-center bg-background/70 backdrop-blur-[2px]",
2550
+ className
2551
+ ),
2552
+ ...props,
2553
+ 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: [
2554
+ /* @__PURE__ */ jsx32(LoaderCircle2, { className: "animate-spin", "aria-hidden": "true" }),
2555
+ /* @__PURE__ */ jsx32("span", { children: label })
2556
+ ] })
2557
+ }
2558
+ );
2174
2559
  }
2175
2560
 
2176
2561
  // src/ui/menu/menu.tsx
@@ -2180,20 +2565,41 @@ import {
2180
2565
  MenuTrigger as AriaMenuTrigger,
2181
2566
  Popover as Popover3
2182
2567
  } from "react-aria-components";
2183
- import { jsx as jsx35 } from "react/jsx-runtime";
2568
+ import { jsx as jsx33 } from "react/jsx-runtime";
2184
2569
  var MenuTrigger = AriaMenuTrigger;
2185
2570
  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 });
2571
+ return /* @__PURE__ */ jsx33(
2572
+ Popover3,
2573
+ {
2574
+ "data-slot": "menu-content",
2575
+ className: cn(
2576
+ "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",
2577
+ className
2578
+ ),
2579
+ ...props
2580
+ }
2581
+ );
2187
2582
  }
2188
2583
  function Menu({ className, ...props }) {
2189
- return /* @__PURE__ */ jsx35(AriaMenu, { "data-slot": "menu", className: cn("outline-none", className), ...props });
2584
+ return /* @__PURE__ */ jsx33(AriaMenu, { "data-slot": "menu", className: cn("outline-none", className), ...props });
2190
2585
  }
2191
2586
  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 });
2587
+ return /* @__PURE__ */ jsx33(
2588
+ AriaMenuItem,
2589
+ {
2590
+ "data-slot": "menu-item",
2591
+ className: cn(
2592
+ "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",
2593
+ className
2594
+ ),
2595
+ ...props,
2596
+ children
2597
+ }
2598
+ );
2193
2599
  }
2194
2600
 
2195
2601
  // src/ui/metric-card/metric-card.tsx
2196
- import { jsx as jsx36, jsxs as jsxs17 } from "react/jsx-runtime";
2602
+ import { jsx as jsx34, jsxs as jsxs15 } from "react/jsx-runtime";
2197
2603
  function MetricCard({
2198
2604
  className,
2199
2605
  label,
@@ -2203,12 +2609,19 @@ function MetricCard({
2203
2609
  tone = "default",
2204
2610
  ...props
2205
2611
  }) {
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
2612
+ return /* @__PURE__ */ jsx34(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: [
2613
+ icon ? /* @__PURE__ */ jsx34("div", { "data-slot": "metric-card-icon", className: "text-muted-foreground shrink-0", children: icon }) : null,
2614
+ /* @__PURE__ */ jsxs15("div", { className: "min-w-0", children: [
2615
+ /* @__PURE__ */ jsx34("p", { "data-slot": "metric-card-label", className: "text-muted-foreground text-sm", children: label }),
2616
+ /* @__PURE__ */ jsx34(
2617
+ "strong",
2618
+ {
2619
+ "data-slot": "metric-card-value",
2620
+ className: "mt-1 block text-2xl font-semibold tracking-tight",
2621
+ children: value
2622
+ }
2623
+ ),
2624
+ description ? /* @__PURE__ */ jsx34("p", { "data-slot": "metric-card-description", className: "text-muted-foreground mt-1 text-xs", children: description }) : null
2212
2625
  ] })
2213
2626
  ] }) });
2214
2627
  }
@@ -2221,7 +2634,7 @@ import {
2221
2634
  useState as useState10
2222
2635
  } from "react";
2223
2636
  import { Input as AriaInput3 } from "react-aria-components";
2224
- import { jsx as jsx37, jsxs as jsxs18 } from "react/jsx-runtime";
2637
+ import { jsx as jsx35, jsxs as jsxs16 } from "react/jsx-runtime";
2225
2638
  function normalizeOtp(value, length) {
2226
2639
  return value.replace(/[^0-9]/g, "").slice(0, length);
2227
2640
  }
@@ -2273,7 +2686,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2273
2686
  input.setSelectionRange(position, position);
2274
2687
  setSelectionStart(position);
2275
2688
  }
2276
- return /* @__PURE__ */ jsxs18(
2689
+ return /* @__PURE__ */ jsxs16(
2277
2690
  "div",
2278
2691
  {
2279
2692
  "data-slot": "otp-input",
@@ -2283,7 +2696,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2283
2696
  style: { gridTemplateColumns: `repeat(${slotCount}, minmax(0, 2.5rem))` },
2284
2697
  onPointerDown: handlePointerDown,
2285
2698
  children: [
2286
- /* @__PURE__ */ jsx37(
2699
+ /* @__PURE__ */ jsx35(
2287
2700
  AriaInput3,
2288
2701
  {
2289
2702
  ...props,
@@ -2323,7 +2736,7 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2323
2736
  }
2324
2737
  }
2325
2738
  ),
2326
- slots.map((slot, index) => /* @__PURE__ */ jsx37(
2739
+ slots.map((slot, index) => /* @__PURE__ */ jsx35(
2327
2740
  "span",
2328
2741
  {
2329
2742
  "aria-hidden": "true",
@@ -2346,27 +2759,59 @@ var OtpInputImpl = forwardRef4(function OtpInput({
2346
2759
  var OtpInput2 = OtpInputImpl;
2347
2760
 
2348
2761
  // src/ui/page-header/page-header.tsx
2349
- import { jsx as jsx38 } from "react/jsx-runtime";
2762
+ import { jsx as jsx36 } from "react/jsx-runtime";
2350
2763
  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 });
2764
+ return /* @__PURE__ */ jsx36(
2765
+ "header",
2766
+ {
2767
+ "data-slot": "page-header",
2768
+ className: cn(
2769
+ "flex flex-col gap-4 py-2 sm:flex-row sm:items-center sm:justify-between",
2770
+ className
2771
+ ),
2772
+ ...props
2773
+ }
2774
+ );
2352
2775
  }
2353
2776
  function PageHeaderHeading({ className, ...props }) {
2354
- return /* @__PURE__ */ jsx38("div", { "data-slot": "page-header-heading", className: cn("min-w-0", className), ...props });
2777
+ return /* @__PURE__ */ jsx36("div", { "data-slot": "page-header-heading", className: cn("min-w-0", className), ...props });
2355
2778
  }
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 });
2779
+ function PageHeaderTitle({ className, children, ...props }) {
2780
+ return /* @__PURE__ */ jsx36(
2781
+ "h1",
2782
+ {
2783
+ "data-slot": "page-header-title",
2784
+ className: cn("truncate text-xl font-semibold tracking-tight md:text-2xl", className),
2785
+ ...props,
2786
+ children
2787
+ }
2788
+ );
2358
2789
  }
2359
2790
  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 });
2791
+ return /* @__PURE__ */ jsx36(
2792
+ "p",
2793
+ {
2794
+ "data-slot": "page-header-description",
2795
+ className: cn("mt-1 text-sm text-muted-foreground", className),
2796
+ ...props
2797
+ }
2798
+ );
2361
2799
  }
2362
2800
  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 });
2801
+ return /* @__PURE__ */ jsx36(
2802
+ "div",
2803
+ {
2804
+ "data-slot": "page-header-actions",
2805
+ className: cn("flex shrink-0 items-center gap-2", className),
2806
+ ...props
2807
+ }
2808
+ );
2364
2809
  }
2365
2810
 
2366
2811
  // src/ui/pagination/pagination.tsx
2367
2812
  import { ChevronLeft, ChevronRight } from "lucide-react";
2368
- import * as React7 from "react";
2369
- import { jsx as jsx39, jsxs as jsxs19 } from "react/jsx-runtime";
2813
+ import * as React6 from "react";
2814
+ import { jsx as jsx37, jsxs as jsxs17 } from "react/jsx-runtime";
2370
2815
  function visiblePages(page, pageCount, siblingCount) {
2371
2816
  return [
2372
2817
  .../* @__PURE__ */ new Set([
@@ -2387,15 +2832,15 @@ function Pagination({
2387
2832
  }) {
2388
2833
  if (pageCount <= 1) return null;
2389
2834
  const pages = visiblePages(page, pageCount, siblingCount);
2390
- return /* @__PURE__ */ jsxs19(
2835
+ return /* @__PURE__ */ jsxs17(
2391
2836
  "nav",
2392
2837
  {
2393
2838
  "aria-label": ariaLabel,
2394
2839
  className: cn("flex flex-wrap items-center justify-between gap-4", className),
2395
2840
  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(
2841
+ /* @__PURE__ */ jsx37("p", { className: "text-muted-foreground text-sm", children: summary ?? `P\xE1gina ${page} de ${pageCount}` }),
2842
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-1", children: [
2843
+ /* @__PURE__ */ jsx37(
2399
2844
  Button,
2400
2845
  {
2401
2846
  "aria-label": "P\xE1gina anterior",
@@ -2403,14 +2848,14 @@ function Pagination({
2403
2848
  onPress: () => onPageChange(page - 1),
2404
2849
  size: "icon",
2405
2850
  variant: "ghost",
2406
- children: /* @__PURE__ */ jsx39(ChevronLeft, {})
2851
+ children: /* @__PURE__ */ jsx37(ChevronLeft, {})
2407
2852
  }
2408
2853
  ),
2409
2854
  pages.map((item, index) => {
2410
2855
  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(
2856
+ return /* @__PURE__ */ jsxs17(React6.Fragment, { children: [
2857
+ previousPage !== void 0 && item > previousPage + 1 ? /* @__PURE__ */ jsx37("span", { "aria-hidden": "true", className: "text-muted-foreground px-1", children: "\u2026" }) : null,
2858
+ /* @__PURE__ */ jsx37(
2414
2859
  Button,
2415
2860
  {
2416
2861
  "aria-current": item === page ? "page" : void 0,
@@ -2423,7 +2868,7 @@ function Pagination({
2423
2868
  )
2424
2869
  ] }, item);
2425
2870
  }),
2426
- /* @__PURE__ */ jsx39(
2871
+ /* @__PURE__ */ jsx37(
2427
2872
  Button,
2428
2873
  {
2429
2874
  "aria-label": "P\xE1gina siguiente",
@@ -2431,7 +2876,7 @@ function Pagination({
2431
2876
  onPress: () => onPageChange(page + 1),
2432
2877
  size: "icon",
2433
2878
  variant: "ghost",
2434
- children: /* @__PURE__ */ jsx39(ChevronRight, {})
2879
+ children: /* @__PURE__ */ jsx37(ChevronRight, {})
2435
2880
  }
2436
2881
  )
2437
2882
  ] })
@@ -2445,12 +2890,31 @@ import {
2445
2890
  DialogTrigger as AriaDialogTrigger,
2446
2891
  Popover as AriaPopover
2447
2892
  } from "react-aria-components";
2448
- import { jsx as jsx40 } from "react/jsx-runtime";
2893
+ import { jsx as jsx38, jsxs as jsxs18 } from "react/jsx-runtime";
2449
2894
  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 });
2895
+ function PopoverContent({ className, ...props }) {
2896
+ return /* @__PURE__ */ jsx38(
2897
+ AriaPopover,
2898
+ {
2899
+ "data-slot": "popover",
2900
+ offset: 6,
2901
+ className: cn(
2902
+ "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",
2903
+ className
2904
+ ),
2905
+ ...props
2906
+ }
2907
+ );
2908
+ }
2909
+ function Popover4(props) {
2910
+ if (!("trigger" in props)) return /* @__PURE__ */ jsx38(PopoverContent, { ...props });
2911
+ const { children, trigger, triggerProps, defaultOpen, isOpen, onOpenChange, ...contentProps } = props;
2912
+ const triggerElement = typeof trigger === "string" ? /* @__PURE__ */ jsx38(Button, { ...triggerProps, children: trigger }) : trigger;
2913
+ return /* @__PURE__ */ jsxs18(PopoverTrigger, { defaultOpen, isOpen, onOpenChange, children: [
2914
+ triggerElement,
2915
+ /* @__PURE__ */ jsx38(PopoverContent, { ...contentProps, children })
2916
+ ] });
2452
2917
  }
2453
- var PopoverContent = Popover4;
2454
2918
 
2455
2919
  // src/ui/quantity-input/quantity-input.tsx
2456
2920
  import { Minus, Plus } from "lucide-react";
@@ -2460,7 +2924,7 @@ import {
2460
2924
  Input as AriaInput4,
2461
2925
  NumberField as AriaNumberField
2462
2926
  } from "react-aria-components";
2463
- import { jsx as jsx41, jsxs as jsxs20 } from "react/jsx-runtime";
2927
+ import { jsx as jsx39, jsxs as jsxs19 } from "react/jsx-runtime";
2464
2928
  function QuantityInput({
2465
2929
  className,
2466
2930
  inputClassName,
@@ -2470,23 +2934,53 @@ function QuantityInput({
2470
2934
  step = 1,
2471
2935
  ...props
2472
2936
  }) {
2473
- return /* @__PURE__ */ jsx41(
2937
+ return /* @__PURE__ */ jsx39(
2474
2938
  AriaNumberField,
2475
2939
  {
2476
2940
  ...props,
2477
2941
  minValue,
2478
2942
  step,
2479
2943
  "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(
2944
+ className: cn(
2945
+ "group/quantity-input inline-flex min-w-0 data-disabled:cursor-not-allowed data-disabled:opacity-50",
2946
+ className
2947
+ ),
2948
+ children: /* @__PURE__ */ jsxs19(
2482
2949
  AriaGroup,
2483
2950
  {
2484
2951
  "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",
2952
+ 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
2953
  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" }) })
2954
+ /* @__PURE__ */ jsx39(
2955
+ AriaButton,
2956
+ {
2957
+ slot: "decrement",
2958
+ "aria-label": decrementAriaLabel,
2959
+ "data-slot": "quantity-input-decrement",
2960
+ 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",
2961
+ children: /* @__PURE__ */ jsx39(Minus, { "aria-hidden": "true", className: "size-4" })
2962
+ }
2963
+ ),
2964
+ /* @__PURE__ */ jsx39(
2965
+ AriaInput4,
2966
+ {
2967
+ "data-slot": "quantity-input-value",
2968
+ className: cn(
2969
+ "w-14 min-w-0 bg-transparent px-1 text-center text-sm tabular-nums outline-none",
2970
+ inputClassName
2971
+ )
2972
+ }
2973
+ ),
2974
+ /* @__PURE__ */ jsx39(
2975
+ AriaButton,
2976
+ {
2977
+ slot: "increment",
2978
+ "aria-label": incrementAriaLabel,
2979
+ "data-slot": "quantity-input-increment",
2980
+ 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",
2981
+ children: /* @__PURE__ */ jsx39(Plus, { "aria-hidden": "true", className: "size-4" })
2982
+ }
2983
+ )
2490
2984
  ]
2491
2985
  }
2492
2986
  )
@@ -2495,6 +2989,7 @@ function QuantityInput({
2495
2989
  }
2496
2990
 
2497
2991
  // src/ui/select/select.tsx
2992
+ import { ChevronDown as ChevronDown2 } from "lucide-react";
2498
2993
  import {
2499
2994
  Button as AriaButton2,
2500
2995
  Select as AriaSelect,
@@ -2503,44 +2998,99 @@ import {
2503
2998
  ListBoxItem as ListBoxItem3,
2504
2999
  Popover as Popover5
2505
3000
  } 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";
3001
+ import { Fragment as Fragment8, jsx as jsx40, jsxs as jsxs20 } from "react/jsx-runtime";
2508
3002
  var Select = AriaSelect;
2509
3003
  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
- ] }) });
3004
+ return /* @__PURE__ */ jsx40(
3005
+ AriaButton2,
3006
+ {
3007
+ "data-slot": "select-trigger",
3008
+ className: cn(
3009
+ "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",
3010
+ className
3011
+ ),
3012
+ ...props,
3013
+ children: (state) => /* @__PURE__ */ jsxs20(Fragment8, { children: [
3014
+ typeof children === "function" ? children(state) : children,
3015
+ /* @__PURE__ */ jsx40(
3016
+ ChevronDown2,
3017
+ {
3018
+ "aria-hidden": "true",
3019
+ className: "text-muted-foreground ml-auto size-4 transition-transform group-data-pressed/select-trigger:rotate-180 motion-reduce:transition-none"
3020
+ }
3021
+ )
3022
+ ] })
3023
+ }
3024
+ );
2514
3025
  }
2515
3026
  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 });
3027
+ return /* @__PURE__ */ jsx40(
3028
+ AriaSelectValue,
3029
+ {
3030
+ "data-slot": "select-value",
3031
+ className: cn("flex-1 truncate data-placeholder:text-muted-foreground", className),
3032
+ ...props
3033
+ }
3034
+ );
2517
3035
  }
2518
3036
  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 });
3037
+ return /* @__PURE__ */ jsx40(
3038
+ Popover5,
3039
+ {
3040
+ "data-slot": "select-content",
3041
+ className: cn(
3042
+ "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",
3043
+ className
3044
+ ),
3045
+ ...props
3046
+ }
3047
+ );
2520
3048
  }
2521
3049
  function SelectList({ className, ...props }) {
2522
- return /* @__PURE__ */ jsx42(ListBox3, { "data-slot": "select-list", className: cn("max-h-64 overflow-y-auto", className), ...props });
3050
+ return /* @__PURE__ */ jsx40(
3051
+ ListBox3,
3052
+ {
3053
+ "data-slot": "select-list",
3054
+ className: cn("max-h-64 overflow-y-auto", className),
3055
+ ...props
3056
+ }
3057
+ );
2523
3058
  }
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 });
3059
+ function SelectItem({
3060
+ className,
3061
+ children,
3062
+ ...props
3063
+ }) {
3064
+ return /* @__PURE__ */ jsx40(
3065
+ ListBoxItem3,
3066
+ {
3067
+ "data-slot": "select-item",
3068
+ className: cn(
3069
+ "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",
3070
+ className
3071
+ ),
3072
+ ...props,
3073
+ children
3074
+ }
3075
+ );
2526
3076
  }
2527
3077
 
2528
3078
  // src/ui/sheet/sheet.tsx
2529
3079
  import { XIcon as XIcon2 } from "lucide-react";
2530
3080
  import {
2531
- Heading as Heading6,
3081
+ Heading as Heading3,
2532
3082
  ModalOverlay as ModalOverlayPrimitive,
2533
3083
  Modal as ModalPrimitive,
2534
3084
  Dialog as SheetPrimitive,
2535
3085
  DialogTrigger as SheetTriggerPrimitive,
2536
- Text as Text5
3086
+ Text as Text3
2537
3087
  } from "react-aria-components";
2538
- import { jsx as jsx43, jsxs as jsxs22 } from "react/jsx-runtime";
3088
+ import { jsx as jsx41, jsxs as jsxs21 } from "react/jsx-runtime";
2539
3089
  function SheetTrigger({ ...props }) {
2540
- return /* @__PURE__ */ jsx43(SheetTriggerPrimitive, { "data-slot": "sheet-trigger", ...props });
3090
+ return /* @__PURE__ */ jsx41(SheetTriggerPrimitive, { "data-slot": "sheet-trigger", ...props });
2541
3091
  }
2542
3092
  function SheetClose({ className, variant = "outline", size = "default", ...props }) {
2543
- return /* @__PURE__ */ jsx43(
3093
+ return /* @__PURE__ */ jsx41(
2544
3094
  Button,
2545
3095
  {
2546
3096
  slot: "close",
@@ -2557,7 +3107,7 @@ function SheetOverlay({
2557
3107
  children,
2558
3108
  ...props
2559
3109
  }) {
2560
- return /* @__PURE__ */ jsx43(
3110
+ return /* @__PURE__ */ jsx41(
2561
3111
  ModalOverlayPrimitive,
2562
3112
  {
2563
3113
  "data-slot": "sheet-overlay",
@@ -2578,7 +3128,7 @@ function Sheet({
2578
3128
  showCloseButton = true,
2579
3129
  ...props
2580
3130
  }) {
2581
- return /* @__PURE__ */ jsx43(SheetOverlay, { ...props, children: /* @__PURE__ */ jsx43(
3131
+ return /* @__PURE__ */ jsx41(SheetOverlay, { ...props, children: /* @__PURE__ */ jsx41(
2582
3132
  ModalPrimitive,
2583
3133
  {
2584
3134
  "data-slot": "sheet-content",
@@ -2587,16 +3137,16 @@ function Sheet({
2587
3137
  "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
3138
  className
2589
3139
  ),
2590
- children: /* @__PURE__ */ jsxs22(
3140
+ children: /* @__PURE__ */ jsxs21(
2591
3141
  SheetPrimitive,
2592
3142
  {
2593
3143
  "data-slot": "sheet",
2594
3144
  className: "[display:inherit] h-full max-h-[inherit] [flex-direction:inherit] gap-[inherit] outline-none",
2595
3145
  children: [
2596
3146
  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" })
3147
+ showCloseButton && /* @__PURE__ */ jsxs21(SheetClose, { variant: "ghost", className: "absolute top-3 right-3", size: "icon-sm", children: [
3148
+ /* @__PURE__ */ jsx41(XIcon2, {}),
3149
+ /* @__PURE__ */ jsx41("span", { className: "sr-only", children: "Cerrar" })
2600
3150
  ] })
2601
3151
  ]
2602
3152
  }
@@ -2611,10 +3161,25 @@ function SheetContent({
2611
3161
  showCloseButton = true,
2612
3162
  ...props
2613
3163
  }) {
2614
- return /* @__PURE__ */ jsx43(Sheet, { className, side, showCloseButton, ...props, children });
3164
+ return /* @__PURE__ */ jsx41(Sheet, { className, side, showCloseButton, ...props, children });
3165
+ }
3166
+ function Drawer({
3167
+ children,
3168
+ trigger,
3169
+ triggerProps,
3170
+ defaultOpen,
3171
+ isOpen,
3172
+ onOpenChange,
3173
+ ...contentProps
3174
+ }) {
3175
+ const triggerElement = typeof trigger === "string" ? /* @__PURE__ */ jsx41(Button, { ...triggerProps, children: trigger }) : trigger;
3176
+ return /* @__PURE__ */ jsxs21(SheetTrigger, { defaultOpen, isOpen, onOpenChange, children: [
3177
+ triggerElement,
3178
+ /* @__PURE__ */ jsx41(SheetContent, { ...contentProps, children })
3179
+ ] });
2615
3180
  }
2616
3181
  function SheetHeader({ className, ...props }) {
2617
- return /* @__PURE__ */ jsx43(
3182
+ return /* @__PURE__ */ jsx41(
2618
3183
  "div",
2619
3184
  {
2620
3185
  "data-slot": "sheet-header",
@@ -2624,7 +3189,7 @@ function SheetHeader({ className, ...props }) {
2624
3189
  );
2625
3190
  }
2626
3191
  function SheetFooter({ className, ...props }) {
2627
- return /* @__PURE__ */ jsx43(
3192
+ return /* @__PURE__ */ jsx41(
2628
3193
  "div",
2629
3194
  {
2630
3195
  "data-slot": "sheet-footer",
@@ -2634,8 +3199,8 @@ function SheetFooter({ className, ...props }) {
2634
3199
  );
2635
3200
  }
2636
3201
  function SheetTitle({ className, ...props }) {
2637
- return /* @__PURE__ */ jsx43(
2638
- Heading6,
3202
+ return /* @__PURE__ */ jsx41(
3203
+ Heading3,
2639
3204
  {
2640
3205
  slot: "title",
2641
3206
  "data-slot": "sheet-title",
@@ -2648,8 +3213,8 @@ function SheetDescription({
2648
3213
  className,
2649
3214
  ...props
2650
3215
  }) {
2651
- return /* @__PURE__ */ jsx43(
2652
- Text5,
3216
+ return /* @__PURE__ */ jsx41(
3217
+ Text3,
2653
3218
  {
2654
3219
  slot: "description",
2655
3220
  "data-slot": "sheet-description",
@@ -2658,29 +3223,30 @@ function SheetDescription({
2658
3223
  }
2659
3224
  );
2660
3225
  }
3226
+ var DrawerTrigger = SheetTrigger;
3227
+ var DrawerContent = SheetContent;
3228
+ var DrawerClose = SheetClose;
3229
+ var DrawerHeader = SheetHeader;
3230
+ var DrawerFooter = SheetFooter;
3231
+ var DrawerTitle = SheetTitle;
3232
+ var DrawerDescription = SheetDescription;
2661
3233
 
2662
3234
  // 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";
3235
+ import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight2, Ellipsis, Search } from "lucide-react";
3236
+ import { useMemo as useMemo2, useState as useState11 } from "react";
2675
3237
  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);
3238
+
3239
+ // src/ui/sidebar/sidebar-context.ts
3240
+ import { createContext as createContext4, useContext as useContext4 } from "react";
3241
+ var SidebarContext = createContext4(null);
2678
3242
  function useSidebar() {
2679
- const context = useContext5(SidebarContext);
2680
- if (!context)
2681
- throw new Error("useSidebar must be used inside SidebarProvider");
3243
+ const context = useContext4(SidebarContext);
3244
+ if (!context) throw new Error("useSidebar must be used inside SidebarProvider");
2682
3245
  return context;
2683
3246
  }
3247
+
3248
+ // src/ui/sidebar/sidebar.tsx
3249
+ import { Fragment as Fragment9, jsx as jsx42, jsxs as jsxs22 } from "react/jsx-runtime";
2684
3250
  function SidebarProvider({
2685
3251
  defaultCollapsed = false,
2686
3252
  children
@@ -2694,14 +3260,11 @@ function SidebarProvider({
2694
3260
  }),
2695
3261
  [collapsed]
2696
3262
  );
2697
- return /* @__PURE__ */ jsx44(SidebarContext.Provider, { value, children });
3263
+ return /* @__PURE__ */ jsx42(SidebarContext.Provider, { value, children });
2698
3264
  }
2699
- function Sidebar({
2700
- className,
2701
- ...props
2702
- }) {
3265
+ function Sidebar({ className, ...props }) {
2703
3266
  const { collapsed } = useSidebar();
2704
- return /* @__PURE__ */ jsx44(
3267
+ return /* @__PURE__ */ jsx42(
2705
3268
  "aside",
2706
3269
  {
2707
3270
  "data-slot": "sidebar",
@@ -2714,11 +3277,8 @@ function Sidebar({
2714
3277
  }
2715
3278
  );
2716
3279
  }
2717
- function SidebarHeader({
2718
- className,
2719
- ...props
2720
- }) {
2721
- return /* @__PURE__ */ jsx44(
3280
+ function SidebarHeader({ className, ...props }) {
3281
+ return /* @__PURE__ */ jsx42(
2722
3282
  "div",
2723
3283
  {
2724
3284
  "data-slot": "sidebar-header",
@@ -2733,7 +3293,7 @@ function SidebarSearch({
2733
3293
  className,
2734
3294
  ...props
2735
3295
  }) {
2736
- return /* @__PURE__ */ jsxs23(
3296
+ return /* @__PURE__ */ jsxs22(
2737
3297
  "button",
2738
3298
  {
2739
3299
  type: "button",
@@ -2744,18 +3304,15 @@ function SidebarSearch({
2744
3304
  ),
2745
3305
  ...props,
2746
3306
  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 })
3307
+ /* @__PURE__ */ jsx42(Search, { className: "size-4 shrink-0" }),
3308
+ /* @__PURE__ */ jsx42("span", { className: "flex-1 text-left", children: label }),
3309
+ /* @__PURE__ */ jsx42("kbd", { className: "bg-secondary text-muted-foreground rounded px-1.5 py-0.5 font-mono text-[10px]", children: shortcut })
2750
3310
  ]
2751
3311
  }
2752
3312
  );
2753
3313
  }
2754
- function SidebarContent({
2755
- className,
2756
- ...props
2757
- }) {
2758
- return /* @__PURE__ */ jsx44(
3314
+ function SidebarContent({ className, ...props }) {
3315
+ return /* @__PURE__ */ jsx42(
2759
3316
  "nav",
2760
3317
  {
2761
3318
  "data-slot": "sidebar-content",
@@ -2765,18 +3322,12 @@ function SidebarContent({
2765
3322
  }
2766
3323
  );
2767
3324
  }
2768
- function SidebarFooter({
2769
- className,
2770
- ...props
2771
- }) {
2772
- return /* @__PURE__ */ jsx44(
3325
+ function SidebarFooter({ className, ...props }) {
3326
+ return /* @__PURE__ */ jsx42(
2773
3327
  "div",
2774
3328
  {
2775
3329
  "data-slot": "sidebar-footer",
2776
- className: cn(
2777
- "mt-auto flex flex-col gap-2 border-t border-border p-2",
2778
- className
2779
- ),
3330
+ className: cn("mt-auto flex flex-col gap-2 border-t border-border p-2", className),
2780
3331
  ...props
2781
3332
  }
2782
3333
  );
@@ -2788,27 +3339,19 @@ function SidebarGroup({
2788
3339
  ...props
2789
3340
  }) {
2790
3341
  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
- }
3342
+ return /* @__PURE__ */ jsxs22("section", { "data-slot": "sidebar-group", className: cn("mb-4 last:mb-0", className), ...props, children: [
3343
+ label && /* @__PURE__ */ jsx42(
3344
+ "h2",
3345
+ {
3346
+ className: cn(
3347
+ "mb-1 px-3 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground",
3348
+ collapsed && "sr-only"
2807
3349
  ),
2808
- children
2809
- ]
2810
- }
2811
- );
3350
+ children: label
3351
+ }
3352
+ ),
3353
+ children
3354
+ ] });
2812
3355
  }
2813
3356
  function SidebarItem({
2814
3357
  icon,
@@ -2821,7 +3364,7 @@ function SidebarItem({
2821
3364
  }) {
2822
3365
  const { collapsed } = useSidebar();
2823
3366
  const content = typeof children === "function" ? label : children ?? label;
2824
- return /* @__PURE__ */ jsx44(
3367
+ return /* @__PURE__ */ jsx42(
2825
3368
  Link3,
2826
3369
  {
2827
3370
  "data-slot": "sidebar-item",
@@ -2833,25 +3376,16 @@ function SidebarItem({
2833
3376
  typeof className === "function" ? className : className
2834
3377
  ),
2835
3378
  ...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 })
3379
+ children: (values) => /* @__PURE__ */ jsxs22(Fragment9, { children: [
3380
+ /* @__PURE__ */ jsx42("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
3381
+ /* @__PURE__ */ jsx42("span", { className: cn("min-w-0 flex-1 truncate", collapsed && "sr-only"), children: typeof children === "function" ? children(values) : content }),
3382
+ badge && !collapsed && /* @__PURE__ */ jsx42("span", { className: "text-muted-foreground text-xs", children: badge })
2846
3383
  ] })
2847
3384
  }
2848
3385
  );
2849
3386
  }
2850
- function SidebarSeparator({
2851
- className,
2852
- ...props
2853
- }) {
2854
- return /* @__PURE__ */ jsx44(
3387
+ function SidebarSeparator({ className, ...props }) {
3388
+ return /* @__PURE__ */ jsx42(
2855
3389
  "hr",
2856
3390
  {
2857
3391
  "data-slot": "sidebar-separator",
@@ -2862,7 +3396,7 @@ function SidebarSeparator({
2862
3396
  }
2863
3397
  function SidebarTrigger({ className, ...props }) {
2864
3398
  const { collapsed, toggle } = useSidebar();
2865
- return /* @__PURE__ */ jsx44(
3399
+ return /* @__PURE__ */ jsx42(
2866
3400
  Button,
2867
3401
  {
2868
3402
  "aria-label": collapsed ? "Expandir navegaci\xF3n" : "Colapsar navegaci\xF3n",
@@ -2871,16 +3405,13 @@ function SidebarTrigger({ className, ...props }) {
2871
3405
  variant: "ghost",
2872
3406
  className: cn("ml-auto", className),
2873
3407
  ...props,
2874
- children: collapsed ? /* @__PURE__ */ jsx44(ChevronRight2, {}) : /* @__PURE__ */ jsx44(ChevronLeft2, {})
3408
+ children: collapsed ? /* @__PURE__ */ jsx42(ChevronRight2, {}) : /* @__PURE__ */ jsx42(ChevronLeft2, {})
2875
3409
  }
2876
3410
  );
2877
3411
  }
2878
- function SidebarRail({
2879
- className,
2880
- ...props
2881
- }) {
3412
+ function SidebarRail({ className, ...props }) {
2882
3413
  const { toggle } = useSidebar();
2883
- return /* @__PURE__ */ jsx44(
3414
+ return /* @__PURE__ */ jsx42(
2884
3415
  "button",
2885
3416
  {
2886
3417
  type: "button",
@@ -2895,7 +3426,7 @@ function SidebarRail({
2895
3426
  );
2896
3427
  }
2897
3428
  function SidebarMore({ className, ...props }) {
2898
- return /* @__PURE__ */ jsx44(
3429
+ return /* @__PURE__ */ jsx42(
2899
3430
  Button,
2900
3431
  {
2901
3432
  "aria-label": "M\xE1s opciones",
@@ -2903,36 +3434,85 @@ function SidebarMore({ className, ...props }) {
2903
3434
  variant: "ghost",
2904
3435
  className: cn("size-7", className),
2905
3436
  ...props,
2906
- children: /* @__PURE__ */ jsx44(Ellipsis, {})
3437
+ children: /* @__PURE__ */ jsx42(Ellipsis, {})
2907
3438
  }
2908
3439
  );
2909
3440
  }
2910
3441
 
2911
3442
  // src/ui/skeleton/skeleton.tsx
2912
- import { jsx as jsx45 } from "react/jsx-runtime";
3443
+ import { jsx as jsx43 } from "react/jsx-runtime";
2913
3444
  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 });
3445
+ return /* @__PURE__ */ jsx43(
3446
+ "div",
3447
+ {
3448
+ "aria-hidden": "true",
3449
+ "data-slot": "skeleton",
3450
+ className: cn("animate-pulse rounded-md bg-muted", className),
3451
+ ...props
3452
+ }
3453
+ );
2915
3454
  }
2916
3455
 
2917
3456
  // src/ui/submit-button/submit-button.tsx
2918
- import { useFormStatus } from "react-dom";
2919
3457
  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 }) {
3458
+ import { useCallback as useCallback6, useLayoutEffect, useRef as useRef5 } from "react";
3459
+ import { useFormStatus } from "react-dom";
3460
+ import { Fragment as Fragment10, jsx as jsx44, jsxs as jsxs23 } from "react/jsx-runtime";
3461
+ function assignRef(ref, node) {
3462
+ if (typeof ref === "function") {
3463
+ ref(node);
3464
+ } else if (ref) {
3465
+ ref.current = node;
3466
+ }
3467
+ }
3468
+ function SubmitButton({
3469
+ loadingLabel,
3470
+ pendingLabel,
3471
+ loading = false,
3472
+ children,
3473
+ isDisabled,
3474
+ ref: forwardedRef,
3475
+ size = "sm",
3476
+ ...props
3477
+ }) {
2922
3478
  const { pending } = useFormStatus();
2923
3479
  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 });
3480
+ const label = loadingLabel ?? pendingLabel ?? "Guardando\u2026";
3481
+ const buttonRef = useRef5(null);
3482
+ const setButtonRef = useCallback6(
3483
+ (node) => {
3484
+ buttonRef.current = node;
3485
+ assignRef(forwardedRef, node);
3486
+ },
3487
+ [forwardedRef]
3488
+ );
3489
+ useLayoutEffect(() => {
3490
+ const button = buttonRef.current;
3491
+ if (!button) return;
3492
+ if (busy) button.setAttribute("aria-busy", "true");
3493
+ else button.removeAttribute("aria-busy");
3494
+ }, [busy]);
3495
+ return /* @__PURE__ */ jsx44(
3496
+ Button,
3497
+ {
3498
+ ref: setButtonRef,
3499
+ type: "submit",
3500
+ size,
3501
+ isDisabled: busy || isDisabled,
3502
+ "aria-busy": busy || void 0,
3503
+ ...props,
3504
+ children: busy ? /* @__PURE__ */ jsxs23(Fragment10, { children: [
3505
+ /* @__PURE__ */ jsx44(LoaderCircle3, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
3506
+ label
3507
+ ] }) : children
3508
+ }
3509
+ );
2928
3510
  }
2929
3511
 
2930
3512
  // 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";
3513
+ import { useEffect as useEffect5, useRef as useRef6 } from "react";
3514
+ import { Switch as AriaSwitch } from "react-aria-components";
3515
+ import { Fragment as Fragment11, jsx as jsx45, jsxs as jsxs24 } from "react/jsx-runtime";
2936
3516
  var switchSizes = {
2937
3517
  sm: {
2938
3518
  control: "h-4 w-[1.875rem] p-0.5",
@@ -2972,13 +3552,14 @@ function Switch({
2972
3552
  ...props
2973
3553
  }) {
2974
3554
  const styles = switchSizes[size];
2975
- const fallbackInputRef = useRef5(null);
3555
+ const fallbackInputRef = useRef6(null);
2976
3556
  const resolvedInputRef = inputRef ?? fallbackInputRef;
2977
3557
  useEffect5(() => {
2978
3558
  const input = resolvedInputRef.current;
2979
3559
  if (!input) return;
2980
3560
  const handleDirectionalKey = (event) => {
2981
- if (event.target !== input || event.defaultPrevented || isDisabled || isReadOnly || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
3561
+ if (event.target !== input || event.defaultPrevented || isDisabled || isReadOnly || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
3562
+ return;
2982
3563
  const nextSelected = event.key === "ArrowRight" ? true : event.key === "ArrowLeft" ? false : null;
2983
3564
  if (nextSelected === null) return;
2984
3565
  event.preventDefault();
@@ -2988,7 +3569,7 @@ function Switch({
2988
3569
  ownerDocument.addEventListener("keydown", handleDirectionalKey);
2989
3570
  return () => ownerDocument.removeEventListener("keydown", handleDirectionalKey);
2990
3571
  }, [isDisabled, isReadOnly, resolvedInputRef]);
2991
- return /* @__PURE__ */ jsx47(
3572
+ return /* @__PURE__ */ jsx45(
2992
3573
  AriaSwitch,
2993
3574
  {
2994
3575
  "data-slot": "switch",
@@ -3003,10 +3584,10 @@ function Switch({
3003
3584
  ),
3004
3585
  ...props,
3005
3586
  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(
3587
+ const isThumbPressed = state.isPressed;
3588
+ const thumbOffset = state.isSelected ? isThumbPressed ? styles.activeSelectedOffset : styles.selectedOffset : "0";
3589
+ return /* @__PURE__ */ jsxs24(Fragment11, { children: [
3590
+ /* @__PURE__ */ jsx45(
3010
3591
  "span",
3011
3592
  {
3012
3593
  "aria-hidden": "true",
@@ -3020,13 +3601,13 @@ function Switch({
3020
3601
  "group-data-focus-visible/switch:ring-3 group-data-focus-visible/switch:ring-ring/50",
3021
3602
  styles.control
3022
3603
  ),
3023
- children: /* @__PURE__ */ jsx47(
3604
+ children: /* @__PURE__ */ jsx45(
3024
3605
  "span",
3025
3606
  {
3026
3607
  "data-slot": "switch-thumb",
3027
3608
  style: {
3028
3609
  transform: `translate3d(${thumbOffset}, 0, 0)`,
3029
- width: isThumbActive ? styles.activeWidth : styles.idleWidth
3610
+ width: isThumbPressed ? styles.activeWidth : styles.idleWidth
3030
3611
  },
3031
3612
  className: cn(
3032
3613
  "grid shrink-0 place-items-center rounded-full border border-border/60 bg-background text-[0.625rem] text-muted-foreground shadow-sm",
@@ -3040,9 +3621,16 @@ function Switch({
3040
3621
  )
3041
3622
  }
3042
3623
  ),
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
3624
+ children || description ? /* @__PURE__ */ jsxs24("span", { className: "grid gap-0.5 leading-tight", children: [
3625
+ children ? /* @__PURE__ */ jsx45("span", { "data-slot": "switch-label", className: "font-medium", children: typeof children === "function" ? children(state) : children }) : null,
3626
+ description ? /* @__PURE__ */ jsx45(
3627
+ "span",
3628
+ {
3629
+ "data-slot": "switch-description",
3630
+ className: "text-muted-foreground text-xs font-normal",
3631
+ children: description
3632
+ }
3633
+ ) : null
3046
3634
  ] }) : null
3047
3635
  ] });
3048
3636
  }
@@ -3051,9 +3639,9 @@ function Switch({
3051
3639
  }
3052
3640
 
3053
3641
  // src/ui/table/table.tsx
3054
- import { jsx as jsx48 } from "react/jsx-runtime";
3642
+ import { jsx as jsx46 } from "react/jsx-runtime";
3055
3643
  function Table({ className, ...props }) {
3056
- return /* @__PURE__ */ jsx48("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx48(
3644
+ return /* @__PURE__ */ jsx46("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx46(
3057
3645
  "table",
3058
3646
  {
3059
3647
  "data-slot": "table",
@@ -3063,10 +3651,10 @@ function Table({ className, ...props }) {
3063
3651
  ) });
3064
3652
  }
3065
3653
  function TableHeader({ className, ...props }) {
3066
- return /* @__PURE__ */ jsx48("thead", { "data-slot": "table-header", className: cn("[&_tr]:border-b", className), ...props });
3654
+ return /* @__PURE__ */ jsx46("thead", { "data-slot": "table-header", className: cn("[&_tr]:border-b", className), ...props });
3067
3655
  }
3068
3656
  function TableBody({ className, ...props }) {
3069
- return /* @__PURE__ */ jsx48(
3657
+ return /* @__PURE__ */ jsx46(
3070
3658
  "tbody",
3071
3659
  {
3072
3660
  "data-slot": "table-body",
@@ -3076,7 +3664,7 @@ function TableBody({ className, ...props }) {
3076
3664
  );
3077
3665
  }
3078
3666
  function TableRow({ className, ...props }) {
3079
- return /* @__PURE__ */ jsx48(
3667
+ return /* @__PURE__ */ jsx46(
3080
3668
  "tr",
3081
3669
  {
3082
3670
  "data-slot": "table-row",
@@ -3089,7 +3677,7 @@ function TableRow({ className, ...props }) {
3089
3677
  );
3090
3678
  }
3091
3679
  function TableHead({ className, ...props }) {
3092
- return /* @__PURE__ */ jsx48(
3680
+ return /* @__PURE__ */ jsx46(
3093
3681
  "th",
3094
3682
  {
3095
3683
  "data-slot": "table-head",
@@ -3102,7 +3690,7 @@ function TableHead({ className, ...props }) {
3102
3690
  );
3103
3691
  }
3104
3692
  function TableCell({ className, ...props }) {
3105
- return /* @__PURE__ */ jsx48(
3693
+ return /* @__PURE__ */ jsx46(
3106
3694
  "td",
3107
3695
  {
3108
3696
  "data-slot": "table-cell",
@@ -3112,7 +3700,7 @@ function TableCell({ className, ...props }) {
3112
3700
  );
3113
3701
  }
3114
3702
  function TableCaption({ className, ...props }) {
3115
- return /* @__PURE__ */ jsx48(
3703
+ return /* @__PURE__ */ jsx46(
3116
3704
  "caption",
3117
3705
  {
3118
3706
  "data-slot": "table-caption",
@@ -3122,11 +3710,14 @@ function TableCaption({ className, ...props }) {
3122
3710
  );
3123
3711
  }
3124
3712
  function TableFooter({ className, ...props }) {
3125
- return /* @__PURE__ */ jsx48(
3713
+ return /* @__PURE__ */ jsx46(
3126
3714
  "tfoot",
3127
3715
  {
3128
3716
  "data-slot": "table-footer",
3129
- className: cn("border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0", className),
3717
+ className: cn(
3718
+ "border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0",
3719
+ className
3720
+ ),
3130
3721
  ...props
3131
3722
  }
3132
3723
  );
@@ -3141,27 +3732,72 @@ import {
3141
3732
  Tabs as AriaTabs,
3142
3733
  composeRenderProps as composeRenderProps2
3143
3734
  } from "react-aria-components";
3144
- import { jsx as jsx49 } from "react/jsx-runtime";
3735
+ import { jsx as jsx47 } from "react/jsx-runtime";
3145
3736
  function Tabs({ className, ...props }) {
3146
- return /* @__PURE__ */ jsx49(AriaTabs, { "data-slot": "tabs", className: composeRenderProps2(className, (value) => cn("flex flex-col gap-2", value)), ...props });
3737
+ return /* @__PURE__ */ jsx47(
3738
+ AriaTabs,
3739
+ {
3740
+ "data-slot": "tabs",
3741
+ className: composeRenderProps2(className, (value) => cn("flex flex-col gap-2", value)),
3742
+ ...props
3743
+ }
3744
+ );
3147
3745
  }
3148
3746
  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 });
3747
+ return /* @__PURE__ */ jsx47(
3748
+ AriaTabList,
3749
+ {
3750
+ "data-slot": "tabs-list",
3751
+ className: composeRenderProps2(
3752
+ className,
3753
+ (value) => cn(
3754
+ "inline-flex w-fit items-center gap-1 rounded-lg bg-muted p-1 text-muted-foreground",
3755
+ value
3756
+ )
3757
+ ),
3758
+ ...props
3759
+ }
3760
+ );
3150
3761
  }
3151
3762
  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 });
3763
+ return /* @__PURE__ */ jsx47(
3764
+ AriaTab,
3765
+ {
3766
+ "data-slot": "tabs-trigger",
3767
+ className: composeRenderProps2(
3768
+ className,
3769
+ (value) => cn(
3770
+ "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",
3771
+ value
3772
+ )
3773
+ ),
3774
+ ...props
3775
+ }
3776
+ );
3153
3777
  }
3154
3778
  function TabsPanels({ className, ...props }) {
3155
- return /* @__PURE__ */ jsx49(AriaTabPanels, { "data-slot": "tabs-panels", className: cn("min-w-0", className), ...props });
3779
+ return /* @__PURE__ */ jsx47(AriaTabPanels, { "data-slot": "tabs-panels", className: cn("min-w-0", className), ...props });
3156
3780
  }
3157
3781
  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 });
3782
+ return /* @__PURE__ */ jsx47(
3783
+ AriaTabPanel,
3784
+ {
3785
+ "data-slot": "tabs-content",
3786
+ className: composeRenderProps2(
3787
+ className,
3788
+ (value) => cn("text-sm outline-none data-focus-visible:ring-3 data-focus-visible:ring-ring/50", value)
3789
+ ),
3790
+ ...props
3791
+ }
3792
+ );
3159
3793
  }
3160
3794
 
3161
3795
  // src/ui/toast/toast.tsx
3162
3796
  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";
3797
+ import { sileo as sileo2, Toaster as SileoToaster } from "sileo";
3798
+
3799
+ // src/ui/toast/toast-store.ts
3800
+ import { sileo } from "sileo";
3165
3801
  function toSileoOptions({ title, description, duration, position, action }) {
3166
3802
  return {
3167
3803
  title,
@@ -3190,8 +3826,14 @@ var toast = Object.assign((options) => create(options), {
3190
3826
  const shared = { description: options.description, position: options.position };
3191
3827
  return sileo.promise(promise, {
3192
3828
  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 }),
3829
+ success: (value) => ({
3830
+ ...shared,
3831
+ title: typeof options.success === "function" ? options.success(value) : options.success
3832
+ }),
3833
+ error: (error) => ({
3834
+ ...shared,
3835
+ title: typeof options.error === "function" ? options.error(error) : options.error
3836
+ }),
3195
3837
  position: options.position
3196
3838
  });
3197
3839
  }
@@ -3199,26 +3841,43 @@ var toast = Object.assign((options) => create(options), {
3199
3841
  function useToast() {
3200
3842
  return toast;
3201
3843
  }
3844
+
3845
+ // src/ui/toast/toast.tsx
3846
+ import { Fragment as Fragment12, jsx as jsx48, jsxs as jsxs25 } from "react/jsx-runtime";
3202
3847
  function ToastProvider({ children }) {
3203
- return /* @__PURE__ */ jsxs26(Fragment15, { children: [
3848
+ return /* @__PURE__ */ jsxs25(Fragment12, { children: [
3204
3849
  children,
3205
- /* @__PURE__ */ jsx50(Toaster, {})
3850
+ /* @__PURE__ */ jsx48(Toaster, {})
3206
3851
  ] });
3207
3852
  }
3208
3853
  function Toaster({ position }) {
3209
- return /* @__PURE__ */ jsx50(SileoToaster, { position, options: { fill: "var(--ui-secondary)" } });
3854
+ return /* @__PURE__ */ jsx48(SileoToaster, { position, options: { fill: "var(--ui-secondary)" } });
3210
3855
  }
3211
- function ToastViewport({ position, visiblePosition, className }) {
3856
+ function ToastViewport({
3857
+ position,
3858
+ visiblePosition,
3859
+ className
3860
+ }) {
3212
3861
  void className;
3213
3862
  if (visiblePosition && visiblePosition !== position) return null;
3214
- return /* @__PURE__ */ jsx50(Toaster, { position });
3863
+ return /* @__PURE__ */ jsx48(Toaster, { position });
3215
3864
  }
3216
- function Toast({ id, title, description, variant = "default", action, state = "open", duration = 0, position, onDismiss }) {
3865
+ function Toast({
3866
+ id,
3867
+ title,
3868
+ description,
3869
+ variant = "default",
3870
+ action,
3871
+ state,
3872
+ duration = 0,
3873
+ position,
3874
+ onDismiss
3875
+ }) {
3217
3876
  useEffect6(() => {
3218
3877
  if (state !== "open") return;
3219
- const toastId = create({ title, description, variant, action, duration, position });
3878
+ const toastId = toast({ title, description, variant, action, duration, position });
3220
3879
  return () => {
3221
- sileo.dismiss(toastId);
3880
+ sileo2.dismiss(toastId);
3222
3881
  onDismiss?.();
3223
3882
  };
3224
3883
  }, [action, description, duration, id, onDismiss, position, state, title, variant]);
@@ -3226,15 +3885,30 @@ function Toast({ id, title, description, variant = "default", action, state = "o
3226
3885
  }
3227
3886
 
3228
3887
  // src/ui/toolbar/toolbar.tsx
3229
- import { jsx as jsx51 } from "react/jsx-runtime";
3888
+ import { jsx as jsx49 } from "react/jsx-runtime";
3230
3889
  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 });
3890
+ return /* @__PURE__ */ jsx49(
3891
+ "div",
3892
+ {
3893
+ role: "toolbar",
3894
+ "data-slot": "toolbar",
3895
+ className: cn("flex flex-wrap items-center gap-2", className),
3896
+ ...props
3897
+ }
3898
+ );
3232
3899
  }
3233
3900
  function ToolbarGroup({ className, ...props }) {
3234
- return /* @__PURE__ */ jsx51("div", { "data-slot": "toolbar-group", className: cn("flex items-center gap-2", className), ...props });
3901
+ return /* @__PURE__ */ jsx49(
3902
+ "div",
3903
+ {
3904
+ "data-slot": "toolbar-group",
3905
+ className: cn("flex items-center gap-2", className),
3906
+ ...props
3907
+ }
3908
+ );
3235
3909
  }
3236
3910
  function ToolbarSpacer({ className, ...props }) {
3237
- return /* @__PURE__ */ jsx51("div", { "aria-hidden": "true", className: cn("hidden flex-1 sm:block", className), ...props });
3911
+ return /* @__PURE__ */ jsx49("div", { "aria-hidden": "true", className: cn("hidden flex-1 sm:block", className), ...props });
3238
3912
  }
3239
3913
  export {
3240
3914
  Accordion,
@@ -3312,15 +3986,20 @@ export {
3312
3986
  DialogHeader,
3313
3987
  DialogOverlay,
3314
3988
  DialogPortal,
3989
+ DialogRoot,
3315
3990
  DialogTitle,
3316
3991
  DialogTrigger,
3317
3992
  DocPreview,
3318
3993
  Drawer,
3994
+ DrawerClose,
3995
+ DrawerContent,
3319
3996
  DrawerDescription,
3320
3997
  DrawerFooter,
3321
3998
  DrawerHeader,
3322
3999
  DrawerTitle,
4000
+ DrawerTrigger,
3323
4001
  DropdownMenu,
4002
+ DropdownMenuContent,
3324
4003
  DropdownMenuGroup,
3325
4004
  DropdownMenuItem,
3326
4005
  DropdownMenuLabel,
@@ -3367,7 +4046,6 @@ export {
3367
4046
  MenuItem,
3368
4047
  MenuTrigger,
3369
4048
  MetricCard,
3370
- ModalDialog,
3371
4049
  OtpInput2 as OtpInput,
3372
4050
  PageHeader,
3373
4051
  PageHeaderActions,
@@ -3396,6 +4074,7 @@ export {
3396
4074
  SheetTrigger,
3397
4075
  Sidebar,
3398
4076
  SidebarContent,
4077
+ SidebarContext,
3399
4078
  SidebarFooter,
3400
4079
  SidebarGroup,
3401
4080
  SidebarHeader,
@@ -3431,6 +4110,7 @@ export {
3431
4110
  ToolbarGroup,
3432
4111
  ToolbarSpacer,
3433
4112
  Tooltip,
4113
+ TooltipContent,
3434
4114
  TooltipTrigger,
3435
4115
  actionRipple,
3436
4116
  alertVariants,