@esprydi/ui 0.0.0-stage → 0.1.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 +81 -2
- package/dist/chunk-3GSLHHK2.mjs +85 -0
- package/dist/chunk-3GSLHHK2.mjs.map +1 -0
- package/dist/index.d.mts +126 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.js +859 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +694 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/tailwind/preset.d.mts +93 -0
- package/dist/tailwind/preset.d.ts +93 -0
- package/dist/tailwind/preset.js +109 -0
- package/dist/tailwind/preset.js.map +1 -0
- package/dist/tailwind/preset.mjs +9 -0
- package/dist/tailwind/preset.mjs.map +1 -0
- package/package.json +55 -4
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,694 @@
|
|
|
1
|
+
import {
|
|
2
|
+
esprydiPreset
|
|
3
|
+
} from "./chunk-3GSLHHK2.mjs";
|
|
4
|
+
|
|
5
|
+
// src/lib/utils.ts
|
|
6
|
+
import { clsx } from "clsx";
|
|
7
|
+
import { twMerge } from "tailwind-merge";
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// src/components/ui/button.tsx
|
|
13
|
+
import * as React from "react";
|
|
14
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
15
|
+
import { cva } from "class-variance-authority";
|
|
16
|
+
import { jsx } from "react/jsx-runtime";
|
|
17
|
+
var buttonVariants = cva(
|
|
18
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98]",
|
|
19
|
+
{
|
|
20
|
+
variants: {
|
|
21
|
+
variant: {
|
|
22
|
+
default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
23
|
+
destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
|
24
|
+
outline: "border border-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
25
|
+
secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
|
|
26
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
27
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
28
|
+
/* Esprydi Signature Ocean Variants (Tanpa Warna Neon) */
|
|
29
|
+
glow: "bg-[#086288] text-[#FFFEFC] font-semibold shadow-sm hover:bg-[#064e6d] active:scale-[0.98]",
|
|
30
|
+
coastal: "bg-[#4D8DBA] text-[#FFFEFC] font-semibold shadow-sm hover:bg-[#3d779f] active:scale-[0.98]",
|
|
31
|
+
ice: "bg-[#97D7FF] text-[#086288] font-semibold border border-[#97D7FF] hover:bg-[#86cdfc] active:scale-[0.98]",
|
|
32
|
+
glass: "bg-white/80 backdrop-blur-md border border-[#086288]/20 text-[#086288] hover:bg-[#086288]/10 shadow-sm",
|
|
33
|
+
subtle: "bg-[#4D8DBA]/10 border border-[#4D8DBA]/20 text-[#086288] hover:bg-[#4D8DBA]/20"
|
|
34
|
+
},
|
|
35
|
+
size: {
|
|
36
|
+
default: "h-9 px-4 py-2",
|
|
37
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
38
|
+
lg: "h-11 rounded-lg px-8 text-base",
|
|
39
|
+
icon: "h-9 w-9"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
variant: "default",
|
|
44
|
+
size: "default"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
var Button = React.forwardRef(
|
|
49
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
50
|
+
const Comp = asChild ? Slot : "button";
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
Comp,
|
|
53
|
+
{
|
|
54
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
55
|
+
ref,
|
|
56
|
+
...props
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
Button.displayName = "Button";
|
|
62
|
+
|
|
63
|
+
// src/components/ui/card.tsx
|
|
64
|
+
import * as React2 from "react";
|
|
65
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
66
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
67
|
+
var cardVariants = cva2(
|
|
68
|
+
"rounded-xl transition-all duration-300 text-card-foreground",
|
|
69
|
+
{
|
|
70
|
+
variants: {
|
|
71
|
+
variant: {
|
|
72
|
+
default: "border border-border bg-card shadow-sm",
|
|
73
|
+
glass: "bg-white/90 backdrop-blur-md border border-[#4D8DBA]/20 shadow-sm hover:border-[#086288]/40 hover:shadow-md",
|
|
74
|
+
elevated: "bg-white border border-[#086288]/20 shadow-md hover:shadow-lg",
|
|
75
|
+
glow: "border-t-4 border-t-[#086288] border-x border-b border-border bg-white shadow-sm hover:shadow-md",
|
|
76
|
+
coastal: "border-t-4 border-t-[#4D8DBA] border-x border-b border-border bg-white shadow-sm hover:shadow-md",
|
|
77
|
+
ice: "border-t-4 border-t-[#97D7FF] border-x border-b border-border bg-white shadow-sm hover:shadow-md"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
defaultVariants: {
|
|
81
|
+
variant: "default"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
var Card = React2.forwardRef(
|
|
86
|
+
({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
ref,
|
|
90
|
+
className: cn(cardVariants({ variant }), className),
|
|
91
|
+
...props
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
);
|
|
95
|
+
Card.displayName = "Card";
|
|
96
|
+
var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
97
|
+
"div",
|
|
98
|
+
{
|
|
99
|
+
ref,
|
|
100
|
+
className: cn("flex flex-col space-y-1.5 p-6", className),
|
|
101
|
+
...props
|
|
102
|
+
}
|
|
103
|
+
));
|
|
104
|
+
CardHeader.displayName = "CardHeader";
|
|
105
|
+
var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
106
|
+
"h3",
|
|
107
|
+
{
|
|
108
|
+
ref,
|
|
109
|
+
className: cn("font-semibold leading-none tracking-tight", className),
|
|
110
|
+
...props
|
|
111
|
+
}
|
|
112
|
+
));
|
|
113
|
+
CardTitle.displayName = "CardTitle";
|
|
114
|
+
var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
115
|
+
"p",
|
|
116
|
+
{
|
|
117
|
+
ref,
|
|
118
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
119
|
+
...props
|
|
120
|
+
}
|
|
121
|
+
));
|
|
122
|
+
CardDescription.displayName = "CardDescription";
|
|
123
|
+
var CardContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2("div", { ref, className: cn("p-6 pt-0", className), ...props }));
|
|
124
|
+
CardContent.displayName = "CardContent";
|
|
125
|
+
var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
126
|
+
"div",
|
|
127
|
+
{
|
|
128
|
+
ref,
|
|
129
|
+
className: cn("flex items-center p-6 pt-0", className),
|
|
130
|
+
...props
|
|
131
|
+
}
|
|
132
|
+
));
|
|
133
|
+
CardFooter.displayName = "CardFooter";
|
|
134
|
+
|
|
135
|
+
// src/components/ui/badge.tsx
|
|
136
|
+
import { cva as cva3 } from "class-variance-authority";
|
|
137
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
138
|
+
var badgeVariants = cva3(
|
|
139
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
140
|
+
{
|
|
141
|
+
variants: {
|
|
142
|
+
variant: {
|
|
143
|
+
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
144
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
145
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
146
|
+
outline: "text-foreground border-border",
|
|
147
|
+
/* Esprydi Signature Ocean Badges (Tanpa Warna Neon) */
|
|
148
|
+
ocean: "border-[#086288]/30 bg-[#086288]/10 text-[#086288] font-semibold",
|
|
149
|
+
coastal: "border-[#4D8DBA]/30 bg-[#4D8DBA]/10 text-[#086288] font-semibold",
|
|
150
|
+
ice: "border-[#97D7FF] bg-[#97D7FF]/30 text-[#086288] font-semibold",
|
|
151
|
+
subtle: "border-border/60 bg-surface-2 text-muted-foreground"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
defaultVariants: {
|
|
155
|
+
variant: "default"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
);
|
|
159
|
+
function Badge({ className, variant, dot = false, children, ...props }) {
|
|
160
|
+
return /* @__PURE__ */ jsxs("div", { className: cn(badgeVariants({ variant }), className), ...props, children: [
|
|
161
|
+
dot && /* @__PURE__ */ jsx3("span", { className: "mr-1.5 h-1.5 w-1.5 rounded-full bg-current animate-pulse" }),
|
|
162
|
+
children
|
|
163
|
+
] });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// src/components/ui/input.tsx
|
|
167
|
+
import * as React3 from "react";
|
|
168
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
169
|
+
var Input = React3.forwardRef(
|
|
170
|
+
({ className, type, glow = true, ...props }, ref) => {
|
|
171
|
+
return /* @__PURE__ */ jsx4(
|
|
172
|
+
"input",
|
|
173
|
+
{
|
|
174
|
+
type,
|
|
175
|
+
className: cn(
|
|
176
|
+
"flex h-9 w-full rounded-lg border border-input bg-surface-1 px-3 py-1 text-sm shadow-sm transition-all duration-200 file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
177
|
+
glow && "focus-visible:border-primary/50 focus-visible:ring-primary/20",
|
|
178
|
+
className
|
|
179
|
+
),
|
|
180
|
+
ref,
|
|
181
|
+
...props
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
Input.displayName = "Input";
|
|
187
|
+
|
|
188
|
+
// src/components/ui/textarea.tsx
|
|
189
|
+
import * as React4 from "react";
|
|
190
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
191
|
+
var Textarea = React4.forwardRef(
|
|
192
|
+
({ className, glow = true, ...props }, ref) => {
|
|
193
|
+
return /* @__PURE__ */ jsx5(
|
|
194
|
+
"textarea",
|
|
195
|
+
{
|
|
196
|
+
className: cn(
|
|
197
|
+
"flex min-h-[80px] w-full rounded-lg border border-input bg-surface-1 px-3 py-2 text-sm shadow-sm transition-all duration-200 placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
198
|
+
glow && "focus-visible:border-primary/50 focus-visible:ring-primary/20",
|
|
199
|
+
className
|
|
200
|
+
),
|
|
201
|
+
ref,
|
|
202
|
+
...props
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
Textarea.displayName = "Textarea";
|
|
208
|
+
|
|
209
|
+
// src/components/ui/dialog.tsx
|
|
210
|
+
import * as React5 from "react";
|
|
211
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
212
|
+
import { X } from "lucide-react";
|
|
213
|
+
import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
214
|
+
var Dialog = DialogPrimitive.Root;
|
|
215
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
216
|
+
var DialogPortal = DialogPrimitive.Portal;
|
|
217
|
+
var DialogClose = DialogPrimitive.Close;
|
|
218
|
+
var DialogOverlay = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
219
|
+
DialogPrimitive.Overlay,
|
|
220
|
+
{
|
|
221
|
+
ref,
|
|
222
|
+
className: cn(
|
|
223
|
+
"fixed inset-0 z-50 bg-black/70 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
224
|
+
className
|
|
225
|
+
),
|
|
226
|
+
...props
|
|
227
|
+
}
|
|
228
|
+
));
|
|
229
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
230
|
+
var DialogContent = React5.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs2(DialogPortal, { children: [
|
|
231
|
+
/* @__PURE__ */ jsx6(DialogOverlay, {}),
|
|
232
|
+
/* @__PURE__ */ jsxs2(
|
|
233
|
+
DialogPrimitive.Content,
|
|
234
|
+
{
|
|
235
|
+
ref,
|
|
236
|
+
className: cn(
|
|
237
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border/80 bg-card/95 p-6 shadow-2xl backdrop-blur-xl duration-200 rounded-xl",
|
|
238
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
|
|
239
|
+
className
|
|
240
|
+
),
|
|
241
|
+
...props,
|
|
242
|
+
children: [
|
|
243
|
+
children,
|
|
244
|
+
/* @__PURE__ */ jsxs2(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none", children: [
|
|
245
|
+
/* @__PURE__ */ jsx6(X, { className: "h-4 w-4 text-muted-foreground hover:text-foreground" }),
|
|
246
|
+
/* @__PURE__ */ jsx6("span", { className: "sr-only", children: "Close" })
|
|
247
|
+
] })
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
)
|
|
251
|
+
] }));
|
|
252
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
253
|
+
var DialogHeader = ({
|
|
254
|
+
className,
|
|
255
|
+
...props
|
|
256
|
+
}) => /* @__PURE__ */ jsx6(
|
|
257
|
+
"div",
|
|
258
|
+
{
|
|
259
|
+
className: cn(
|
|
260
|
+
"flex flex-col space-y-1.5 text-center sm:text-left",
|
|
261
|
+
className
|
|
262
|
+
),
|
|
263
|
+
...props
|
|
264
|
+
}
|
|
265
|
+
);
|
|
266
|
+
DialogHeader.displayName = "DialogHeader";
|
|
267
|
+
var DialogFooter = ({
|
|
268
|
+
className,
|
|
269
|
+
...props
|
|
270
|
+
}) => /* @__PURE__ */ jsx6(
|
|
271
|
+
"div",
|
|
272
|
+
{
|
|
273
|
+
className: cn(
|
|
274
|
+
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
|
275
|
+
className
|
|
276
|
+
),
|
|
277
|
+
...props
|
|
278
|
+
}
|
|
279
|
+
);
|
|
280
|
+
DialogFooter.displayName = "DialogFooter";
|
|
281
|
+
var DialogTitle = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
282
|
+
DialogPrimitive.Title,
|
|
283
|
+
{
|
|
284
|
+
ref,
|
|
285
|
+
className: cn(
|
|
286
|
+
"text-lg font-semibold leading-none tracking-tight text-foreground",
|
|
287
|
+
className
|
|
288
|
+
),
|
|
289
|
+
...props
|
|
290
|
+
}
|
|
291
|
+
));
|
|
292
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
293
|
+
var DialogDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
294
|
+
DialogPrimitive.Description,
|
|
295
|
+
{
|
|
296
|
+
ref,
|
|
297
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
298
|
+
...props
|
|
299
|
+
}
|
|
300
|
+
));
|
|
301
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
302
|
+
|
|
303
|
+
// src/components/ui/dropdown-menu.tsx
|
|
304
|
+
import * as React6 from "react";
|
|
305
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
306
|
+
import { Check, ChevronRight, Circle } from "lucide-react";
|
|
307
|
+
import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
308
|
+
var DropdownMenu = DropdownMenuPrimitive.Root;
|
|
309
|
+
var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
310
|
+
var DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
311
|
+
var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
312
|
+
var DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
313
|
+
var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
314
|
+
var DropdownMenuSubTrigger = React6.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs3(
|
|
315
|
+
DropdownMenuPrimitive.SubTrigger,
|
|
316
|
+
{
|
|
317
|
+
ref,
|
|
318
|
+
className: cn(
|
|
319
|
+
"flex cursor-default select-none items-center rounded-md px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
|
|
320
|
+
inset && "pl-8",
|
|
321
|
+
className
|
|
322
|
+
),
|
|
323
|
+
...props,
|
|
324
|
+
children: [
|
|
325
|
+
children,
|
|
326
|
+
/* @__PURE__ */ jsx7(ChevronRight, { className: "ml-auto h-4 w-4" })
|
|
327
|
+
]
|
|
328
|
+
}
|
|
329
|
+
));
|
|
330
|
+
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
|
|
331
|
+
var DropdownMenuSubContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
332
|
+
DropdownMenuPrimitive.SubContent,
|
|
333
|
+
{
|
|
334
|
+
ref,
|
|
335
|
+
className: cn(
|
|
336
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-lg border border-border/70 bg-popover/95 p-1 text-popover-foreground shadow-xl backdrop-blur-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
337
|
+
className
|
|
338
|
+
),
|
|
339
|
+
...props
|
|
340
|
+
}
|
|
341
|
+
));
|
|
342
|
+
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
|
|
343
|
+
var DropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx7(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx7(
|
|
344
|
+
DropdownMenuPrimitive.Content,
|
|
345
|
+
{
|
|
346
|
+
ref,
|
|
347
|
+
sideOffset,
|
|
348
|
+
className: cn(
|
|
349
|
+
"z-50 min-w-[10rem] overflow-hidden rounded-lg border border-border/70 bg-popover/95 p-1 text-popover-foreground shadow-xl backdrop-blur-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
350
|
+
className
|
|
351
|
+
),
|
|
352
|
+
...props
|
|
353
|
+
}
|
|
354
|
+
) }));
|
|
355
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
356
|
+
var DropdownMenuItem = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
357
|
+
DropdownMenuPrimitive.Item,
|
|
358
|
+
{
|
|
359
|
+
ref,
|
|
360
|
+
className: cn(
|
|
361
|
+
"relative flex cursor-pointer select-none items-center rounded-md px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
362
|
+
inset && "pl-8",
|
|
363
|
+
className
|
|
364
|
+
),
|
|
365
|
+
...props
|
|
366
|
+
}
|
|
367
|
+
));
|
|
368
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
|
|
369
|
+
var DropdownMenuCheckboxItem = React6.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs3(
|
|
370
|
+
DropdownMenuPrimitive.CheckboxItem,
|
|
371
|
+
{
|
|
372
|
+
ref,
|
|
373
|
+
className: cn(
|
|
374
|
+
"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
375
|
+
className
|
|
376
|
+
),
|
|
377
|
+
checked,
|
|
378
|
+
...props,
|
|
379
|
+
children: [
|
|
380
|
+
/* @__PURE__ */ jsx7("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx7(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx7(Check, { className: "h-4 w-4 text-primary" }) }) }),
|
|
381
|
+
children
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
));
|
|
385
|
+
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
|
|
386
|
+
var DropdownMenuRadioItem = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs3(
|
|
387
|
+
DropdownMenuPrimitive.RadioItem,
|
|
388
|
+
{
|
|
389
|
+
ref,
|
|
390
|
+
className: cn(
|
|
391
|
+
"relative flex cursor-default select-none items-center rounded-md py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
392
|
+
className
|
|
393
|
+
),
|
|
394
|
+
...props,
|
|
395
|
+
children: [
|
|
396
|
+
/* @__PURE__ */ jsx7("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx7(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx7(Circle, { className: "h-2 w-2 fill-current text-primary" }) }) }),
|
|
397
|
+
children
|
|
398
|
+
]
|
|
399
|
+
}
|
|
400
|
+
));
|
|
401
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
|
|
402
|
+
var DropdownMenuLabel = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
403
|
+
DropdownMenuPrimitive.Label,
|
|
404
|
+
{
|
|
405
|
+
ref,
|
|
406
|
+
className: cn(
|
|
407
|
+
"px-2 py-1.5 text-xs font-semibold text-muted-foreground",
|
|
408
|
+
inset && "pl-8",
|
|
409
|
+
className
|
|
410
|
+
),
|
|
411
|
+
...props
|
|
412
|
+
}
|
|
413
|
+
));
|
|
414
|
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
|
|
415
|
+
var DropdownMenuSeparator = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
416
|
+
DropdownMenuPrimitive.Separator,
|
|
417
|
+
{
|
|
418
|
+
ref,
|
|
419
|
+
className: cn("-mx-1 my-1 h-px bg-border/60", className),
|
|
420
|
+
...props
|
|
421
|
+
}
|
|
422
|
+
));
|
|
423
|
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
|
|
424
|
+
|
|
425
|
+
// src/components/ui/tooltip.tsx
|
|
426
|
+
import * as React7 from "react";
|
|
427
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
428
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
429
|
+
var TooltipProvider = TooltipPrimitive.Provider;
|
|
430
|
+
var Tooltip = TooltipPrimitive.Root;
|
|
431
|
+
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
432
|
+
var TooltipContent = React7.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx8(
|
|
433
|
+
TooltipPrimitive.Content,
|
|
434
|
+
{
|
|
435
|
+
ref,
|
|
436
|
+
sideOffset,
|
|
437
|
+
className: cn(
|
|
438
|
+
"z-50 overflow-hidden rounded-md border border-border/80 bg-popover/90 px-3 py-1.5 text-xs text-popover-foreground shadow-md backdrop-blur-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
439
|
+
className
|
|
440
|
+
),
|
|
441
|
+
...props
|
|
442
|
+
}
|
|
443
|
+
));
|
|
444
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
445
|
+
|
|
446
|
+
// src/components/ui/table.tsx
|
|
447
|
+
import * as React8 from "react";
|
|
448
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
449
|
+
var Table = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9("div", { className: "relative w-full overflow-auto rounded-xl border border-border/60 bg-surface-1/40 backdrop-blur-sm", children: /* @__PURE__ */ jsx9(
|
|
450
|
+
"table",
|
|
451
|
+
{
|
|
452
|
+
ref,
|
|
453
|
+
className: cn("w-full caption-bottom text-sm", className),
|
|
454
|
+
...props
|
|
455
|
+
}
|
|
456
|
+
) }));
|
|
457
|
+
Table.displayName = "Table";
|
|
458
|
+
var TableHeader = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
459
|
+
"thead",
|
|
460
|
+
{
|
|
461
|
+
ref,
|
|
462
|
+
className: cn(
|
|
463
|
+
"border-b border-[#086288]/20 bg-[#97D7FF]/35 text-slate-900 font-bold [&_th]:text-slate-900 [&_th]:font-bold [&_tr]:border-b-0",
|
|
464
|
+
className
|
|
465
|
+
),
|
|
466
|
+
...props
|
|
467
|
+
}
|
|
468
|
+
));
|
|
469
|
+
TableHeader.displayName = "TableHeader";
|
|
470
|
+
var TableBody = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
471
|
+
"tbody",
|
|
472
|
+
{
|
|
473
|
+
ref,
|
|
474
|
+
className: cn("[&_tr:last-child]:border-0", className),
|
|
475
|
+
...props
|
|
476
|
+
}
|
|
477
|
+
));
|
|
478
|
+
TableBody.displayName = "TableBody";
|
|
479
|
+
var TableFooter = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
480
|
+
"tfoot",
|
|
481
|
+
{
|
|
482
|
+
ref,
|
|
483
|
+
className: cn(
|
|
484
|
+
"border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0",
|
|
485
|
+
className
|
|
486
|
+
),
|
|
487
|
+
...props
|
|
488
|
+
}
|
|
489
|
+
));
|
|
490
|
+
TableFooter.displayName = "TableFooter";
|
|
491
|
+
var TableRow = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
492
|
+
"tr",
|
|
493
|
+
{
|
|
494
|
+
ref,
|
|
495
|
+
className: cn(
|
|
496
|
+
"border-b border-border/40 transition-colors hover:bg-surface-2/50 data-[state=selected]:bg-muted",
|
|
497
|
+
className
|
|
498
|
+
),
|
|
499
|
+
...props
|
|
500
|
+
}
|
|
501
|
+
));
|
|
502
|
+
TableRow.displayName = "TableRow";
|
|
503
|
+
var TableHead = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
504
|
+
"th",
|
|
505
|
+
{
|
|
506
|
+
ref,
|
|
507
|
+
className: cn(
|
|
508
|
+
"h-10 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
|
|
509
|
+
className
|
|
510
|
+
),
|
|
511
|
+
...props
|
|
512
|
+
}
|
|
513
|
+
));
|
|
514
|
+
TableHead.displayName = "TableHead";
|
|
515
|
+
var TableCell = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
516
|
+
"td",
|
|
517
|
+
{
|
|
518
|
+
ref,
|
|
519
|
+
className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className),
|
|
520
|
+
...props
|
|
521
|
+
}
|
|
522
|
+
));
|
|
523
|
+
TableCell.displayName = "TableCell";
|
|
524
|
+
var TableCaption = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
525
|
+
"caption",
|
|
526
|
+
{
|
|
527
|
+
ref,
|
|
528
|
+
className: cn("mt-4 text-sm text-muted-foreground", className),
|
|
529
|
+
...props
|
|
530
|
+
}
|
|
531
|
+
));
|
|
532
|
+
TableCaption.displayName = "TableCaption";
|
|
533
|
+
|
|
534
|
+
// src/components/ui/avatar.tsx
|
|
535
|
+
import * as React9 from "react";
|
|
536
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
537
|
+
function Avatar({
|
|
538
|
+
src,
|
|
539
|
+
alt = "Avatar",
|
|
540
|
+
fallback = "U",
|
|
541
|
+
glow = false,
|
|
542
|
+
className,
|
|
543
|
+
...props
|
|
544
|
+
}) {
|
|
545
|
+
const [hasError, setHasError] = React9.useState(!src);
|
|
546
|
+
return /* @__PURE__ */ jsx10(
|
|
547
|
+
"div",
|
|
548
|
+
{
|
|
549
|
+
className: cn(
|
|
550
|
+
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full border border-border/80 bg-surface-2",
|
|
551
|
+
glow && "ring-2 ring-primary/40 shadow-[0_0_12px_rgba(59,130,246,0.25)]",
|
|
552
|
+
className
|
|
553
|
+
),
|
|
554
|
+
...props,
|
|
555
|
+
children: src && !hasError ? /* @__PURE__ */ jsx10(
|
|
556
|
+
"img",
|
|
557
|
+
{
|
|
558
|
+
src,
|
|
559
|
+
alt,
|
|
560
|
+
onError: () => setHasError(true),
|
|
561
|
+
className: "aspect-square h-full w-full object-cover"
|
|
562
|
+
}
|
|
563
|
+
) : /* @__PURE__ */ jsx10("div", { className: "flex h-full w-full items-center justify-center font-medium text-xs text-muted-foreground uppercase", children: fallback })
|
|
564
|
+
}
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// src/components/ui/skeleton.tsx
|
|
569
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
570
|
+
function Skeleton({
|
|
571
|
+
className,
|
|
572
|
+
...props
|
|
573
|
+
}) {
|
|
574
|
+
return /* @__PURE__ */ jsx11(
|
|
575
|
+
"div",
|
|
576
|
+
{
|
|
577
|
+
className: cn(
|
|
578
|
+
"animate-pulse rounded-md bg-surface-2/80",
|
|
579
|
+
className
|
|
580
|
+
),
|
|
581
|
+
...props
|
|
582
|
+
}
|
|
583
|
+
);
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// src/components/layout/shell.tsx
|
|
587
|
+
import { jsx as jsx12, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
588
|
+
function AppShell({
|
|
589
|
+
sidebar,
|
|
590
|
+
header,
|
|
591
|
+
children,
|
|
592
|
+
className,
|
|
593
|
+
...props
|
|
594
|
+
}) {
|
|
595
|
+
return /* @__PURE__ */ jsxs4(
|
|
596
|
+
"div",
|
|
597
|
+
{
|
|
598
|
+
className: cn(
|
|
599
|
+
"min-h-screen bg-background text-foreground flex antialiased selection:bg-primary/20",
|
|
600
|
+
className
|
|
601
|
+
),
|
|
602
|
+
...props,
|
|
603
|
+
children: [
|
|
604
|
+
sidebar && /* @__PURE__ */ jsx12("aside", { className: "w-64 border-r border-border/70 bg-surface-1/70 backdrop-blur-md hidden md:flex flex-col shrink-0", children: sidebar }),
|
|
605
|
+
/* @__PURE__ */ jsxs4("div", { className: "flex-1 flex flex-col min-w-0", children: [
|
|
606
|
+
header && /* @__PURE__ */ jsx12("header", { className: "h-16 border-b border-border/60 bg-background/80 backdrop-blur-md sticky top-0 z-40 flex items-center px-6 justify-between", children: header }),
|
|
607
|
+
/* @__PURE__ */ jsx12("main", { className: "flex-1 p-6 overflow-y-auto", children })
|
|
608
|
+
] })
|
|
609
|
+
]
|
|
610
|
+
}
|
|
611
|
+
);
|
|
612
|
+
}
|
|
613
|
+
function PageHeader({
|
|
614
|
+
title,
|
|
615
|
+
description,
|
|
616
|
+
actions,
|
|
617
|
+
className,
|
|
618
|
+
...props
|
|
619
|
+
}) {
|
|
620
|
+
return /* @__PURE__ */ jsxs4(
|
|
621
|
+
"div",
|
|
622
|
+
{
|
|
623
|
+
className: cn(
|
|
624
|
+
"flex flex-col md:flex-row md:items-center md:justify-between gap-4 pb-6 border-b border-border/40 mb-6",
|
|
625
|
+
className
|
|
626
|
+
),
|
|
627
|
+
...props,
|
|
628
|
+
children: [
|
|
629
|
+
/* @__PURE__ */ jsxs4("div", { children: [
|
|
630
|
+
/* @__PURE__ */ jsx12("h1", { className: "text-2xl font-bold tracking-tight text-foreground", children: title }),
|
|
631
|
+
description && /* @__PURE__ */ jsx12("p", { className: "text-sm text-muted-foreground mt-1", children: description })
|
|
632
|
+
] }),
|
|
633
|
+
actions && /* @__PURE__ */ jsx12("div", { className: "flex items-center gap-3", children: actions })
|
|
634
|
+
]
|
|
635
|
+
}
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
export {
|
|
639
|
+
AppShell,
|
|
640
|
+
Avatar,
|
|
641
|
+
Badge,
|
|
642
|
+
Button,
|
|
643
|
+
Card,
|
|
644
|
+
CardContent,
|
|
645
|
+
CardDescription,
|
|
646
|
+
CardFooter,
|
|
647
|
+
CardHeader,
|
|
648
|
+
CardTitle,
|
|
649
|
+
Dialog,
|
|
650
|
+
DialogClose,
|
|
651
|
+
DialogContent,
|
|
652
|
+
DialogDescription,
|
|
653
|
+
DialogFooter,
|
|
654
|
+
DialogHeader,
|
|
655
|
+
DialogOverlay,
|
|
656
|
+
DialogPortal,
|
|
657
|
+
DialogTitle,
|
|
658
|
+
DialogTrigger,
|
|
659
|
+
DropdownMenu,
|
|
660
|
+
DropdownMenuCheckboxItem,
|
|
661
|
+
DropdownMenuContent,
|
|
662
|
+
DropdownMenuGroup,
|
|
663
|
+
DropdownMenuItem,
|
|
664
|
+
DropdownMenuLabel,
|
|
665
|
+
DropdownMenuPortal,
|
|
666
|
+
DropdownMenuRadioGroup,
|
|
667
|
+
DropdownMenuRadioItem,
|
|
668
|
+
DropdownMenuSeparator,
|
|
669
|
+
DropdownMenuSub,
|
|
670
|
+
DropdownMenuSubContent,
|
|
671
|
+
DropdownMenuSubTrigger,
|
|
672
|
+
DropdownMenuTrigger,
|
|
673
|
+
Input,
|
|
674
|
+
PageHeader,
|
|
675
|
+
Skeleton,
|
|
676
|
+
Table,
|
|
677
|
+
TableBody,
|
|
678
|
+
TableCaption,
|
|
679
|
+
TableCell,
|
|
680
|
+
TableFooter,
|
|
681
|
+
TableHead,
|
|
682
|
+
TableHeader,
|
|
683
|
+
TableRow,
|
|
684
|
+
Textarea,
|
|
685
|
+
Tooltip,
|
|
686
|
+
TooltipContent,
|
|
687
|
+
TooltipProvider,
|
|
688
|
+
TooltipTrigger,
|
|
689
|
+
badgeVariants,
|
|
690
|
+
buttonVariants,
|
|
691
|
+
cn,
|
|
692
|
+
esprydiPreset
|
|
693
|
+
};
|
|
694
|
+
//# sourceMappingURL=index.mjs.map
|