@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/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