@kinetixui/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/LICENSE +21 -0
- package/dist/index.d.ts +1176 -0
- package/dist/index.js +3939 -0
- package/package.json +106 -0
- package/src/components/accordion.tsx +52 -0
- package/src/components/alert-dialog.tsx +115 -0
- package/src/components/alert.tsx +47 -0
- package/src/components/aspect-ratio.tsx +7 -0
- package/src/components/audio-player.tsx +150 -0
- package/src/components/avatar.tsx +76 -0
- package/src/components/badge.tsx +40 -0
- package/src/components/breadcrumb.tsx +77 -0
- package/src/components/button.tsx +119 -0
- package/src/components/calendar.tsx +60 -0
- package/src/components/card.tsx +50 -0
- package/src/components/carousel.tsx +181 -0
- package/src/components/chart.tsx +177 -0
- package/src/components/checkbox.tsx +38 -0
- package/src/components/circular-progress.tsx +67 -0
- package/src/components/code-block.tsx +96 -0
- package/src/components/collapsible.tsx +9 -0
- package/src/components/command.tsx +123 -0
- package/src/components/context-menu.tsx +132 -0
- package/src/components/data-table.tsx +92 -0
- package/src/components/date-picker.tsx +68 -0
- package/src/components/dialog.tsx +101 -0
- package/src/components/drawer.tsx +82 -0
- package/src/components/dropdown-menu.tsx +132 -0
- package/src/components/fab.tsx +58 -0
- package/src/components/field.tsx +128 -0
- package/src/components/file-upload.tsx +183 -0
- package/src/components/footer.tsx +62 -0
- package/src/components/form.tsx +130 -0
- package/src/components/hover-card.tsx +28 -0
- package/src/components/image.tsx +87 -0
- package/src/components/inform.tsx +82 -0
- package/src/components/input-group.tsx +96 -0
- package/src/components/input-otp.tsx +63 -0
- package/src/components/input.tsx +72 -0
- package/src/components/label.tsx +20 -0
- package/src/components/list.tsx +69 -0
- package/src/components/menubar.tsx +168 -0
- package/src/components/metric.tsx +51 -0
- package/src/components/modal.tsx +126 -0
- package/src/components/navigation-bar.tsx +49 -0
- package/src/components/navigation-menu.tsx +117 -0
- package/src/components/number-input.tsx +86 -0
- package/src/components/pagination.tsx +77 -0
- package/src/components/password-input.tsx +36 -0
- package/src/components/popover.tsx +32 -0
- package/src/components/progress.tsx +24 -0
- package/src/components/quote.tsx +34 -0
- package/src/components/radio-group.tsx +44 -0
- package/src/components/rating.tsx +88 -0
- package/src/components/resizable.tsx +40 -0
- package/src/components/scroll-area.tsx +39 -0
- package/src/components/select.tsx +124 -0
- package/src/components/separator.tsx +25 -0
- package/src/components/sheet.tsx +104 -0
- package/src/components/sidebar.tsx +390 -0
- package/src/components/skeleton.tsx +9 -0
- package/src/components/slider.tsx +24 -0
- package/src/components/sonner.tsx +30 -0
- package/src/components/spinner.tsx +43 -0
- package/src/components/stepper.tsx +75 -0
- package/src/components/switch.tsx +37 -0
- package/src/components/tab-bar.tsx +58 -0
- package/src/components/table-of-contents.tsx +46 -0
- package/src/components/table.tsx +70 -0
- package/src/components/tabs.tsx +54 -0
- package/src/components/tag.tsx +56 -0
- package/src/components/textarea.tsx +56 -0
- package/src/components/toggle-group.tsx +41 -0
- package/src/components/toggle.tsx +34 -0
- package/src/components/tooltip.tsx +31 -0
- package/src/index.ts +305 -0
- package/src/lib/utils.ts +7 -0
- package/src/stories/Button.stories.tsx +155 -0
- package/src/stories/Input.stories.tsx +80 -0
- package/src/stories/Textarea.stories.tsx +69 -0
- package/tailwind.config.ts +107 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,3939 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/button.tsx
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
|
|
8
|
+
// src/lib/utils.ts
|
|
9
|
+
import { clsx } from "clsx";
|
|
10
|
+
import { twMerge } from "tailwind-merge";
|
|
11
|
+
function cn(...inputs) {
|
|
12
|
+
return twMerge(clsx(inputs));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/components/button.tsx
|
|
16
|
+
import { jsx } from "react/jsx-runtime";
|
|
17
|
+
var buttonVariants = cva(
|
|
18
|
+
[
|
|
19
|
+
"inline-flex items-center justify-center gap-1 shrink-0",
|
|
20
|
+
"font-sans font-medium whitespace-nowrap select-none",
|
|
21
|
+
"rounded-md transition-colors outline-none",
|
|
22
|
+
"focus-visible:shadow-focus",
|
|
23
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
24
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-[18px]"
|
|
25
|
+
],
|
|
26
|
+
{
|
|
27
|
+
variants: {
|
|
28
|
+
variant: {
|
|
29
|
+
// bg primary / text on-primary; hover+active step down the blue ramp; disabled -> border grey
|
|
30
|
+
Primary: "bg-primary text-primary-foreground hover:bg-[--color-blue-600] active:bg-[--color-blue-700] disabled:bg-border disabled:text-muted-foreground",
|
|
31
|
+
// rest = secondaryContainer; hover/active promote to full secondary with on-secondary text
|
|
32
|
+
Secondary: "bg-secondary text-secondary-foreground hover:bg-[--color-green-500] hover:text-[--color-green-50] active:bg-[--color-green-600] active:text-[--color-green-50] focus-visible:bg-secondary disabled:bg-border disabled:text-muted-foreground",
|
|
33
|
+
// 1px outline; hover fills with accent (LightBlue); active pins primary border+text
|
|
34
|
+
Outline: "border border-input bg-transparent text-foreground hover:bg-accent active:border-primary active:bg-accent active:text-primary disabled:border-input disabled:text-muted-foreground disabled:bg-transparent",
|
|
35
|
+
Destructive: "bg-destructive text-destructive-foreground hover:brightness-95 active:brightness-90 disabled:bg-border disabled:text-muted-foreground",
|
|
36
|
+
Ghost: "bg-transparent text-foreground hover:bg-accent active:bg-accent active:text-primary disabled:text-muted-foreground disabled:bg-transparent",
|
|
37
|
+
Link: "bg-transparent text-primary underline-offset-4 hover:underline hover:text-foreground rounded-none px-0 disabled:text-muted-foreground disabled:no-underline"
|
|
38
|
+
},
|
|
39
|
+
size: {
|
|
40
|
+
// padding = Figma spacing/3 + spacing/2 ; type = Label Small (11/16, +0.5 tracking)
|
|
41
|
+
sm: "px-3 py-2 text-[11px] leading-4 tracking-[0.5px]",
|
|
42
|
+
// spacing/4 + spacing/3 ; Label Medium (12/16, +0.5)
|
|
43
|
+
md: "px-4 py-3 text-[12px] leading-4 tracking-[0.5px]",
|
|
44
|
+
// spacing/6 + spacing/3 ; Label Large (14/20, +0.1)
|
|
45
|
+
lg: "px-6 py-3 text-[14px] leading-5 tracking-[0.1px]",
|
|
46
|
+
// spacing/3 all round, square
|
|
47
|
+
icon: "p-3 [&>*:not(svg)]:sr-only"
|
|
48
|
+
},
|
|
49
|
+
/** force a static visual state — leave undefined for real interaction */
|
|
50
|
+
state: {
|
|
51
|
+
Default: "",
|
|
52
|
+
Hover: "",
|
|
53
|
+
Focus: "shadow-focus",
|
|
54
|
+
Active: "",
|
|
55
|
+
Disabled: "pointer-events-none opacity-50"
|
|
56
|
+
},
|
|
57
|
+
/** corner style — matches the design source's Corners property */
|
|
58
|
+
corners: {
|
|
59
|
+
sharp: "rounded-none",
|
|
60
|
+
default: "",
|
|
61
|
+
pill: "rounded-full"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
compoundVariants: [
|
|
65
|
+
{ variant: "Destructive", class: "focus-visible:shadow-focus-destructive" },
|
|
66
|
+
{ variant: "Primary", state: "Hover", class: "bg-[--color-blue-600]" },
|
|
67
|
+
{ variant: "Primary", state: "Active", class: "bg-[--color-blue-700]" },
|
|
68
|
+
{ variant: "Secondary", state: "Hover", class: "bg-[--color-green-500] text-[--color-green-50]" },
|
|
69
|
+
{ variant: "Secondary", state: "Active", class: "bg-[--color-green-600] text-[--color-green-50]" },
|
|
70
|
+
{ variant: "Outline", state: "Hover", class: "bg-accent" },
|
|
71
|
+
{ variant: "Outline", state: "Active", class: "border-primary bg-accent text-primary" },
|
|
72
|
+
{ variant: "Ghost", state: "Hover", class: "bg-accent" },
|
|
73
|
+
{ variant: "Ghost", state: "Active", class: "bg-accent text-primary" },
|
|
74
|
+
{ variant: "Link", state: "Hover", class: "underline text-foreground" },
|
|
75
|
+
{ variant: "Link", size: ["sm", "md", "lg"], class: "py-2 px-0 h-auto" }
|
|
76
|
+
],
|
|
77
|
+
defaultVariants: { variant: "Primary", size: "md", state: "Default", corners: "default" }
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
var Button = React.forwardRef(
|
|
81
|
+
({ className, variant, size, state, corners, asChild = false, disabled, ...props }, ref) => {
|
|
82
|
+
const Comp = asChild ? Slot : "button";
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
Comp,
|
|
85
|
+
{
|
|
86
|
+
ref,
|
|
87
|
+
"data-slot": "button",
|
|
88
|
+
"data-variant": variant ?? "Primary",
|
|
89
|
+
"data-size": size ?? "md",
|
|
90
|
+
disabled: disabled || state === "Disabled",
|
|
91
|
+
className: cn(buttonVariants({ variant, size, state, corners }), className),
|
|
92
|
+
...props
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
Button.displayName = "Button";
|
|
98
|
+
|
|
99
|
+
// src/components/input.tsx
|
|
100
|
+
import * as React2 from "react";
|
|
101
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
102
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
103
|
+
var inputVariants = cva2(
|
|
104
|
+
[
|
|
105
|
+
"flex w-full border border-input bg-background px-3 py-3",
|
|
106
|
+
"font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
|
|
107
|
+
"placeholder:text-muted-foreground",
|
|
108
|
+
"outline-none transition-colors",
|
|
109
|
+
"focus-visible:border-primary focus-visible:shadow-focus",
|
|
110
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
111
|
+
"aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:border-destructive aria-[invalid=true]:focus-visible:shadow-focus-destructive"
|
|
112
|
+
],
|
|
113
|
+
{
|
|
114
|
+
variants: {
|
|
115
|
+
state: {
|
|
116
|
+
Default: "",
|
|
117
|
+
Focus: "border-primary shadow-focus",
|
|
118
|
+
Error: "border-destructive",
|
|
119
|
+
Disabled: "opacity-50 pointer-events-none"
|
|
120
|
+
},
|
|
121
|
+
/** corner style — matches the design source's Corners property */
|
|
122
|
+
corners: {
|
|
123
|
+
sharp: "rounded-none",
|
|
124
|
+
default: "rounded-sm",
|
|
125
|
+
rounded: "rounded-md",
|
|
126
|
+
pill: "rounded-full px-4"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
defaultVariants: { state: "Default", corners: "default" }
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
var Input = React2.forwardRef(
|
|
133
|
+
({ className, state, corners, type = "text", disabled, "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
134
|
+
"input",
|
|
135
|
+
{
|
|
136
|
+
ref,
|
|
137
|
+
type,
|
|
138
|
+
"data-slot": "input",
|
|
139
|
+
"data-state": state ? state.toLowerCase() : void 0,
|
|
140
|
+
"aria-invalid": ariaInvalid ?? (state === "Error" || void 0),
|
|
141
|
+
disabled: disabled || state === "Disabled",
|
|
142
|
+
className: cn(inputVariants({ state, corners }), className),
|
|
143
|
+
...props
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
);
|
|
147
|
+
Input.displayName = "Input";
|
|
148
|
+
|
|
149
|
+
// src/components/textarea.tsx
|
|
150
|
+
import * as React3 from "react";
|
|
151
|
+
import { cva as cva3 } from "class-variance-authority";
|
|
152
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
153
|
+
var textareaVariants = cva3(
|
|
154
|
+
[
|
|
155
|
+
"flex w-full min-h-[100px] resize-y rounded-sm border border-input bg-background px-3 py-3",
|
|
156
|
+
"font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
|
|
157
|
+
"placeholder:text-muted-foreground",
|
|
158
|
+
"outline-none transition-colors",
|
|
159
|
+
"focus-visible:border-primary focus-visible:shadow-focus",
|
|
160
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
161
|
+
"aria-[invalid=true]:border-destructive aria-[invalid=true]:focus-visible:border-destructive aria-[invalid=true]:focus-visible:shadow-focus-destructive"
|
|
162
|
+
],
|
|
163
|
+
{
|
|
164
|
+
variants: {
|
|
165
|
+
state: {
|
|
166
|
+
Default: "",
|
|
167
|
+
Focus: "border-primary shadow-focus",
|
|
168
|
+
Error: "border-destructive",
|
|
169
|
+
Disabled: "opacity-50 pointer-events-none resize-none"
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
defaultVariants: { state: "Default" }
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
var Textarea = React3.forwardRef(
|
|
176
|
+
({ className, state, disabled, "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsx3(
|
|
177
|
+
"textarea",
|
|
178
|
+
{
|
|
179
|
+
ref,
|
|
180
|
+
"data-slot": "textarea",
|
|
181
|
+
"data-state": state ? state.toLowerCase() : void 0,
|
|
182
|
+
"aria-invalid": ariaInvalid ?? (state === "Error" || void 0),
|
|
183
|
+
disabled: disabled || state === "Disabled",
|
|
184
|
+
className: cn(textareaVariants({ state }), className),
|
|
185
|
+
...props
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
);
|
|
189
|
+
Textarea.displayName = "Textarea";
|
|
190
|
+
|
|
191
|
+
// src/components/accordion.tsx
|
|
192
|
+
import * as React4 from "react";
|
|
193
|
+
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
194
|
+
import { ChevronDown } from "lucide-react";
|
|
195
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
196
|
+
var Accordion = AccordionPrimitive.Root;
|
|
197
|
+
var AccordionItem = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(AccordionPrimitive.Item, { ref, className: cn("border-b", className), ...props }));
|
|
198
|
+
AccordionItem.displayName = "AccordionItem";
|
|
199
|
+
var AccordionTrigger = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx4(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
|
|
200
|
+
AccordionPrimitive.Trigger,
|
|
201
|
+
{
|
|
202
|
+
ref,
|
|
203
|
+
className: cn(
|
|
204
|
+
"flex flex-1 items-center justify-between py-4 text-sm font-medium font-sans transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
|
|
205
|
+
className
|
|
206
|
+
),
|
|
207
|
+
...props,
|
|
208
|
+
children: [
|
|
209
|
+
children,
|
|
210
|
+
/* @__PURE__ */ jsx4(ChevronDown, { className: "size-4 shrink-0 text-muted-foreground transition-transform duration-200" })
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
) }));
|
|
214
|
+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
|
|
215
|
+
var AccordionContent = React4.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx4(
|
|
216
|
+
AccordionPrimitive.Content,
|
|
217
|
+
{
|
|
218
|
+
ref,
|
|
219
|
+
className: "overflow-hidden text-sm font-sans data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
|
|
220
|
+
...props,
|
|
221
|
+
children: /* @__PURE__ */ jsx4("div", { className: cn("pb-4 pt-0", className), children })
|
|
222
|
+
}
|
|
223
|
+
));
|
|
224
|
+
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
|
|
225
|
+
|
|
226
|
+
// src/components/alert.tsx
|
|
227
|
+
import * as React5 from "react";
|
|
228
|
+
import { cva as cva4 } from "class-variance-authority";
|
|
229
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
230
|
+
var alertVariants = cva4(
|
|
231
|
+
"relative w-full rounded-lg border px-4 py-3 text-sm font-sans [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
|
|
232
|
+
{
|
|
233
|
+
variants: {
|
|
234
|
+
variant: {
|
|
235
|
+
default: "bg-background text-foreground",
|
|
236
|
+
destructive: "border-destructive/50 text-destructive [&>svg]:text-destructive",
|
|
237
|
+
success: "border-success/50 text-success [&>svg]:text-success",
|
|
238
|
+
warning: "border-warning/50 text-warning [&>svg]:text-warning",
|
|
239
|
+
info: "border-info/50 text-info [&>svg]:text-info"
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
defaultVariants: { variant: "default" }
|
|
243
|
+
}
|
|
244
|
+
);
|
|
245
|
+
var Alert = React5.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx5("div", { ref, role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
|
|
246
|
+
Alert.displayName = "Alert";
|
|
247
|
+
var AlertTitle = React5.forwardRef(
|
|
248
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx5("h5", { ref, className: cn("mb-1 font-medium leading-none tracking-tight", className), ...props })
|
|
249
|
+
);
|
|
250
|
+
AlertTitle.displayName = "AlertTitle";
|
|
251
|
+
var AlertDescription = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5("div", { ref, className: cn("text-sm [&_p]:leading-relaxed", className), ...props }));
|
|
252
|
+
AlertDescription.displayName = "AlertDescription";
|
|
253
|
+
|
|
254
|
+
// src/components/alert-dialog.tsx
|
|
255
|
+
import * as React6 from "react";
|
|
256
|
+
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
|
|
257
|
+
import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
258
|
+
var AlertDialog = AlertDialogPrimitive.Root;
|
|
259
|
+
var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
260
|
+
var AlertDialogPortal = AlertDialogPrimitive.Portal;
|
|
261
|
+
var AlertDialogOverlay = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
262
|
+
AlertDialogPrimitive.Overlay,
|
|
263
|
+
{
|
|
264
|
+
ref,
|
|
265
|
+
className: cn(
|
|
266
|
+
"fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
267
|
+
className
|
|
268
|
+
),
|
|
269
|
+
...props
|
|
270
|
+
}
|
|
271
|
+
));
|
|
272
|
+
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
|
|
273
|
+
var AlertDialogContent = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs2(AlertDialogPortal, { children: [
|
|
274
|
+
/* @__PURE__ */ jsx6(AlertDialogOverlay, {}),
|
|
275
|
+
/* @__PURE__ */ jsx6(
|
|
276
|
+
AlertDialogPrimitive.Content,
|
|
277
|
+
{
|
|
278
|
+
ref,
|
|
279
|
+
className: cn(
|
|
280
|
+
"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg sm:rounded-xl font-sans",
|
|
281
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
282
|
+
className
|
|
283
|
+
),
|
|
284
|
+
...props
|
|
285
|
+
}
|
|
286
|
+
)
|
|
287
|
+
] }));
|
|
288
|
+
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
289
|
+
var AlertDialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx6("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
290
|
+
AlertDialogHeader.displayName = "AlertDialogHeader";
|
|
291
|
+
var AlertDialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx6(
|
|
292
|
+
"div",
|
|
293
|
+
{
|
|
294
|
+
className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
|
|
295
|
+
...props
|
|
296
|
+
}
|
|
297
|
+
);
|
|
298
|
+
AlertDialogFooter.displayName = "AlertDialogFooter";
|
|
299
|
+
var AlertDialogTitle = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(AlertDialogPrimitive.Title, { ref, className: cn("text-lg font-semibold", className), ...props }));
|
|
300
|
+
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
301
|
+
var AlertDialogDescription = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
302
|
+
AlertDialogPrimitive.Description,
|
|
303
|
+
{
|
|
304
|
+
ref,
|
|
305
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
306
|
+
...props
|
|
307
|
+
}
|
|
308
|
+
));
|
|
309
|
+
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
|
|
310
|
+
var AlertDialogAction = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
311
|
+
AlertDialogPrimitive.Action,
|
|
312
|
+
{
|
|
313
|
+
ref,
|
|
314
|
+
className: cn(buttonVariants({ variant: "Primary", size: "md" }), className),
|
|
315
|
+
...props
|
|
316
|
+
}
|
|
317
|
+
));
|
|
318
|
+
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
319
|
+
var AlertDialogCancel = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx6(
|
|
320
|
+
AlertDialogPrimitive.Cancel,
|
|
321
|
+
{
|
|
322
|
+
ref,
|
|
323
|
+
className: cn(buttonVariants({ variant: "Outline", size: "md" }), "mt-2 sm:mt-0", className),
|
|
324
|
+
...props
|
|
325
|
+
}
|
|
326
|
+
));
|
|
327
|
+
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
328
|
+
|
|
329
|
+
// src/components/aspect-ratio.tsx
|
|
330
|
+
import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
|
|
331
|
+
var AspectRatio = AspectRatioPrimitive.Root;
|
|
332
|
+
|
|
333
|
+
// src/components/avatar.tsx
|
|
334
|
+
import * as React7 from "react";
|
|
335
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
336
|
+
import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
337
|
+
var Avatar = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
338
|
+
AvatarPrimitive.Root,
|
|
339
|
+
{
|
|
340
|
+
ref,
|
|
341
|
+
className: cn("relative flex size-10 shrink-0 overflow-hidden rounded-full", className),
|
|
342
|
+
...props
|
|
343
|
+
}
|
|
344
|
+
));
|
|
345
|
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
346
|
+
var AvatarImage = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(AvatarPrimitive.Image, { ref, className: cn("aspect-square size-full", className), ...props }));
|
|
347
|
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
348
|
+
var AvatarFallback = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
|
|
349
|
+
AvatarPrimitive.Fallback,
|
|
350
|
+
{
|
|
351
|
+
ref,
|
|
352
|
+
className: cn(
|
|
353
|
+
"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground",
|
|
354
|
+
className
|
|
355
|
+
),
|
|
356
|
+
...props
|
|
357
|
+
}
|
|
358
|
+
));
|
|
359
|
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
360
|
+
var AvatarGroup = React7.forwardRef(
|
|
361
|
+
({ className, max, children, ...props }, ref) => {
|
|
362
|
+
const items = React7.Children.toArray(children);
|
|
363
|
+
const visible = max ? items.slice(0, max) : items;
|
|
364
|
+
const overflow = max ? items.length - max : 0;
|
|
365
|
+
return /* @__PURE__ */ jsxs3("div", { ref, className: cn("flex -space-x-2", className), ...props, children: [
|
|
366
|
+
visible.map((child, i) => /* @__PURE__ */ jsx7("div", { className: "rounded-full ring-2 ring-background", children: child }, i)),
|
|
367
|
+
overflow > 0 && /* @__PURE__ */ jsx7("div", { className: "rounded-full ring-2 ring-background", children: /* @__PURE__ */ jsx7(Avatar, { children: /* @__PURE__ */ jsxs3(AvatarFallback, { children: [
|
|
368
|
+
"+",
|
|
369
|
+
overflow
|
|
370
|
+
] }) }) })
|
|
371
|
+
] });
|
|
372
|
+
}
|
|
373
|
+
);
|
|
374
|
+
AvatarGroup.displayName = "AvatarGroup";
|
|
375
|
+
|
|
376
|
+
// src/components/badge.tsx
|
|
377
|
+
import { cva as cva5 } from "class-variance-authority";
|
|
378
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
379
|
+
var badgeVariants = cva5(
|
|
380
|
+
"inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium font-sans tracking-[0.5px] transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
381
|
+
{
|
|
382
|
+
variants: {
|
|
383
|
+
variant: {
|
|
384
|
+
default: "bg-primary text-primary-foreground",
|
|
385
|
+
secondary: "bg-secondary-foreground text-secondary",
|
|
386
|
+
destructive: "bg-destructive text-destructive-foreground",
|
|
387
|
+
outline: "border border-input text-foreground",
|
|
388
|
+
subtle: "bg-accent text-accent-foreground"
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
defaultVariants: { variant: "default" }
|
|
392
|
+
}
|
|
393
|
+
);
|
|
394
|
+
function Badge({ className, variant, ...props }) {
|
|
395
|
+
return /* @__PURE__ */ jsx8("div", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// src/components/breadcrumb.tsx
|
|
399
|
+
import * as React8 from "react";
|
|
400
|
+
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
401
|
+
import { ChevronRight, MoreHorizontal } from "lucide-react";
|
|
402
|
+
import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
403
|
+
var Breadcrumb = React8.forwardRef(
|
|
404
|
+
({ ...props }, ref) => /* @__PURE__ */ jsx9("nav", { ref, "aria-label": "breadcrumb", className: "font-sans", ...props })
|
|
405
|
+
);
|
|
406
|
+
Breadcrumb.displayName = "Breadcrumb";
|
|
407
|
+
var BreadcrumbList = React8.forwardRef(
|
|
408
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
409
|
+
"ol",
|
|
410
|
+
{
|
|
411
|
+
ref,
|
|
412
|
+
className: cn("flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", className),
|
|
413
|
+
...props
|
|
414
|
+
}
|
|
415
|
+
)
|
|
416
|
+
);
|
|
417
|
+
BreadcrumbList.displayName = "BreadcrumbList";
|
|
418
|
+
var BreadcrumbItem = React8.forwardRef(
|
|
419
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx9("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
420
|
+
);
|
|
421
|
+
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
422
|
+
var BreadcrumbLink = React8.forwardRef(({ asChild, className, ...props }, ref) => {
|
|
423
|
+
const Comp = asChild ? Slot2 : "a";
|
|
424
|
+
return /* @__PURE__ */ jsx9(Comp, { ref, className: cn("transition-colors hover:text-foreground", className), ...props });
|
|
425
|
+
});
|
|
426
|
+
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
427
|
+
var BreadcrumbPage = React8.forwardRef(
|
|
428
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
|
|
429
|
+
"span",
|
|
430
|
+
{
|
|
431
|
+
ref,
|
|
432
|
+
role: "link",
|
|
433
|
+
"aria-disabled": "true",
|
|
434
|
+
"aria-current": "page",
|
|
435
|
+
className: cn("font-normal text-foreground", className),
|
|
436
|
+
...props
|
|
437
|
+
}
|
|
438
|
+
)
|
|
439
|
+
);
|
|
440
|
+
BreadcrumbPage.displayName = "BreadcrumbPage";
|
|
441
|
+
var BreadcrumbSeparator = ({ children, className, ...props }) => /* @__PURE__ */ jsx9("li", { role: "presentation", "aria-hidden": true, className: cn("[&>svg]:size-3.5", className), ...props, children: children ?? /* @__PURE__ */ jsx9(ChevronRight, {}) });
|
|
442
|
+
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
443
|
+
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs4("span", { role: "presentation", "aria-hidden": true, className: cn("flex size-9 items-center justify-center", className), ...props, children: [
|
|
444
|
+
/* @__PURE__ */ jsx9(MoreHorizontal, { className: "size-4" }),
|
|
445
|
+
/* @__PURE__ */ jsx9("span", { className: "sr-only", children: "More" })
|
|
446
|
+
] });
|
|
447
|
+
BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
|
|
448
|
+
|
|
449
|
+
// src/components/card.tsx
|
|
450
|
+
import * as React9 from "react";
|
|
451
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
452
|
+
var Card = React9.forwardRef(
|
|
453
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10(
|
|
454
|
+
"div",
|
|
455
|
+
{
|
|
456
|
+
ref,
|
|
457
|
+
className: cn("rounded-xl border bg-card text-card-foreground shadow-sm font-sans", className),
|
|
458
|
+
...props
|
|
459
|
+
}
|
|
460
|
+
)
|
|
461
|
+
);
|
|
462
|
+
Card.displayName = "Card";
|
|
463
|
+
var CardHeader = React9.forwardRef(
|
|
464
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })
|
|
465
|
+
);
|
|
466
|
+
CardHeader.displayName = "CardHeader";
|
|
467
|
+
var CardTitle = React9.forwardRef(
|
|
468
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("font-semibold leading-none tracking-tight", className), ...props })
|
|
469
|
+
);
|
|
470
|
+
CardTitle.displayName = "CardTitle";
|
|
471
|
+
var CardDescription = React9.forwardRef(
|
|
472
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("text-sm text-muted-foreground", className), ...props })
|
|
473
|
+
);
|
|
474
|
+
CardDescription.displayName = "CardDescription";
|
|
475
|
+
var CardContent = React9.forwardRef(
|
|
476
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("p-6 pt-0", className), ...props })
|
|
477
|
+
);
|
|
478
|
+
CardContent.displayName = "CardContent";
|
|
479
|
+
var CardFooter = React9.forwardRef(
|
|
480
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx10("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
|
|
481
|
+
);
|
|
482
|
+
CardFooter.displayName = "CardFooter";
|
|
483
|
+
|
|
484
|
+
// src/components/checkbox.tsx
|
|
485
|
+
import * as React10 from "react";
|
|
486
|
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
487
|
+
import { Check, Minus } from "lucide-react";
|
|
488
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
489
|
+
var Checkbox = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx11(
|
|
490
|
+
CheckboxPrimitive.Root,
|
|
491
|
+
{
|
|
492
|
+
ref,
|
|
493
|
+
className: cn(
|
|
494
|
+
"peer size-[18px] shrink-0 rounded-sm border-2 border-input outline-none transition-colors",
|
|
495
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
496
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
497
|
+
"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
|
498
|
+
"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground",
|
|
499
|
+
"aria-invalid:border-destructive aria-invalid:data-[state=checked]:border-destructive aria-invalid:data-[state=checked]:bg-destructive",
|
|
500
|
+
className
|
|
501
|
+
),
|
|
502
|
+
...props,
|
|
503
|
+
children: /* @__PURE__ */ jsx11(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: props.checked === "indeterminate" ? /* @__PURE__ */ jsx11(Minus, { className: "size-3" }) : /* @__PURE__ */ jsx11(Check, { className: "size-3", strokeWidth: 3 }) })
|
|
504
|
+
}
|
|
505
|
+
));
|
|
506
|
+
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
|
507
|
+
|
|
508
|
+
// src/components/collapsible.tsx
|
|
509
|
+
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
|
|
510
|
+
var Collapsible = CollapsiblePrimitive.Root;
|
|
511
|
+
var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
|
|
512
|
+
var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
|
|
513
|
+
|
|
514
|
+
// src/components/dialog.tsx
|
|
515
|
+
import * as React11 from "react";
|
|
516
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
517
|
+
import { X } from "lucide-react";
|
|
518
|
+
import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
519
|
+
var Dialog = DialogPrimitive.Root;
|
|
520
|
+
var DialogTrigger = DialogPrimitive.Trigger;
|
|
521
|
+
var DialogPortal = DialogPrimitive.Portal;
|
|
522
|
+
var DialogClose = DialogPrimitive.Close;
|
|
523
|
+
var DialogOverlay = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
|
|
524
|
+
DialogPrimitive.Overlay,
|
|
525
|
+
{
|
|
526
|
+
ref,
|
|
527
|
+
className: cn(
|
|
528
|
+
"fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
529
|
+
className
|
|
530
|
+
),
|
|
531
|
+
...props
|
|
532
|
+
}
|
|
533
|
+
));
|
|
534
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
535
|
+
var DialogContent = React11.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs5(DialogPortal, { children: [
|
|
536
|
+
/* @__PURE__ */ jsx12(DialogOverlay, {}),
|
|
537
|
+
/* @__PURE__ */ jsxs5(
|
|
538
|
+
DialogPrimitive.Content,
|
|
539
|
+
{
|
|
540
|
+
ref,
|
|
541
|
+
className: cn(
|
|
542
|
+
"fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg sm:rounded-xl font-sans",
|
|
543
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
544
|
+
className
|
|
545
|
+
),
|
|
546
|
+
...props,
|
|
547
|
+
children: [
|
|
548
|
+
children,
|
|
549
|
+
/* @__PURE__ */ jsxs5(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none", children: [
|
|
550
|
+
/* @__PURE__ */ jsx12(X, { className: "size-4" }),
|
|
551
|
+
/* @__PURE__ */ jsx12("span", { className: "sr-only", children: "Close" })
|
|
552
|
+
] })
|
|
553
|
+
]
|
|
554
|
+
}
|
|
555
|
+
)
|
|
556
|
+
] }));
|
|
557
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
558
|
+
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx12("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props });
|
|
559
|
+
DialogHeader.displayName = "DialogHeader";
|
|
560
|
+
var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx12(
|
|
561
|
+
"div",
|
|
562
|
+
{
|
|
563
|
+
className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className),
|
|
564
|
+
...props
|
|
565
|
+
}
|
|
566
|
+
);
|
|
567
|
+
DialogFooter.displayName = "DialogFooter";
|
|
568
|
+
var DialogTitle = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
|
|
569
|
+
DialogPrimitive.Title,
|
|
570
|
+
{
|
|
571
|
+
ref,
|
|
572
|
+
className: cn("text-lg font-semibold leading-none tracking-tight", className),
|
|
573
|
+
...props
|
|
574
|
+
}
|
|
575
|
+
));
|
|
576
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
577
|
+
var DialogDescription = React11.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
|
|
578
|
+
DialogPrimitive.Description,
|
|
579
|
+
{
|
|
580
|
+
ref,
|
|
581
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
582
|
+
...props
|
|
583
|
+
}
|
|
584
|
+
));
|
|
585
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
586
|
+
|
|
587
|
+
// src/components/dropdown-menu.tsx
|
|
588
|
+
import * as React12 from "react";
|
|
589
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
|
|
590
|
+
import { Check as Check2, ChevronRight as ChevronRight2, Circle } from "lucide-react";
|
|
591
|
+
import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
592
|
+
var DropdownMenu = DropdownMenuPrimitive.Root;
|
|
593
|
+
var DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
594
|
+
var DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
595
|
+
var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
596
|
+
var DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
597
|
+
var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
598
|
+
var contentCls = "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95";
|
|
599
|
+
var itemCls = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
|
|
600
|
+
var DropdownMenuContent = React12.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Content, { ref, sideOffset, className: cn(contentCls, className), ...props }) }));
|
|
601
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
602
|
+
var DropdownMenuItem = React12.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Item, { ref, className: cn(itemCls, inset && "pl-8", className), ...props }));
|
|
603
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
|
|
604
|
+
var DropdownMenuCheckboxItem = React12.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs6(DropdownMenuPrimitive.CheckboxItem, { ref, className: cn(itemCls, "pl-8", className), checked, ...props, children: [
|
|
605
|
+
/* @__PURE__ */ jsx13("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx13(Check2, { className: "size-4" }) }) }),
|
|
606
|
+
children
|
|
607
|
+
] }));
|
|
608
|
+
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
|
|
609
|
+
var DropdownMenuRadioItem = React12.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs6(DropdownMenuPrimitive.RadioItem, { ref, className: cn(itemCls, "pl-8", className), ...props, children: [
|
|
610
|
+
/* @__PURE__ */ jsx13("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx13(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx13(Circle, { className: "size-2 fill-current" }) }) }),
|
|
611
|
+
children
|
|
612
|
+
] }));
|
|
613
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
|
|
614
|
+
var DropdownMenuLabel = React12.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx13(
|
|
615
|
+
DropdownMenuPrimitive.Label,
|
|
616
|
+
{
|
|
617
|
+
ref,
|
|
618
|
+
className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className),
|
|
619
|
+
...props
|
|
620
|
+
}
|
|
621
|
+
));
|
|
622
|
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
|
|
623
|
+
var DropdownMenuSeparator = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
624
|
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
|
|
625
|
+
var DropdownMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx13("span", { className: cn("ml-auto text-xs tracking-widest opacity-60", className), ...props });
|
|
626
|
+
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
627
|
+
var DropdownMenuSubTrigger = React12.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs6(
|
|
628
|
+
DropdownMenuPrimitive.SubTrigger,
|
|
629
|
+
{
|
|
630
|
+
ref,
|
|
631
|
+
className: cn(itemCls, "data-[state=open]:bg-accent", inset && "pl-8", className),
|
|
632
|
+
...props,
|
|
633
|
+
children: [
|
|
634
|
+
children,
|
|
635
|
+
/* @__PURE__ */ jsx13(ChevronRight2, { className: "ml-auto size-4" })
|
|
636
|
+
]
|
|
637
|
+
}
|
|
638
|
+
));
|
|
639
|
+
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
|
|
640
|
+
var DropdownMenuSubContent = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx13(DropdownMenuPrimitive.SubContent, { ref, className: cn(contentCls, className), ...props }));
|
|
641
|
+
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
|
|
642
|
+
|
|
643
|
+
// src/components/hover-card.tsx
|
|
644
|
+
import * as React13 from "react";
|
|
645
|
+
import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
|
|
646
|
+
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
647
|
+
var HoverCard = HoverCardPrimitive.Root;
|
|
648
|
+
var HoverCardTrigger = HoverCardPrimitive.Trigger;
|
|
649
|
+
var HoverCardContent = React13.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx14(
|
|
650
|
+
HoverCardPrimitive.Content,
|
|
651
|
+
{
|
|
652
|
+
ref,
|
|
653
|
+
align,
|
|
654
|
+
sideOffset,
|
|
655
|
+
className: cn(
|
|
656
|
+
"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none font-sans",
|
|
657
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
658
|
+
className
|
|
659
|
+
),
|
|
660
|
+
...props
|
|
661
|
+
}
|
|
662
|
+
));
|
|
663
|
+
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
|
|
664
|
+
|
|
665
|
+
// src/components/label.tsx
|
|
666
|
+
import * as React14 from "react";
|
|
667
|
+
import * as LabelPrimitive from "@radix-ui/react-label";
|
|
668
|
+
import { cva as cva6 } from "class-variance-authority";
|
|
669
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
670
|
+
var labelVariants = cva6(
|
|
671
|
+
"text-sm font-medium leading-none font-sans peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
|
672
|
+
);
|
|
673
|
+
var Label2 = React14.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx15(LabelPrimitive.Root, { ref, className: cn(labelVariants(), className), ...props }));
|
|
674
|
+
Label2.displayName = LabelPrimitive.Root.displayName;
|
|
675
|
+
|
|
676
|
+
// src/components/pagination.tsx
|
|
677
|
+
import * as React15 from "react";
|
|
678
|
+
import { ChevronLeft, ChevronRight as ChevronRight3, MoreHorizontal as MoreHorizontal2 } from "lucide-react";
|
|
679
|
+
import { jsx as jsx16, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
680
|
+
var Pagination = ({ className, ...props }) => /* @__PURE__ */ jsx16(
|
|
681
|
+
"nav",
|
|
682
|
+
{
|
|
683
|
+
role: "navigation",
|
|
684
|
+
"aria-label": "pagination",
|
|
685
|
+
className: cn("mx-auto flex w-full justify-center font-sans", className),
|
|
686
|
+
...props
|
|
687
|
+
}
|
|
688
|
+
);
|
|
689
|
+
Pagination.displayName = "Pagination";
|
|
690
|
+
var PaginationContent = React15.forwardRef(
|
|
691
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("ul", { ref, className: cn("flex flex-row items-center gap-1", className), ...props })
|
|
692
|
+
);
|
|
693
|
+
PaginationContent.displayName = "PaginationContent";
|
|
694
|
+
var PaginationItem = React15.forwardRef(
|
|
695
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx16("li", { ref, className: cn("", className), ...props })
|
|
696
|
+
);
|
|
697
|
+
PaginationItem.displayName = "PaginationItem";
|
|
698
|
+
var PaginationLink = ({ className, isActive, ...props }) => /* @__PURE__ */ jsx16(
|
|
699
|
+
"a",
|
|
700
|
+
{
|
|
701
|
+
"aria-current": isActive ? "page" : void 0,
|
|
702
|
+
className: cn(
|
|
703
|
+
buttonVariants({ variant: isActive ? "Outline" : "Ghost", size: "icon" }),
|
|
704
|
+
"size-9",
|
|
705
|
+
className
|
|
706
|
+
),
|
|
707
|
+
...props
|
|
708
|
+
}
|
|
709
|
+
);
|
|
710
|
+
PaginationLink.displayName = "PaginationLink";
|
|
711
|
+
var PaginationPrevious = ({ className, ...props }) => /* @__PURE__ */ jsxs7(PaginationLink, { "aria-label": "Go to previous page", className: cn("w-auto gap-1 px-2.5", className), ...props, children: [
|
|
712
|
+
/* @__PURE__ */ jsx16(ChevronLeft, { className: "size-4" }),
|
|
713
|
+
/* @__PURE__ */ jsx16("span", { children: "Previous" })
|
|
714
|
+
] });
|
|
715
|
+
PaginationPrevious.displayName = "PaginationPrevious";
|
|
716
|
+
var PaginationNext = ({ className, ...props }) => /* @__PURE__ */ jsxs7(PaginationLink, { "aria-label": "Go to next page", className: cn("w-auto gap-1 px-2.5", className), ...props, children: [
|
|
717
|
+
/* @__PURE__ */ jsx16("span", { children: "Next" }),
|
|
718
|
+
/* @__PURE__ */ jsx16(ChevronRight3, { className: "size-4" })
|
|
719
|
+
] });
|
|
720
|
+
PaginationNext.displayName = "PaginationNext";
|
|
721
|
+
var PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs7("span", { "aria-hidden": true, className: cn("flex size-9 items-center justify-center", className), ...props, children: [
|
|
722
|
+
/* @__PURE__ */ jsx16(MoreHorizontal2, { className: "size-4" }),
|
|
723
|
+
/* @__PURE__ */ jsx16("span", { className: "sr-only", children: "More pages" })
|
|
724
|
+
] });
|
|
725
|
+
PaginationEllipsis.displayName = "PaginationEllipsis";
|
|
726
|
+
|
|
727
|
+
// src/components/popover.tsx
|
|
728
|
+
import * as React16 from "react";
|
|
729
|
+
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
730
|
+
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
731
|
+
var Popover = PopoverPrimitive.Root;
|
|
732
|
+
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
733
|
+
var PopoverAnchor = PopoverPrimitive.Anchor;
|
|
734
|
+
var PopoverContent = React16.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx17(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx17(
|
|
735
|
+
PopoverPrimitive.Content,
|
|
736
|
+
{
|
|
737
|
+
ref,
|
|
738
|
+
align,
|
|
739
|
+
sideOffset,
|
|
740
|
+
className: cn(
|
|
741
|
+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none font-sans",
|
|
742
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
743
|
+
"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",
|
|
744
|
+
className
|
|
745
|
+
),
|
|
746
|
+
...props
|
|
747
|
+
}
|
|
748
|
+
) }));
|
|
749
|
+
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
750
|
+
|
|
751
|
+
// src/components/progress.tsx
|
|
752
|
+
import * as React17 from "react";
|
|
753
|
+
import * as ProgressPrimitive from "@radix-ui/react-progress";
|
|
754
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
755
|
+
var Progress = React17.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ jsx18(
|
|
756
|
+
ProgressPrimitive.Root,
|
|
757
|
+
{
|
|
758
|
+
ref,
|
|
759
|
+
className: cn("relative h-2 w-full overflow-hidden rounded-full bg-muted", className),
|
|
760
|
+
...props,
|
|
761
|
+
children: /* @__PURE__ */ jsx18(
|
|
762
|
+
ProgressPrimitive.Indicator,
|
|
763
|
+
{
|
|
764
|
+
className: "size-full flex-1 bg-primary transition-transform",
|
|
765
|
+
style: { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
766
|
+
}
|
|
767
|
+
)
|
|
768
|
+
}
|
|
769
|
+
));
|
|
770
|
+
Progress.displayName = ProgressPrimitive.Root.displayName;
|
|
771
|
+
|
|
772
|
+
// src/components/radio-group.tsx
|
|
773
|
+
import * as React18 from "react";
|
|
774
|
+
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
|
|
775
|
+
import { Circle as Circle2 } from "lucide-react";
|
|
776
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
777
|
+
var RadioGroup2 = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx19(RadioGroupPrimitive.Root, { ref, className: cn("grid gap-3", className), ...props }));
|
|
778
|
+
RadioGroup2.displayName = RadioGroupPrimitive.Root.displayName;
|
|
779
|
+
var RadioGroupItem = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx19(
|
|
780
|
+
RadioGroupPrimitive.Item,
|
|
781
|
+
{
|
|
782
|
+
ref,
|
|
783
|
+
className: cn(
|
|
784
|
+
"aspect-square size-[18px] rounded-full border-2 border-input text-primary outline-none transition-colors",
|
|
785
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
786
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
787
|
+
"data-[state=checked]:border-primary",
|
|
788
|
+
"aria-invalid:border-destructive",
|
|
789
|
+
className
|
|
790
|
+
),
|
|
791
|
+
...props,
|
|
792
|
+
children: /* @__PURE__ */ jsx19(RadioGroupPrimitive.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx19(Circle2, { className: "size-2.5 fill-primary text-primary" }) })
|
|
793
|
+
}
|
|
794
|
+
));
|
|
795
|
+
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
|
|
796
|
+
|
|
797
|
+
// src/components/scroll-area.tsx
|
|
798
|
+
import * as React19 from "react";
|
|
799
|
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
|
|
800
|
+
import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
801
|
+
var ScrollArea = React19.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs8(ScrollAreaPrimitive.Root, { ref, className: cn("relative overflow-hidden", className), ...props, children: [
|
|
802
|
+
/* @__PURE__ */ jsx20(ScrollAreaPrimitive.Viewport, { className: "size-full rounded-[inherit]", children }),
|
|
803
|
+
/* @__PURE__ */ jsx20(ScrollBar, {}),
|
|
804
|
+
/* @__PURE__ */ jsx20(ScrollAreaPrimitive.Corner, {})
|
|
805
|
+
] }));
|
|
806
|
+
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
|
|
807
|
+
var ScrollBar = React19.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx20(
|
|
808
|
+
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
809
|
+
{
|
|
810
|
+
ref,
|
|
811
|
+
orientation,
|
|
812
|
+
className: cn(
|
|
813
|
+
"flex touch-none select-none transition-colors",
|
|
814
|
+
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-px",
|
|
815
|
+
orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-px",
|
|
816
|
+
className
|
|
817
|
+
),
|
|
818
|
+
...props,
|
|
819
|
+
children: /* @__PURE__ */ jsx20(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
|
|
820
|
+
}
|
|
821
|
+
));
|
|
822
|
+
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
|
|
823
|
+
|
|
824
|
+
// src/components/select.tsx
|
|
825
|
+
import * as React20 from "react";
|
|
826
|
+
import * as SelectPrimitive from "@radix-ui/react-select";
|
|
827
|
+
import { Check as Check3, ChevronDown as ChevronDown2, ChevronUp } from "lucide-react";
|
|
828
|
+
import { jsx as jsx21, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
829
|
+
var Select = SelectPrimitive.Root;
|
|
830
|
+
var SelectGroup = SelectPrimitive.Group;
|
|
831
|
+
var SelectValue = SelectPrimitive.Value;
|
|
832
|
+
var SelectTrigger = React20.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs9(
|
|
833
|
+
SelectPrimitive.Trigger,
|
|
834
|
+
{
|
|
835
|
+
ref,
|
|
836
|
+
className: cn(
|
|
837
|
+
"flex min-h-[44px] w-full items-center justify-between rounded-sm border border-input bg-background px-3 py-3",
|
|
838
|
+
"font-sans text-[14px] leading-5 tracking-[0.25px] text-foreground",
|
|
839
|
+
"data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1",
|
|
840
|
+
"outline-none transition-colors",
|
|
841
|
+
"focus:border-primary focus:shadow-focus",
|
|
842
|
+
"data-[state=open]:border-primary",
|
|
843
|
+
"aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus:shadow-focus-destructive",
|
|
844
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
845
|
+
className
|
|
846
|
+
),
|
|
847
|
+
...props,
|
|
848
|
+
children: [
|
|
849
|
+
children,
|
|
850
|
+
/* @__PURE__ */ jsx21(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx21(ChevronDown2, { className: "size-4 shrink-0 opacity-60" }) })
|
|
851
|
+
]
|
|
852
|
+
}
|
|
853
|
+
));
|
|
854
|
+
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
855
|
+
var SelectContent = React20.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs9(
|
|
856
|
+
SelectPrimitive.Content,
|
|
857
|
+
{
|
|
858
|
+
ref,
|
|
859
|
+
position,
|
|
860
|
+
className: cn(
|
|
861
|
+
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md font-sans",
|
|
862
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
863
|
+
position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1",
|
|
864
|
+
className
|
|
865
|
+
),
|
|
866
|
+
...props,
|
|
867
|
+
children: [
|
|
868
|
+
/* @__PURE__ */ jsx21(SelectPrimitive.ScrollUpButton, { className: "flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx21(ChevronUp, { className: "size-4" }) }),
|
|
869
|
+
/* @__PURE__ */ jsx21(
|
|
870
|
+
SelectPrimitive.Viewport,
|
|
871
|
+
{
|
|
872
|
+
className: cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),
|
|
873
|
+
children
|
|
874
|
+
}
|
|
875
|
+
),
|
|
876
|
+
/* @__PURE__ */ jsx21(SelectPrimitive.ScrollDownButton, { className: "flex h-6 items-center justify-center", children: /* @__PURE__ */ jsx21(ChevronDown2, { className: "size-4" }) })
|
|
877
|
+
]
|
|
878
|
+
}
|
|
879
|
+
) }));
|
|
880
|
+
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
881
|
+
var SelectLabel = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", className), ...props }));
|
|
882
|
+
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
883
|
+
var SelectItem = React20.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs9(
|
|
884
|
+
SelectPrimitive.Item,
|
|
885
|
+
{
|
|
886
|
+
ref,
|
|
887
|
+
className: cn(
|
|
888
|
+
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none",
|
|
889
|
+
"focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
890
|
+
className
|
|
891
|
+
),
|
|
892
|
+
...props,
|
|
893
|
+
children: [
|
|
894
|
+
/* @__PURE__ */ jsx21("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx21(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx21(Check3, { className: "size-4" }) }) }),
|
|
895
|
+
/* @__PURE__ */ jsx21(SelectPrimitive.ItemText, { children })
|
|
896
|
+
]
|
|
897
|
+
}
|
|
898
|
+
));
|
|
899
|
+
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
900
|
+
var SelectSeparator = React20.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx21(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props }));
|
|
901
|
+
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
902
|
+
|
|
903
|
+
// src/components/separator.tsx
|
|
904
|
+
import * as React21 from "react";
|
|
905
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator";
|
|
906
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
907
|
+
var Separator3 = React21.forwardRef(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx22(
|
|
908
|
+
SeparatorPrimitive.Root,
|
|
909
|
+
{
|
|
910
|
+
ref,
|
|
911
|
+
decorative,
|
|
912
|
+
orientation,
|
|
913
|
+
className: cn(
|
|
914
|
+
"shrink-0 bg-border",
|
|
915
|
+
orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
|
|
916
|
+
className
|
|
917
|
+
),
|
|
918
|
+
...props
|
|
919
|
+
}
|
|
920
|
+
));
|
|
921
|
+
Separator3.displayName = SeparatorPrimitive.Root.displayName;
|
|
922
|
+
|
|
923
|
+
// src/components/sheet.tsx
|
|
924
|
+
import * as React22 from "react";
|
|
925
|
+
import * as SheetPrimitive from "@radix-ui/react-dialog";
|
|
926
|
+
import { cva as cva7 } from "class-variance-authority";
|
|
927
|
+
import { X as X2 } from "lucide-react";
|
|
928
|
+
import { jsx as jsx23, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
929
|
+
var Sheet = SheetPrimitive.Root;
|
|
930
|
+
var SheetTrigger = SheetPrimitive.Trigger;
|
|
931
|
+
var SheetClose = SheetPrimitive.Close;
|
|
932
|
+
var SheetPortal = SheetPrimitive.Portal;
|
|
933
|
+
var SheetOverlay = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(
|
|
934
|
+
SheetPrimitive.Overlay,
|
|
935
|
+
{
|
|
936
|
+
ref,
|
|
937
|
+
className: cn(
|
|
938
|
+
"fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
939
|
+
className
|
|
940
|
+
),
|
|
941
|
+
...props
|
|
942
|
+
}
|
|
943
|
+
));
|
|
944
|
+
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
945
|
+
var sheetVariants = cva7(
|
|
946
|
+
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500 font-sans",
|
|
947
|
+
{
|
|
948
|
+
variants: {
|
|
949
|
+
side: {
|
|
950
|
+
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
|
|
951
|
+
bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
|
|
952
|
+
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
|
|
953
|
+
right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
defaultVariants: { side: "right" }
|
|
957
|
+
}
|
|
958
|
+
);
|
|
959
|
+
var SheetContent = React22.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ jsxs10(SheetPortal, { children: [
|
|
960
|
+
/* @__PURE__ */ jsx23(SheetOverlay, {}),
|
|
961
|
+
/* @__PURE__ */ jsxs10(SheetPrimitive.Content, { ref, className: cn(sheetVariants({ side }), className), ...props, children: [
|
|
962
|
+
children,
|
|
963
|
+
/* @__PURE__ */ jsxs10(SheetPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring", children: [
|
|
964
|
+
/* @__PURE__ */ jsx23(X2, { className: "size-4" }),
|
|
965
|
+
/* @__PURE__ */ jsx23("span", { className: "sr-only", children: "Close" })
|
|
966
|
+
] })
|
|
967
|
+
] })
|
|
968
|
+
] }));
|
|
969
|
+
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
970
|
+
var SheetHeader = ({ className, ...props }) => /* @__PURE__ */ jsx23("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props });
|
|
971
|
+
SheetHeader.displayName = "SheetHeader";
|
|
972
|
+
var SheetFooter = ({ className, ...props }) => /* @__PURE__ */ jsx23("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props });
|
|
973
|
+
SheetFooter.displayName = "SheetFooter";
|
|
974
|
+
var SheetTitle = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(SheetPrimitive.Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props }));
|
|
975
|
+
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
976
|
+
var SheetDescription = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx23(SheetPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
977
|
+
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
978
|
+
|
|
979
|
+
// src/components/modal.tsx
|
|
980
|
+
import * as DialogPrimitive2 from "@radix-ui/react-dialog";
|
|
981
|
+
import { X as X3 } from "lucide-react";
|
|
982
|
+
import { jsx as jsx24, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
983
|
+
var DEFAULT_ACTION = {
|
|
984
|
+
Info: "Got it",
|
|
985
|
+
Confirmation: "Confirm",
|
|
986
|
+
Warning: "Proceed",
|
|
987
|
+
Destructive: "Delete"
|
|
988
|
+
};
|
|
989
|
+
function Modal({
|
|
990
|
+
type = "Info",
|
|
991
|
+
title,
|
|
992
|
+
description,
|
|
993
|
+
actionLabel,
|
|
994
|
+
cancelLabel = "Cancel",
|
|
995
|
+
onAction,
|
|
996
|
+
onCancel,
|
|
997
|
+
open,
|
|
998
|
+
defaultOpen,
|
|
999
|
+
onOpenChange,
|
|
1000
|
+
trigger,
|
|
1001
|
+
children,
|
|
1002
|
+
className
|
|
1003
|
+
}) {
|
|
1004
|
+
const showCancel = type !== "Info";
|
|
1005
|
+
return /* @__PURE__ */ jsxs11(Dialog, { open, defaultOpen, onOpenChange, children: [
|
|
1006
|
+
trigger && /* @__PURE__ */ jsx24(DialogTrigger, { asChild: true, children: trigger }),
|
|
1007
|
+
/* @__PURE__ */ jsxs11(DialogPortal, { children: [
|
|
1008
|
+
/* @__PURE__ */ jsx24(DialogOverlay, {}),
|
|
1009
|
+
/* @__PURE__ */ jsxs11(
|
|
1010
|
+
DialogPrimitive2.Content,
|
|
1011
|
+
{
|
|
1012
|
+
className: cn(
|
|
1013
|
+
"fixed left-1/2 top-1/2 z-50 flex w-full max-w-[480px] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl bg-background font-sans",
|
|
1014
|
+
"shadow-[0_4px_24px_rgba(0,0,0,0.12)]",
|
|
1015
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
1016
|
+
className
|
|
1017
|
+
),
|
|
1018
|
+
children: [
|
|
1019
|
+
/* @__PURE__ */ jsxs11("header", { className: "flex items-center justify-between px-6 pb-3 pt-5", children: [
|
|
1020
|
+
/* @__PURE__ */ jsx24(DialogPrimitive2.Title, { className: "min-w-0 flex-1 text-[18px] font-semibold leading-6 text-foreground", children: title }),
|
|
1021
|
+
/* @__PURE__ */ jsx24(
|
|
1022
|
+
DialogPrimitive2.Close,
|
|
1023
|
+
{
|
|
1024
|
+
className: "rounded-sm opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring",
|
|
1025
|
+
"aria-label": "Close",
|
|
1026
|
+
children: /* @__PURE__ */ jsx24(X3, { className: "size-5" })
|
|
1027
|
+
}
|
|
1028
|
+
)
|
|
1029
|
+
] }),
|
|
1030
|
+
/* @__PURE__ */ jsx24("div", { className: "h-px w-full bg-border" }),
|
|
1031
|
+
/* @__PURE__ */ jsxs11("div", { className: "px-6 py-5", children: [
|
|
1032
|
+
description && /* @__PURE__ */ jsx24(DialogPrimitive2.Description, { className: "text-[14px] leading-5 tracking-[0.25px] text-muted-foreground", children: description }),
|
|
1033
|
+
children
|
|
1034
|
+
] }),
|
|
1035
|
+
/* @__PURE__ */ jsx24("div", { className: "h-px w-full bg-border" }),
|
|
1036
|
+
/* @__PURE__ */ jsxs11("footer", { className: "flex items-center justify-end gap-3 px-6 py-4", children: [
|
|
1037
|
+
showCancel && /* @__PURE__ */ jsx24(DialogPrimitive2.Close, { asChild: true, children: /* @__PURE__ */ jsx24(Button, { variant: "Outline", size: "lg", onClick: onCancel, children: cancelLabel }) }),
|
|
1038
|
+
/* @__PURE__ */ jsx24(DialogPrimitive2.Close, { asChild: true, children: /* @__PURE__ */ jsx24(
|
|
1039
|
+
Button,
|
|
1040
|
+
{
|
|
1041
|
+
variant: type === "Destructive" ? "Destructive" : "Primary",
|
|
1042
|
+
size: "lg",
|
|
1043
|
+
onClick: onAction,
|
|
1044
|
+
children: actionLabel ?? DEFAULT_ACTION[type]
|
|
1045
|
+
}
|
|
1046
|
+
) })
|
|
1047
|
+
] })
|
|
1048
|
+
]
|
|
1049
|
+
}
|
|
1050
|
+
)
|
|
1051
|
+
] })
|
|
1052
|
+
] });
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
// src/components/skeleton.tsx
|
|
1056
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
1057
|
+
function Skeleton({ className, ...props }) {
|
|
1058
|
+
return /* @__PURE__ */ jsx25("div", { className: cn("animate-pulse rounded-md bg-muted", className), ...props });
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
// src/components/slider.tsx
|
|
1062
|
+
import * as React23 from "react";
|
|
1063
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
|
1064
|
+
import { jsx as jsx26, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1065
|
+
var Slider = React23.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs12(
|
|
1066
|
+
SliderPrimitive.Root,
|
|
1067
|
+
{
|
|
1068
|
+
ref,
|
|
1069
|
+
className: cn("relative flex w-full touch-none select-none items-center", className),
|
|
1070
|
+
...props,
|
|
1071
|
+
children: [
|
|
1072
|
+
/* @__PURE__ */ jsx26(SliderPrimitive.Track, { className: "relative h-1.5 w-full grow overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx26(SliderPrimitive.Range, { className: "absolute h-full bg-primary" }) }),
|
|
1073
|
+
/* @__PURE__ */ jsx26(SliderPrimitive.Thumb, { className: "block size-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" })
|
|
1074
|
+
]
|
|
1075
|
+
}
|
|
1076
|
+
));
|
|
1077
|
+
Slider.displayName = SliderPrimitive.Root.displayName;
|
|
1078
|
+
|
|
1079
|
+
// src/components/sonner.tsx
|
|
1080
|
+
import { Toaster as Sonner, toast } from "sonner";
|
|
1081
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
1082
|
+
function Toaster({ theme = "system", ...props }) {
|
|
1083
|
+
return /* @__PURE__ */ jsx27(
|
|
1084
|
+
Sonner,
|
|
1085
|
+
{
|
|
1086
|
+
theme,
|
|
1087
|
+
className: "toaster group font-sans",
|
|
1088
|
+
toastOptions: {
|
|
1089
|
+
classNames: {
|
|
1090
|
+
toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
|
1091
|
+
description: "group-[.toast]:text-muted-foreground",
|
|
1092
|
+
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
1093
|
+
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
|
|
1094
|
+
}
|
|
1095
|
+
},
|
|
1096
|
+
...props
|
|
1097
|
+
}
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
// src/components/switch.tsx
|
|
1102
|
+
import * as React24 from "react";
|
|
1103
|
+
import * as SwitchPrimitive from "@radix-ui/react-switch";
|
|
1104
|
+
import { jsx as jsx28 } from "react/jsx-runtime";
|
|
1105
|
+
var Switch = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx28(
|
|
1106
|
+
SwitchPrimitive.Root,
|
|
1107
|
+
{
|
|
1108
|
+
ref,
|
|
1109
|
+
className: cn(
|
|
1110
|
+
"peer inline-flex h-6 w-12 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors",
|
|
1111
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
1112
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
1113
|
+
"data-[state=checked]:bg-primary data-[state=unchecked]:bg-tertiary",
|
|
1114
|
+
className
|
|
1115
|
+
),
|
|
1116
|
+
...props,
|
|
1117
|
+
children: /* @__PURE__ */ jsx28(
|
|
1118
|
+
SwitchPrimitive.Thumb,
|
|
1119
|
+
{
|
|
1120
|
+
className: cn(
|
|
1121
|
+
"pointer-events-none block size-5 rounded-full bg-background shadow-lg ring-0 transition-transform",
|
|
1122
|
+
"data-[state=checked]:translate-x-6 data-[state=unchecked]:translate-x-0"
|
|
1123
|
+
)
|
|
1124
|
+
}
|
|
1125
|
+
)
|
|
1126
|
+
}
|
|
1127
|
+
));
|
|
1128
|
+
Switch.displayName = SwitchPrimitive.Root.displayName;
|
|
1129
|
+
|
|
1130
|
+
// src/components/tag.tsx
|
|
1131
|
+
import * as React25 from "react";
|
|
1132
|
+
import { cva as cva8 } from "class-variance-authority";
|
|
1133
|
+
import { X as X4 } from "lucide-react";
|
|
1134
|
+
import { jsx as jsx29, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1135
|
+
var tagVariants = cva8(
|
|
1136
|
+
"inline-flex items-center gap-1 rounded-sm px-2 py-1 text-xs font-medium font-sans tracking-[0.5px]",
|
|
1137
|
+
{
|
|
1138
|
+
variants: {
|
|
1139
|
+
variant: {
|
|
1140
|
+
default: "bg-accent text-accent-foreground",
|
|
1141
|
+
secondary: "bg-secondary text-secondary-foreground",
|
|
1142
|
+
destructive: "bg-destructive-foreground text-destructive",
|
|
1143
|
+
warning: "bg-warning-foreground text-warning",
|
|
1144
|
+
outline: "border border-input text-foreground"
|
|
1145
|
+
}
|
|
1146
|
+
},
|
|
1147
|
+
defaultVariants: { variant: "default" }
|
|
1148
|
+
}
|
|
1149
|
+
);
|
|
1150
|
+
var Tag = React25.forwardRef(
|
|
1151
|
+
({ className, variant, onRemove, children, ...props }, ref) => /* @__PURE__ */ jsxs13("span", { ref, className: cn(tagVariants({ variant }), className), ...props, children: [
|
|
1152
|
+
children,
|
|
1153
|
+
onRemove && /* @__PURE__ */ jsx29(
|
|
1154
|
+
"button",
|
|
1155
|
+
{
|
|
1156
|
+
type: "button",
|
|
1157
|
+
onClick: onRemove,
|
|
1158
|
+
"aria-label": "Remove",
|
|
1159
|
+
className: "-mr-0.5 ml-0.5 rounded-[2px] opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:ring-1 focus-visible:ring-current",
|
|
1160
|
+
children: /* @__PURE__ */ jsx29(X4, { className: "size-3.5" })
|
|
1161
|
+
}
|
|
1162
|
+
)
|
|
1163
|
+
] })
|
|
1164
|
+
);
|
|
1165
|
+
Tag.displayName = "Tag";
|
|
1166
|
+
|
|
1167
|
+
// src/components/table.tsx
|
|
1168
|
+
import * as React26 from "react";
|
|
1169
|
+
import { jsx as jsx30 } from "react/jsx-runtime";
|
|
1170
|
+
var Table = React26.forwardRef(
|
|
1171
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ jsx30("table", { ref, className: cn("w-full caption-bottom text-sm font-sans", className), ...props }) })
|
|
1172
|
+
);
|
|
1173
|
+
Table.displayName = "Table";
|
|
1174
|
+
var TableHeader = React26.forwardRef(
|
|
1175
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("thead", { ref, className: cn("[&_tr]:border-b", className), ...props })
|
|
1176
|
+
);
|
|
1177
|
+
TableHeader.displayName = "TableHeader";
|
|
1178
|
+
var TableBody = React26.forwardRef(
|
|
1179
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
|
|
1180
|
+
);
|
|
1181
|
+
TableBody.displayName = "TableBody";
|
|
1182
|
+
var TableFooter = React26.forwardRef(
|
|
1183
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props })
|
|
1184
|
+
);
|
|
1185
|
+
TableFooter.displayName = "TableFooter";
|
|
1186
|
+
var TableRow = React26.forwardRef(
|
|
1187
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
|
|
1188
|
+
"tr",
|
|
1189
|
+
{
|
|
1190
|
+
ref,
|
|
1191
|
+
className: cn("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", className),
|
|
1192
|
+
...props
|
|
1193
|
+
}
|
|
1194
|
+
)
|
|
1195
|
+
);
|
|
1196
|
+
TableRow.displayName = "TableRow";
|
|
1197
|
+
var TableHead = React26.forwardRef(
|
|
1198
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30(
|
|
1199
|
+
"th",
|
|
1200
|
+
{
|
|
1201
|
+
ref,
|
|
1202
|
+
className: cn("h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0", className),
|
|
1203
|
+
...props
|
|
1204
|
+
}
|
|
1205
|
+
)
|
|
1206
|
+
);
|
|
1207
|
+
TableHead.displayName = "TableHead";
|
|
1208
|
+
var TableCell = React26.forwardRef(
|
|
1209
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("td", { ref, className: cn("p-2 align-middle [&:has([role=checkbox])]:pr-0", className), ...props })
|
|
1210
|
+
);
|
|
1211
|
+
TableCell.displayName = "TableCell";
|
|
1212
|
+
var TableCaption = React26.forwardRef(
|
|
1213
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx30("caption", { ref, className: cn("mt-4 text-sm text-muted-foreground", className), ...props })
|
|
1214
|
+
);
|
|
1215
|
+
TableCaption.displayName = "TableCaption";
|
|
1216
|
+
|
|
1217
|
+
// src/components/tabs.tsx
|
|
1218
|
+
import * as React27 from "react";
|
|
1219
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
1220
|
+
import { jsx as jsx31 } from "react/jsx-runtime";
|
|
1221
|
+
var Tabs = TabsPrimitive.Root;
|
|
1222
|
+
var TabsList = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
|
|
1223
|
+
TabsPrimitive.List,
|
|
1224
|
+
{
|
|
1225
|
+
ref,
|
|
1226
|
+
className: cn(
|
|
1227
|
+
"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground font-sans",
|
|
1228
|
+
className
|
|
1229
|
+
),
|
|
1230
|
+
...props
|
|
1231
|
+
}
|
|
1232
|
+
));
|
|
1233
|
+
TabsList.displayName = TabsPrimitive.List.displayName;
|
|
1234
|
+
var TabsTrigger = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
|
|
1235
|
+
TabsPrimitive.Trigger,
|
|
1236
|
+
{
|
|
1237
|
+
ref,
|
|
1238
|
+
className: cn(
|
|
1239
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all",
|
|
1240
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
1241
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
1242
|
+
"data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow",
|
|
1243
|
+
className
|
|
1244
|
+
),
|
|
1245
|
+
...props
|
|
1246
|
+
}
|
|
1247
|
+
));
|
|
1248
|
+
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
|
|
1249
|
+
var TabsContent = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
|
|
1250
|
+
TabsPrimitive.Content,
|
|
1251
|
+
{
|
|
1252
|
+
ref,
|
|
1253
|
+
className: cn("mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", className),
|
|
1254
|
+
...props
|
|
1255
|
+
}
|
|
1256
|
+
));
|
|
1257
|
+
TabsContent.displayName = TabsPrimitive.Content.displayName;
|
|
1258
|
+
|
|
1259
|
+
// src/components/toggle.tsx
|
|
1260
|
+
import * as React28 from "react";
|
|
1261
|
+
import * as TogglePrimitive from "@radix-ui/react-toggle";
|
|
1262
|
+
import { cva as cva9 } from "class-variance-authority";
|
|
1263
|
+
import { jsx as jsx32 } from "react/jsx-runtime";
|
|
1264
|
+
var toggleVariants = cva9(
|
|
1265
|
+
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium font-sans transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0",
|
|
1266
|
+
{
|
|
1267
|
+
variants: {
|
|
1268
|
+
variant: {
|
|
1269
|
+
default: "bg-transparent",
|
|
1270
|
+
outline: "border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground"
|
|
1271
|
+
},
|
|
1272
|
+
size: {
|
|
1273
|
+
default: "h-9 min-w-9 px-2",
|
|
1274
|
+
sm: "h-8 min-w-8 px-1.5",
|
|
1275
|
+
lg: "h-10 min-w-10 px-2.5"
|
|
1276
|
+
}
|
|
1277
|
+
},
|
|
1278
|
+
defaultVariants: { variant: "default", size: "default" }
|
|
1279
|
+
}
|
|
1280
|
+
);
|
|
1281
|
+
var Toggle = React28.forwardRef(({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx32(TogglePrimitive.Root, { ref, className: cn(toggleVariants({ variant, size }), className), ...props }));
|
|
1282
|
+
Toggle.displayName = TogglePrimitive.Root.displayName;
|
|
1283
|
+
|
|
1284
|
+
// src/components/toggle-group.tsx
|
|
1285
|
+
import * as React29 from "react";
|
|
1286
|
+
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
|
|
1287
|
+
import { jsx as jsx33 } from "react/jsx-runtime";
|
|
1288
|
+
var ToggleGroupContext = React29.createContext({
|
|
1289
|
+
size: "default",
|
|
1290
|
+
variant: "default"
|
|
1291
|
+
});
|
|
1292
|
+
var ToggleGroup = React29.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ jsx33(ToggleGroupPrimitive.Root, { ref, className: cn("flex items-center gap-1", className), ...props, children: /* @__PURE__ */ jsx33(ToggleGroupContext.Provider, { value: { variant, size }, children }) }));
|
|
1293
|
+
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
|
|
1294
|
+
var ToggleGroupItem = React29.forwardRef(({ className, children, variant, size, ...props }, ref) => {
|
|
1295
|
+
const ctx = React29.useContext(ToggleGroupContext);
|
|
1296
|
+
return /* @__PURE__ */ jsx33(
|
|
1297
|
+
ToggleGroupPrimitive.Item,
|
|
1298
|
+
{
|
|
1299
|
+
ref,
|
|
1300
|
+
className: cn(toggleVariants({ variant: ctx.variant || variant, size: ctx.size || size }), className),
|
|
1301
|
+
...props,
|
|
1302
|
+
children
|
|
1303
|
+
}
|
|
1304
|
+
);
|
|
1305
|
+
});
|
|
1306
|
+
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
|
|
1307
|
+
|
|
1308
|
+
// src/components/tooltip.tsx
|
|
1309
|
+
import * as React30 from "react";
|
|
1310
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
1311
|
+
import { jsx as jsx34 } from "react/jsx-runtime";
|
|
1312
|
+
var TooltipProvider = TooltipPrimitive.Provider;
|
|
1313
|
+
var Tooltip = TooltipPrimitive.Root;
|
|
1314
|
+
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
1315
|
+
var TooltipContent = React30.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx34(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx34(
|
|
1316
|
+
TooltipPrimitive.Content,
|
|
1317
|
+
{
|
|
1318
|
+
ref,
|
|
1319
|
+
sideOffset,
|
|
1320
|
+
className: cn(
|
|
1321
|
+
"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground font-sans",
|
|
1322
|
+
"animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
1323
|
+
"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",
|
|
1324
|
+
className
|
|
1325
|
+
),
|
|
1326
|
+
...props
|
|
1327
|
+
}
|
|
1328
|
+
) }));
|
|
1329
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
1330
|
+
|
|
1331
|
+
// src/components/calendar.tsx
|
|
1332
|
+
import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight4 } from "lucide-react";
|
|
1333
|
+
import { DayPicker } from "react-day-picker";
|
|
1334
|
+
import { jsx as jsx35 } from "react/jsx-runtime";
|
|
1335
|
+
function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
|
|
1336
|
+
return /* @__PURE__ */ jsx35(
|
|
1337
|
+
DayPicker,
|
|
1338
|
+
{
|
|
1339
|
+
showOutsideDays,
|
|
1340
|
+
className: cn("p-3 font-sans", className),
|
|
1341
|
+
classNames: {
|
|
1342
|
+
months: "flex flex-col sm:flex-row gap-2",
|
|
1343
|
+
month: "flex flex-col gap-4",
|
|
1344
|
+
caption: "flex justify-center pt-1 relative items-center w-full",
|
|
1345
|
+
caption_label: "text-sm font-medium",
|
|
1346
|
+
nav: "flex items-center gap-1",
|
|
1347
|
+
nav_button: cn(
|
|
1348
|
+
buttonVariants({ variant: "Outline", size: "icon" }),
|
|
1349
|
+
"size-7 bg-transparent p-0 opacity-50 hover:opacity-100"
|
|
1350
|
+
),
|
|
1351
|
+
nav_button_previous: "absolute left-1",
|
|
1352
|
+
nav_button_next: "absolute right-1",
|
|
1353
|
+
table: "w-full border-collapse space-x-1",
|
|
1354
|
+
head_row: "flex",
|
|
1355
|
+
head_cell: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
|
|
1356
|
+
row: "flex w-full mt-2",
|
|
1357
|
+
cell: cn(
|
|
1358
|
+
"relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-range-end)]:rounded-r-md",
|
|
1359
|
+
props.mode === "range" ? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" : "[&:has([aria-selected])]:rounded-md"
|
|
1360
|
+
),
|
|
1361
|
+
day: cn(buttonVariants({ variant: "Ghost", size: "icon" }), "size-8 p-0 font-normal aria-selected:opacity-100"),
|
|
1362
|
+
day_range_start: "day-range-start",
|
|
1363
|
+
day_range_end: "day-range-end",
|
|
1364
|
+
day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
|
|
1365
|
+
day_today: "bg-accent text-accent-foreground",
|
|
1366
|
+
day_outside: "day-outside text-muted-foreground aria-selected:text-muted-foreground",
|
|
1367
|
+
day_disabled: "text-muted-foreground opacity-50",
|
|
1368
|
+
day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
|
|
1369
|
+
day_hidden: "invisible",
|
|
1370
|
+
...classNames
|
|
1371
|
+
},
|
|
1372
|
+
components: {
|
|
1373
|
+
IconLeft: () => /* @__PURE__ */ jsx35(ChevronLeft2, { className: "size-4" }),
|
|
1374
|
+
IconRight: () => /* @__PURE__ */ jsx35(ChevronRight4, { className: "size-4" })
|
|
1375
|
+
},
|
|
1376
|
+
...props
|
|
1377
|
+
}
|
|
1378
|
+
);
|
|
1379
|
+
}
|
|
1380
|
+
Calendar.displayName = "Calendar";
|
|
1381
|
+
|
|
1382
|
+
// src/components/carousel.tsx
|
|
1383
|
+
import * as React31 from "react";
|
|
1384
|
+
import useEmblaCarousel from "embla-carousel-react";
|
|
1385
|
+
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
1386
|
+
import { jsx as jsx36, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1387
|
+
var CarouselContext = React31.createContext(null);
|
|
1388
|
+
function useCarousel() {
|
|
1389
|
+
const context = React31.useContext(CarouselContext);
|
|
1390
|
+
if (!context) throw new Error("useCarousel must be used within a <Carousel />");
|
|
1391
|
+
return context;
|
|
1392
|
+
}
|
|
1393
|
+
var Carousel = React31.forwardRef(({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }, ref) => {
|
|
1394
|
+
const [carouselRef, api] = useEmblaCarousel(
|
|
1395
|
+
{ ...opts, axis: orientation === "horizontal" ? "x" : "y" },
|
|
1396
|
+
plugins
|
|
1397
|
+
);
|
|
1398
|
+
const [canScrollPrev, setCanScrollPrev] = React31.useState(false);
|
|
1399
|
+
const [canScrollNext, setCanScrollNext] = React31.useState(false);
|
|
1400
|
+
const onSelect = React31.useCallback((a) => {
|
|
1401
|
+
if (!a) return;
|
|
1402
|
+
setCanScrollPrev(a.canScrollPrev());
|
|
1403
|
+
setCanScrollNext(a.canScrollNext());
|
|
1404
|
+
}, []);
|
|
1405
|
+
const scrollPrev = React31.useCallback(() => api?.scrollPrev(), [api]);
|
|
1406
|
+
const scrollNext = React31.useCallback(() => api?.scrollNext(), [api]);
|
|
1407
|
+
React31.useEffect(() => {
|
|
1408
|
+
if (api && setApi) setApi(api);
|
|
1409
|
+
}, [api, setApi]);
|
|
1410
|
+
React31.useEffect(() => {
|
|
1411
|
+
if (!api) return;
|
|
1412
|
+
onSelect(api);
|
|
1413
|
+
api.on("reInit", onSelect);
|
|
1414
|
+
api.on("select", onSelect);
|
|
1415
|
+
return () => {
|
|
1416
|
+
api?.off("select", onSelect);
|
|
1417
|
+
};
|
|
1418
|
+
}, [api, onSelect]);
|
|
1419
|
+
return /* @__PURE__ */ jsx36(
|
|
1420
|
+
CarouselContext.Provider,
|
|
1421
|
+
{
|
|
1422
|
+
value: { carouselRef, api, opts, orientation, scrollPrev, scrollNext, canScrollPrev, canScrollNext },
|
|
1423
|
+
children: /* @__PURE__ */ jsx36(
|
|
1424
|
+
"div",
|
|
1425
|
+
{
|
|
1426
|
+
ref,
|
|
1427
|
+
onKeyDownCapture: (e) => {
|
|
1428
|
+
if (e.key === "ArrowLeft") {
|
|
1429
|
+
e.preventDefault();
|
|
1430
|
+
scrollPrev();
|
|
1431
|
+
} else if (e.key === "ArrowRight") {
|
|
1432
|
+
e.preventDefault();
|
|
1433
|
+
scrollNext();
|
|
1434
|
+
}
|
|
1435
|
+
},
|
|
1436
|
+
className: cn("relative font-sans", className),
|
|
1437
|
+
role: "region",
|
|
1438
|
+
"aria-roledescription": "carousel",
|
|
1439
|
+
...props,
|
|
1440
|
+
children
|
|
1441
|
+
}
|
|
1442
|
+
)
|
|
1443
|
+
}
|
|
1444
|
+
);
|
|
1445
|
+
});
|
|
1446
|
+
Carousel.displayName = "Carousel";
|
|
1447
|
+
var CarouselContent = React31.forwardRef(
|
|
1448
|
+
({ className, ...props }, ref) => {
|
|
1449
|
+
const { carouselRef, orientation } = useCarousel();
|
|
1450
|
+
return /* @__PURE__ */ jsx36("div", { ref: carouselRef, className: "overflow-hidden", children: /* @__PURE__ */ jsx36(
|
|
1451
|
+
"div",
|
|
1452
|
+
{
|
|
1453
|
+
ref,
|
|
1454
|
+
className: cn("flex", orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col", className),
|
|
1455
|
+
...props
|
|
1456
|
+
}
|
|
1457
|
+
) });
|
|
1458
|
+
}
|
|
1459
|
+
);
|
|
1460
|
+
CarouselContent.displayName = "CarouselContent";
|
|
1461
|
+
var CarouselItem = React31.forwardRef(
|
|
1462
|
+
({ className, ...props }, ref) => {
|
|
1463
|
+
const { orientation } = useCarousel();
|
|
1464
|
+
return /* @__PURE__ */ jsx36(
|
|
1465
|
+
"div",
|
|
1466
|
+
{
|
|
1467
|
+
ref,
|
|
1468
|
+
role: "group",
|
|
1469
|
+
"aria-roledescription": "slide",
|
|
1470
|
+
className: cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className),
|
|
1471
|
+
...props
|
|
1472
|
+
}
|
|
1473
|
+
);
|
|
1474
|
+
}
|
|
1475
|
+
);
|
|
1476
|
+
CarouselItem.displayName = "CarouselItem";
|
|
1477
|
+
var CarouselPrevious = React31.forwardRef(
|
|
1478
|
+
({ className, variant = "Outline", ...props }, ref) => {
|
|
1479
|
+
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
|
|
1480
|
+
return /* @__PURE__ */ jsxs14(
|
|
1481
|
+
Button,
|
|
1482
|
+
{
|
|
1483
|
+
ref,
|
|
1484
|
+
variant,
|
|
1485
|
+
size: "icon",
|
|
1486
|
+
className: cn(
|
|
1487
|
+
"absolute size-8 rounded-full",
|
|
1488
|
+
orientation === "horizontal" ? "-left-12 top-1/2 -translate-y-1/2" : "-top-12 left-1/2 -translate-x-1/2 rotate-90",
|
|
1489
|
+
className
|
|
1490
|
+
),
|
|
1491
|
+
disabled: !canScrollPrev,
|
|
1492
|
+
onClick: scrollPrev,
|
|
1493
|
+
...props,
|
|
1494
|
+
children: [
|
|
1495
|
+
/* @__PURE__ */ jsx36(ArrowLeft, { className: "size-4" }),
|
|
1496
|
+
/* @__PURE__ */ jsx36("span", { className: "sr-only", children: "Previous slide" })
|
|
1497
|
+
]
|
|
1498
|
+
}
|
|
1499
|
+
);
|
|
1500
|
+
}
|
|
1501
|
+
);
|
|
1502
|
+
CarouselPrevious.displayName = "CarouselPrevious";
|
|
1503
|
+
var CarouselNext = React31.forwardRef(
|
|
1504
|
+
({ className, variant = "Outline", ...props }, ref) => {
|
|
1505
|
+
const { orientation, scrollNext, canScrollNext } = useCarousel();
|
|
1506
|
+
return /* @__PURE__ */ jsxs14(
|
|
1507
|
+
Button,
|
|
1508
|
+
{
|
|
1509
|
+
ref,
|
|
1510
|
+
variant,
|
|
1511
|
+
size: "icon",
|
|
1512
|
+
className: cn(
|
|
1513
|
+
"absolute size-8 rounded-full",
|
|
1514
|
+
orientation === "horizontal" ? "-right-12 top-1/2 -translate-y-1/2" : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
|
|
1515
|
+
className
|
|
1516
|
+
),
|
|
1517
|
+
disabled: !canScrollNext,
|
|
1518
|
+
onClick: scrollNext,
|
|
1519
|
+
...props,
|
|
1520
|
+
children: [
|
|
1521
|
+
/* @__PURE__ */ jsx36(ArrowRight, { className: "size-4" }),
|
|
1522
|
+
/* @__PURE__ */ jsx36("span", { className: "sr-only", children: "Next slide" })
|
|
1523
|
+
]
|
|
1524
|
+
}
|
|
1525
|
+
);
|
|
1526
|
+
}
|
|
1527
|
+
);
|
|
1528
|
+
CarouselNext.displayName = "CarouselNext";
|
|
1529
|
+
|
|
1530
|
+
// src/components/chart.tsx
|
|
1531
|
+
import * as React32 from "react";
|
|
1532
|
+
import * as RechartsPrimitive from "recharts";
|
|
1533
|
+
import { jsx as jsx37, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
1534
|
+
var THEMES = { light: "", dark: ".dark" };
|
|
1535
|
+
var ChartContext = React32.createContext(null);
|
|
1536
|
+
function useChart() {
|
|
1537
|
+
const context = React32.useContext(ChartContext);
|
|
1538
|
+
if (!context) throw new Error("useChart must be used within a <ChartContainer />");
|
|
1539
|
+
return context;
|
|
1540
|
+
}
|
|
1541
|
+
var ChartContainer = React32.forwardRef(({ id, className, children, config, ...props }, ref) => {
|
|
1542
|
+
const uniqueId = React32.useId();
|
|
1543
|
+
const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
|
|
1544
|
+
return /* @__PURE__ */ jsx37(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs15(
|
|
1545
|
+
"div",
|
|
1546
|
+
{
|
|
1547
|
+
"data-chart": chartId,
|
|
1548
|
+
ref,
|
|
1549
|
+
className: cn(
|
|
1550
|
+
"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
|
|
1551
|
+
className
|
|
1552
|
+
),
|
|
1553
|
+
...props,
|
|
1554
|
+
children: [
|
|
1555
|
+
/* @__PURE__ */ jsx37(ChartStyle, { id: chartId, config }),
|
|
1556
|
+
/* @__PURE__ */ jsx37(RechartsPrimitive.ResponsiveContainer, { children })
|
|
1557
|
+
]
|
|
1558
|
+
}
|
|
1559
|
+
) });
|
|
1560
|
+
});
|
|
1561
|
+
ChartContainer.displayName = "Chart";
|
|
1562
|
+
var ChartStyle = ({ id, config }) => {
|
|
1563
|
+
const colorConfig = Object.entries(config).filter(([, c]) => c.theme || c.color);
|
|
1564
|
+
if (!colorConfig.length) return null;
|
|
1565
|
+
return /* @__PURE__ */ jsx37(
|
|
1566
|
+
"style",
|
|
1567
|
+
{
|
|
1568
|
+
dangerouslySetInnerHTML: {
|
|
1569
|
+
__html: Object.entries(THEMES).map(
|
|
1570
|
+
([theme, prefix]) => `
|
|
1571
|
+
${prefix} [data-chart=${id}] {
|
|
1572
|
+
${colorConfig.map(([key, itemConfig]) => {
|
|
1573
|
+
const color = itemConfig.theme?.[theme] || itemConfig.color;
|
|
1574
|
+
return color ? ` --color-${key}: ${color};` : null;
|
|
1575
|
+
}).join("\n")}
|
|
1576
|
+
}
|
|
1577
|
+
`
|
|
1578
|
+
).join("\n")
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
);
|
|
1582
|
+
};
|
|
1583
|
+
var ChartTooltip = RechartsPrimitive.Tooltip;
|
|
1584
|
+
var ChartTooltipContent = React32.forwardRef(
|
|
1585
|
+
({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, formatter, color }, ref) => {
|
|
1586
|
+
const { config } = useChart();
|
|
1587
|
+
if (!active || !payload?.length) return null;
|
|
1588
|
+
return /* @__PURE__ */ jsxs15(
|
|
1589
|
+
"div",
|
|
1590
|
+
{
|
|
1591
|
+
ref,
|
|
1592
|
+
className: cn(
|
|
1593
|
+
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
|
|
1594
|
+
className
|
|
1595
|
+
),
|
|
1596
|
+
children: [
|
|
1597
|
+
!hideLabel && /* @__PURE__ */ jsx37("div", { className: "font-medium", children: labelFormatter ? labelFormatter(label, payload) : label }),
|
|
1598
|
+
/* @__PURE__ */ jsx37("div", { className: "grid gap-1.5", children: payload.map((item, i) => {
|
|
1599
|
+
const key = `${item.name || item.dataKey || "value"}`;
|
|
1600
|
+
const itemConfig = config[key];
|
|
1601
|
+
const indicatorColor = color || item.payload?.fill || item.color;
|
|
1602
|
+
return /* @__PURE__ */ jsxs15("div", { className: "flex w-full items-center gap-2", children: [
|
|
1603
|
+
!hideIndicator && /* @__PURE__ */ jsx37(
|
|
1604
|
+
"div",
|
|
1605
|
+
{
|
|
1606
|
+
className: cn("shrink-0 rounded-[2px]", {
|
|
1607
|
+
"size-2.5": indicator === "dot",
|
|
1608
|
+
"w-1": indicator === "line",
|
|
1609
|
+
"w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed"
|
|
1610
|
+
}),
|
|
1611
|
+
style: { backgroundColor: indicatorColor, borderColor: indicatorColor }
|
|
1612
|
+
}
|
|
1613
|
+
),
|
|
1614
|
+
/* @__PURE__ */ jsxs15("div", { className: "flex flex-1 justify-between leading-none", children: [
|
|
1615
|
+
/* @__PURE__ */ jsx37("span", { className: "text-muted-foreground", children: itemConfig?.label || item.name }),
|
|
1616
|
+
item.value != null && /* @__PURE__ */ jsx37("span", { className: "font-mono font-medium tabular-nums text-foreground", children: formatter ? formatter(item.value, item.name, item, i, payload) : item.value.toLocaleString() })
|
|
1617
|
+
] })
|
|
1618
|
+
] }, key + i);
|
|
1619
|
+
}) })
|
|
1620
|
+
]
|
|
1621
|
+
}
|
|
1622
|
+
);
|
|
1623
|
+
}
|
|
1624
|
+
);
|
|
1625
|
+
ChartTooltipContent.displayName = "ChartTooltipContent";
|
|
1626
|
+
var ChartLegend = RechartsPrimitive.Legend;
|
|
1627
|
+
var ChartLegendContent = React32.forwardRef(({ className, payload, verticalAlign = "bottom" }, ref) => {
|
|
1628
|
+
const { config } = useChart();
|
|
1629
|
+
if (!payload?.length) return null;
|
|
1630
|
+
return /* @__PURE__ */ jsx37(
|
|
1631
|
+
"div",
|
|
1632
|
+
{
|
|
1633
|
+
ref,
|
|
1634
|
+
className: cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className),
|
|
1635
|
+
children: payload.map((item) => {
|
|
1636
|
+
const key = `${item.dataKey || "value"}`;
|
|
1637
|
+
const itemConfig = config[key];
|
|
1638
|
+
return /* @__PURE__ */ jsxs15("div", { className: "flex items-center gap-1.5", children: [
|
|
1639
|
+
/* @__PURE__ */ jsx37("div", { className: "size-2 shrink-0 rounded-[2px]", style: { backgroundColor: item.color } }),
|
|
1640
|
+
itemConfig?.label || item.value
|
|
1641
|
+
] }, item.value);
|
|
1642
|
+
})
|
|
1643
|
+
}
|
|
1644
|
+
);
|
|
1645
|
+
});
|
|
1646
|
+
ChartLegendContent.displayName = "ChartLegendContent";
|
|
1647
|
+
|
|
1648
|
+
// src/components/command.tsx
|
|
1649
|
+
import * as React33 from "react";
|
|
1650
|
+
import { Command as CommandPrimitive } from "cmdk";
|
|
1651
|
+
import { Search } from "lucide-react";
|
|
1652
|
+
import { jsx as jsx38, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1653
|
+
var Command = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
|
|
1654
|
+
CommandPrimitive,
|
|
1655
|
+
{
|
|
1656
|
+
ref,
|
|
1657
|
+
className: cn(
|
|
1658
|
+
"flex size-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground font-sans",
|
|
1659
|
+
className
|
|
1660
|
+
),
|
|
1661
|
+
...props
|
|
1662
|
+
}
|
|
1663
|
+
));
|
|
1664
|
+
Command.displayName = CommandPrimitive.displayName;
|
|
1665
|
+
var CommandDialog = ({ children, ...props }) => /* @__PURE__ */ jsx38(Dialog, { ...props, children: /* @__PURE__ */ jsx38(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsx38(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-input-wrapper]_svg]:size-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:size-5", children }) }) });
|
|
1666
|
+
var CommandInput = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs16("div", { className: "flex items-center border-b px-3", "cmdk-input-wrapper": "", children: [
|
|
1667
|
+
/* @__PURE__ */ jsx38(Search, { className: "mr-2 size-4 shrink-0 opacity-50" }),
|
|
1668
|
+
/* @__PURE__ */ jsx38(
|
|
1669
|
+
CommandPrimitive.Input,
|
|
1670
|
+
{
|
|
1671
|
+
ref,
|
|
1672
|
+
className: cn(
|
|
1673
|
+
"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
1674
|
+
className
|
|
1675
|
+
),
|
|
1676
|
+
...props
|
|
1677
|
+
}
|
|
1678
|
+
)
|
|
1679
|
+
] }));
|
|
1680
|
+
CommandInput.displayName = CommandPrimitive.Input.displayName;
|
|
1681
|
+
var CommandList = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
|
|
1682
|
+
CommandPrimitive.List,
|
|
1683
|
+
{
|
|
1684
|
+
ref,
|
|
1685
|
+
className: cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className),
|
|
1686
|
+
...props
|
|
1687
|
+
}
|
|
1688
|
+
));
|
|
1689
|
+
CommandList.displayName = CommandPrimitive.List.displayName;
|
|
1690
|
+
var CommandEmpty = React33.forwardRef((props, ref) => /* @__PURE__ */ jsx38(CommandPrimitive.Empty, { ref, className: "py-6 text-center text-sm", ...props }));
|
|
1691
|
+
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
|
|
1692
|
+
var CommandGroup = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
|
|
1693
|
+
CommandPrimitive.Group,
|
|
1694
|
+
{
|
|
1695
|
+
ref,
|
|
1696
|
+
className: cn(
|
|
1697
|
+
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
|
|
1698
|
+
className
|
|
1699
|
+
),
|
|
1700
|
+
...props
|
|
1701
|
+
}
|
|
1702
|
+
));
|
|
1703
|
+
CommandGroup.displayName = CommandPrimitive.Group.displayName;
|
|
1704
|
+
var CommandSeparator = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(CommandPrimitive.Separator, { ref, className: cn("-mx-1 h-px bg-border", className), ...props }));
|
|
1705
|
+
CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
|
|
1706
|
+
var CommandItem = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
|
|
1707
|
+
CommandPrimitive.Item,
|
|
1708
|
+
{
|
|
1709
|
+
ref,
|
|
1710
|
+
className: cn(
|
|
1711
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0",
|
|
1712
|
+
className
|
|
1713
|
+
),
|
|
1714
|
+
...props
|
|
1715
|
+
}
|
|
1716
|
+
));
|
|
1717
|
+
CommandItem.displayName = CommandPrimitive.Item.displayName;
|
|
1718
|
+
var CommandShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx38("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
|
|
1719
|
+
CommandShortcut.displayName = "CommandShortcut";
|
|
1720
|
+
|
|
1721
|
+
// src/components/context-menu.tsx
|
|
1722
|
+
import * as React34 from "react";
|
|
1723
|
+
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
|
|
1724
|
+
import { Check as Check4, ChevronRight as ChevronRight5, Circle as Circle3 } from "lucide-react";
|
|
1725
|
+
import { jsx as jsx39, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
1726
|
+
var ContextMenu = ContextMenuPrimitive.Root;
|
|
1727
|
+
var ContextMenuTrigger = ContextMenuPrimitive.Trigger;
|
|
1728
|
+
var ContextMenuGroup = ContextMenuPrimitive.Group;
|
|
1729
|
+
var ContextMenuPortal = ContextMenuPrimitive.Portal;
|
|
1730
|
+
var ContextMenuSub = ContextMenuPrimitive.Sub;
|
|
1731
|
+
var ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
|
|
1732
|
+
var itemCls2 = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
|
|
1733
|
+
var contentCls2 = "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95";
|
|
1734
|
+
var ContextMenuSubTrigger = React34.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs17(
|
|
1735
|
+
ContextMenuPrimitive.SubTrigger,
|
|
1736
|
+
{
|
|
1737
|
+
ref,
|
|
1738
|
+
className: cn(itemCls2, "data-[state=open]:bg-accent", inset && "pl-8", className),
|
|
1739
|
+
...props,
|
|
1740
|
+
children: [
|
|
1741
|
+
children,
|
|
1742
|
+
/* @__PURE__ */ jsx39(ChevronRight5, { className: "ml-auto size-4" })
|
|
1743
|
+
]
|
|
1744
|
+
}
|
|
1745
|
+
));
|
|
1746
|
+
ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
|
|
1747
|
+
var ContextMenuSubContent = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.SubContent, { ref, className: cn(contentCls2, className), ...props }));
|
|
1748
|
+
ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
|
|
1749
|
+
var ContextMenuContent = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.Content, { ref, className: cn(contentCls2, className), ...props }) }));
|
|
1750
|
+
ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
|
|
1751
|
+
var ContextMenuItem = React34.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Item, { ref, className: cn(itemCls2, inset && "pl-8", className), ...props }));
|
|
1752
|
+
ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
|
|
1753
|
+
var ContextMenuCheckboxItem = React34.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs17(ContextMenuPrimitive.CheckboxItem, { ref, className: cn(itemCls2, "pl-8", className), checked, ...props, children: [
|
|
1754
|
+
/* @__PURE__ */ jsx39("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx39(Check4, { className: "size-4" }) }) }),
|
|
1755
|
+
children
|
|
1756
|
+
] }));
|
|
1757
|
+
ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
|
|
1758
|
+
var ContextMenuRadioItem = React34.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs17(ContextMenuPrimitive.RadioItem, { ref, className: cn(itemCls2, "pl-8", className), ...props, children: [
|
|
1759
|
+
/* @__PURE__ */ jsx39("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx39(ContextMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx39(Circle3, { className: "size-2 fill-current" }) }) }),
|
|
1760
|
+
children
|
|
1761
|
+
] }));
|
|
1762
|
+
ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
|
|
1763
|
+
var ContextMenuLabel = React34.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx39(
|
|
1764
|
+
ContextMenuPrimitive.Label,
|
|
1765
|
+
{
|
|
1766
|
+
ref,
|
|
1767
|
+
className: cn("px-2 py-1.5 text-sm font-semibold text-foreground", inset && "pl-8", className),
|
|
1768
|
+
...props
|
|
1769
|
+
}
|
|
1770
|
+
));
|
|
1771
|
+
ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
|
|
1772
|
+
var ContextMenuSeparator = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx39(ContextMenuPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
|
|
1773
|
+
ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
|
|
1774
|
+
var ContextMenuShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx39("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
|
|
1775
|
+
ContextMenuShortcut.displayName = "ContextMenuShortcut";
|
|
1776
|
+
|
|
1777
|
+
// src/components/data-table.tsx
|
|
1778
|
+
import * as React35 from "react";
|
|
1779
|
+
import {
|
|
1780
|
+
flexRender,
|
|
1781
|
+
getCoreRowModel,
|
|
1782
|
+
getPaginationRowModel,
|
|
1783
|
+
getSortedRowModel,
|
|
1784
|
+
useReactTable
|
|
1785
|
+
} from "@tanstack/react-table";
|
|
1786
|
+
import { jsx as jsx40, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1787
|
+
function DataTable({
|
|
1788
|
+
columns,
|
|
1789
|
+
data,
|
|
1790
|
+
className,
|
|
1791
|
+
pageSize = 10
|
|
1792
|
+
}) {
|
|
1793
|
+
const [sorting, setSorting] = React35.useState([]);
|
|
1794
|
+
const table = useReactTable({
|
|
1795
|
+
data,
|
|
1796
|
+
columns,
|
|
1797
|
+
state: { sorting },
|
|
1798
|
+
onSortingChange: setSorting,
|
|
1799
|
+
getCoreRowModel: getCoreRowModel(),
|
|
1800
|
+
getSortedRowModel: getSortedRowModel(),
|
|
1801
|
+
getPaginationRowModel: getPaginationRowModel(),
|
|
1802
|
+
initialState: { pagination: { pageSize } }
|
|
1803
|
+
});
|
|
1804
|
+
return /* @__PURE__ */ jsxs18("div", { className: cn("space-y-3", className), children: [
|
|
1805
|
+
/* @__PURE__ */ jsx40("div", { className: "rounded-md border", children: /* @__PURE__ */ jsxs18(Table, { children: [
|
|
1806
|
+
/* @__PURE__ */ jsx40(TableHeader, { children: table.getHeaderGroups().map((hg) => /* @__PURE__ */ jsx40(TableRow, { children: hg.headers.map((header) => /* @__PURE__ */ jsx40(TableHead, { children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) }, header.id)) }, hg.id)) }),
|
|
1807
|
+
/* @__PURE__ */ jsx40(TableBody, { children: table.getRowModel().rows.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx40(TableRow, { "data-state": row.getIsSelected() && "selected", children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx40(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id)) }, row.id)) : /* @__PURE__ */ jsx40(TableRow, { children: /* @__PURE__ */ jsx40(TableCell, { colSpan: columns.length, className: "h-24 text-center", children: "No results." }) }) })
|
|
1808
|
+
] }) }),
|
|
1809
|
+
/* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-end gap-2", children: [
|
|
1810
|
+
/* @__PURE__ */ jsx40(Button, { variant: "Outline", size: "sm", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage(), children: "Previous" }),
|
|
1811
|
+
/* @__PURE__ */ jsx40(Button, { variant: "Outline", size: "sm", onClick: () => table.nextPage(), disabled: !table.getCanNextPage(), children: "Next" })
|
|
1812
|
+
] })
|
|
1813
|
+
] });
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
// src/components/drawer.tsx
|
|
1817
|
+
import * as React36 from "react";
|
|
1818
|
+
import { Drawer as DrawerPrimitive } from "vaul";
|
|
1819
|
+
import { jsx as jsx41, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1820
|
+
var Drawer = ({ shouldScaleBackground = true, ...props }) => /* @__PURE__ */ jsx41(DrawerPrimitive.Root, { shouldScaleBackground, ...props });
|
|
1821
|
+
Drawer.displayName = "Drawer";
|
|
1822
|
+
var DrawerTrigger = DrawerPrimitive.Trigger;
|
|
1823
|
+
var DrawerPortal = DrawerPrimitive.Portal;
|
|
1824
|
+
var DrawerClose = DrawerPrimitive.Close;
|
|
1825
|
+
var DrawerOverlay = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Overlay, { ref, className: cn("fixed inset-0 z-50 bg-foreground/40", className), ...props }));
|
|
1826
|
+
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
|
|
1827
|
+
var DrawerContent = React36.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs19(DrawerPortal, { children: [
|
|
1828
|
+
/* @__PURE__ */ jsx41(DrawerOverlay, {}),
|
|
1829
|
+
/* @__PURE__ */ jsxs19(
|
|
1830
|
+
DrawerPrimitive.Content,
|
|
1831
|
+
{
|
|
1832
|
+
ref,
|
|
1833
|
+
className: cn(
|
|
1834
|
+
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background font-sans",
|
|
1835
|
+
className
|
|
1836
|
+
),
|
|
1837
|
+
...props,
|
|
1838
|
+
children: [
|
|
1839
|
+
/* @__PURE__ */ jsx41("div", { className: "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" }),
|
|
1840
|
+
children
|
|
1841
|
+
]
|
|
1842
|
+
}
|
|
1843
|
+
)
|
|
1844
|
+
] }));
|
|
1845
|
+
DrawerContent.displayName = "DrawerContent";
|
|
1846
|
+
var DrawerHeader = ({ className, ...props }) => /* @__PURE__ */ jsx41("div", { className: cn("grid gap-1.5 p-4 text-center sm:text-left", className), ...props });
|
|
1847
|
+
DrawerHeader.displayName = "DrawerHeader";
|
|
1848
|
+
var DrawerFooter = ({ className, ...props }) => /* @__PURE__ */ jsx41("div", { className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
|
|
1849
|
+
DrawerFooter.displayName = "DrawerFooter";
|
|
1850
|
+
var DrawerTitle = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
1851
|
+
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
|
|
1852
|
+
var DrawerDescription = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(DrawerPrimitive.Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
1853
|
+
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
|
|
1854
|
+
|
|
1855
|
+
// src/components/field.tsx
|
|
1856
|
+
import * as React37 from "react";
|
|
1857
|
+
import { Slot as Slot3 } from "@radix-ui/react-slot";
|
|
1858
|
+
import { CircleAlert, CircleCheck, Info, TriangleAlert } from "lucide-react";
|
|
1859
|
+
import { cva as cva10 } from "class-variance-authority";
|
|
1860
|
+
import { jsx as jsx42, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1861
|
+
var FieldContext = React37.createContext(null);
|
|
1862
|
+
function useField() {
|
|
1863
|
+
const ctx = React37.useContext(FieldContext);
|
|
1864
|
+
if (!ctx) throw new Error("Field parts must be used within <Field>");
|
|
1865
|
+
return ctx;
|
|
1866
|
+
}
|
|
1867
|
+
var Field = React37.forwardRef(
|
|
1868
|
+
({ className, invalid = false, ...props }, ref) => {
|
|
1869
|
+
const id = React37.useId();
|
|
1870
|
+
const value = React37.useMemo(
|
|
1871
|
+
() => ({ id: `${id}-control`, descriptionId: `${id}-description`, messageId: `${id}-message`, invalid }),
|
|
1872
|
+
[id, invalid]
|
|
1873
|
+
);
|
|
1874
|
+
return /* @__PURE__ */ jsx42(FieldContext.Provider, { value, children: /* @__PURE__ */ jsx42("div", { ref, "data-invalid": invalid || void 0, className: cn("grid gap-1.5", className), ...props }) });
|
|
1875
|
+
}
|
|
1876
|
+
);
|
|
1877
|
+
Field.displayName = "Field";
|
|
1878
|
+
var FieldLabel = React37.forwardRef(({ className, ...props }, ref) => {
|
|
1879
|
+
const { id, invalid } = useField();
|
|
1880
|
+
return /* @__PURE__ */ jsx42(Label2, { ref, htmlFor: id, className: cn(invalid && "text-destructive", className), ...props });
|
|
1881
|
+
});
|
|
1882
|
+
FieldLabel.displayName = "FieldLabel";
|
|
1883
|
+
var FieldControl = React37.forwardRef(
|
|
1884
|
+
({ ...props }, ref) => {
|
|
1885
|
+
const { id, descriptionId, messageId, invalid } = useField();
|
|
1886
|
+
return /* @__PURE__ */ jsx42(
|
|
1887
|
+
Slot3,
|
|
1888
|
+
{
|
|
1889
|
+
ref,
|
|
1890
|
+
id,
|
|
1891
|
+
"aria-invalid": invalid || void 0,
|
|
1892
|
+
"aria-describedby": `${descriptionId} ${messageId}`,
|
|
1893
|
+
...props
|
|
1894
|
+
}
|
|
1895
|
+
);
|
|
1896
|
+
}
|
|
1897
|
+
);
|
|
1898
|
+
FieldControl.displayName = "FieldControl";
|
|
1899
|
+
var FieldDescription = React37.forwardRef(
|
|
1900
|
+
({ className, ...props }, ref) => {
|
|
1901
|
+
const { descriptionId } = useField();
|
|
1902
|
+
return /* @__PURE__ */ jsx42("p", { ref, id: descriptionId, className: cn("text-body-sm text-muted-foreground", className), ...props });
|
|
1903
|
+
}
|
|
1904
|
+
);
|
|
1905
|
+
FieldDescription.displayName = "FieldDescription";
|
|
1906
|
+
var messageVariants = cva10("flex items-center gap-1.5 text-body-sm [&>svg]:size-3.5 [&>svg]:shrink-0", {
|
|
1907
|
+
variants: {
|
|
1908
|
+
intent: {
|
|
1909
|
+
error: "text-destructive",
|
|
1910
|
+
warning: "text-warning",
|
|
1911
|
+
success: "text-success",
|
|
1912
|
+
info: "text-info"
|
|
1913
|
+
}
|
|
1914
|
+
},
|
|
1915
|
+
defaultVariants: { intent: "error" }
|
|
1916
|
+
});
|
|
1917
|
+
var INTENT_ICON = {
|
|
1918
|
+
error: CircleAlert,
|
|
1919
|
+
warning: TriangleAlert,
|
|
1920
|
+
success: CircleCheck,
|
|
1921
|
+
info: Info
|
|
1922
|
+
};
|
|
1923
|
+
var FieldMessage = React37.forwardRef(
|
|
1924
|
+
({ className, intent = "error", hideIcon, children, ...props }, ref) => {
|
|
1925
|
+
const { messageId } = useField();
|
|
1926
|
+
const Icon2 = INTENT_ICON[intent ?? "error"];
|
|
1927
|
+
if (!children) return null;
|
|
1928
|
+
return /* @__PURE__ */ jsxs20("p", { ref, id: messageId, className: cn(messageVariants({ intent }), className), ...props, children: [
|
|
1929
|
+
!hideIcon && /* @__PURE__ */ jsx42(Icon2, {}),
|
|
1930
|
+
/* @__PURE__ */ jsx42("span", { children })
|
|
1931
|
+
] });
|
|
1932
|
+
}
|
|
1933
|
+
);
|
|
1934
|
+
FieldMessage.displayName = "FieldMessage";
|
|
1935
|
+
|
|
1936
|
+
// src/components/form.tsx
|
|
1937
|
+
import * as React38 from "react";
|
|
1938
|
+
import { Slot as Slot4 } from "@radix-ui/react-slot";
|
|
1939
|
+
import {
|
|
1940
|
+
Controller,
|
|
1941
|
+
FormProvider,
|
|
1942
|
+
useFormContext,
|
|
1943
|
+
useFormState
|
|
1944
|
+
} from "react-hook-form";
|
|
1945
|
+
import { jsx as jsx43 } from "react/jsx-runtime";
|
|
1946
|
+
var Form = FormProvider;
|
|
1947
|
+
var FormFieldContext = React38.createContext({});
|
|
1948
|
+
var FormField = ({
|
|
1949
|
+
...props
|
|
1950
|
+
}) => /* @__PURE__ */ jsx43(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx43(Controller, { ...props }) });
|
|
1951
|
+
var useFormField = () => {
|
|
1952
|
+
const fieldContext = React38.useContext(FormFieldContext);
|
|
1953
|
+
const itemContext = React38.useContext(FormItemContext);
|
|
1954
|
+
const { getFieldState } = useFormContext();
|
|
1955
|
+
const formState = useFormState({ name: fieldContext.name });
|
|
1956
|
+
const fieldState = getFieldState(fieldContext.name, formState);
|
|
1957
|
+
if (!fieldContext) throw new Error("useFormField should be used within <FormField>");
|
|
1958
|
+
const { id } = itemContext;
|
|
1959
|
+
return {
|
|
1960
|
+
id,
|
|
1961
|
+
name: fieldContext.name,
|
|
1962
|
+
formItemId: `${id}-form-item`,
|
|
1963
|
+
formDescriptionId: `${id}-form-item-description`,
|
|
1964
|
+
formMessageId: `${id}-form-item-message`,
|
|
1965
|
+
...fieldState
|
|
1966
|
+
};
|
|
1967
|
+
};
|
|
1968
|
+
var FormItemContext = React38.createContext({});
|
|
1969
|
+
var FormItem = React38.forwardRef(
|
|
1970
|
+
({ className, ...props }, ref) => {
|
|
1971
|
+
const id = React38.useId();
|
|
1972
|
+
return /* @__PURE__ */ jsx43(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx43("div", { ref, className: cn("grid gap-2", className), ...props }) });
|
|
1973
|
+
}
|
|
1974
|
+
);
|
|
1975
|
+
FormItem.displayName = "FormItem";
|
|
1976
|
+
var FormLabel = React38.forwardRef(({ className, ...props }, ref) => {
|
|
1977
|
+
const { error, formItemId } = useFormField();
|
|
1978
|
+
return /* @__PURE__ */ jsx43(Label2, { ref, className: cn(error && "text-destructive", className), htmlFor: formItemId, ...props });
|
|
1979
|
+
});
|
|
1980
|
+
FormLabel.displayName = "FormLabel";
|
|
1981
|
+
var FormControl = React38.forwardRef(({ ...props }, ref) => {
|
|
1982
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
1983
|
+
return /* @__PURE__ */ jsx43(
|
|
1984
|
+
Slot4,
|
|
1985
|
+
{
|
|
1986
|
+
ref,
|
|
1987
|
+
id: formItemId,
|
|
1988
|
+
"aria-describedby": !error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`,
|
|
1989
|
+
"aria-invalid": !!error,
|
|
1990
|
+
...props
|
|
1991
|
+
}
|
|
1992
|
+
);
|
|
1993
|
+
});
|
|
1994
|
+
FormControl.displayName = "FormControl";
|
|
1995
|
+
var FormDescription = React38.forwardRef(
|
|
1996
|
+
({ className, ...props }, ref) => {
|
|
1997
|
+
const { formDescriptionId } = useFormField();
|
|
1998
|
+
return /* @__PURE__ */ jsx43("p", { ref, id: formDescriptionId, className: cn("text-sm text-muted-foreground", className), ...props });
|
|
1999
|
+
}
|
|
2000
|
+
);
|
|
2001
|
+
FormDescription.displayName = "FormDescription";
|
|
2002
|
+
var FormMessage = React38.forwardRef(
|
|
2003
|
+
({ className, children, ...props }, ref) => {
|
|
2004
|
+
const { error, formMessageId } = useFormField();
|
|
2005
|
+
const body = error ? String(error?.message ?? "") : children;
|
|
2006
|
+
if (!body) return null;
|
|
2007
|
+
return /* @__PURE__ */ jsx43("p", { ref, id: formMessageId, className: cn("text-sm font-medium text-destructive", className), ...props, children: body });
|
|
2008
|
+
}
|
|
2009
|
+
);
|
|
2010
|
+
FormMessage.displayName = "FormMessage";
|
|
2011
|
+
|
|
2012
|
+
// src/components/input-group.tsx
|
|
2013
|
+
import * as React39 from "react";
|
|
2014
|
+
import { cva as cva11 } from "class-variance-authority";
|
|
2015
|
+
import { jsx as jsx44 } from "react/jsx-runtime";
|
|
2016
|
+
var InputGroup = React39.forwardRef(
|
|
2017
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2018
|
+
"div",
|
|
2019
|
+
{
|
|
2020
|
+
ref,
|
|
2021
|
+
"data-slot": "input-group",
|
|
2022
|
+
className: cn(
|
|
2023
|
+
"flex w-full items-center overflow-hidden rounded-sm border border-input bg-background font-sans transition-colors",
|
|
2024
|
+
"focus-within:border-primary focus-within:shadow-focus",
|
|
2025
|
+
"has-[[aria-invalid=true]]:border-destructive has-[[aria-invalid=true]]:focus-within:shadow-focus-destructive",
|
|
2026
|
+
"has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50",
|
|
2027
|
+
className
|
|
2028
|
+
),
|
|
2029
|
+
...props
|
|
2030
|
+
}
|
|
2031
|
+
)
|
|
2032
|
+
);
|
|
2033
|
+
InputGroup.displayName = "InputGroup";
|
|
2034
|
+
var InputGroupInput = React39.forwardRef(({ className, type = "text", ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2035
|
+
"input",
|
|
2036
|
+
{
|
|
2037
|
+
ref,
|
|
2038
|
+
type,
|
|
2039
|
+
"data-slot": "input-group-input",
|
|
2040
|
+
className: cn(
|
|
2041
|
+
"min-w-0 flex-1 bg-transparent px-3 py-3 text-body-md text-foreground",
|
|
2042
|
+
"placeholder:text-muted-foreground outline-none disabled:cursor-not-allowed",
|
|
2043
|
+
className
|
|
2044
|
+
),
|
|
2045
|
+
...props
|
|
2046
|
+
}
|
|
2047
|
+
));
|
|
2048
|
+
InputGroupInput.displayName = "InputGroupInput";
|
|
2049
|
+
var addonVariants = cva11("flex shrink-0 items-center gap-2 text-muted-foreground [&_svg]:size-4 [&_svg]:shrink-0", {
|
|
2050
|
+
variants: { align: { start: "pl-3", end: "pr-3" } },
|
|
2051
|
+
defaultVariants: { align: "start" }
|
|
2052
|
+
});
|
|
2053
|
+
var InputGroupAddon = React39.forwardRef(({ className, align, ...props }, ref) => /* @__PURE__ */ jsx44("div", { ref, "data-slot": "input-group-addon", className: cn(addonVariants({ align }), className), ...props }));
|
|
2054
|
+
InputGroupAddon.displayName = "InputGroupAddon";
|
|
2055
|
+
var InputGroupText = React39.forwardRef(
|
|
2056
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2057
|
+
"span",
|
|
2058
|
+
{
|
|
2059
|
+
ref,
|
|
2060
|
+
className: cn("select-none whitespace-nowrap px-3 text-body-md text-muted-foreground", className),
|
|
2061
|
+
...props
|
|
2062
|
+
}
|
|
2063
|
+
)
|
|
2064
|
+
);
|
|
2065
|
+
InputGroupText.displayName = "InputGroupText";
|
|
2066
|
+
var InputGroupButton = React39.forwardRef(({ className, type = "button", ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2067
|
+
"button",
|
|
2068
|
+
{
|
|
2069
|
+
ref,
|
|
2070
|
+
type,
|
|
2071
|
+
className: cn(
|
|
2072
|
+
"flex h-full shrink-0 items-center gap-1.5 self-stretch border-l border-input bg-muted px-3 text-label-md text-foreground",
|
|
2073
|
+
"outline-none transition-colors hover:bg-accent focus-visible:bg-accent disabled:cursor-not-allowed disabled:opacity-50",
|
|
2074
|
+
"[&_svg]:size-4 [&_svg]:shrink-0",
|
|
2075
|
+
className
|
|
2076
|
+
),
|
|
2077
|
+
...props
|
|
2078
|
+
}
|
|
2079
|
+
));
|
|
2080
|
+
InputGroupButton.displayName = "InputGroupButton";
|
|
2081
|
+
|
|
2082
|
+
// src/components/input-otp.tsx
|
|
2083
|
+
import * as React40 from "react";
|
|
2084
|
+
import { OTPInput, OTPInputContext } from "input-otp";
|
|
2085
|
+
import { Minus as Minus2 } from "lucide-react";
|
|
2086
|
+
import { jsx as jsx45, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2087
|
+
var InputOTP = React40.forwardRef(({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ jsx45(
|
|
2088
|
+
OTPInput,
|
|
2089
|
+
{
|
|
2090
|
+
ref,
|
|
2091
|
+
containerClassName: cn("flex items-center gap-2 has-[:disabled]:opacity-50", containerClassName),
|
|
2092
|
+
className: cn("disabled:cursor-not-allowed", className),
|
|
2093
|
+
...props
|
|
2094
|
+
}
|
|
2095
|
+
));
|
|
2096
|
+
InputOTP.displayName = "InputOTP";
|
|
2097
|
+
var InputOTPGroup = React40.forwardRef(
|
|
2098
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx45("div", { ref, className: cn("flex items-center", className), ...props })
|
|
2099
|
+
);
|
|
2100
|
+
InputOTPGroup.displayName = "InputOTPGroup";
|
|
2101
|
+
var InputOTPSlot = React40.forwardRef(({ index, className, ...props }, ref) => {
|
|
2102
|
+
const inputOTPContext = React40.useContext(OTPInputContext);
|
|
2103
|
+
const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index] ?? {};
|
|
2104
|
+
return /* @__PURE__ */ jsxs21(
|
|
2105
|
+
"div",
|
|
2106
|
+
{
|
|
2107
|
+
ref,
|
|
2108
|
+
className: cn(
|
|
2109
|
+
"relative flex size-9 items-center justify-center border-y border-r border-input text-sm shadow-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
|
|
2110
|
+
isActive && "z-10 ring-1 ring-ring",
|
|
2111
|
+
className
|
|
2112
|
+
),
|
|
2113
|
+
...props,
|
|
2114
|
+
children: [
|
|
2115
|
+
char,
|
|
2116
|
+
hasFakeCaret && /* @__PURE__ */ jsx45("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx45("div", { className: "h-4 w-px animate-caret-blink bg-foreground duration-1000" }) })
|
|
2117
|
+
]
|
|
2118
|
+
}
|
|
2119
|
+
);
|
|
2120
|
+
});
|
|
2121
|
+
InputOTPSlot.displayName = "InputOTPSlot";
|
|
2122
|
+
var InputOTPSeparator = React40.forwardRef(
|
|
2123
|
+
({ ...props }, ref) => /* @__PURE__ */ jsx45("div", { ref, role: "separator", ...props, children: /* @__PURE__ */ jsx45(Minus2, { className: "size-4" }) })
|
|
2124
|
+
);
|
|
2125
|
+
InputOTPSeparator.displayName = "InputOTPSeparator";
|
|
2126
|
+
|
|
2127
|
+
// src/components/password-input.tsx
|
|
2128
|
+
import * as React41 from "react";
|
|
2129
|
+
import { Eye, EyeOff } from "lucide-react";
|
|
2130
|
+
import { jsx as jsx46, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2131
|
+
var PasswordInput = React41.forwardRef(({ className, ...props }, ref) => {
|
|
2132
|
+
const [visible, setVisible] = React41.useState(false);
|
|
2133
|
+
return /* @__PURE__ */ jsxs22(InputGroup, { className, children: [
|
|
2134
|
+
/* @__PURE__ */ jsx46(InputGroupInput, { ref, type: visible ? "text" : "password", ...props }),
|
|
2135
|
+
/* @__PURE__ */ jsx46(InputGroupAddon, { align: "end", children: /* @__PURE__ */ jsx46(
|
|
2136
|
+
"button",
|
|
2137
|
+
{
|
|
2138
|
+
type: "button",
|
|
2139
|
+
"aria-label": visible ? "Hide password" : "Show password",
|
|
2140
|
+
"aria-pressed": visible,
|
|
2141
|
+
onClick: () => setVisible((v) => !v),
|
|
2142
|
+
className: cn("rounded-[2px] outline-none transition-colors hover:text-foreground focus-visible:text-foreground"),
|
|
2143
|
+
children: visible ? /* @__PURE__ */ jsx46(EyeOff, {}) : /* @__PURE__ */ jsx46(Eye, {})
|
|
2144
|
+
}
|
|
2145
|
+
) })
|
|
2146
|
+
] });
|
|
2147
|
+
});
|
|
2148
|
+
PasswordInput.displayName = "PasswordInput";
|
|
2149
|
+
|
|
2150
|
+
// src/components/menubar.tsx
|
|
2151
|
+
import * as React42 from "react";
|
|
2152
|
+
import * as MenubarPrimitive from "@radix-ui/react-menubar";
|
|
2153
|
+
import { Check as Check5, ChevronRight as ChevronRight6, Circle as Circle4 } from "lucide-react";
|
|
2154
|
+
import { jsx as jsx47, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2155
|
+
var MenubarMenu = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Menu, { ...props });
|
|
2156
|
+
var MenubarGroup = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Group, { ...props });
|
|
2157
|
+
var MenubarPortal = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Portal, { ...props });
|
|
2158
|
+
var MenubarSub = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.Sub, { ...props });
|
|
2159
|
+
var MenubarRadioGroup = (props) => /* @__PURE__ */ jsx47(MenubarPrimitive.RadioGroup, { ...props });
|
|
2160
|
+
var itemCls3 = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
|
|
2161
|
+
var contentCls3 = "z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md font-sans data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95";
|
|
2162
|
+
var Menubar = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
2163
|
+
MenubarPrimitive.Root,
|
|
2164
|
+
{
|
|
2165
|
+
ref,
|
|
2166
|
+
className: cn("flex h-9 items-center gap-1 rounded-md border bg-background p-1 shadow-sm font-sans", className),
|
|
2167
|
+
...props
|
|
2168
|
+
}
|
|
2169
|
+
));
|
|
2170
|
+
Menubar.displayName = MenubarPrimitive.Root.displayName;
|
|
2171
|
+
var MenubarTrigger = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(
|
|
2172
|
+
MenubarPrimitive.Trigger,
|
|
2173
|
+
{
|
|
2174
|
+
ref,
|
|
2175
|
+
className: cn(
|
|
2176
|
+
"flex cursor-default select-none items-center rounded-sm px-3 py-1 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
|
|
2177
|
+
className
|
|
2178
|
+
),
|
|
2179
|
+
...props
|
|
2180
|
+
}
|
|
2181
|
+
));
|
|
2182
|
+
MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
|
|
2183
|
+
var MenubarSubTrigger = React42.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.SubTrigger, { ref, className: cn(itemCls3, "data-[state=open]:bg-accent", inset && "pl-8", className), ...props, children: [
|
|
2184
|
+
children,
|
|
2185
|
+
/* @__PURE__ */ jsx47(ChevronRight6, { className: "ml-auto size-4" })
|
|
2186
|
+
] }));
|
|
2187
|
+
MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
|
|
2188
|
+
var MenubarSubContent = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.SubContent, { ref, className: cn(contentCls3, className), ...props }));
|
|
2189
|
+
MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
|
|
2190
|
+
var MenubarContent = React42.forwardRef(({ className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Portal, { children: /* @__PURE__ */ jsx47(
|
|
2191
|
+
MenubarPrimitive.Content,
|
|
2192
|
+
{
|
|
2193
|
+
ref,
|
|
2194
|
+
align,
|
|
2195
|
+
alignOffset,
|
|
2196
|
+
sideOffset,
|
|
2197
|
+
className: cn(contentCls3, className),
|
|
2198
|
+
...props
|
|
2199
|
+
}
|
|
2200
|
+
) }));
|
|
2201
|
+
MenubarContent.displayName = MenubarPrimitive.Content.displayName;
|
|
2202
|
+
var MenubarItem = React42.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Item, { ref, className: cn(itemCls3, inset && "pl-8", className), ...props }));
|
|
2203
|
+
MenubarItem.displayName = MenubarPrimitive.Item.displayName;
|
|
2204
|
+
var MenubarCheckboxItem = React42.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.CheckboxItem, { ref, className: cn(itemCls3, "pl-8", className), checked, ...props, children: [
|
|
2205
|
+
/* @__PURE__ */ jsx47("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx47(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx47(Check5, { className: "size-4" }) }) }),
|
|
2206
|
+
children
|
|
2207
|
+
] }));
|
|
2208
|
+
MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
|
|
2209
|
+
var MenubarRadioItem = React42.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs23(MenubarPrimitive.RadioItem, { ref, className: cn(itemCls3, "pl-8", className), ...props, children: [
|
|
2210
|
+
/* @__PURE__ */ jsx47("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsx47(MenubarPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx47(Circle4, { className: "size-2 fill-current" }) }) }),
|
|
2211
|
+
children
|
|
2212
|
+
] }));
|
|
2213
|
+
MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
|
|
2214
|
+
var MenubarLabel = React42.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props }));
|
|
2215
|
+
MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
|
|
2216
|
+
var MenubarSeparator = React42.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx47(MenubarPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
|
|
2217
|
+
MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
|
|
2218
|
+
var MenubarShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx47("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), ...props });
|
|
2219
|
+
MenubarShortcut.displayName = "MenubarShortcut";
|
|
2220
|
+
|
|
2221
|
+
// src/components/navigation-menu.tsx
|
|
2222
|
+
import * as React43 from "react";
|
|
2223
|
+
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
|
|
2224
|
+
import { cva as cva12 } from "class-variance-authority";
|
|
2225
|
+
import { ChevronDown as ChevronDown3 } from "lucide-react";
|
|
2226
|
+
import { jsx as jsx48, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2227
|
+
var NavigationMenu = React43.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
2228
|
+
NavigationMenuPrimitive.Root,
|
|
2229
|
+
{
|
|
2230
|
+
ref,
|
|
2231
|
+
className: cn("relative z-10 flex max-w-max flex-1 items-center justify-center font-sans", className),
|
|
2232
|
+
...props,
|
|
2233
|
+
children: [
|
|
2234
|
+
children,
|
|
2235
|
+
/* @__PURE__ */ jsx48(NavigationMenuViewport, {})
|
|
2236
|
+
]
|
|
2237
|
+
}
|
|
2238
|
+
));
|
|
2239
|
+
NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
|
|
2240
|
+
var NavigationMenuList = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
|
|
2241
|
+
NavigationMenuPrimitive.List,
|
|
2242
|
+
{
|
|
2243
|
+
ref,
|
|
2244
|
+
className: cn("group flex flex-1 list-none items-center justify-center gap-1", className),
|
|
2245
|
+
...props
|
|
2246
|
+
}
|
|
2247
|
+
));
|
|
2248
|
+
NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
|
|
2249
|
+
var NavigationMenuItem = NavigationMenuPrimitive.Item;
|
|
2250
|
+
var navigationMenuTriggerStyle = cva12(
|
|
2251
|
+
"group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50"
|
|
2252
|
+
);
|
|
2253
|
+
var NavigationMenuTrigger = React43.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(NavigationMenuPrimitive.Trigger, { ref, className: cn(navigationMenuTriggerStyle(), "group", className), ...props, children: [
|
|
2254
|
+
children,
|
|
2255
|
+
/* @__PURE__ */ jsx48(
|
|
2256
|
+
ChevronDown3,
|
|
2257
|
+
{
|
|
2258
|
+
className: "relative top-px ml-1 size-3 transition-transform duration-200 group-data-[state=open]:rotate-180",
|
|
2259
|
+
"aria-hidden": true
|
|
2260
|
+
}
|
|
2261
|
+
)
|
|
2262
|
+
] }));
|
|
2263
|
+
NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
|
|
2264
|
+
var NavigationMenuContent = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
|
|
2265
|
+
NavigationMenuPrimitive.Content,
|
|
2266
|
+
{
|
|
2267
|
+
ref,
|
|
2268
|
+
className: cn(
|
|
2269
|
+
"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out md:absolute md:w-auto",
|
|
2270
|
+
className
|
|
2271
|
+
),
|
|
2272
|
+
...props
|
|
2273
|
+
}
|
|
2274
|
+
));
|
|
2275
|
+
NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
|
|
2276
|
+
var NavigationMenuLink = NavigationMenuPrimitive.Link;
|
|
2277
|
+
var NavigationMenuViewport = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48("div", { className: "absolute left-0 top-full flex justify-center", children: /* @__PURE__ */ jsx48(
|
|
2278
|
+
NavigationMenuPrimitive.Viewport,
|
|
2279
|
+
{
|
|
2280
|
+
ref,
|
|
2281
|
+
className: cn(
|
|
2282
|
+
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
|
|
2283
|
+
className
|
|
2284
|
+
),
|
|
2285
|
+
...props
|
|
2286
|
+
}
|
|
2287
|
+
) }));
|
|
2288
|
+
NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName;
|
|
2289
|
+
var NavigationMenuIndicator = React43.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx48(
|
|
2290
|
+
NavigationMenuPrimitive.Indicator,
|
|
2291
|
+
{
|
|
2292
|
+
ref,
|
|
2293
|
+
className: cn(
|
|
2294
|
+
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
|
|
2295
|
+
className
|
|
2296
|
+
),
|
|
2297
|
+
...props,
|
|
2298
|
+
children: /* @__PURE__ */ jsx48("div", { className: "relative top-[60%] size-2 rotate-45 rounded-tl-sm bg-border shadow-md" })
|
|
2299
|
+
}
|
|
2300
|
+
));
|
|
2301
|
+
NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName;
|
|
2302
|
+
|
|
2303
|
+
// src/components/resizable.tsx
|
|
2304
|
+
import { GripVertical } from "lucide-react";
|
|
2305
|
+
import * as ResizablePrimitive from "react-resizable-panels";
|
|
2306
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
2307
|
+
var ResizablePanelGroup = ({
|
|
2308
|
+
className,
|
|
2309
|
+
...props
|
|
2310
|
+
}) => /* @__PURE__ */ jsx49(
|
|
2311
|
+
ResizablePrimitive.PanelGroup,
|
|
2312
|
+
{
|
|
2313
|
+
className: cn("flex h-full w-full data-[panel-group-direction=vertical]:flex-col", className),
|
|
2314
|
+
...props
|
|
2315
|
+
}
|
|
2316
|
+
);
|
|
2317
|
+
var ResizablePanel = ResizablePrimitive.Panel;
|
|
2318
|
+
var ResizableHandle = ({
|
|
2319
|
+
withHandle,
|
|
2320
|
+
className,
|
|
2321
|
+
...props
|
|
2322
|
+
}) => /* @__PURE__ */ jsx49(
|
|
2323
|
+
ResizablePrimitive.PanelResizeHandle,
|
|
2324
|
+
{
|
|
2325
|
+
className: cn(
|
|
2326
|
+
"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
|
|
2327
|
+
className
|
|
2328
|
+
),
|
|
2329
|
+
...props,
|
|
2330
|
+
children: withHandle && /* @__PURE__ */ jsx49("div", { className: "z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border", children: /* @__PURE__ */ jsx49(GripVertical, { className: "size-2.5" }) })
|
|
2331
|
+
}
|
|
2332
|
+
);
|
|
2333
|
+
|
|
2334
|
+
// src/components/sidebar.tsx
|
|
2335
|
+
import * as React44 from "react";
|
|
2336
|
+
import { Slot as Slot5 } from "@radix-ui/react-slot";
|
|
2337
|
+
import { cva as cva13 } from "class-variance-authority";
|
|
2338
|
+
import { PanelLeft } from "lucide-react";
|
|
2339
|
+
import { jsx as jsx50, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2340
|
+
var SIDEBAR_COOKIE_NAME = "sidebar:state";
|
|
2341
|
+
var SIDEBAR_WIDTH = "16rem";
|
|
2342
|
+
var SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
2343
|
+
var SIDEBAR_WIDTH_ICON = "3rem";
|
|
2344
|
+
var SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
2345
|
+
var SidebarContext = React44.createContext(null);
|
|
2346
|
+
function useSidebar() {
|
|
2347
|
+
const context = React44.useContext(SidebarContext);
|
|
2348
|
+
if (!context) throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
2349
|
+
return context;
|
|
2350
|
+
}
|
|
2351
|
+
function useIsMobile() {
|
|
2352
|
+
const [isMobile, setIsMobile] = React44.useState(false);
|
|
2353
|
+
React44.useEffect(() => {
|
|
2354
|
+
const mql = window.matchMedia("(max-width: 767px)");
|
|
2355
|
+
const onChange = () => setIsMobile(window.innerWidth < 768);
|
|
2356
|
+
mql.addEventListener("change", onChange);
|
|
2357
|
+
onChange();
|
|
2358
|
+
return () => mql.removeEventListener("change", onChange);
|
|
2359
|
+
}, []);
|
|
2360
|
+
return isMobile;
|
|
2361
|
+
}
|
|
2362
|
+
var SidebarProvider = React44.forwardRef(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {
|
|
2363
|
+
const isMobile = useIsMobile();
|
|
2364
|
+
const [openMobile, setOpenMobile] = React44.useState(false);
|
|
2365
|
+
const [_open, _setOpen] = React44.useState(defaultOpen);
|
|
2366
|
+
const open = openProp ?? _open;
|
|
2367
|
+
const setOpen = React44.useCallback(
|
|
2368
|
+
(value) => {
|
|
2369
|
+
const openState = typeof value === "function" ? value(open) : value;
|
|
2370
|
+
if (setOpenProp) setOpenProp(openState);
|
|
2371
|
+
else _setOpen(openState);
|
|
2372
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${60 * 60 * 24 * 7}`;
|
|
2373
|
+
},
|
|
2374
|
+
[setOpenProp, open]
|
|
2375
|
+
);
|
|
2376
|
+
const toggleSidebar = React44.useCallback(() => {
|
|
2377
|
+
return isMobile ? setOpenMobile((o) => !o) : setOpen((o) => !o);
|
|
2378
|
+
}, [isMobile, setOpen]);
|
|
2379
|
+
React44.useEffect(() => {
|
|
2380
|
+
const handleKeyDown = (event) => {
|
|
2381
|
+
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
2382
|
+
event.preventDefault();
|
|
2383
|
+
toggleSidebar();
|
|
2384
|
+
}
|
|
2385
|
+
};
|
|
2386
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
2387
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
2388
|
+
}, [toggleSidebar]);
|
|
2389
|
+
const state = open ? "expanded" : "collapsed";
|
|
2390
|
+
const contextValue = React44.useMemo(
|
|
2391
|
+
() => ({ state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar }),
|
|
2392
|
+
[state, open, setOpen, isMobile, openMobile, toggleSidebar]
|
|
2393
|
+
);
|
|
2394
|
+
return /* @__PURE__ */ jsx50(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsx50(
|
|
2395
|
+
"div",
|
|
2396
|
+
{
|
|
2397
|
+
ref,
|
|
2398
|
+
style: { "--sidebar-width": SIDEBAR_WIDTH, "--sidebar-width-icon": SIDEBAR_WIDTH_ICON, ...style },
|
|
2399
|
+
className: cn("group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar font-sans", className),
|
|
2400
|
+
...props,
|
|
2401
|
+
children
|
|
2402
|
+
}
|
|
2403
|
+
) }) });
|
|
2404
|
+
});
|
|
2405
|
+
SidebarProvider.displayName = "SidebarProvider";
|
|
2406
|
+
var Sidebar = React44.forwardRef(({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }, ref) => {
|
|
2407
|
+
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
2408
|
+
if (collapsible === "none") {
|
|
2409
|
+
return /* @__PURE__ */ jsx50("div", { ref, className: cn("flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground", className), ...props, children });
|
|
2410
|
+
}
|
|
2411
|
+
if (isMobile) {
|
|
2412
|
+
return /* @__PURE__ */ jsx50(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs25(
|
|
2413
|
+
SheetContent,
|
|
2414
|
+
{
|
|
2415
|
+
"data-sidebar": "sidebar",
|
|
2416
|
+
"data-mobile": "true",
|
|
2417
|
+
className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",
|
|
2418
|
+
style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
|
|
2419
|
+
side,
|
|
2420
|
+
children: [
|
|
2421
|
+
/* @__PURE__ */ jsxs25(SheetHeader, { className: "sr-only", children: [
|
|
2422
|
+
/* @__PURE__ */ jsx50(SheetTitle, { children: "Sidebar" }),
|
|
2423
|
+
/* @__PURE__ */ jsx50(SheetDescription, { children: "Displays the mobile sidebar." })
|
|
2424
|
+
] }),
|
|
2425
|
+
/* @__PURE__ */ jsx50("div", { className: "flex h-full w-full flex-col", children })
|
|
2426
|
+
]
|
|
2427
|
+
}
|
|
2428
|
+
) });
|
|
2429
|
+
}
|
|
2430
|
+
return /* @__PURE__ */ jsxs25(
|
|
2431
|
+
"div",
|
|
2432
|
+
{
|
|
2433
|
+
ref,
|
|
2434
|
+
className: "group peer hidden text-sidebar-foreground md:block",
|
|
2435
|
+
"data-state": state,
|
|
2436
|
+
"data-collapsible": state === "collapsed" ? collapsible : "",
|
|
2437
|
+
"data-variant": variant,
|
|
2438
|
+
"data-side": side,
|
|
2439
|
+
children: [
|
|
2440
|
+
/* @__PURE__ */ jsx50(
|
|
2441
|
+
"div",
|
|
2442
|
+
{
|
|
2443
|
+
className: cn(
|
|
2444
|
+
"relative h-svh w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
|
|
2445
|
+
"group-data-[collapsible=offcanvas]:w-0",
|
|
2446
|
+
variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+theme(spacing.4))]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
|
|
2447
|
+
)
|
|
2448
|
+
}
|
|
2449
|
+
),
|
|
2450
|
+
/* @__PURE__ */ jsx50(
|
|
2451
|
+
"div",
|
|
2452
|
+
{
|
|
2453
|
+
className: cn(
|
|
2454
|
+
"fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
|
|
2455
|
+
side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
2456
|
+
variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+theme(spacing.4)+2px)]" : "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
2457
|
+
className
|
|
2458
|
+
),
|
|
2459
|
+
...props,
|
|
2460
|
+
children: /* @__PURE__ */ jsx50(
|
|
2461
|
+
"div",
|
|
2462
|
+
{
|
|
2463
|
+
"data-sidebar": "sidebar",
|
|
2464
|
+
className: "flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",
|
|
2465
|
+
children
|
|
2466
|
+
}
|
|
2467
|
+
)
|
|
2468
|
+
}
|
|
2469
|
+
)
|
|
2470
|
+
]
|
|
2471
|
+
}
|
|
2472
|
+
);
|
|
2473
|
+
});
|
|
2474
|
+
Sidebar.displayName = "Sidebar";
|
|
2475
|
+
var SidebarTrigger = React44.forwardRef(
|
|
2476
|
+
({ className, onClick, ...props }, ref) => {
|
|
2477
|
+
const { toggleSidebar } = useSidebar();
|
|
2478
|
+
return /* @__PURE__ */ jsxs25(
|
|
2479
|
+
Button,
|
|
2480
|
+
{
|
|
2481
|
+
ref,
|
|
2482
|
+
variant: "Ghost",
|
|
2483
|
+
size: "icon",
|
|
2484
|
+
className: cn("size-7", className),
|
|
2485
|
+
onClick: (e) => {
|
|
2486
|
+
onClick?.(e);
|
|
2487
|
+
toggleSidebar();
|
|
2488
|
+
},
|
|
2489
|
+
...props,
|
|
2490
|
+
children: [
|
|
2491
|
+
/* @__PURE__ */ jsx50(PanelLeft, {}),
|
|
2492
|
+
/* @__PURE__ */ jsx50("span", { className: "sr-only", children: "Toggle Sidebar" })
|
|
2493
|
+
]
|
|
2494
|
+
}
|
|
2495
|
+
);
|
|
2496
|
+
}
|
|
2497
|
+
);
|
|
2498
|
+
SidebarTrigger.displayName = "SidebarTrigger";
|
|
2499
|
+
var SidebarInset = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50(
|
|
2500
|
+
"main",
|
|
2501
|
+
{
|
|
2502
|
+
ref,
|
|
2503
|
+
className: cn(
|
|
2504
|
+
"relative flex min-h-svh flex-1 flex-col bg-background",
|
|
2505
|
+
"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
|
|
2506
|
+
className
|
|
2507
|
+
),
|
|
2508
|
+
...props
|
|
2509
|
+
}
|
|
2510
|
+
));
|
|
2511
|
+
SidebarInset.displayName = "SidebarInset";
|
|
2512
|
+
var SidebarHeader = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "header", className: cn("flex flex-col gap-2 p-2", className), ...props }));
|
|
2513
|
+
SidebarHeader.displayName = "SidebarHeader";
|
|
2514
|
+
var SidebarFooter = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "footer", className: cn("flex flex-col gap-2 p-2", className), ...props }));
|
|
2515
|
+
SidebarFooter.displayName = "SidebarFooter";
|
|
2516
|
+
var SidebarSeparator = React44.forwardRef(
|
|
2517
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx50(Separator3, { ref, "data-sidebar": "separator", className: cn("mx-2 w-auto bg-sidebar-border", className), ...props })
|
|
2518
|
+
);
|
|
2519
|
+
SidebarSeparator.displayName = "SidebarSeparator";
|
|
2520
|
+
var SidebarContent = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50(
|
|
2521
|
+
"div",
|
|
2522
|
+
{
|
|
2523
|
+
ref,
|
|
2524
|
+
"data-sidebar": "content",
|
|
2525
|
+
className: cn("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", className),
|
|
2526
|
+
...props
|
|
2527
|
+
}
|
|
2528
|
+
));
|
|
2529
|
+
SidebarContent.displayName = "SidebarContent";
|
|
2530
|
+
var SidebarGroup = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "group", className: cn("relative flex w-full min-w-0 flex-col p-2", className), ...props }));
|
|
2531
|
+
SidebarGroup.displayName = "SidebarGroup";
|
|
2532
|
+
var SidebarGroupLabel = React44.forwardRef(({ className, asChild = false, ...props }, ref) => {
|
|
2533
|
+
const Comp = asChild ? Slot5 : "div";
|
|
2534
|
+
return /* @__PURE__ */ jsx50(
|
|
2535
|
+
Comp,
|
|
2536
|
+
{
|
|
2537
|
+
ref,
|
|
2538
|
+
"data-sidebar": "group-label",
|
|
2539
|
+
className: cn(
|
|
2540
|
+
"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
2541
|
+
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
|
|
2542
|
+
className
|
|
2543
|
+
),
|
|
2544
|
+
...props
|
|
2545
|
+
}
|
|
2546
|
+
);
|
|
2547
|
+
});
|
|
2548
|
+
SidebarGroupLabel.displayName = "SidebarGroupLabel";
|
|
2549
|
+
var SidebarGroupContent = React44.forwardRef(
|
|
2550
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx50("div", { ref, "data-sidebar": "group-content", className: cn("w-full text-sm", className), ...props })
|
|
2551
|
+
);
|
|
2552
|
+
SidebarGroupContent.displayName = "SidebarGroupContent";
|
|
2553
|
+
var SidebarMenu = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("ul", { ref, "data-sidebar": "menu", className: cn("flex w-full min-w-0 flex-col gap-1", className), ...props }));
|
|
2554
|
+
SidebarMenu.displayName = "SidebarMenu";
|
|
2555
|
+
var SidebarMenuItem = React44.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50("li", { ref, "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props }));
|
|
2556
|
+
SidebarMenuItem.displayName = "SidebarMenuItem";
|
|
2557
|
+
var sidebarMenuButtonVariants = cva13(
|
|
2558
|
+
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
2559
|
+
{
|
|
2560
|
+
variants: {
|
|
2561
|
+
variant: {
|
|
2562
|
+
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
2563
|
+
outline: "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"
|
|
2564
|
+
},
|
|
2565
|
+
size: {
|
|
2566
|
+
default: "h-8 text-sm",
|
|
2567
|
+
sm: "h-7 text-xs",
|
|
2568
|
+
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0"
|
|
2569
|
+
}
|
|
2570
|
+
},
|
|
2571
|
+
defaultVariants: { variant: "default", size: "default" }
|
|
2572
|
+
}
|
|
2573
|
+
);
|
|
2574
|
+
var SidebarMenuButton = React44.forwardRef(({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => {
|
|
2575
|
+
const Comp = asChild ? Slot5 : "button";
|
|
2576
|
+
const { isMobile, state } = useSidebar();
|
|
2577
|
+
const button = /* @__PURE__ */ jsx50(
|
|
2578
|
+
Comp,
|
|
2579
|
+
{
|
|
2580
|
+
ref,
|
|
2581
|
+
"data-sidebar": "menu-button",
|
|
2582
|
+
"data-size": size,
|
|
2583
|
+
"data-active": isActive,
|
|
2584
|
+
className: cn(sidebarMenuButtonVariants({ variant, size }), className),
|
|
2585
|
+
...props
|
|
2586
|
+
}
|
|
2587
|
+
);
|
|
2588
|
+
if (!tooltip) return button;
|
|
2589
|
+
const tooltipProps = typeof tooltip === "string" ? { children: tooltip } : tooltip;
|
|
2590
|
+
return /* @__PURE__ */ jsxs25(Tooltip, { children: [
|
|
2591
|
+
/* @__PURE__ */ jsx50(TooltipTrigger, { asChild: true, children: button }),
|
|
2592
|
+
/* @__PURE__ */ jsx50(TooltipContent, { side: "right", align: "center", hidden: state !== "collapsed" || isMobile, ...tooltipProps })
|
|
2593
|
+
] });
|
|
2594
|
+
});
|
|
2595
|
+
SidebarMenuButton.displayName = "SidebarMenuButton";
|
|
2596
|
+
var SidebarMenuSkeleton = React44.forwardRef(({ className, showIcon = false, ...props }, ref) => {
|
|
2597
|
+
const width = React44.useMemo(() => `${Math.floor(Math.random() * 40) + 50}%`, []);
|
|
2598
|
+
return /* @__PURE__ */ jsxs25("div", { ref, "data-sidebar": "menu-skeleton", className: cn("flex h-8 items-center gap-2 rounded-md px-2", className), ...props, children: [
|
|
2599
|
+
showIcon && /* @__PURE__ */ jsx50(Skeleton, { className: "size-4 rounded-md" }),
|
|
2600
|
+
/* @__PURE__ */ jsx50(Skeleton, { className: "h-4 max-w-[--skeleton-width] flex-1", style: { "--skeleton-width": width } })
|
|
2601
|
+
] });
|
|
2602
|
+
});
|
|
2603
|
+
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
|
|
2604
|
+
var SidebarInput = React44.forwardRef(
|
|
2605
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx50(Input, { ref, "data-sidebar": "input", className: cn("h-8 w-full bg-background shadow-none", className), ...props })
|
|
2606
|
+
);
|
|
2607
|
+
SidebarInput.displayName = "SidebarInput";
|
|
2608
|
+
|
|
2609
|
+
// src/components/audio-player.tsx
|
|
2610
|
+
import * as React45 from "react";
|
|
2611
|
+
import { Pause, Play, SkipBack, SkipForward } from "lucide-react";
|
|
2612
|
+
import { jsx as jsx51, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2613
|
+
function fmt(t) {
|
|
2614
|
+
if (!Number.isFinite(t)) return "0:00";
|
|
2615
|
+
const m = Math.floor(t / 60);
|
|
2616
|
+
const s = Math.floor(t % 60);
|
|
2617
|
+
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
2618
|
+
}
|
|
2619
|
+
var AudioPlayer = React45.forwardRef(
|
|
2620
|
+
({ src, variant = "full", title, artist, coverSrc, skipBy = 10, onPrev, onNext, className, ...props }, ref) => {
|
|
2621
|
+
const audioRef = React45.useRef(null);
|
|
2622
|
+
const [playing, setPlaying] = React45.useState(false);
|
|
2623
|
+
const [current, setCurrent] = React45.useState(0);
|
|
2624
|
+
const [duration, setDuration] = React45.useState(0);
|
|
2625
|
+
const toggle = () => {
|
|
2626
|
+
const a = audioRef.current;
|
|
2627
|
+
if (!a) return;
|
|
2628
|
+
if (a.paused) void a.play();
|
|
2629
|
+
else a.pause();
|
|
2630
|
+
};
|
|
2631
|
+
const seek = (t) => {
|
|
2632
|
+
const a = audioRef.current;
|
|
2633
|
+
if (a) a.currentTime = Math.max(0, Math.min(duration || 0, t));
|
|
2634
|
+
};
|
|
2635
|
+
const skip = (delta) => seek(current + delta);
|
|
2636
|
+
const audio = /* @__PURE__ */ jsx51(
|
|
2637
|
+
"audio",
|
|
2638
|
+
{
|
|
2639
|
+
ref: audioRef,
|
|
2640
|
+
src,
|
|
2641
|
+
preload: "metadata",
|
|
2642
|
+
onPlay: () => setPlaying(true),
|
|
2643
|
+
onPause: () => setPlaying(false),
|
|
2644
|
+
onTimeUpdate: (e) => setCurrent(e.currentTarget.currentTime),
|
|
2645
|
+
onLoadedMetadata: (e) => setDuration(e.currentTarget.duration),
|
|
2646
|
+
onEnded: () => setPlaying(false)
|
|
2647
|
+
}
|
|
2648
|
+
);
|
|
2649
|
+
const PlayPause = ({ size = 44 }) => /* @__PURE__ */ jsx51(
|
|
2650
|
+
"button",
|
|
2651
|
+
{
|
|
2652
|
+
type: "button",
|
|
2653
|
+
onClick: toggle,
|
|
2654
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
2655
|
+
className: "grid shrink-0 place-items-center rounded-full bg-primary text-primary-foreground outline-none transition-transform hover:scale-105 focus-visible:shadow-focus",
|
|
2656
|
+
style: { width: size, height: size },
|
|
2657
|
+
children: playing ? /* @__PURE__ */ jsx51(Pause, { className: "size-1/3 fill-current" }) : /* @__PURE__ */ jsx51(Play, { className: "size-1/3 translate-x-px fill-current" })
|
|
2658
|
+
}
|
|
2659
|
+
);
|
|
2660
|
+
const iconBtn = "grid size-8 shrink-0 place-items-center rounded-full text-muted-foreground outline-none transition-colors hover:bg-muted hover:text-foreground focus-visible:text-foreground disabled:opacity-40 [&>svg]:size-4";
|
|
2661
|
+
if (variant === "mini") {
|
|
2662
|
+
const pct = duration ? current / duration * 100 : 0;
|
|
2663
|
+
return /* @__PURE__ */ jsxs26(
|
|
2664
|
+
"div",
|
|
2665
|
+
{
|
|
2666
|
+
ref,
|
|
2667
|
+
className: cn(
|
|
2668
|
+
"relative flex w-full max-w-[360px] items-center gap-3 overflow-hidden rounded-full border border-border bg-background p-2 pl-3 font-sans",
|
|
2669
|
+
className
|
|
2670
|
+
),
|
|
2671
|
+
...props,
|
|
2672
|
+
children: [
|
|
2673
|
+
audio,
|
|
2674
|
+
coverSrc ? /* @__PURE__ */ jsx51("img", { src: coverSrc, alt: "", className: "size-10 shrink-0 rounded-full object-cover" }) : /* @__PURE__ */ jsx51("div", { className: "size-10 shrink-0 rounded-full bg-muted" }),
|
|
2675
|
+
/* @__PURE__ */ jsxs26("div", { className: "min-w-0 flex-1", children: [
|
|
2676
|
+
/* @__PURE__ */ jsx51("p", { className: "truncate text-label-md font-semibold text-foreground", children: title ?? "Audio" }),
|
|
2677
|
+
artist && /* @__PURE__ */ jsx51("p", { className: "truncate text-body-sm text-muted-foreground", children: artist })
|
|
2678
|
+
] }),
|
|
2679
|
+
/* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(skipBy), "aria-label": `Forward ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, {}) }),
|
|
2680
|
+
/* @__PURE__ */ jsx51(PlayPause, { size: 36 }),
|
|
2681
|
+
/* @__PURE__ */ jsx51("div", { className: "absolute inset-x-0 bottom-0 h-1 bg-muted", children: /* @__PURE__ */ jsx51("div", { className: "h-full bg-primary transition-[width]", style: { width: `${pct}%` } }) })
|
|
2682
|
+
]
|
|
2683
|
+
}
|
|
2684
|
+
);
|
|
2685
|
+
}
|
|
2686
|
+
return /* @__PURE__ */ jsxs26(
|
|
2687
|
+
"div",
|
|
2688
|
+
{
|
|
2689
|
+
ref,
|
|
2690
|
+
className: cn("flex w-full max-w-[360px] flex-col gap-2 font-sans", className),
|
|
2691
|
+
...props,
|
|
2692
|
+
children: [
|
|
2693
|
+
audio,
|
|
2694
|
+
/* @__PURE__ */ jsx51(
|
|
2695
|
+
Slider,
|
|
2696
|
+
{
|
|
2697
|
+
value: [current],
|
|
2698
|
+
max: duration || 1,
|
|
2699
|
+
step: 0.5,
|
|
2700
|
+
onValueChange: (vals) => seek(vals[0] ?? 0),
|
|
2701
|
+
"aria-label": "Seek"
|
|
2702
|
+
}
|
|
2703
|
+
),
|
|
2704
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex justify-between text-body-sm text-muted-foreground", children: [
|
|
2705
|
+
/* @__PURE__ */ jsx51("span", { children: fmt(current) }),
|
|
2706
|
+
/* @__PURE__ */ jsx51("span", { children: fmt(duration) })
|
|
2707
|
+
] }),
|
|
2708
|
+
/* @__PURE__ */ jsxs26("div", { className: "mt-1 flex items-center justify-center gap-3", children: [
|
|
2709
|
+
/* @__PURE__ */ jsx51("button", { type: "button", onClick: onPrev, disabled: !onPrev, "aria-label": "Previous track", className: iconBtn, children: /* @__PURE__ */ jsx51(SkipBack, { className: "fill-current" }) }),
|
|
2710
|
+
/* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(-skipBy), "aria-label": `Back ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipBack, {}) }),
|
|
2711
|
+
/* @__PURE__ */ jsx51(PlayPause, {}),
|
|
2712
|
+
/* @__PURE__ */ jsx51("button", { type: "button", onClick: () => skip(skipBy), "aria-label": `Forward ${skipBy}s`, className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, {}) }),
|
|
2713
|
+
/* @__PURE__ */ jsx51("button", { type: "button", onClick: onNext, disabled: !onNext, "aria-label": "Next track", className: iconBtn, children: /* @__PURE__ */ jsx51(SkipForward, { className: "fill-current" }) })
|
|
2714
|
+
] })
|
|
2715
|
+
]
|
|
2716
|
+
}
|
|
2717
|
+
);
|
|
2718
|
+
}
|
|
2719
|
+
);
|
|
2720
|
+
AudioPlayer.displayName = "AudioPlayer";
|
|
2721
|
+
|
|
2722
|
+
// src/components/circular-progress.tsx
|
|
2723
|
+
import * as React46 from "react";
|
|
2724
|
+
import { jsx as jsx52, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2725
|
+
var CircularProgress = React46.forwardRef(
|
|
2726
|
+
({ value = 0, size = 48, strokeWidth = 4, showValue = false, label, className, ...props }, ref) => {
|
|
2727
|
+
const v = Math.max(0, Math.min(100, value));
|
|
2728
|
+
const r = (size - strokeWidth) / 2;
|
|
2729
|
+
const c = 2 * Math.PI * r;
|
|
2730
|
+
return /* @__PURE__ */ jsxs27(
|
|
2731
|
+
"div",
|
|
2732
|
+
{
|
|
2733
|
+
ref,
|
|
2734
|
+
role: "progressbar",
|
|
2735
|
+
"aria-valuemin": 0,
|
|
2736
|
+
"aria-valuemax": 100,
|
|
2737
|
+
"aria-valuenow": v,
|
|
2738
|
+
className: cn("relative inline-grid place-items-center font-sans", className),
|
|
2739
|
+
style: { width: size, height: size },
|
|
2740
|
+
...props,
|
|
2741
|
+
children: [
|
|
2742
|
+
/* @__PURE__ */ jsxs27("svg", { width: size, height: size, className: "-rotate-90", "aria-hidden": true, children: [
|
|
2743
|
+
/* @__PURE__ */ jsx52(
|
|
2744
|
+
"circle",
|
|
2745
|
+
{
|
|
2746
|
+
cx: size / 2,
|
|
2747
|
+
cy: size / 2,
|
|
2748
|
+
r,
|
|
2749
|
+
fill: "none",
|
|
2750
|
+
strokeWidth,
|
|
2751
|
+
className: "stroke-muted"
|
|
2752
|
+
}
|
|
2753
|
+
),
|
|
2754
|
+
/* @__PURE__ */ jsx52(
|
|
2755
|
+
"circle",
|
|
2756
|
+
{
|
|
2757
|
+
cx: size / 2,
|
|
2758
|
+
cy: size / 2,
|
|
2759
|
+
r,
|
|
2760
|
+
fill: "none",
|
|
2761
|
+
strokeWidth,
|
|
2762
|
+
strokeLinecap: "round",
|
|
2763
|
+
strokeDasharray: c,
|
|
2764
|
+
strokeDashoffset: c - v / 100 * c,
|
|
2765
|
+
className: "stroke-primary transition-[stroke-dashoffset] duration-300"
|
|
2766
|
+
}
|
|
2767
|
+
)
|
|
2768
|
+
] }),
|
|
2769
|
+
(showValue || label != null) && /* @__PURE__ */ jsx52("span", { className: "absolute text-label-md text-foreground", children: label ?? `${Math.round(v)}%` })
|
|
2770
|
+
]
|
|
2771
|
+
}
|
|
2772
|
+
);
|
|
2773
|
+
}
|
|
2774
|
+
);
|
|
2775
|
+
CircularProgress.displayName = "CircularProgress";
|
|
2776
|
+
|
|
2777
|
+
// src/components/image.tsx
|
|
2778
|
+
import * as React47 from "react";
|
|
2779
|
+
import { ImageOff } from "lucide-react";
|
|
2780
|
+
import { jsx as jsx53 } from "react/jsx-runtime";
|
|
2781
|
+
var RATIOS = {
|
|
2782
|
+
"1:1": 1,
|
|
2783
|
+
"3:2": 3 / 2,
|
|
2784
|
+
"4:3": 4 / 3,
|
|
2785
|
+
"3:4": 3 / 4,
|
|
2786
|
+
"3:1": 3,
|
|
2787
|
+
"16:9": 16 / 9
|
|
2788
|
+
};
|
|
2789
|
+
var Image2 = React47.forwardRef(
|
|
2790
|
+
({ ratio = "1:1", rounded = true, fallback, className, alt = "", onLoad, onError, ...props }, forwardedRef) => {
|
|
2791
|
+
const [status, setStatus] = React47.useState("loading");
|
|
2792
|
+
const innerRef = React47.useRef(null);
|
|
2793
|
+
const setRef = React47.useCallback(
|
|
2794
|
+
(node) => {
|
|
2795
|
+
innerRef.current = node;
|
|
2796
|
+
if (typeof forwardedRef === "function") forwardedRef(node);
|
|
2797
|
+
else if (forwardedRef) forwardedRef.current = node;
|
|
2798
|
+
},
|
|
2799
|
+
[forwardedRef]
|
|
2800
|
+
);
|
|
2801
|
+
const r = typeof ratio === "number" ? ratio : RATIOS[ratio] ?? 1;
|
|
2802
|
+
React47.useEffect(() => {
|
|
2803
|
+
const img = innerRef.current;
|
|
2804
|
+
if (!img) return;
|
|
2805
|
+
if (img.complete) setStatus(img.naturalWidth > 0 ? "loaded" : "error");
|
|
2806
|
+
}, [props.src]);
|
|
2807
|
+
return /* @__PURE__ */ jsx53(
|
|
2808
|
+
"div",
|
|
2809
|
+
{
|
|
2810
|
+
className: cn(
|
|
2811
|
+
"relative w-full overflow-hidden bg-muted",
|
|
2812
|
+
rounded && "rounded-md",
|
|
2813
|
+
className
|
|
2814
|
+
),
|
|
2815
|
+
style: { aspectRatio: r },
|
|
2816
|
+
children: status === "error" ? /* @__PURE__ */ jsx53("div", { className: "absolute inset-0 grid place-items-center text-muted-foreground", children: fallback ?? /* @__PURE__ */ jsx53(ImageOff, { className: "size-6" }) }) : /* @__PURE__ */ jsx53(
|
|
2817
|
+
"img",
|
|
2818
|
+
{
|
|
2819
|
+
ref: setRef,
|
|
2820
|
+
alt,
|
|
2821
|
+
className: cn(
|
|
2822
|
+
"size-full object-cover transition-opacity duration-300",
|
|
2823
|
+
status === "loaded" ? "opacity-100" : "opacity-0"
|
|
2824
|
+
),
|
|
2825
|
+
onLoad: (e) => {
|
|
2826
|
+
setStatus("loaded");
|
|
2827
|
+
onLoad?.(e);
|
|
2828
|
+
},
|
|
2829
|
+
onError: (e) => {
|
|
2830
|
+
setStatus("error");
|
|
2831
|
+
onError?.(e);
|
|
2832
|
+
},
|
|
2833
|
+
...props
|
|
2834
|
+
}
|
|
2835
|
+
)
|
|
2836
|
+
}
|
|
2837
|
+
);
|
|
2838
|
+
}
|
|
2839
|
+
);
|
|
2840
|
+
Image2.displayName = "Image";
|
|
2841
|
+
|
|
2842
|
+
// src/components/inform.tsx
|
|
2843
|
+
import * as React48 from "react";
|
|
2844
|
+
import { cva as cva14 } from "class-variance-authority";
|
|
2845
|
+
import { CircleAlert as CircleAlert2, CircleCheck as CircleCheck2, Info as Info2, TriangleAlert as TriangleAlert2, X as X5 } from "lucide-react";
|
|
2846
|
+
import { jsx as jsx54, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2847
|
+
var informVariants = cva14(
|
|
2848
|
+
"flex items-start gap-2.5 rounded-md p-3 text-body-sm font-sans [&>svg]:mt-0.5 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
2849
|
+
{
|
|
2850
|
+
variants: {
|
|
2851
|
+
variant: {
|
|
2852
|
+
information: "bg-info/10 text-info",
|
|
2853
|
+
warning: "bg-warning/15 text-warning",
|
|
2854
|
+
success: "bg-success/15 text-success",
|
|
2855
|
+
error: "bg-destructive/10 text-destructive",
|
|
2856
|
+
action: "bg-foreground text-background"
|
|
2857
|
+
}
|
|
2858
|
+
},
|
|
2859
|
+
defaultVariants: { variant: "information" }
|
|
2860
|
+
}
|
|
2861
|
+
);
|
|
2862
|
+
var ICON = {
|
|
2863
|
+
information: Info2,
|
|
2864
|
+
warning: TriangleAlert2,
|
|
2865
|
+
success: CircleCheck2,
|
|
2866
|
+
error: CircleAlert2,
|
|
2867
|
+
action: Info2
|
|
2868
|
+
};
|
|
2869
|
+
var Inform = React48.forwardRef(
|
|
2870
|
+
({ className, variant = "information", hideIcon, onDismiss, action, children, ...props }, ref) => {
|
|
2871
|
+
const Icon2 = ICON[variant ?? "information"];
|
|
2872
|
+
return /* @__PURE__ */ jsxs28("div", { ref, role: "status", className: cn(informVariants({ variant }), className), ...props, children: [
|
|
2873
|
+
!hideIcon && /* @__PURE__ */ jsx54(Icon2, {}),
|
|
2874
|
+
/* @__PURE__ */ jsxs28("div", { className: "min-w-0 flex-1", children: [
|
|
2875
|
+
/* @__PURE__ */ jsx54("p", { className: "[&:not(:only-child)]:mb-2", children }),
|
|
2876
|
+
action && /* @__PURE__ */ jsxs28(
|
|
2877
|
+
"button",
|
|
2878
|
+
{
|
|
2879
|
+
type: "button",
|
|
2880
|
+
onClick: action.onClick,
|
|
2881
|
+
className: "inline-flex items-center gap-1.5 text-label-md font-medium underline-offset-2 outline-none hover:underline focus-visible:underline [&>svg]:size-4",
|
|
2882
|
+
children: [
|
|
2883
|
+
action.icon,
|
|
2884
|
+
action.label
|
|
2885
|
+
]
|
|
2886
|
+
}
|
|
2887
|
+
)
|
|
2888
|
+
] }),
|
|
2889
|
+
onDismiss && /* @__PURE__ */ jsx54(
|
|
2890
|
+
"button",
|
|
2891
|
+
{
|
|
2892
|
+
type: "button",
|
|
2893
|
+
onClick: onDismiss,
|
|
2894
|
+
"aria-label": "Dismiss",
|
|
2895
|
+
className: "-m-0.5 shrink-0 rounded-[2px] p-0.5 opacity-70 outline-none transition-opacity hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-1 focus-visible:ring-current",
|
|
2896
|
+
children: /* @__PURE__ */ jsx54(X5, { className: "size-3.5" })
|
|
2897
|
+
}
|
|
2898
|
+
)
|
|
2899
|
+
] });
|
|
2900
|
+
}
|
|
2901
|
+
);
|
|
2902
|
+
Inform.displayName = "Inform";
|
|
2903
|
+
|
|
2904
|
+
// src/components/rating.tsx
|
|
2905
|
+
import * as React49 from "react";
|
|
2906
|
+
import { Star } from "lucide-react";
|
|
2907
|
+
import { cva as cva15 } from "class-variance-authority";
|
|
2908
|
+
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
2909
|
+
var starVariants = cva15("transition-colors", {
|
|
2910
|
+
variants: {
|
|
2911
|
+
size: {
|
|
2912
|
+
sm: "size-4",
|
|
2913
|
+
md: "size-5",
|
|
2914
|
+
lg: "size-6"
|
|
2915
|
+
}
|
|
2916
|
+
},
|
|
2917
|
+
defaultVariants: { size: "md" }
|
|
2918
|
+
});
|
|
2919
|
+
var Rating = React49.forwardRef(
|
|
2920
|
+
({ className, value, defaultValue = 0, max = 5, size, readOnly = false, onChange, ...props }, ref) => {
|
|
2921
|
+
const [internal, setInternal] = React49.useState(defaultValue);
|
|
2922
|
+
const [hovered, setHovered] = React49.useState(null);
|
|
2923
|
+
const current = value ?? internal;
|
|
2924
|
+
const display = hovered ?? current;
|
|
2925
|
+
const set = (n) => {
|
|
2926
|
+
if (readOnly) return;
|
|
2927
|
+
setInternal(n);
|
|
2928
|
+
onChange?.(n);
|
|
2929
|
+
};
|
|
2930
|
+
return /* @__PURE__ */ jsx55(
|
|
2931
|
+
"div",
|
|
2932
|
+
{
|
|
2933
|
+
ref,
|
|
2934
|
+
role: readOnly ? "img" : "radiogroup",
|
|
2935
|
+
"aria-label": readOnly ? `Rated ${current} out of ${max}` : "Rating",
|
|
2936
|
+
className: cn("inline-flex items-center gap-0.5", className),
|
|
2937
|
+
onMouseLeave: () => setHovered(null),
|
|
2938
|
+
...props,
|
|
2939
|
+
children: Array.from({ length: max }, (_, i) => {
|
|
2940
|
+
const n = i + 1;
|
|
2941
|
+
const filled = n <= display;
|
|
2942
|
+
return /* @__PURE__ */ jsx55(
|
|
2943
|
+
"button",
|
|
2944
|
+
{
|
|
2945
|
+
type: "button",
|
|
2946
|
+
disabled: readOnly,
|
|
2947
|
+
"aria-label": `${n} star${n > 1 ? "s" : ""}`,
|
|
2948
|
+
"aria-pressed": n <= current,
|
|
2949
|
+
onMouseEnter: () => !readOnly && setHovered(n),
|
|
2950
|
+
onClick: () => set(n),
|
|
2951
|
+
className: cn(
|
|
2952
|
+
"rounded-[2px] outline-none disabled:cursor-default",
|
|
2953
|
+
!readOnly && "cursor-pointer focus-visible:ring-2 focus-visible:ring-ring"
|
|
2954
|
+
),
|
|
2955
|
+
children: /* @__PURE__ */ jsx55(
|
|
2956
|
+
Star,
|
|
2957
|
+
{
|
|
2958
|
+
className: cn(
|
|
2959
|
+
starVariants({ size }),
|
|
2960
|
+
filled ? "fill-warning text-warning" : "fill-transparent text-muted-foreground"
|
|
2961
|
+
)
|
|
2962
|
+
}
|
|
2963
|
+
)
|
|
2964
|
+
},
|
|
2965
|
+
n
|
|
2966
|
+
);
|
|
2967
|
+
})
|
|
2968
|
+
}
|
|
2969
|
+
);
|
|
2970
|
+
}
|
|
2971
|
+
);
|
|
2972
|
+
Rating.displayName = "Rating";
|
|
2973
|
+
|
|
2974
|
+
// src/components/spinner.tsx
|
|
2975
|
+
import * as React50 from "react";
|
|
2976
|
+
import { cva as cva16 } from "class-variance-authority";
|
|
2977
|
+
import { jsx as jsx56 } from "react/jsx-runtime";
|
|
2978
|
+
var spinnerVariants = cva16("inline-block animate-spin rounded-full border-2 border-current border-t-transparent", {
|
|
2979
|
+
variants: {
|
|
2980
|
+
size: {
|
|
2981
|
+
sm: "size-4",
|
|
2982
|
+
md: "size-6",
|
|
2983
|
+
lg: "size-8"
|
|
2984
|
+
},
|
|
2985
|
+
variant: {
|
|
2986
|
+
default: "text-primary",
|
|
2987
|
+
muted: "text-muted-foreground",
|
|
2988
|
+
onColor: "text-primary-foreground"
|
|
2989
|
+
}
|
|
2990
|
+
},
|
|
2991
|
+
defaultVariants: { size: "md", variant: "default" }
|
|
2992
|
+
});
|
|
2993
|
+
var Spinner = React50.forwardRef(
|
|
2994
|
+
({ className, size, variant, label = "Loading\u2026", ...props }, ref) => /* @__PURE__ */ jsx56("span", { ref, role: "status", "aria-label": label, className: cn(spinnerVariants({ size, variant }), className), ...props, children: /* @__PURE__ */ jsx56("span", { className: "sr-only", children: label }) })
|
|
2995
|
+
);
|
|
2996
|
+
Spinner.displayName = "Spinner";
|
|
2997
|
+
|
|
2998
|
+
// src/components/list.tsx
|
|
2999
|
+
import * as React51 from "react";
|
|
3000
|
+
import { jsx as jsx57, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
3001
|
+
var List3 = React51.forwardRef(
|
|
3002
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx57("div", { ref, role: "list", className: cn("flex flex-col divide-y divide-border", className), ...props })
|
|
3003
|
+
);
|
|
3004
|
+
List3.displayName = "List";
|
|
3005
|
+
var ListItem = React51.forwardRef(
|
|
3006
|
+
({ className, leading, title, description, trailing, disabled, onSelect, ...props }, ref) => {
|
|
3007
|
+
const interactive = !!onSelect && !disabled;
|
|
3008
|
+
return /* @__PURE__ */ jsxs29(
|
|
3009
|
+
"div",
|
|
3010
|
+
{
|
|
3011
|
+
ref,
|
|
3012
|
+
role: interactive ? "button" : "listitem",
|
|
3013
|
+
tabIndex: interactive ? 0 : void 0,
|
|
3014
|
+
"aria-disabled": disabled,
|
|
3015
|
+
onClick: disabled ? void 0 : onSelect,
|
|
3016
|
+
onKeyDown: interactive ? (e) => {
|
|
3017
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
3018
|
+
e.preventDefault();
|
|
3019
|
+
onSelect?.();
|
|
3020
|
+
}
|
|
3021
|
+
} : void 0,
|
|
3022
|
+
className: cn(
|
|
3023
|
+
"flex items-center gap-3 px-3 py-3 font-sans outline-none",
|
|
3024
|
+
interactive && "cursor-pointer hover:bg-accent focus-visible:bg-accent",
|
|
3025
|
+
disabled && "pointer-events-none opacity-50",
|
|
3026
|
+
className
|
|
3027
|
+
),
|
|
3028
|
+
...props,
|
|
3029
|
+
children: [
|
|
3030
|
+
leading && /* @__PURE__ */ jsx57("div", { className: "flex shrink-0 items-center justify-center", children: leading }),
|
|
3031
|
+
/* @__PURE__ */ jsxs29("div", { className: "min-w-0 flex-1", children: [
|
|
3032
|
+
/* @__PURE__ */ jsx57("div", { className: "truncate text-body-md text-foreground", children: title }),
|
|
3033
|
+
description && /* @__PURE__ */ jsx57("div", { className: "truncate text-body-sm text-muted-foreground", children: description })
|
|
3034
|
+
] }),
|
|
3035
|
+
trailing && /* @__PURE__ */ jsx57("div", { className: "flex shrink-0 items-center gap-2", children: trailing })
|
|
3036
|
+
]
|
|
3037
|
+
}
|
|
3038
|
+
);
|
|
3039
|
+
}
|
|
3040
|
+
);
|
|
3041
|
+
ListItem.displayName = "ListItem";
|
|
3042
|
+
|
|
3043
|
+
// src/components/stepper.tsx
|
|
3044
|
+
import * as React52 from "react";
|
|
3045
|
+
import { Check as Check6 } from "lucide-react";
|
|
3046
|
+
import { jsx as jsx58, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
3047
|
+
var Stepper = React52.forwardRef(
|
|
3048
|
+
({ className, steps, current, orientation = "horizontal", ...props }, ref) => {
|
|
3049
|
+
const vertical = orientation === "vertical";
|
|
3050
|
+
return /* @__PURE__ */ jsx58("ol", { ref, className: cn("flex font-sans", vertical ? "flex-col" : "w-full items-start", className), ...props, children: steps.map((step, i) => {
|
|
3051
|
+
const status = i < current ? "complete" : i === current ? "current" : "upcoming";
|
|
3052
|
+
const isLast = i === steps.length - 1;
|
|
3053
|
+
return /* @__PURE__ */ jsxs30(
|
|
3054
|
+
"li",
|
|
3055
|
+
{
|
|
3056
|
+
className: cn("flex", vertical ? "flex-row gap-3" : "flex-1 flex-col items-center gap-2 text-center"),
|
|
3057
|
+
"aria-current": status === "current" ? "step" : void 0,
|
|
3058
|
+
children: [
|
|
3059
|
+
/* @__PURE__ */ jsxs30("div", { className: cn("flex items-center", vertical ? "flex-col" : "w-full"), children: [
|
|
3060
|
+
/* @__PURE__ */ jsx58(
|
|
3061
|
+
"span",
|
|
3062
|
+
{
|
|
3063
|
+
className: cn(
|
|
3064
|
+
"flex size-7 shrink-0 items-center justify-center rounded-full text-label-md font-medium",
|
|
3065
|
+
status === "complete" && "bg-primary text-primary-foreground",
|
|
3066
|
+
status === "current" && "border-2 border-primary text-primary",
|
|
3067
|
+
status === "upcoming" && "border border-input text-muted-foreground"
|
|
3068
|
+
),
|
|
3069
|
+
children: status === "complete" ? /* @__PURE__ */ jsx58(Check6, { className: "size-4" }) : i + 1
|
|
3070
|
+
}
|
|
3071
|
+
),
|
|
3072
|
+
!isLast && /* @__PURE__ */ jsx58(
|
|
3073
|
+
"span",
|
|
3074
|
+
{
|
|
3075
|
+
"aria-hidden": true,
|
|
3076
|
+
className: cn(
|
|
3077
|
+
"bg-border",
|
|
3078
|
+
vertical ? "my-1 min-h-6 w-px flex-1 self-stretch" : "mt-3.5 h-px flex-1",
|
|
3079
|
+
status === "complete" && "bg-primary"
|
|
3080
|
+
)
|
|
3081
|
+
}
|
|
3082
|
+
)
|
|
3083
|
+
] }),
|
|
3084
|
+
/* @__PURE__ */ jsxs30("div", { className: cn(vertical && "pb-6"), children: [
|
|
3085
|
+
/* @__PURE__ */ jsx58("p", { className: cn("text-label-md font-medium", status === "upcoming" ? "text-muted-foreground" : "text-foreground"), children: step.label }),
|
|
3086
|
+
step.description && /* @__PURE__ */ jsx58("p", { className: "text-body-sm text-muted-foreground", children: step.description })
|
|
3087
|
+
] })
|
|
3088
|
+
]
|
|
3089
|
+
},
|
|
3090
|
+
i
|
|
3091
|
+
);
|
|
3092
|
+
}) });
|
|
3093
|
+
}
|
|
3094
|
+
);
|
|
3095
|
+
Stepper.displayName = "Stepper";
|
|
3096
|
+
|
|
3097
|
+
// src/components/fab.tsx
|
|
3098
|
+
import * as React53 from "react";
|
|
3099
|
+
import { Slot as Slot6 } from "@radix-ui/react-slot";
|
|
3100
|
+
import { cva as cva17 } from "class-variance-authority";
|
|
3101
|
+
import { jsx as jsx59 } from "react/jsx-runtime";
|
|
3102
|
+
var fabVariants = cva17(
|
|
3103
|
+
[
|
|
3104
|
+
"inline-flex shrink-0 items-center justify-center gap-2 rounded-full font-sans font-medium",
|
|
3105
|
+
"shadow-lg outline-none transition-colors",
|
|
3106
|
+
"focus-visible:shadow-focus disabled:pointer-events-none disabled:opacity-50",
|
|
3107
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0"
|
|
3108
|
+
],
|
|
3109
|
+
{
|
|
3110
|
+
variants: {
|
|
3111
|
+
variant: {
|
|
3112
|
+
Primary: "bg-primary text-primary-foreground hover:bg-[--color-blue-600] active:bg-[--color-blue-700]",
|
|
3113
|
+
Secondary: "bg-secondary text-secondary-foreground hover:bg-[--color-green-500] hover:text-[--color-green-50] active:bg-[--color-green-600] active:text-[--color-green-50]"
|
|
3114
|
+
},
|
|
3115
|
+
size: {
|
|
3116
|
+
default: "size-14 [&_svg]:size-6",
|
|
3117
|
+
sm: "size-11 [&_svg]:size-5"
|
|
3118
|
+
},
|
|
3119
|
+
extended: {
|
|
3120
|
+
true: "w-auto px-5",
|
|
3121
|
+
false: ""
|
|
3122
|
+
}
|
|
3123
|
+
},
|
|
3124
|
+
defaultVariants: { variant: "Primary", size: "default", extended: false }
|
|
3125
|
+
}
|
|
3126
|
+
);
|
|
3127
|
+
var Fab = React53.forwardRef(
|
|
3128
|
+
({ className, variant, size, extended, asChild = false, ...props }, ref) => {
|
|
3129
|
+
const Comp = asChild ? Slot6 : "button";
|
|
3130
|
+
return /* @__PURE__ */ jsx59(
|
|
3131
|
+
Comp,
|
|
3132
|
+
{
|
|
3133
|
+
ref,
|
|
3134
|
+
"data-slot": "fab",
|
|
3135
|
+
className: cn(fabVariants({ variant, size, extended }), className),
|
|
3136
|
+
...props
|
|
3137
|
+
}
|
|
3138
|
+
);
|
|
3139
|
+
}
|
|
3140
|
+
);
|
|
3141
|
+
Fab.displayName = "Fab";
|
|
3142
|
+
|
|
3143
|
+
// src/components/tab-bar.tsx
|
|
3144
|
+
import * as React54 from "react";
|
|
3145
|
+
import { jsx as jsx60, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
3146
|
+
var TabBar = React54.forwardRef(
|
|
3147
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsx60(
|
|
3148
|
+
"nav",
|
|
3149
|
+
{
|
|
3150
|
+
ref,
|
|
3151
|
+
className: cn("flex w-full items-stretch border-t border-border bg-background font-sans", className),
|
|
3152
|
+
...props,
|
|
3153
|
+
children
|
|
3154
|
+
}
|
|
3155
|
+
)
|
|
3156
|
+
);
|
|
3157
|
+
TabBar.displayName = "TabBar";
|
|
3158
|
+
var TabBarItem = React54.forwardRef(
|
|
3159
|
+
({ className, icon, label, active, badge, ...props }, ref) => /* @__PURE__ */ jsxs31(
|
|
3160
|
+
"button",
|
|
3161
|
+
{
|
|
3162
|
+
ref,
|
|
3163
|
+
type: "button",
|
|
3164
|
+
"aria-current": active ? "page" : void 0,
|
|
3165
|
+
className: cn(
|
|
3166
|
+
"relative flex flex-1 flex-col items-center justify-center gap-1 py-2 text-label-sm outline-none transition-colors",
|
|
3167
|
+
active ? "text-primary" : "text-muted-foreground hover:text-foreground",
|
|
3168
|
+
"focus-visible:bg-accent",
|
|
3169
|
+
className
|
|
3170
|
+
),
|
|
3171
|
+
...props,
|
|
3172
|
+
children: [
|
|
3173
|
+
/* @__PURE__ */ jsxs31("span", { className: "relative [&_svg]:size-6", children: [
|
|
3174
|
+
icon,
|
|
3175
|
+
badge && /* @__PURE__ */ jsx60("span", { className: "absolute -right-1.5 -top-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-medium text-destructive-foreground", children: badge })
|
|
3176
|
+
] }),
|
|
3177
|
+
/* @__PURE__ */ jsx60("span", { className: "font-medium", children: label })
|
|
3178
|
+
]
|
|
3179
|
+
}
|
|
3180
|
+
)
|
|
3181
|
+
);
|
|
3182
|
+
TabBarItem.displayName = "TabBarItem";
|
|
3183
|
+
|
|
3184
|
+
// src/components/navigation-bar.tsx
|
|
3185
|
+
import * as React55 from "react";
|
|
3186
|
+
import { ChevronLeft as ChevronLeft3 } from "lucide-react";
|
|
3187
|
+
import { jsx as jsx61, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
3188
|
+
var NavigationBar = React55.forwardRef(
|
|
3189
|
+
({ className, title, infoText, onBack, leading, actions, ...props }, ref) => /* @__PURE__ */ jsxs32(
|
|
3190
|
+
"header",
|
|
3191
|
+
{
|
|
3192
|
+
ref,
|
|
3193
|
+
className: cn("flex h-14 w-full items-center gap-2 border-b border-border bg-background px-2 font-sans", className),
|
|
3194
|
+
...props,
|
|
3195
|
+
children: [
|
|
3196
|
+
/* @__PURE__ */ jsx61("div", { className: "flex min-w-9 shrink-0 items-center", children: leading ?? (onBack && /* @__PURE__ */ jsx61(
|
|
3197
|
+
"button",
|
|
3198
|
+
{
|
|
3199
|
+
type: "button",
|
|
3200
|
+
onClick: onBack,
|
|
3201
|
+
"aria-label": "Back",
|
|
3202
|
+
className: "flex size-9 items-center justify-center rounded-full text-foreground outline-none transition-colors hover:bg-accent focus-visible:bg-accent",
|
|
3203
|
+
children: /* @__PURE__ */ jsx61(ChevronLeft3, { className: "size-5" })
|
|
3204
|
+
}
|
|
3205
|
+
)) }),
|
|
3206
|
+
/* @__PURE__ */ jsxs32("div", { className: "min-w-0 flex-1", children: [
|
|
3207
|
+
/* @__PURE__ */ jsx61("p", { className: "truncate text-body-lg font-medium text-foreground", children: title }),
|
|
3208
|
+
infoText && /* @__PURE__ */ jsx61("p", { className: "truncate text-body-sm text-muted-foreground", children: infoText })
|
|
3209
|
+
] }),
|
|
3210
|
+
actions && /* @__PURE__ */ jsx61("div", { className: "flex shrink-0 items-center gap-1", children: actions })
|
|
3211
|
+
]
|
|
3212
|
+
}
|
|
3213
|
+
)
|
|
3214
|
+
);
|
|
3215
|
+
NavigationBar.displayName = "NavigationBar";
|
|
3216
|
+
|
|
3217
|
+
// src/components/file-upload.tsx
|
|
3218
|
+
import * as React56 from "react";
|
|
3219
|
+
import { File, Loader2, TriangleAlert as TriangleAlert3, Upload, X as X6 } from "lucide-react";
|
|
3220
|
+
import { jsx as jsx62, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
3221
|
+
function formatBytes(bytes) {
|
|
3222
|
+
if (!bytes) return "";
|
|
3223
|
+
const units = ["B", "KB", "MB", "GB"];
|
|
3224
|
+
let v = bytes;
|
|
3225
|
+
let i = 0;
|
|
3226
|
+
while (v >= 1024 && i < units.length - 1) {
|
|
3227
|
+
v /= 1024;
|
|
3228
|
+
i++;
|
|
3229
|
+
}
|
|
3230
|
+
return `${v.toFixed(v < 10 && i > 0 ? 1 : 0)} ${units[i]}`;
|
|
3231
|
+
}
|
|
3232
|
+
var FileUpload = React56.forwardRef(
|
|
3233
|
+
({ className, multiple, accept, disabled, helperText, buttonLabel = "Browse files", files = [], onFilesSelected, onRemove, onRetry, ...props }, ref) => {
|
|
3234
|
+
const inputRef = React56.useRef(null);
|
|
3235
|
+
const [dragging, setDragging] = React56.useState(false);
|
|
3236
|
+
const pick = (list) => {
|
|
3237
|
+
if (!list || !list.length) return;
|
|
3238
|
+
onFilesSelected?.(Array.from(list));
|
|
3239
|
+
};
|
|
3240
|
+
return /* @__PURE__ */ jsxs33("div", { ref, className: cn("flex w-full flex-col gap-3 font-sans", className), ...props, children: [
|
|
3241
|
+
/* @__PURE__ */ jsxs33(
|
|
3242
|
+
"div",
|
|
3243
|
+
{
|
|
3244
|
+
role: "button",
|
|
3245
|
+
tabIndex: disabled ? -1 : 0,
|
|
3246
|
+
"aria-disabled": disabled,
|
|
3247
|
+
onClick: () => !disabled && inputRef.current?.click(),
|
|
3248
|
+
onKeyDown: (e) => {
|
|
3249
|
+
if (!disabled && (e.key === "Enter" || e.key === " ")) {
|
|
3250
|
+
e.preventDefault();
|
|
3251
|
+
inputRef.current?.click();
|
|
3252
|
+
}
|
|
3253
|
+
},
|
|
3254
|
+
onDragOver: (e) => {
|
|
3255
|
+
e.preventDefault();
|
|
3256
|
+
if (!disabled) setDragging(true);
|
|
3257
|
+
},
|
|
3258
|
+
onDragLeave: () => setDragging(false),
|
|
3259
|
+
onDrop: (e) => {
|
|
3260
|
+
e.preventDefault();
|
|
3261
|
+
setDragging(false);
|
|
3262
|
+
if (!disabled) pick(e.dataTransfer.files);
|
|
3263
|
+
},
|
|
3264
|
+
className: cn(
|
|
3265
|
+
"flex flex-col items-center gap-2 rounded-md border border-dashed border-input p-6 text-center outline-none transition-colors",
|
|
3266
|
+
!disabled && "cursor-pointer hover:bg-accent/50 focus-visible:shadow-focus",
|
|
3267
|
+
dragging && "border-primary bg-accent",
|
|
3268
|
+
disabled && "pointer-events-none opacity-50"
|
|
3269
|
+
),
|
|
3270
|
+
children: [
|
|
3271
|
+
/* @__PURE__ */ jsx62(Upload, { className: "size-6 text-muted-foreground", "aria-hidden": true }),
|
|
3272
|
+
/* @__PURE__ */ jsxs33("p", { className: "text-body-sm text-muted-foreground", children: [
|
|
3273
|
+
"Drag & drop ",
|
|
3274
|
+
multiple ? "files" : "a file",
|
|
3275
|
+
" here, or"
|
|
3276
|
+
] }),
|
|
3277
|
+
/* @__PURE__ */ jsx62(
|
|
3278
|
+
Button,
|
|
3279
|
+
{
|
|
3280
|
+
type: "button",
|
|
3281
|
+
variant: "Outline",
|
|
3282
|
+
size: "sm",
|
|
3283
|
+
disabled,
|
|
3284
|
+
onClick: (e) => {
|
|
3285
|
+
e.stopPropagation();
|
|
3286
|
+
inputRef.current?.click();
|
|
3287
|
+
},
|
|
3288
|
+
children: buttonLabel
|
|
3289
|
+
}
|
|
3290
|
+
),
|
|
3291
|
+
helperText && /* @__PURE__ */ jsx62("p", { className: "text-body-sm text-muted-foreground", children: helperText }),
|
|
3292
|
+
/* @__PURE__ */ jsx62(
|
|
3293
|
+
"input",
|
|
3294
|
+
{
|
|
3295
|
+
ref: inputRef,
|
|
3296
|
+
type: "file",
|
|
3297
|
+
multiple,
|
|
3298
|
+
accept,
|
|
3299
|
+
disabled,
|
|
3300
|
+
className: "sr-only",
|
|
3301
|
+
onChange: (e) => {
|
|
3302
|
+
pick(e.target.files);
|
|
3303
|
+
e.target.value = "";
|
|
3304
|
+
}
|
|
3305
|
+
}
|
|
3306
|
+
)
|
|
3307
|
+
]
|
|
3308
|
+
}
|
|
3309
|
+
),
|
|
3310
|
+
files.length > 0 && /* @__PURE__ */ jsx62("ul", { className: "flex flex-col gap-2", children: files.map((f) => /* @__PURE__ */ jsx62(FileUploadItem, { file: f, onRemove, onRetry }, f.id)) })
|
|
3311
|
+
] });
|
|
3312
|
+
}
|
|
3313
|
+
);
|
|
3314
|
+
FileUpload.displayName = "FileUpload";
|
|
3315
|
+
function FileUploadItem({ file, onRemove, onRetry }) {
|
|
3316
|
+
const isError = file.status === "error";
|
|
3317
|
+
const isLoading = file.status === "loading";
|
|
3318
|
+
return /* @__PURE__ */ jsxs33("li", { className: cn("flex items-center gap-2.5 rounded-md border p-2.5 text-body-sm", isError ? "border-destructive bg-destructive/5" : "border-input"), children: [
|
|
3319
|
+
isLoading ? /* @__PURE__ */ jsx62(Loader2, { className: "size-4 shrink-0 animate-spin text-muted-foreground", "aria-hidden": true }) : isError ? /* @__PURE__ */ jsx62(TriangleAlert3, { className: "size-4 shrink-0 text-destructive", "aria-hidden": true }) : /* @__PURE__ */ jsx62(File, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": true }),
|
|
3320
|
+
/* @__PURE__ */ jsxs33("div", { className: "min-w-0 flex-1", children: [
|
|
3321
|
+
/* @__PURE__ */ jsx62("p", { className: "truncate text-foreground", children: file.name }),
|
|
3322
|
+
isError && file.error ? /* @__PURE__ */ jsx62("p", { className: "text-destructive", children: file.error }) : /* @__PURE__ */ jsx62("p", { className: "text-muted-foreground", children: formatBytes(file.size) }),
|
|
3323
|
+
isLoading && typeof file.progress === "number" && /* @__PURE__ */ jsx62("div", { className: "mt-1 h-1 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx62("div", { className: "h-full bg-primary transition-[width]", style: { width: `${Math.max(0, Math.min(100, file.progress))}%` } }) })
|
|
3324
|
+
] }),
|
|
3325
|
+
isError && onRetry && /* @__PURE__ */ jsx62(
|
|
3326
|
+
"button",
|
|
3327
|
+
{
|
|
3328
|
+
type: "button",
|
|
3329
|
+
onClick: () => onRetry(file.id),
|
|
3330
|
+
className: "shrink-0 text-label-md font-medium text-primary underline-offset-2 outline-none hover:underline focus-visible:underline",
|
|
3331
|
+
children: "Retry"
|
|
3332
|
+
}
|
|
3333
|
+
),
|
|
3334
|
+
onRemove && /* @__PURE__ */ jsx62(
|
|
3335
|
+
"button",
|
|
3336
|
+
{
|
|
3337
|
+
type: "button",
|
|
3338
|
+
onClick: () => onRemove(file.id),
|
|
3339
|
+
"aria-label": `Remove ${file.name}`,
|
|
3340
|
+
className: "shrink-0 rounded-[2px] p-0.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
|
|
3341
|
+
children: /* @__PURE__ */ jsx62(X6, { className: "size-3.5" })
|
|
3342
|
+
}
|
|
3343
|
+
)
|
|
3344
|
+
] });
|
|
3345
|
+
}
|
|
3346
|
+
FileUploadItem.displayName = "FileUploadItem";
|
|
3347
|
+
|
|
3348
|
+
// src/components/date-picker.tsx
|
|
3349
|
+
import * as React57 from "react";
|
|
3350
|
+
import { CalendarIcon } from "lucide-react";
|
|
3351
|
+
import { format } from "date-fns";
|
|
3352
|
+
import { jsx as jsx63, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
3353
|
+
var DatePicker = React57.forwardRef(
|
|
3354
|
+
({ value, onChange, placeholder = "Select date", label, helperText, error, disabled, className, formatStr = "PP", calendarProps }, ref) => {
|
|
3355
|
+
const [open, setOpen] = React57.useState(false);
|
|
3356
|
+
return /* @__PURE__ */ jsxs34("div", { className: cn("flex flex-col gap-1.5 font-sans", className), children: [
|
|
3357
|
+
label && /* @__PURE__ */ jsx63("label", { className: "text-label-md font-medium text-foreground", children: label }),
|
|
3358
|
+
/* @__PURE__ */ jsxs34(Popover, { open, onOpenChange: setOpen, children: [
|
|
3359
|
+
/* @__PURE__ */ jsx63(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs34(
|
|
3360
|
+
Button,
|
|
3361
|
+
{
|
|
3362
|
+
ref,
|
|
3363
|
+
type: "button",
|
|
3364
|
+
variant: "Outline",
|
|
3365
|
+
disabled,
|
|
3366
|
+
className: cn("w-full justify-start px-3 font-normal", !value && "text-muted-foreground", error && "border-destructive text-destructive"),
|
|
3367
|
+
children: [
|
|
3368
|
+
/* @__PURE__ */ jsx63(CalendarIcon, { className: "size-4" }),
|
|
3369
|
+
value ? format(value, formatStr) : placeholder
|
|
3370
|
+
]
|
|
3371
|
+
}
|
|
3372
|
+
) }),
|
|
3373
|
+
/* @__PURE__ */ jsx63(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx63(
|
|
3374
|
+
Calendar,
|
|
3375
|
+
{
|
|
3376
|
+
mode: "single",
|
|
3377
|
+
selected: value,
|
|
3378
|
+
onSelect: (d) => {
|
|
3379
|
+
onChange?.(d);
|
|
3380
|
+
setOpen(false);
|
|
3381
|
+
},
|
|
3382
|
+
...calendarProps
|
|
3383
|
+
}
|
|
3384
|
+
) })
|
|
3385
|
+
] }),
|
|
3386
|
+
helperText && /* @__PURE__ */ jsx63("p", { className: cn("text-body-sm", error ? "text-destructive" : "text-muted-foreground"), children: helperText })
|
|
3387
|
+
] });
|
|
3388
|
+
}
|
|
3389
|
+
);
|
|
3390
|
+
DatePicker.displayName = "DatePicker";
|
|
3391
|
+
|
|
3392
|
+
// src/components/code-block.tsx
|
|
3393
|
+
import * as React58 from "react";
|
|
3394
|
+
import { Check as Check7, Copy } from "lucide-react";
|
|
3395
|
+
import { jsx as jsx64, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
3396
|
+
var CodeBlock = React58.forwardRef(
|
|
3397
|
+
({ className, code, language, filename, files, hideCopy, ...props }, ref) => {
|
|
3398
|
+
const tabs = files && files.length > 0 ? files : [{ name: filename ?? language ?? "", code: code ?? "" }];
|
|
3399
|
+
const [active, setActive] = React58.useState(0);
|
|
3400
|
+
const [copied, setCopied] = React58.useState(false);
|
|
3401
|
+
const current = tabs[active] ?? tabs[0];
|
|
3402
|
+
const hasHeader = tabs.length > 1 || !!current.name;
|
|
3403
|
+
const copy = async () => {
|
|
3404
|
+
try {
|
|
3405
|
+
await navigator.clipboard.writeText(current.code);
|
|
3406
|
+
setCopied(true);
|
|
3407
|
+
window.setTimeout(() => setCopied(false), 1500);
|
|
3408
|
+
} catch {
|
|
3409
|
+
}
|
|
3410
|
+
};
|
|
3411
|
+
return /* @__PURE__ */ jsxs35("div", { ref, className: cn("overflow-hidden rounded-md border border-input bg-muted font-sans", className), ...props, children: [
|
|
3412
|
+
hasHeader && /* @__PURE__ */ jsxs35("div", { className: "flex items-center justify-between border-b border-input bg-background px-2", children: [
|
|
3413
|
+
/* @__PURE__ */ jsx64("div", { className: "flex", children: tabs.map((t, i) => /* @__PURE__ */ jsx64(
|
|
3414
|
+
"button",
|
|
3415
|
+
{
|
|
3416
|
+
type: "button",
|
|
3417
|
+
onClick: () => setActive(i),
|
|
3418
|
+
className: cn(
|
|
3419
|
+
"border-b-2 px-3 py-2 text-body-sm transition-colors outline-none",
|
|
3420
|
+
i === active ? "border-primary text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
3421
|
+
),
|
|
3422
|
+
children: t.name || "code"
|
|
3423
|
+
},
|
|
3424
|
+
t.name || i
|
|
3425
|
+
)) }),
|
|
3426
|
+
!hideCopy && /* @__PURE__ */ jsx64(
|
|
3427
|
+
"button",
|
|
3428
|
+
{
|
|
3429
|
+
type: "button",
|
|
3430
|
+
onClick: copy,
|
|
3431
|
+
"aria-label": "Copy code",
|
|
3432
|
+
className: "rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
|
|
3433
|
+
children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
|
|
3434
|
+
}
|
|
3435
|
+
)
|
|
3436
|
+
] }),
|
|
3437
|
+
/* @__PURE__ */ jsxs35("div", { className: "relative", children: [
|
|
3438
|
+
!hasHeader && !hideCopy && /* @__PURE__ */ jsx64(
|
|
3439
|
+
"button",
|
|
3440
|
+
{
|
|
3441
|
+
type: "button",
|
|
3442
|
+
onClick: copy,
|
|
3443
|
+
"aria-label": "Copy code",
|
|
3444
|
+
className: "absolute right-2 top-2 rounded-[2px] p-1.5 text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-current",
|
|
3445
|
+
children: copied ? /* @__PURE__ */ jsx64(Check7, { className: "size-4" }) : /* @__PURE__ */ jsx64(Copy, { className: "size-4" })
|
|
3446
|
+
}
|
|
3447
|
+
),
|
|
3448
|
+
/* @__PURE__ */ jsx64("pre", { className: "overflow-x-auto p-4 text-body-sm text-foreground", children: /* @__PURE__ */ jsx64("code", { children: current.code }) })
|
|
3449
|
+
] })
|
|
3450
|
+
] });
|
|
3451
|
+
}
|
|
3452
|
+
);
|
|
3453
|
+
CodeBlock.displayName = "CodeBlock";
|
|
3454
|
+
|
|
3455
|
+
// src/components/metric.tsx
|
|
3456
|
+
import * as React59 from "react";
|
|
3457
|
+
import { ArrowDown, ArrowUp } from "lucide-react";
|
|
3458
|
+
import { jsx as jsx65, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
3459
|
+
var Metric = React59.forwardRef(
|
|
3460
|
+
({ className, label, value, trend, change, icon, chart, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { ref, className: cn("flex flex-col gap-2 rounded-md border border-input p-4 font-sans", className), ...props, children: [
|
|
3461
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex items-center justify-between", children: [
|
|
3462
|
+
/* @__PURE__ */ jsx65("p", { className: "text-body-sm text-muted-foreground", children: label }),
|
|
3463
|
+
icon && /* @__PURE__ */ jsx65("span", { className: "text-muted-foreground [&_svg]:size-5", children: icon })
|
|
3464
|
+
] }),
|
|
3465
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex items-end justify-between gap-2", children: [
|
|
3466
|
+
/* @__PURE__ */ jsx65("p", { className: "text-headline-sm font-medium text-foreground", children: value }),
|
|
3467
|
+
trend && /* @__PURE__ */ jsxs36(
|
|
3468
|
+
"span",
|
|
3469
|
+
{
|
|
3470
|
+
className: cn(
|
|
3471
|
+
"inline-flex items-center gap-0.5 text-label-md font-medium",
|
|
3472
|
+
trend === "up" && "text-success",
|
|
3473
|
+
trend === "down" && "text-destructive",
|
|
3474
|
+
trend === "neutral" && "text-muted-foreground"
|
|
3475
|
+
),
|
|
3476
|
+
children: [
|
|
3477
|
+
trend === "up" && /* @__PURE__ */ jsx65(ArrowUp, { className: "size-3.5" }),
|
|
3478
|
+
trend === "down" && /* @__PURE__ */ jsx65(ArrowDown, { className: "size-3.5" }),
|
|
3479
|
+
change
|
|
3480
|
+
]
|
|
3481
|
+
}
|
|
3482
|
+
)
|
|
3483
|
+
] }),
|
|
3484
|
+
chart && /* @__PURE__ */ jsx65("div", { className: "mt-1", children: chart })
|
|
3485
|
+
] })
|
|
3486
|
+
);
|
|
3487
|
+
Metric.displayName = "Metric";
|
|
3488
|
+
|
|
3489
|
+
// src/components/number-input.tsx
|
|
3490
|
+
import * as React60 from "react";
|
|
3491
|
+
import { Minus as Minus3, Plus } from "lucide-react";
|
|
3492
|
+
import { jsx as jsx66, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
3493
|
+
var NumberInput = React60.forwardRef(
|
|
3494
|
+
({ className, value, defaultValue = 0, min, max, step = 1, onChange, disabled, ...props }, ref) => {
|
|
3495
|
+
const [internal, setInternal] = React60.useState(defaultValue);
|
|
3496
|
+
const current = value ?? internal;
|
|
3497
|
+
const clamp = (n) => {
|
|
3498
|
+
let v = n;
|
|
3499
|
+
if (min != null) v = Math.max(min, v);
|
|
3500
|
+
if (max != null) v = Math.min(max, v);
|
|
3501
|
+
return v;
|
|
3502
|
+
};
|
|
3503
|
+
const set = (n) => {
|
|
3504
|
+
const v = clamp(n);
|
|
3505
|
+
setInternal(v);
|
|
3506
|
+
onChange?.(v);
|
|
3507
|
+
};
|
|
3508
|
+
return /* @__PURE__ */ jsxs37(
|
|
3509
|
+
"div",
|
|
3510
|
+
{
|
|
3511
|
+
className: cn(
|
|
3512
|
+
"flex h-10 items-stretch overflow-hidden rounded-md border border-input font-sans focus-within:shadow-focus",
|
|
3513
|
+
disabled && "pointer-events-none opacity-50",
|
|
3514
|
+
className
|
|
3515
|
+
),
|
|
3516
|
+
children: [
|
|
3517
|
+
/* @__PURE__ */ jsx66(
|
|
3518
|
+
"button",
|
|
3519
|
+
{
|
|
3520
|
+
type: "button",
|
|
3521
|
+
"aria-label": "Decrease",
|
|
3522
|
+
disabled: disabled || min != null && current <= min,
|
|
3523
|
+
onClick: () => set(current - step),
|
|
3524
|
+
className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
|
|
3525
|
+
children: /* @__PURE__ */ jsx66(Minus3, { className: "size-4" })
|
|
3526
|
+
}
|
|
3527
|
+
),
|
|
3528
|
+
/* @__PURE__ */ jsx66(
|
|
3529
|
+
"input",
|
|
3530
|
+
{
|
|
3531
|
+
ref,
|
|
3532
|
+
type: "number",
|
|
3533
|
+
inputMode: "numeric",
|
|
3534
|
+
value: current,
|
|
3535
|
+
min,
|
|
3536
|
+
max,
|
|
3537
|
+
step,
|
|
3538
|
+
disabled,
|
|
3539
|
+
onChange: (e) => {
|
|
3540
|
+
const n = e.target.valueAsNumber;
|
|
3541
|
+
if (!Number.isNaN(n)) set(n);
|
|
3542
|
+
},
|
|
3543
|
+
className: "w-full min-w-0 flex-1 border-x border-input bg-transparent px-2 text-center text-body-md text-foreground outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none",
|
|
3544
|
+
...props
|
|
3545
|
+
}
|
|
3546
|
+
),
|
|
3547
|
+
/* @__PURE__ */ jsx66(
|
|
3548
|
+
"button",
|
|
3549
|
+
{
|
|
3550
|
+
type: "button",
|
|
3551
|
+
"aria-label": "Increase",
|
|
3552
|
+
disabled: disabled || max != null && current >= max,
|
|
3553
|
+
onClick: () => set(current + step),
|
|
3554
|
+
className: "flex w-9 shrink-0 items-center justify-center text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:opacity-50",
|
|
3555
|
+
children: /* @__PURE__ */ jsx66(Plus, { className: "size-4" })
|
|
3556
|
+
}
|
|
3557
|
+
)
|
|
3558
|
+
]
|
|
3559
|
+
}
|
|
3560
|
+
);
|
|
3561
|
+
}
|
|
3562
|
+
);
|
|
3563
|
+
NumberInput.displayName = "NumberInput";
|
|
3564
|
+
|
|
3565
|
+
// src/components/quote.tsx
|
|
3566
|
+
import * as React61 from "react";
|
|
3567
|
+
import { jsx as jsx67, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
3568
|
+
var Quote = React61.forwardRef(
|
|
3569
|
+
({ className, author, authorTitle, avatar, children, ...props }, ref) => /* @__PURE__ */ jsxs38("figure", { ref, className: cn("flex flex-col gap-4 font-sans", className), ...props, children: [
|
|
3570
|
+
/* @__PURE__ */ jsxs38("blockquote", { className: "text-title-md font-medium text-foreground", children: [
|
|
3571
|
+
"\u201C",
|
|
3572
|
+
children,
|
|
3573
|
+
"\u201D"
|
|
3574
|
+
] }),
|
|
3575
|
+
(author || authorTitle) && /* @__PURE__ */ jsxs38("figcaption", { className: "flex items-center gap-3", children: [
|
|
3576
|
+
avatar,
|
|
3577
|
+
/* @__PURE__ */ jsxs38("div", { children: [
|
|
3578
|
+
author && /* @__PURE__ */ jsx67("p", { className: "text-body-md font-medium text-foreground", children: author }),
|
|
3579
|
+
authorTitle && /* @__PURE__ */ jsx67("p", { className: "text-body-sm text-muted-foreground", children: authorTitle })
|
|
3580
|
+
] })
|
|
3581
|
+
] })
|
|
3582
|
+
] })
|
|
3583
|
+
);
|
|
3584
|
+
Quote.displayName = "Quote";
|
|
3585
|
+
|
|
3586
|
+
// src/components/footer.tsx
|
|
3587
|
+
import * as React62 from "react";
|
|
3588
|
+
import { jsx as jsx68, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3589
|
+
var Footer = React62.forwardRef(
|
|
3590
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsx68("footer", { ref, className: cn("w-full border-t border-border bg-background px-6 py-10 font-sans", className), ...props, children })
|
|
3591
|
+
);
|
|
3592
|
+
Footer.displayName = "Footer";
|
|
3593
|
+
var FooterColumn = React62.forwardRef(
|
|
3594
|
+
({ className, title, children, ...props }, ref) => /* @__PURE__ */ jsxs39("div", { ref, className: cn("flex flex-col gap-3", className), ...props, children: [
|
|
3595
|
+
/* @__PURE__ */ jsx68("p", { className: "text-label-md font-medium text-foreground", children: title }),
|
|
3596
|
+
/* @__PURE__ */ jsx68("div", { className: "flex flex-col gap-2", children })
|
|
3597
|
+
] })
|
|
3598
|
+
);
|
|
3599
|
+
FooterColumn.displayName = "FooterColumn";
|
|
3600
|
+
var FooterLink = React62.forwardRef(
|
|
3601
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
|
|
3602
|
+
"a",
|
|
3603
|
+
{
|
|
3604
|
+
ref,
|
|
3605
|
+
className: cn(
|
|
3606
|
+
"text-body-sm text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:text-foreground",
|
|
3607
|
+
className
|
|
3608
|
+
),
|
|
3609
|
+
...props
|
|
3610
|
+
}
|
|
3611
|
+
)
|
|
3612
|
+
);
|
|
3613
|
+
FooterLink.displayName = "FooterLink";
|
|
3614
|
+
var FooterBottom = React62.forwardRef(
|
|
3615
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx68(
|
|
3616
|
+
"div",
|
|
3617
|
+
{
|
|
3618
|
+
ref,
|
|
3619
|
+
className: cn(
|
|
3620
|
+
"mt-8 flex flex-wrap items-center justify-between gap-3 border-t border-border pt-6 text-body-sm text-muted-foreground",
|
|
3621
|
+
className
|
|
3622
|
+
),
|
|
3623
|
+
...props
|
|
3624
|
+
}
|
|
3625
|
+
)
|
|
3626
|
+
);
|
|
3627
|
+
FooterBottom.displayName = "FooterBottom";
|
|
3628
|
+
|
|
3629
|
+
// src/components/table-of-contents.tsx
|
|
3630
|
+
import * as React63 from "react";
|
|
3631
|
+
import { jsx as jsx69 } from "react/jsx-runtime";
|
|
3632
|
+
var TableOfContents = React63.forwardRef(
|
|
3633
|
+
({ className, items, active, ...props }, ref) => /* @__PURE__ */ jsx69("nav", { ref, "aria-label": "Table of contents", className: cn("flex flex-col gap-0.5 font-sans", className), ...props, children: items.map((item) => {
|
|
3634
|
+
const isActive = item.id === active;
|
|
3635
|
+
return /* @__PURE__ */ jsx69(
|
|
3636
|
+
"a",
|
|
3637
|
+
{
|
|
3638
|
+
href: `#${item.id}`,
|
|
3639
|
+
"aria-current": isActive ? "location" : void 0,
|
|
3640
|
+
style: { paddingInlineStart: `${((item.level ?? 1) - 1) * 12 + 12}px` },
|
|
3641
|
+
className: cn(
|
|
3642
|
+
"-ms-px border-s py-1.5 text-body-sm outline-none transition-colors",
|
|
3643
|
+
isActive ? "border-primary font-medium text-primary" : "border-transparent text-muted-foreground hover:text-foreground"
|
|
3644
|
+
),
|
|
3645
|
+
children: item.label
|
|
3646
|
+
},
|
|
3647
|
+
item.id
|
|
3648
|
+
);
|
|
3649
|
+
}) })
|
|
3650
|
+
);
|
|
3651
|
+
TableOfContents.displayName = "TableOfContents";
|
|
3652
|
+
export {
|
|
3653
|
+
Accordion,
|
|
3654
|
+
AccordionContent,
|
|
3655
|
+
AccordionItem,
|
|
3656
|
+
AccordionTrigger,
|
|
3657
|
+
Alert,
|
|
3658
|
+
AlertDescription,
|
|
3659
|
+
AlertDialog,
|
|
3660
|
+
AlertDialogAction,
|
|
3661
|
+
AlertDialogCancel,
|
|
3662
|
+
AlertDialogContent,
|
|
3663
|
+
AlertDialogDescription,
|
|
3664
|
+
AlertDialogFooter,
|
|
3665
|
+
AlertDialogHeader,
|
|
3666
|
+
AlertDialogOverlay,
|
|
3667
|
+
AlertDialogPortal,
|
|
3668
|
+
AlertDialogTitle,
|
|
3669
|
+
AlertDialogTrigger,
|
|
3670
|
+
AlertTitle,
|
|
3671
|
+
AspectRatio,
|
|
3672
|
+
AudioPlayer,
|
|
3673
|
+
Avatar,
|
|
3674
|
+
AvatarFallback,
|
|
3675
|
+
AvatarGroup,
|
|
3676
|
+
AvatarImage,
|
|
3677
|
+
Badge,
|
|
3678
|
+
Breadcrumb,
|
|
3679
|
+
BreadcrumbEllipsis,
|
|
3680
|
+
BreadcrumbItem,
|
|
3681
|
+
BreadcrumbLink,
|
|
3682
|
+
BreadcrumbList,
|
|
3683
|
+
BreadcrumbPage,
|
|
3684
|
+
BreadcrumbSeparator,
|
|
3685
|
+
Button,
|
|
3686
|
+
Calendar,
|
|
3687
|
+
Card,
|
|
3688
|
+
CardContent,
|
|
3689
|
+
CardDescription,
|
|
3690
|
+
CardFooter,
|
|
3691
|
+
CardHeader,
|
|
3692
|
+
CardTitle,
|
|
3693
|
+
Carousel,
|
|
3694
|
+
CarouselContent,
|
|
3695
|
+
CarouselItem,
|
|
3696
|
+
CarouselNext,
|
|
3697
|
+
CarouselPrevious,
|
|
3698
|
+
ChartContainer,
|
|
3699
|
+
ChartLegend,
|
|
3700
|
+
ChartLegendContent,
|
|
3701
|
+
ChartStyle,
|
|
3702
|
+
ChartTooltip,
|
|
3703
|
+
ChartTooltipContent,
|
|
3704
|
+
Checkbox,
|
|
3705
|
+
CircularProgress,
|
|
3706
|
+
CodeBlock,
|
|
3707
|
+
Collapsible,
|
|
3708
|
+
CollapsibleContent2 as CollapsibleContent,
|
|
3709
|
+
CollapsibleTrigger2 as CollapsibleTrigger,
|
|
3710
|
+
Command,
|
|
3711
|
+
CommandDialog,
|
|
3712
|
+
CommandEmpty,
|
|
3713
|
+
CommandGroup,
|
|
3714
|
+
CommandInput,
|
|
3715
|
+
CommandItem,
|
|
3716
|
+
CommandList,
|
|
3717
|
+
CommandSeparator,
|
|
3718
|
+
CommandShortcut,
|
|
3719
|
+
ContextMenu,
|
|
3720
|
+
ContextMenuCheckboxItem,
|
|
3721
|
+
ContextMenuContent,
|
|
3722
|
+
ContextMenuGroup,
|
|
3723
|
+
ContextMenuItem,
|
|
3724
|
+
ContextMenuLabel,
|
|
3725
|
+
ContextMenuPortal,
|
|
3726
|
+
ContextMenuRadioGroup,
|
|
3727
|
+
ContextMenuRadioItem,
|
|
3728
|
+
ContextMenuSeparator,
|
|
3729
|
+
ContextMenuShortcut,
|
|
3730
|
+
ContextMenuSub,
|
|
3731
|
+
ContextMenuSubContent,
|
|
3732
|
+
ContextMenuSubTrigger,
|
|
3733
|
+
ContextMenuTrigger,
|
|
3734
|
+
DataTable,
|
|
3735
|
+
DatePicker,
|
|
3736
|
+
Dialog,
|
|
3737
|
+
DialogClose,
|
|
3738
|
+
DialogContent,
|
|
3739
|
+
DialogDescription,
|
|
3740
|
+
DialogFooter,
|
|
3741
|
+
DialogHeader,
|
|
3742
|
+
DialogOverlay,
|
|
3743
|
+
DialogPortal,
|
|
3744
|
+
DialogTitle,
|
|
3745
|
+
DialogTrigger,
|
|
3746
|
+
Drawer,
|
|
3747
|
+
DrawerClose,
|
|
3748
|
+
DrawerContent,
|
|
3749
|
+
DrawerDescription,
|
|
3750
|
+
DrawerFooter,
|
|
3751
|
+
DrawerHeader,
|
|
3752
|
+
DrawerOverlay,
|
|
3753
|
+
DrawerPortal,
|
|
3754
|
+
DrawerTitle,
|
|
3755
|
+
DrawerTrigger,
|
|
3756
|
+
DropdownMenu,
|
|
3757
|
+
DropdownMenuCheckboxItem,
|
|
3758
|
+
DropdownMenuContent,
|
|
3759
|
+
DropdownMenuGroup,
|
|
3760
|
+
DropdownMenuItem,
|
|
3761
|
+
DropdownMenuLabel,
|
|
3762
|
+
DropdownMenuPortal,
|
|
3763
|
+
DropdownMenuRadioGroup,
|
|
3764
|
+
DropdownMenuRadioItem,
|
|
3765
|
+
DropdownMenuSeparator,
|
|
3766
|
+
DropdownMenuShortcut,
|
|
3767
|
+
DropdownMenuSub,
|
|
3768
|
+
DropdownMenuSubContent,
|
|
3769
|
+
DropdownMenuSubTrigger,
|
|
3770
|
+
DropdownMenuTrigger,
|
|
3771
|
+
Fab,
|
|
3772
|
+
Field,
|
|
3773
|
+
FieldControl,
|
|
3774
|
+
FieldDescription,
|
|
3775
|
+
FieldLabel,
|
|
3776
|
+
FieldMessage,
|
|
3777
|
+
FileUpload,
|
|
3778
|
+
FileUploadItem,
|
|
3779
|
+
Footer,
|
|
3780
|
+
FooterBottom,
|
|
3781
|
+
FooterColumn,
|
|
3782
|
+
FooterLink,
|
|
3783
|
+
Form,
|
|
3784
|
+
FormControl,
|
|
3785
|
+
FormDescription,
|
|
3786
|
+
FormField,
|
|
3787
|
+
FormItem,
|
|
3788
|
+
FormLabel,
|
|
3789
|
+
FormMessage,
|
|
3790
|
+
HoverCard,
|
|
3791
|
+
HoverCardContent,
|
|
3792
|
+
HoverCardTrigger,
|
|
3793
|
+
Image2 as Image,
|
|
3794
|
+
Inform,
|
|
3795
|
+
Input,
|
|
3796
|
+
InputGroup,
|
|
3797
|
+
InputGroupAddon,
|
|
3798
|
+
InputGroupButton,
|
|
3799
|
+
InputGroupInput,
|
|
3800
|
+
InputGroupText,
|
|
3801
|
+
InputOTP,
|
|
3802
|
+
InputOTPGroup,
|
|
3803
|
+
InputOTPSeparator,
|
|
3804
|
+
InputOTPSlot,
|
|
3805
|
+
Label2 as Label,
|
|
3806
|
+
List3 as List,
|
|
3807
|
+
ListItem,
|
|
3808
|
+
Menubar,
|
|
3809
|
+
MenubarCheckboxItem,
|
|
3810
|
+
MenubarContent,
|
|
3811
|
+
MenubarGroup,
|
|
3812
|
+
MenubarItem,
|
|
3813
|
+
MenubarLabel,
|
|
3814
|
+
MenubarMenu,
|
|
3815
|
+
MenubarPortal,
|
|
3816
|
+
MenubarRadioGroup,
|
|
3817
|
+
MenubarRadioItem,
|
|
3818
|
+
MenubarSeparator,
|
|
3819
|
+
MenubarShortcut,
|
|
3820
|
+
MenubarSub,
|
|
3821
|
+
MenubarSubContent,
|
|
3822
|
+
MenubarSubTrigger,
|
|
3823
|
+
MenubarTrigger,
|
|
3824
|
+
Metric,
|
|
3825
|
+
Modal,
|
|
3826
|
+
NavigationBar,
|
|
3827
|
+
NavigationMenu,
|
|
3828
|
+
NavigationMenuContent,
|
|
3829
|
+
NavigationMenuIndicator,
|
|
3830
|
+
NavigationMenuItem,
|
|
3831
|
+
NavigationMenuLink,
|
|
3832
|
+
NavigationMenuList,
|
|
3833
|
+
NavigationMenuTrigger,
|
|
3834
|
+
NavigationMenuViewport,
|
|
3835
|
+
NumberInput,
|
|
3836
|
+
Pagination,
|
|
3837
|
+
PaginationContent,
|
|
3838
|
+
PaginationEllipsis,
|
|
3839
|
+
PaginationItem,
|
|
3840
|
+
PaginationLink,
|
|
3841
|
+
PaginationNext,
|
|
3842
|
+
PaginationPrevious,
|
|
3843
|
+
PasswordInput,
|
|
3844
|
+
Popover,
|
|
3845
|
+
PopoverAnchor,
|
|
3846
|
+
PopoverContent,
|
|
3847
|
+
PopoverTrigger,
|
|
3848
|
+
Progress,
|
|
3849
|
+
Quote,
|
|
3850
|
+
RadioGroup2 as RadioGroup,
|
|
3851
|
+
RadioGroupItem,
|
|
3852
|
+
Rating,
|
|
3853
|
+
ResizableHandle,
|
|
3854
|
+
ResizablePanel,
|
|
3855
|
+
ResizablePanelGroup,
|
|
3856
|
+
ScrollArea,
|
|
3857
|
+
ScrollBar,
|
|
3858
|
+
Select,
|
|
3859
|
+
SelectContent,
|
|
3860
|
+
SelectGroup,
|
|
3861
|
+
SelectItem,
|
|
3862
|
+
SelectLabel,
|
|
3863
|
+
SelectSeparator,
|
|
3864
|
+
SelectTrigger,
|
|
3865
|
+
SelectValue,
|
|
3866
|
+
Separator3 as Separator,
|
|
3867
|
+
Sheet,
|
|
3868
|
+
SheetClose,
|
|
3869
|
+
SheetContent,
|
|
3870
|
+
SheetDescription,
|
|
3871
|
+
SheetFooter,
|
|
3872
|
+
SheetHeader,
|
|
3873
|
+
SheetOverlay,
|
|
3874
|
+
SheetPortal,
|
|
3875
|
+
SheetTitle,
|
|
3876
|
+
SheetTrigger,
|
|
3877
|
+
Sidebar,
|
|
3878
|
+
SidebarContent,
|
|
3879
|
+
SidebarFooter,
|
|
3880
|
+
SidebarGroup,
|
|
3881
|
+
SidebarGroupContent,
|
|
3882
|
+
SidebarGroupLabel,
|
|
3883
|
+
SidebarHeader,
|
|
3884
|
+
SidebarInput,
|
|
3885
|
+
SidebarInset,
|
|
3886
|
+
SidebarMenu,
|
|
3887
|
+
SidebarMenuButton,
|
|
3888
|
+
SidebarMenuItem,
|
|
3889
|
+
SidebarMenuSkeleton,
|
|
3890
|
+
SidebarProvider,
|
|
3891
|
+
SidebarSeparator,
|
|
3892
|
+
SidebarTrigger,
|
|
3893
|
+
Skeleton,
|
|
3894
|
+
Slider,
|
|
3895
|
+
Spinner,
|
|
3896
|
+
Stepper,
|
|
3897
|
+
Switch,
|
|
3898
|
+
TabBar,
|
|
3899
|
+
TabBarItem,
|
|
3900
|
+
Table,
|
|
3901
|
+
TableBody,
|
|
3902
|
+
TableCaption,
|
|
3903
|
+
TableCell,
|
|
3904
|
+
TableFooter,
|
|
3905
|
+
TableHead,
|
|
3906
|
+
TableHeader,
|
|
3907
|
+
TableOfContents,
|
|
3908
|
+
TableRow,
|
|
3909
|
+
Tabs,
|
|
3910
|
+
TabsContent,
|
|
3911
|
+
TabsList,
|
|
3912
|
+
TabsTrigger,
|
|
3913
|
+
Tag,
|
|
3914
|
+
Textarea,
|
|
3915
|
+
Toaster,
|
|
3916
|
+
Toggle,
|
|
3917
|
+
ToggleGroup,
|
|
3918
|
+
ToggleGroupItem,
|
|
3919
|
+
Tooltip,
|
|
3920
|
+
TooltipContent,
|
|
3921
|
+
TooltipProvider,
|
|
3922
|
+
TooltipTrigger,
|
|
3923
|
+
badgeVariants,
|
|
3924
|
+
buttonVariants,
|
|
3925
|
+
cn,
|
|
3926
|
+
fabVariants,
|
|
3927
|
+
formatBytes,
|
|
3928
|
+
informVariants,
|
|
3929
|
+
inputVariants,
|
|
3930
|
+
messageVariants,
|
|
3931
|
+
navigationMenuTriggerStyle,
|
|
3932
|
+
spinnerVariants,
|
|
3933
|
+
tagVariants,
|
|
3934
|
+
textareaVariants,
|
|
3935
|
+
toast,
|
|
3936
|
+
toggleVariants,
|
|
3937
|
+
useFormField,
|
|
3938
|
+
useSidebar
|
|
3939
|
+
};
|