@holaboss/ui 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,904 @@
1
+ import "react";
2
+ import { cva } from "class-variance-authority";
3
+ import { clsx } from "clsx";
4
+ import { twMerge } from "tailwind-merge";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { mergeProps } from "@base-ui/react/merge-props";
7
+ import { useRender } from "@base-ui/react/use-render";
8
+ import { Button as Button$1 } from "@base-ui/react/button";
9
+ import { Menu } from "@base-ui/react/menu";
10
+ import { AlertTriangle, CheckIcon, ChevronDownIcon, ChevronRightIcon, ChevronUpIcon, Search } from "lucide-react";
11
+ import { Input as Input$1 } from "@base-ui/react/input";
12
+ import { Popover as Popover$1 } from "@base-ui/react/popover";
13
+ import { Select as Select$1 } from "@base-ui/react/select";
14
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
15
+ import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
16
+ import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
17
+ //#region src/lib/utils.ts
18
+ function cn(...inputs) {
19
+ return twMerge(clsx(inputs));
20
+ }
21
+ //#endregion
22
+ //#region src/primitives/alert.tsx
23
+ const alertVariants = cva("group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", {
24
+ variants: { variant: {
25
+ default: "bg-card text-card-foreground",
26
+ destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current"
27
+ } },
28
+ defaultVariants: { variant: "default" }
29
+ });
30
+ function Alert({ className, variant, ...props }) {
31
+ return /* @__PURE__ */ jsx("div", {
32
+ "data-slot": "alert",
33
+ role: "alert",
34
+ className: cn(alertVariants({ variant }), className),
35
+ ...props
36
+ });
37
+ }
38
+ function AlertTitle({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "alert-title",
41
+ className: cn("font-heading font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground", className),
42
+ ...props
43
+ });
44
+ }
45
+ function AlertDescription({ className, ...props }) {
46
+ return /* @__PURE__ */ jsx("div", {
47
+ "data-slot": "alert-description",
48
+ className: cn("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className),
49
+ ...props
50
+ });
51
+ }
52
+ function AlertAction({ className, ...props }) {
53
+ return /* @__PURE__ */ jsx("div", {
54
+ "data-slot": "alert-action",
55
+ className: cn("absolute top-2 right-2", className),
56
+ ...props
57
+ });
58
+ }
59
+ //#endregion
60
+ //#region src/primitives/badge.tsx
61
+ const badgeVariants = cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", {
62
+ variants: { variant: {
63
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
64
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
65
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
66
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
67
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted",
68
+ link: "text-primary underline-offset-4 hover:underline"
69
+ } },
70
+ defaultVariants: { variant: "default" }
71
+ });
72
+ function Badge({ className, variant = "default", render, ...props }) {
73
+ return useRender({
74
+ defaultTagName: "span",
75
+ props: mergeProps({ className: cn(badgeVariants({ variant }), className) }, props),
76
+ render,
77
+ state: {
78
+ slot: "badge",
79
+ variant
80
+ }
81
+ });
82
+ }
83
+ //#endregion
84
+ //#region src/primitives/button.tsx
85
+ const buttonVariants = cva("group/button inline-flex shrink-0 items-center justify-center rounded-lg text-sm font-medium whitespace-nowrap transition-colors duration-150 ease-out outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
86
+ variants: {
87
+ variant: {
88
+ default: "bg-primary text-primary-foreground hover:bg-primary/90 [a]:hover:bg-primary/90",
89
+ bordered: "border border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground",
90
+ outline: "border border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground",
91
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
92
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted",
93
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
94
+ link: "text-primary underline-offset-4 hover:underline"
95
+ },
96
+ size: {
97
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
98
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
99
+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
100
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
101
+ icon: "size-8",
102
+ "icon-xs": "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
103
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
104
+ "icon-lg": "size-9"
105
+ }
106
+ },
107
+ defaultVariants: {
108
+ variant: "default",
109
+ size: "default"
110
+ }
111
+ });
112
+ function Button({ className, variant = "default", size = "default", ...props }) {
113
+ return /* @__PURE__ */ jsx(Button$1, {
114
+ "data-slot": "button",
115
+ className: cn(buttonVariants({
116
+ variant,
117
+ size,
118
+ className
119
+ })),
120
+ ...props
121
+ });
122
+ }
123
+ //#endregion
124
+ //#region src/primitives/card.tsx
125
+ function Card({ className, size = "default", ...props }) {
126
+ return /* @__PURE__ */ jsx("div", {
127
+ "data-slot": "card",
128
+ "data-size": size,
129
+ className: cn("group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground shadow-sm has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", className),
130
+ ...props
131
+ });
132
+ }
133
+ function CardHeader({ className, ...props }) {
134
+ return /* @__PURE__ */ jsx("div", {
135
+ "data-slot": "card-header",
136
+ className: cn("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3", className),
137
+ ...props
138
+ });
139
+ }
140
+ function CardTitle({ className, ...props }) {
141
+ return /* @__PURE__ */ jsx("div", {
142
+ "data-slot": "card-title",
143
+ className: cn("font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm", className),
144
+ ...props
145
+ });
146
+ }
147
+ function CardDescription({ className, ...props }) {
148
+ return /* @__PURE__ */ jsx("div", {
149
+ "data-slot": "card-description",
150
+ className: cn("text-sm text-muted-foreground", className),
151
+ ...props
152
+ });
153
+ }
154
+ function CardAction({ className, ...props }) {
155
+ return /* @__PURE__ */ jsx("div", {
156
+ "data-slot": "card-action",
157
+ className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className),
158
+ ...props
159
+ });
160
+ }
161
+ function CardContent({ className, ...props }) {
162
+ return /* @__PURE__ */ jsx("div", {
163
+ "data-slot": "card-content",
164
+ className: cn("px-4 group-data-[size=sm]/card:px-3", className),
165
+ ...props
166
+ });
167
+ }
168
+ function CardFooter({ className, ...props }) {
169
+ return /* @__PURE__ */ jsx("div", {
170
+ "data-slot": "card-footer",
171
+ className: cn("flex items-center rounded-b-xl border-t bg-muted p-4 group-data-[size=sm]/card:p-3", className),
172
+ ...props
173
+ });
174
+ }
175
+ //#endregion
176
+ //#region src/primitives/dropdown-menu.tsx
177
+ function DropdownMenu({ ...props }) {
178
+ return /* @__PURE__ */ jsx(Menu.Root, {
179
+ "data-slot": "dropdown-menu",
180
+ ...props
181
+ });
182
+ }
183
+ function DropdownMenuPortal({ ...props }) {
184
+ return /* @__PURE__ */ jsx(Menu.Portal, {
185
+ "data-slot": "dropdown-menu-portal",
186
+ ...props
187
+ });
188
+ }
189
+ function DropdownMenuTrigger({ ...props }) {
190
+ return /* @__PURE__ */ jsx(Menu.Trigger, {
191
+ "data-slot": "dropdown-menu-trigger",
192
+ ...props
193
+ });
194
+ }
195
+ function DropdownMenuContent({ align = "start", alignOffset = 0, side = "bottom", sideOffset = 4, className, ...props }) {
196
+ return /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, {
197
+ className: "isolate z-50 outline-none",
198
+ align,
199
+ alignOffset,
200
+ side,
201
+ sideOffset,
202
+ children: /* @__PURE__ */ jsx(Menu.Popup, {
203
+ "data-slot": "dropdown-menu-content",
204
+ className: cn("dark z-50 max-h-(--available-height) w-(--anchor-width) min-w-44 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg p-1 text-popover-foreground shadow-md ring-1 ring-border duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:not-data-[variant=destructive]:focus:bg-foreground/10 **:data-[slot$=-item]:not-data-[variant=destructive]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10!", className),
205
+ ...props
206
+ })
207
+ }) });
208
+ }
209
+ function DropdownMenuGroup({ ...props }) {
210
+ return /* @__PURE__ */ jsx(Menu.Group, {
211
+ "data-slot": "dropdown-menu-group",
212
+ ...props
213
+ });
214
+ }
215
+ function DropdownMenuLabel({ className, inset, ...props }) {
216
+ return /* @__PURE__ */ jsx(Menu.GroupLabel, {
217
+ "data-slot": "dropdown-menu-label",
218
+ "data-inset": inset,
219
+ className: cn("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", className),
220
+ ...props
221
+ });
222
+ }
223
+ function DropdownMenuItem({ className, inset, variant = "default", ...props }) {
224
+ return /* @__PURE__ */ jsx(Menu.Item, {
225
+ "data-slot": "dropdown-menu-item",
226
+ "data-inset": inset,
227
+ "data-variant": variant,
228
+ className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-2.5 py-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive", className),
229
+ ...props
230
+ });
231
+ }
232
+ function DropdownMenuSub({ ...props }) {
233
+ return /* @__PURE__ */ jsx(Menu.SubmenuRoot, {
234
+ "data-slot": "dropdown-menu-sub",
235
+ ...props
236
+ });
237
+ }
238
+ function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
239
+ return /* @__PURE__ */ jsxs(Menu.SubmenuTrigger, {
240
+ "data-slot": "dropdown-menu-sub-trigger",
241
+ "data-inset": inset,
242
+ className: cn("flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
243
+ ...props,
244
+ children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto" })]
245
+ });
246
+ }
247
+ function DropdownMenuSubContent({ align = "start", alignOffset = -3, side = "right", sideOffset = 0, className, ...props }) {
248
+ return /* @__PURE__ */ jsx(DropdownMenuContent, {
249
+ "data-slot": "dropdown-menu-sub-content",
250
+ className: cn("dark w-auto min-w-[96px] rounded-lg p-1 text-popover-foreground shadow-lg ring-1 ring-border duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:not-data-[variant=destructive]:focus:bg-foreground/10 **:data-[slot$=-item]:not-data-[variant=destructive]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10!", className),
251
+ align,
252
+ alignOffset,
253
+ side,
254
+ sideOffset,
255
+ ...props
256
+ });
257
+ }
258
+ function DropdownMenuCheckboxItem({ className, children, checked, inset, ...props }) {
259
+ return /* @__PURE__ */ jsxs(Menu.CheckboxItem, {
260
+ "data-slot": "dropdown-menu-checkbox-item",
261
+ "data-inset": inset,
262
+ className: cn("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
263
+ checked,
264
+ ...props,
265
+ children: [/* @__PURE__ */ jsx("span", {
266
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
267
+ "data-slot": "dropdown-menu-checkbox-item-indicator",
268
+ children: /* @__PURE__ */ jsx(Menu.CheckboxItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
269
+ }), children]
270
+ });
271
+ }
272
+ function DropdownMenuRadioGroup({ ...props }) {
273
+ return /* @__PURE__ */ jsx(Menu.RadioGroup, {
274
+ "data-slot": "dropdown-menu-radio-group",
275
+ ...props
276
+ });
277
+ }
278
+ function DropdownMenuRadioItem({ className, children, inset, ...props }) {
279
+ return /* @__PURE__ */ jsxs(Menu.RadioItem, {
280
+ "data-slot": "dropdown-menu-radio-item",
281
+ "data-inset": inset,
282
+ className: cn("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
283
+ ...props,
284
+ children: [/* @__PURE__ */ jsx("span", {
285
+ className: "pointer-events-none absolute right-2 flex items-center justify-center",
286
+ "data-slot": "dropdown-menu-radio-item-indicator",
287
+ children: /* @__PURE__ */ jsx(Menu.RadioItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
288
+ }), children]
289
+ });
290
+ }
291
+ function DropdownMenuSeparator({ className, ...props }) {
292
+ return /* @__PURE__ */ jsx(Menu.Separator, {
293
+ "data-slot": "dropdown-menu-separator",
294
+ className: cn("-mx-1 my-1 h-px bg-border", className),
295
+ ...props
296
+ });
297
+ }
298
+ function DropdownMenuShortcut({ className, ...props }) {
299
+ return /* @__PURE__ */ jsx("span", {
300
+ "data-slot": "dropdown-menu-shortcut",
301
+ className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground", className),
302
+ ...props
303
+ });
304
+ }
305
+ //#endregion
306
+ //#region src/primitives/empty-state.tsx
307
+ function EmptyState({ icon: Icon, title, description, action, size = "sm", minHeight, decorated = false, className }) {
308
+ const isMd = size === "md";
309
+ return /* @__PURE__ */ jsxs("div", {
310
+ className: cn("flex flex-col items-center justify-center text-center", isMd ? "gap-3 px-4 py-14" : "gap-2 py-10 text-muted-foreground", className),
311
+ style: minHeight ? { minHeight } : void 0,
312
+ children: [
313
+ Icon ? isMd ? decorated ? /* @__PURE__ */ jsxs("div", {
314
+ className: "relative flex h-24 w-72 items-center justify-center overflow-hidden",
315
+ children: [/* @__PURE__ */ jsx("div", {
316
+ "aria-hidden": "true",
317
+ className: "pointer-events-none absolute inset-0",
318
+ style: {
319
+ backgroundImage: "linear-gradient(to right, var(--color-fg-8) 1px, transparent 1px), linear-gradient(to bottom, var(--color-fg-8) 1px, transparent 1px)",
320
+ backgroundSize: "32px 32px",
321
+ backgroundPosition: "center center",
322
+ maskImage: "radial-gradient(ellipse at center, black 0%, black 38%, transparent 80%)",
323
+ WebkitMaskImage: "radial-gradient(ellipse at center, black 0%, black 38%, transparent 80%)"
324
+ }
325
+ }), /* @__PURE__ */ jsx("div", {
326
+ className: "relative grid size-12 place-items-center rounded-xl border border-border bg-card text-muted-foreground shadow-xs",
327
+ children: /* @__PURE__ */ jsx(Icon, {
328
+ className: "size-[18px]",
329
+ strokeWidth: 1.6
330
+ })
331
+ })]
332
+ }) : /* @__PURE__ */ jsx("div", {
333
+ className: "grid size-10 place-items-center rounded-xl bg-muted text-muted-foreground",
334
+ children: /* @__PURE__ */ jsx(Icon, {
335
+ className: "size-4",
336
+ strokeWidth: 1.6
337
+ })
338
+ }) : /* @__PURE__ */ jsx(Icon, {
339
+ size: 22,
340
+ strokeWidth: 1.5,
341
+ className: "opacity-45"
342
+ }) : null,
343
+ /* @__PURE__ */ jsx("p", {
344
+ className: isMd ? "text-sm font-medium text-foreground" : "text-xs",
345
+ children: title
346
+ }),
347
+ description ? /* @__PURE__ */ jsx("p", {
348
+ className: isMd ? "max-w-xs text-xs leading-5 text-muted-foreground" : "text-[11px] opacity-70",
349
+ children: description
350
+ }) : null,
351
+ action ? /* @__PURE__ */ jsx("div", {
352
+ className: isMd ? "mt-2" : "mt-1.5",
353
+ children: action
354
+ }) : null
355
+ ]
356
+ });
357
+ }
358
+ //#endregion
359
+ //#region src/primitives/input.tsx
360
+ function Input({ className, type, ...props }) {
361
+ return /* @__PURE__ */ jsx(Input$1, {
362
+ type,
363
+ "data-slot": "input",
364
+ className: cn("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", className),
365
+ ...props
366
+ });
367
+ }
368
+ //#endregion
369
+ //#region src/primitives/kbd.tsx
370
+ /**
371
+ * Kbd — keyboard shortcut hint. Inline `<kbd>` styled as a tiny pill.
372
+ * Use in tooltip footers, menu trailing slots, and help text to teach
373
+ * keyboard grammar continuously.
374
+ *
375
+ * Single-key glyphs (⌘, ⇧, ↑, K) auto-center via the square sizing.
376
+ * For multi-key sequences, render multiple <Kbd> with a separator:
377
+ * <Kbd>⌘</Kbd><Kbd>K</Kbd>
378
+ */
379
+ const kbdVariants = cva("inline-flex items-center justify-center rounded border border-border bg-fg-2 font-mono text-[10px] font-medium text-muted-foreground tabular-nums", {
380
+ variants: { size: {
381
+ sm: "h-4 min-w-4 px-1",
382
+ md: "h-5 min-w-5 px-1.5 text-[11px]"
383
+ } },
384
+ defaultVariants: { size: "sm" }
385
+ });
386
+ function Kbd({ className, size, ...props }) {
387
+ return /* @__PURE__ */ jsx("kbd", {
388
+ "data-slot": "kbd",
389
+ className: cn(kbdVariants({ size }), className),
390
+ ...props
391
+ });
392
+ }
393
+ //#endregion
394
+ //#region src/primitives/label.tsx
395
+ function Label({ className, ...props }) {
396
+ return /* @__PURE__ */ jsx("label", {
397
+ "data-slot": "label",
398
+ className: cn("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className),
399
+ ...props
400
+ });
401
+ }
402
+ //#endregion
403
+ //#region src/primitives/popover.tsx
404
+ function Popover({ ...props }) {
405
+ return /* @__PURE__ */ jsx(Popover$1.Root, {
406
+ "data-slot": "popover",
407
+ ...props
408
+ });
409
+ }
410
+ function PopoverTrigger({ ...props }) {
411
+ return /* @__PURE__ */ jsx(Popover$1.Trigger, {
412
+ "data-slot": "popover-trigger",
413
+ ...props
414
+ });
415
+ }
416
+ function PopoverContent({ className, positionerClassName, align = "center", alignOffset = 0, side = "bottom", sideOffset = 6, ...props }) {
417
+ return /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, {
418
+ align,
419
+ alignOffset,
420
+ side,
421
+ sideOffset,
422
+ className: cn("isolate z-50", positionerClassName),
423
+ children: /* @__PURE__ */ jsx(Popover$1.Popup, {
424
+ "data-slot": "popover-content",
425
+ className: cn("z-50 flex w-72 origin-(--transform-origin) flex-col gap-3 rounded-xl border border-border bg-popover p-4 text-sm text-popover-foreground shadow-2xl ring-0 ring-border outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
426
+ ...props
427
+ })
428
+ }) });
429
+ }
430
+ function PopoverHeader({ className, ...props }) {
431
+ return /* @__PURE__ */ jsx("div", {
432
+ className: cn("flex flex-col gap-1", className),
433
+ ...props
434
+ });
435
+ }
436
+ function PopoverTitle({ className, ...props }) {
437
+ return /* @__PURE__ */ jsx(Popover$1.Title, {
438
+ "data-slot": "popover-title",
439
+ className: cn("text-base font-semibold", className),
440
+ ...props
441
+ });
442
+ }
443
+ function PopoverDescription({ className, ...props }) {
444
+ return /* @__PURE__ */ jsx(Popover$1.Description, {
445
+ "data-slot": "popover-description",
446
+ className: cn("text-muted-foreground", className),
447
+ ...props
448
+ });
449
+ }
450
+ //#endregion
451
+ //#region src/primitives/select.tsx
452
+ const Select = Select$1.Root;
453
+ function SelectGroup({ className, ...props }) {
454
+ return /* @__PURE__ */ jsx(Select$1.Group, {
455
+ "data-slot": "select-group",
456
+ className: cn("scroll-my-1 p-1", className),
457
+ ...props
458
+ });
459
+ }
460
+ function SelectValue({ className, ...props }) {
461
+ return /* @__PURE__ */ jsx(Select$1.Value, {
462
+ "data-slot": "select-value",
463
+ className: cn("flex flex-1 text-left", className),
464
+ ...props
465
+ });
466
+ }
467
+ function SelectTrigger({ className, size = "default", children, ...props }) {
468
+ return /* @__PURE__ */ jsxs(Select$1.Trigger, {
469
+ "data-slot": "select-trigger",
470
+ "data-size": size,
471
+ className: cn("flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
472
+ ...props,
473
+ children: [children, /* @__PURE__ */ jsx(Select$1.Icon, { render: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "pointer-events-none size-4 text-muted-foreground" }) })]
474
+ });
475
+ }
476
+ function SelectContent({ className, children, side = "bottom", sideOffset = 4, align = "center", alignOffset = 0, alignItemWithTrigger = true, ...props }) {
477
+ return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(Select$1.Positioner, {
478
+ side,
479
+ sideOffset,
480
+ align,
481
+ alignOffset,
482
+ alignItemWithTrigger,
483
+ className: "isolate z-50",
484
+ children: /* @__PURE__ */ jsxs(Select$1.Popup, {
485
+ "data-slot": "select-content",
486
+ "data-align-trigger": alignItemWithTrigger,
487
+ className: cn("dark isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg text-popover-foreground shadow-md ring-1 ring-border duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 animate-none! relative bg-popover/70 before:pointer-events-none before:absolute before:inset-0 before:-z-1 before:rounded-[inherit] before:backdrop-blur-2xl before:backdrop-saturate-150 **:data-[slot$=-item]:focus:bg-foreground/10 **:data-[slot$=-item]:data-highlighted:bg-foreground/10 **:data-[slot$=-separator]:bg-fg-5 **:data-[slot$=-trigger]:focus:bg-foreground/10 **:data-[slot$=-trigger]:aria-expanded:bg-foreground/10! **:data-[variant=destructive]:focus:bg-foreground/10! **:data-[variant=destructive]:text-accent-foreground! **:data-[variant=destructive]:**:text-accent-foreground!", className),
488
+ ...props,
489
+ children: [
490
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
491
+ /* @__PURE__ */ jsx(Select$1.List, { children }),
492
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
493
+ ]
494
+ })
495
+ }) });
496
+ }
497
+ function SelectLabel({ className, ...props }) {
498
+ return /* @__PURE__ */ jsx(Select$1.GroupLabel, {
499
+ "data-slot": "select-label",
500
+ className: cn("px-1.5 py-1 text-xs text-muted-foreground", className),
501
+ ...props
502
+ });
503
+ }
504
+ function SelectItem({ className, children, ...props }) {
505
+ return /* @__PURE__ */ jsxs(Select$1.Item, {
506
+ "data-slot": "select-item",
507
+ className: cn("relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", className),
508
+ ...props,
509
+ children: [/* @__PURE__ */ jsx(Select$1.ItemText, {
510
+ className: "flex flex-1 shrink-0 items-center gap-2 whitespace-nowrap",
511
+ children
512
+ }), /* @__PURE__ */ jsx(Select$1.ItemIndicator, {
513
+ render: /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center" }),
514
+ children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none" })
515
+ })]
516
+ });
517
+ }
518
+ function SelectSeparator({ className, ...props }) {
519
+ return /* @__PURE__ */ jsx(Select$1.Separator, {
520
+ "data-slot": "select-separator",
521
+ className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className),
522
+ ...props
523
+ });
524
+ }
525
+ function SelectScrollUpButton({ className, ...props }) {
526
+ return /* @__PURE__ */ jsx(Select$1.ScrollUpArrow, {
527
+ "data-slot": "select-scroll-up-button",
528
+ className: cn("top-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", className),
529
+ ...props,
530
+ children: /* @__PURE__ */ jsx(ChevronUpIcon, {})
531
+ });
532
+ }
533
+ function SelectScrollDownButton({ className, ...props }) {
534
+ return /* @__PURE__ */ jsx(Select$1.ScrollDownArrow, {
535
+ "data-slot": "select-scroll-down-button",
536
+ className: cn("bottom-0 z-10 flex w-full cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", className),
537
+ ...props,
538
+ children: /* @__PURE__ */ jsx(ChevronDownIcon, {})
539
+ });
540
+ }
541
+ //#endregion
542
+ //#region src/primitives/status-dot.tsx
543
+ /**
544
+ * StatusDot — small colored dot signalling a state (running, error,
545
+ * working, idle, etc.). Replaces ~18 hand-rolled
546
+ * `<span className="size-X rounded-full bg-X" />` instances across the
547
+ * shell so a single change here propagates everywhere.
548
+ *
549
+ * Default size = `sm` (6px) which matches the dominant existing usage
550
+ * (status pip alongside text). Use `md` (8px) for slightly more
551
+ * presence (sidebar entry status), `lg` (10px) for stand-alone
552
+ * notification-style indicators.
553
+ *
554
+ * `withRing` adds a card-colored ring — used for badge dots that sit on
555
+ * top of an icon and need to read against the underlying surface.
556
+ */
557
+ const statusDotVariants = cva("inline-block shrink-0 rounded-full", {
558
+ variants: {
559
+ variant: {
560
+ success: "bg-success",
561
+ destructive: "bg-destructive",
562
+ warning: "bg-warning",
563
+ info: "bg-info",
564
+ primary: "bg-primary",
565
+ muted: "bg-muted-foreground",
566
+ neutral: "bg-fg-24"
567
+ },
568
+ size: {
569
+ sm: "size-1.5",
570
+ md: "size-2",
571
+ lg: "size-2.5"
572
+ },
573
+ withRing: {
574
+ true: "border-2 border-card",
575
+ false: ""
576
+ },
577
+ pulse: {
578
+ true: "animate-pulse",
579
+ false: ""
580
+ }
581
+ },
582
+ defaultVariants: {
583
+ variant: "info",
584
+ size: "sm",
585
+ withRing: false,
586
+ pulse: false
587
+ }
588
+ });
589
+ function StatusDot({ className, variant, size, withRing, pulse, render, ...props }) {
590
+ return useRender({
591
+ defaultTagName: "span",
592
+ props: mergeProps({
593
+ className: cn(statusDotVariants({
594
+ variant,
595
+ size,
596
+ withRing,
597
+ pulse
598
+ }), className),
599
+ "aria-hidden": true
600
+ }, props),
601
+ render,
602
+ state: {
603
+ slot: "status-dot",
604
+ variant,
605
+ size
606
+ }
607
+ });
608
+ }
609
+ //#endregion
610
+ //#region src/primitives/switch.tsx
611
+ function Switch({ className, ...props }) {
612
+ return /* @__PURE__ */ jsx(Switch$1.Root, {
613
+ className: cn("group/switch inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-input transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-primary", className),
614
+ ...props,
615
+ children: /* @__PURE__ */ jsx(Switch$1.Thumb, { className: "pointer-events-none block size-4 rounded-full bg-background shadow-sm ring-0 transition-transform data-[checked]:translate-x-4 data-[unchecked]:translate-x-0" })
616
+ });
617
+ }
618
+ //#endregion
619
+ //#region src/primitives/tabs.tsx
620
+ function Tabs({ className, orientation = "horizontal", ...props }) {
621
+ return /* @__PURE__ */ jsx(Tabs$1.Root, {
622
+ "data-slot": "tabs",
623
+ "data-orientation": orientation,
624
+ className: cn("group/tabs flex gap-2 data-horizontal:flex-col", className),
625
+ ...props
626
+ });
627
+ }
628
+ const tabsListVariants = cva("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none", {
629
+ variants: { variant: {
630
+ default: "bg-muted",
631
+ line: "gap-1 bg-transparent"
632
+ } },
633
+ defaultVariants: { variant: "default" }
634
+ });
635
+ function TabsList({ className, variant = "default", ...props }) {
636
+ return /* @__PURE__ */ jsx(Tabs$1.List, {
637
+ "data-slot": "tabs-list",
638
+ "data-variant": variant,
639
+ className: cn(tabsListVariants({ variant }), className),
640
+ ...props
641
+ });
642
+ }
643
+ function TabsTrigger({ className, ...props }) {
644
+ return /* @__PURE__ */ jsx(Tabs$1.Tab, {
645
+ "data-slot": "tabs-trigger",
646
+ className: cn("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground transition-colors group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", className),
647
+ ...props
648
+ });
649
+ }
650
+ function TabsContent({ className, ...props }) {
651
+ return /* @__PURE__ */ jsx(Tabs$1.Panel, {
652
+ "data-slot": "tabs-content",
653
+ className: cn("flex-1 text-sm outline-none", className),
654
+ ...props
655
+ });
656
+ }
657
+ //#endregion
658
+ //#region src/primitives/tooltip.tsx
659
+ function TooltipProvider({ delay = 0, ...props }) {
660
+ return /* @__PURE__ */ jsx(Tooltip$1.Provider, {
661
+ "data-slot": "tooltip-provider",
662
+ delay,
663
+ ...props
664
+ });
665
+ }
666
+ function Tooltip({ ...props }) {
667
+ return /* @__PURE__ */ jsx(Tooltip$1.Root, {
668
+ "data-slot": "tooltip",
669
+ ...props
670
+ });
671
+ }
672
+ function TooltipTrigger({ ...props }) {
673
+ return /* @__PURE__ */ jsx(Tooltip$1.Trigger, {
674
+ "data-slot": "tooltip-trigger",
675
+ ...props
676
+ });
677
+ }
678
+ function TooltipContent({ className, side = "top", sideOffset = 4, align = "center", alignOffset = 0, children, ...props }) {
679
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, {
680
+ align,
681
+ alignOffset,
682
+ side,
683
+ sideOffset,
684
+ className: "isolate z-50",
685
+ children: /* @__PURE__ */ jsxs(Tooltip$1.Popup, {
686
+ "data-slot": "tooltip-content",
687
+ className: cn("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
688
+ ...props,
689
+ children: [children, /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })]
690
+ })
691
+ }) });
692
+ }
693
+ //#endregion
694
+ //#region src/layouts/dashboard-shell.tsx
695
+ function DashboardShell({ header, children, className, contentClassName }) {
696
+ return /* @__PURE__ */ jsxs("div", {
697
+ className: cn("flex h-full min-h-0 flex-col bg-background", className),
698
+ children: [header ? /* @__PURE__ */ jsx("div", {
699
+ className: "shrink-0 border-b border-border bg-background",
700
+ children: header
701
+ }) : null, /* @__PURE__ */ jsx("div", {
702
+ className: cn("min-h-0 flex-1 overflow-y-auto", contentClassName),
703
+ children
704
+ })]
705
+ });
706
+ }
707
+ //#endregion
708
+ //#region src/layouts/loading-state.tsx
709
+ function LoadingState({ variant = "rows", count = 4, className }) {
710
+ const items = Array.from({ length: count }, (_, i) => i);
711
+ if (variant === "card") return /* @__PURE__ */ jsx("div", {
712
+ className: cn("grid grid-cols-1 gap-3 p-4 sm:grid-cols-2 lg:grid-cols-3", className),
713
+ children: items.map((i) => /* @__PURE__ */ jsx("div", { className: "h-24 animate-pulse rounded-xl border border-border bg-muted" }, i))
714
+ });
715
+ if (variant === "list") return /* @__PURE__ */ jsx("div", {
716
+ className: cn("flex flex-col divide-y divide-border", className),
717
+ children: items.map((i) => /* @__PURE__ */ jsxs("div", {
718
+ className: "flex items-center gap-3 px-4 py-3",
719
+ children: [/* @__PURE__ */ jsx("div", { className: "size-8 shrink-0 animate-pulse rounded-full bg-muted" }), /* @__PURE__ */ jsxs("div", {
720
+ className: "min-w-0 flex-1 space-y-1.5",
721
+ children: [/* @__PURE__ */ jsx("div", { className: "h-3 w-1/3 animate-pulse rounded bg-muted" }), /* @__PURE__ */ jsx("div", { className: "h-2.5 w-2/3 animate-pulse rounded bg-muted" })]
722
+ })]
723
+ }, i))
724
+ });
725
+ return /* @__PURE__ */ jsx("div", {
726
+ className: cn("flex flex-col gap-2 p-4", className),
727
+ children: items.map((i) => /* @__PURE__ */ jsx("div", {
728
+ className: "h-4 animate-pulse rounded bg-muted",
729
+ style: { width: `${100 - i * 8}%` }
730
+ }, i))
731
+ });
732
+ }
733
+ //#endregion
734
+ //#region src/layouts/data-table.tsx
735
+ const alignClass = {
736
+ left: "text-left",
737
+ right: "text-right",
738
+ center: "text-center"
739
+ };
740
+ function DataTable({ columns, rows, rowKey, onRowClick, isLoading, emptyTitle = "No data yet", emptyDescription, className }) {
741
+ if (isLoading) return /* @__PURE__ */ jsx(LoadingState, { variant: "list" });
742
+ if (rows.length === 0) return /* @__PURE__ */ jsx(EmptyState, {
743
+ title: emptyTitle,
744
+ description: emptyDescription
745
+ });
746
+ return /* @__PURE__ */ jsx("div", {
747
+ className: cn("w-full overflow-x-auto", className),
748
+ children: /* @__PURE__ */ jsxs("table", {
749
+ className: "w-full table-fixed border-collapse text-sm",
750
+ children: [/* @__PURE__ */ jsx("thead", {
751
+ className: "border-b border-border bg-background",
752
+ children: /* @__PURE__ */ jsx("tr", { children: columns.map((col) => /* @__PURE__ */ jsx("th", {
753
+ className: cn("px-3 py-2 text-xs font-medium text-muted-foreground", alignClass[col.align ?? "left"], col.hideOnSmall && "hidden sm:table-cell"),
754
+ style: col.width ? { width: col.width } : void 0,
755
+ children: col.header
756
+ }, col.id)) })
757
+ }), /* @__PURE__ */ jsx("tbody", { children: rows.map((row) => /* @__PURE__ */ jsx("tr", {
758
+ onClick: onRowClick ? () => onRowClick(row) : void 0,
759
+ className: cn("border-b border-border last:border-b-0 transition-colors", onRowClick && "cursor-pointer hover:bg-accent"),
760
+ children: columns.map((col) => /* @__PURE__ */ jsx("td", {
761
+ className: cn("truncate px-3 py-2 text-sm text-foreground", alignClass[col.align ?? "left"], col.hideOnSmall && "hidden sm:table-cell"),
762
+ children: col.cell(row)
763
+ }, col.id))
764
+ }, rowKey(row))) })]
765
+ })
766
+ });
767
+ }
768
+ //#endregion
769
+ //#region src/layouts/error-state.tsx
770
+ function ErrorState({ title = "Something went wrong", detail, onRetry, retryLabel = "Try again", className }) {
771
+ return /* @__PURE__ */ jsxs("div", {
772
+ className: cn("flex flex-col items-center justify-center gap-3 px-4 py-14 text-center", className),
773
+ children: [
774
+ /* @__PURE__ */ jsx("div", {
775
+ className: "grid size-10 place-items-center rounded-xl bg-destructive/10 text-destructive",
776
+ children: /* @__PURE__ */ jsx(AlertTriangle, {
777
+ className: "size-4",
778
+ strokeWidth: 1.6
779
+ })
780
+ }),
781
+ /* @__PURE__ */ jsx("p", {
782
+ className: "text-sm font-medium text-foreground",
783
+ children: title
784
+ }),
785
+ detail ? /* @__PURE__ */ jsx("p", {
786
+ className: "max-w-md text-xs leading-5 text-muted-foreground",
787
+ children: detail
788
+ }) : null,
789
+ onRetry ? /* @__PURE__ */ jsx(Button, {
790
+ size: "sm",
791
+ variant: "outline",
792
+ onClick: onRetry,
793
+ children: retryLabel
794
+ }) : null
795
+ ]
796
+ });
797
+ }
798
+ //#endregion
799
+ //#region src/layouts/filter-bar.tsx
800
+ function FilterBar({ search, onSearchChange, searchPlaceholder = "Search…", filters, actions, className }) {
801
+ return /* @__PURE__ */ jsxs("div", {
802
+ className: cn("flex flex-wrap items-center gap-2 border-b border-border px-4 py-2", className),
803
+ children: [
804
+ onSearchChange ? /* @__PURE__ */ jsxs("div", {
805
+ className: "relative min-w-[180px] flex-1",
806
+ children: [/* @__PURE__ */ jsx(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ jsx(Input, {
807
+ className: "h-7 pl-7 text-sm",
808
+ value: search ?? "",
809
+ placeholder: searchPlaceholder,
810
+ onChange: (event) => onSearchChange(event.target.value)
811
+ })]
812
+ }) : null,
813
+ filters ? /* @__PURE__ */ jsx("div", {
814
+ className: "flex flex-wrap items-center gap-1.5",
815
+ children: filters
816
+ }) : null,
817
+ actions ? /* @__PURE__ */ jsx("div", {
818
+ className: "ml-auto flex items-center gap-1.5",
819
+ children: actions
820
+ }) : null
821
+ ]
822
+ });
823
+ }
824
+ //#endregion
825
+ //#region src/layouts/page-header.tsx
826
+ function PageHeader({ title, description, actions, className }) {
827
+ return /* @__PURE__ */ jsxs("div", {
828
+ className: cn("flex items-start justify-between gap-4 px-4 py-3", className),
829
+ children: [/* @__PURE__ */ jsxs("div", {
830
+ className: "min-w-0 flex-1",
831
+ children: [/* @__PURE__ */ jsx("h1", {
832
+ className: "truncate text-base font-semibold text-foreground",
833
+ children: title
834
+ }), description ? /* @__PURE__ */ jsx("p", {
835
+ className: "mt-0.5 text-xs text-muted-foreground",
836
+ children: description
837
+ }) : null]
838
+ }), actions ? /* @__PURE__ */ jsx("div", {
839
+ className: "flex shrink-0 items-center gap-1.5",
840
+ children: actions
841
+ }) : null]
842
+ });
843
+ }
844
+ //#endregion
845
+ //#region src/layouts/section.tsx
846
+ function Section({ title, description, actions, children, className, contentClassName }) {
847
+ return /* @__PURE__ */ jsxs("section", {
848
+ className: cn("px-4 py-3", className),
849
+ children: [title || description || actions ? /* @__PURE__ */ jsxs("header", {
850
+ className: "mb-2 flex items-start justify-between gap-3",
851
+ children: [/* @__PURE__ */ jsxs("div", {
852
+ className: "min-w-0 flex-1",
853
+ children: [title ? /* @__PURE__ */ jsx("h2", {
854
+ className: "text-sm font-medium text-foreground",
855
+ children: title
856
+ }) : null, description ? /* @__PURE__ */ jsx("p", {
857
+ className: "mt-0.5 text-xs text-muted-foreground",
858
+ children: description
859
+ }) : null]
860
+ }), actions ? /* @__PURE__ */ jsx("div", {
861
+ className: "flex shrink-0 items-center gap-1.5",
862
+ children: actions
863
+ }) : null]
864
+ }) : null, /* @__PURE__ */ jsx("div", {
865
+ className: contentClassName,
866
+ children
867
+ })]
868
+ });
869
+ }
870
+ //#endregion
871
+ //#region src/layouts/stat-pill.tsx
872
+ const toneClass = {
873
+ neutral: "text-foreground",
874
+ positive: "text-emerald-600 dark:text-emerald-400",
875
+ negative: "text-destructive"
876
+ };
877
+ function StatPill({ label, value, icon: Icon, trend, tone = "neutral", className }) {
878
+ return /* @__PURE__ */ jsxs("div", {
879
+ className: cn("flex flex-col gap-1 rounded-lg border border-border bg-card px-3 py-2", className),
880
+ children: [/* @__PURE__ */ jsxs("div", {
881
+ className: "flex items-center gap-1.5 text-xs text-muted-foreground",
882
+ children: [Icon ? /* @__PURE__ */ jsx(Icon, {
883
+ className: "size-3",
884
+ strokeWidth: 1.6
885
+ }) : null, /* @__PURE__ */ jsx("span", {
886
+ className: "truncate",
887
+ children: label
888
+ })]
889
+ }), /* @__PURE__ */ jsxs("div", {
890
+ className: "flex items-baseline gap-2",
891
+ children: [/* @__PURE__ */ jsx("span", {
892
+ className: cn("text-lg font-semibold", toneClass[tone]),
893
+ children: value
894
+ }), trend ? /* @__PURE__ */ jsx("span", {
895
+ className: "text-xs text-muted-foreground",
896
+ children: trend
897
+ }) : null]
898
+ })]
899
+ });
900
+ }
901
+ //#endregion
902
+ export { Alert, AlertAction, AlertDescription, AlertTitle, Badge, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DashboardShell, DataTable, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorState, FilterBar, Input, Kbd, Label, LoadingState, PageHeader, Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, Section, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, StatPill, StatusDot, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, cn, tabsListVariants };
903
+
904
+ //# sourceMappingURL=index.js.map