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