@moontra/moonui 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -45,29 +45,303 @@ function combineRefs(...refs) {
45
45
  };
46
46
  }
47
47
 
48
+ // src/components/theme-provider.tsx
49
+ import { useEffect } from "react";
50
+
51
+ // src/lib/theme.tsx
52
+ import { createContext, useContext, useState, useMemo } from "react";
53
+ import { jsx } from "react/jsx-runtime";
54
+ var modernTheme = {
55
+ borderRadius: {
56
+ sm: "0.5rem",
57
+ md: "0.75rem",
58
+ lg: "1rem",
59
+ full: "9999px"
60
+ },
61
+ colors: {
62
+ primary: "hsl(250, 95%, 64%)",
63
+ secondary: "hsl(250, 70%, 80%)",
64
+ success: "hsl(142, 71%, 45%)",
65
+ warning: "hsl(38, 92%, 50%)",
66
+ error: "hsl(0, 84%, 60%)",
67
+ background: "hsl(0, 0%, 100%)",
68
+ foreground: "hsl(221, 39%, 11%)",
69
+ card: "hsl(0, 0%, 100%)",
70
+ cardForeground: "hsl(221, 39%, 11%)",
71
+ border: "hsl(210, 20%, 90%)",
72
+ muted: "hsl(210, 20%, 96%)",
73
+ mutedForeground: "hsl(215, 16%, 47%)",
74
+ accent: "hsl(328, 85%, 70%)",
75
+ accentForeground: "hsl(210, 20%, 98%)"
76
+ }
77
+ };
78
+ var roundedTheme = {
79
+ borderRadius: {
80
+ sm: "1rem",
81
+ md: "1.25rem",
82
+ lg: "1.5rem",
83
+ full: "9999px"
84
+ }
85
+ };
86
+ var minimalTheme = {
87
+ borderRadius: {
88
+ sm: "0.125rem",
89
+ md: "0.25rem",
90
+ lg: "0.375rem",
91
+ full: "9999px"
92
+ },
93
+ colors: {
94
+ primary: "hsl(220, 14%, 40%)",
95
+ secondary: "hsl(220, 9%, 60%)",
96
+ success: "hsl(142, 71%, 45%)",
97
+ warning: "hsl(38, 92%, 50%)",
98
+ error: "hsl(0, 84%, 60%)",
99
+ background: "hsl(0, 0%, 100%)",
100
+ foreground: "hsl(221, 39%, 11%)",
101
+ card: "hsl(0, 0%, 100%)",
102
+ cardForeground: "hsl(221, 39%, 11%)",
103
+ border: "hsl(220, 13%, 91%)",
104
+ muted: "hsl(220, 14%, 96%)",
105
+ mutedForeground: "hsl(215, 16%, 47%)",
106
+ accent: "hsl(210, 20%, 96%)",
107
+ accentForeground: "hsl(221, 39%, 11%)"
108
+ }
109
+ };
110
+ var defaultLightTheme = {
111
+ colors: {
112
+ primary: "hsl(221, 83%, 53%)",
113
+ secondary: "hsl(215, 20%, 65%)",
114
+ success: "hsl(142, 71%, 45%)",
115
+ warning: "hsl(38, 92%, 50%)",
116
+ error: "hsl(0, 84%, 60%)",
117
+ background: "hsl(0, 0%, 100%)",
118
+ foreground: "hsl(221, 39%, 11%)",
119
+ card: "hsl(0, 0%, 100%)",
120
+ cardForeground: "hsl(221, 39%, 11%)",
121
+ border: "hsl(210, 20%, 90%)",
122
+ muted: "hsl(210, 20%, 96%)",
123
+ mutedForeground: "hsl(215, 16%, 47%)",
124
+ accent: "hsl(210, 20%, 96%)",
125
+ accentForeground: "hsl(221, 39%, 11%)"
126
+ },
127
+ borderRadius: {
128
+ sm: "0.25rem",
129
+ md: "0.375rem",
130
+ lg: "0.5rem",
131
+ full: "9999px"
132
+ },
133
+ fontSizes: {
134
+ xs: "0.75rem",
135
+ sm: "0.875rem",
136
+ base: "1rem",
137
+ lg: "1.125rem",
138
+ xl: "1.25rem",
139
+ "2xl": "1.5rem",
140
+ "3xl": "1.875rem"
141
+ },
142
+ spacing: {
143
+ 1: "0.25rem",
144
+ 2: "0.5rem",
145
+ 4: "1rem",
146
+ 6: "1.5rem",
147
+ 8: "2rem"
148
+ }
149
+ };
150
+ var defaultDarkTheme = {
151
+ ...defaultLightTheme,
152
+ colors: {
153
+ primary: "hsl(221, 83%, 53%)",
154
+ secondary: "hsl(215, 20%, 65%)",
155
+ success: "hsl(142, 71%, 45%)",
156
+ warning: "hsl(38, 92%, 50%)",
157
+ error: "hsl(0, 84%, 60%)",
158
+ background: "hsl(221, 39%, 11%)",
159
+ foreground: "hsl(210, 20%, 98%)",
160
+ card: "hsl(220, 26%, 14%)",
161
+ cardForeground: "hsl(210, 20%, 98%)",
162
+ border: "hsl(215, 28%, 17%)",
163
+ muted: "hsl(215, 27%, 16%)",
164
+ mutedForeground: "hsl(215, 16%, 57%)",
165
+ accent: "hsl(215, 27%, 16%)",
166
+ accentForeground: "hsl(210, 20%, 98%)"
167
+ }
168
+ };
169
+ var ThemeContext = createContext(void 0);
170
+ var getPresetTheme = (preset) => {
171
+ switch (preset) {
172
+ case "modern":
173
+ return modernTheme;
174
+ case "rounded":
175
+ return roundedTheme;
176
+ case "minimal":
177
+ return minimalTheme;
178
+ default:
179
+ return {};
180
+ }
181
+ };
182
+ var ThemeProvider = ({
183
+ children,
184
+ defaultColorMode = "light",
185
+ preset = "default",
186
+ lightTheme = {},
187
+ darkTheme = {},
188
+ extensions = {}
189
+ }) => {
190
+ const [colorMode, setColorMode] = useState(defaultColorMode);
191
+ const presetThemeValues = getPresetTheme(preset);
192
+ const [customLightTheme, setCustomLightTheme] = useState({
193
+ ...defaultLightTheme,
194
+ ...presetThemeValues,
195
+ ...lightTheme,
196
+ colors: {
197
+ ...defaultLightTheme.colors,
198
+ ...presetThemeValues.colors || {},
199
+ ...lightTheme.colors || {}
200
+ },
201
+ extensions
202
+ });
203
+ const [customDarkTheme, setCustomDarkTheme] = useState({
204
+ ...defaultDarkTheme,
205
+ ...presetThemeValues,
206
+ ...darkTheme,
207
+ colors: {
208
+ ...defaultDarkTheme.colors,
209
+ ...presetThemeValues.colors || {},
210
+ ...darkTheme.colors || {}
211
+ },
212
+ extensions
213
+ });
214
+ const theme = useMemo(() => {
215
+ return colorMode === "light" ? customLightTheme : customDarkTheme;
216
+ }, [colorMode, customLightTheme, customDarkTheme]);
217
+ const updateTheme = (config) => {
218
+ if (colorMode === "light") {
219
+ setCustomLightTheme((prev) => ({
220
+ ...prev,
221
+ ...config,
222
+ colors: {
223
+ ...prev.colors,
224
+ ...config.colors || {}
225
+ },
226
+ extensions: {
227
+ ...prev.extensions || {},
228
+ ...config.extensions || {}
229
+ }
230
+ }));
231
+ } else {
232
+ setCustomDarkTheme((prev) => ({
233
+ ...prev,
234
+ ...config,
235
+ colors: {
236
+ ...prev.colors,
237
+ ...config.colors || {}
238
+ },
239
+ extensions: {
240
+ ...prev.extensions || {},
241
+ ...config.extensions || {}
242
+ }
243
+ }));
244
+ }
245
+ };
246
+ const setThemePreset = (preset2) => {
247
+ const presetValues = getPresetTheme(preset2);
248
+ updateTheme({
249
+ ...presetValues,
250
+ colors: presetValues.colors
251
+ });
252
+ };
253
+ const value = {
254
+ theme,
255
+ colorMode,
256
+ setColorMode,
257
+ updateTheme,
258
+ setThemePreset
259
+ };
260
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
261
+ };
262
+ var useTheme = () => {
263
+ const context = useContext(ThemeContext);
264
+ if (context === void 0) {
265
+ throw new Error("useTheme must be used within a ThemeProvider");
266
+ }
267
+ return context;
268
+ };
269
+ var createCssVariables = (theme) => {
270
+ const variables = {};
271
+ Object.entries(theme.colors).forEach(([key, value]) => {
272
+ variables[`--color-${key}`] = value;
273
+ });
274
+ Object.entries(theme.borderRadius).forEach(([key, value]) => {
275
+ variables[`--radius-${key}`] = value;
276
+ });
277
+ Object.entries(theme.fontSizes).forEach(([key, value]) => {
278
+ variables[`--font-size-${key}`] = value;
279
+ });
280
+ Object.entries(theme.spacing).forEach(([key, value]) => {
281
+ variables[`--space-${key}`] = value;
282
+ });
283
+ if (theme.extensions) {
284
+ Object.entries(theme.extensions).forEach(([categoryKey, categoryValue]) => {
285
+ if (typeof categoryValue === "object" && categoryValue !== null) {
286
+ Object.entries(categoryValue).forEach(([key, value]) => {
287
+ variables[`--${categoryKey}-${key}`] = value;
288
+ });
289
+ } else if (typeof categoryValue === "string") {
290
+ variables[`--${categoryKey}`] = categoryValue;
291
+ }
292
+ });
293
+ }
294
+ return variables;
295
+ };
296
+
297
+ // src/components/theme-provider.tsx
298
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
299
+ var CssVariablesInjector = () => {
300
+ const { theme } = useTheme();
301
+ useEffect(() => {
302
+ const variables = createCssVariables(theme);
303
+ const root = document.documentElement;
304
+ Object.entries(variables).forEach(([key, value]) => {
305
+ root.style.setProperty(key, value);
306
+ });
307
+ return () => {
308
+ Object.keys(variables).forEach((key) => {
309
+ root.style.removeProperty(key);
310
+ });
311
+ };
312
+ }, [theme]);
313
+ return null;
314
+ };
315
+ var ThemeProvider2 = (props) => {
316
+ return /* @__PURE__ */ jsxs(ThemeProvider, { ...props, children: [
317
+ /* @__PURE__ */ jsx2(CssVariablesInjector, {}),
318
+ props.children
319
+ ] });
320
+ };
321
+
48
322
  // src/components/ui/button.tsx
49
- import * as React from "react";
323
+ import * as React2 from "react";
50
324
  import { cva } from "class-variance-authority";
51
- import { jsx } from "react/jsx-runtime";
325
+ import { jsx as jsx3 } from "react/jsx-runtime";
52
326
  var buttonVariants = cva(
53
- "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-slate-950 dark:focus-visible:ring-slate-300",
327
+ "inline-flex items-center justify-center transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
54
328
  {
55
329
  variants: {
56
330
  variant: {
57
- default: "bg-slate-900 text-slate-50 hover:bg-slate-900/90 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50/90",
58
- destructive: "bg-red-500 text-slate-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-slate-50 dark:hover:bg-red-900/90",
59
- outline: "border border-slate-200 bg-white hover:bg-slate-100 hover:text-slate-900 dark:border-slate-800 dark:bg-slate-950 dark:hover:bg-slate-800 dark:hover:text-slate-50",
60
- secondary: "bg-slate-100 text-slate-900 hover:bg-slate-100/80 dark:bg-slate-800 dark:text-slate-50 dark:hover:bg-slate-800/80",
61
- ghost: "hover:bg-slate-100 hover:text-slate-900 dark:hover:bg-slate-800 dark:hover:text-slate-50",
62
- link: "text-slate-900 underline-offset-4 hover:underline dark:text-slate-50",
63
- primary: "bg-primary text-white hover:bg-primary/90",
64
- success: "bg-green-500 text-white hover:bg-green-600"
331
+ default: "bg-[var(--color-foreground)] text-[var(--color-background)] hover:bg-[var(--color-foreground)]/90",
332
+ destructive: "bg-[var(--color-error)] text-white hover:bg-[var(--color-error)]/90",
333
+ outline: "border border-[var(--color-border)] bg-[var(--color-background)] hover:bg-[var(--color-muted)] hover:text-[var(--color-foreground)]",
334
+ secondary: "bg-[var(--color-muted)] text-[var(--color-mutedForeground)] hover:bg-[var(--color-muted)]/80",
335
+ ghost: "hover:bg-[var(--color-muted)] hover:text-[var(--color-foreground)]",
336
+ link: "text-[var(--color-foreground)] underline-offset-4 hover:underline",
337
+ primary: "bg-[var(--color-primary)] text-white hover:bg-[var(--color-primary)]/90",
338
+ success: "bg-[var(--color-success)] text-white hover:bg-[var(--color-success)]/90"
65
339
  },
66
340
  size: {
67
- default: "h-10 px-4 py-2",
68
- sm: "h-9 rounded-md px-3",
69
- lg: "h-11 rounded-md px-8",
70
- icon: "h-10 w-10"
341
+ default: "h-10 px-4 py-2 rounded-[var(--radius-md)]",
342
+ sm: "h-9 rounded-[var(--radius-sm)] px-3 text-sm",
343
+ lg: "h-11 rounded-[var(--radius-lg)] px-8 text-base",
344
+ icon: "h-10 w-10 rounded-[var(--radius-md)]"
71
345
  }
72
346
  },
73
347
  defaultVariants: {
@@ -76,15 +350,19 @@ var buttonVariants = cva(
76
350
  }
77
351
  }
78
352
  );
79
- var Button = React.forwardRef(
353
+ var Button = React2.forwardRef(
80
354
  ({ className, variant, size, asChild = false, ...props }, ref) => {
81
- const Comp = asChild ? React.Fragment : "button";
82
- return /* @__PURE__ */ jsx(
355
+ const Comp = asChild ? React2.Fragment : "button";
356
+ return /* @__PURE__ */ jsx3(
83
357
  Comp,
84
358
  {
85
359
  className: cn(buttonVariants({ variant, size, className })),
86
360
  ref,
87
- ...props
361
+ ...props,
362
+ style: {
363
+ // Özel tema değişkenleri burada da kullanılabilir
364
+ ...props.style
365
+ }
88
366
  }
89
367
  );
90
368
  }
@@ -93,19 +371,19 @@ Button.displayName = "Button";
93
371
 
94
372
  // src/components/ui/badge.tsx
95
373
  import { cva as cva2 } from "class-variance-authority";
96
- import { jsx as jsx2 } from "react/jsx-runtime";
374
+ import { jsx as jsx4 } from "react/jsx-runtime";
97
375
  var badgeVariants = cva2(
98
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
376
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2",
99
377
  {
100
378
  variants: {
101
379
  variant: {
102
- default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
103
- secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
104
- destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
105
- outline: "text-foreground",
106
- success: "border-transparent bg-green-500 text-white hover:bg-green-600",
107
- warning: "border-transparent bg-yellow-500 text-white hover:bg-yellow-600",
108
- info: "border-transparent bg-blue-500 text-white hover:bg-blue-600"
380
+ default: "border-transparent bg-[var(--color-primary)] text-white hover:bg-[var(--color-primary)]/80",
381
+ secondary: "border-transparent bg-[var(--color-secondary)] text-white hover:bg-[var(--color-secondary)]/80",
382
+ destructive: "border-transparent bg-[var(--color-error)] text-white hover:bg-[var(--color-error)]/80",
383
+ outline: "border-[var(--color-border)] bg-transparent text-[var(--color-foreground)]",
384
+ success: "border-transparent bg-[var(--color-success)] text-white hover:bg-[var(--color-success)]/80",
385
+ warning: "border-transparent bg-[var(--color-warning)] text-white hover:bg-[var(--color-warning)]/80",
386
+ info: "border-transparent bg-[var(--color-primary)] text-white hover:bg-[var(--color-primary)]/80"
109
387
  }
110
388
  },
111
389
  defaultVariants: {
@@ -114,25 +392,26 @@ var badgeVariants = cva2(
114
392
  }
115
393
  );
116
394
  function Badge({ className, variant, ...props }) {
117
- return /* @__PURE__ */ jsx2("div", { className: cn(badgeVariants({ variant }), className), ...props });
395
+ return /* @__PURE__ */ jsx4("div", { className: cn(badgeVariants({ variant }), className), ...props });
118
396
  }
119
397
 
120
398
  // src/components/ui/card.tsx
121
- import * as React2 from "react";
122
- import { jsx as jsx3 } from "react/jsx-runtime";
123
- var Card = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
399
+ import * as React3 from "react";
400
+ import { jsx as jsx5 } from "react/jsx-runtime";
401
+ var Card = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
124
402
  "div",
125
403
  {
126
404
  ref,
127
405
  className: cn(
128
- "rounded-lg border border-slate-200 bg-white text-slate-950 shadow-sm dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50",
406
+ "rounded-lg border shadow-sm",
407
+ "border-[var(--color-border)] bg-[var(--color-card)] text-[var(--color-foreground)]",
129
408
  className
130
409
  ),
131
410
  ...props
132
411
  }
133
412
  ));
134
413
  Card.displayName = "Card";
135
- var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
414
+ var CardHeader = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
136
415
  "div",
137
416
  {
138
417
  ref,
@@ -141,7 +420,7 @@ var CardHeader = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE_
141
420
  }
142
421
  ));
143
422
  CardHeader.displayName = "CardHeader";
144
- var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
423
+ var CardTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
145
424
  "h3",
146
425
  {
147
426
  ref,
@@ -153,18 +432,18 @@ var CardTitle = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
153
432
  }
154
433
  ));
155
434
  CardTitle.displayName = "CardTitle";
156
- var CardDescription = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
435
+ var CardDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
157
436
  "p",
158
437
  {
159
438
  ref,
160
- className: cn("text-sm text-slate-500 dark:text-slate-400", className),
439
+ className: cn("text-sm text-[var(--color-muted-foreground)]", className),
161
440
  ...props
162
441
  }
163
442
  ));
164
443
  CardDescription.displayName = "CardDescription";
165
- var CardContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3("div", { ref, className: cn("p-6 pt-0", className), ...props }));
444
+ var CardContent = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5("div", { ref, className: cn("p-6 pt-0", className), ...props }));
166
445
  CardContent.displayName = "CardContent";
167
- var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
446
+ var CardFooter = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx5(
168
447
  "div",
169
448
  {
170
449
  ref,
@@ -173,8 +452,3025 @@ var CardFooter = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE_
173
452
  }
174
453
  ));
175
454
  CardFooter.displayName = "CardFooter";
455
+
456
+ // src/components/ui/input.tsx
457
+ import * as React4 from "react";
458
+ import { jsx as jsx6 } from "react/jsx-runtime";
459
+ var Input = React4.forwardRef(
460
+ ({ className, type, ...props }, ref) => {
461
+ return /* @__PURE__ */ jsx6(
462
+ "input",
463
+ {
464
+ type,
465
+ className: cn(
466
+ "flex h-10 w-full rounded-[var(--radius-md)] border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium",
467
+ "border-[var(--color-border)] bg-[var(--color-background)] text-[var(--color-foreground)]",
468
+ "placeholder:text-[var(--color-muted-foreground)] focus-visible:outline-none focus-visible:ring-2",
469
+ "focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]",
470
+ "disabled:cursor-not-allowed disabled:opacity-50",
471
+ className
472
+ ),
473
+ ref,
474
+ ...props
475
+ }
476
+ );
477
+ }
478
+ );
479
+ Input.displayName = "Input";
480
+
481
+ // src/components/ui/select.tsx
482
+ import * as React5 from "react";
483
+ import * as SelectPrimitive from "@radix-ui/react-select";
484
+ import { Check, ChevronDown, ChevronUp } from "lucide-react";
485
+ import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
486
+ var Select = SelectPrimitive.Root;
487
+ var SelectGroup = SelectPrimitive.Group;
488
+ var SelectValue = SelectPrimitive.Value;
489
+ var SelectTrigger = React5.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs2(
490
+ SelectPrimitive.Trigger,
491
+ {
492
+ ref,
493
+ className: cn(
494
+ "flex h-10 w-full items-center justify-between rounded-[var(--radius-md)] border px-3 py-2 text-sm [&>span]:line-clamp-1",
495
+ "border-[var(--color-border)] bg-[var(--color-background)] text-[var(--color-foreground)]",
496
+ "placeholder:text-[var(--color-muted-foreground)] focus:outline-none focus:ring-2",
497
+ "focus:ring-[var(--color-primary)] focus:ring-offset-2 focus:ring-offset-[var(--color-background)]",
498
+ "disabled:cursor-not-allowed disabled:opacity-50",
499
+ className
500
+ ),
501
+ ...props,
502
+ children: [
503
+ children,
504
+ /* @__PURE__ */ jsx7(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx7(ChevronDown, { className: "h-4 w-4 opacity-50" }) })
505
+ ]
506
+ }
507
+ ));
508
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
509
+ var SelectScrollUpButton = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
510
+ SelectPrimitive.ScrollUpButton,
511
+ {
512
+ ref,
513
+ className: cn(
514
+ "flex cursor-default items-center justify-center py-1",
515
+ className
516
+ ),
517
+ ...props,
518
+ children: /* @__PURE__ */ jsx7(ChevronUp, { className: "h-4 w-4" })
519
+ }
520
+ ));
521
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
522
+ var SelectScrollDownButton = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
523
+ SelectPrimitive.ScrollDownButton,
524
+ {
525
+ ref,
526
+ className: cn(
527
+ "flex cursor-default items-center justify-center py-1",
528
+ className
529
+ ),
530
+ ...props,
531
+ children: /* @__PURE__ */ jsx7(ChevronDown, { className: "h-4 w-4" })
532
+ }
533
+ ));
534
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
535
+ var SelectContent = React5.forwardRef(({ className, children, position = "item-aligned", ...props }, ref) => /* @__PURE__ */ jsx7(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs2(
536
+ SelectPrimitive.Content,
537
+ {
538
+ ref,
539
+ className: cn(
540
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-[var(--radius-md)] border shadow-md",
541
+ "border-[var(--color-border)] bg-[var(--color-card)] text-[var(--color-foreground)]",
542
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
543
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
544
+ "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",
545
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
546
+ className
547
+ ),
548
+ position,
549
+ ...props,
550
+ children: [
551
+ /* @__PURE__ */ jsx7(SelectScrollUpButton, {}),
552
+ /* @__PURE__ */ jsx7(
553
+ SelectPrimitive.Viewport,
554
+ {
555
+ className: cn(
556
+ "p-1",
557
+ position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
558
+ ),
559
+ children
560
+ }
561
+ ),
562
+ /* @__PURE__ */ jsx7(SelectScrollDownButton, {})
563
+ ]
564
+ }
565
+ ) }));
566
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
567
+ var SelectLabel = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
568
+ SelectPrimitive.Label,
569
+ {
570
+ ref,
571
+ className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold text-[var(--color-foreground)]", className),
572
+ ...props
573
+ }
574
+ ));
575
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
576
+ var SelectItem = React5.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs2(
577
+ SelectPrimitive.Item,
578
+ {
579
+ ref,
580
+ className: cn(
581
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none",
582
+ "focus:bg-[var(--color-accent)] focus:text-[var(--color-accent-foreground)]",
583
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
584
+ className
585
+ ),
586
+ ...props,
587
+ children: [
588
+ /* @__PURE__ */ jsx7("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx7(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx7(Check, { className: "h-4 w-4" }) }) }),
589
+ /* @__PURE__ */ jsx7(SelectPrimitive.ItemText, { children })
590
+ ]
591
+ }
592
+ ));
593
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
594
+ var SelectSeparator = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx7(
595
+ SelectPrimitive.Separator,
596
+ {
597
+ ref,
598
+ className: cn("-mx-1 my-1 h-px bg-[var(--color-border)]", className),
599
+ ...props
600
+ }
601
+ ));
602
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
603
+
604
+ // src/components/ui/switch.tsx
605
+ import * as React6 from "react";
606
+ import * as SwitchPrimitives from "@radix-ui/react-switch";
607
+ import { jsx as jsx8 } from "react/jsx-runtime";
608
+ var Switch = React6.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx8(
609
+ SwitchPrimitives.Root,
610
+ {
611
+ className: cn(
612
+ "peer inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent",
613
+ "transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]",
614
+ "focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-background)]",
615
+ "disabled:cursor-not-allowed disabled:opacity-50",
616
+ "data-[state=checked]:bg-[var(--color-primary)] data-[state=unchecked]:bg-[var(--color-muted)]",
617
+ className
618
+ ),
619
+ ...props,
620
+ ref,
621
+ children: /* @__PURE__ */ jsx8(
622
+ SwitchPrimitives.Thumb,
623
+ {
624
+ className: cn(
625
+ "pointer-events-none block h-5 w-5 rounded-full shadow-lg ring-0 transition-transform",
626
+ "bg-[var(--color-background)] data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0"
627
+ )
628
+ }
629
+ )
630
+ }
631
+ ));
632
+ Switch.displayName = SwitchPrimitives.Root.displayName;
633
+
634
+ // src/components/ui/dialog.tsx
635
+ import * as React7 from "react";
636
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
637
+ import { cva as cva3 } from "class-variance-authority";
638
+ import { Check as Check2, Loader2, X } from "lucide-react";
639
+ import { jsx as jsx9, jsxs as jsxs3 } from "react/jsx-runtime";
640
+ var Dialog = DialogPrimitive.Root;
641
+ var DialogTrigger = DialogPrimitive.Trigger;
642
+ var DialogPortal = DialogPrimitive.Portal;
643
+ var DialogClose = DialogPrimitive.Close;
644
+ var overlayVariants = cva3(
645
+ "fixed inset-0 z-50 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",
646
+ {
647
+ variants: {
648
+ variant: {
649
+ default: "bg-black/80",
650
+ subtle: "bg-black/60",
651
+ blur: "bg-black/40 backdrop-blur-md",
652
+ minimal: "bg-black/20 backdrop-blur-sm"
653
+ },
654
+ animation: {
655
+ default: "duration-200",
656
+ slow: "duration-300",
657
+ fast: "duration-100"
658
+ }
659
+ },
660
+ defaultVariants: {
661
+ variant: "default",
662
+ animation: "default"
663
+ }
664
+ }
665
+ );
666
+ var DialogOverlay = React7.forwardRef(({ className, variant, animation, ...props }, ref) => /* @__PURE__ */ jsx9(
667
+ DialogPrimitive.Overlay,
668
+ {
669
+ ref,
670
+ className: cn(overlayVariants({ variant, animation }), className),
671
+ ...props
672
+ }
673
+ ));
674
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
675
+ var dialogContentVariants = cva3(
676
+ "fixed left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border shadow-lg bg-[var(--color-card)] text-[var(--color-foreground)]",
677
+ {
678
+ variants: {
679
+ variant: {
680
+ default: "border-[var(--color-border)]",
681
+ primary: "border-[var(--color-primary)]/20",
682
+ secondary: "border-[var(--color-secondary)]/20",
683
+ ghost: "border-transparent shadow-xl",
684
+ destructive: "border-[var(--color-error)]/20"
685
+ },
686
+ size: {
687
+ xs: "max-w-xs p-4",
688
+ sm: "max-w-sm p-5",
689
+ default: "max-w-lg p-6",
690
+ md: "max-w-md p-6",
691
+ lg: "max-w-2xl p-7",
692
+ xl: "max-w-4xl p-8",
693
+ full: "max-w-[95vw] max-h-[95vh] p-6"
694
+ },
695
+ radius: {
696
+ none: "rounded-none",
697
+ sm: "rounded-[var(--radius-sm)]",
698
+ default: "rounded-[var(--radius-md)]",
699
+ lg: "rounded-[var(--radius-lg)]",
700
+ xl: "rounded-2xl",
701
+ full: "rounded-[var(--radius-full)]"
702
+ },
703
+ animation: {
704
+ default: "duration-200 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",
705
+ fade: "duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
706
+ zoom: "duration-200 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",
707
+ slide: "duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
708
+ none: ""
709
+ },
710
+ position: {
711
+ default: "top-[50%]",
712
+ top: "top-[5%]",
713
+ bottom: "bottom-[5%] top-auto translate-y-0"
714
+ }
715
+ },
716
+ defaultVariants: {
717
+ variant: "default",
718
+ size: "default",
719
+ radius: "default",
720
+ animation: "default",
721
+ position: "default"
722
+ }
723
+ }
724
+ );
725
+ var DialogContent = React7.forwardRef(
726
+ ({
727
+ className,
728
+ children,
729
+ variant,
730
+ size,
731
+ radius,
732
+ animation,
733
+ position,
734
+ overlayVariant = "default",
735
+ overlayAnimation = "default",
736
+ hideCloseButton = false,
737
+ title,
738
+ description,
739
+ icon,
740
+ loading = false,
741
+ success = false,
742
+ onClose,
743
+ ...props
744
+ }, ref) => {
745
+ const handleClose = () => {
746
+ if (onClose) {
747
+ onClose();
748
+ }
749
+ };
750
+ return /* @__PURE__ */ jsxs3(DialogPortal, { children: [
751
+ /* @__PURE__ */ jsx9(
752
+ DialogOverlay,
753
+ {
754
+ variant: overlayVariant,
755
+ animation: overlayAnimation
756
+ }
757
+ ),
758
+ /* @__PURE__ */ jsxs3(
759
+ DialogPrimitive.Content,
760
+ {
761
+ ref,
762
+ className: cn(
763
+ dialogContentVariants({
764
+ variant,
765
+ size,
766
+ radius,
767
+ animation,
768
+ position
769
+ }),
770
+ className
771
+ ),
772
+ onEscapeKeyDown: onClose ? (e) => {
773
+ e.preventDefault();
774
+ handleClose();
775
+ } : void 0,
776
+ onPointerDownOutside: onClose ? (e) => {
777
+ e.preventDefault();
778
+ handleClose();
779
+ } : void 0,
780
+ ...props,
781
+ children: [
782
+ (title || description) && /* @__PURE__ */ jsxs3(DialogHeader, { className: icon || loading || success ? "flex flex-row items-start gap-4" : "", children: [
783
+ (icon || loading || success) && /* @__PURE__ */ jsxs3("div", { className: "rounded-full bg-[var(--color-accent)] p-2 flex-shrink-0", children: [
784
+ loading && /* @__PURE__ */ jsx9(Loader2, { className: "h-5 w-5 animate-spin text-[var(--color-primary)]" }),
785
+ success && !loading && /* @__PURE__ */ jsx9(Check2, { className: "h-5 w-5 text-[var(--color-success)]" }),
786
+ !loading && !success && icon && /* @__PURE__ */ jsx9("span", { className: "text-[var(--color-primary)]", children: icon })
787
+ ] }),
788
+ /* @__PURE__ */ jsxs3("div", { className: "flex-1", children: [
789
+ title && /* @__PURE__ */ jsx9(DialogTitle, { children: title }),
790
+ description && /* @__PURE__ */ jsx9(DialogDescription, { children: description })
791
+ ] })
792
+ ] }),
793
+ children,
794
+ !hideCloseButton && /* @__PURE__ */ jsxs3(
795
+ DialogPrimitive.Close,
796
+ {
797
+ onClick: handleClose,
798
+ className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)]/30 focus:ring-offset-2 disabled:pointer-events-none text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)]",
799
+ children: [
800
+ /* @__PURE__ */ jsx9(X, { className: "h-4 w-4" }),
801
+ /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "Close" })
802
+ ]
803
+ }
804
+ )
805
+ ]
806
+ }
807
+ )
808
+ ] });
809
+ }
810
+ );
811
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
812
+ var DialogHeader = ({
813
+ className,
814
+ ...props
815
+ }) => /* @__PURE__ */ jsx9(
816
+ "div",
817
+ {
818
+ className: cn(
819
+ "flex flex-col space-y-2 text-center sm:text-left",
820
+ className
821
+ ),
822
+ ...props
823
+ }
824
+ );
825
+ DialogHeader.displayName = "DialogHeader";
826
+ var DialogFooter = ({
827
+ className,
828
+ ...props
829
+ }) => /* @__PURE__ */ jsx9(
830
+ "div",
831
+ {
832
+ className: cn(
833
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:space-x-2 mt-6",
834
+ className
835
+ ),
836
+ ...props
837
+ }
838
+ );
839
+ DialogFooter.displayName = "DialogFooter";
840
+ var DialogTitle = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
841
+ DialogPrimitive.Title,
842
+ {
843
+ ref,
844
+ className: cn(
845
+ "text-xl font-semibold leading-snug tracking-tight text-[var(--color-foreground)]",
846
+ className
847
+ ),
848
+ ...props
849
+ }
850
+ ));
851
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
852
+ var DialogDescription = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
853
+ DialogPrimitive.Description,
854
+ {
855
+ ref,
856
+ className: cn(
857
+ "text-sm text-[var(--color-muted-foreground)] leading-normal",
858
+ className
859
+ ),
860
+ ...props
861
+ }
862
+ ));
863
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
864
+ var DialogForm = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx9(
865
+ "form",
866
+ {
867
+ ref,
868
+ className: cn("flex flex-col gap-4", className),
869
+ ...props
870
+ }
871
+ ));
872
+ DialogForm.displayName = "DialogForm";
873
+
874
+ // src/components/ui/tabs.tsx
875
+ import * as React8 from "react";
876
+ import * as TabsPrimitive from "@radix-ui/react-tabs";
877
+ import { cva as cva4 } from "class-variance-authority";
878
+ import { jsx as jsx10, jsxs as jsxs4 } from "react/jsx-runtime";
879
+ var Tabs = React8.forwardRef(({ vertical = false, ...props }, ref) => /* @__PURE__ */ jsx10(
880
+ TabsPrimitive.Root,
881
+ {
882
+ ref,
883
+ orientation: vertical ? "vertical" : "horizontal",
884
+ ...props
885
+ }
886
+ ));
887
+ Tabs.displayName = TabsPrimitive.Root.displayName;
888
+ var tabsListVariants = cva4(
889
+ "flex items-center justify-start transition-all duration-200",
890
+ {
891
+ variants: {
892
+ variant: {
893
+ default: "bg-[var(--color-accent)] rounded-[var(--radius-sm)] p-1 text-[var(--color-muted-foreground)]",
894
+ pills: "bg-transparent gap-2 p-0 text-[var(--color-muted-foreground)]",
895
+ underline: "bg-transparent border-b border-[var(--color-border)] gap-4 text-[var(--color-muted-foreground)]",
896
+ cards: "bg-transparent gap-2 p-0 text-[var(--color-muted-foreground)]",
897
+ minimal: "bg-transparent gap-1 p-0 text-[var(--color-muted-foreground)]"
898
+ },
899
+ orientation: {
900
+ horizontal: "flex-row",
901
+ vertical: "flex-col items-start gap-1"
902
+ },
903
+ fullWidth: {
904
+ true: "w-full"
905
+ }
906
+ },
907
+ defaultVariants: {
908
+ variant: "default",
909
+ orientation: "horizontal",
910
+ fullWidth: false
911
+ }
912
+ }
913
+ );
914
+ var TabsList = React8.forwardRef(({ className, variant, orientation, fullWidth, ...props }, ref) => /* @__PURE__ */ jsx10(
915
+ TabsPrimitive.List,
916
+ {
917
+ ref,
918
+ className: cn(tabsListVariants({ variant, orientation, fullWidth, className })),
919
+ ...props
920
+ }
921
+ ));
922
+ TabsList.displayName = TabsPrimitive.List.displayName;
923
+ var tabsTriggerVariants = cva4(
924
+ "inline-flex items-center justify-center whitespace-nowrap font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]/30 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
925
+ {
926
+ variants: {
927
+ variant: {
928
+ default: "rounded-[var(--radius-sm)] data-[state=active]:bg-[var(--color-background)] data-[state=active]:text-[var(--color-foreground)] data-[state=active]:shadow-sm",
929
+ underline: "rounded-none border-b-2 border-transparent pb-2 data-[state=active]:border-[var(--color-primary)] data-[state=active]:bg-transparent data-[state=active]:text-[var(--color-foreground)]",
930
+ pills: "rounded-full bg-[var(--color-accent)] hover:bg-[var(--color-accent)]/80 data-[state=active]:bg-[var(--color-primary)] data-[state=active]:text-[var(--color-primary-foreground)]",
931
+ cards: "rounded-[var(--radius-sm)] bg-[var(--color-accent)]/50 hover:bg-[var(--color-accent)] data-[state=active]:bg-[var(--color-background)] data-[state=active]:text-[var(--color-foreground)] data-[state=active]:shadow-md",
932
+ minimal: "rounded-sm bg-transparent hover:bg-[var(--color-accent)]/30 data-[state=active]:bg-transparent data-[state=active]:text-[var(--color-foreground)] data-[state=active]:underline data-[state=active]:underline-offset-4"
933
+ },
934
+ size: {
935
+ sm: "h-7 px-2 text-[var(--font-size-xs)]",
936
+ md: "h-9 px-3 py-1.5 text-[var(--font-size-sm)]",
937
+ lg: "h-10 px-4 py-2 text-[var(--font-size-base)]"
938
+ },
939
+ orientation: {
940
+ horizontal: "",
941
+ vertical: "justify-start w-full text-left"
942
+ },
943
+ fullWidth: {
944
+ true: "w-full"
945
+ }
946
+ },
947
+ defaultVariants: {
948
+ variant: "default",
949
+ size: "md",
950
+ orientation: "horizontal",
951
+ fullWidth: false
952
+ }
953
+ }
954
+ );
955
+ var TabsTrigger = React8.forwardRef(({
956
+ className,
957
+ variant,
958
+ size,
959
+ icon,
960
+ iconPosition = "left",
961
+ badge,
962
+ fadeTabs = false,
963
+ orientation,
964
+ fullWidth,
965
+ children,
966
+ ...props
967
+ }, ref) => /* @__PURE__ */ jsxs4(
968
+ TabsPrimitive.Trigger,
969
+ {
970
+ ref,
971
+ className: cn(
972
+ tabsTriggerVariants({ variant, size, orientation, fullWidth }),
973
+ fadeTabs && "data-[state=inactive]:opacity-60",
974
+ className
975
+ ),
976
+ ...props,
977
+ children: [
978
+ icon && iconPosition === "left" && /* @__PURE__ */ jsx10("span", { className: "mr-2", children: icon }),
979
+ children,
980
+ icon && iconPosition === "right" && /* @__PURE__ */ jsx10("span", { className: "ml-2", children: icon }),
981
+ badge && /* @__PURE__ */ jsx10("span", { className: "ml-2", children: badge })
982
+ ]
983
+ }
984
+ ));
985
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
986
+ var TabsContent = React8.forwardRef(({ className, animated = false, ...props }, ref) => /* @__PURE__ */ jsx10(
987
+ TabsPrimitive.Content,
988
+ {
989
+ ref,
990
+ className: cn(
991
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)]/30 focus-visible:ring-offset-2",
992
+ animated && "data-[state=active]:animate-fadeIn data-[state=inactive]:animate-fadeOut",
993
+ className
994
+ ),
995
+ ...props
996
+ }
997
+ ));
998
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
999
+
1000
+ // src/components/ui/avatar.tsx
1001
+ import * as React9 from "react";
1002
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
1003
+ import { cva as cva5 } from "class-variance-authority";
1004
+ import { jsx as jsx11, jsxs as jsxs5 } from "react/jsx-runtime";
1005
+ var avatarVariants = cva5(
1006
+ "relative flex shrink-0 overflow-hidden",
1007
+ {
1008
+ variants: {
1009
+ size: {
1010
+ default: "h-10 w-10",
1011
+ xs: "h-6 w-6",
1012
+ sm: "h-8 w-8",
1013
+ md: "h-10 w-10",
1014
+ lg: "h-12 w-12",
1015
+ xl: "h-16 w-16",
1016
+ "2xl": "h-20 w-20"
1017
+ },
1018
+ radius: {
1019
+ default: "rounded-full",
1020
+ sm: "rounded-[var(--radius-sm)]",
1021
+ lg: "rounded-[var(--radius-lg)]",
1022
+ full: "rounded-full",
1023
+ none: "rounded-none"
1024
+ },
1025
+ variant: {
1026
+ default: "",
1027
+ ring: "ring-2 ring-[var(--color-border)]",
1028
+ ringOffset: "ring-2 ring-[var(--color-border)] ring-offset-2 ring-offset-[var(--color-background)]",
1029
+ border: "border-2 border-[var(--color-border)]"
1030
+ }
1031
+ },
1032
+ defaultVariants: {
1033
+ size: "default",
1034
+ radius: "default",
1035
+ variant: "default"
1036
+ }
1037
+ }
1038
+ );
1039
+ var Avatar = React9.forwardRef(({ className, size, radius, variant, ...props }, ref) => /* @__PURE__ */ jsx11(
1040
+ AvatarPrimitive.Root,
1041
+ {
1042
+ ref,
1043
+ className: cn(avatarVariants({ size, radius, variant }), className),
1044
+ ...props
1045
+ }
1046
+ ));
1047
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
1048
+ var AvatarImage = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx11(
1049
+ AvatarPrimitive.Image,
1050
+ {
1051
+ ref,
1052
+ className: cn("aspect-square h-full w-full", className),
1053
+ ...props
1054
+ }
1055
+ ));
1056
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
1057
+ var AvatarFallback = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx11(
1058
+ AvatarPrimitive.Fallback,
1059
+ {
1060
+ ref,
1061
+ className: cn(
1062
+ "flex h-full w-full items-center justify-center bg-[var(--color-accent)] text-[var(--color-foreground)]",
1063
+ className
1064
+ ),
1065
+ ...props
1066
+ }
1067
+ ));
1068
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
1069
+ var AvatarGroup = React9.forwardRef(
1070
+ ({ className, limit, avatars, overlapOffset = -8, ...props }, ref) => {
1071
+ const visibleAvatars = limit ? avatars.slice(0, limit) : avatars;
1072
+ const remainingCount = limit ? Math.max(0, avatars.length - limit) : 0;
1073
+ return /* @__PURE__ */ jsx11(
1074
+ "div",
1075
+ {
1076
+ ref,
1077
+ className: cn("flex items-center", className),
1078
+ ...props,
1079
+ children: /* @__PURE__ */ jsxs5("div", { className: "flex", children: [
1080
+ visibleAvatars.map((avatar, index) => /* @__PURE__ */ jsx11(
1081
+ "div",
1082
+ {
1083
+ className: "relative",
1084
+ style: {
1085
+ marginLeft: index === 0 ? 0 : `${overlapOffset}px`,
1086
+ zIndex: visibleAvatars.length - index
1087
+ },
1088
+ children: avatar
1089
+ },
1090
+ index
1091
+ )),
1092
+ remainingCount > 0 && /* @__PURE__ */ jsx11(
1093
+ "div",
1094
+ {
1095
+ className: "relative z-0",
1096
+ style: { marginLeft: `${overlapOffset}px` },
1097
+ children: /* @__PURE__ */ jsx11(Avatar, { variant: "border", children: /* @__PURE__ */ jsxs5(AvatarFallback, { children: [
1098
+ "+",
1099
+ remainingCount
1100
+ ] }) })
1101
+ }
1102
+ )
1103
+ ] })
1104
+ }
1105
+ );
1106
+ }
1107
+ );
1108
+ AvatarGroup.displayName = "AvatarGroup";
1109
+
1110
+ // src/components/ui/alert.tsx
1111
+ import * as React10 from "react";
1112
+ import { cva as cva6 } from "class-variance-authority";
1113
+ import { AlertCircle, AlertTriangle, Info, Check as Check3, X as X2 } from "lucide-react";
1114
+ import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
1115
+ var alertVariants = cva6(
1116
+ "relative w-full flex items-center gap-3 p-4 border text-[var(--color-foreground)] [&>svg]:shrink-0",
1117
+ {
1118
+ variants: {
1119
+ variant: {
1120
+ default: "bg-[var(--color-background)] text-[var(--color-foreground)] border-[var(--color-border)]",
1121
+ primary: "bg-[var(--color-primary)]/10 text-[var(--color-primary)] border-[var(--color-primary)]/30",
1122
+ success: "bg-[var(--color-success)]/10 text-[var(--color-success)] border-[var(--color-success)]/30",
1123
+ warning: "bg-[var(--color-warning)]/10 text-[var(--color-warning)] border-[var(--color-warning)]/30",
1124
+ error: "bg-[var(--color-error)]/10 text-[var(--color-error)] border-[var(--color-error)]/30",
1125
+ info: "bg-[var(--color-info)]/10 text-[var(--color-info)] border-[var(--color-info)]/30"
1126
+ },
1127
+ size: {
1128
+ sm: "py-2 text-[var(--font-size-xs)]",
1129
+ default: "py-3 text-[var(--font-size-sm)]",
1130
+ lg: "py-4 text-[var(--font-size-base)]"
1131
+ },
1132
+ radius: {
1133
+ none: "rounded-none",
1134
+ sm: "rounded-[var(--radius-sm)]",
1135
+ default: "rounded-[var(--radius-md)]",
1136
+ lg: "rounded-[var(--radius-lg)]",
1137
+ full: "rounded-full"
1138
+ },
1139
+ withClose: {
1140
+ true: "pr-10"
1141
+ }
1142
+ },
1143
+ defaultVariants: {
1144
+ variant: "default",
1145
+ size: "default",
1146
+ radius: "default",
1147
+ withClose: false
1148
+ }
1149
+ }
1150
+ );
1151
+ var Alert = React10.forwardRef(
1152
+ ({ className, variant = "default", size, radius, hideIcon = false, closable = false, onClose, children, ...props }, ref) => {
1153
+ const Icon2 = React10.useMemo(() => {
1154
+ switch (variant) {
1155
+ case "success":
1156
+ return Check3;
1157
+ case "warning":
1158
+ return AlertTriangle;
1159
+ case "error":
1160
+ return AlertCircle;
1161
+ case "info":
1162
+ return Info;
1163
+ default:
1164
+ return Info;
1165
+ }
1166
+ }, [variant]);
1167
+ return /* @__PURE__ */ jsxs6(
1168
+ "div",
1169
+ {
1170
+ ref,
1171
+ role: "alert",
1172
+ className: cn(alertVariants({ variant, size, radius, withClose: closable }), className),
1173
+ ...props,
1174
+ children: [
1175
+ !hideIcon && /* @__PURE__ */ jsx12(Icon2, { className: "h-5 w-5" }),
1176
+ /* @__PURE__ */ jsx12("div", { className: "flex-1", children }),
1177
+ closable && onClose && /* @__PURE__ */ jsx12(
1178
+ "button",
1179
+ {
1180
+ onClick: onClose,
1181
+ className: "absolute right-3 top-3 inline-flex h-6 w-6 items-center justify-center rounded-full opacity-70 transition-opacity hover:opacity-100",
1182
+ "aria-label": "Kapat",
1183
+ children: /* @__PURE__ */ jsx12(X2, { className: "h-4 w-4" })
1184
+ }
1185
+ )
1186
+ ]
1187
+ }
1188
+ );
1189
+ }
1190
+ );
1191
+ Alert.displayName = "Alert";
1192
+ var AlertTitle = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
1193
+ "h5",
1194
+ {
1195
+ ref,
1196
+ className: cn("font-semibold leading-tight tracking-tight mb-1", className),
1197
+ ...props
1198
+ }
1199
+ ));
1200
+ AlertTitle.displayName = "AlertTitle";
1201
+ var AlertDescription = React10.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx12(
1202
+ "div",
1203
+ {
1204
+ ref,
1205
+ className: cn("leading-5 text-[var(--color-muted-foreground)]", className),
1206
+ ...props
1207
+ }
1208
+ ));
1209
+ AlertDescription.displayName = "AlertDescription";
1210
+
1211
+ // src/components/ui/toast.tsx
1212
+ import * as React11 from "react";
1213
+ import { cva as cva7 } from "class-variance-authority";
1214
+ import { X as X3, AlertCircle as AlertCircle2, Check as Check4, AlertTriangle as AlertTriangle2, Info as Info2 } from "lucide-react";
1215
+ import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
1216
+ var ToastProvider = React11.createContext(null);
1217
+ var useToast = () => {
1218
+ const context = React11.useContext(ToastProvider);
1219
+ if (!context) {
1220
+ throw new Error("useToast must be used within a ToastProvider");
1221
+ }
1222
+ return context;
1223
+ };
1224
+ var toastVariants = cva7(
1225
+ "group pointer-events-auto relative flex w-full items-center justify-between gap-2 overflow-hidden border p-4 shadow-md transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full",
1226
+ {
1227
+ variants: {
1228
+ variant: {
1229
+ default: "bg-[var(--color-background)] border-[var(--color-border)]",
1230
+ primary: "border-[var(--color-primary)]/50 bg-[var(--color-primary)]/10",
1231
+ success: "border-[var(--color-success)]/50 bg-[var(--color-success)]/10",
1232
+ warning: "border-[var(--color-warning)]/50 bg-[var(--color-warning)]/10",
1233
+ error: "border-[var(--color-error)]/50 bg-[var(--color-error)]/10",
1234
+ info: "border-[var(--color-info)]/50 bg-[var(--color-info)]/10",
1235
+ destructive: "destructive group border-[var(--color-error)] bg-[var(--color-error)] text-[var(--color-error-foreground)]"
1236
+ },
1237
+ size: {
1238
+ sm: "text-[var(--font-size-xs)]",
1239
+ default: "text-[var(--font-size-sm)]",
1240
+ lg: "text-[var(--font-size-base)]"
1241
+ },
1242
+ radius: {
1243
+ none: "rounded-none",
1244
+ sm: "rounded-[var(--radius-sm)]",
1245
+ default: "rounded-[var(--radius-md)]",
1246
+ lg: "rounded-[var(--radius-lg)]",
1247
+ full: "rounded-full"
1248
+ }
1249
+ },
1250
+ defaultVariants: {
1251
+ variant: "default",
1252
+ size: "default",
1253
+ radius: "default"
1254
+ }
1255
+ }
1256
+ );
1257
+ var Toast = ({
1258
+ className,
1259
+ variant,
1260
+ size,
1261
+ radius,
1262
+ title,
1263
+ description,
1264
+ action,
1265
+ onClose,
1266
+ autoClose = true,
1267
+ duration = 5e3,
1268
+ hideIcon = false,
1269
+ showProgress = false,
1270
+ ...props
1271
+ }) => {
1272
+ const [progress, setProgress] = React11.useState(100);
1273
+ const timerRef = React11.useRef(void 0);
1274
+ const Icon2 = React11.useMemo(() => {
1275
+ switch (variant) {
1276
+ case "success":
1277
+ return Check4;
1278
+ case "warning":
1279
+ return AlertTriangle2;
1280
+ case "error":
1281
+ case "destructive":
1282
+ return AlertCircle2;
1283
+ case "info":
1284
+ return Info2;
1285
+ default:
1286
+ return null;
1287
+ }
1288
+ }, [variant]);
1289
+ React11.useEffect(() => {
1290
+ if (autoClose) {
1291
+ const startTime = Date.now();
1292
+ const endTime = startTime + duration;
1293
+ const updateProgress = () => {
1294
+ const now = Date.now();
1295
+ const remaining = endTime - now;
1296
+ const newProgress = remaining / duration * 100;
1297
+ setProgress(Math.max(0, newProgress));
1298
+ if (remaining > 0) {
1299
+ timerRef.current = setTimeout(updateProgress, 16);
1300
+ } else if (onClose) {
1301
+ onClose();
1302
+ }
1303
+ };
1304
+ updateProgress();
1305
+ }
1306
+ return () => {
1307
+ if (timerRef.current) {
1308
+ clearTimeout(timerRef.current);
1309
+ }
1310
+ };
1311
+ }, [autoClose, duration, onClose]);
1312
+ const textColorClass = variant === "default" ? "text-[var(--color-foreground)]" : variant === "destructive" ? "text-[var(--color-error-foreground)]" : `text-[var(--color-${variant})]`;
1313
+ return /* @__PURE__ */ jsxs7(
1314
+ "div",
1315
+ {
1316
+ className: cn(toastVariants({ variant, size, radius }), className),
1317
+ ...props,
1318
+ children: [
1319
+ /* @__PURE__ */ jsxs7("div", { className: "flex gap-3 items-start", children: [
1320
+ !hideIcon && Icon2 && /* @__PURE__ */ jsx13(
1321
+ Icon2,
1322
+ {
1323
+ className: cn(
1324
+ "h-5 w-5",
1325
+ textColorClass
1326
+ )
1327
+ }
1328
+ ),
1329
+ /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-1", children: [
1330
+ title && /* @__PURE__ */ jsx13("div", { className: cn("font-medium leading-none tracking-tight", textColorClass), children: title }),
1331
+ description && /* @__PURE__ */ jsx13("div", { className: cn("text-[var(--color-muted-foreground)] leading-normal", {
1332
+ "text-[var(--color-error-foreground)]/90": variant === "destructive"
1333
+ }), children: description })
1334
+ ] })
1335
+ ] }),
1336
+ action,
1337
+ onClose && /* @__PURE__ */ jsx13(
1338
+ "button",
1339
+ {
1340
+ onClick: onClose,
1341
+ className: cn(
1342
+ "absolute right-2 top-2 rounded-[var(--radius-sm)] p-1 transition-opacity hover:opacity-100 opacity-70",
1343
+ textColorClass
1344
+ ),
1345
+ children: /* @__PURE__ */ jsx13(X3, { className: "h-4 w-4" })
1346
+ }
1347
+ ),
1348
+ autoClose && showProgress && /* @__PURE__ */ jsx13("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-[var(--color-accent)]/50", children: /* @__PURE__ */ jsx13(
1349
+ "div",
1350
+ {
1351
+ className: cn(
1352
+ "h-full transition-all",
1353
+ variant === "default" ? "bg-[var(--color-primary)]" : `bg-[var(--color-${variant === "destructive" ? "error" : variant})]`
1354
+ ),
1355
+ style: { width: `${progress}%` }
1356
+ }
1357
+ ) })
1358
+ ]
1359
+ }
1360
+ );
1361
+ };
1362
+ Toast.displayName = "Toast";
1363
+ var ToastContainer = ({
1364
+ className,
1365
+ position = "bottom-right",
1366
+ gap = 8,
1367
+ // maxToasts parametresi ileriki versiyonlarda kullanılacak
1368
+ ...props
1369
+ }) => {
1370
+ const positionClasses = {
1371
+ "top-right": "top-0 right-0 flex-col-reverse",
1372
+ "top-center": "top-0 left-1/2 -translate-x-1/2 flex-col-reverse",
1373
+ "top-left": "top-0 left-0 flex-col-reverse",
1374
+ "bottom-right": "bottom-0 right-0 flex-col",
1375
+ "bottom-center": "bottom-0 left-1/2 -translate-x-1/2 flex-col",
1376
+ "bottom-left": "bottom-0 left-0 flex-col"
1377
+ };
1378
+ return /* @__PURE__ */ jsx13(
1379
+ "div",
1380
+ {
1381
+ className: cn(
1382
+ "fixed z-[100] flex gap-2 p-4 md:max-w-[420px] w-full",
1383
+ positionClasses[position],
1384
+ className
1385
+ ),
1386
+ style: { gap: `${gap}px` },
1387
+ ...props
1388
+ }
1389
+ );
1390
+ };
1391
+ ToastContainer.displayName = "ToastContainer";
1392
+
1393
+ // src/components/ui/tooltip.tsx
1394
+ import * as React12 from "react";
1395
+ import { cva as cva8 } from "class-variance-authority";
1396
+ import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
1397
+ var tooltipContentVariants = cva8(
1398
+ "absolute z-50 overflow-hidden border text-[var(--font-size-xs)] opacity-0 transition-opacity duration-200 ease-in-out pointer-events-none",
1399
+ {
1400
+ variants: {
1401
+ variant: {
1402
+ default: "bg-[var(--color-background)] border-[var(--color-border)] text-[var(--color-foreground)]",
1403
+ primary: "bg-[var(--color-primary)] border-[var(--color-primary)] text-[var(--color-primary-foreground)]",
1404
+ secondary: "bg-[var(--color-secondary)] border-[var(--color-secondary)] text-[var(--color-secondary-foreground)]",
1405
+ success: "bg-[var(--color-success)] border-[var(--color-success)] text-white",
1406
+ warning: "bg-[var(--color-warning)] border-[var(--color-warning)] text-[var(--color-foreground)]",
1407
+ error: "bg-[var(--color-error)] border-[var(--color-error)] text-white",
1408
+ info: "bg-[var(--color-info)] border-[var(--color-info)] text-white"
1409
+ },
1410
+ size: {
1411
+ sm: "px-2 py-1 max-w-[200px]",
1412
+ default: "px-3 py-1.5 max-w-[300px]",
1413
+ lg: "px-4 py-2 max-w-[400px]"
1414
+ },
1415
+ radius: {
1416
+ none: "rounded-none",
1417
+ sm: "rounded-[var(--radius-sm)]",
1418
+ default: "rounded-[var(--radius-md)]",
1419
+ lg: "rounded-[var(--radius-lg)]",
1420
+ full: "rounded-full"
1421
+ },
1422
+ shadow: {
1423
+ sm: "shadow-sm",
1424
+ default: "shadow-md",
1425
+ lg: "shadow-lg",
1426
+ none: ""
1427
+ },
1428
+ side: {
1429
+ top: "bottom-full mb-2",
1430
+ bottom: "top-full mt-2",
1431
+ left: "right-full mr-2",
1432
+ right: "left-full ml-2"
1433
+ },
1434
+ align: {
1435
+ start: "",
1436
+ center: "",
1437
+ end: ""
1438
+ },
1439
+ visible: {
1440
+ true: "opacity-100",
1441
+ false: "opacity-0"
1442
+ },
1443
+ arrow: {
1444
+ true: 'after:content-[""] after:absolute after:w-2 after:h-2 after:rotate-45 after:border after:border-t-0 after:border-l-0',
1445
+ false: ""
1446
+ }
1447
+ },
1448
+ defaultVariants: {
1449
+ variant: "default",
1450
+ size: "default",
1451
+ radius: "default",
1452
+ shadow: "default",
1453
+ side: "top",
1454
+ align: "center",
1455
+ visible: false,
1456
+ arrow: true
1457
+ },
1458
+ compoundVariants: [
1459
+ {
1460
+ side: "top",
1461
+ arrow: true,
1462
+ className: "after:bottom-[-5px] after:border-r-[var(--color-border)] after:border-b-[var(--color-border)] after:bg-[var(--color-background)]"
1463
+ },
1464
+ {
1465
+ side: "bottom",
1466
+ arrow: true,
1467
+ className: "after:top-[-5px] after:border-t-[var(--color-border)] after:border-l-[var(--color-border)] after:bg-[var(--color-background)]"
1468
+ },
1469
+ {
1470
+ side: "left",
1471
+ arrow: true,
1472
+ className: "after:right-[-5px] after:border-t-[var(--color-border)] after:border-r-[var(--color-border)] after:bg-[var(--color-background)]"
1473
+ },
1474
+ {
1475
+ side: "right",
1476
+ arrow: true,
1477
+ className: "after:left-[-5px] after:border-b-[var(--color-border)] after:border-l-[var(--color-border)] after:bg-[var(--color-background)]"
1478
+ },
1479
+ {
1480
+ align: "center",
1481
+ side: "top",
1482
+ className: "left-1/2 -translate-x-1/2 after:left-1/2 after:-translate-x-1/2"
1483
+ },
1484
+ {
1485
+ align: "center",
1486
+ side: "bottom",
1487
+ className: "left-1/2 -translate-x-1/2 after:left-1/2 after:-translate-x-1/2"
1488
+ },
1489
+ {
1490
+ align: "center",
1491
+ side: "left",
1492
+ className: "top-1/2 -translate-y-1/2 after:top-1/2 after:-translate-y-1/2"
1493
+ },
1494
+ {
1495
+ align: "center",
1496
+ side: "right",
1497
+ className: "top-1/2 -translate-y-1/2 after:top-1/2 after:-translate-y-1/2"
1498
+ },
1499
+ {
1500
+ align: "start",
1501
+ side: "top",
1502
+ className: "left-0 after:left-3"
1503
+ },
1504
+ {
1505
+ align: "start",
1506
+ side: "bottom",
1507
+ className: "left-0 after:left-3"
1508
+ },
1509
+ {
1510
+ align: "start",
1511
+ side: "left",
1512
+ className: "top-0 after:top-3"
1513
+ },
1514
+ {
1515
+ align: "start",
1516
+ side: "right",
1517
+ className: "top-0 after:top-3"
1518
+ },
1519
+ {
1520
+ align: "end",
1521
+ side: "top",
1522
+ className: "right-0 after:right-3"
1523
+ },
1524
+ {
1525
+ align: "end",
1526
+ side: "bottom",
1527
+ className: "right-0 after:right-3"
1528
+ },
1529
+ {
1530
+ align: "end",
1531
+ side: "left",
1532
+ className: "bottom-0 after:bottom-3"
1533
+ },
1534
+ {
1535
+ align: "end",
1536
+ side: "right",
1537
+ className: "bottom-0 after:bottom-3"
1538
+ }
1539
+ ]
1540
+ }
1541
+ );
1542
+ function Tooltip({
1543
+ children,
1544
+ content,
1545
+ delayDuration = 300,
1546
+ side = "top",
1547
+ align = "center",
1548
+ variant,
1549
+ size,
1550
+ radius,
1551
+ shadow,
1552
+ disabled = false,
1553
+ contentClassName,
1554
+ triggerClassName,
1555
+ ...props
1556
+ }) {
1557
+ const [visible, setVisible] = React12.useState(false);
1558
+ const timeoutRef = React12.useRef(void 0);
1559
+ const showTooltip = () => {
1560
+ if (timeoutRef.current) {
1561
+ clearTimeout(timeoutRef.current);
1562
+ }
1563
+ timeoutRef.current = setTimeout(() => {
1564
+ setVisible(true);
1565
+ }, delayDuration);
1566
+ };
1567
+ const hideTooltip = () => {
1568
+ if (timeoutRef.current) {
1569
+ clearTimeout(timeoutRef.current);
1570
+ }
1571
+ setVisible(false);
1572
+ };
1573
+ React12.useEffect(() => {
1574
+ return () => {
1575
+ if (timeoutRef.current) {
1576
+ clearTimeout(timeoutRef.current);
1577
+ }
1578
+ };
1579
+ }, []);
1580
+ if (disabled) {
1581
+ return /* @__PURE__ */ jsx14(Fragment2, { children });
1582
+ }
1583
+ return /* @__PURE__ */ jsxs8(
1584
+ "div",
1585
+ {
1586
+ className: "relative inline-flex",
1587
+ onMouseEnter: showTooltip,
1588
+ onMouseLeave: hideTooltip,
1589
+ onFocus: showTooltip,
1590
+ onBlur: hideTooltip,
1591
+ children: [
1592
+ /* @__PURE__ */ jsx14("div", { className: cn("inline-flex", triggerClassName || ""), children }),
1593
+ /* @__PURE__ */ jsx14(
1594
+ "div",
1595
+ {
1596
+ className: cn(
1597
+ tooltipContentVariants({
1598
+ variant,
1599
+ size,
1600
+ radius,
1601
+ shadow,
1602
+ side,
1603
+ align,
1604
+ visible,
1605
+ arrow: true
1606
+ }),
1607
+ contentClassName
1608
+ ),
1609
+ role: "tooltip",
1610
+ ...props,
1611
+ children: content
1612
+ }
1613
+ )
1614
+ ]
1615
+ }
1616
+ );
1617
+ }
1618
+ Tooltip.displayName = "Tooltip";
1619
+
1620
+ // src/components/ui/checkbox.tsx
1621
+ import * as React13 from "react";
1622
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
1623
+ import { Check as Check5, Minus } from "lucide-react";
1624
+ import { cva as cva9 } from "class-variance-authority";
1625
+ import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
1626
+ var checkboxVariants = cva9(
1627
+ "peer shrink-0 border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:text-[var(--color-primary-foreground)]",
1628
+ {
1629
+ variants: {
1630
+ variant: {
1631
+ default: "border-[var(--color-border)] bg-[var(--color-background)] data-[state=checked]:bg-[var(--color-primary)] data-[state=checked]:border-[var(--color-primary)]",
1632
+ outline: "border-[var(--color-border)] bg-transparent data-[state=checked]:bg-[var(--color-primary)] data-[state=checked]:border-[var(--color-primary)]",
1633
+ muted: "border-[var(--color-border)] bg-[var(--color-accent)] data-[state=checked]:bg-[var(--color-primary)] data-[state=checked]:border-[var(--color-primary)]",
1634
+ ghost: "border-transparent bg-transparent hover:bg-[var(--color-accent)] data-[state=checked]:bg-[var(--color-primary)] data-[state=checked]:border-[var(--color-primary)]"
1635
+ },
1636
+ size: {
1637
+ sm: "h-3.5 w-3.5",
1638
+ default: "h-4 w-4",
1639
+ md: "h-5 w-5",
1640
+ lg: "h-6 w-6"
1641
+ },
1642
+ radius: {
1643
+ none: "rounded-none",
1644
+ sm: "rounded-[var(--radius-sm)]",
1645
+ default: "rounded-[var(--radius-sm)]",
1646
+ md: "rounded-[var(--radius-md)]",
1647
+ full: "rounded-full"
1648
+ },
1649
+ animation: {
1650
+ none: "",
1651
+ subtle: "transition-all duration-200",
1652
+ default: "transition-all duration-200",
1653
+ bounce: "transition-all duration-200"
1654
+ }
1655
+ },
1656
+ defaultVariants: {
1657
+ variant: "default",
1658
+ size: "default",
1659
+ radius: "default",
1660
+ animation: "default"
1661
+ }
1662
+ }
1663
+ );
1664
+ var Checkbox = React13.forwardRef(({
1665
+ className,
1666
+ variant,
1667
+ size,
1668
+ radius,
1669
+ animation,
1670
+ indeterminate = false,
1671
+ icon,
1672
+ checked,
1673
+ ...props
1674
+ }, ref) => {
1675
+ const [isIndeterminate, setIsIndeterminate] = React13.useState(indeterminate);
1676
+ React13.useEffect(() => {
1677
+ setIsIndeterminate(indeterminate);
1678
+ }, [indeterminate]);
1679
+ const effectiveChecked = isIndeterminate ? false : checked;
1680
+ return /* @__PURE__ */ jsx15(
1681
+ CheckboxPrimitive.Root,
1682
+ {
1683
+ ref,
1684
+ checked: effectiveChecked,
1685
+ className: cn(checkboxVariants({ variant, size, radius, animation }), className),
1686
+ ...props,
1687
+ children: /* @__PURE__ */ jsx15(
1688
+ CheckboxPrimitive.Indicator,
1689
+ {
1690
+ className: cn(
1691
+ "flex items-center justify-center text-current",
1692
+ animation === "bounce" && "data-[state=checked]:animate-bounce"
1693
+ ),
1694
+ children: isIndeterminate ? /* @__PURE__ */ jsx15(Minus, { className: "h-[65%] w-[65%]" }) : icon ? icon : /* @__PURE__ */ jsx15(Check5, { className: "h-[65%] w-[65%]" })
1695
+ }
1696
+ )
1697
+ }
1698
+ );
1699
+ });
1700
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
1701
+ var CheckboxGroup = React13.forwardRef(
1702
+ ({ className, orientation = "vertical", spacing = "1rem", children, ...props }, ref) => {
1703
+ return /* @__PURE__ */ jsx15(
1704
+ "div",
1705
+ {
1706
+ ref,
1707
+ className: cn(
1708
+ "flex",
1709
+ orientation === "vertical" ? "flex-col" : "flex-row flex-wrap",
1710
+ className
1711
+ ),
1712
+ style: { gap: spacing },
1713
+ role: "group",
1714
+ ...props,
1715
+ children
1716
+ }
1717
+ );
1718
+ }
1719
+ );
1720
+ CheckboxGroup.displayName = "CheckboxGroup";
1721
+ var CheckboxLabel = React13.forwardRef(
1722
+ ({ className, htmlFor, children, position = "end", disabled = false, ...props }, ref) => {
1723
+ return /* @__PURE__ */ jsx15(
1724
+ "label",
1725
+ {
1726
+ ref,
1727
+ htmlFor,
1728
+ className: cn(
1729
+ "text-[var(--font-size-sm)] font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
1730
+ position === "start" ? "mr-2" : "ml-2",
1731
+ disabled && "cursor-not-allowed opacity-70",
1732
+ className
1733
+ ),
1734
+ ...props,
1735
+ children
1736
+ }
1737
+ );
1738
+ }
1739
+ );
1740
+ CheckboxLabel.displayName = "CheckboxLabel";
1741
+ var CheckboxWithLabel = React13.forwardRef(({
1742
+ id,
1743
+ label,
1744
+ labelPosition = "end",
1745
+ labelClassName,
1746
+ ...checkboxProps
1747
+ }, ref) => {
1748
+ const checkboxId = id || `checkbox-${Math.random().toString(36).substring(2, 9)}`;
1749
+ return /* @__PURE__ */ jsxs9("div", { className: "flex items-center", children: [
1750
+ labelPosition === "start" && /* @__PURE__ */ jsx15(
1751
+ CheckboxLabel,
1752
+ {
1753
+ htmlFor: checkboxId,
1754
+ position: "start",
1755
+ disabled: checkboxProps.disabled,
1756
+ className: labelClassName,
1757
+ children: label
1758
+ }
1759
+ ),
1760
+ /* @__PURE__ */ jsx15(Checkbox, { ref, id: checkboxId, ...checkboxProps }),
1761
+ labelPosition === "end" && /* @__PURE__ */ jsx15(
1762
+ CheckboxLabel,
1763
+ {
1764
+ htmlFor: checkboxId,
1765
+ position: "end",
1766
+ disabled: checkboxProps.disabled,
1767
+ className: labelClassName,
1768
+ children: label
1769
+ }
1770
+ )
1771
+ ] });
1772
+ });
1773
+ CheckboxWithLabel.displayName = "CheckboxWithLabel";
1774
+
1775
+ // src/components/ui/radio-group.tsx
1776
+ import * as React14 from "react";
1777
+ import { Circle } from "lucide-react";
1778
+ import { cva as cva10 } from "class-variance-authority";
1779
+ import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
1780
+ var radioGroupItemVariants = cva10(
1781
+ "aspect-square border focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
1782
+ {
1783
+ variants: {
1784
+ variant: {
1785
+ default: "border-[var(--color-border)] bg-[var(--color-background)] text-[var(--color-primary)]",
1786
+ outline: "border-[var(--color-border)] bg-transparent text-[var(--color-primary)]",
1787
+ filled: "border-[var(--color-primary)] bg-[var(--color-primary)]/10 text-[var(--color-primary)]"
1788
+ },
1789
+ size: {
1790
+ sm: "h-3.5 w-3.5",
1791
+ default: "h-4 w-4",
1792
+ md: "h-5 w-5",
1793
+ lg: "h-6 w-6"
1794
+ }
1795
+ },
1796
+ defaultVariants: {
1797
+ variant: "default",
1798
+ size: "default"
1799
+ }
1800
+ }
1801
+ );
1802
+ var RadioGroupContext = React14.createContext({});
1803
+ var RadioGroup = React14.forwardRef(
1804
+ ({ className, value, onValueChange, disabled, name, ...props }, ref) => {
1805
+ return /* @__PURE__ */ jsx16(RadioGroupContext.Provider, { value: { value, onValueChange, disabled, name }, children: /* @__PURE__ */ jsx16(
1806
+ "div",
1807
+ {
1808
+ ref,
1809
+ role: "radiogroup",
1810
+ className: cn("grid gap-2", className),
1811
+ ...props
1812
+ }
1813
+ ) });
1814
+ }
1815
+ );
1816
+ RadioGroup.displayName = "RadioGroup";
1817
+ var RadioGroupItem = React14.forwardRef(({ className, variant, size, indicator, id, value, disabled, ...props }, ref) => {
1818
+ const radioGroup = React14.useContext(RadioGroupContext);
1819
+ const generatedId = React14.useId();
1820
+ const radioId = id || generatedId;
1821
+ const isChecked = radioGroup.value === value;
1822
+ const handleChange = (e) => {
1823
+ if (radioGroup.onValueChange) {
1824
+ radioGroup.onValueChange(e.target.value);
1825
+ }
1826
+ if (props.onChange) {
1827
+ props.onChange(e);
1828
+ }
1829
+ };
1830
+ return /* @__PURE__ */ jsxs10("div", { className: "relative flex items-center", children: [
1831
+ /* @__PURE__ */ jsx16(
1832
+ "input",
1833
+ {
1834
+ type: "radio",
1835
+ id: radioId,
1836
+ ref,
1837
+ value,
1838
+ checked: isChecked,
1839
+ disabled: disabled || radioGroup.disabled,
1840
+ name: radioGroup.name,
1841
+ onChange: handleChange,
1842
+ className: "sr-only",
1843
+ ...props
1844
+ }
1845
+ ),
1846
+ /* @__PURE__ */ jsx16(
1847
+ "label",
1848
+ {
1849
+ htmlFor: radioId,
1850
+ className: cn(
1851
+ radioGroupItemVariants({ variant, size }),
1852
+ "rounded-full",
1853
+ "focus-visible:ring-[var(--color-primary)]/50",
1854
+ "relative inline-flex shrink-0 cursor-pointer items-center justify-center overflow-hidden",
1855
+ disabled && "cursor-not-allowed opacity-50",
1856
+ className
1857
+ ),
1858
+ children: /* @__PURE__ */ jsx16("span", { className: cn(
1859
+ "absolute inset-0 pointer-events-none",
1860
+ isChecked && "flex items-center justify-center"
1861
+ ), children: isChecked && (indicator || /* @__PURE__ */ jsx16(Circle, { className: "h-[60%] w-[60%] fill-current text-current" })) })
1862
+ }
1863
+ )
1864
+ ] });
1865
+ });
1866
+ RadioGroupItem.displayName = "RadioGroupItem";
1867
+ var RadioLabel = React14.forwardRef(
1868
+ ({ className, htmlFor, children, disabled = false, ...props }, ref) => {
1869
+ return /* @__PURE__ */ jsx16(
1870
+ "label",
1871
+ {
1872
+ ref,
1873
+ htmlFor,
1874
+ className: cn(
1875
+ "text-[var(--font-size-sm)] font-medium leading-none ml-2 text-[var(--color-foreground)]",
1876
+ disabled && "cursor-not-allowed opacity-70",
1877
+ className
1878
+ ),
1879
+ ...props,
1880
+ children
1881
+ }
1882
+ );
1883
+ }
1884
+ );
1885
+ RadioLabel.displayName = "RadioLabel";
1886
+ var RadioItemWithLabel = React14.forwardRef(({
1887
+ id,
1888
+ label,
1889
+ labelClassName,
1890
+ ...radioProps
1891
+ }, ref) => {
1892
+ const radioId = id || `radio-${Math.random().toString(36).substring(2, 9)}`;
1893
+ return /* @__PURE__ */ jsxs10("div", { className: "flex items-center", children: [
1894
+ /* @__PURE__ */ jsx16(RadioGroupItem, { ref, id: radioId, ...radioProps }),
1895
+ /* @__PURE__ */ jsx16(
1896
+ RadioLabel,
1897
+ {
1898
+ htmlFor: radioId,
1899
+ disabled: radioProps.disabled,
1900
+ className: labelClassName,
1901
+ children: label
1902
+ }
1903
+ )
1904
+ ] });
1905
+ });
1906
+ RadioItemWithLabel.displayName = "RadioItemWithLabel";
1907
+
1908
+ // src/components/ui/progress.tsx
1909
+ import * as React15 from "react";
1910
+ import { cva as cva11 } from "class-variance-authority";
1911
+ import { jsx as jsx17, jsxs as jsxs11 } from "react/jsx-runtime";
1912
+ var progressVariants = cva11(
1913
+ "relative w-full overflow-hidden bg-[var(--color-muted)]",
1914
+ {
1915
+ variants: {
1916
+ variant: {
1917
+ default: "bg-[var(--color-muted)]",
1918
+ primary: "bg-[var(--color-primary)]/20",
1919
+ secondary: "bg-[var(--color-secondary)]/20",
1920
+ success: "bg-[var(--color-success)]/20",
1921
+ warning: "bg-[var(--color-warning)]/20",
1922
+ error: "bg-[var(--color-error)]/20"
1923
+ },
1924
+ size: {
1925
+ xs: "h-1",
1926
+ sm: "h-1.5",
1927
+ default: "h-2",
1928
+ md: "h-2.5",
1929
+ lg: "h-3",
1930
+ xl: "h-4"
1931
+ },
1932
+ radius: {
1933
+ none: "rounded-none",
1934
+ sm: "rounded-[var(--radius-sm)]",
1935
+ default: "rounded-[var(--radius-md)]",
1936
+ lg: "rounded-[var(--radius-lg)]",
1937
+ full: "rounded-full"
1938
+ },
1939
+ animation: {
1940
+ default: "[&>div]:transition-all [&>div]:duration-500",
1941
+ smooth: "[&>div]:transition-all [&>div]:duration-700",
1942
+ fast: "[&>div]:transition-all [&>div]:duration-300",
1943
+ none: ""
1944
+ }
1945
+ },
1946
+ defaultVariants: {
1947
+ variant: "default",
1948
+ size: "default",
1949
+ radius: "full",
1950
+ animation: "default"
1951
+ }
1952
+ }
1953
+ );
1954
+ var progressIndicatorVariants = cva11(
1955
+ "h-full w-full flex-1",
1956
+ {
1957
+ variants: {
1958
+ variant: {
1959
+ default: "bg-[var(--color-foreground)]",
1960
+ primary: "bg-[var(--color-primary)]",
1961
+ secondary: "bg-[var(--color-secondary)]",
1962
+ success: "bg-[var(--color-success)]",
1963
+ warning: "bg-[var(--color-warning)]",
1964
+ error: "bg-[var(--color-error)]"
1965
+ },
1966
+ animation: {
1967
+ default: "transition-all duration-500",
1968
+ smooth: "transition-all duration-700",
1969
+ fast: "transition-all duration-300",
1970
+ none: ""
1971
+ }
1972
+ },
1973
+ defaultVariants: {
1974
+ variant: "primary",
1975
+ animation: "default"
1976
+ }
1977
+ }
1978
+ );
1979
+ var Progress = React15.forwardRef(({
1980
+ className,
1981
+ value = 0,
1982
+ variant,
1983
+ size,
1984
+ radius,
1985
+ animation,
1986
+ indicatorVariant,
1987
+ showValueLabel = false,
1988
+ valueLabel,
1989
+ labelClassName,
1990
+ indeterminate = false,
1991
+ max = 100,
1992
+ ...props
1993
+ }, ref) => {
1994
+ const normalizedValue = Math.max(0, Math.min(value, max));
1995
+ const percentage = max > 0 ? normalizedValue / max * 100 : 0;
1996
+ const label = valueLabel || `${Math.round(percentage)}%`;
1997
+ return /* @__PURE__ */ jsxs11("div", { className: "w-full", children: [
1998
+ showValueLabel && /* @__PURE__ */ jsx17("div", { className: "flex justify-between items-center mb-1", children: /* @__PURE__ */ jsx17(
1999
+ "span",
2000
+ {
2001
+ className: cn(
2002
+ "text-[var(--font-size-sm)] font-medium text-[var(--color-muted-foreground)]",
2003
+ labelClassName
2004
+ ),
2005
+ children: label
2006
+ }
2007
+ ) }),
2008
+ /* @__PURE__ */ jsx17(
2009
+ "div",
2010
+ {
2011
+ ref,
2012
+ className: cn(progressVariants({ variant, size, radius, animation }), className),
2013
+ role: "progressbar",
2014
+ "aria-valuemin": 0,
2015
+ "aria-valuemax": max,
2016
+ "aria-valuenow": indeterminate ? void 0 : normalizedValue,
2017
+ ...props,
2018
+ children: /* @__PURE__ */ jsx17(
2019
+ "div",
2020
+ {
2021
+ className: cn(
2022
+ progressIndicatorVariants({ variant: indicatorVariant || variant, animation }),
2023
+ indeterminate && "animate-indeterminate-progress"
2024
+ ),
2025
+ style: indeterminate ? {} : { transform: `translateX(-${100 - percentage}%)` }
2026
+ }
2027
+ )
2028
+ }
2029
+ )
2030
+ ] });
2031
+ });
2032
+ Progress.displayName = "Progress";
2033
+
2034
+ // src/components/ui/skeleton.tsx
2035
+ import * as React16 from "react";
2036
+ import { cva as cva12 } from "class-variance-authority";
2037
+ import { jsx as jsx18, jsxs as jsxs12 } from "react/jsx-runtime";
2038
+ var skeletonVariants = cva12(
2039
+ "animate-pulse rounded-[var(--radius-md)]",
2040
+ {
2041
+ variants: {
2042
+ variant: {
2043
+ default: "bg-[var(--color-muted)]",
2044
+ primary: "bg-[var(--color-primary)]/10",
2045
+ secondary: "bg-[var(--color-secondary)]/10",
2046
+ accent: "bg-[var(--color-accent)]"
2047
+ },
2048
+ size: {
2049
+ default: "",
2050
+ sm: "scale-90",
2051
+ lg: "scale-110"
2052
+ },
2053
+ shape: {
2054
+ rect: "rounded-[var(--radius-md)]",
2055
+ circle: "rounded-full",
2056
+ pill: "rounded-full"
2057
+ },
2058
+ animation: {
2059
+ pulse: "animate-pulse",
2060
+ wave: "animate-shimmer overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_2s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/20 before:to-transparent",
2061
+ none: "animate-none"
2062
+ }
2063
+ },
2064
+ defaultVariants: {
2065
+ variant: "default",
2066
+ size: "default",
2067
+ shape: "rect",
2068
+ animation: "pulse"
2069
+ }
2070
+ }
2071
+ );
2072
+ var Skeleton = React16.forwardRef(
2073
+ ({
2074
+ className,
2075
+ variant,
2076
+ size,
2077
+ shape,
2078
+ animation,
2079
+ height,
2080
+ width,
2081
+ isLoaded = false,
2082
+ children,
2083
+ fadeInDuration = 400,
2084
+ style,
2085
+ ...props
2086
+ }, ref) => {
2087
+ if (isLoaded && children) {
2088
+ return /* @__PURE__ */ jsx18(
2089
+ "div",
2090
+ {
2091
+ ref,
2092
+ className: cn("animate-fade-in", className),
2093
+ style: {
2094
+ animationDuration: `${fadeInDuration}ms`,
2095
+ height,
2096
+ width,
2097
+ ...style
2098
+ },
2099
+ ...props,
2100
+ children
2101
+ }
2102
+ );
2103
+ }
2104
+ return /* @__PURE__ */ jsx18(
2105
+ "div",
2106
+ {
2107
+ ref,
2108
+ className: cn(
2109
+ skeletonVariants({ variant, size, shape, animation }),
2110
+ "relative",
2111
+ className
2112
+ ),
2113
+ style: {
2114
+ height,
2115
+ width,
2116
+ ...style
2117
+ },
2118
+ ...props
2119
+ }
2120
+ );
2121
+ }
2122
+ );
2123
+ Skeleton.displayName = "Skeleton";
2124
+ var SkeletonText = React16.forwardRef(
2125
+ ({
2126
+ className,
2127
+ lines = 3,
2128
+ lineHeight = "0.85rem",
2129
+ spacing = "0.5rem",
2130
+ lastLineWidth = 80,
2131
+ randomWidths = false,
2132
+ variant = "default",
2133
+ animation = "pulse",
2134
+ ...props
2135
+ }, ref) => {
2136
+ return /* @__PURE__ */ jsx18(
2137
+ "div",
2138
+ {
2139
+ ref,
2140
+ className: cn("flex flex-col", className),
2141
+ style: { gap: spacing },
2142
+ ...props,
2143
+ children: Array.from({ length: lines }).map((_, i) => {
2144
+ const isLastLine = i === lines - 1;
2145
+ const widthPercentage = isLastLine ? lastLineWidth : randomWidths ? Math.floor(Math.random() * 20) + 80 : 100;
2146
+ return /* @__PURE__ */ jsx18(
2147
+ Skeleton,
2148
+ {
2149
+ variant,
2150
+ animation,
2151
+ className: "w-full",
2152
+ style: {
2153
+ height: lineHeight,
2154
+ width: `${widthPercentage}%`
2155
+ }
2156
+ },
2157
+ i
2158
+ );
2159
+ })
2160
+ }
2161
+ );
2162
+ }
2163
+ );
2164
+ SkeletonText.displayName = "SkeletonText";
2165
+ var SkeletonAvatar = React16.forwardRef(
2166
+ ({
2167
+ className,
2168
+ size = "2.5rem",
2169
+ variant = "default",
2170
+ animation = "pulse",
2171
+ ...props
2172
+ }, ref) => {
2173
+ return /* @__PURE__ */ jsx18(
2174
+ Skeleton,
2175
+ {
2176
+ ref,
2177
+ variant,
2178
+ animation,
2179
+ shape: "circle",
2180
+ className: cn("shrink-0", className),
2181
+ style: {
2182
+ height: size,
2183
+ width: size
2184
+ },
2185
+ ...props
2186
+ }
2187
+ );
2188
+ }
2189
+ );
2190
+ SkeletonAvatar.displayName = "SkeletonAvatar";
2191
+ var SkeletonCard = React16.forwardRef(
2192
+ ({
2193
+ className,
2194
+ showHeader = true,
2195
+ contentLines = 3,
2196
+ showFooter = true,
2197
+ variant = "default",
2198
+ animation = "pulse",
2199
+ ...props
2200
+ }, ref) => {
2201
+ return /* @__PURE__ */ jsxs12(
2202
+ "div",
2203
+ {
2204
+ ref,
2205
+ className: cn(
2206
+ "overflow-hidden rounded-[var(--radius-md)] border border-[var(--color-border)] bg-[var(--color-background)] p-4",
2207
+ className
2208
+ ),
2209
+ ...props,
2210
+ children: [
2211
+ showHeader && /* @__PURE__ */ jsxs12("div", { className: "mb-4 flex items-center gap-4", children: [
2212
+ /* @__PURE__ */ jsx18(SkeletonAvatar, { size: "2.5rem", variant, animation }),
2213
+ /* @__PURE__ */ jsxs12("div", { className: "flex-1", children: [
2214
+ /* @__PURE__ */ jsx18(
2215
+ Skeleton,
2216
+ {
2217
+ variant,
2218
+ animation,
2219
+ className: "mb-2 h-4 w-1/3"
2220
+ }
2221
+ ),
2222
+ /* @__PURE__ */ jsx18(
2223
+ Skeleton,
2224
+ {
2225
+ variant,
2226
+ animation,
2227
+ className: "h-3 w-1/4"
2228
+ }
2229
+ )
2230
+ ] })
2231
+ ] }),
2232
+ /* @__PURE__ */ jsx18(
2233
+ SkeletonText,
2234
+ {
2235
+ lines: contentLines,
2236
+ variant,
2237
+ animation,
2238
+ className: "mb-4"
2239
+ }
2240
+ ),
2241
+ showFooter && /* @__PURE__ */ jsxs12("div", { className: "flex items-center justify-between mt-4 pt-4 border-t border-[var(--color-border)]", children: [
2242
+ /* @__PURE__ */ jsx18(
2243
+ Skeleton,
2244
+ {
2245
+ variant,
2246
+ animation,
2247
+ className: "h-4 w-1/4"
2248
+ }
2249
+ ),
2250
+ /* @__PURE__ */ jsx18(
2251
+ Skeleton,
2252
+ {
2253
+ variant,
2254
+ animation,
2255
+ className: "h-4 w-1/5"
2256
+ }
2257
+ )
2258
+ ] })
2259
+ ]
2260
+ }
2261
+ );
2262
+ }
2263
+ );
2264
+ SkeletonCard.displayName = "SkeletonCard";
2265
+
2266
+ // src/components/ui/popover.tsx
2267
+ import * as React17 from "react";
2268
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2269
+ import { cva as cva13 } from "class-variance-authority";
2270
+ import { Fragment as Fragment3, jsx as jsx19, jsxs as jsxs13 } from "react/jsx-runtime";
2271
+ var popoverContentVariants = cva13(
2272
+ "z-50 w-72 rounded-[var(--radius-md)] border border-[var(--color-border)] bg-[var(--color-background)] p-4 shadow-[var(--shadow-md)] outline-none 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",
2273
+ {
2274
+ variants: {
2275
+ variant: {
2276
+ default: "",
2277
+ destructive: "border-[var(--color-error)] bg-[var(--color-error)]/5",
2278
+ outline: "border-[var(--color-border)] bg-transparent",
2279
+ subtle: "border-transparent bg-[var(--color-muted)]/50"
2280
+ },
2281
+ size: {
2282
+ sm: "w-48 p-3",
2283
+ default: "w-72 p-4",
2284
+ lg: "w-96 p-5"
2285
+ },
2286
+ side: {
2287
+ top: "data-[side=top]:slide-in-from-bottom-2",
2288
+ right: "data-[side=right]:slide-in-from-left-2",
2289
+ bottom: "data-[side=bottom]:slide-in-from-top-2",
2290
+ left: "data-[side=left]:slide-in-from-right-2"
2291
+ },
2292
+ position: {
2293
+ pointerEventsNone: "pointer-events-none",
2294
+ default: ""
2295
+ },
2296
+ radius: {
2297
+ none: "rounded-none",
2298
+ sm: "rounded-[var(--radius-sm)]",
2299
+ default: "rounded-[var(--radius-md)]",
2300
+ lg: "rounded-[var(--radius-lg)]",
2301
+ full: "rounded-full"
2302
+ },
2303
+ shadow: {
2304
+ none: "shadow-none",
2305
+ sm: "shadow-[var(--shadow-sm)]",
2306
+ default: "shadow-[var(--shadow-md)]",
2307
+ md: "shadow-[var(--shadow-md)]",
2308
+ lg: "shadow-[var(--shadow-lg)]",
2309
+ xl: "shadow-[var(--shadow-xl)]"
2310
+ }
2311
+ },
2312
+ defaultVariants: {
2313
+ variant: "default",
2314
+ size: "default",
2315
+ radius: "default",
2316
+ shadow: "default"
2317
+ }
2318
+ }
2319
+ );
2320
+ var Popover = PopoverPrimitive.Root;
2321
+ var PopoverTrigger = PopoverPrimitive.Trigger;
2322
+ var PopoverAnchor = PopoverPrimitive.Anchor;
2323
+ var PopoverContent = React17.forwardRef(({
2324
+ className,
2325
+ variant,
2326
+ size,
2327
+ side,
2328
+ position,
2329
+ radius,
2330
+ shadow,
2331
+ backdrop = false,
2332
+ closeOnInteractOutside = true,
2333
+ overlayBackdrop = false,
2334
+ sideOffset = 4,
2335
+ ...props
2336
+ }, ref) => /* @__PURE__ */ jsxs13(Fragment3, { children: [
2337
+ overlayBackdrop && /* @__PURE__ */ jsx19("div", { className: "fixed inset-0 z-40 bg-[var(--color-overlay)] opacity-30" }),
2338
+ /* @__PURE__ */ jsx19(
2339
+ PopoverPrimitive.Content,
2340
+ {
2341
+ ref,
2342
+ sideOffset,
2343
+ collisionPadding: 8,
2344
+ onInteractOutside: (e) => {
2345
+ if (!closeOnInteractOutside) {
2346
+ e.preventDefault();
2347
+ }
2348
+ },
2349
+ className: cn(
2350
+ popoverContentVariants({
2351
+ variant,
2352
+ size,
2353
+ side,
2354
+ position,
2355
+ radius,
2356
+ shadow
2357
+ }),
2358
+ backdrop && "backdrop-blur-md bg-opacity-80",
2359
+ className
2360
+ ),
2361
+ ...props
2362
+ }
2363
+ )
2364
+ ] }));
2365
+ PopoverContent.displayName = PopoverPrimitive.Content.displayName;
2366
+ var PopoverClose = PopoverPrimitive.Close;
2367
+ var PopoverSeparator = ({ className, ...props }) => /* @__PURE__ */ jsx19(
2368
+ "div",
2369
+ {
2370
+ className: cn("my-2 h-px bg-[var(--color-border)]", className),
2371
+ ...props
2372
+ }
2373
+ );
2374
+ PopoverSeparator.displayName = "PopoverSeparator";
2375
+ var PopoverHeader = ({ className, ...props }) => /* @__PURE__ */ jsx19(
2376
+ "div",
2377
+ {
2378
+ className: cn("-mx-4 -mt-4 mb-3 px-4 pt-4 pb-3 border-b border-[var(--color-border)]", className),
2379
+ ...props
2380
+ }
2381
+ );
2382
+ PopoverHeader.displayName = "PopoverHeader";
2383
+ var PopoverFooter = ({ className, ...props }) => /* @__PURE__ */ jsx19(
2384
+ "div",
2385
+ {
2386
+ className: cn("-mx-4 -mb-4 mt-3 px-4 pt-3 pb-4 border-t border-[var(--color-border)]", className),
2387
+ ...props
2388
+ }
2389
+ );
2390
+ PopoverFooter.displayName = "PopoverFooter";
2391
+
2392
+ // src/components/ui/breadcrumb.tsx
2393
+ import * as React18 from "react";
2394
+ import { cva as cva14 } from "class-variance-authority";
2395
+ import { ChevronRight, MoreHorizontal } from "lucide-react";
2396
+ import { jsx as jsx20, jsxs as jsxs14 } from "react/jsx-runtime";
2397
+ var breadcrumbVariants = cva14(
2398
+ "flex items-center gap-1.5",
2399
+ {
2400
+ variants: {
2401
+ variant: {
2402
+ default: "text-[var(--color-foreground)] transition-colors",
2403
+ muted: "text-[var(--color-muted-foreground)] transition-colors",
2404
+ ghost: "text-[var(--color-foreground)]/60 transition-colors",
2405
+ accent: "text-[var(--color-accent)] transition-colors",
2406
+ primary: "text-[var(--color-primary)] transition-colors"
2407
+ },
2408
+ size: {
2409
+ sm: "text-[var(--font-size-xs)]",
2410
+ default: "text-[var(--font-size-sm)]",
2411
+ md: "text-[var(--font-size-base)]",
2412
+ lg: "text-[var(--font-size-lg)]"
2413
+ }
2414
+ },
2415
+ defaultVariants: {
2416
+ variant: "default",
2417
+ size: "default"
2418
+ }
2419
+ }
2420
+ );
2421
+ var Breadcrumb = React18.forwardRef(
2422
+ ({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx20(
2423
+ "nav",
2424
+ {
2425
+ ref,
2426
+ className: cn(breadcrumbVariants({ variant, size }), className),
2427
+ "aria-label": "breadcrumb",
2428
+ ...props
2429
+ }
2430
+ )
2431
+ );
2432
+ Breadcrumb.displayName = "Breadcrumb";
2433
+ var BreadcrumbList = React18.forwardRef(
2434
+ ({ className, collapsed, collapsedWidth = 3, ...props }, ref) => {
2435
+ const childrenArray = React18.Children.toArray(props.children).filter(Boolean);
2436
+ const childCount = childrenArray.length;
2437
+ if (collapsed && childCount > collapsedWidth) {
2438
+ const firstItem = childrenArray[0];
2439
+ const lastTwoItems = childrenArray.slice(-2);
2440
+ return /* @__PURE__ */ jsxs14(
2441
+ "ol",
2442
+ {
2443
+ ref,
2444
+ className: cn(
2445
+ "flex flex-wrap items-center gap-1.5 sm:gap-2.5",
2446
+ className
2447
+ ),
2448
+ ...props,
2449
+ children: [
2450
+ firstItem,
2451
+ /* @__PURE__ */ jsx20(BreadcrumbEllipsis, {}),
2452
+ lastTwoItems
2453
+ ]
2454
+ }
2455
+ );
2456
+ }
2457
+ return /* @__PURE__ */ jsx20(
2458
+ "ol",
2459
+ {
2460
+ ref,
2461
+ className: cn(
2462
+ "flex flex-wrap items-center gap-1.5 sm:gap-2.5",
2463
+ className
2464
+ ),
2465
+ ...props
2466
+ }
2467
+ );
2468
+ }
2469
+ );
2470
+ BreadcrumbList.displayName = "BreadcrumbList";
2471
+ var BreadcrumbItem = React18.forwardRef(
2472
+ ({ className, isCurrent, href, asChild = false, ...props }, ref) => {
2473
+ const Comp = asChild ? React18.Fragment : href ? "a" : "span";
2474
+ const itemProps = asChild ? {} : href ? { href } : {};
2475
+ return /* @__PURE__ */ jsx20(
2476
+ "li",
2477
+ {
2478
+ ref,
2479
+ className: cn("inline-flex items-center gap-1.5", className),
2480
+ "aria-current": isCurrent ? "page" : void 0,
2481
+ ...props,
2482
+ children: /* @__PURE__ */ jsx20(
2483
+ Comp,
2484
+ {
2485
+ className: cn(
2486
+ "transition-colors duration-[var(--duration-base)] hover:text-[var(--color-foreground)]",
2487
+ isCurrent ? "font-[var(--font-weight-medium)] text-[var(--color-foreground)]" : "text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)] hover:underline hover:underline-offset-4 hover:decoration-[var(--color-border)]"
2488
+ ),
2489
+ ...itemProps,
2490
+ children: props.children
2491
+ }
2492
+ )
2493
+ }
2494
+ );
2495
+ }
2496
+ );
2497
+ BreadcrumbItem.displayName = "BreadcrumbItem";
2498
+ var BreadcrumbSeparator = ({
2499
+ children,
2500
+ className,
2501
+ ...props
2502
+ }) => /* @__PURE__ */ jsx20(
2503
+ "li",
2504
+ {
2505
+ role: "presentation",
2506
+ "aria-hidden": "true",
2507
+ className: cn("text-[var(--color-muted-foreground)] opacity-70", className),
2508
+ ...props,
2509
+ children: children || /* @__PURE__ */ jsx20(ChevronRight, { className: "h-3.5 w-3.5" })
2510
+ }
2511
+ );
2512
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
2513
+ var BreadcrumbEllipsis = ({
2514
+ className,
2515
+ ...props
2516
+ }) => /* @__PURE__ */ jsxs14(
2517
+ "li",
2518
+ {
2519
+ role: "presentation",
2520
+ "aria-hidden": "true",
2521
+ className: cn("flex items-center text-[var(--color-muted-foreground)] hover:text-[var(--color-muted-foreground)]/80 transition-colors duration-[var(--duration-base)]", className),
2522
+ ...props,
2523
+ children: [
2524
+ /* @__PURE__ */ jsx20(MoreHorizontal, { className: "h-4 w-4" }),
2525
+ /* @__PURE__ */ jsx20("span", { className: "sr-only", children: "Daha fazla sayfa" })
2526
+ ]
2527
+ }
2528
+ );
2529
+ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
2530
+
2531
+ // src/components/ui/accordion.tsx
2532
+ import * as React19 from "react";
2533
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
2534
+ import { ChevronDown as ChevronDown2 } from "lucide-react";
2535
+ import { cva as cva15 } from "class-variance-authority";
2536
+ import { jsx as jsx21, jsxs as jsxs15 } from "react/jsx-runtime";
2537
+ var Accordion = AccordionPrimitive.Root;
2538
+ var accordionItemVariants = cva15(
2539
+ "border-b",
2540
+ {
2541
+ variants: {
2542
+ variant: {
2543
+ default: "border-[var(--color-border)]",
2544
+ outline: "border-[var(--color-border)] rounded-md mb-2 border p-[1px] last:mb-0",
2545
+ card: "border-[var(--color-border)] rounded-md mb-2 border bg-[var(--color-background)] p-0 shadow-sm last:mb-0"
2546
+ }
2547
+ },
2548
+ defaultVariants: {
2549
+ variant: "default"
2550
+ }
2551
+ }
2552
+ );
2553
+ var AccordionItem = React19.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx21(
2554
+ AccordionPrimitive.Item,
2555
+ {
2556
+ ref,
2557
+ className: cn(accordionItemVariants({ variant }), className),
2558
+ ...props
2559
+ }
2560
+ ));
2561
+ AccordionItem.displayName = "AccordionItem";
2562
+ var accordionTriggerVariants = cva15(
2563
+ "flex flex-1 items-center justify-between py-4 transition-all [&[data-state=open]>svg]:rotate-180 group",
2564
+ {
2565
+ variants: {
2566
+ variant: {
2567
+ default: "font-[var(--font-weight-medium)] text-[var(--color-foreground)] hover:text-[var(--color-primary)] hover:underline",
2568
+ ghost: "font-[var(--font-weight-medium)] text-[var(--color-foreground)] hover:text-[var(--color-foreground)] hover:bg-[var(--color-accent)]/10 rounded px-2 -mx-2",
2569
+ outline: "font-[var(--font-weight-medium)] text-[var(--color-foreground)] px-4 py-3 hover:bg-[var(--color-accent)]/5 rounded-t"
2570
+ },
2571
+ size: {
2572
+ sm: "text-[var(--font-size-xs)] py-2",
2573
+ default: "text-[var(--font-size-sm)] py-3",
2574
+ md: "text-[var(--font-size-base)] py-4",
2575
+ lg: "text-[var(--font-size-lg)] py-5"
2576
+ }
2577
+ },
2578
+ defaultVariants: {
2579
+ variant: "default",
2580
+ size: "default"
2581
+ }
2582
+ }
2583
+ );
2584
+ var AccordionTrigger = React19.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ jsx21(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs15(
2585
+ AccordionPrimitive.Trigger,
2586
+ {
2587
+ ref,
2588
+ className: cn(accordionTriggerVariants({ variant, size }), className),
2589
+ ...props,
2590
+ children: [
2591
+ children,
2592
+ /* @__PURE__ */ jsx21(ChevronDown2, { className: "h-4 w-4 shrink-0 transition-transform duration-[var(--duration-base)] opacity-70 group-hover:opacity-100" })
2593
+ ]
2594
+ }
2595
+ ) }));
2596
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
2597
+ var accordionContentVariants = cva15(
2598
+ "overflow-hidden transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
2599
+ {
2600
+ variants: {
2601
+ variant: {
2602
+ default: "text-[var(--color-muted-foreground)]",
2603
+ ghost: "text-[var(--color-muted-foreground)]",
2604
+ outline: "text-[var(--color-muted-foreground)] px-4 pb-3"
2605
+ },
2606
+ size: {
2607
+ sm: "text-[var(--font-size-xs)]",
2608
+ default: "text-[var(--font-size-sm)]",
2609
+ md: "text-[var(--font-size-base)]",
2610
+ lg: "text-[var(--font-size-lg)]"
2611
+ }
2612
+ },
2613
+ defaultVariants: {
2614
+ variant: "default",
2615
+ size: "default"
2616
+ }
2617
+ }
2618
+ );
2619
+ var AccordionContent = React19.forwardRef(({ className, variant, size, children, ...props }, ref) => /* @__PURE__ */ jsx21(
2620
+ AccordionPrimitive.Content,
2621
+ {
2622
+ ref,
2623
+ className: cn(accordionContentVariants({ variant, size }), className),
2624
+ ...props,
2625
+ children: /* @__PURE__ */ jsx21("div", { className: "pb-4 pt-0", children })
2626
+ }
2627
+ ));
2628
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
2629
+
2630
+ // src/components/ui/collapsible.tsx
2631
+ import * as React30 from "react";
2632
+
2633
+ // node_modules/@radix-ui/react-collapsible/dist/index.mjs
2634
+ import * as React29 from "react";
2635
+
2636
+ // node_modules/@radix-ui/primitive/dist/index.mjs
2637
+ function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
2638
+ return function handleEvent(event) {
2639
+ originalEventHandler?.(event);
2640
+ if (checkForDefaultPrevented === false || !event.defaultPrevented) {
2641
+ return ourEventHandler?.(event);
2642
+ }
2643
+ };
2644
+ }
2645
+
2646
+ // node_modules/@radix-ui/react-context/dist/index.mjs
2647
+ import * as React20 from "react";
2648
+ import { jsx as jsx22 } from "react/jsx-runtime";
2649
+ function createContextScope(scopeName, createContextScopeDeps = []) {
2650
+ let defaultContexts = [];
2651
+ function createContext32(rootComponentName, defaultContext) {
2652
+ const BaseContext = React20.createContext(defaultContext);
2653
+ const index = defaultContexts.length;
2654
+ defaultContexts = [...defaultContexts, defaultContext];
2655
+ const Provider = (props) => {
2656
+ const { scope, children, ...context } = props;
2657
+ const Context = scope?.[scopeName]?.[index] || BaseContext;
2658
+ const value = React20.useMemo(() => context, Object.values(context));
2659
+ return /* @__PURE__ */ jsx22(Context.Provider, { value, children });
2660
+ };
2661
+ Provider.displayName = rootComponentName + "Provider";
2662
+ function useContext22(consumerName, scope) {
2663
+ const Context = scope?.[scopeName]?.[index] || BaseContext;
2664
+ const context = React20.useContext(Context);
2665
+ if (context)
2666
+ return context;
2667
+ if (defaultContext !== void 0)
2668
+ return defaultContext;
2669
+ throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
2670
+ }
2671
+ return [Provider, useContext22];
2672
+ }
2673
+ const createScope = () => {
2674
+ const scopeContexts = defaultContexts.map((defaultContext) => {
2675
+ return React20.createContext(defaultContext);
2676
+ });
2677
+ return function useScope(scope) {
2678
+ const contexts = scope?.[scopeName] || scopeContexts;
2679
+ return React20.useMemo(
2680
+ () => ({ [`__scope${scopeName}`]: { ...scope, [scopeName]: contexts } }),
2681
+ [scope, contexts]
2682
+ );
2683
+ };
2684
+ };
2685
+ createScope.scopeName = scopeName;
2686
+ return [createContext32, composeContextScopes(createScope, ...createContextScopeDeps)];
2687
+ }
2688
+ function composeContextScopes(...scopes) {
2689
+ const baseScope = scopes[0];
2690
+ if (scopes.length === 1)
2691
+ return baseScope;
2692
+ const createScope = () => {
2693
+ const scopeHooks = scopes.map((createScope2) => ({
2694
+ useScope: createScope2(),
2695
+ scopeName: createScope2.scopeName
2696
+ }));
2697
+ return function useComposedScopes(overrideScopes) {
2698
+ const nextScopes = scopeHooks.reduce((nextScopes2, { useScope, scopeName }) => {
2699
+ const scopeProps = useScope(overrideScopes);
2700
+ const currentScope = scopeProps[`__scope${scopeName}`];
2701
+ return { ...nextScopes2, ...currentScope };
2702
+ }, {});
2703
+ return React20.useMemo(() => ({ [`__scope${baseScope.scopeName}`]: nextScopes }), [nextScopes]);
2704
+ };
2705
+ };
2706
+ createScope.scopeName = baseScope.scopeName;
2707
+ return createScope;
2708
+ }
2709
+
2710
+ // node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
2711
+ import * as React22 from "react";
2712
+
2713
+ // node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs
2714
+ import * as React21 from "react";
2715
+ var useLayoutEffect2 = globalThis?.document ? React21.useLayoutEffect : () => {
2716
+ };
2717
+
2718
+ // node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs
2719
+ import * as React23 from "react";
2720
+ var useInsertionEffect = React22[" useInsertionEffect ".trim().toString()] || useLayoutEffect2;
2721
+ function useControllableState({
2722
+ prop,
2723
+ defaultProp,
2724
+ onChange = () => {
2725
+ },
2726
+ caller
2727
+ }) {
2728
+ const [uncontrolledProp, setUncontrolledProp, onChangeRef] = useUncontrolledState({
2729
+ defaultProp,
2730
+ onChange
2731
+ });
2732
+ const isControlled = prop !== void 0;
2733
+ const value = isControlled ? prop : uncontrolledProp;
2734
+ if (true) {
2735
+ const isControlledRef = React22.useRef(prop !== void 0);
2736
+ React22.useEffect(() => {
2737
+ const wasControlled = isControlledRef.current;
2738
+ if (wasControlled !== isControlled) {
2739
+ const from = wasControlled ? "controlled" : "uncontrolled";
2740
+ const to = isControlled ? "controlled" : "uncontrolled";
2741
+ console.warn(
2742
+ `${caller} is changing from ${from} to ${to}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`
2743
+ );
2744
+ }
2745
+ isControlledRef.current = isControlled;
2746
+ }, [isControlled, caller]);
2747
+ }
2748
+ const setValue = React22.useCallback(
2749
+ (nextValue) => {
2750
+ if (isControlled) {
2751
+ const value2 = isFunction(nextValue) ? nextValue(prop) : nextValue;
2752
+ if (value2 !== prop) {
2753
+ onChangeRef.current?.(value2);
2754
+ }
2755
+ } else {
2756
+ setUncontrolledProp(nextValue);
2757
+ }
2758
+ },
2759
+ [isControlled, prop, setUncontrolledProp, onChangeRef]
2760
+ );
2761
+ return [value, setValue];
2762
+ }
2763
+ function useUncontrolledState({
2764
+ defaultProp,
2765
+ onChange
2766
+ }) {
2767
+ const [value, setValue] = React22.useState(defaultProp);
2768
+ const prevValueRef = React22.useRef(value);
2769
+ const onChangeRef = React22.useRef(onChange);
2770
+ useInsertionEffect(() => {
2771
+ onChangeRef.current = onChange;
2772
+ }, [onChange]);
2773
+ React22.useEffect(() => {
2774
+ if (prevValueRef.current !== value) {
2775
+ onChangeRef.current?.(value);
2776
+ prevValueRef.current = value;
2777
+ }
2778
+ }, [value, prevValueRef]);
2779
+ return [value, setValue, onChangeRef];
2780
+ }
2781
+ function isFunction(value) {
2782
+ return typeof value === "function";
2783
+ }
2784
+ var SYNC_STATE = Symbol("RADIX:SYNC_STATE");
2785
+
2786
+ // node_modules/@radix-ui/react-compose-refs/dist/index.mjs
2787
+ import * as React24 from "react";
2788
+ function setRef(ref, value) {
2789
+ if (typeof ref === "function") {
2790
+ return ref(value);
2791
+ } else if (ref !== null && ref !== void 0) {
2792
+ ref.current = value;
2793
+ }
2794
+ }
2795
+ function composeRefs(...refs) {
2796
+ return (node) => {
2797
+ let hasCleanup = false;
2798
+ const cleanups = refs.map((ref) => {
2799
+ const cleanup = setRef(ref, node);
2800
+ if (!hasCleanup && typeof cleanup == "function") {
2801
+ hasCleanup = true;
2802
+ }
2803
+ return cleanup;
2804
+ });
2805
+ if (hasCleanup) {
2806
+ return () => {
2807
+ for (let i = 0; i < cleanups.length; i++) {
2808
+ const cleanup = cleanups[i];
2809
+ if (typeof cleanup == "function") {
2810
+ cleanup();
2811
+ } else {
2812
+ setRef(refs[i], null);
2813
+ }
2814
+ }
2815
+ };
2816
+ }
2817
+ };
2818
+ }
2819
+ function useComposedRefs(...refs) {
2820
+ return React24.useCallback(composeRefs(...refs), refs);
2821
+ }
2822
+
2823
+ // node_modules/@radix-ui/react-primitive/dist/index.mjs
2824
+ import * as React25 from "react";
2825
+ import * as ReactDOM from "react-dom";
2826
+ import { createSlot } from "@radix-ui/react-slot";
2827
+ import { jsx as jsx23 } from "react/jsx-runtime";
2828
+ var NODES = [
2829
+ "a",
2830
+ "button",
2831
+ "div",
2832
+ "form",
2833
+ "h2",
2834
+ "h3",
2835
+ "img",
2836
+ "input",
2837
+ "label",
2838
+ "li",
2839
+ "nav",
2840
+ "ol",
2841
+ "p",
2842
+ "select",
2843
+ "span",
2844
+ "svg",
2845
+ "ul"
2846
+ ];
2847
+ var Primitive = NODES.reduce((primitive, node) => {
2848
+ const Slot = createSlot(`Primitive.${node}`);
2849
+ const Node = React25.forwardRef((props, forwardedRef) => {
2850
+ const { asChild, ...primitiveProps } = props;
2851
+ const Comp = asChild ? Slot : node;
2852
+ if (typeof window !== "undefined") {
2853
+ window[Symbol.for("radix-ui")] = true;
2854
+ }
2855
+ return /* @__PURE__ */ jsx23(Comp, { ...primitiveProps, ref: forwardedRef });
2856
+ });
2857
+ Node.displayName = `Primitive.${node}`;
2858
+ return { ...primitive, [node]: Node };
2859
+ }, {});
2860
+
2861
+ // node_modules/@radix-ui/react-presence/dist/index.mjs
2862
+ import * as React26 from "react";
2863
+ import * as React27 from "react";
2864
+ function useStateMachine(initialState, machine) {
2865
+ return React27.useReducer((state, event) => {
2866
+ const nextState = machine[state][event];
2867
+ return nextState ?? state;
2868
+ }, initialState);
2869
+ }
2870
+ var Presence = (props) => {
2871
+ const { present, children } = props;
2872
+ const presence = usePresence(present);
2873
+ const child = typeof children === "function" ? children({ present: presence.isPresent }) : React26.Children.only(children);
2874
+ const ref = useComposedRefs(presence.ref, getElementRef(child));
2875
+ const forceMount = typeof children === "function";
2876
+ return forceMount || presence.isPresent ? React26.cloneElement(child, { ref }) : null;
2877
+ };
2878
+ Presence.displayName = "Presence";
2879
+ function usePresence(present) {
2880
+ const [node, setNode] = React26.useState();
2881
+ const stylesRef = React26.useRef(null);
2882
+ const prevPresentRef = React26.useRef(present);
2883
+ const prevAnimationNameRef = React26.useRef("none");
2884
+ const initialState = present ? "mounted" : "unmounted";
2885
+ const [state, send] = useStateMachine(initialState, {
2886
+ mounted: {
2887
+ UNMOUNT: "unmounted",
2888
+ ANIMATION_OUT: "unmountSuspended"
2889
+ },
2890
+ unmountSuspended: {
2891
+ MOUNT: "mounted",
2892
+ ANIMATION_END: "unmounted"
2893
+ },
2894
+ unmounted: {
2895
+ MOUNT: "mounted"
2896
+ }
2897
+ });
2898
+ React26.useEffect(() => {
2899
+ const currentAnimationName = getAnimationName(stylesRef.current);
2900
+ prevAnimationNameRef.current = state === "mounted" ? currentAnimationName : "none";
2901
+ }, [state]);
2902
+ useLayoutEffect2(() => {
2903
+ const styles = stylesRef.current;
2904
+ const wasPresent = prevPresentRef.current;
2905
+ const hasPresentChanged = wasPresent !== present;
2906
+ if (hasPresentChanged) {
2907
+ const prevAnimationName = prevAnimationNameRef.current;
2908
+ const currentAnimationName = getAnimationName(styles);
2909
+ if (present) {
2910
+ send("MOUNT");
2911
+ } else if (currentAnimationName === "none" || styles?.display === "none") {
2912
+ send("UNMOUNT");
2913
+ } else {
2914
+ const isAnimating = prevAnimationName !== currentAnimationName;
2915
+ if (wasPresent && isAnimating) {
2916
+ send("ANIMATION_OUT");
2917
+ } else {
2918
+ send("UNMOUNT");
2919
+ }
2920
+ }
2921
+ prevPresentRef.current = present;
2922
+ }
2923
+ }, [present, send]);
2924
+ useLayoutEffect2(() => {
2925
+ if (node) {
2926
+ let timeoutId;
2927
+ const ownerWindow = node.ownerDocument.defaultView ?? window;
2928
+ const handleAnimationEnd = (event) => {
2929
+ const currentAnimationName = getAnimationName(stylesRef.current);
2930
+ const isCurrentAnimation = currentAnimationName.includes(event.animationName);
2931
+ if (event.target === node && isCurrentAnimation) {
2932
+ send("ANIMATION_END");
2933
+ if (!prevPresentRef.current) {
2934
+ const currentFillMode = node.style.animationFillMode;
2935
+ node.style.animationFillMode = "forwards";
2936
+ timeoutId = ownerWindow.setTimeout(() => {
2937
+ if (node.style.animationFillMode === "forwards") {
2938
+ node.style.animationFillMode = currentFillMode;
2939
+ }
2940
+ });
2941
+ }
2942
+ }
2943
+ };
2944
+ const handleAnimationStart = (event) => {
2945
+ if (event.target === node) {
2946
+ prevAnimationNameRef.current = getAnimationName(stylesRef.current);
2947
+ }
2948
+ };
2949
+ node.addEventListener("animationstart", handleAnimationStart);
2950
+ node.addEventListener("animationcancel", handleAnimationEnd);
2951
+ node.addEventListener("animationend", handleAnimationEnd);
2952
+ return () => {
2953
+ ownerWindow.clearTimeout(timeoutId);
2954
+ node.removeEventListener("animationstart", handleAnimationStart);
2955
+ node.removeEventListener("animationcancel", handleAnimationEnd);
2956
+ node.removeEventListener("animationend", handleAnimationEnd);
2957
+ };
2958
+ } else {
2959
+ send("ANIMATION_END");
2960
+ }
2961
+ }, [node, send]);
2962
+ return {
2963
+ isPresent: ["mounted", "unmountSuspended"].includes(state),
2964
+ ref: React26.useCallback((node2) => {
2965
+ stylesRef.current = node2 ? getComputedStyle(node2) : null;
2966
+ setNode(node2);
2967
+ }, [])
2968
+ };
2969
+ }
2970
+ function getAnimationName(styles) {
2971
+ return styles?.animationName || "none";
2972
+ }
2973
+ function getElementRef(element) {
2974
+ let getter = Object.getOwnPropertyDescriptor(element.props, "ref")?.get;
2975
+ let mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
2976
+ if (mayWarn) {
2977
+ return element.ref;
2978
+ }
2979
+ getter = Object.getOwnPropertyDescriptor(element, "ref")?.get;
2980
+ mayWarn = getter && "isReactWarning" in getter && getter.isReactWarning;
2981
+ if (mayWarn) {
2982
+ return element.props.ref;
2983
+ }
2984
+ return element.props.ref || element.ref;
2985
+ }
2986
+
2987
+ // node_modules/@radix-ui/react-id/dist/index.mjs
2988
+ import * as React28 from "react";
2989
+ var useReactId = React28[" useId ".trim().toString()] || (() => void 0);
2990
+ var count = 0;
2991
+ function useId2(deterministicId) {
2992
+ const [id, setId] = React28.useState(useReactId());
2993
+ useLayoutEffect2(() => {
2994
+ if (!deterministicId)
2995
+ setId((reactId) => reactId ?? String(count++));
2996
+ }, [deterministicId]);
2997
+ return deterministicId || (id ? `radix-${id}` : "");
2998
+ }
2999
+
3000
+ // node_modules/@radix-ui/react-collapsible/dist/index.mjs
3001
+ import { jsx as jsx24 } from "react/jsx-runtime";
3002
+ var COLLAPSIBLE_NAME = "Collapsible";
3003
+ var [createCollapsibleContext, createCollapsibleScope] = createContextScope(COLLAPSIBLE_NAME);
3004
+ var [CollapsibleProvider, useCollapsibleContext] = createCollapsibleContext(COLLAPSIBLE_NAME);
3005
+ var Collapsible = React29.forwardRef(
3006
+ (props, forwardedRef) => {
3007
+ const {
3008
+ __scopeCollapsible,
3009
+ open: openProp,
3010
+ defaultOpen,
3011
+ disabled,
3012
+ onOpenChange,
3013
+ ...collapsibleProps
3014
+ } = props;
3015
+ const [open, setOpen] = useControllableState({
3016
+ prop: openProp,
3017
+ defaultProp: defaultOpen ?? false,
3018
+ onChange: onOpenChange,
3019
+ caller: COLLAPSIBLE_NAME
3020
+ });
3021
+ return /* @__PURE__ */ jsx24(
3022
+ CollapsibleProvider,
3023
+ {
3024
+ scope: __scopeCollapsible,
3025
+ disabled,
3026
+ contentId: useId2(),
3027
+ open,
3028
+ onOpenToggle: React29.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),
3029
+ children: /* @__PURE__ */ jsx24(
3030
+ Primitive.div,
3031
+ {
3032
+ "data-state": getState(open),
3033
+ "data-disabled": disabled ? "" : void 0,
3034
+ ...collapsibleProps,
3035
+ ref: forwardedRef
3036
+ }
3037
+ )
3038
+ }
3039
+ );
3040
+ }
3041
+ );
3042
+ Collapsible.displayName = COLLAPSIBLE_NAME;
3043
+ var TRIGGER_NAME = "CollapsibleTrigger";
3044
+ var CollapsibleTrigger = React29.forwardRef(
3045
+ (props, forwardedRef) => {
3046
+ const { __scopeCollapsible, ...triggerProps } = props;
3047
+ const context = useCollapsibleContext(TRIGGER_NAME, __scopeCollapsible);
3048
+ return /* @__PURE__ */ jsx24(
3049
+ Primitive.button,
3050
+ {
3051
+ type: "button",
3052
+ "aria-controls": context.contentId,
3053
+ "aria-expanded": context.open || false,
3054
+ "data-state": getState(context.open),
3055
+ "data-disabled": context.disabled ? "" : void 0,
3056
+ disabled: context.disabled,
3057
+ ...triggerProps,
3058
+ ref: forwardedRef,
3059
+ onClick: composeEventHandlers(props.onClick, context.onOpenToggle)
3060
+ }
3061
+ );
3062
+ }
3063
+ );
3064
+ CollapsibleTrigger.displayName = TRIGGER_NAME;
3065
+ var CONTENT_NAME = "CollapsibleContent";
3066
+ var CollapsibleContent = React29.forwardRef(
3067
+ (props, forwardedRef) => {
3068
+ const { forceMount, ...contentProps } = props;
3069
+ const context = useCollapsibleContext(CONTENT_NAME, props.__scopeCollapsible);
3070
+ return /* @__PURE__ */ jsx24(Presence, { present: forceMount || context.open, children: ({ present }) => /* @__PURE__ */ jsx24(CollapsibleContentImpl, { ...contentProps, ref: forwardedRef, present }) });
3071
+ }
3072
+ );
3073
+ CollapsibleContent.displayName = CONTENT_NAME;
3074
+ var CollapsibleContentImpl = React29.forwardRef((props, forwardedRef) => {
3075
+ const { __scopeCollapsible, present, children, ...contentProps } = props;
3076
+ const context = useCollapsibleContext(CONTENT_NAME, __scopeCollapsible);
3077
+ const [isPresent, setIsPresent] = React29.useState(present);
3078
+ const ref = React29.useRef(null);
3079
+ const composedRefs = useComposedRefs(forwardedRef, ref);
3080
+ const heightRef = React29.useRef(0);
3081
+ const height = heightRef.current;
3082
+ const widthRef = React29.useRef(0);
3083
+ const width = widthRef.current;
3084
+ const isOpen = context.open || isPresent;
3085
+ const isMountAnimationPreventedRef = React29.useRef(isOpen);
3086
+ const originalStylesRef = React29.useRef(void 0);
3087
+ React29.useEffect(() => {
3088
+ const rAF = requestAnimationFrame(() => isMountAnimationPreventedRef.current = false);
3089
+ return () => cancelAnimationFrame(rAF);
3090
+ }, []);
3091
+ useLayoutEffect2(() => {
3092
+ const node = ref.current;
3093
+ if (node) {
3094
+ originalStylesRef.current = originalStylesRef.current || {
3095
+ transitionDuration: node.style.transitionDuration,
3096
+ animationName: node.style.animationName
3097
+ };
3098
+ node.style.transitionDuration = "0s";
3099
+ node.style.animationName = "none";
3100
+ const rect = node.getBoundingClientRect();
3101
+ heightRef.current = rect.height;
3102
+ widthRef.current = rect.width;
3103
+ if (!isMountAnimationPreventedRef.current) {
3104
+ node.style.transitionDuration = originalStylesRef.current.transitionDuration;
3105
+ node.style.animationName = originalStylesRef.current.animationName;
3106
+ }
3107
+ setIsPresent(present);
3108
+ }
3109
+ }, [context.open, present]);
3110
+ return /* @__PURE__ */ jsx24(
3111
+ Primitive.div,
3112
+ {
3113
+ "data-state": getState(context.open),
3114
+ "data-disabled": context.disabled ? "" : void 0,
3115
+ id: context.contentId,
3116
+ hidden: !isOpen,
3117
+ ...contentProps,
3118
+ ref: composedRefs,
3119
+ style: {
3120
+ [`--radix-collapsible-content-height`]: height ? `${height}px` : void 0,
3121
+ [`--radix-collapsible-content-width`]: width ? `${width}px` : void 0,
3122
+ ...props.style
3123
+ },
3124
+ children: isOpen && children
3125
+ }
3126
+ );
3127
+ });
3128
+ function getState(open) {
3129
+ return open ? "open" : "closed";
3130
+ }
3131
+ var Root9 = Collapsible;
3132
+ var Trigger6 = CollapsibleTrigger;
3133
+ var Content6 = CollapsibleContent;
3134
+
3135
+ // src/components/ui/collapsible.tsx
3136
+ import { cva as cva16 } from "class-variance-authority";
3137
+ import { ChevronDown as ChevronDown3 } from "lucide-react";
3138
+ import { jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
3139
+ var Collapsible2 = Root9;
3140
+ var collapsibleTriggerVariants = cva16(
3141
+ "flex w-full items-center justify-between transition-all",
3142
+ {
3143
+ variants: {
3144
+ variant: {
3145
+ default: "text-[var(--color-foreground)] hover:text-[var(--color-primary)]",
3146
+ ghost: "text-[var(--color-foreground)] hover:bg-[var(--color-accent)]/10 rounded",
3147
+ outline: "text-[var(--color-foreground)] border border-[var(--color-border)] rounded-t-[var(--radius-md)] hover:bg-[var(--color-accent)]/5"
3148
+ },
3149
+ size: {
3150
+ sm: "text-[var(--font-size-xs)] py-2 px-3",
3151
+ default: "text-[var(--font-size-sm)] py-3 px-4",
3152
+ md: "text-[var(--font-size-base)] py-4 px-4",
3153
+ lg: "text-[var(--font-size-lg)] py-5 px-5"
3154
+ }
3155
+ },
3156
+ defaultVariants: {
3157
+ variant: "default",
3158
+ size: "default"
3159
+ }
3160
+ }
3161
+ );
3162
+ var CollapsibleTrigger2 = React30.forwardRef(({ className, children, variant, size, ...props }, ref) => /* @__PURE__ */ jsxs16(
3163
+ Trigger6,
3164
+ {
3165
+ ref,
3166
+ className: cn(collapsibleTriggerVariants({ variant, size }), className),
3167
+ ...props,
3168
+ children: [
3169
+ children,
3170
+ /* @__PURE__ */ jsx25(ChevronDown3, { className: "h-4 w-4 shrink-0 transition-transform duration-[var(--duration-base)] [&[data-state=open]]:rotate-180" })
3171
+ ]
3172
+ }
3173
+ ));
3174
+ CollapsibleTrigger2.displayName = Trigger6.displayName;
3175
+ var collapsibleContentVariants = cva16(
3176
+ "overflow-hidden transition-all data-[state=closed]:animate-collapse-up data-[state=open]:animate-collapse-down",
3177
+ {
3178
+ variants: {
3179
+ variant: {
3180
+ default: "text-[var(--color-muted-foreground)]",
3181
+ ghost: "text-[var(--color-muted-foreground)] rounded-b",
3182
+ outline: "text-[var(--color-muted-foreground)] border border-t-0 border-[var(--color-border)] rounded-b-[var(--radius-md)]"
3183
+ },
3184
+ size: {
3185
+ sm: "text-[var(--font-size-xs)]",
3186
+ default: "text-[var(--font-size-sm)]",
3187
+ md: "text-[var(--font-size-base)]",
3188
+ lg: "text-[var(--font-size-lg)]"
3189
+ }
3190
+ },
3191
+ defaultVariants: {
3192
+ variant: "default",
3193
+ size: "default"
3194
+ }
3195
+ }
3196
+ );
3197
+ var CollapsibleContent2 = React30.forwardRef(({ className, children, variant, size, ...props }, ref) => /* @__PURE__ */ jsx25(
3198
+ Content6,
3199
+ {
3200
+ ref,
3201
+ className: cn(collapsibleContentVariants({ variant, size }), className),
3202
+ ...props,
3203
+ children: /* @__PURE__ */ jsx25("div", { className: "p-4", children })
3204
+ }
3205
+ ));
3206
+ CollapsibleContent2.displayName = Content6.displayName;
3207
+
3208
+ // src/components/ui/aspect-ratio.tsx
3209
+ import * as React31 from "react";
3210
+ import { cva as cva17 } from "class-variance-authority";
3211
+ import { jsx as jsx26 } from "react/jsx-runtime";
3212
+ var aspectRatioVariants = cva17(
3213
+ "relative overflow-hidden",
3214
+ {
3215
+ variants: {
3216
+ variant: {
3217
+ default: "rounded-[var(--radius-md)] bg-[var(--color-muted)]/10",
3218
+ ghost: "bg-transparent",
3219
+ outline: "rounded-[var(--radius-md)] border border-[var(--color-border)]",
3220
+ card: "rounded-[var(--radius-md)] bg-[var(--color-card)] shadow-sm"
3221
+ },
3222
+ radius: {
3223
+ none: "rounded-none",
3224
+ sm: "rounded-[var(--radius-sm)]",
3225
+ md: "rounded-[var(--radius-md)]",
3226
+ lg: "rounded-[var(--radius-lg)]",
3227
+ full: "rounded-full"
3228
+ }
3229
+ },
3230
+ defaultVariants: {
3231
+ variant: "default"
3232
+ }
3233
+ }
3234
+ );
3235
+ var AspectRatio = React31.forwardRef(({ className, variant, radius, ratio = 16 / 9, style, children, ...props }, ref) => /* @__PURE__ */ jsx26(
3236
+ "div",
3237
+ {
3238
+ ref,
3239
+ className: cn(aspectRatioVariants({ variant, radius }), className),
3240
+ style: {
3241
+ position: "relative",
3242
+ paddingBottom: `${1 / ratio * 100}%`,
3243
+ ...style
3244
+ },
3245
+ ...props,
3246
+ children: /* @__PURE__ */ jsx26("div", { className: "absolute inset-0", children })
3247
+ }
3248
+ ));
3249
+ AspectRatio.displayName = "AspectRatio";
3250
+
3251
+ // src/components/ui/command.tsx
3252
+ import * as React32 from "react";
3253
+ import { Search } from "lucide-react";
3254
+ import { cva as cva18 } from "class-variance-authority";
3255
+ import { jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
3256
+ var commandVariants = cva18(
3257
+ "flex h-full w-full flex-col overflow-hidden rounded-[var(--radius-md)]",
3258
+ {
3259
+ variants: {
3260
+ variant: {
3261
+ default: "bg-[var(--color-popover)] text-[var(--color-popover-foreground)]",
3262
+ glass: "bg-[var(--color-background)]/80 text-[var(--color-foreground)] backdrop-blur-sm",
3263
+ bordered: "bg-[var(--color-popover)] text-[var(--color-popover-foreground)] border border-[var(--color-border)]"
3264
+ },
3265
+ size: {
3266
+ sm: "p-2",
3267
+ default: "p-4",
3268
+ lg: "p-6"
3269
+ }
3270
+ },
3271
+ defaultVariants: {
3272
+ variant: "default",
3273
+ size: "default"
3274
+ }
3275
+ }
3276
+ );
3277
+ var Command = React32.forwardRef(
3278
+ ({ className, variant, size, ...props }, ref) => /* @__PURE__ */ jsx27(
3279
+ "div",
3280
+ {
3281
+ ref,
3282
+ className: cn(commandVariants({ variant, size }), className),
3283
+ ...props
3284
+ }
3285
+ )
3286
+ );
3287
+ Command.displayName = "Command";
3288
+ var CommandDialog = ({
3289
+ children,
3290
+ commandClassName,
3291
+ ...props
3292
+ }) => {
3293
+ return /* @__PURE__ */ jsx27(Dialog, { ...props, children: /* @__PURE__ */ jsx27(DialogContent, { className: "overflow-hidden p-0 shadow-lg", children: /* @__PURE__ */ jsx27(Command, { className: cn(
3294
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
3295
+ commandClassName
3296
+ ), children }) }) });
3297
+ };
3298
+ var commandInputVariants = cva18(
3299
+ "flex h-11 w-full rounded-none border-none bg-transparent py-3 text-sm outline-none placeholder:text-[var(--color-muted-foreground)] disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none",
3300
+ {
3301
+ variants: {
3302
+ variant: {
3303
+ default: "",
3304
+ minimal: "h-9",
3305
+ bordered: "border-b border-[var(--color-border)]"
3306
+ }
3307
+ },
3308
+ defaultVariants: {
3309
+ variant: "default"
3310
+ }
3311
+ }
3312
+ );
3313
+ var CommandInput = React32.forwardRef(
3314
+ ({ className, variant, ...props }, ref) => /* @__PURE__ */ jsxs17("div", { className: "flex items-center border-b px-3", children: [
3315
+ /* @__PURE__ */ jsx27(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
3316
+ /* @__PURE__ */ jsx27(
3317
+ "input",
3318
+ {
3319
+ ref,
3320
+ className: cn(commandInputVariants({ variant }), className),
3321
+ ...props
3322
+ }
3323
+ )
3324
+ ] })
3325
+ );
3326
+ CommandInput.displayName = "CommandInput";
3327
+ var commandListVariants = cva18(
3328
+ "max-h-[300px] overflow-y-auto overflow-x-hidden",
3329
+ {
3330
+ variants: {
3331
+ variant: {
3332
+ default: "",
3333
+ scrollable: "max-h-[400px]",
3334
+ compact: "max-h-[200px]"
3335
+ }
3336
+ },
3337
+ defaultVariants: {
3338
+ variant: "default"
3339
+ }
3340
+ }
3341
+ );
3342
+ var CommandList = React32.forwardRef(
3343
+ ({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx27(
3344
+ "div",
3345
+ {
3346
+ ref,
3347
+ className: cn(commandListVariants({ variant }), className),
3348
+ role: "listbox",
3349
+ ...props
3350
+ }
3351
+ )
3352
+ );
3353
+ CommandList.displayName = "CommandList";
3354
+ var CommandEmpty = React32.forwardRef(
3355
+ (props, ref) => /* @__PURE__ */ jsx27(
3356
+ "div",
3357
+ {
3358
+ ref,
3359
+ className: "py-6 text-center text-sm text-[var(--color-muted-foreground)]",
3360
+ ...props
3361
+ }
3362
+ )
3363
+ );
3364
+ CommandEmpty.displayName = "CommandEmpty";
3365
+ var commandGroupVariants = cva18(
3366
+ "overflow-hidden p-1 text-[var(--color-foreground)]",
3367
+ {
3368
+ variants: {
3369
+ variant: {
3370
+ default: "",
3371
+ separated: "mt-2 border-t border-[var(--color-border)] pt-2",
3372
+ indented: "pl-4"
3373
+ }
3374
+ },
3375
+ defaultVariants: {
3376
+ variant: "default"
3377
+ }
3378
+ }
3379
+ );
3380
+ var CommandGroup = React32.forwardRef(
3381
+ ({ className, variant, heading, children, ...props }, ref) => /* @__PURE__ */ jsxs17(
3382
+ "div",
3383
+ {
3384
+ ref,
3385
+ className: cn(commandGroupVariants({ variant }), className),
3386
+ ...props,
3387
+ children: [
3388
+ heading && /* @__PURE__ */ jsx27("div", { className: "px-2 py-1.5 text-xs font-medium text-[var(--color-muted-foreground)]", children: heading }),
3389
+ children
3390
+ ]
3391
+ }
3392
+ )
3393
+ );
3394
+ CommandGroup.displayName = "CommandGroup";
3395
+ var CommandSeparator = React32.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
3396
+ "div",
3397
+ {
3398
+ ref,
3399
+ className: cn("-mx-1 h-px bg-[var(--color-border)]", className),
3400
+ ...props
3401
+ }
3402
+ ));
3403
+ CommandSeparator.displayName = "CommandSeparator";
3404
+ var commandItemVariants = cva18(
3405
+ "relative flex cursor-default select-none items-center rounded-[var(--radius-sm)] px-2 py-1.5 text-sm outline-none aria-selected:bg-[var(--color-accent)] aria-selected:text-[var(--color-accent-foreground)] data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
3406
+ {
3407
+ variants: {
3408
+ variant: {
3409
+ default: "",
3410
+ subtle: "aria-selected:bg-[var(--color-accent)]/10 aria-selected:text-[var(--color-accent-foreground)]",
3411
+ ghost: "hover:bg-[var(--color-muted)]/10 aria-selected:bg-[var(--color-muted)]/20 aria-selected:text-[var(--color-foreground)]"
3412
+ }
3413
+ },
3414
+ defaultVariants: {
3415
+ variant: "default"
3416
+ }
3417
+ }
3418
+ );
3419
+ var CommandItem = React32.forwardRef(
3420
+ ({ className, variant, onSelect, selected, disabled, value, ...props }, ref) => {
3421
+ const handleClick = React32.useCallback(() => {
3422
+ if (disabled)
3423
+ return;
3424
+ if (onSelect && value) {
3425
+ onSelect(value);
3426
+ }
3427
+ }, [disabled, onSelect, value]);
3428
+ return /* @__PURE__ */ jsx27(
3429
+ "div",
3430
+ {
3431
+ ref,
3432
+ className: cn(commandItemVariants({ variant }), className),
3433
+ role: "option",
3434
+ "aria-selected": selected,
3435
+ "data-disabled": disabled ? "" : void 0,
3436
+ onClick: handleClick,
3437
+ ...props
3438
+ }
3439
+ );
3440
+ }
3441
+ );
3442
+ CommandItem.displayName = "CommandItem";
3443
+ var CommandShortcut = ({ className, ...props }) => {
3444
+ return /* @__PURE__ */ jsx27(
3445
+ "span",
3446
+ {
3447
+ className: cn(
3448
+ "ml-auto text-xs tracking-widest text-[var(--color-muted-foreground)]",
3449
+ className
3450
+ ),
3451
+ ...props
3452
+ }
3453
+ );
3454
+ };
3455
+ CommandShortcut.displayName = "CommandShortcut";
176
3456
  export {
3457
+ Accordion,
3458
+ AccordionContent,
3459
+ AccordionItem,
3460
+ AccordionTrigger,
3461
+ Alert,
3462
+ AlertDescription,
3463
+ AlertTitle,
3464
+ AspectRatio,
3465
+ Avatar,
3466
+ AvatarFallback,
3467
+ AvatarImage,
177
3468
  Badge,
3469
+ Breadcrumb,
3470
+ BreadcrumbEllipsis,
3471
+ BreadcrumbItem,
3472
+ BreadcrumbList,
3473
+ BreadcrumbSeparator,
178
3474
  Button,
179
3475
  Card,
180
3476
  CardContent,
@@ -182,12 +3478,92 @@ export {
182
3478
  CardFooter,
183
3479
  CardHeader,
184
3480
  CardTitle,
3481
+ Checkbox,
3482
+ CheckboxGroup,
3483
+ CheckboxLabel,
3484
+ CheckboxWithLabel,
3485
+ Collapsible2 as Collapsible,
3486
+ CollapsibleContent2 as CollapsibleContent,
3487
+ CollapsibleTrigger2 as CollapsibleTrigger,
3488
+ Command,
3489
+ CommandDialog,
3490
+ CommandEmpty,
3491
+ CommandGroup,
3492
+ CommandInput,
3493
+ CommandItem,
3494
+ CommandList,
3495
+ CommandSeparator,
3496
+ CommandShortcut,
3497
+ Dialog,
3498
+ DialogClose,
3499
+ DialogContent,
3500
+ DialogDescription,
3501
+ DialogFooter,
3502
+ DialogForm,
3503
+ DialogHeader,
3504
+ DialogTitle,
3505
+ DialogTrigger,
3506
+ Input,
3507
+ Popover,
3508
+ PopoverAnchor,
3509
+ PopoverClose,
3510
+ PopoverContent,
3511
+ PopoverFooter,
3512
+ PopoverHeader,
3513
+ PopoverSeparator,
3514
+ PopoverTrigger,
3515
+ Progress,
3516
+ RadioGroup,
3517
+ RadioGroupItem,
3518
+ RadioItemWithLabel,
3519
+ RadioLabel,
3520
+ Select,
3521
+ SelectContent,
3522
+ SelectGroup,
3523
+ SelectItem,
3524
+ SelectLabel,
3525
+ SelectSeparator,
3526
+ SelectTrigger,
3527
+ SelectValue,
3528
+ Skeleton,
3529
+ SkeletonAvatar,
3530
+ SkeletonCard,
3531
+ SkeletonText,
3532
+ Switch,
3533
+ Tabs,
3534
+ TabsContent,
3535
+ TabsList,
3536
+ TabsTrigger,
3537
+ ThemeProvider2 as ThemeProvider,
3538
+ Toast,
3539
+ ToastContainer,
3540
+ ToastProvider,
3541
+ Tooltip,
3542
+ accordionContentVariants,
3543
+ accordionItemVariants,
3544
+ accordionTriggerVariants,
3545
+ aspectRatioVariants,
185
3546
  badgeVariants,
186
3547
  buttonVariants,
187
3548
  cn,
3549
+ collapsibleContentVariants,
3550
+ collapsibleTriggerVariants,
188
3551
  combineRefs,
3552
+ commandGroupVariants,
3553
+ commandInputVariants,
3554
+ commandItemVariants,
3555
+ commandListVariants,
3556
+ commandVariants,
3557
+ createCssVariables,
189
3558
  debounce,
190
3559
  formatCurrency,
191
3560
  generateId,
192
- get
3561
+ get,
3562
+ popoverContentVariants,
3563
+ progressVariants,
3564
+ skeletonVariants,
3565
+ toastVariants,
3566
+ tooltipContentVariants,
3567
+ useTheme,
3568
+ useToast
193
3569
  };