@doscientos/ui 0.1.7 → 0.1.9

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
@@ -143,7 +143,7 @@ function getTextMatchParts(text, query) {
143
143
 
144
144
  // src/ui/accordion/accordion.tsx
145
145
  import { Disclosure as AriaDisclosure, DisclosureGroup as AriaDisclosureGroup, DisclosurePanel as AriaDisclosurePanel, Button } from "react-aria-components";
146
- import { CaretDownIcon } from "@phosphor-icons/react";
146
+ import { ChevronDown } from "lucide-react";
147
147
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
148
148
  function Accordion({ className, ...props }) {
149
149
  return /* @__PURE__ */ jsx(AriaDisclosureGroup, { "data-slot": "accordion", className: cn("flex w-full flex-col", className), ...props });
@@ -154,7 +154,7 @@ function AccordionItem({ className, ...props }) {
154
154
  function AccordionTrigger({ className, children, ...props }) {
155
155
  return /* @__PURE__ */ jsx(Button, { "data-slot": "accordion-trigger", className: cn("group/accordion-trigger flex w-full items-center justify-between py-3 text-left text-sm font-medium outline-none transition-colors hover:text-primary focus-visible:ring-3 focus-visible:ring-ring/50", className), ...props, children: (values) => /* @__PURE__ */ jsxs(Fragment, { children: [
156
156
  /* @__PURE__ */ jsx("span", { children: typeof children === "function" ? children(values) : children }),
157
- /* @__PURE__ */ jsx(CaretDownIcon, { "aria-hidden": "true", weight: "bold", className: "size-4 transition-transform group-data-expanded/accordion-trigger:rotate-180 motion-reduce:transition-none" })
157
+ /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: "size-4 transition-transform group-data-expanded/accordion-trigger:rotate-180 motion-reduce:transition-none" })
158
158
  ] }) });
159
159
  }
160
160
  function AccordionContent({ className, ...props }) {
@@ -184,17 +184,75 @@ function AlertAction({ className, children, ...props }) {
184
184
 
185
185
  // src/ui/app-shell/app-shell.tsx
186
186
  import { jsx as jsx3 } from "react/jsx-runtime";
187
- function AppShell({ className, ...props }) {
188
- return /* @__PURE__ */ jsx3("div", { "data-slot": "app-shell", className: cn("flex min-h-screen w-full bg-muted/30 text-foreground", className), ...props });
187
+ function AppShell({
188
+ className,
189
+ sidebarBreakpoint = "md",
190
+ ...props
191
+ }) {
192
+ return /* @__PURE__ */ jsx3(
193
+ "div",
194
+ {
195
+ "data-slot": "app-shell",
196
+ "data-sidebar-breakpoint": sidebarBreakpoint,
197
+ className: cn("bg-background text-foreground", className),
198
+ ...props
199
+ }
200
+ );
201
+ }
202
+ function AppShellSidebar({ className, ...props }) {
203
+ return /* @__PURE__ */ jsx3(
204
+ "aside",
205
+ {
206
+ "data-slot": "app-shell-sidebar",
207
+ className: cn("w-56 shrink-0 border-r border-border bg-card text-foreground", className),
208
+ ...props
209
+ }
210
+ );
189
211
  }
190
212
  function AppShellMain({ className, ...props }) {
191
- return /* @__PURE__ */ jsx3("main", { "data-slot": "app-shell-main", className: cn("min-w-0 flex-1", className), ...props });
213
+ return /* @__PURE__ */ jsx3("main", { "data-slot": "app-shell-main", className: cn("bg-background", className), ...props });
192
214
  }
193
215
  function AppShellHeader({ className, ...props }) {
194
- return /* @__PURE__ */ jsx3("header", { "data-slot": "app-shell-header", className: cn("sticky top-0 z-10 flex min-h-14 items-center border-b border-border bg-background/85 px-4 backdrop-blur-md supports-[backdrop-filter]:bg-background/70", className), ...props });
216
+ return /* @__PURE__ */ jsx3(
217
+ "header",
218
+ {
219
+ "data-slot": "app-shell-header",
220
+ className: cn("border-b border-border bg-background px-4", className),
221
+ ...props
222
+ }
223
+ );
224
+ }
225
+ function AppShellMobileHeader({
226
+ className,
227
+ ...props
228
+ }) {
229
+ return /* @__PURE__ */ jsx3(
230
+ "header",
231
+ {
232
+ "data-slot": "app-shell-mobile-header",
233
+ className: cn("h-14 shrink-0 items-center gap-2 border-b border-border bg-background px-3", className),
234
+ ...props
235
+ }
236
+ );
195
237
  }
196
- function AppShellContent({ className, ...props }) {
197
- return /* @__PURE__ */ jsx3("div", { "data-slot": "app-shell-content", className: cn("mx-auto w-full max-w-[1600px] p-4 md:p-6", className), ...props });
238
+ function AppShellContent({
239
+ className,
240
+ size = "wide",
241
+ padded = true,
242
+ scrollable = true,
243
+ ...props
244
+ }) {
245
+ return /* @__PURE__ */ jsx3(
246
+ "div",
247
+ {
248
+ "data-slot": "app-shell-content",
249
+ "data-size": size,
250
+ "data-padded": padded || void 0,
251
+ "data-scrollable": scrollable || void 0,
252
+ className,
253
+ ...props
254
+ }
255
+ );
198
256
  }
199
257
 
200
258
  // src/ui/avatar/avatar.tsx
@@ -262,10 +320,19 @@ function BreadcrumbSeparator({ children = "/", className, ...props }) {
262
320
  return /* @__PURE__ */ jsx6("span", { "data-slot": "breadcrumb-separator", "aria-hidden": "true", className: cn("text-muted-foreground/60", className), ...props, children });
263
321
  }
264
322
 
323
+ // src/ui/button-group/button-group.tsx
324
+ import { jsx as jsx7 } from "react/jsx-runtime";
325
+ function ButtonGroup({ className, ...props }) {
326
+ return /* @__PURE__ */ jsx7("div", { role: "group", "data-slot": "button-group", className: cn("inline-flex items-center gap-2", className), ...props });
327
+ }
328
+ function ButtonGroupText({ className, ...props }) {
329
+ return /* @__PURE__ */ jsx7("span", { "data-slot": "button-group-text", className: cn("text-sm text-muted-foreground", className), ...props });
330
+ }
331
+
265
332
  // src/ui/button/button.tsx
266
333
  import { cva as cva2 } from "class-variance-authority";
267
334
  import { Button as AriaButton } from "react-aria-components";
268
- import { jsx as jsx7 } from "react/jsx-runtime";
335
+ import { jsx as jsx8 } from "react/jsx-runtime";
269
336
  var buttonVariants = cva2(
270
337
  "inline-flex shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg border border-transparent text-sm font-medium whitespace-nowrap transition-[background-color,border-color,color,box-shadow,transform] duration-150 outline-none focus-visible:ring-3 focus-visible:ring-ring/50 data-pressed:scale-[0.98] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 motion-reduce:transition-none motion-reduce:data-pressed:transform-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
271
338
  {
@@ -290,16 +357,7 @@ var buttonVariants = cva2(
290
357
  }
291
358
  );
292
359
  function Button2({ className, variant, size, ...props }) {
293
- return /* @__PURE__ */ jsx7(AriaButton, { "data-slot": "button", className: cn(buttonVariants({ variant, size }), className), ...props });
294
- }
295
-
296
- // src/ui/button-group/button-group.tsx
297
- import { jsx as jsx8 } from "react/jsx-runtime";
298
- function ButtonGroup({ className, ...props }) {
299
- return /* @__PURE__ */ jsx8("div", { role: "group", "data-slot": "button-group", className: cn("inline-flex items-center gap-2", className), ...props });
300
- }
301
- function ButtonGroupText({ className, ...props }) {
302
- return /* @__PURE__ */ jsx8("span", { "data-slot": "button-group-text", className: cn("text-sm text-muted-foreground", className), ...props });
360
+ return /* @__PURE__ */ jsx8(AriaButton, { "data-slot": "button", className: cn(buttonVariants({ variant, size }), className), ...props });
303
361
  }
304
362
 
305
363
  // src/ui/card/card.tsx
@@ -327,11 +385,11 @@ function CardFooter({ className, ...props }) {
327
385
  import {
328
386
  Checkbox as AriaCheckbox
329
387
  } from "react-aria-components";
330
- import { CheckIcon } from "@phosphor-icons/react";
388
+ import { Check } from "lucide-react";
331
389
  import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs2 } from "react/jsx-runtime";
332
390
  function Checkbox({ className, children, ...props }) {
333
391
  return /* @__PURE__ */ jsx10(AriaCheckbox, { "data-slot": "checkbox", className: cn("group inline-flex items-center gap-2 text-sm text-foreground data-disabled:cursor-not-allowed data-disabled:opacity-50", className), ...props, children: (state) => /* @__PURE__ */ jsxs2(Fragment2, { children: [
334
- /* @__PURE__ */ jsx10("span", { "aria-hidden": "true", 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", children: /* @__PURE__ */ jsx10(CheckIcon, { weight: "bold", className: "size-3 opacity-0 transition-opacity group-data-selected:opacity-100 motion-reduce:transition-none" }) }),
392
+ /* @__PURE__ */ jsx10("span", { "aria-hidden": "true", 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", children: /* @__PURE__ */ jsx10(Check, { className: "size-3 opacity-0 transition-opacity group-data-selected:opacity-100 motion-reduce:transition-none" }) }),
335
393
  typeof children === "function" ? children(state) : children
336
394
  ] }) });
337
395
  }
@@ -414,9 +472,8 @@ function CommandItem({ className, ...props }) {
414
472
  return /* @__PURE__ */ jsx12(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 });
415
473
  }
416
474
 
417
- // src/ui/dialog/dialog.tsx
418
- import { createContext, useContext } from "react";
419
- import { XIcon } from "@phosphor-icons/react";
475
+ // src/ui/modal-dialog/modal-dialog.tsx
476
+ import { X } from "lucide-react";
420
477
  import {
421
478
  Dialog as AriaDialog,
422
479
  Heading,
@@ -424,50 +481,114 @@ import {
424
481
  ModalOverlay,
425
482
  Text as Text2
426
483
  } from "react-aria-components";
427
- import { jsx as jsx13, jsxs as jsxs4 } from "react/jsx-runtime";
428
- var DialogCloseContext = createContext(null);
429
- function Dialog({ open, children, ...props }) {
430
- return /* @__PURE__ */ jsx13(ModalOverlay, { isOpen: open, 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", ...props, children });
431
- }
432
- function DialogClose({ onPress, ...props }) {
433
- const close = useContext(DialogCloseContext);
434
- return /* @__PURE__ */ jsx13(Button2, { onPress: (event) => {
435
- onPress?.(event);
436
- close?.();
437
- }, ...props });
438
- }
439
- function DialogContent({ className, children, showCloseButton = true, ...props }) {
440
- return /* @__PURE__ */ jsx13(Modal, { className: "w-full max-w-md outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out", children: /* @__PURE__ */ jsx13(AriaDialog, { "data-slot": "dialog-content", className: cn("relative grid max-h-[calc(100dvh-2rem)] gap-4 overflow-y-auto rounded-xl bg-background p-5 text-foreground shadow-xl outline-none", className), ...props, children: ({ close }) => /* @__PURE__ */ jsxs4(DialogCloseContext.Provider, { value: close, children: [
441
- typeof children === "function" ? children({ close }) : children,
442
- showCloseButton && /* @__PURE__ */ jsx13(DialogClose, { "aria-label": "Cerrar di\xE1logo", variant: "ghost", size: "icon", className: "absolute top-2 right-2", children: /* @__PURE__ */ jsx13(XIcon, { "aria-hidden": "true", weight: "bold", className: "size-4" }) })
443
- ] }) }) });
444
- }
445
- function DialogHeader({ className, ...props }) {
446
- return /* @__PURE__ */ jsx13("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2", className), ...props });
447
- }
448
- function DialogFooter({ className, ...props }) {
449
- return /* @__PURE__ */ jsx13("div", { "data-slot": "dialog-footer", className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className), ...props });
450
- }
451
- function DialogTitle({ className, ...props }) {
452
- return /* @__PURE__ */ jsx13(Heading, { slot: "title", className: cn("text-base font-semibold", className), ...props });
453
- }
454
- function DialogDescription({ className, ...props }) {
455
- return /* @__PURE__ */ jsx13(Text2, { slot: "description", className: cn("text-sm text-muted-foreground", className), ...props });
484
+ import { Fragment as Fragment4, jsx as jsx13, jsxs as jsxs4 } from "react/jsx-runtime";
485
+ var sizeClasses = {
486
+ sm: "w-[min(calc(100dvw-2rem),24rem)]",
487
+ md: "w-[min(calc(100dvw-2rem),28rem)]",
488
+ lg: "w-[min(calc(100dvw-2rem),36rem)]"
489
+ };
490
+ function ModalDialog({
491
+ open,
492
+ onOpenChange,
493
+ title,
494
+ description,
495
+ children,
496
+ footer,
497
+ size = "sm",
498
+ showCloseButton = true,
499
+ className,
500
+ footerClassName,
501
+ ...props
502
+ }) {
503
+ const layoutClass = children ? footer ? "grid-rows-[auto_minmax(0,1fr)_auto]" : "grid-rows-[auto_minmax(0,1fr)]" : "grid-rows-[auto_auto]";
504
+ return /* @__PURE__ */ jsx13(
505
+ ModalOverlay,
506
+ {
507
+ isOpen: open,
508
+ onOpenChange,
509
+ 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",
510
+ ...props,
511
+ children: /* @__PURE__ */ jsx13(
512
+ Modal,
513
+ {
514
+ className: cn(
515
+ "max-h-[calc(100dvh-2rem)] outline-none motion-safe:data-entering:animate-ui-surface-in motion-safe:data-exiting:animate-ui-surface-out",
516
+ sizeClasses[size],
517
+ className
518
+ ),
519
+ children: /* @__PURE__ */ jsx13(
520
+ AriaDialog,
521
+ {
522
+ className: cn(
523
+ "grid max-h-[calc(100dvh-2rem)] overflow-hidden rounded-xl bg-background text-foreground shadow-xl outline-none",
524
+ layoutClass
525
+ ),
526
+ children: ({ close }) => /* @__PURE__ */ jsxs4(Fragment4, { children: [
527
+ /* @__PURE__ */ jsxs4("header", { "data-slot": "modal-dialog-header", className: "flex items-start gap-3 border-b border-border px-5 py-4", children: [
528
+ /* @__PURE__ */ jsxs4("div", { className: "min-w-0 flex-1", children: [
529
+ /* @__PURE__ */ jsx13(Heading, { slot: "title", className: "font-heading text-base leading-none font-medium", children: title }),
530
+ description ? /* @__PURE__ */ jsx13(Text2, { slot: "description", className: "mt-2 text-sm text-muted-foreground", children: description }) : null
531
+ ] }),
532
+ showCloseButton ? /* @__PURE__ */ jsx13(
533
+ Button2,
534
+ {
535
+ "aria-label": "Cerrar di\xE1logo",
536
+ variant: "ghost",
537
+ size: "icon",
538
+ className: "-mr-2 -mt-1",
539
+ onPress: close,
540
+ children: /* @__PURE__ */ jsx13(X, { "aria-hidden": "true", className: "size-4" })
541
+ }
542
+ ) : null
543
+ ] }),
544
+ children ? /* @__PURE__ */ jsx13("div", { "data-slot": "modal-dialog-body", className: "min-h-0 overflow-y-auto px-5 py-4", children }) : null,
545
+ footer ? /* @__PURE__ */ jsx13(
546
+ "footer",
547
+ {
548
+ "data-slot": "modal-dialog-footer",
549
+ className: cn(
550
+ "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",
551
+ footerClassName
552
+ ),
553
+ children: footer
554
+ }
555
+ ) : null
556
+ ] })
557
+ }
558
+ )
559
+ }
560
+ )
561
+ }
562
+ );
456
563
  }
457
564
 
458
565
  // src/ui/confirm-dialog/confirm-dialog.tsx
459
- import { jsx as jsx14, jsxs as jsxs5 } from "react/jsx-runtime";
460
- function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel = "Confirmar", cancelLabel = "Cancelar", destructive = false, pending = false, onConfirm }) {
461
- return /* @__PURE__ */ jsx14(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs5(DialogContent, { showCloseButton: false, children: [
462
- /* @__PURE__ */ jsxs5(DialogHeader, { children: [
463
- /* @__PURE__ */ jsx14(DialogTitle, { children: title }),
464
- description && /* @__PURE__ */ jsx14(DialogDescription, { children: description })
465
- ] }),
466
- /* @__PURE__ */ jsxs5(DialogFooter, { children: [
467
- /* @__PURE__ */ jsx14(Button2, { variant: "outline", isDisabled: pending, onPress: () => onOpenChange(false), children: cancelLabel }),
468
- /* @__PURE__ */ jsx14(Button2, { variant: destructive ? "destructive" : "default", isDisabled: pending, onPress: onConfirm, children: confirmLabel })
469
- ] })
470
- ] }) });
566
+ import { Fragment as Fragment5, jsx as jsx14, jsxs as jsxs5 } from "react/jsx-runtime";
567
+ function ConfirmDialog({
568
+ open,
569
+ onOpenChange,
570
+ title,
571
+ description,
572
+ confirmLabel = "Confirmar",
573
+ cancelLabel = "Cancelar",
574
+ destructive = false,
575
+ pending = false,
576
+ onConfirm
577
+ }) {
578
+ return /* @__PURE__ */ jsx14(
579
+ ModalDialog,
580
+ {
581
+ open,
582
+ onOpenChange,
583
+ title,
584
+ description,
585
+ showCloseButton: false,
586
+ footer: /* @__PURE__ */ jsxs5(Fragment5, { children: [
587
+ /* @__PURE__ */ jsx14(Button2, { variant: "outline", isDisabled: pending, onPress: () => onOpenChange(false), children: cancelLabel }),
588
+ /* @__PURE__ */ jsx14(Button2, { variant: destructive ? "destructive" : "default", isDisabled: pending, onPress: onConfirm, children: confirmLabel })
589
+ ] })
590
+ }
591
+ );
471
592
  }
472
593
 
473
594
  // src/ui/drawer/drawer.tsx
@@ -543,7 +664,7 @@ function FieldError2({ className, children, ...props }) {
543
664
 
544
665
  // src/ui/form-feedback/form-feedback.tsx
545
666
  import { useCallback as useCallback3, useEffect as useEffect3, useRef as useRef3, useState as useState6 } from "react";
546
- import { CheckCircleIcon, CircleNotchIcon, WarningCircleIcon } from "@phosphor-icons/react";
667
+ import { CheckCircle, LoaderCircle, CircleAlert } from "lucide-react";
547
668
  import { jsx as jsx20, jsxs as jsxs6 } from "react/jsx-runtime";
548
669
  function useFormFeedback(options) {
549
670
  const resetMs = options?.successResetMs ?? 2500;
@@ -578,22 +699,22 @@ function FormFeedback({ state, className, pendingLabel = "Guardando\u2026", succ
578
699
  const error = state.status === "error";
579
700
  const success = state.status === "success";
580
701
  return /* @__PURE__ */ jsxs6("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: [
581
- state.status === "pending" && /* @__PURE__ */ jsx20(CircleNotchIcon, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
582
- success && /* @__PURE__ */ jsx20(CheckCircleIcon, { "aria-hidden": "true", className: "size-3.5", weight: "fill" }),
583
- error && /* @__PURE__ */ jsx20(WarningCircleIcon, { "aria-hidden": "true", className: "size-3.5", weight: "fill" }),
702
+ state.status === "pending" && /* @__PURE__ */ jsx20(LoaderCircle, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
703
+ success && /* @__PURE__ */ jsx20(CheckCircle, { "aria-hidden": "true", className: "size-3.5" }),
704
+ error && /* @__PURE__ */ jsx20(CircleAlert, { "aria-hidden": "true", className: "size-3.5" }),
584
705
  /* @__PURE__ */ jsx20("span", { children: state.status === "pending" ? pendingLabel : success ? state.message ?? successLabel : state.message })
585
706
  ] });
586
707
  }
587
708
 
588
709
  // src/ui/form-row/form-row.tsx
589
- import { Fragment as Fragment4, jsx as jsx21, jsxs as jsxs7 } from "react/jsx-runtime";
710
+ import { Fragment as Fragment6, jsx as jsx21, jsxs as jsxs7 } from "react/jsx-runtime";
590
711
  function FormRow({ label, htmlFor, required, hint, error, className, children }) {
591
712
  const hintId = hint ? `${htmlFor}-hint` : void 0;
592
713
  const errorId = error ? `${htmlFor}-error` : void 0;
593
714
  return /* @__PURE__ */ jsxs7("div", { "data-slot": "form-row", className: cn("flex flex-col gap-1.5", className), children: [
594
715
  /* @__PURE__ */ jsxs7("label", { htmlFor, className: "text-sm font-medium text-foreground", children: [
595
716
  label,
596
- required && /* @__PURE__ */ jsxs7(Fragment4, { children: [
717
+ required && /* @__PURE__ */ jsxs7(Fragment6, { children: [
597
718
  /* @__PURE__ */ jsx21("span", { "aria-hidden": "true", className: "ml-0.5 text-destructive", children: "*" }),
598
719
  /* @__PURE__ */ jsx21("span", { className: "sr-only", children: " (obligatorio)" })
599
720
  ] })
@@ -659,6 +780,9 @@ function IconButton({
659
780
  ] });
660
781
  }
661
782
 
783
+ // src/ui/input-group/input-group.tsx
784
+ import { cva as cva3 } from "class-variance-authority";
785
+
662
786
  // src/ui/input/input.tsx
663
787
  import { forwardRef as forwardRef2 } from "react";
664
788
  import { Input as AriaInput2 } from "react-aria-components";
@@ -668,9 +792,6 @@ var InputImpl = forwardRef2(function Input2({ className, type, ...props }, ref)
668
792
  });
669
793
  var Input3 = InputImpl;
670
794
 
671
- // src/ui/input-group/input-group.tsx
672
- import { cva as cva3 } from "class-variance-authority";
673
-
674
795
  // src/ui/textarea/textarea.tsx
675
796
  import { forwardRef as forwardRef3 } from "react";
676
797
  import { TextArea as AriaTextArea } from "react-aria-components";
@@ -712,11 +833,11 @@ function KbdGroup({ className, ...props }) {
712
833
  }
713
834
 
714
835
  // src/ui/loading-overlay/loading-overlay.tsx
715
- import { CircleNotchIcon as CircleNotchIcon2 } from "@phosphor-icons/react";
836
+ import { LoaderCircle as LoaderCircle2 } from "lucide-react";
716
837
  import { jsx as jsx28, jsxs as jsxs9 } from "react/jsx-runtime";
717
838
  function LoadingOverlay({ label = "Cargando", className, ...props }) {
718
839
  return /* @__PURE__ */ jsx28("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__ */ jsxs9("div", { className: "flex items-center gap-2 rounded-lg border border-border bg-background px-3 py-2 text-sm shadow-sm", children: [
719
- /* @__PURE__ */ jsx28(CircleNotchIcon2, { className: "animate-spin", "aria-hidden": "true" }),
840
+ /* @__PURE__ */ jsx28(LoaderCircle2, { className: "animate-spin", "aria-hidden": "true" }),
720
841
  /* @__PURE__ */ jsx28("span", { children: label })
721
842
  ] }) });
722
843
  }
@@ -759,7 +880,7 @@ function PageHeaderActions({ className, ...props }) {
759
880
  }
760
881
 
761
882
  // src/ui/pagination/pagination.tsx
762
- import { CaretLeftIcon, CaretRightIcon } from "@phosphor-icons/react";
883
+ import { ChevronLeft, ChevronRight } from "lucide-react";
763
884
  import { jsx as jsx31, jsxs as jsxs10 } from "react/jsx-runtime";
764
885
  function Pagination({ page, pageCount, onPageChange, className }) {
765
886
  const pages = Array.from({ length: pageCount }, (_, index) => index + 1);
@@ -771,9 +892,9 @@ function Pagination({ page, pageCount, onPageChange, className }) {
771
892
  pageCount
772
893
  ] }),
773
894
  /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-1", children: [
774
- /* @__PURE__ */ jsx31(Button2, { "aria-label": "P\xE1gina anterior", isDisabled: page <= 1, onPress: () => onPageChange(page - 1), size: "icon", variant: "ghost", children: /* @__PURE__ */ jsx31(CaretLeftIcon, {}) }),
895
+ /* @__PURE__ */ jsx31(Button2, { "aria-label": "P\xE1gina anterior", isDisabled: page <= 1, onPress: () => onPageChange(page - 1), size: "icon", variant: "ghost", children: /* @__PURE__ */ jsx31(ChevronLeft, {}) }),
775
896
  pages.map((item) => /* @__PURE__ */ jsx31(Button2, { "aria-current": item === page ? "page" : void 0, "aria-label": `P\xE1gina ${item}`, onPress: () => onPageChange(item), size: "icon", variant: item === page ? "secondary" : "ghost", children: item }, item)),
776
- /* @__PURE__ */ jsx31(Button2, { "aria-label": "P\xE1gina siguiente", isDisabled: page >= pageCount, onPress: () => onPageChange(page + 1), size: "icon", variant: "ghost", children: /* @__PURE__ */ jsx31(CaretRightIcon, {}) })
897
+ /* @__PURE__ */ jsx31(Button2, { "aria-label": "P\xE1gina siguiente", isDisabled: page >= pageCount, onPress: () => onPageChange(page + 1), size: "icon", variant: "ghost", children: /* @__PURE__ */ jsx31(ChevronRight, {}) })
777
898
  ] })
778
899
  ] });
779
900
  }
@@ -791,7 +912,7 @@ function Popover4({ className, ...props }) {
791
912
  var PopoverContent = Popover4;
792
913
 
793
914
  // src/ui/quantity-input/quantity-input.tsx
794
- import { MinusIcon, PlusIcon } from "@phosphor-icons/react";
915
+ import { Minus, Plus } from "lucide-react";
795
916
  import {
796
917
  Button as AriaButton2,
797
918
  Group as AriaGroup,
@@ -822,9 +943,9 @@ function QuantityInput({
822
943
  "data-slot": "quantity-input-group",
823
944
  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",
824
945
  children: [
825
- /* @__PURE__ */ jsx33(AriaButton2, { 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__ */ jsx33(MinusIcon, { "aria-hidden": "true", weight: "bold", className: "size-4" }) }),
946
+ /* @__PURE__ */ jsx33(AriaButton2, { 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__ */ jsx33(Minus, { "aria-hidden": "true", className: "size-4" }) }),
826
947
  /* @__PURE__ */ jsx33(AriaInput3, { "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) }),
827
- /* @__PURE__ */ jsx33(AriaButton2, { 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__ */ jsx33(PlusIcon, { "aria-hidden": "true", weight: "bold", className: "size-4" }) })
948
+ /* @__PURE__ */ jsx33(AriaButton2, { 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__ */ jsx33(Plus, { "aria-hidden": "true", className: "size-4" }) })
828
949
  ]
829
950
  }
830
951
  )
@@ -838,13 +959,13 @@ import {
838
959
  Button as Button3,
839
960
  Input as Input4
840
961
  } from "react-aria-components";
841
- import { XIcon as XIcon2 } from "@phosphor-icons/react";
962
+ import { X as X2 } from "lucide-react";
842
963
  import { jsx as jsx34 } from "react/jsx-runtime";
843
964
  var SearchField = AriaSearchField;
844
965
  function SearchInput({ className, ...props }) {
845
966
  return /* @__PURE__ */ jsx34(Input4, { "data-slot": "search-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", className), ...props });
846
967
  }
847
- function SearchClearButton({ className, children = /* @__PURE__ */ jsx34(XIcon2, { "aria-hidden": "true", weight: "bold", className: "size-4" }), ...props }) {
968
+ function SearchClearButton({ className, children = /* @__PURE__ */ jsx34(X2, { "aria-hidden": "true", className: "size-4" }), ...props }) {
848
969
  return /* @__PURE__ */ jsx34(Button3, { slot: "clear", "data-slot": "search-clear", className: cn("absolute top-1/2 right-1 rounded p-1 text-muted-foreground outline-none hover:bg-muted data-focus-visible:ring-2 data-focus-visible:ring-ring", className), ...props, children });
849
970
  }
850
971
 
@@ -857,13 +978,13 @@ import {
857
978
  ListBoxItem as ListBoxItem3,
858
979
  Popover as Popover5
859
980
  } from "react-aria-components";
860
- import { CaretDownIcon as CaretDownIcon2 } from "@phosphor-icons/react";
861
- import { Fragment as Fragment5, jsx as jsx35, jsxs as jsxs12 } from "react/jsx-runtime";
981
+ import { ChevronDown as ChevronDown2 } from "lucide-react";
982
+ import { Fragment as Fragment7, jsx as jsx35, jsxs as jsxs12 } from "react/jsx-runtime";
862
983
  var Select = AriaSelect;
863
984
  function SelectTrigger({ className, children, ...props }) {
864
- return /* @__PURE__ */ jsx35(AriaButton3, { "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__ */ jsxs12(Fragment5, { children: [
985
+ return /* @__PURE__ */ jsx35(AriaButton3, { "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__ */ jsxs12(Fragment7, { children: [
865
986
  typeof children === "function" ? children(state) : children,
866
- /* @__PURE__ */ jsx35(CaretDownIcon2, { "aria-hidden": "true", weight: "bold", className: "ml-auto size-4 text-muted-foreground transition-transform group-data-pressed/select-trigger:rotate-180 motion-reduce:transition-none" })
987
+ /* @__PURE__ */ jsx35(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" })
867
988
  ] }) });
868
989
  }
869
990
  function SelectValue({ className, ...props }) {
@@ -888,22 +1009,22 @@ function Separator({ className, orientation = "horizontal", ...props }) {
888
1009
 
889
1010
  // src/ui/sidebar/sidebar.tsx
890
1011
  import {
891
- CaretLeftIcon as CaretLeftIcon2,
892
- CaretRightIcon as CaretRightIcon2,
893
- DotsThreeIcon,
894
- MagnifyingGlassIcon
895
- } from "@phosphor-icons/react";
1012
+ ChevronLeft as ChevronLeft2,
1013
+ ChevronRight as ChevronRight2,
1014
+ Ellipsis,
1015
+ Search
1016
+ } from "lucide-react";
896
1017
  import {
897
- createContext as createContext2,
898
- useContext as useContext2,
1018
+ createContext,
1019
+ useContext,
899
1020
  useMemo as useMemo2,
900
1021
  useState as useState7
901
1022
  } from "react";
902
1023
  import { Link as Link2 } from "react-aria-components";
903
- import { Fragment as Fragment6, jsx as jsx37, jsxs as jsxs13 } from "react/jsx-runtime";
904
- var SidebarContext = createContext2(null);
1024
+ import { Fragment as Fragment8, jsx as jsx37, jsxs as jsxs13 } from "react/jsx-runtime";
1025
+ var SidebarContext = createContext(null);
905
1026
  function useSidebar() {
906
- const context = useContext2(SidebarContext);
1027
+ const context = useContext(SidebarContext);
907
1028
  if (!context)
908
1029
  throw new Error("useSidebar must be used inside SidebarProvider");
909
1030
  return context;
@@ -971,7 +1092,7 @@ function SidebarSearch({
971
1092
  ),
972
1093
  ...props,
973
1094
  children: [
974
- /* @__PURE__ */ jsx37(MagnifyingGlassIcon, { className: "size-4 shrink-0" }),
1095
+ /* @__PURE__ */ jsx37(Search, { className: "size-4 shrink-0" }),
975
1096
  /* @__PURE__ */ jsx37("span", { className: "flex-1 text-left", children: label }),
976
1097
  /* @__PURE__ */ jsx37("kbd", { className: "rounded bg-secondary px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: shortcut })
977
1098
  ]
@@ -1060,7 +1181,7 @@ function SidebarItem({
1060
1181
  typeof className === "function" ? className : className
1061
1182
  ),
1062
1183
  ...props,
1063
- children: (values) => /* @__PURE__ */ jsxs13(Fragment6, { children: [
1184
+ children: (values) => /* @__PURE__ */ jsxs13(Fragment8, { children: [
1064
1185
  /* @__PURE__ */ jsx37("span", { className: "flex size-4 shrink-0 items-center justify-center", children: icon }),
1065
1186
  /* @__PURE__ */ jsx37(
1066
1187
  "span",
@@ -1098,7 +1219,7 @@ function SidebarTrigger({ className, ...props }) {
1098
1219
  variant: "ghost",
1099
1220
  className: cn("ml-auto", className),
1100
1221
  ...props,
1101
- children: collapsed ? /* @__PURE__ */ jsx37(CaretRightIcon2, {}) : /* @__PURE__ */ jsx37(CaretLeftIcon2, {})
1222
+ children: collapsed ? /* @__PURE__ */ jsx37(ChevronRight2, {}) : /* @__PURE__ */ jsx37(ChevronLeft2, {})
1102
1223
  }
1103
1224
  );
1104
1225
  }
@@ -1130,7 +1251,7 @@ function SidebarMore({ className, ...props }) {
1130
1251
  variant: "ghost",
1131
1252
  className: cn("size-7", className),
1132
1253
  ...props,
1133
- children: /* @__PURE__ */ jsx37(DotsThreeIcon, { weight: "bold" })
1254
+ children: /* @__PURE__ */ jsx37(Ellipsis, {})
1134
1255
  }
1135
1256
  );
1136
1257
  }
@@ -1143,13 +1264,13 @@ function Skeleton({ className, ...props }) {
1143
1264
 
1144
1265
  // src/ui/submit-button/submit-button.tsx
1145
1266
  import { useFormStatus } from "react-dom";
1146
- import { CircleNotchIcon as CircleNotchIcon3 } from "@phosphor-icons/react";
1147
- import { Fragment as Fragment7, jsx as jsx39, jsxs as jsxs14 } from "react/jsx-runtime";
1267
+ import { LoaderCircle as LoaderCircle3 } from "lucide-react";
1268
+ import { Fragment as Fragment9, jsx as jsx39, jsxs as jsxs14 } from "react/jsx-runtime";
1148
1269
  function SubmitButton({ pendingLabel = "Guardando\u2026", loading = false, children, isDisabled, size = "sm", ...props }) {
1149
1270
  const { pending } = useFormStatus();
1150
1271
  const busy = pending || loading;
1151
- return /* @__PURE__ */ jsx39(Button2, { type: "submit", size, isDisabled: busy || isDisabled, "aria-busy": busy || void 0, ...props, children: busy ? /* @__PURE__ */ jsxs14(Fragment7, { children: [
1152
- /* @__PURE__ */ jsx39(CircleNotchIcon3, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
1272
+ return /* @__PURE__ */ jsx39(Button2, { type: "submit", size, isDisabled: busy || isDisabled, "aria-busy": busy || void 0, ...props, children: busy ? /* @__PURE__ */ jsxs14(Fragment9, { children: [
1273
+ /* @__PURE__ */ jsx39(LoaderCircle3, { "aria-hidden": "true", className: "size-3.5 animate-spin" }),
1153
1274
  pendingLabel
1154
1275
  ] }) : children });
1155
1276
  }
@@ -1159,7 +1280,7 @@ import {
1159
1280
  SwitchButton as AriaSwitchButton,
1160
1281
  SwitchField as AriaSwitchField
1161
1282
  } from "react-aria-components";
1162
- import { Fragment as Fragment8, jsx as jsx40, jsxs as jsxs15 } from "react/jsx-runtime";
1283
+ import { Fragment as Fragment10, jsx as jsx40, jsxs as jsxs15 } from "react/jsx-runtime";
1163
1284
  var sizeStyles = {
1164
1285
  sm: { track: "h-5 w-9 p-0.5", thumb: "size-4", travel: "group-data-selected/switch:translate-x-4" },
1165
1286
  md: { track: "h-6 w-11 p-0.5", thumb: "size-5", travel: "group-data-selected/switch:translate-x-5" }
@@ -1176,7 +1297,7 @@ function Switch({ className, children, size = "sm", ...props }) {
1176
1297
  "data-disabled:cursor-not-allowed data-disabled:opacity-50",
1177
1298
  typeof className === "function" ? className(state) : className
1178
1299
  ),
1179
- children: (state) => /* @__PURE__ */ jsxs15(Fragment8, { children: [
1300
+ children: (state) => /* @__PURE__ */ jsxs15(Fragment10, { children: [
1180
1301
  /* @__PURE__ */ jsx40(
1181
1302
  "span",
1182
1303
  {
@@ -1265,8 +1386,8 @@ function TabsContent({ className, ...props }) {
1265
1386
 
1266
1387
  // src/ui/toast/toast.tsx
1267
1388
  import { useEffect as useEffect4, useSyncExternalStore } from "react";
1268
- import { CheckCircleIcon as CheckCircleIcon2, InfoIcon, WarningCircleIcon as WarningCircleIcon2, XCircleIcon, XIcon as XIcon3 } from "@phosphor-icons/react";
1269
- import { Fragment as Fragment9, jsx as jsx43, jsxs as jsxs16 } from "react/jsx-runtime";
1389
+ import { CheckCircle as CheckCircle2, Info, CircleAlert as CircleAlert2, XCircle, X as X3 } from "lucide-react";
1390
+ import { Fragment as Fragment11, jsx as jsx43, jsxs as jsxs16 } from "react/jsx-runtime";
1270
1391
  var records = [];
1271
1392
  var listeners = /* @__PURE__ */ new Set();
1272
1393
  var snapshot = () => records;
@@ -1311,7 +1432,7 @@ function useToast() {
1311
1432
  return toast;
1312
1433
  }
1313
1434
  function ToastProvider({ children }) {
1314
- return /* @__PURE__ */ jsxs16(Fragment9, { children: [
1435
+ return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1315
1436
  children,
1316
1437
  /* @__PURE__ */ jsx43(Toaster, {})
1317
1438
  ] });
@@ -1325,7 +1446,7 @@ var positionClasses = {
1325
1446
  "bottom-right": "bottom-4 right-4 items-end"
1326
1447
  };
1327
1448
  function Toaster({ position = "bottom-right" }) {
1328
- return /* @__PURE__ */ jsx43(Fragment9, { children: Object.keys(positionClasses).map((item) => /* @__PURE__ */ jsx43(ToastViewport, { position: item, visiblePosition: position }, item)) });
1449
+ return /* @__PURE__ */ jsx43(Fragment11, { children: Object.keys(positionClasses).map((item) => /* @__PURE__ */ jsx43(ToastViewport, { position: item, visiblePosition: position }, item)) });
1329
1450
  }
1330
1451
  function ToastViewport({ position, visiblePosition, className }) {
1331
1452
  const toasts = useSyncExternalStore(subscribe, snapshot, snapshot).filter((item) => item.position === position);
@@ -1338,15 +1459,15 @@ function Toast({ id, title, description, variant = "default", action, state = "o
1338
1459
  const timeout = window.setTimeout(() => dismiss(id), duration);
1339
1460
  return () => window.clearTimeout(timeout);
1340
1461
  }, [duration, id, state]);
1341
- const Icon = variant === "success" ? CheckCircleIcon2 : variant === "error" ? XCircleIcon : variant === "warning" ? WarningCircleIcon2 : variant === "info" ? InfoIcon : InfoIcon;
1462
+ const Icon = variant === "success" ? CheckCircle2 : variant === "error" ? XCircle : variant === "warning" ? CircleAlert2 : variant === "info" ? Info : Info;
1342
1463
  return /* @__PURE__ */ jsx43("div", { role: variant === "error" ? "alert" : "status", "data-state": state, className: cn("pointer-events-auto w-full overflow-hidden rounded-xl border border-border/80 bg-background/95 p-3.5 text-foreground shadow-xl shadow-black/10 backdrop-blur-md animate-ui-toast-in", "data-[state=closing]:animate-ui-toast-out motion-reduce:animate-none", variant === "success" && "border-success/30", variant === "error" && "border-destructive/30", variant === "warning" && "border-warning/40"), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-start gap-3", children: [
1343
- /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", weight: "duotone", className: cn("mt-0.5 size-5 shrink-0", variant === "success" && "text-success", variant === "error" && "text-destructive", variant === "warning" && "text-warning", variant === "info" && "text-primary") }),
1464
+ /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", className: cn("mt-0.5 size-5 shrink-0", variant === "success" && "text-success", variant === "error" && "text-destructive", variant === "warning" && "text-warning", variant === "info" && "text-primary") }),
1344
1465
  /* @__PURE__ */ jsxs16("div", { className: "min-w-0 flex-1", children: [
1345
1466
  /* @__PURE__ */ jsx43("p", { className: "animate-ui-toast-title text-sm font-semibold", children: title }),
1346
1467
  description && /* @__PURE__ */ jsx43("p", { className: "mt-1 max-h-20 animate-ui-toast-description overflow-hidden text-sm leading-5 text-muted-foreground data-[state=closing]:max-h-0", "data-state": state, children: description }),
1347
1468
  action && /* @__PURE__ */ jsx43(Button2, { size: "sm", variant: "link", onPress: action.onPress, className: "mt-1 h-auto px-0", children: action.label })
1348
1469
  ] }),
1349
- /* @__PURE__ */ jsx43(Button2, { "aria-label": "Cerrar notificaci\xF3n", onPress: onDismiss, size: "icon", variant: "ghost", className: "-mr-2 -mt-2 size-7", children: /* @__PURE__ */ jsx43(XIcon3, {}) })
1470
+ /* @__PURE__ */ jsx43(Button2, { "aria-label": "Cerrar notificaci\xF3n", onPress: onDismiss, size: "icon", variant: "ghost", className: "-mr-2 -mt-2 size-7", children: /* @__PURE__ */ jsx43(X3, {}) })
1350
1471
  ] }) });
1351
1472
  }
1352
1473
 
@@ -1374,6 +1495,8 @@ export {
1374
1495
  AppShellContent,
1375
1496
  AppShellHeader,
1376
1497
  AppShellMain,
1498
+ AppShellMobileHeader,
1499
+ AppShellSidebar,
1377
1500
  AutocompleteCombobox,
1378
1501
  Avatar,
1379
1502
  AvatarBadge,
@@ -1409,13 +1532,6 @@ export {
1409
1532
  CommandItem,
1410
1533
  CommandList,
1411
1534
  ConfirmDialog,
1412
- Dialog,
1413
- DialogClose,
1414
- DialogContent,
1415
- DialogDescription,
1416
- DialogFooter,
1417
- DialogHeader,
1418
- DialogTitle,
1419
1535
  Drawer,
1420
1536
  DrawerDescription,
1421
1537
  DrawerFooter,
@@ -1452,6 +1568,7 @@ export {
1452
1568
  MenuContent,
1453
1569
  MenuItem,
1454
1570
  MenuTrigger,
1571
+ ModalDialog,
1455
1572
  PageHeader,
1456
1573
  PageHeaderActions,
1457
1574
  PageHeaderDescription,