@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/README.md +116 -0
- package/dist/index.cjs +973 -0
- package/dist/index.d.cts +643 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +643 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +904 -0
- package/dist/index.js.map +1 -0
- package/dist/themes/holaos.css +121 -0
- package/dist/tokens.css +446 -0
- package/package.json +72 -0
- package/src/index.ts +108 -0
- package/src/layouts/dashboard-shell.tsx +43 -0
- package/src/layouts/data-table.tsx +110 -0
- package/src/layouts/error-state.tsx +52 -0
- package/src/layouts/filter-bar.tsx +58 -0
- package/src/layouts/loading-state.tsx +67 -0
- package/src/layouts/page-header.tsx +44 -0
- package/src/layouts/section.tsx +49 -0
- package/src/layouts/stat-pill.tsx +57 -0
- package/src/lib/utils.ts +6 -0
- package/src/primitives/alert.tsx +76 -0
- package/src/primitives/badge.tsx +52 -0
- package/src/primitives/button.tsx +61 -0
- package/src/primitives/card.tsx +107 -0
- package/src/primitives/dropdown-menu.tsx +270 -0
- package/src/primitives/empty-state.tsx +112 -0
- package/src/primitives/input.tsx +20 -0
- package/src/primitives/kbd.tsx +38 -0
- package/src/primitives/label.tsx +20 -0
- package/src/primitives/popover.tsx +87 -0
- package/src/primitives/select.tsx +202 -0
- package/src/primitives/status-dot.tsx +85 -0
- package/src/primitives/switch.tsx +19 -0
- package/src/primitives/tabs.tsx +80 -0
- package/src/primitives/tooltip.tsx +64 -0
- package/src/tokens/themes/holaos.css +121 -0
- package/src/tokens/tokens.css +446 -0
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
|