@agroshine/ags-web-ui-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +75 -0
  2. package/dist/atoms/index.cjs +134 -0
  3. package/dist/atoms/index.cjs.map +1 -0
  4. package/dist/atoms/index.d.cts +583 -0
  5. package/dist/atoms/index.d.ts +583 -0
  6. package/dist/atoms/index.js +9 -0
  7. package/dist/atoms/index.js.map +1 -0
  8. package/dist/chunk-2KRMLIJQ.cjs +52 -0
  9. package/dist/chunk-2KRMLIJQ.cjs.map +1 -0
  10. package/dist/chunk-2TBYPKQ3.cjs +79 -0
  11. package/dist/chunk-2TBYPKQ3.cjs.map +1 -0
  12. package/dist/chunk-5FWELSEZ.js +1296 -0
  13. package/dist/chunk-5FWELSEZ.js.map +1 -0
  14. package/dist/chunk-5PEOJVY7.cjs +1502 -0
  15. package/dist/chunk-5PEOJVY7.cjs.map +1 -0
  16. package/dist/chunk-6LUGTNMH.js +259 -0
  17. package/dist/chunk-6LUGTNMH.js.map +1 -0
  18. package/dist/chunk-6O2IDBTX.js +112 -0
  19. package/dist/chunk-6O2IDBTX.js.map +1 -0
  20. package/dist/chunk-6YUNWKT3.js +26 -0
  21. package/dist/chunk-6YUNWKT3.js.map +1 -0
  22. package/dist/chunk-7R6OXNES.cjs +321 -0
  23. package/dist/chunk-7R6OXNES.cjs.map +1 -0
  24. package/dist/chunk-A3A7PJWG.cjs +13 -0
  25. package/dist/chunk-A3A7PJWG.cjs.map +1 -0
  26. package/dist/chunk-A7TDGQAB.js +557 -0
  27. package/dist/chunk-A7TDGQAB.js.map +1 -0
  28. package/dist/chunk-C4LX3XTN.cjs +1187 -0
  29. package/dist/chunk-C4LX3XTN.cjs.map +1 -0
  30. package/dist/chunk-DZW4GS2T.cjs +1340 -0
  31. package/dist/chunk-DZW4GS2T.cjs.map +1 -0
  32. package/dist/chunk-E3BTK736.cjs +174 -0
  33. package/dist/chunk-E3BTK736.cjs.map +1 -0
  34. package/dist/chunk-ERGKCXM2.cjs +267 -0
  35. package/dist/chunk-ERGKCXM2.cjs.map +1 -0
  36. package/dist/chunk-FOA46NSG.cjs +574 -0
  37. package/dist/chunk-FOA46NSG.cjs.map +1 -0
  38. package/dist/chunk-JTFCE6RA.js +1156 -0
  39. package/dist/chunk-JTFCE6RA.js.map +1 -0
  40. package/dist/chunk-KINOE57L.js +225 -0
  41. package/dist/chunk-KINOE57L.js.map +1 -0
  42. package/dist/chunk-MOED3QPY.js +11 -0
  43. package/dist/chunk-MOED3QPY.js.map +1 -0
  44. package/dist/chunk-NVR34DY2.cjs +4 -0
  45. package/dist/chunk-NVR34DY2.cjs.map +1 -0
  46. package/dist/chunk-PI3IJWBG.js +79 -0
  47. package/dist/chunk-PI3IJWBG.js.map +1 -0
  48. package/dist/chunk-PXAMTGYY.js +3 -0
  49. package/dist/chunk-PXAMTGYY.js.map +1 -0
  50. package/dist/chunk-QAZMI5VH.js +151 -0
  51. package/dist/chunk-QAZMI5VH.js.map +1 -0
  52. package/dist/chunk-QEG27NX6.js +30 -0
  53. package/dist/chunk-QEG27NX6.js.map +1 -0
  54. package/dist/chunk-THTOUSMG.cjs +52 -0
  55. package/dist/chunk-THTOUSMG.cjs.map +1 -0
  56. package/dist/chunk-UAXKB6IH.cjs +32 -0
  57. package/dist/chunk-UAXKB6IH.cjs.map +1 -0
  58. package/dist/chunk-W5IHWAMM.js +48 -0
  59. package/dist/chunk-W5IHWAMM.js.map +1 -0
  60. package/dist/chunk-X2UJQVZJ.cjs +139 -0
  61. package/dist/chunk-X2UJQVZJ.cjs.map +1 -0
  62. package/dist/chunk-X43C5OJD.js +1460 -0
  63. package/dist/chunk-X43C5OJD.js.map +1 -0
  64. package/dist/chunk-XCYSBWV4.js +56 -0
  65. package/dist/chunk-XCYSBWV4.js.map +1 -0
  66. package/dist/chunk-XX4CBCEB.cjs +102 -0
  67. package/dist/chunk-XX4CBCEB.cjs.map +1 -0
  68. package/dist/hooks/index.cjs +33 -0
  69. package/dist/hooks/index.cjs.map +1 -0
  70. package/dist/hooks/index.d.cts +59 -0
  71. package/dist/hooks/index.d.ts +59 -0
  72. package/dist/hooks/index.js +4 -0
  73. package/dist/hooks/index.js.map +1 -0
  74. package/dist/index.cjs +366 -0
  75. package/dist/index.cjs.map +1 -0
  76. package/dist/index.d.cts +13 -0
  77. package/dist/index.d.ts +13 -0
  78. package/dist/index.js +17 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/interface-DnK5S6ww.d.cts +51 -0
  81. package/dist/interface-DnK5S6ww.d.ts +51 -0
  82. package/dist/lib/index.cjs +13 -0
  83. package/dist/lib/index.cjs.map +1 -0
  84. package/dist/lib/index.d.cts +5 -0
  85. package/dist/lib/index.d.ts +5 -0
  86. package/dist/lib/index.js +4 -0
  87. package/dist/lib/index.js.map +1 -0
  88. package/dist/molecules/index.cjs +123 -0
  89. package/dist/molecules/index.cjs.map +1 -0
  90. package/dist/molecules/index.d.cts +449 -0
  91. package/dist/molecules/index.d.ts +449 -0
  92. package/dist/molecules/index.js +10 -0
  93. package/dist/molecules/index.js.map +1 -0
  94. package/dist/organisms/index.cjs +102 -0
  95. package/dist/organisms/index.cjs.map +1 -0
  96. package/dist/organisms/index.d.cts +396 -0
  97. package/dist/organisms/index.d.ts +396 -0
  98. package/dist/organisms/index.js +9 -0
  99. package/dist/organisms/index.js.map +1 -0
  100. package/dist/tooltip-Bl2ZTtfg.d.cts +16 -0
  101. package/dist/tooltip-Bl2ZTtfg.d.ts +16 -0
  102. package/dist/ui/index.cjs +955 -0
  103. package/dist/ui/index.cjs.map +1 -0
  104. package/dist/ui/index.d.cts +252 -0
  105. package/dist/ui/index.d.ts +252 -0
  106. package/dist/ui/index.js +642 -0
  107. package/dist/ui/index.js.map +1 -0
  108. package/package.json +200 -0
  109. package/tailwind.preset.cjs +134 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-PXAMTGYY.js"}
@@ -0,0 +1,151 @@
1
+ import { Button } from './chunk-XCYSBWV4.js';
2
+ import { cn } from './chunk-MOED3QPY.js';
3
+ import * as React from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+ import { Loader2 } from 'lucide-react';
6
+
7
+ var SHAD_VARIANTS = /* @__PURE__ */ new Set([
8
+ "default",
9
+ "destructive",
10
+ "outline",
11
+ "secondary",
12
+ "ghost",
13
+ "link"
14
+ ]);
15
+ function resolveVariant(variant = "default", color) {
16
+ if (SHAD_VARIANTS.has(variant)) {
17
+ return { variant };
18
+ }
19
+ if (variant === "bordered") {
20
+ if (color === "danger")
21
+ return {
22
+ variant: "outline",
23
+ extraClasses: "border-destructive text-destructive hover:bg-destructive/10"
24
+ };
25
+ if (color === "success")
26
+ return {
27
+ variant: "outline",
28
+ extraClasses: "border-success-500 text-success-700 hover:bg-success-50"
29
+ };
30
+ if (color === "warning")
31
+ return {
32
+ variant: "outline",
33
+ extraClasses: "border-warning-500 text-warning-700 hover:bg-warning-50"
34
+ };
35
+ return { variant: "outline" };
36
+ }
37
+ if (variant === "light" || variant === "ghost") {
38
+ if (color === "danger")
39
+ return { variant: "ghost", extraClasses: "text-destructive hover:bg-destructive/10" };
40
+ return { variant: "ghost" };
41
+ }
42
+ if (color === "danger") return { variant: "destructive" };
43
+ if (color === "secondary") return { variant: "secondary" };
44
+ if (color === "success")
45
+ return {
46
+ variant: "default",
47
+ extraClasses: "bg-success-600 text-success-foreground hover:bg-success-700"
48
+ };
49
+ if (color === "warning")
50
+ return {
51
+ variant: "default",
52
+ extraClasses: "bg-warning-500 text-foreground hover:bg-warning-600"
53
+ };
54
+ if (variant === "flat" || variant === "faded") return { variant: "secondary" };
55
+ return { variant: "default" };
56
+ }
57
+ function resolveSize(size, isIconOnly) {
58
+ if (isIconOnly) return "icon";
59
+ if (size === "md") return "default";
60
+ if (size === "sm" || size === "lg" || size === "icon" || size === "default") return size;
61
+ return "default";
62
+ }
63
+ function resolveRadius(radius) {
64
+ if (radius === "full") return "rounded-full";
65
+ if (radius === "lg") return "rounded-lg";
66
+ if (radius === "sm") return "rounded-sm";
67
+ if (radius === "none") return "rounded-none";
68
+ return "";
69
+ }
70
+ var Button2 = React.forwardRef(function Button3({
71
+ className,
72
+ variant = "default",
73
+ color,
74
+ size,
75
+ isLoading,
76
+ isDisabled,
77
+ disabled,
78
+ isIconOnly,
79
+ fullWidth,
80
+ onPress,
81
+ onClick,
82
+ startContent,
83
+ endContent,
84
+ children,
85
+ type,
86
+ radius,
87
+ ...rest
88
+ }, ref) {
89
+ const computedDisabled = Boolean(isDisabled ?? disabled) || Boolean(isLoading);
90
+ const { variant: shadVariant, extraClasses } = resolveVariant(variant, color);
91
+ const shadSize = resolveSize(size, isIconOnly);
92
+ const handleClick = (e) => {
93
+ onClick?.(e);
94
+ onPress?.(e);
95
+ };
96
+ return /* @__PURE__ */ jsxs(
97
+ Button,
98
+ {
99
+ ref,
100
+ type: type ?? "button",
101
+ variant: shadVariant,
102
+ size: shadSize,
103
+ isLoading,
104
+ disabled: computedDisabled,
105
+ onClick: handleClick,
106
+ className: cn(fullWidth && "w-full", extraClasses, resolveRadius(radius), className),
107
+ ...rest,
108
+ children: [
109
+ startContent,
110
+ children,
111
+ endContent
112
+ ]
113
+ }
114
+ );
115
+ });
116
+ Button2.displayName = "Button";
117
+ var sizeMap = { sm: "h-3.5 w-3.5", md: "h-[18px] w-[18px]", lg: "h-7 w-7" };
118
+ var colorMap = {
119
+ default: "text-foreground",
120
+ primary: "text-primary",
121
+ secondary: "text-secondary",
122
+ success: "text-success",
123
+ warning: "text-warning",
124
+ danger: "text-destructive"
125
+ };
126
+ var Spinner = React.forwardRef(function Spinner2({ size = "md", color = "primary", className, label, children, ...rest }, ref) {
127
+ return /* @__PURE__ */ jsxs(
128
+ "span",
129
+ {
130
+ ref,
131
+ role: "status",
132
+ "aria-live": "polite",
133
+ className: cn("inline-flex items-center gap-2", className),
134
+ ...rest,
135
+ children: [
136
+ /* @__PURE__ */ jsx(
137
+ Loader2,
138
+ {
139
+ "aria-hidden": "true",
140
+ className: cn("animate-spin shrink-0", sizeMap[size], colorMap[color])
141
+ }
142
+ ),
143
+ (label || children) && /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: label ?? children })
144
+ ]
145
+ }
146
+ );
147
+ });
148
+
149
+ export { Button2 as Button, Spinner };
150
+ //# sourceMappingURL=chunk-QAZMI5VH.js.map
151
+ //# sourceMappingURL=chunk-QAZMI5VH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/Button/Button.tsx","../src/atoms/Spinners/Spinners.tsx"],"names":["Button","React2","Spinner","jsxs"],"mappings":"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","file":"chunk-QAZMI5VH.js","sourcesContent":["import * as React from 'react';\n\nimport { cn } from '../../lib/cn';\nimport { Button as ShadButton, type ButtonProps as ShadButtonProps } from '../../ui/button';\n\n/**\n * Button AgroShine — canon `Components.html`.\n *\n * API pública (recomendada · documentada en Storybook):\n * variant: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link'\n * size: 'sm' | 'default' | 'lg' | 'icon'\n *\n * API legacy (compat con admin · sin documentar):\n * color: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\n * variant: 'solid' | 'bordered' | 'light' | 'flat' | 'faded' | 'shadow' | 'ghost' (HeroUI)\n * size: 'md' (= default)\n * isLoading, isDisabled, isIconOnly, fullWidth, onPress, startContent, endContent, radius\n *\n * Cuando se pasan props legacy, se mapean silenciosamente al canon shadcn por debajo.\n */\n\n// ─── API canon ───\ntype ShadVariant = 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\ntype ShadSize = 'default' | 'sm' | 'lg' | 'icon';\n\n// ─── API legacy (HeroUI) ───\ntype HeroColor = 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger';\ntype HeroVariant = 'solid' | 'bordered' | 'light' | 'flat' | 'faded' | 'shadow' | 'ghost';\ntype LegacySize = 'md';\n\nexport interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'color'> {\n /** Variante visual canon shadcn. Default `'default'`. */\n variant?: ShadVariant | HeroVariant;\n /** Tamaño canon. Default `'default'` (32 px). Acepta `'md'` como alias legacy. */\n size?: ShadSize | LegacySize;\n /** Legacy HeroUI · sólo aplica si `variant` es legacy. */\n color?: HeroColor;\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'full';\n isLoading?: boolean;\n isDisabled?: boolean;\n isIconOnly?: boolean;\n fullWidth?: boolean;\n onPress?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n startContent?: React.ReactNode;\n endContent?: React.ReactNode;\n}\n\nconst SHAD_VARIANTS = new Set<string>([\n 'default',\n 'destructive',\n 'outline',\n 'secondary',\n 'ghost',\n 'link',\n]);\n\nfunction resolveVariant(\n variant: ButtonProps['variant'] = 'default',\n color?: HeroColor,\n): { variant: ShadVariant; extraClasses?: string } {\n // Canon shadcn → passthrough directo.\n if (SHAD_VARIANTS.has(variant)) {\n return { variant: variant as ShadVariant };\n }\n\n // Legacy HeroUI · mapeo a canon.\n if (variant === 'bordered') {\n if (color === 'danger')\n return {\n variant: 'outline',\n extraClasses: 'border-destructive text-destructive hover:bg-destructive/10',\n };\n if (color === 'success')\n return {\n variant: 'outline',\n extraClasses: 'border-success-500 text-success-700 hover:bg-success-50',\n };\n if (color === 'warning')\n return {\n variant: 'outline',\n extraClasses: 'border-warning-500 text-warning-700 hover:bg-warning-50',\n };\n return { variant: 'outline' };\n }\n if (variant === 'light' || variant === 'ghost') {\n if (color === 'danger')\n return { variant: 'ghost', extraClasses: 'text-destructive hover:bg-destructive/10' };\n return { variant: 'ghost' };\n }\n // solid / flat / faded / shadow · usar `color` para decidir.\n if (color === 'danger') return { variant: 'destructive' };\n if (color === 'secondary') return { variant: 'secondary' };\n if (color === 'success')\n return {\n variant: 'default',\n extraClasses: 'bg-success-600 text-success-foreground hover:bg-success-700',\n };\n if (color === 'warning')\n return {\n variant: 'default',\n extraClasses: 'bg-warning-500 text-foreground hover:bg-warning-600',\n };\n if (variant === 'flat' || variant === 'faded') return { variant: 'secondary' };\n return { variant: 'default' };\n}\n\nfunction resolveSize(size: ButtonProps['size'], isIconOnly?: boolean): ShadSize {\n if (isIconOnly) return 'icon';\n if (size === 'md') return 'default';\n if (size === 'sm' || size === 'lg' || size === 'icon' || size === 'default') return size;\n return 'default';\n}\n\nfunction resolveRadius(radius: ButtonProps['radius']): string {\n if (radius === 'full') return 'rounded-full';\n if (radius === 'lg') return 'rounded-lg';\n if (radius === 'sm') return 'rounded-sm';\n if (radius === 'none') return 'rounded-none';\n return '';\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n className,\n variant = 'default',\n color,\n size,\n isLoading,\n isDisabled,\n disabled,\n isIconOnly,\n fullWidth,\n onPress,\n onClick,\n startContent,\n endContent,\n children,\n type,\n radius,\n ...rest\n },\n ref,\n) {\n const computedDisabled = Boolean(isDisabled ?? disabled) || Boolean(isLoading);\n const { variant: shadVariant, extraClasses } = resolveVariant(variant, color);\n const shadSize = resolveSize(size, isIconOnly);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n onPress?.(e);\n };\n\n return (\n <ShadButton\n ref={ref}\n type={type ?? 'button'}\n variant={shadVariant as ShadButtonProps['variant']}\n size={shadSize as ShadButtonProps['size']}\n isLoading={isLoading}\n disabled={computedDisabled}\n onClick={handleClick}\n className={cn(fullWidth && 'w-full', extraClasses, resolveRadius(radius), className)}\n {...rest}\n >\n {startContent}\n {children}\n {endContent}\n </ShadButton>\n );\n});\nButton.displayName = 'Button';\n","import * as React from 'react';\nimport { Loader2 } from 'lucide-react';\n\nimport { cn } from '../../lib/cn';\n\nexport interface SpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n color?: 'default' | 'primary' | 'secondary' | 'success' | 'warning' | 'danger';\n className?: string;\n label?: string;\n children?: React.ReactNode;\n}\n\n// Tamaños alineados al canon Components.html: sm 14px · md 18px · lg 28px\nconst sizeMap = { sm: 'h-3.5 w-3.5', md: 'h-[18px] w-[18px]', lg: 'h-7 w-7' } as const;\nconst colorMap: Record<NonNullable<SpinnerProps['color']>, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n secondary: 'text-secondary',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-destructive',\n};\n\n/**\n * Spinner inline.\n *\n * Si necesitas centrarlo en una pantalla de carga, envuélvelo tú:\n *\n * <div className=\"flex min-h-60 items-center justify-center\">\n * <Spinner size=\"lg\" label=\"Cargando…\" />\n * </div>\n */\nexport const Spinner = React.forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner(\n { size = 'md', color = 'primary', className, label, children, ...rest },\n ref,\n) {\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n className={cn('inline-flex items-center gap-2', className)}\n {...rest}\n >\n <Loader2\n aria-hidden=\"true\"\n className={cn('animate-spin shrink-0', sizeMap[size], colorMap[color])}\n />\n {(label || children) && (\n <span className=\"text-sm text-muted-foreground\">{label ?? children}</span>\n )}\n </span>\n );\n});\n"]}
@@ -0,0 +1,30 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/atoms/FormItem/FormItem.tsx
4
+ var FormItem = ({
5
+ label,
6
+ required,
7
+ validateStatus,
8
+ help,
9
+ children
10
+ }) => {
11
+ const borderColor = validateStatus === "error" ? "text-red-500" : validateStatus === "success" ? "text-green-500" : "text-gray-800";
12
+ return /* @__PURE__ */ jsxs("div", { className: "mb-[8px] w-full", children: [
13
+ label && /* @__PURE__ */ jsxs("label", { className: `block mb-[3px] font-medium text-[14px] ${borderColor}`, children: [
14
+ label,
15
+ required && /* @__PURE__ */ jsx("span", { className: "text-red-500 ", children: "*" })
16
+ ] }),
17
+ children,
18
+ help && /* @__PURE__ */ jsx(
19
+ "p",
20
+ {
21
+ className: `mt-1 text-sm ${validateStatus === "error" ? "text-red-500" : validateStatus === "success" ? "text-green-500" : "text-gray-500"}`,
22
+ children: help
23
+ }
24
+ )
25
+ ] });
26
+ };
27
+
28
+ export { FormItem };
29
+ //# sourceMappingURL=chunk-QEG27NX6.js.map
30
+ //# sourceMappingURL=chunk-QEG27NX6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/FormItem/FormItem.tsx"],"names":[],"mappings":";;;AAWO,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,cACJ,cAAA,KAAmB,OAAA,GACf,cAAA,GACA,cAAA,KAAmB,YACjB,gBAAA,GACA,eAAA;AAER,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACC,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,uCAAA,EAA0C,WAAW,CAAA,CAAA,EACpE,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,GAAA,EAAC;AAAA,KAAA,EAChD,CAAA;AAAA,IAED,QAAA;AAAA,IACA,IAAA,oBACC,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,gBACT,cAAA,KAAmB,OAAA,GACf,iBACA,cAAA,KAAmB,SAAA,GACjB,mBACA,eACR,CAAA,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-QEG27NX6.js","sourcesContent":["import React from 'react';\n\ninterface FormItemProps {\n label?: string;\n name?: string;\n required?: boolean;\n validateStatus?: 'error' | 'success' | 'default';\n help?: string;\n children: React.ReactNode;\n}\n\nexport const FormItem: React.FC<FormItemProps> = ({\n label,\n required,\n validateStatus,\n help,\n children,\n}) => {\n const borderColor =\n validateStatus === 'error'\n ? 'text-red-500'\n : validateStatus === 'success'\n ? 'text-green-500'\n : 'text-gray-800';\n\n return (\n <div className=\"mb-[8px] w-full\">\n {label && (\n <label className={`block mb-[3px] font-medium text-[14px] ${borderColor}`}>\n {label}\n {required && <span className=\"text-red-500 \">*</span>}\n </label>\n )}\n {children}\n {help && (\n <p\n className={`mt-1 text-sm ${\n validateStatus === 'error'\n ? 'text-red-500'\n : validateStatus === 'success'\n ? 'text-green-500'\n : 'text-gray-500'\n }`}\n >\n {help}\n </p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/hooks/useDrawer.ts
6
+ function useDrawer(defaultOpen = false) {
7
+ const [isOpen, setIsOpen] = react.useState(defaultOpen);
8
+ const openDrawer = react.useCallback(() => setIsOpen(true), []);
9
+ const closeDrawer = react.useCallback(() => setIsOpen(false), []);
10
+ const toggleDrawer = react.useCallback(() => setIsOpen((prev) => !prev), []);
11
+ return {
12
+ isOpen,
13
+ openDrawer,
14
+ closeDrawer,
15
+ toggleDrawer
16
+ };
17
+ }
18
+ function useModal(defaultOpen = false) {
19
+ const [isOpen, setIsOpen] = react.useState(defaultOpen);
20
+ const openModal = react.useCallback(() => setIsOpen(true), []);
21
+ const closeModal = react.useCallback(() => setIsOpen(false), []);
22
+ const toggleModal = react.useCallback(() => setIsOpen((prev) => !prev), []);
23
+ return {
24
+ isOpen,
25
+ openModal,
26
+ closeModal,
27
+ toggleModal
28
+ };
29
+ }
30
+ function useSearch({ data, searchTerm, keys }) {
31
+ const [query, setQuery] = react.useState(searchTerm);
32
+ const results = react.useMemo(() => {
33
+ if (!query.trim()) return data;
34
+ return data.filter(
35
+ (item) => keys.some((key) => {
36
+ const value = item[key];
37
+ return typeof value === "string" && value.toLowerCase().includes(query.toLowerCase());
38
+ })
39
+ );
40
+ }, [query, data, keys]);
41
+ return {
42
+ query,
43
+ setQuery,
44
+ results
45
+ };
46
+ }
47
+
48
+ exports.useDrawer = useDrawer;
49
+ exports.useModal = useModal;
50
+ exports.useSearch = useSearch;
51
+ //# sourceMappingURL=chunk-THTOUSMG.cjs.map
52
+ //# sourceMappingURL=chunk-THTOUSMG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDrawer.ts","../src/hooks/useModal.ts","../src/hooks/useSearch.ts"],"names":["useState","useCallback","useMemo"],"mappings":";;;;;AAEO,SAAS,SAAA,CAAU,cAAuB,KAAA,EAAO;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,aAAaC,iBAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AACxD,EAAA,MAAM,cAAcA,iBAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AAC1D,EAAA,MAAM,YAAA,GAAeA,iBAAA,CAAY,MAAM,SAAA,CAAU,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAErE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;ACbO,SAAS,QAAA,CAAS,cAAuB,KAAA,EAAO;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,YAAYC,iBAAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AACvD,EAAA,MAAM,aAAaA,iBAAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,MAAM,SAAA,CAAU,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAEpE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;ACPO,SAAS,SAAA,CAAa,EAAE,IAAA,EAAM,UAAA,EAAY,MAAK,EAAqB;AACzE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAS,UAAU,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAUE,cAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,IAAA;AAE1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MAAO,CAAC,IAAA,KAClB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ;AACjB,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,QAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,MACtF,CAAC;AAAA,KACH;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,IAAI,CAAC,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-THTOUSMG.cjs","sourcesContent":["import { useCallback, useState } from 'react';\n\nexport function useDrawer(defaultOpen: boolean = false) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const openDrawer = useCallback(() => setIsOpen(true), []);\n const closeDrawer = useCallback(() => setIsOpen(false), []);\n const toggleDrawer = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return {\n isOpen,\n openDrawer,\n closeDrawer,\n toggleDrawer,\n };\n}\n","import { useCallback, useState } from 'react';\n\nexport function useModal(defaultOpen: boolean = false) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const openModal = useCallback(() => setIsOpen(true), []);\n const closeModal = useCallback(() => setIsOpen(false), []);\n const toggleModal = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return {\n isOpen,\n openModal,\n closeModal,\n toggleModal,\n };\n}\n","import { useMemo, useState } from 'react';\n\ntype SearchOptions<T> = {\n data: T[];\n searchTerm: string;\n keys: (keyof T)[];\n};\n\nexport function useSearch<T>({ data, searchTerm, keys }: SearchOptions<T>) {\n const [query, setQuery] = useState(searchTerm);\n\n const results = useMemo(() => {\n if (!query.trim()) return data;\n\n return data.filter((item) =>\n keys.some((key) => {\n const value = item[key];\n return typeof value === 'string' && value.toLowerCase().includes(query.toLowerCase());\n }),\n );\n }, [query, data, keys]);\n\n return {\n query,\n setQuery,\n results,\n };\n}\n"]}
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ // src/atoms/FormItem/FormItem.tsx
6
+ var FormItem = ({
7
+ label,
8
+ required,
9
+ validateStatus,
10
+ help,
11
+ children
12
+ }) => {
13
+ const borderColor = validateStatus === "error" ? "text-red-500" : validateStatus === "success" ? "text-green-500" : "text-gray-800";
14
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-[8px] w-full", children: [
15
+ label && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `block mb-[3px] font-medium text-[14px] ${borderColor}`, children: [
16
+ label,
17
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-500 ", children: "*" })
18
+ ] }),
19
+ children,
20
+ help && /* @__PURE__ */ jsxRuntime.jsx(
21
+ "p",
22
+ {
23
+ className: `mt-1 text-sm ${validateStatus === "error" ? "text-red-500" : validateStatus === "success" ? "text-green-500" : "text-gray-500"}`,
24
+ children: help
25
+ }
26
+ )
27
+ ] });
28
+ };
29
+
30
+ exports.FormItem = FormItem;
31
+ //# sourceMappingURL=chunk-UAXKB6IH.cjs.map
32
+ //# sourceMappingURL=chunk-UAXKB6IH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/atoms/FormItem/FormItem.tsx"],"names":["jsxs","jsx"],"mappings":";;;;;AAWO,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,cACJ,cAAA,KAAmB,OAAA,GACf,cAAA,GACA,cAAA,KAAmB,YACjB,gBAAA,GACA,eAAA;AAER,EAAA,uBACEA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCA,eAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,uCAAA,EAA0C,WAAW,CAAA,CAAA,EACpE,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,QAAA,oBAAYC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,GAAA,EAAC;AAAA,KAAA,EAChD,CAAA;AAAA,IAED,QAAA;AAAA,IACA,IAAA,oBACCA,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,gBACT,cAAA,KAAmB,OAAA,GACf,iBACA,cAAA,KAAmB,SAAA,GACjB,mBACA,eACR,CAAA,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-UAXKB6IH.cjs","sourcesContent":["import React from 'react';\n\ninterface FormItemProps {\n label?: string;\n name?: string;\n required?: boolean;\n validateStatus?: 'error' | 'success' | 'default';\n help?: string;\n children: React.ReactNode;\n}\n\nexport const FormItem: React.FC<FormItemProps> = ({\n label,\n required,\n validateStatus,\n help,\n children,\n}) => {\n const borderColor =\n validateStatus === 'error'\n ? 'text-red-500'\n : validateStatus === 'success'\n ? 'text-green-500'\n : 'text-gray-800';\n\n return (\n <div className=\"mb-[8px] w-full\">\n {label && (\n <label className={`block mb-[3px] font-medium text-[14px] ${borderColor}`}>\n {label}\n {required && <span className=\"text-red-500 \">*</span>}\n </label>\n )}\n {children}\n {help && (\n <p\n className={`mt-1 text-sm ${\n validateStatus === 'error'\n ? 'text-red-500'\n : validateStatus === 'success'\n ? 'text-green-500'\n : 'text-gray-500'\n }`}\n >\n {help}\n </p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,48 @@
1
+ import { useState, useCallback, useMemo } from 'react';
2
+
3
+ // src/hooks/useDrawer.ts
4
+ function useDrawer(defaultOpen = false) {
5
+ const [isOpen, setIsOpen] = useState(defaultOpen);
6
+ const openDrawer = useCallback(() => setIsOpen(true), []);
7
+ const closeDrawer = useCallback(() => setIsOpen(false), []);
8
+ const toggleDrawer = useCallback(() => setIsOpen((prev) => !prev), []);
9
+ return {
10
+ isOpen,
11
+ openDrawer,
12
+ closeDrawer,
13
+ toggleDrawer
14
+ };
15
+ }
16
+ function useModal(defaultOpen = false) {
17
+ const [isOpen, setIsOpen] = useState(defaultOpen);
18
+ const openModal = useCallback(() => setIsOpen(true), []);
19
+ const closeModal = useCallback(() => setIsOpen(false), []);
20
+ const toggleModal = useCallback(() => setIsOpen((prev) => !prev), []);
21
+ return {
22
+ isOpen,
23
+ openModal,
24
+ closeModal,
25
+ toggleModal
26
+ };
27
+ }
28
+ function useSearch({ data, searchTerm, keys }) {
29
+ const [query, setQuery] = useState(searchTerm);
30
+ const results = useMemo(() => {
31
+ if (!query.trim()) return data;
32
+ return data.filter(
33
+ (item) => keys.some((key) => {
34
+ const value = item[key];
35
+ return typeof value === "string" && value.toLowerCase().includes(query.toLowerCase());
36
+ })
37
+ );
38
+ }, [query, data, keys]);
39
+ return {
40
+ query,
41
+ setQuery,
42
+ results
43
+ };
44
+ }
45
+
46
+ export { useDrawer, useModal, useSearch };
47
+ //# sourceMappingURL=chunk-W5IHWAMM.js.map
48
+ //# sourceMappingURL=chunk-W5IHWAMM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useDrawer.ts","../src/hooks/useModal.ts","../src/hooks/useSearch.ts"],"names":["useState","useCallback"],"mappings":";;;AAEO,SAAS,SAAA,CAAU,cAAuB,KAAA,EAAO;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,aAAa,WAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AACxD,EAAA,MAAM,cAAc,WAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AAC1D,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,MAAM,SAAA,CAAU,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAErE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;ACbO,SAAS,QAAA,CAAS,cAAuB,KAAA,EAAO;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,WAAW,CAAA;AAEhD,EAAA,MAAM,YAAYC,WAAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AACvD,EAAA,MAAM,aAAaA,WAAAA,CAAY,MAAM,UAAU,KAAK,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,MAAM,SAAA,CAAU,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAEpE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;ACPO,SAAS,SAAA,CAAa,EAAE,IAAA,EAAM,UAAA,EAAY,MAAK,EAAqB;AACzE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,SAAS,UAAU,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG,OAAO,IAAA;AAE1B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MAAO,CAAC,IAAA,KAClB,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ;AACjB,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,QAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,MACtF,CAAC;AAAA,KACH;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,IAAI,CAAC,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-W5IHWAMM.js","sourcesContent":["import { useCallback, useState } from 'react';\n\nexport function useDrawer(defaultOpen: boolean = false) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const openDrawer = useCallback(() => setIsOpen(true), []);\n const closeDrawer = useCallback(() => setIsOpen(false), []);\n const toggleDrawer = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return {\n isOpen,\n openDrawer,\n closeDrawer,\n toggleDrawer,\n };\n}\n","import { useCallback, useState } from 'react';\n\nexport function useModal(defaultOpen: boolean = false) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const openModal = useCallback(() => setIsOpen(true), []);\n const closeModal = useCallback(() => setIsOpen(false), []);\n const toggleModal = useCallback(() => setIsOpen((prev) => !prev), []);\n\n return {\n isOpen,\n openModal,\n closeModal,\n toggleModal,\n };\n}\n","import { useMemo, useState } from 'react';\n\ntype SearchOptions<T> = {\n data: T[];\n searchTerm: string;\n keys: (keyof T)[];\n};\n\nexport function useSearch<T>({ data, searchTerm, keys }: SearchOptions<T>) {\n const [query, setQuery] = useState(searchTerm);\n\n const results = useMemo(() => {\n if (!query.trim()) return data;\n\n return data.filter((item) =>\n keys.some((key) => {\n const value = item[key];\n return typeof value === 'string' && value.toLowerCase().includes(query.toLowerCase());\n }),\n );\n }, [query, data, keys]);\n\n return {\n query,\n setQuery,\n results,\n };\n}\n"]}
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ var chunk2TBYPKQ3_cjs = require('./chunk-2TBYPKQ3.cjs');
4
+ var chunkA3A7PJWG_cjs = require('./chunk-A3A7PJWG.cjs');
5
+ var React = require('react');
6
+ var AccordionPrimitive = require('@radix-ui/react-accordion');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var reactDayPicker = require('react-day-picker');
9
+ var lucideReact = require('lucide-react');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
31
+
32
+ function AccordionChevron({ className }) {
33
+ return /* @__PURE__ */ jsxRuntime.jsx(
34
+ "svg",
35
+ {
36
+ viewBox: "0 0 16 16",
37
+ fill: "none",
38
+ className: chunkA3A7PJWG_cjs.cn("h-4 w-4 shrink-0", className),
39
+ "aria-hidden": "true",
40
+ children: /* @__PURE__ */ jsxRuntime.jsx(
41
+ "path",
42
+ {
43
+ d: "M4 6l4 4 4-4",
44
+ stroke: "currentColor",
45
+ strokeWidth: "1.8",
46
+ strokeLinecap: "round",
47
+ strokeLinejoin: "round"
48
+ }
49
+ )
50
+ }
51
+ );
52
+ }
53
+ var Accordion = AccordionPrimitive__namespace.Root;
54
+ var AccordionItem = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Item, { ref, className: chunkA3A7PJWG_cjs.cn(className), ...props }));
55
+ AccordionItem.displayName = "AccordionItem";
56
+ var AccordionTrigger = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
57
+ AccordionPrimitive__namespace.Trigger,
58
+ {
59
+ ref,
60
+ className: chunkA3A7PJWG_cjs.cn(
61
+ // Canon: padding 16px 8px (px-2 py-4), hover color (no underline), chevron rota 180°
62
+ "flex flex-1 items-center justify-between gap-3 px-2 py-4 text-left text-sm font-medium text-foreground transition-colors hover:text-primary disabled:cursor-not-allowed disabled:opacity-50",
63
+ // Rotación del chevron (svg hijo directo) cuando trigger data-state=open
64
+ "[&[data-state=open]>svg]:rotate-180",
65
+ // Chevron también cambia a primary on hover
66
+ "[&:hover>svg]:text-primary",
67
+ className
68
+ ),
69
+ ...props,
70
+ children: [
71
+ children,
72
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionChevron, { className: "text-muted-foreground transition-transform duration-[250ms] [transition-timing-function:cubic-bezier(.4,0,.2,1)]" })
73
+ ]
74
+ }
75
+ ) }));
76
+ AccordionTrigger.displayName = "AccordionTrigger";
77
+ var AccordionContent = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
78
+ AccordionPrimitive__namespace.Content,
79
+ {
80
+ ref,
81
+ className: "overflow-hidden text-[13.5px] leading-relaxed text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
82
+ ...props,
83
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkA3A7PJWG_cjs.cn("px-2 pb-4 pt-0", className), children })
84
+ }
85
+ ));
86
+ AccordionContent.displayName = "AccordionContent";
87
+ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
88
+ return /* @__PURE__ */ jsxRuntime.jsx(
89
+ reactDayPicker.DayPicker,
90
+ {
91
+ showOutsideDays,
92
+ className: chunkA3A7PJWG_cjs.cn("p-3 border border-border rounded-lg", className),
93
+ classNames: {
94
+ months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
95
+ month: "space-y-4",
96
+ caption: "flex justify-center pt-1 relative items-center",
97
+ caption_label: "text-sm font-medium",
98
+ nav: "space-x-1 flex items-center",
99
+ nav_button: chunkA3A7PJWG_cjs.cn(
100
+ chunk2TBYPKQ3_cjs.buttonVariants({ variant: "outline" }),
101
+ "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100"
102
+ ),
103
+ nav_button_previous: "absolute left-1",
104
+ nav_button_next: "absolute right-1",
105
+ table: "w-full border-collapse space-y-1",
106
+ head_row: "flex",
107
+ head_cell: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
108
+ row: "flex w-full mt-2",
109
+ cell: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
110
+ day: chunkA3A7PJWG_cjs.cn(
111
+ chunk2TBYPKQ3_cjs.buttonVariants({ variant: "ghost" }),
112
+ "h-9 w-9 p-0 font-normal aria-selected:opacity-100"
113
+ ),
114
+ day_range_end: "day-range-end",
115
+ day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
116
+ day_today: "bg-accent text-accent-foreground relative after:absolute after:bottom-0.5 after:left-1/2 after:-translate-x-1/2 after:h-1 after:w-1 after:rounded-full after:bg-primary-500 after:content-['']",
117
+ day_outside: "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground",
118
+ day_disabled: "text-muted-foreground opacity-50",
119
+ day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
120
+ day_hidden: "invisible",
121
+ ...classNames
122
+ },
123
+ components: {
124
+ IconLeft: () => /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" }),
125
+ IconRight: () => /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })
126
+ },
127
+ ...props
128
+ }
129
+ );
130
+ }
131
+ Calendar.displayName = "Calendar";
132
+
133
+ exports.Accordion = Accordion;
134
+ exports.AccordionContent = AccordionContent;
135
+ exports.AccordionItem = AccordionItem;
136
+ exports.AccordionTrigger = AccordionTrigger;
137
+ exports.Calendar = Calendar;
138
+ //# sourceMappingURL=chunk-X2UJQVZJ.cjs.map
139
+ //# sourceMappingURL=chunk-X2UJQVZJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/accordion.tsx","../src/ui/calendar.tsx"],"names":["jsx","cn","AccordionPrimitive","React","jsxs","DayPicker","buttonVariants","ChevronLeft","ChevronRight"],"mappings":"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","file":"chunk-X2UJQVZJ.cjs","sourcesContent":["import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\n\nimport { cn } from '../lib/cn';\n\n/**\n * Chevron SVG idéntico al canon Components.html (path `M4 6l4 4 4-4`, stroke 1.8).\n * Lucide ChevronDown tiene stroke 2 y proporciones distintas — usamos el path exacto.\n */\nfunction AccordionChevron({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn('h-4 w-4 shrink-0', className)}\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst Accordion = AccordionPrimitive.Root;\n\n// Canon Components.html § \"Accordion\" L320-340.\n// El primitive es NEUTRAL: el wrapper organism decide borders por variant\n// (default → border-b · card → border completa rounded-md).\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item ref={ref} className={cn(className)} {...props} />\n));\nAccordionItem.displayName = 'AccordionItem';\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n // Canon: padding 16px 8px (px-2 py-4), hover color (no underline), chevron rota 180°\n 'flex flex-1 items-center justify-between gap-3 px-2 py-4 text-left text-sm font-medium text-foreground transition-colors hover:text-primary disabled:cursor-not-allowed disabled:opacity-50',\n // Rotación del chevron (svg hijo directo) cuando trigger data-state=open\n '[&[data-state=open]>svg]:rotate-180',\n // Chevron también cambia a primary on hover\n '[&:hover>svg]:text-primary',\n className,\n )}\n {...props}\n >\n {children}\n <AccordionChevron className=\"text-muted-foreground transition-transform duration-[250ms] [transition-timing-function:cubic-bezier(.4,0,.2,1)]\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = 'AccordionTrigger';\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n // Canon: text 13.5px muted-foreground leading-1.6, padding 0 8px cerrado / 0 8px 16px abierto\n className=\"overflow-hidden text-[13.5px] leading-relaxed text-muted-foreground data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn('px-2 pb-4 pt-0', className)}>{children}</div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = 'AccordionContent';\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n","import * as React from 'react';\nimport { DayPicker } from 'react-day-picker';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\nimport { cn } from '../lib/cn';\n\nimport { buttonVariants } from './button-variants';\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\n\nfunction Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn('p-3 border border-border rounded-lg', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0',\n month: 'space-y-4',\n caption: 'flex justify-center pt-1 relative items-center',\n caption_label: 'text-sm font-medium',\n nav: 'space-x-1 flex items-center',\n nav_button: cn(\n buttonVariants({ variant: 'outline' }),\n 'h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100',\n ),\n nav_button_previous: 'absolute left-1',\n nav_button_next: 'absolute right-1',\n table: 'w-full border-collapse space-y-1',\n head_row: 'flex',\n head_cell: 'text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]',\n row: 'flex w-full mt-2',\n cell: 'h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20',\n day: cn(\n buttonVariants({ variant: 'ghost' }),\n 'h-9 w-9 p-0 font-normal aria-selected:opacity-100',\n ),\n day_range_end: 'day-range-end',\n day_selected:\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground',\n day_today:\n \"bg-accent text-accent-foreground relative after:absolute after:bottom-0.5 after:left-1/2 after:-translate-x-1/2 after:h-1 after:w-1 after:rounded-full after:bg-primary-500 after:content-['']\",\n day_outside:\n 'day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground',\n day_disabled: 'text-muted-foreground opacity-50',\n day_range_middle: 'aria-selected:bg-accent aria-selected:text-accent-foreground',\n day_hidden: 'invisible',\n ...classNames,\n }}\n components={{\n IconLeft: () => <ChevronLeft className=\"h-4 w-4\" />,\n IconRight: () => <ChevronRight className=\"h-4 w-4\" />,\n }}\n {...props}\n />\n );\n}\nCalendar.displayName = 'Calendar';\n\nexport { Calendar };\n"]}