@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.js ADDED
@@ -0,0 +1,859 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ AppShell: () => AppShell,
34
+ Avatar: () => Avatar,
35
+ Badge: () => Badge,
36
+ Button: () => Button,
37
+ Card: () => Card,
38
+ CardContent: () => CardContent,
39
+ CardDescription: () => CardDescription,
40
+ CardFooter: () => CardFooter,
41
+ CardHeader: () => CardHeader,
42
+ CardTitle: () => CardTitle,
43
+ Dialog: () => Dialog,
44
+ DialogClose: () => DialogClose,
45
+ DialogContent: () => DialogContent,
46
+ DialogDescription: () => DialogDescription,
47
+ DialogFooter: () => DialogFooter,
48
+ DialogHeader: () => DialogHeader,
49
+ DialogOverlay: () => DialogOverlay,
50
+ DialogPortal: () => DialogPortal,
51
+ DialogTitle: () => DialogTitle,
52
+ DialogTrigger: () => DialogTrigger,
53
+ DropdownMenu: () => DropdownMenu,
54
+ DropdownMenuCheckboxItem: () => DropdownMenuCheckboxItem,
55
+ DropdownMenuContent: () => DropdownMenuContent,
56
+ DropdownMenuGroup: () => DropdownMenuGroup,
57
+ DropdownMenuItem: () => DropdownMenuItem,
58
+ DropdownMenuLabel: () => DropdownMenuLabel,
59
+ DropdownMenuPortal: () => DropdownMenuPortal,
60
+ DropdownMenuRadioGroup: () => DropdownMenuRadioGroup,
61
+ DropdownMenuRadioItem: () => DropdownMenuRadioItem,
62
+ DropdownMenuSeparator: () => DropdownMenuSeparator,
63
+ DropdownMenuSub: () => DropdownMenuSub,
64
+ DropdownMenuSubContent: () => DropdownMenuSubContent,
65
+ DropdownMenuSubTrigger: () => DropdownMenuSubTrigger,
66
+ DropdownMenuTrigger: () => DropdownMenuTrigger,
67
+ Input: () => Input,
68
+ PageHeader: () => PageHeader,
69
+ Skeleton: () => Skeleton,
70
+ Table: () => Table,
71
+ TableBody: () => TableBody,
72
+ TableCaption: () => TableCaption,
73
+ TableCell: () => TableCell,
74
+ TableFooter: () => TableFooter,
75
+ TableHead: () => TableHead,
76
+ TableHeader: () => TableHeader,
77
+ TableRow: () => TableRow,
78
+ Textarea: () => Textarea,
79
+ Tooltip: () => Tooltip,
80
+ TooltipContent: () => TooltipContent,
81
+ TooltipProvider: () => TooltipProvider,
82
+ TooltipTrigger: () => TooltipTrigger,
83
+ badgeVariants: () => badgeVariants,
84
+ buttonVariants: () => buttonVariants,
85
+ cn: () => cn,
86
+ esprydiPreset: () => esprydiPreset
87
+ });
88
+ module.exports = __toCommonJS(src_exports);
89
+
90
+ // src/lib/utils.ts
91
+ var import_clsx = require("clsx");
92
+ var import_tailwind_merge = require("tailwind-merge");
93
+ function cn(...inputs) {
94
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
95
+ }
96
+
97
+ // src/components/ui/button.tsx
98
+ var React = __toESM(require("react"));
99
+ var import_react_slot = require("@radix-ui/react-slot");
100
+ var import_class_variance_authority = require("class-variance-authority");
101
+ var import_jsx_runtime = require("react/jsx-runtime");
102
+ var buttonVariants = (0, import_class_variance_authority.cva)(
103
+ "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]",
104
+ {
105
+ variants: {
106
+ variant: {
107
+ default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
108
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
109
+ outline: "border border-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
110
+ secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
111
+ ghost: "hover:bg-accent hover:text-accent-foreground",
112
+ link: "text-primary underline-offset-4 hover:underline",
113
+ /* Esprydi Signature Ocean Variants (Tanpa Warna Neon) */
114
+ glow: "bg-[#086288] text-[#FFFEFC] font-semibold shadow-sm hover:bg-[#064e6d] active:scale-[0.98]",
115
+ coastal: "bg-[#4D8DBA] text-[#FFFEFC] font-semibold shadow-sm hover:bg-[#3d779f] active:scale-[0.98]",
116
+ ice: "bg-[#97D7FF] text-[#086288] font-semibold border border-[#97D7FF] hover:bg-[#86cdfc] active:scale-[0.98]",
117
+ glass: "bg-white/80 backdrop-blur-md border border-[#086288]/20 text-[#086288] hover:bg-[#086288]/10 shadow-sm",
118
+ subtle: "bg-[#4D8DBA]/10 border border-[#4D8DBA]/20 text-[#086288] hover:bg-[#4D8DBA]/20"
119
+ },
120
+ size: {
121
+ default: "h-9 px-4 py-2",
122
+ sm: "h-8 rounded-md px-3 text-xs",
123
+ lg: "h-11 rounded-lg px-8 text-base",
124
+ icon: "h-9 w-9"
125
+ }
126
+ },
127
+ defaultVariants: {
128
+ variant: "default",
129
+ size: "default"
130
+ }
131
+ }
132
+ );
133
+ var Button = React.forwardRef(
134
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
135
+ const Comp = asChild ? import_react_slot.Slot : "button";
136
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
137
+ Comp,
138
+ {
139
+ className: cn(buttonVariants({ variant, size, className })),
140
+ ref,
141
+ ...props
142
+ }
143
+ );
144
+ }
145
+ );
146
+ Button.displayName = "Button";
147
+
148
+ // src/components/ui/card.tsx
149
+ var React2 = __toESM(require("react"));
150
+ var import_class_variance_authority2 = require("class-variance-authority");
151
+ var import_jsx_runtime2 = require("react/jsx-runtime");
152
+ var cardVariants = (0, import_class_variance_authority2.cva)(
153
+ "rounded-xl transition-all duration-300 text-card-foreground",
154
+ {
155
+ variants: {
156
+ variant: {
157
+ default: "border border-border bg-card shadow-sm",
158
+ glass: "bg-white/90 backdrop-blur-md border border-[#4D8DBA]/20 shadow-sm hover:border-[#086288]/40 hover:shadow-md",
159
+ elevated: "bg-white border border-[#086288]/20 shadow-md hover:shadow-lg",
160
+ glow: "border-t-4 border-t-[#086288] border-x border-b border-border bg-white shadow-sm hover:shadow-md",
161
+ coastal: "border-t-4 border-t-[#4D8DBA] border-x border-b border-border bg-white shadow-sm hover:shadow-md",
162
+ ice: "border-t-4 border-t-[#97D7FF] border-x border-b border-border bg-white shadow-sm hover:shadow-md"
163
+ }
164
+ },
165
+ defaultVariants: {
166
+ variant: "default"
167
+ }
168
+ }
169
+ );
170
+ var Card = React2.forwardRef(
171
+ ({ className, variant, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
172
+ "div",
173
+ {
174
+ ref,
175
+ className: cn(cardVariants({ variant }), className),
176
+ ...props
177
+ }
178
+ )
179
+ );
180
+ Card.displayName = "Card";
181
+ var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
182
+ "div",
183
+ {
184
+ ref,
185
+ className: cn("flex flex-col space-y-1.5 p-6", className),
186
+ ...props
187
+ }
188
+ ));
189
+ CardHeader.displayName = "CardHeader";
190
+ var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
191
+ "h3",
192
+ {
193
+ ref,
194
+ className: cn("font-semibold leading-none tracking-tight", className),
195
+ ...props
196
+ }
197
+ ));
198
+ CardTitle.displayName = "CardTitle";
199
+ var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
200
+ "p",
201
+ {
202
+ ref,
203
+ className: cn("text-sm text-muted-foreground", className),
204
+ ...props
205
+ }
206
+ ));
207
+ CardDescription.displayName = "CardDescription";
208
+ var CardContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { ref, className: cn("p-6 pt-0", className), ...props }));
209
+ CardContent.displayName = "CardContent";
210
+ var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
211
+ "div",
212
+ {
213
+ ref,
214
+ className: cn("flex items-center p-6 pt-0", className),
215
+ ...props
216
+ }
217
+ ));
218
+ CardFooter.displayName = "CardFooter";
219
+
220
+ // src/components/ui/badge.tsx
221
+ var import_class_variance_authority3 = require("class-variance-authority");
222
+ var import_jsx_runtime3 = require("react/jsx-runtime");
223
+ var badgeVariants = (0, import_class_variance_authority3.cva)(
224
+ "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",
225
+ {
226
+ variants: {
227
+ variant: {
228
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
229
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
230
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
231
+ outline: "text-foreground border-border",
232
+ /* Esprydi Signature Ocean Badges (Tanpa Warna Neon) */
233
+ ocean: "border-[#086288]/30 bg-[#086288]/10 text-[#086288] font-semibold",
234
+ coastal: "border-[#4D8DBA]/30 bg-[#4D8DBA]/10 text-[#086288] font-semibold",
235
+ ice: "border-[#97D7FF] bg-[#97D7FF]/30 text-[#086288] font-semibold",
236
+ subtle: "border-border/60 bg-surface-2 text-muted-foreground"
237
+ }
238
+ },
239
+ defaultVariants: {
240
+ variant: "default"
241
+ }
242
+ }
243
+ );
244
+ function Badge({ className, variant, dot = false, children, ...props }) {
245
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: cn(badgeVariants({ variant }), className), ...props, children: [
246
+ dot && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "mr-1.5 h-1.5 w-1.5 rounded-full bg-current animate-pulse" }),
247
+ children
248
+ ] });
249
+ }
250
+
251
+ // src/components/ui/input.tsx
252
+ var React3 = __toESM(require("react"));
253
+ var import_jsx_runtime4 = require("react/jsx-runtime");
254
+ var Input = React3.forwardRef(
255
+ ({ className, type, glow = true, ...props }, ref) => {
256
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
257
+ "input",
258
+ {
259
+ type,
260
+ className: cn(
261
+ "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",
262
+ glow && "focus-visible:border-primary/50 focus-visible:ring-primary/20",
263
+ className
264
+ ),
265
+ ref,
266
+ ...props
267
+ }
268
+ );
269
+ }
270
+ );
271
+ Input.displayName = "Input";
272
+
273
+ // src/components/ui/textarea.tsx
274
+ var React4 = __toESM(require("react"));
275
+ var import_jsx_runtime5 = require("react/jsx-runtime");
276
+ var Textarea = React4.forwardRef(
277
+ ({ className, glow = true, ...props }, ref) => {
278
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
279
+ "textarea",
280
+ {
281
+ className: cn(
282
+ "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",
283
+ glow && "focus-visible:border-primary/50 focus-visible:ring-primary/20",
284
+ className
285
+ ),
286
+ ref,
287
+ ...props
288
+ }
289
+ );
290
+ }
291
+ );
292
+ Textarea.displayName = "Textarea";
293
+
294
+ // src/components/ui/dialog.tsx
295
+ var React5 = __toESM(require("react"));
296
+ var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"));
297
+ var import_lucide_react = require("lucide-react");
298
+ var import_jsx_runtime6 = require("react/jsx-runtime");
299
+ var Dialog = DialogPrimitive.Root;
300
+ var DialogTrigger = DialogPrimitive.Trigger;
301
+ var DialogPortal = DialogPrimitive.Portal;
302
+ var DialogClose = DialogPrimitive.Close;
303
+ var DialogOverlay = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
304
+ DialogPrimitive.Overlay,
305
+ {
306
+ ref,
307
+ className: cn(
308
+ "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",
309
+ className
310
+ ),
311
+ ...props
312
+ }
313
+ ));
314
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
315
+ var DialogContent = React5.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(DialogPortal, { children: [
316
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DialogOverlay, {}),
317
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
318
+ DialogPrimitive.Content,
319
+ {
320
+ ref,
321
+ className: cn(
322
+ "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",
323
+ "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%]",
324
+ className
325
+ ),
326
+ ...props,
327
+ children: [
328
+ children,
329
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(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: [
330
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react.X, { className: "h-4 w-4 text-muted-foreground hover:text-foreground" }),
331
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "sr-only", children: "Close" })
332
+ ] })
333
+ ]
334
+ }
335
+ )
336
+ ] }));
337
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
338
+ var DialogHeader = ({
339
+ className,
340
+ ...props
341
+ }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
342
+ "div",
343
+ {
344
+ className: cn(
345
+ "flex flex-col space-y-1.5 text-center sm:text-left",
346
+ className
347
+ ),
348
+ ...props
349
+ }
350
+ );
351
+ DialogHeader.displayName = "DialogHeader";
352
+ var DialogFooter = ({
353
+ className,
354
+ ...props
355
+ }) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
356
+ "div",
357
+ {
358
+ className: cn(
359
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
360
+ className
361
+ ),
362
+ ...props
363
+ }
364
+ );
365
+ DialogFooter.displayName = "DialogFooter";
366
+ var DialogTitle = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
367
+ DialogPrimitive.Title,
368
+ {
369
+ ref,
370
+ className: cn(
371
+ "text-lg font-semibold leading-none tracking-tight text-foreground",
372
+ className
373
+ ),
374
+ ...props
375
+ }
376
+ ));
377
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
378
+ var DialogDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
379
+ DialogPrimitive.Description,
380
+ {
381
+ ref,
382
+ className: cn("text-sm text-muted-foreground", className),
383
+ ...props
384
+ }
385
+ ));
386
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
387
+
388
+ // src/components/ui/dropdown-menu.tsx
389
+ var React6 = __toESM(require("react"));
390
+ var DropdownMenuPrimitive = __toESM(require("@radix-ui/react-dropdown-menu"));
391
+ var import_lucide_react2 = require("lucide-react");
392
+ var import_jsx_runtime7 = require("react/jsx-runtime");
393
+ var DropdownMenu = DropdownMenuPrimitive.Root;
394
+ var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
395
+ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
396
+ var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
397
+ var DropdownMenuSub = DropdownMenuPrimitive.Sub;
398
+ var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
399
+ var DropdownMenuSubTrigger = React6.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
400
+ DropdownMenuPrimitive.SubTrigger,
401
+ {
402
+ ref,
403
+ className: cn(
404
+ "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",
405
+ inset && "pl-8",
406
+ className
407
+ ),
408
+ ...props,
409
+ children: [
410
+ children,
411
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react2.ChevronRight, { className: "ml-auto h-4 w-4" })
412
+ ]
413
+ }
414
+ ));
415
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
416
+ var DropdownMenuSubContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
417
+ DropdownMenuPrimitive.SubContent,
418
+ {
419
+ ref,
420
+ className: cn(
421
+ "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",
422
+ className
423
+ ),
424
+ ...props
425
+ }
426
+ ));
427
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
428
+ var DropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
429
+ DropdownMenuPrimitive.Content,
430
+ {
431
+ ref,
432
+ sideOffset,
433
+ className: cn(
434
+ "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",
435
+ className
436
+ ),
437
+ ...props
438
+ }
439
+ ) }));
440
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
441
+ var DropdownMenuItem = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
442
+ DropdownMenuPrimitive.Item,
443
+ {
444
+ ref,
445
+ className: cn(
446
+ "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",
447
+ inset && "pl-8",
448
+ className
449
+ ),
450
+ ...props
451
+ }
452
+ ));
453
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
454
+ var DropdownMenuCheckboxItem = React6.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
455
+ DropdownMenuPrimitive.CheckboxItem,
456
+ {
457
+ ref,
458
+ className: cn(
459
+ "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",
460
+ className
461
+ ),
462
+ checked,
463
+ ...props,
464
+ children: [
465
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react2.Check, { className: "h-4 w-4 text-primary" }) }) }),
466
+ children
467
+ ]
468
+ }
469
+ ));
470
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
471
+ var DropdownMenuRadioItem = React6.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
472
+ DropdownMenuPrimitive.RadioItem,
473
+ {
474
+ ref,
475
+ className: cn(
476
+ "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",
477
+ className
478
+ ),
479
+ ...props,
480
+ children: [
481
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react2.Circle, { className: "h-2 w-2 fill-current text-primary" }) }) }),
482
+ children
483
+ ]
484
+ }
485
+ ));
486
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
487
+ var DropdownMenuLabel = React6.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
488
+ DropdownMenuPrimitive.Label,
489
+ {
490
+ ref,
491
+ className: cn(
492
+ "px-2 py-1.5 text-xs font-semibold text-muted-foreground",
493
+ inset && "pl-8",
494
+ className
495
+ ),
496
+ ...props
497
+ }
498
+ ));
499
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
500
+ var DropdownMenuSeparator = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
501
+ DropdownMenuPrimitive.Separator,
502
+ {
503
+ ref,
504
+ className: cn("-mx-1 my-1 h-px bg-border/60", className),
505
+ ...props
506
+ }
507
+ ));
508
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
509
+
510
+ // src/components/ui/tooltip.tsx
511
+ var React7 = __toESM(require("react"));
512
+ var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"));
513
+ var import_jsx_runtime8 = require("react/jsx-runtime");
514
+ var TooltipProvider = TooltipPrimitive.Provider;
515
+ var Tooltip = TooltipPrimitive.Root;
516
+ var TooltipTrigger = TooltipPrimitive.Trigger;
517
+ var TooltipContent = React7.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
518
+ TooltipPrimitive.Content,
519
+ {
520
+ ref,
521
+ sideOffset,
522
+ className: cn(
523
+ "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",
524
+ className
525
+ ),
526
+ ...props
527
+ }
528
+ ));
529
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
530
+
531
+ // src/components/ui/table.tsx
532
+ var React8 = __toESM(require("react"));
533
+ var import_jsx_runtime9 = require("react/jsx-runtime");
534
+ var Table = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "relative w-full overflow-auto rounded-xl border border-border/60 bg-surface-1/40 backdrop-blur-sm", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
535
+ "table",
536
+ {
537
+ ref,
538
+ className: cn("w-full caption-bottom text-sm", className),
539
+ ...props
540
+ }
541
+ ) }));
542
+ Table.displayName = "Table";
543
+ var TableHeader = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
544
+ "thead",
545
+ {
546
+ ref,
547
+ className: cn(
548
+ "border-b border-[#086288]/20 bg-[#97D7FF]/35 text-slate-900 font-bold [&_th]:text-slate-900 [&_th]:font-bold [&_tr]:border-b-0",
549
+ className
550
+ ),
551
+ ...props
552
+ }
553
+ ));
554
+ TableHeader.displayName = "TableHeader";
555
+ var TableBody = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
556
+ "tbody",
557
+ {
558
+ ref,
559
+ className: cn("[&_tr:last-child]:border-0", className),
560
+ ...props
561
+ }
562
+ ));
563
+ TableBody.displayName = "TableBody";
564
+ var TableFooter = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
565
+ "tfoot",
566
+ {
567
+ ref,
568
+ className: cn(
569
+ "border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0",
570
+ className
571
+ ),
572
+ ...props
573
+ }
574
+ ));
575
+ TableFooter.displayName = "TableFooter";
576
+ var TableRow = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
577
+ "tr",
578
+ {
579
+ ref,
580
+ className: cn(
581
+ "border-b border-border/40 transition-colors hover:bg-surface-2/50 data-[state=selected]:bg-muted",
582
+ className
583
+ ),
584
+ ...props
585
+ }
586
+ ));
587
+ TableRow.displayName = "TableRow";
588
+ var TableHead = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
589
+ "th",
590
+ {
591
+ ref,
592
+ className: cn(
593
+ "h-10 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
594
+ className
595
+ ),
596
+ ...props
597
+ }
598
+ ));
599
+ TableHead.displayName = "TableHead";
600
+ var TableCell = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
601
+ "td",
602
+ {
603
+ ref,
604
+ className: cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className),
605
+ ...props
606
+ }
607
+ ));
608
+ TableCell.displayName = "TableCell";
609
+ var TableCaption = React8.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
610
+ "caption",
611
+ {
612
+ ref,
613
+ className: cn("mt-4 text-sm text-muted-foreground", className),
614
+ ...props
615
+ }
616
+ ));
617
+ TableCaption.displayName = "TableCaption";
618
+
619
+ // src/components/ui/avatar.tsx
620
+ var React9 = __toESM(require("react"));
621
+ var import_jsx_runtime10 = require("react/jsx-runtime");
622
+ function Avatar({
623
+ src,
624
+ alt = "Avatar",
625
+ fallback = "U",
626
+ glow = false,
627
+ className,
628
+ ...props
629
+ }) {
630
+ const [hasError, setHasError] = React9.useState(!src);
631
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
632
+ "div",
633
+ {
634
+ className: cn(
635
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full border border-border/80 bg-surface-2",
636
+ glow && "ring-2 ring-primary/40 shadow-[0_0_12px_rgba(59,130,246,0.25)]",
637
+ className
638
+ ),
639
+ ...props,
640
+ children: src && !hasError ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
641
+ "img",
642
+ {
643
+ src,
644
+ alt,
645
+ onError: () => setHasError(true),
646
+ className: "aspect-square h-full w-full object-cover"
647
+ }
648
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex h-full w-full items-center justify-center font-medium text-xs text-muted-foreground uppercase", children: fallback })
649
+ }
650
+ );
651
+ }
652
+
653
+ // src/components/ui/skeleton.tsx
654
+ var import_jsx_runtime11 = require("react/jsx-runtime");
655
+ function Skeleton({
656
+ className,
657
+ ...props
658
+ }) {
659
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
660
+ "div",
661
+ {
662
+ className: cn(
663
+ "animate-pulse rounded-md bg-surface-2/80",
664
+ className
665
+ ),
666
+ ...props
667
+ }
668
+ );
669
+ }
670
+
671
+ // src/components/layout/shell.tsx
672
+ var import_jsx_runtime12 = require("react/jsx-runtime");
673
+ function AppShell({
674
+ sidebar,
675
+ header,
676
+ children,
677
+ className,
678
+ ...props
679
+ }) {
680
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
681
+ "div",
682
+ {
683
+ className: cn(
684
+ "min-h-screen bg-background text-foreground flex antialiased selection:bg-primary/20",
685
+ className
686
+ ),
687
+ ...props,
688
+ children: [
689
+ sidebar && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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 }),
690
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex-1 flex flex-col min-w-0", children: [
691
+ header && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("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 }),
692
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("main", { className: "flex-1 p-6 overflow-y-auto", children })
693
+ ] })
694
+ ]
695
+ }
696
+ );
697
+ }
698
+ function PageHeader({
699
+ title,
700
+ description,
701
+ actions,
702
+ className,
703
+ ...props
704
+ }) {
705
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
706
+ "div",
707
+ {
708
+ className: cn(
709
+ "flex flex-col md:flex-row md:items-center md:justify-between gap-4 pb-6 border-b border-border/40 mb-6",
710
+ className
711
+ ),
712
+ ...props,
713
+ children: [
714
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
715
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h1", { className: "text-2xl font-bold tracking-tight text-foreground", children: title }),
716
+ description && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: description })
717
+ ] }),
718
+ actions && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex items-center gap-3", children: actions })
719
+ ]
720
+ }
721
+ );
722
+ }
723
+
724
+ // src/tailwind/preset.ts
725
+ var esprydiPreset = {
726
+ darkMode: ["class"],
727
+ content: [],
728
+ theme: {
729
+ extend: {
730
+ colors: {
731
+ border: "hsl(var(--border))",
732
+ input: "hsl(var(--input))",
733
+ ring: "hsl(var(--ring))",
734
+ background: "hsl(var(--background))",
735
+ foreground: "hsl(var(--foreground))",
736
+ primary: {
737
+ DEFAULT: "hsl(var(--primary))",
738
+ foreground: "hsl(var(--primary-foreground))"
739
+ },
740
+ secondary: {
741
+ DEFAULT: "hsl(var(--secondary))",
742
+ foreground: "hsl(var(--secondary-foreground))"
743
+ },
744
+ destructive: {
745
+ DEFAULT: "hsl(var(--destructive))",
746
+ foreground: "hsl(var(--destructive-foreground))"
747
+ },
748
+ muted: {
749
+ DEFAULT: "hsl(var(--muted))",
750
+ foreground: "hsl(var(--muted-foreground))"
751
+ },
752
+ accent: {
753
+ DEFAULT: "hsl(var(--accent))",
754
+ foreground: "hsl(var(--accent-foreground))"
755
+ },
756
+ popover: {
757
+ DEFAULT: "hsl(var(--popover))",
758
+ foreground: "hsl(var(--popover-foreground))"
759
+ },
760
+ card: {
761
+ DEFAULT: "hsl(var(--card))",
762
+ foreground: "hsl(var(--card-foreground))"
763
+ },
764
+ surface: {
765
+ 1: "hsl(var(--surface-depth-1))",
766
+ 2: "hsl(var(--surface-depth-2))"
767
+ },
768
+ ocean: {
769
+ deep: "#086288",
770
+ coastal: "#4D8DBA",
771
+ ice: "#97D7FF",
772
+ light: "#FFFEFC"
773
+ }
774
+ },
775
+ borderRadius: {
776
+ lg: "var(--radius)",
777
+ md: "calc(var(--radius) - 2px)",
778
+ sm: "calc(var(--radius) - 4px)"
779
+ },
780
+ keyframes: {
781
+ "accordion-down": {
782
+ from: { height: "0" },
783
+ to: { height: "var(--radix-accordion-content-height)" }
784
+ },
785
+ "accordion-up": {
786
+ from: { height: "var(--radix-accordion-content-height)" },
787
+ to: { height: "0" }
788
+ },
789
+ "pulse-glow": {
790
+ "0%, 100%": { opacity: "0.4", transform: "scale(1)" },
791
+ "50%": { opacity: "0.8", transform: "scale(1.05)" }
792
+ }
793
+ },
794
+ animation: {
795
+ "accordion-down": "accordion-down 0.2s ease-out",
796
+ "accordion-up": "accordion-up 0.2s ease-out",
797
+ "pulse-glow": "pulse-glow 4s ease-in-out infinite"
798
+ }
799
+ }
800
+ }
801
+ };
802
+ // Annotate the CommonJS export names for ESM import in node:
803
+ 0 && (module.exports = {
804
+ AppShell,
805
+ Avatar,
806
+ Badge,
807
+ Button,
808
+ Card,
809
+ CardContent,
810
+ CardDescription,
811
+ CardFooter,
812
+ CardHeader,
813
+ CardTitle,
814
+ Dialog,
815
+ DialogClose,
816
+ DialogContent,
817
+ DialogDescription,
818
+ DialogFooter,
819
+ DialogHeader,
820
+ DialogOverlay,
821
+ DialogPortal,
822
+ DialogTitle,
823
+ DialogTrigger,
824
+ DropdownMenu,
825
+ DropdownMenuCheckboxItem,
826
+ DropdownMenuContent,
827
+ DropdownMenuGroup,
828
+ DropdownMenuItem,
829
+ DropdownMenuLabel,
830
+ DropdownMenuPortal,
831
+ DropdownMenuRadioGroup,
832
+ DropdownMenuRadioItem,
833
+ DropdownMenuSeparator,
834
+ DropdownMenuSub,
835
+ DropdownMenuSubContent,
836
+ DropdownMenuSubTrigger,
837
+ DropdownMenuTrigger,
838
+ Input,
839
+ PageHeader,
840
+ Skeleton,
841
+ Table,
842
+ TableBody,
843
+ TableCaption,
844
+ TableCell,
845
+ TableFooter,
846
+ TableHead,
847
+ TableHeader,
848
+ TableRow,
849
+ Textarea,
850
+ Tooltip,
851
+ TooltipContent,
852
+ TooltipProvider,
853
+ TooltipTrigger,
854
+ badgeVariants,
855
+ buttonVariants,
856
+ cn,
857
+ esprydiPreset
858
+ });
859
+ //# sourceMappingURL=index.js.map