@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.
- package/README.md +75 -0
- package/dist/atoms/index.cjs +134 -0
- package/dist/atoms/index.cjs.map +1 -0
- package/dist/atoms/index.d.cts +583 -0
- package/dist/atoms/index.d.ts +583 -0
- package/dist/atoms/index.js +9 -0
- package/dist/atoms/index.js.map +1 -0
- package/dist/chunk-2KRMLIJQ.cjs +52 -0
- package/dist/chunk-2KRMLIJQ.cjs.map +1 -0
- package/dist/chunk-2TBYPKQ3.cjs +79 -0
- package/dist/chunk-2TBYPKQ3.cjs.map +1 -0
- package/dist/chunk-5FWELSEZ.js +1296 -0
- package/dist/chunk-5FWELSEZ.js.map +1 -0
- package/dist/chunk-5PEOJVY7.cjs +1502 -0
- package/dist/chunk-5PEOJVY7.cjs.map +1 -0
- package/dist/chunk-6LUGTNMH.js +259 -0
- package/dist/chunk-6LUGTNMH.js.map +1 -0
- package/dist/chunk-6O2IDBTX.js +112 -0
- package/dist/chunk-6O2IDBTX.js.map +1 -0
- package/dist/chunk-6YUNWKT3.js +26 -0
- package/dist/chunk-6YUNWKT3.js.map +1 -0
- package/dist/chunk-7R6OXNES.cjs +321 -0
- package/dist/chunk-7R6OXNES.cjs.map +1 -0
- package/dist/chunk-A3A7PJWG.cjs +13 -0
- package/dist/chunk-A3A7PJWG.cjs.map +1 -0
- package/dist/chunk-A7TDGQAB.js +557 -0
- package/dist/chunk-A7TDGQAB.js.map +1 -0
- package/dist/chunk-C4LX3XTN.cjs +1187 -0
- package/dist/chunk-C4LX3XTN.cjs.map +1 -0
- package/dist/chunk-DZW4GS2T.cjs +1340 -0
- package/dist/chunk-DZW4GS2T.cjs.map +1 -0
- package/dist/chunk-E3BTK736.cjs +174 -0
- package/dist/chunk-E3BTK736.cjs.map +1 -0
- package/dist/chunk-ERGKCXM2.cjs +267 -0
- package/dist/chunk-ERGKCXM2.cjs.map +1 -0
- package/dist/chunk-FOA46NSG.cjs +574 -0
- package/dist/chunk-FOA46NSG.cjs.map +1 -0
- package/dist/chunk-JTFCE6RA.js +1156 -0
- package/dist/chunk-JTFCE6RA.js.map +1 -0
- package/dist/chunk-KINOE57L.js +225 -0
- package/dist/chunk-KINOE57L.js.map +1 -0
- package/dist/chunk-MOED3QPY.js +11 -0
- package/dist/chunk-MOED3QPY.js.map +1 -0
- package/dist/chunk-NVR34DY2.cjs +4 -0
- package/dist/chunk-NVR34DY2.cjs.map +1 -0
- package/dist/chunk-PI3IJWBG.js +79 -0
- package/dist/chunk-PI3IJWBG.js.map +1 -0
- package/dist/chunk-PXAMTGYY.js +3 -0
- package/dist/chunk-PXAMTGYY.js.map +1 -0
- package/dist/chunk-QAZMI5VH.js +151 -0
- package/dist/chunk-QAZMI5VH.js.map +1 -0
- package/dist/chunk-QEG27NX6.js +30 -0
- package/dist/chunk-QEG27NX6.js.map +1 -0
- package/dist/chunk-THTOUSMG.cjs +52 -0
- package/dist/chunk-THTOUSMG.cjs.map +1 -0
- package/dist/chunk-UAXKB6IH.cjs +32 -0
- package/dist/chunk-UAXKB6IH.cjs.map +1 -0
- package/dist/chunk-W5IHWAMM.js +48 -0
- package/dist/chunk-W5IHWAMM.js.map +1 -0
- package/dist/chunk-X2UJQVZJ.cjs +139 -0
- package/dist/chunk-X2UJQVZJ.cjs.map +1 -0
- package/dist/chunk-X43C5OJD.js +1460 -0
- package/dist/chunk-X43C5OJD.js.map +1 -0
- package/dist/chunk-XCYSBWV4.js +56 -0
- package/dist/chunk-XCYSBWV4.js.map +1 -0
- package/dist/chunk-XX4CBCEB.cjs +102 -0
- package/dist/chunk-XX4CBCEB.cjs.map +1 -0
- package/dist/hooks/index.cjs +33 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +59 -0
- package/dist/hooks/index.d.ts +59 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +366 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/interface-DnK5S6ww.d.cts +51 -0
- package/dist/interface-DnK5S6ww.d.ts +51 -0
- package/dist/lib/index.cjs +13 -0
- package/dist/lib/index.cjs.map +1 -0
- package/dist/lib/index.d.cts +5 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/molecules/index.cjs +123 -0
- package/dist/molecules/index.cjs.map +1 -0
- package/dist/molecules/index.d.cts +449 -0
- package/dist/molecules/index.d.ts +449 -0
- package/dist/molecules/index.js +10 -0
- package/dist/molecules/index.js.map +1 -0
- package/dist/organisms/index.cjs +102 -0
- package/dist/organisms/index.cjs.map +1 -0
- package/dist/organisms/index.d.cts +396 -0
- package/dist/organisms/index.d.ts +396 -0
- package/dist/organisms/index.js +9 -0
- package/dist/organisms/index.js.map +1 -0
- package/dist/tooltip-Bl2ZTtfg.d.cts +16 -0
- package/dist/tooltip-Bl2ZTtfg.d.ts +16 -0
- package/dist/ui/index.cjs +955 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +252 -0
- package/dist/ui/index.d.ts +252 -0
- package/dist/ui/index.js +642 -0
- package/dist/ui/index.js.map +1 -0
- package/package.json +200 -0
- 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"]}
|