AshameTheDestroyer commited on
Commit
6e6c9d2
·
1 Parent(s): 3546dcc

Sidebar Initiated.

Browse files
app/app.css CHANGED
@@ -1,4 +1,7 @@
1
  @import "tailwindcss";
 
 
 
2
 
3
  @theme {
4
  --font-sans:
@@ -8,9 +11,125 @@
8
 
9
  html,
10
  body {
11
- @apply bg-white dark:bg-gray-950;
12
 
13
  @media (prefers-color-scheme: dark) {
14
  color-scheme: dark;
15
  }
16
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
 
6
  @theme {
7
  --font-sans:
 
11
 
12
  html,
13
  body {
14
+ @apply bg-indigo-100 text-gray-900 dark:bg-gray-900 dark:text-white;
15
 
16
  @media (prefers-color-scheme: dark) {
17
  color-scheme: dark;
18
  }
19
  }
20
+
21
+ @theme inline {
22
+ --radius-sm: calc(var(--radius) - 4px);
23
+ --radius-md: calc(var(--radius) - 2px);
24
+ --radius-lg: var(--radius);
25
+ --radius-xl: calc(var(--radius) + 4px);
26
+ --radius-2xl: calc(var(--radius) + 8px);
27
+ --radius-3xl: calc(var(--radius) + 12px);
28
+ --radius-4xl: calc(var(--radius) + 16px);
29
+ --color-background: var(--background);
30
+ --color-foreground: var(--foreground);
31
+ --color-card: var(--card);
32
+ --color-card-foreground: var(--card-foreground);
33
+ --color-popover: var(--popover);
34
+ --color-popover-foreground: var(--popover-foreground);
35
+ --color-primary: var(--primary);
36
+ --color-primary-foreground: var(--primary-foreground);
37
+ --color-secondary: var(--secondary);
38
+ --color-secondary-foreground: var(--secondary-foreground);
39
+ --color-muted: var(--muted);
40
+ --color-muted-foreground: var(--muted-foreground);
41
+ --color-accent: var(--accent);
42
+ --color-accent-foreground: var(--accent-foreground);
43
+ --color-destructive: var(--destructive);
44
+ --color-border: var(--border);
45
+ --color-input: var(--input);
46
+ --color-ring: var(--ring);
47
+ --color-chart-1: var(--chart-1);
48
+ --color-chart-2: var(--chart-2);
49
+ --color-chart-3: var(--chart-3);
50
+ --color-chart-4: var(--chart-4);
51
+ --color-chart-5: var(--chart-5);
52
+ --color-sidebar: var(--sidebar);
53
+ --color-sidebar-foreground: var(--sidebar-foreground);
54
+ --color-sidebar-primary: var(--sidebar-primary);
55
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
56
+ --color-sidebar-accent: var(--sidebar-accent);
57
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
58
+ --color-sidebar-border: var(--sidebar-border);
59
+ --color-sidebar-ring: var(--sidebar-ring);
60
+ }
61
+
62
+ :root {
63
+ --radius: 0.625rem;
64
+ --background: rgb(255, 255, 255);
65
+ --foreground: rgb(3, 7, 18);
66
+ --card: rgb(255, 255, 255);
67
+ --card-foreground: rgb(3, 7, 18);
68
+ --popover: rgb(255, 255, 255);
69
+ --popover-foreground: rgb(3, 7, 18);
70
+ --primary: rgb(16, 24, 40);
71
+ --primary-foreground: rgb(249, 250, 251);
72
+ --secondary: rgb(243, 244, 246);
73
+ --secondary-foreground: rgb(16, 24, 40);
74
+ --muted: rgb(243, 244, 246);
75
+ --muted-foreground: rgb(106, 114, 130);
76
+ --accent: rgb(243, 244, 246);
77
+ --accent-foreground: rgb(16, 24, 40);
78
+ --destructive: rgb(231, 0, 11);
79
+ --border: rgb(229, 231, 235);
80
+ --input: rgb(229, 231, 235);
81
+ --ring: rgb(153, 161, 175);
82
+ --chart-1: rgb(245, 73, 0);
83
+ --chart-2: rgb(0, 150, 137);
84
+ --chart-3: rgb(16, 78, 100);
85
+ --chart-4: rgb(255, 185, 0);
86
+ --chart-5: rgb(254, 154, 0);
87
+ --sidebar: hsl(0 0% 98%);
88
+ --sidebar-foreground: hsl(240 5.3% 26.1%);
89
+ --sidebar-primary: hsl(240 5.9% 10%);
90
+ --sidebar-primary-foreground: hsl(0 0% 98%);
91
+ --sidebar-accent: hsl(240 4.8% 95.9%);
92
+ --sidebar-accent-foreground: hsl(240 5.9% 10%);
93
+ --sidebar-border: hsl(220 13% 91%);
94
+ --sidebar-ring: hsl(217.2 91.2% 59.8%);
95
+ }
96
+
97
+ .dark {
98
+ --background: rgb(3, 7, 18);
99
+ --foreground: rgb(249, 250, 251);
100
+ --card: rgb(16, 24, 40);
101
+ --card-foreground: rgb(249, 250, 251);
102
+ --popover: rgb(16, 24, 40);
103
+ --popover-foreground: rgb(249, 250, 251);
104
+ --primary: rgb(229, 231, 235);
105
+ --primary-foreground: rgb(16, 24, 40);
106
+ --secondary: rgb(30, 41, 57);
107
+ --secondary-foreground: rgb(249, 250, 251);
108
+ --muted: rgb(30, 41, 57);
109
+ --muted-foreground: rgb(153, 161, 175);
110
+ --accent: rgb(30, 41, 57);
111
+ --accent-foreground: rgb(249, 250, 251);
112
+ --destructive: rgb(255, 100, 103);
113
+ --border: rgba(255, 255, 255, 0.1);
114
+ --input: rgba(255, 255, 255, 0.15);
115
+ --ring: rgb(106, 114, 130);
116
+ --chart-1: rgb(20, 71, 230);
117
+ --chart-2: rgb(0, 188, 125);
118
+ --chart-3: rgb(254, 154, 0);
119
+ --chart-4: rgb(173, 70, 255);
120
+ --chart-5: rgb(255, 32, 86);
121
+ --sidebar: hsl(240 5.9% 10%);
122
+ --sidebar-foreground: hsl(240 4.8% 95.9%);
123
+ --sidebar-primary: hsl(224.3 76.3% 48%);
124
+ --sidebar-primary-foreground: hsl(0 0% 100%);
125
+ --sidebar-accent: hsl(240 3.7% 15.9%);
126
+ --sidebar-accent-foreground: hsl(240 4.8% 95.9%);
127
+ --sidebar-border: hsl(240 3.7% 15.9%);
128
+ --sidebar-ring: hsl(217.2 91.2% 59.8%);
129
+ }
130
+
131
+ @layer base {
132
+ * {
133
+ @apply border-border outline-ring/50;
134
+ }
135
+ }
app/app.css.converted ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ @theme {
7
+ --font-sans:
8
+ "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
9
+ "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
10
+ }
11
+
12
+ html,
13
+ body {
14
+ @apply bg-indigo-100 text-gray-900 dark:bg-gray-900 dark:text-white;
15
+
16
+ @media (prefers-color-scheme: dark) {
17
+ color-scheme: dark;
18
+ }
19
+ }
20
+
21
+ @theme inline {
22
+ --radius-sm:
23
+ calc(var(--radius) - 4px);
24
+ --radius-md:
25
+ calc(var(--radius) - 2px);
26
+ --radius-lg:
27
+ var(--radius);
28
+ --radius-xl:
29
+ calc(var(--radius) + 4px);
30
+ --radius-2xl:
31
+ calc(var(--radius) + 8px);
32
+ --radius-3xl:
33
+ calc(var(--radius) + 12px);
34
+ --radius-4xl:
35
+ calc(var(--radius) + 16px);
36
+ --color-background:
37
+ var(--background);
38
+ --color-foreground:
39
+ var(--foreground);
40
+ --color-card:
41
+ var(--card);
42
+ --color-card-foreground:
43
+ var(--card-foreground);
44
+ --color-popover:
45
+ var(--popover);
46
+ --color-popover-foreground:
47
+ var(--popover-foreground);
48
+ --color-primary:
49
+ var(--primary);
50
+ --color-primary-foreground:
51
+ var(--primary-foreground);
52
+ --color-secondary:
53
+ var(--secondary);
54
+ --color-secondary-foreground:
55
+ var(--secondary-foreground);
56
+ --color-muted:
57
+ var(--muted);
58
+ --color-muted-foreground:
59
+ var(--muted-foreground);
60
+ --color-accent:
61
+ var(--accent);
62
+ --color-accent-foreground:
63
+ var(--accent-foreground);
64
+ --color-destructive:
65
+ var(--destructive);
66
+ --color-border:
67
+ var(--border);
68
+ --color-input:
69
+ var(--input);
70
+ --color-ring:
71
+ var(--ring);
72
+ --color-chart-1:
73
+ var(--chart-1);
74
+ --color-chart-2:
75
+ var(--chart-2);
76
+ --color-chart-3:
77
+ var(--chart-3);
78
+ --color-chart-4:
79
+ var(--chart-4);
80
+ --color-chart-5:
81
+ var(--chart-5);
82
+ --color-sidebar:
83
+ var(--sidebar);
84
+ --color-sidebar-foreground:
85
+ var(--sidebar-foreground);
86
+ --color-sidebar-primary:
87
+ var(--sidebar-primary);
88
+ --color-sidebar-primary-foreground:
89
+ var(--sidebar-primary-foreground);
90
+ --color-sidebar-accent:
91
+ var(--sidebar-accent);
92
+ --color-sidebar-accent-foreground:
93
+ var(--sidebar-accent-foreground);
94
+ --color-sidebar-border:
95
+ var(--sidebar-border);
96
+ --color-sidebar-ring:
97
+ var(--sidebar-ring);
98
+ }
99
+
100
+ :root {
101
+ --radius:
102
+ 0.625rem;
103
+ --background:
104
+ rgb(255, 255, 255);
105
+ --foreground:
106
+ rgb(3, 7, 18);
107
+ --card:
108
+ rgb(255, 255, 255);
109
+ --card-foreground:
110
+ rgb(3, 7, 18);
111
+ --popover:
112
+ rgb(255, 255, 255);
113
+ --popover-foreground:
114
+ rgb(3, 7, 18);
115
+ --primary:
116
+ rgb(16, 24, 40);
117
+ --primary-foreground:
118
+ rgb(249, 250, 251);
119
+ --secondary:
120
+ rgb(243, 244, 246);
121
+ --secondary-foreground:
122
+ rgb(16, 24, 40);
123
+ --muted:
124
+ rgb(243, 244, 246);
125
+ --muted-foreground:
126
+ rgb(106, 114, 130);
127
+ --accent:
128
+ rgb(243, 244, 246);
129
+ --accent-foreground:
130
+ rgb(16, 24, 40);
131
+ --destructive:
132
+ rgb(231, 0, 11);
133
+ --border:
134
+ rgb(229, 231, 235);
135
+ --input:
136
+ rgb(229, 231, 235);
137
+ --ring:
138
+ rgb(153, 161, 175);
139
+ --chart-1:
140
+ rgb(245, 73, 0);
141
+ --chart-2:
142
+ rgb(0, 150, 137);
143
+ --chart-3:
144
+ rgb(16, 78, 100);
145
+ --chart-4:
146
+ rgb(255, 185, 0);
147
+ --chart-5:
148
+ rgb(254, 154, 0);
149
+ --sidebar:
150
+ hsl(0 0% 98%);
151
+ --sidebar-foreground:
152
+ hsl(240 5.3% 26.1%);
153
+ --sidebar-primary:
154
+ hsl(240 5.9% 10%);
155
+ --sidebar-primary-foreground:
156
+ hsl(0 0% 98%);
157
+ --sidebar-accent:
158
+ hsl(240 4.8% 95.9%);
159
+ --sidebar-accent-foreground:
160
+ hsl(240 5.9% 10%);
161
+ --sidebar-border:
162
+ hsl(220 13% 91%);
163
+ --sidebar-ring:
164
+ hsl(217.2 91.2% 59.8%);
165
+ }
166
+
167
+ .dark {
168
+ --background:
169
+ rgb(3, 7, 18);
170
+ --foreground:
171
+ rgb(249, 250, 251);
172
+ --card:
173
+ rgb(16, 24, 40);
174
+ --card-foreground:
175
+ rgb(249, 250, 251);
176
+ --popover:
177
+ rgb(16, 24, 40);
178
+ --popover-foreground:
179
+ rgb(249, 250, 251);
180
+ --primary:
181
+ rgb(229, 231, 235);
182
+ --primary-foreground:
183
+ rgb(16, 24, 40);
184
+ --secondary:
185
+ rgb(30, 41, 57);
186
+ --secondary-foreground:
187
+ rgb(249, 250, 251);
188
+ --muted:
189
+ rgb(30, 41, 57);
190
+ --muted-foreground:
191
+ rgb(153, 161, 175);
192
+ --accent:
193
+ rgb(30, 41, 57);
194
+ --accent-foreground:
195
+ rgb(249, 250, 251);
196
+ --destructive:
197
+ rgb(255, 100, 103);
198
+ --border:
199
+ rgba(255, 255, 255, 0.100);
200
+ --input:
201
+ rgba(255, 255, 255, 0.150);
202
+ --ring:
203
+ rgb(106, 114, 130);
204
+ --chart-1:
205
+ rgb(20, 71, 230);
206
+ --chart-2:
207
+ rgb(0, 188, 125);
208
+ --chart-3:
209
+ rgb(254, 154, 0);
210
+ --chart-4:
211
+ rgb(173, 70, 255);
212
+ --chart-5:
213
+ rgb(255, 32, 86);
214
+ --sidebar:
215
+ hsl(240 5.9% 10%);
216
+ --sidebar-foreground:
217
+ hsl(240 4.8% 95.9%);
218
+ --sidebar-primary:
219
+ hsl(224.3 76.3% 48%);
220
+ --sidebar-primary-foreground:
221
+ hsl(0 0% 100%);
222
+ --sidebar-accent:
223
+ hsl(240 3.7% 15.9%);
224
+ --sidebar-accent-foreground:
225
+ hsl(240 4.8% 95.9%);
226
+ --sidebar-border:
227
+ hsl(240 3.7% 15.9%);
228
+ --sidebar-ring:
229
+ hsl(217.2 91.2% 59.8%);
230
+ }
231
+
232
+ @layer base {
233
+ * {
234
+ @apply border-border outline-ring/50;
235
+ }
236
+ body {
237
+ @apply bg-background text-foreground;
238
+ }
239
+ }
app/components/header.tsx ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import { Button } from "./ui/button";
4
+ import { useSidebar } from "./ui/sidebar";
5
+ import { useState, useEffect } from "react";
6
+ import { MoonIcon, SidebarCloseIcon, SidebarOpenIcon, SunIcon } from "lucide-react";
7
+
8
+ export function Header() {
9
+ const { state, toggleSidebar } = useSidebar();
10
+
11
+ const [darkMode, setDarkMode] = useState<boolean>(() => {
12
+ try {
13
+ const stored = localStorage.getItem("theme");
14
+ if (stored) return stored === "dark";
15
+ return (
16
+ typeof window !== "undefined" &&
17
+ window.matchMedia?.("(prefers-color-scheme: dark)")?.matches
18
+ );
19
+ } catch {
20
+ return false;
21
+ }
22
+ });
23
+
24
+ useEffect(() => {
25
+ try {
26
+ const root = document.documentElement;
27
+ if (darkMode) root.classList.add("dark");
28
+ else root.classList.remove("dark");
29
+ localStorage.setItem("theme", darkMode ? "dark" : "light");
30
+ } catch {}
31
+ }, [darkMode]);
32
+
33
+ return (
34
+ <header className="flex place-content-between p-4">
35
+ <Button onClick={() => toggleSidebar()} variant="ghost" size="icon">
36
+ {state == "collapsed" ? <SidebarOpenIcon /> : <SidebarCloseIcon />}
37
+ </Button>
38
+ <Button
39
+ onClick={() => setDarkMode((v) => !v)}
40
+ variant="ghost" size="icon" aria-pressed={darkMode}
41
+ >
42
+ {darkMode ? <SunIcon /> : <MoonIcon />}
43
+ </Button>
44
+ </header>
45
+ );
46
+ }
app/components/ui/button.tsx ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { cva, type VariantProps } from "class-variance-authority"
3
+ import { Slot } from "radix-ui"
4
+
5
+ import { cn } from "~/lib/utils"
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
13
+ destructive:
14
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
15
+ outline:
16
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
17
+ secondary:
18
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19
+ ghost:
20
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
21
+ link: "text-primary underline-offset-4 hover:underline",
22
+ },
23
+ size: {
24
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
25
+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
26
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
27
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
28
+ icon: "size-9",
29
+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
30
+ "icon-sm": "size-8",
31
+ "icon-lg": "size-10",
32
+ },
33
+ },
34
+ defaultVariants: {
35
+ variant: "default",
36
+ size: "default",
37
+ },
38
+ }
39
+ )
40
+
41
+ function Button({
42
+ className,
43
+ variant = "default",
44
+ size = "default",
45
+ asChild = false,
46
+ ...props
47
+ }: React.ComponentProps<"button"> &
48
+ VariantProps<typeof buttonVariants> & {
49
+ asChild?: boolean
50
+ }) {
51
+ const Comp = asChild ? Slot.Root : "button"
52
+
53
+ return (
54
+ <Comp
55
+ data-slot="button"
56
+ data-variant={variant}
57
+ data-size={size}
58
+ className={cn(buttonVariants({ variant, size, className }))}
59
+ {...props}
60
+ />
61
+ )
62
+ }
63
+
64
+ export { Button, buttonVariants }
app/components/ui/dropdown-menu.tsx ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
3
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
4
+
5
+ import { cn } from "~/lib/utils"
6
+
7
+ function DropdownMenu({
8
+ ...props
9
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
10
+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
11
+ }
12
+
13
+ function DropdownMenuPortal({
14
+ ...props
15
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
16
+ return (
17
+ <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
18
+ )
19
+ }
20
+
21
+ function DropdownMenuTrigger({
22
+ ...props
23
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
24
+ return (
25
+ <DropdownMenuPrimitive.Trigger
26
+ data-slot="dropdown-menu-trigger"
27
+ {...props}
28
+ />
29
+ )
30
+ }
31
+
32
+ function DropdownMenuContent({
33
+ className,
34
+ sideOffset = 4,
35
+ ...props
36
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
37
+ return (
38
+ <DropdownMenuPrimitive.Portal>
39
+ <DropdownMenuPrimitive.Content
40
+ data-slot="dropdown-menu-content"
41
+ sideOffset={sideOffset}
42
+ className={cn(
43
+ "bg-popover text-popover-foreground 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 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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
44
+ className
45
+ )}
46
+ {...props}
47
+ />
48
+ </DropdownMenuPrimitive.Portal>
49
+ )
50
+ }
51
+
52
+ function DropdownMenuGroup({
53
+ ...props
54
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
55
+ return (
56
+ <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
57
+ )
58
+ }
59
+
60
+ function DropdownMenuItem({
61
+ className,
62
+ inset,
63
+ variant = "default",
64
+ ...props
65
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
66
+ inset?: boolean
67
+ variant?: "default" | "destructive"
68
+ }) {
69
+ return (
70
+ <DropdownMenuPrimitive.Item
71
+ data-slot="dropdown-menu-item"
72
+ data-inset={inset}
73
+ data-variant={variant}
74
+ className={cn(
75
+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
76
+ className
77
+ )}
78
+ {...props}
79
+ />
80
+ )
81
+ }
82
+
83
+ function DropdownMenuCheckboxItem({
84
+ className,
85
+ children,
86
+ checked,
87
+ ...props
88
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
89
+ return (
90
+ <DropdownMenuPrimitive.CheckboxItem
91
+ data-slot="dropdown-menu-checkbox-item"
92
+ className={cn(
93
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
94
+ className
95
+ )}
96
+ checked={checked}
97
+ {...props}
98
+ >
99
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
100
+ <DropdownMenuPrimitive.ItemIndicator>
101
+ <CheckIcon className="size-4" />
102
+ </DropdownMenuPrimitive.ItemIndicator>
103
+ </span>
104
+ {children}
105
+ </DropdownMenuPrimitive.CheckboxItem>
106
+ )
107
+ }
108
+
109
+ function DropdownMenuRadioGroup({
110
+ ...props
111
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
112
+ return (
113
+ <DropdownMenuPrimitive.RadioGroup
114
+ data-slot="dropdown-menu-radio-group"
115
+ {...props}
116
+ />
117
+ )
118
+ }
119
+
120
+ function DropdownMenuRadioItem({
121
+ className,
122
+ children,
123
+ ...props
124
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
125
+ return (
126
+ <DropdownMenuPrimitive.RadioItem
127
+ data-slot="dropdown-menu-radio-item"
128
+ className={cn(
129
+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
130
+ className
131
+ )}
132
+ {...props}
133
+ >
134
+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
135
+ <DropdownMenuPrimitive.ItemIndicator>
136
+ <CircleIcon className="size-2 fill-current" />
137
+ </DropdownMenuPrimitive.ItemIndicator>
138
+ </span>
139
+ {children}
140
+ </DropdownMenuPrimitive.RadioItem>
141
+ )
142
+ }
143
+
144
+ function DropdownMenuLabel({
145
+ className,
146
+ inset,
147
+ ...props
148
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
149
+ inset?: boolean
150
+ }) {
151
+ return (
152
+ <DropdownMenuPrimitive.Label
153
+ data-slot="dropdown-menu-label"
154
+ data-inset={inset}
155
+ className={cn(
156
+ "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
157
+ className
158
+ )}
159
+ {...props}
160
+ />
161
+ )
162
+ }
163
+
164
+ function DropdownMenuSeparator({
165
+ className,
166
+ ...props
167
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
168
+ return (
169
+ <DropdownMenuPrimitive.Separator
170
+ data-slot="dropdown-menu-separator"
171
+ className={cn("bg-border -mx-1 my-1 h-px", className)}
172
+ {...props}
173
+ />
174
+ )
175
+ }
176
+
177
+ function DropdownMenuShortcut({
178
+ className,
179
+ ...props
180
+ }: React.ComponentProps<"span">) {
181
+ return (
182
+ <span
183
+ data-slot="dropdown-menu-shortcut"
184
+ className={cn(
185
+ "text-muted-foreground ml-auto text-xs tracking-widest",
186
+ className
187
+ )}
188
+ {...props}
189
+ />
190
+ )
191
+ }
192
+
193
+ function DropdownMenuSub({
194
+ ...props
195
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
196
+ return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
197
+ }
198
+
199
+ function DropdownMenuSubTrigger({
200
+ className,
201
+ inset,
202
+ children,
203
+ ...props
204
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
205
+ inset?: boolean
206
+ }) {
207
+ return (
208
+ <DropdownMenuPrimitive.SubTrigger
209
+ data-slot="dropdown-menu-sub-trigger"
210
+ data-inset={inset}
211
+ className={cn(
212
+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
213
+ className
214
+ )}
215
+ {...props}
216
+ >
217
+ {children}
218
+ <ChevronRightIcon className="ml-auto size-4" />
219
+ </DropdownMenuPrimitive.SubTrigger>
220
+ )
221
+ }
222
+
223
+ function DropdownMenuSubContent({
224
+ className,
225
+ ...props
226
+ }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
227
+ return (
228
+ <DropdownMenuPrimitive.SubContent
229
+ data-slot="dropdown-menu-sub-content"
230
+ className={cn(
231
+ "bg-popover text-popover-foreground 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 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 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
232
+ className
233
+ )}
234
+ {...props}
235
+ />
236
+ )
237
+ }
238
+
239
+ export {
240
+ DropdownMenu,
241
+ DropdownMenuPortal,
242
+ DropdownMenuTrigger,
243
+ DropdownMenuContent,
244
+ DropdownMenuGroup,
245
+ DropdownMenuLabel,
246
+ DropdownMenuItem,
247
+ DropdownMenuCheckboxItem,
248
+ DropdownMenuRadioGroup,
249
+ DropdownMenuRadioItem,
250
+ DropdownMenuSeparator,
251
+ DropdownMenuShortcut,
252
+ DropdownMenuSub,
253
+ DropdownMenuSubTrigger,
254
+ DropdownMenuSubContent,
255
+ }
app/components/ui/input.tsx ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ import { cn } from "~/lib/utils"
4
+
5
+ function Input({ className, type, ...props }: React.ComponentProps<"input">) {
6
+ return (
7
+ <input
8
+ type={type}
9
+ data-slot="input"
10
+ className={cn(
11
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
12
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
13
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
14
+ className
15
+ )}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ export { Input }
app/components/ui/separator.tsx ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { Separator as SeparatorPrimitive } from "radix-ui"
3
+
4
+ import { cn } from "~/lib/utils"
5
+
6
+ function Separator({
7
+ className,
8
+ orientation = "horizontal",
9
+ decorative = true,
10
+ ...props
11
+ }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
12
+ return (
13
+ <SeparatorPrimitive.Root
14
+ data-slot="separator"
15
+ decorative={decorative}
16
+ orientation={orientation}
17
+ className={cn(
18
+ "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
19
+ className
20
+ )}
21
+ {...props}
22
+ />
23
+ )
24
+ }
25
+
26
+ export { Separator }
app/components/ui/sheet.tsx ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { XIcon } from "lucide-react"
5
+ import { Dialog as SheetPrimitive } from "radix-ui"
6
+
7
+ import { cn } from "~/lib/utils"
8
+
9
+ function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
10
+ return <SheetPrimitive.Root data-slot="sheet" {...props} />
11
+ }
12
+
13
+ function SheetTrigger({
14
+ ...props
15
+ }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
16
+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
17
+ }
18
+
19
+ function SheetClose({
20
+ ...props
21
+ }: React.ComponentProps<typeof SheetPrimitive.Close>) {
22
+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
23
+ }
24
+
25
+ function SheetPortal({
26
+ ...props
27
+ }: React.ComponentProps<typeof SheetPrimitive.Portal>) {
28
+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
29
+ }
30
+
31
+ function SheetOverlay({
32
+ className,
33
+ ...props
34
+ }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
35
+ return (
36
+ <SheetPrimitive.Overlay
37
+ data-slot="sheet-overlay"
38
+ className={cn(
39
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
40
+ className
41
+ )}
42
+ {...props}
43
+ />
44
+ )
45
+ }
46
+
47
+ function SheetContent({
48
+ className,
49
+ children,
50
+ side = "right",
51
+ showCloseButton = true,
52
+ ...props
53
+ }: React.ComponentProps<typeof SheetPrimitive.Content> & {
54
+ side?: "top" | "right" | "bottom" | "left"
55
+ showCloseButton?: boolean
56
+ }) {
57
+ return (
58
+ <SheetPortal>
59
+ <SheetOverlay />
60
+ <SheetPrimitive.Content
61
+ data-slot="sheet-content"
62
+ className={cn(
63
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
64
+ side === "right" &&
65
+ "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
66
+ side === "left" &&
67
+ "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
68
+ side === "top" &&
69
+ "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
70
+ side === "bottom" &&
71
+ "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
72
+ className
73
+ )}
74
+ {...props}
75
+ >
76
+ {children}
77
+ {showCloseButton && (
78
+ <SheetPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none">
79
+ <XIcon className="size-4" />
80
+ <span className="sr-only">Close</span>
81
+ </SheetPrimitive.Close>
82
+ )}
83
+ </SheetPrimitive.Content>
84
+ </SheetPortal>
85
+ )
86
+ }
87
+
88
+ function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
89
+ return (
90
+ <div
91
+ data-slot="sheet-header"
92
+ className={cn("flex flex-col gap-1.5 p-4", className)}
93
+ {...props}
94
+ />
95
+ )
96
+ }
97
+
98
+ function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
99
+ return (
100
+ <div
101
+ data-slot="sheet-footer"
102
+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
103
+ {...props}
104
+ />
105
+ )
106
+ }
107
+
108
+ function SheetTitle({
109
+ className,
110
+ ...props
111
+ }: React.ComponentProps<typeof SheetPrimitive.Title>) {
112
+ return (
113
+ <SheetPrimitive.Title
114
+ data-slot="sheet-title"
115
+ className={cn("text-foreground font-semibold", className)}
116
+ {...props}
117
+ />
118
+ )
119
+ }
120
+
121
+ function SheetDescription({
122
+ className,
123
+ ...props
124
+ }: React.ComponentProps<typeof SheetPrimitive.Description>) {
125
+ return (
126
+ <SheetPrimitive.Description
127
+ data-slot="sheet-description"
128
+ className={cn("text-muted-foreground text-sm", className)}
129
+ {...props}
130
+ />
131
+ )
132
+ }
133
+
134
+ export {
135
+ Sheet,
136
+ SheetTrigger,
137
+ SheetClose,
138
+ SheetContent,
139
+ SheetHeader,
140
+ SheetFooter,
141
+ SheetTitle,
142
+ SheetDescription,
143
+ }
app/components/ui/sidebar.tsx ADDED
@@ -0,0 +1,726 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+ import { PanelLeftIcon } from "lucide-react"
6
+ import { Slot } from "radix-ui"
7
+
8
+ import { useIsMobile } from "~/hooks/use-mobile"
9
+ import { cn } from "~/lib/utils"
10
+ import { Button } from "~/components/ui/button"
11
+ import { Input } from "~/components/ui/input"
12
+ import { Separator } from "~/components/ui/separator"
13
+ import {
14
+ Sheet,
15
+ SheetContent,
16
+ SheetDescription,
17
+ SheetHeader,
18
+ SheetTitle,
19
+ } from "~/components/ui/sheet"
20
+ import { Skeleton } from "~/components/ui/skeleton"
21
+ import {
22
+ Tooltip,
23
+ TooltipContent,
24
+ TooltipProvider,
25
+ TooltipTrigger,
26
+ } from "~/components/ui/tooltip"
27
+
28
+ const SIDEBAR_COOKIE_NAME = "sidebar_state"
29
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
30
+ const SIDEBAR_WIDTH = "17rem"
31
+ const SIDEBAR_WIDTH_MOBILE = "18rem"
32
+ const SIDEBAR_WIDTH_ICON = "3rem"
33
+ const SIDEBAR_KEYBOARD_SHORTCUT = "b"
34
+
35
+ type SidebarContextProps = {
36
+ state: "expanded" | "collapsed"
37
+ open: boolean
38
+ setOpen: (open: boolean) => void
39
+ openMobile: boolean
40
+ setOpenMobile: (open: boolean) => void
41
+ isMobile: boolean
42
+ toggleSidebar: () => void
43
+ }
44
+
45
+ const SidebarContext = React.createContext<SidebarContextProps | null>(null)
46
+
47
+ function useSidebar() {
48
+ const context = React.useContext(SidebarContext)
49
+ if (!context) {
50
+ throw new Error("useSidebar must be used within a SidebarProvider.")
51
+ }
52
+
53
+ return context
54
+ }
55
+
56
+ function SidebarProvider({
57
+ defaultOpen = true,
58
+ open: openProp,
59
+ onOpenChange: setOpenProp,
60
+ className,
61
+ style,
62
+ children,
63
+ ...props
64
+ }: React.ComponentProps<"div"> & {
65
+ defaultOpen?: boolean
66
+ open?: boolean
67
+ onOpenChange?: (open: boolean) => void
68
+ }) {
69
+ const isMobile = useIsMobile()
70
+ const [openMobile, setOpenMobile] = React.useState(false)
71
+
72
+ // This is the internal state of the sidebar.
73
+ // We use openProp and setOpenProp for control from outside the component.
74
+ const [_open, _setOpen] = React.useState(defaultOpen)
75
+ const open = openProp ?? _open
76
+ const setOpen = React.useCallback(
77
+ (value: boolean | ((value: boolean) => boolean)) => {
78
+ const openState = typeof value === "function" ? value(open) : value
79
+ if (setOpenProp) {
80
+ setOpenProp(openState)
81
+ } else {
82
+ _setOpen(openState)
83
+ }
84
+
85
+ // This sets the cookie to keep the sidebar state.
86
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
87
+ },
88
+ [setOpenProp, open]
89
+ )
90
+
91
+ // Helper to toggle the sidebar.
92
+ const toggleSidebar = React.useCallback(() => {
93
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)
94
+ }, [isMobile, setOpen, setOpenMobile])
95
+
96
+ // Adds a keyboard shortcut to toggle the sidebar.
97
+ React.useEffect(() => {
98
+ const handleKeyDown = (event: KeyboardEvent) => {
99
+ if (
100
+ event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
101
+ (event.metaKey || event.ctrlKey)
102
+ ) {
103
+ event.preventDefault()
104
+ toggleSidebar()
105
+ }
106
+ }
107
+
108
+ window.addEventListener("keydown", handleKeyDown)
109
+ return () => window.removeEventListener("keydown", handleKeyDown)
110
+ }, [toggleSidebar])
111
+
112
+ // We add a state so that we can do data-state="expanded" or "collapsed".
113
+ // This makes it easier to style the sidebar with Tailwind classes.
114
+ const state = open ? "expanded" : "collapsed"
115
+
116
+ const contextValue = React.useMemo<SidebarContextProps>(
117
+ () => ({
118
+ state,
119
+ open,
120
+ setOpen,
121
+ isMobile,
122
+ openMobile,
123
+ setOpenMobile,
124
+ toggleSidebar,
125
+ }),
126
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
127
+ )
128
+
129
+ return (
130
+ <SidebarContext.Provider value={contextValue}>
131
+ <TooltipProvider delayDuration={0}>
132
+ <div
133
+ data-slot="sidebar-wrapper"
134
+ style={
135
+ {
136
+ "--sidebar-width": SIDEBAR_WIDTH,
137
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
138
+ ...style,
139
+ } as React.CSSProperties
140
+ }
141
+ className={cn(
142
+ "group/sidebar-wrapper flex min-h-svh w-full",
143
+ className
144
+ )}
145
+ {...props}
146
+ >
147
+ {children}
148
+ </div>
149
+ </TooltipProvider>
150
+ </SidebarContext.Provider>
151
+ )
152
+ }
153
+
154
+ function Sidebar({
155
+ side = "left",
156
+ variant = "sidebar",
157
+ collapsible = "offcanvas",
158
+ className,
159
+ children,
160
+ ...props
161
+ }: React.ComponentProps<"div"> & {
162
+ side?: "left" | "right"
163
+ variant?: "sidebar" | "floating" | "inset"
164
+ collapsible?: "offcanvas" | "icon" | "none"
165
+ }) {
166
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
167
+
168
+ if (collapsible === "none") {
169
+ return (
170
+ <div
171
+ data-slot="sidebar"
172
+ className={cn(
173
+ "text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col",
174
+ className
175
+ )}
176
+ {...props}
177
+ >
178
+ {children}
179
+ </div>
180
+ )
181
+ }
182
+
183
+ if (isMobile) {
184
+ return (
185
+ <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
186
+ <SheetContent
187
+ data-sidebar="sidebar"
188
+ data-slot="sidebar"
189
+ data-mobile="true"
190
+ className="text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden"
191
+ style={
192
+ {
193
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
194
+ } as React.CSSProperties
195
+ }
196
+ side={side}
197
+ >
198
+ <SheetHeader className="sr-only">
199
+ <SheetTitle>Sidebar</SheetTitle>
200
+ <SheetDescription>Displays the mobile sidebar.</SheetDescription>
201
+ </SheetHeader>
202
+ <div className="flex h-full w-full flex-col">{children}</div>
203
+ </SheetContent>
204
+ </Sheet>
205
+ )
206
+ }
207
+
208
+ return (
209
+ <div
210
+ className="group peer text-sidebar-foreground hidden md:block"
211
+ data-state={state}
212
+ data-collapsible={state === "collapsed" ? collapsible : ""}
213
+ data-variant={variant}
214
+ data-side={side}
215
+ data-slot="sidebar"
216
+ >
217
+ {/* This is what handles the sidebar gap on desktop */}
218
+ <div
219
+ data-slot="sidebar-gap"
220
+ className={cn(
221
+ "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear",
222
+ "group-data-[collapsible=offcanvas]:w-0",
223
+ "group-data-[side=right]:rotate-180",
224
+ variant === "floating" || variant === "inset"
225
+ ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]"
226
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)"
227
+ )}
228
+ />
229
+ <div
230
+ data-slot="sidebar-container"
231
+ className={cn(
232
+ "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",
233
+ side === "left"
234
+ ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
235
+ : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
236
+ // Adjust the padding for floating and inset variants.
237
+ variant === "floating" || variant === "inset"
238
+ ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
239
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
240
+ className
241
+ )}
242
+ {...props}
243
+ >
244
+ <div
245
+ data-sidebar="sidebar"
246
+ data-slot="sidebar-inner"
247
+ className="group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"
248
+ >
249
+ {children}
250
+ </div>
251
+ </div>
252
+ </div>
253
+ )
254
+ }
255
+
256
+ function SidebarTrigger({
257
+ className,
258
+ onClick,
259
+ ...props
260
+ }: React.ComponentProps<typeof Button>) {
261
+ const { toggleSidebar } = useSidebar()
262
+
263
+ return (
264
+ <Button
265
+ data-sidebar="trigger"
266
+ data-slot="sidebar-trigger"
267
+ variant="ghost"
268
+ size="icon"
269
+ className={cn("size-7", className)}
270
+ onClick={(event) => {
271
+ onClick?.(event)
272
+ toggleSidebar()
273
+ }}
274
+ {...props}
275
+ >
276
+ <PanelLeftIcon />
277
+ <span className="sr-only">Toggle Sidebar</span>
278
+ </Button>
279
+ )
280
+ }
281
+
282
+ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
283
+ const { toggleSidebar } = useSidebar()
284
+
285
+ return (
286
+ <button
287
+ data-sidebar="rail"
288
+ data-slot="sidebar-rail"
289
+ aria-label="Toggle Sidebar"
290
+ tabIndex={-1}
291
+ onClick={toggleSidebar}
292
+ title="Toggle Sidebar"
293
+ className={cn(
294
+ "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
295
+ "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
296
+ "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
297
+ "hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
298
+ "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
299
+ "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
300
+ className
301
+ )}
302
+ {...props}
303
+ />
304
+ )
305
+ }
306
+
307
+ function SidebarInset({ className, ...props }: React.ComponentProps<"main">) {
308
+ return (
309
+ <main
310
+ data-slot="sidebar-inset"
311
+ className={cn(
312
+ "bg-background relative flex w-full flex-1 flex-col",
313
+ "md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2",
314
+ className
315
+ )}
316
+ {...props}
317
+ />
318
+ )
319
+ }
320
+
321
+ function SidebarInput({
322
+ className,
323
+ ...props
324
+ }: React.ComponentProps<typeof Input>) {
325
+ return (
326
+ <Input
327
+ data-slot="sidebar-input"
328
+ data-sidebar="input"
329
+ className={cn("bg-background h-8 w-full shadow-none", className)}
330
+ {...props}
331
+ />
332
+ )
333
+ }
334
+
335
+ function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) {
336
+ return (
337
+ <div
338
+ data-slot="sidebar-header"
339
+ data-sidebar="header"
340
+ className={cn("flex flex-col gap-2 p-2", className)}
341
+ {...props}
342
+ />
343
+ )
344
+ }
345
+
346
+ function SidebarFooter({ className, ...props }: React.ComponentProps<"div">) {
347
+ return (
348
+ <div
349
+ data-slot="sidebar-footer"
350
+ data-sidebar="footer"
351
+ className={cn("flex flex-col gap-2 p-2", className)}
352
+ {...props}
353
+ />
354
+ )
355
+ }
356
+
357
+ function SidebarSeparator({
358
+ className,
359
+ ...props
360
+ }: React.ComponentProps<typeof Separator>) {
361
+ return (
362
+ <Separator
363
+ data-slot="sidebar-separator"
364
+ data-sidebar="separator"
365
+ className={cn("bg-sidebar-border mx-2 w-auto", className)}
366
+ {...props}
367
+ />
368
+ )
369
+ }
370
+
371
+ function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
372
+ return (
373
+ <div
374
+ data-slot="sidebar-content"
375
+ data-sidebar="content"
376
+ className={cn(
377
+ "flex min-h-0 flex-1 flex-col gap-2",
378
+ className
379
+ )}
380
+ {...props}
381
+ />
382
+ )
383
+ }
384
+
385
+ function SidebarGroup({ className, ...props }: React.ComponentProps<"div">) {
386
+ return (
387
+ <div
388
+ data-slot="sidebar-group"
389
+ data-sidebar="group"
390
+ className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
391
+ {...props}
392
+ />
393
+ )
394
+ }
395
+
396
+ function SidebarGroupLabel({
397
+ className,
398
+ asChild = false,
399
+ ...props
400
+ }: React.ComponentProps<"div"> & { asChild?: boolean }) {
401
+ const Comp = asChild ? Slot.Root : "div"
402
+
403
+ return (
404
+ <Comp
405
+ data-slot="sidebar-group-label"
406
+ data-sidebar="group-label"
407
+ className={cn(
408
+ "text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
409
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
410
+ className
411
+ )}
412
+ {...props}
413
+ />
414
+ )
415
+ }
416
+
417
+ function SidebarGroupAction({
418
+ className,
419
+ asChild = false,
420
+ ...props
421
+ }: React.ComponentProps<"button"> & { asChild?: boolean }) {
422
+ const Comp = asChild ? Slot.Root : "button"
423
+
424
+ return (
425
+ <Comp
426
+ data-slot="sidebar-group-action"
427
+ data-sidebar="group-action"
428
+ className={cn(
429
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
430
+ // Increases the hit area of the button on mobile.
431
+ "after:absolute after:-inset-2 md:after:hidden",
432
+ "group-data-[collapsible=icon]:hidden",
433
+ className
434
+ )}
435
+ {...props}
436
+ />
437
+ )
438
+ }
439
+
440
+ function SidebarGroupContent({
441
+ className,
442
+ ...props
443
+ }: React.ComponentProps<"div">) {
444
+ return (
445
+ <div
446
+ data-slot="sidebar-group-content"
447
+ data-sidebar="group-content"
448
+ className={cn("w-full text-sm", className)}
449
+ {...props}
450
+ />
451
+ )
452
+ }
453
+
454
+ function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) {
455
+ return (
456
+ <ul
457
+ data-slot="sidebar-menu"
458
+ data-sidebar="menu"
459
+ className={cn("flex w-full min-w-0 flex-col gap-1", className)}
460
+ {...props}
461
+ />
462
+ )
463
+ }
464
+
465
+ function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
466
+ return (
467
+ <li
468
+ data-slot="sidebar-menu-item"
469
+ data-sidebar="menu-item"
470
+ className={cn("group/menu-item relative", className)}
471
+ {...props}
472
+ />
473
+ )
474
+ }
475
+
476
+ const sidebarMenuButtonVariants = cva(
477
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
478
+ {
479
+ variants: {
480
+ variant: {
481
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
482
+ outline:
483
+ "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
484
+ },
485
+ size: {
486
+ default: "h-8 text-sm",
487
+ sm: "h-7 text-xs",
488
+ lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!",
489
+ },
490
+ },
491
+ defaultVariants: {
492
+ variant: "default",
493
+ size: "default",
494
+ },
495
+ }
496
+ )
497
+
498
+ function SidebarMenuButton({
499
+ asChild = false,
500
+ isActive = false,
501
+ variant = "default",
502
+ size = "default",
503
+ tooltip,
504
+ className,
505
+ ...props
506
+ }: React.ComponentProps<"button"> & {
507
+ asChild?: boolean
508
+ isActive?: boolean
509
+ tooltip?: string | React.ComponentProps<typeof TooltipContent>
510
+ } & VariantProps<typeof sidebarMenuButtonVariants>) {
511
+ const Comp = asChild ? Slot.Root : "button"
512
+ const { isMobile, state } = useSidebar()
513
+
514
+ const button = (
515
+ <Comp
516
+ data-slot="sidebar-menu-button"
517
+ data-sidebar="menu-button"
518
+ data-size={size}
519
+ data-active={isActive}
520
+ className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
521
+ {...props}
522
+ />
523
+ )
524
+
525
+ if (!tooltip) {
526
+ return button
527
+ }
528
+
529
+ if (typeof tooltip === "string") {
530
+ tooltip = {
531
+ children: tooltip,
532
+ }
533
+ }
534
+
535
+ return (
536
+ <Tooltip>
537
+ <TooltipTrigger asChild>{button}</TooltipTrigger>
538
+ <TooltipContent
539
+ side="right"
540
+ align="center"
541
+ hidden={state !== "collapsed" || isMobile}
542
+ {...tooltip}
543
+ />
544
+ </Tooltip>
545
+ )
546
+ }
547
+
548
+ function SidebarMenuAction({
549
+ className,
550
+ asChild = false,
551
+ showOnHover = false,
552
+ ...props
553
+ }: React.ComponentProps<"button"> & {
554
+ asChild?: boolean
555
+ showOnHover?: boolean
556
+ }) {
557
+ const Comp = asChild ? Slot.Root : "button"
558
+
559
+ return (
560
+ <Comp
561
+ data-slot="sidebar-menu-action"
562
+ data-sidebar="menu-action"
563
+ className={cn(
564
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
565
+ // Increases the hit area of the button on mobile.
566
+ "after:absolute after:-inset-2 md:after:hidden",
567
+ "peer-data-[size=sm]/menu-button:top-1",
568
+ "peer-data-[size=default]/menu-button:top-1.5",
569
+ "peer-data-[size=lg]/menu-button:top-2.5",
570
+ "group-data-[collapsible=icon]:hidden",
571
+ showOnHover &&
572
+ "peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0",
573
+ className
574
+ )}
575
+ {...props}
576
+ />
577
+ )
578
+ }
579
+
580
+ function SidebarMenuBadge({
581
+ className,
582
+ ...props
583
+ }: React.ComponentProps<"div">) {
584
+ return (
585
+ <div
586
+ data-slot="sidebar-menu-badge"
587
+ data-sidebar="menu-badge"
588
+ className={cn(
589
+ "text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none",
590
+ "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
591
+ "peer-data-[size=sm]/menu-button:top-1",
592
+ "peer-data-[size=default]/menu-button:top-1.5",
593
+ "peer-data-[size=lg]/menu-button:top-2.5",
594
+ "group-data-[collapsible=icon]:hidden",
595
+ className
596
+ )}
597
+ {...props}
598
+ />
599
+ )
600
+ }
601
+
602
+ function SidebarMenuSkeleton({
603
+ className,
604
+ showIcon = false,
605
+ ...props
606
+ }: React.ComponentProps<"div"> & {
607
+ showIcon?: boolean
608
+ }) {
609
+ // Random width between 50 to 90%.
610
+ const width = React.useMemo(() => {
611
+ return `${Math.floor(Math.random() * 40) + 50}%`
612
+ }, [])
613
+
614
+ return (
615
+ <div
616
+ data-slot="sidebar-menu-skeleton"
617
+ data-sidebar="menu-skeleton"
618
+ className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
619
+ {...props}
620
+ >
621
+ {showIcon && (
622
+ <Skeleton
623
+ className="size-4 rounded-md"
624
+ data-sidebar="menu-skeleton-icon"
625
+ />
626
+ )}
627
+ <Skeleton
628
+ className="h-4 max-w-(--skeleton-width) flex-1"
629
+ data-sidebar="menu-skeleton-text"
630
+ style={
631
+ {
632
+ "--skeleton-width": width,
633
+ } as React.CSSProperties
634
+ }
635
+ />
636
+ </div>
637
+ )
638
+ }
639
+
640
+ function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) {
641
+ return (
642
+ <ul
643
+ data-slot="sidebar-menu-sub"
644
+ data-sidebar="menu-sub"
645
+ className={cn(
646
+ "border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5",
647
+ "group-data-[collapsible=icon]:hidden",
648
+ className
649
+ )}
650
+ {...props}
651
+ />
652
+ )
653
+ }
654
+
655
+ function SidebarMenuSubItem({
656
+ className,
657
+ ...props
658
+ }: React.ComponentProps<"li">) {
659
+ return (
660
+ <li
661
+ data-slot="sidebar-menu-sub-item"
662
+ data-sidebar="menu-sub-item"
663
+ className={cn("group/menu-sub-item relative", className)}
664
+ {...props}
665
+ />
666
+ )
667
+ }
668
+
669
+ function SidebarMenuSubButton({
670
+ asChild = false,
671
+ size = "md",
672
+ isActive = false,
673
+ className,
674
+ ...props
675
+ }: React.ComponentProps<"a"> & {
676
+ asChild?: boolean
677
+ size?: "sm" | "md"
678
+ isActive?: boolean
679
+ }) {
680
+ const Comp = asChild ? Slot.Root : "a"
681
+
682
+ return (
683
+ <Comp
684
+ data-slot="sidebar-menu-sub-button"
685
+ data-sidebar="menu-sub-button"
686
+ data-size={size}
687
+ data-active={isActive}
688
+ className={cn(
689
+ "text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
690
+ "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
691
+ size === "sm" && "text-xs",
692
+ size === "md" && "text-sm",
693
+ "group-data-[collapsible=icon]:hidden",
694
+ className
695
+ )}
696
+ {...props}
697
+ />
698
+ )
699
+ }
700
+
701
+ export {
702
+ Sidebar,
703
+ SidebarContent,
704
+ SidebarFooter,
705
+ SidebarGroup,
706
+ SidebarGroupAction,
707
+ SidebarGroupContent,
708
+ SidebarGroupLabel,
709
+ SidebarHeader,
710
+ SidebarInput,
711
+ SidebarInset,
712
+ SidebarMenu,
713
+ SidebarMenuAction,
714
+ SidebarMenuBadge,
715
+ SidebarMenuButton,
716
+ SidebarMenuItem,
717
+ SidebarMenuSkeleton,
718
+ SidebarMenuSub,
719
+ SidebarMenuSubButton,
720
+ SidebarMenuSubItem,
721
+ SidebarProvider,
722
+ SidebarRail,
723
+ SidebarSeparator,
724
+ SidebarTrigger,
725
+ useSidebar,
726
+ }
app/components/ui/skeleton.tsx ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { cn } from "~/lib/utils"
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4
+ return (
5
+ <div
6
+ data-slot="skeleton"
7
+ className={cn("bg-accent animate-pulse rounded-md", className)}
8
+ {...props}
9
+ />
10
+ )
11
+ }
12
+
13
+ export { Skeleton }
app/components/ui/tooltip.tsx ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { Tooltip as TooltipPrimitive } from "radix-ui"
3
+
4
+ import { cn } from "~/lib/utils"
5
+
6
+ function TooltipProvider({
7
+ delayDuration = 0,
8
+ ...props
9
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
10
+ return (
11
+ <TooltipPrimitive.Provider
12
+ data-slot="tooltip-provider"
13
+ delayDuration={delayDuration}
14
+ {...props}
15
+ />
16
+ )
17
+ }
18
+
19
+ function Tooltip({
20
+ ...props
21
+ }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
22
+ return (
23
+ <TooltipProvider>
24
+ <TooltipPrimitive.Root data-slot="tooltip" {...props} />
25
+ </TooltipProvider>
26
+ )
27
+ }
28
+
29
+ function TooltipTrigger({
30
+ ...props
31
+ }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
32
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
33
+ }
34
+
35
+ function TooltipContent({
36
+ className,
37
+ sideOffset = 0,
38
+ children,
39
+ ...props
40
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
41
+ return (
42
+ <TooltipPrimitive.Portal>
43
+ <TooltipPrimitive.Content
44
+ data-slot="tooltip-content"
45
+ sideOffset={sideOffset}
46
+ className={cn(
47
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 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 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
48
+ className
49
+ )}
50
+ {...props}
51
+ >
52
+ {children}
53
+ <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
54
+ </TooltipPrimitive.Content>
55
+ </TooltipPrimitive.Portal>
56
+ )
57
+ }
58
+
59
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
app/hooks/use-mobile.ts ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ const MOBILE_BREAKPOINT = 768
4
+
5
+ export function useIsMobile() {
6
+ const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)
7
+
8
+ React.useEffect(() => {
9
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10
+ const onChange = () => {
11
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12
+ }
13
+ mql.addEventListener("change", onChange)
14
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15
+ return () => mql.removeEventListener("change", onChange)
16
+ }, [])
17
+
18
+ return !!isMobile
19
+ }
app/lib/utils.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
app/root.tsx CHANGED
@@ -1,4 +1,5 @@
1
  import {
 
2
  Meta,
3
  Links,
4
  Outlet,
@@ -7,8 +8,12 @@ import {
7
  isRouteErrorResponse,
8
  } from "react-router";
9
  import type { Route } from "./+types/root";
 
 
 
10
 
11
  import "./app.css";
 
12
 
13
  export function Layout({ children }: { children: React.ReactNode }) {
14
  return (
@@ -24,7 +29,38 @@ export function Layout({ children }: { children: React.ReactNode }) {
24
  <Links />
25
  </head>
26
  <body>
27
- {children}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  <ScrollRestoration />
29
  <Scripts />
30
  </body>
@@ -53,7 +89,7 @@ export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
53
  }
54
 
55
  return (
56
- <main className="pt-16 p-4 container mx-auto">
57
  <h1>{message}</h1>
58
  <p>{details}</p>
59
  {stack && (
 
1
  import {
2
+ Link,
3
  Meta,
4
  Links,
5
  Outlet,
 
8
  isRouteErrorResponse,
9
  } from "react-router";
10
  import type { Route } from "./+types/root";
11
+ import { Header } from "./components/header";
12
+ import { Building2Icon, LayoutDashboardIcon } from "lucide-react";
13
+ import { Sidebar, SidebarContent, SidebarFooter, SidebarInset, SidebarProvider } from "./components/ui/sidebar";
14
 
15
  import "./app.css";
16
+ import { Avatar } from "radix-ui";
17
 
18
  export function Layout({ children }: { children: React.ReactNode }) {
19
  return (
 
29
  <Links />
30
  </head>
31
  <body>
32
+ <SidebarProvider>
33
+ <Sidebar collapsible="icon">
34
+ <SidebarContent className="p-4">
35
+ <Link to="/" title="Jobs" className="flex place-items-center group-data-[collapsible=icon]:place-content-center gap-2 px-4 py-2 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:-mx-2 hover:bg-gray-200 dark:hover:bg-gray-800 rounded-md">
36
+ <Building2Icon /> <span className="group-data-[collapsible=icon]:hidden">Jobs</span>
37
+ </Link>
38
+ <Link to="/dashboard" title="Dashboard" className="flex place-items-center group-data-[collapsible=icon]:place-content-center gap-2 px-4 py-2 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:-mx-2 hover:bg-gray-200 dark:hover:bg-gray-800 rounded-md">
39
+ <LayoutDashboardIcon /> <span className="group-data-[collapsible=icon]:hidden">Dashboard</span>
40
+ </Link>
41
+ </SidebarContent>
42
+ <SidebarFooter className="p-4">
43
+ <div className="group-data-[collapsible=icon]:-mx-5 flex gap-2">
44
+ <Avatar.Avatar className="shrink-0">
45
+ <Avatar.AvatarImage
46
+ src="https://github.com/ashamethedestroyer.png"
47
+ alt="@ashamethedestroyer"
48
+ className="size-10 rounded-full"
49
+ />
50
+ <Avatar.AvatarFallback className="rounded-full bg-gray-200 dark:bg-gray-800 size-10 flex items-center justify-center">A</Avatar.AvatarFallback>
51
+ </Avatar.Avatar>
52
+ <div className="overflow-hidden group-data-[collapsible=icon]:hidden">
53
+ <p className="font-bold whitespace-nowrap text-ellipsis overflow-hidden">Hashem Wannous</p>
54
+ <p className="whitespace-nowrap text-ellipsis overflow-hidden">@ashamethedestroyer</p>
55
+ </div>
56
+ </div>
57
+ </SidebarFooter>
58
+ </Sidebar>
59
+ <SidebarInset className="flex flex-col h-screen">
60
+ <Header />
61
+ <main>{children}</main>
62
+ </SidebarInset>
63
+ </SidebarProvider>
64
  <ScrollRestoration />
65
  <Scripts />
66
  </body>
 
89
  }
90
 
91
  return (
92
+ <main className="flex flex-col items-center justify-center p-8">
93
  <h1>{message}</h1>
94
  <p>{details}</p>
95
  {stack && (
app/routes/home.tsx CHANGED
@@ -1,5 +1,4 @@
1
  import type { Route } from "./+types/home";
2
- import { Welcome } from "../welcome/welcome";
3
 
4
  export function meta({}: Route.MetaArgs) {
5
  return [
@@ -9,5 +8,7 @@ export function meta({}: Route.MetaArgs) {
9
  }
10
 
11
  export default function Home() {
12
- return <Welcome />;
 
 
13
  }
 
1
  import type { Route } from "./+types/home";
 
2
 
3
  export function meta({}: Route.MetaArgs) {
4
  return [
 
8
  }
9
 
10
  export default function Home() {
11
+ return <main className="container mx-auto p-4">
12
+ <h1 className="font-bold text-4xl">Talent Technical Evaluation</h1>
13
+ </main>
14
  }
app/welcome/welcome.tsx DELETED
@@ -1,3 +0,0 @@
1
- export function Welcome() {
2
- return <div>okdwoakd</div>;
3
- }
 
 
 
 
components.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "app/app.css",
9
+ "baseColor": "gray",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "rtl": false,
15
+ "aliases": {
16
+ "components": "~/components",
17
+ "utils": "~/lib/utils",
18
+ "ui": "~/components/ui",
19
+ "lib": "~/lib",
20
+ "hooks": "~/hooks"
21
+ },
22
+ "registries": {}
23
+ }
package-lock.json CHANGED
@@ -8,10 +8,15 @@
8
  "dependencies": {
9
  "@react-router/node": "7.12.0",
10
  "@react-router/serve": "7.12.0",
 
 
11
  "isbot": "^5.1.31",
 
 
12
  "react": "^19.2.4",
13
  "react-dom": "^19.2.4",
14
- "react-router": "7.12.0"
 
15
  },
16
  "devDependencies": {
17
  "@react-router/dev": "7.12.0",
@@ -20,6 +25,7 @@
20
  "@types/react": "^19.2.7",
21
  "@types/react-dom": "^19.2.3",
22
  "tailwindcss": "^4.1.13",
 
23
  "typescript": "^5.9.2",
24
  "vite": "^7.1.7",
25
  "vite-tsconfig-paths": "^5.1.4"
@@ -896,94 +902,1630 @@
896
  "node": ">=18"
897
  }
898
  },
899
- "node_modules/@esbuild/win32-ia32": {
900
- "version": "0.27.2",
901
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
902
- "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
903
- "cpu": [
904
- "ia32"
905
- ],
906
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
907
  "license": "MIT",
908
- "optional": true,
909
- "os": [
910
- "win32"
911
- ],
912
- "engines": {
913
- "node": ">=18"
 
 
 
 
 
914
  }
915
  },
916
- "node_modules/@esbuild/win32-x64": {
917
- "version": "0.27.2",
918
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
919
- "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
920
- "cpu": [
921
- "x64"
922
- ],
923
- "dev": true,
924
  "license": "MIT",
925
- "optional": true,
926
- "os": [
927
- "win32"
928
- ],
929
- "engines": {
930
- "node": ">=18"
 
 
 
 
 
931
  }
932
  },
933
- "node_modules/@jridgewell/gen-mapping": {
934
- "version": "0.3.13",
935
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
936
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
937
- "dev": true,
938
  "license": "MIT",
939
- "dependencies": {
940
- "@jridgewell/sourcemap-codec": "^1.5.0",
941
- "@jridgewell/trace-mapping": "^0.3.24"
 
 
 
 
 
942
  }
943
  },
944
- "node_modules/@jridgewell/remapping": {
945
- "version": "2.3.5",
946
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
947
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
948
- "dev": true,
949
  "license": "MIT",
950
- "dependencies": {
951
- "@jridgewell/gen-mapping": "^0.3.5",
952
- "@jridgewell/trace-mapping": "^0.3.24"
 
 
 
 
 
953
  }
954
  },
955
- "node_modules/@jridgewell/resolve-uri": {
956
- "version": "3.1.2",
957
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
958
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
959
- "dev": true,
960
  "license": "MIT",
961
- "engines": {
962
- "node": ">=6.0.0"
 
 
 
 
 
 
 
 
 
963
  }
964
  },
965
- "node_modules/@jridgewell/sourcemap-codec": {
966
- "version": "1.5.5",
967
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
968
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
969
- "dev": true,
970
- "license": "MIT"
 
 
 
 
 
 
 
 
 
 
 
971
  },
972
- "node_modules/@jridgewell/trace-mapping": {
973
- "version": "0.3.31",
974
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
975
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
976
- "dev": true,
977
  "license": "MIT",
978
  "dependencies": {
979
- "@jridgewell/resolve-uri": "^3.1.0",
980
- "@jridgewell/sourcemap-codec": "^1.4.14"
 
 
 
 
 
 
 
 
 
 
 
 
 
981
  }
982
  },
983
- "node_modules/@mjackson/node-fetch-server": {
984
- "version": "0.2.0",
985
- "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz",
986
- "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==",
987
  "license": "MIT"
988
  },
989
  "node_modules/@react-router/dev": {
@@ -1773,7 +3315,7 @@
1773
  "version": "19.2.10",
1774
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz",
1775
  "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==",
1776
- "dev": true,
1777
  "license": "MIT",
1778
  "dependencies": {
1779
  "csstype": "^3.2.2"
@@ -1783,7 +3325,7 @@
1783
  "version": "19.2.3",
1784
  "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
1785
  "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
1786
- "dev": true,
1787
  "license": "MIT",
1788
  "peerDependencies": {
1789
  "@types/react": "^19.2.0"
@@ -1818,6 +3360,18 @@
1818
  "dev": true,
1819
  "license": "MIT"
1820
  },
 
 
 
 
 
 
 
 
 
 
 
 
1821
  "node_modules/array-flatten": {
1822
  "version": "1.1.1",
1823
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -2029,6 +3583,27 @@
2029
  "url": "https://paulmillr.com/funding/"
2030
  }
2031
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2032
  "node_modules/compressible": {
2033
  "version": "2.0.18",
2034
  "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -2128,7 +3703,7 @@
2128
  "version": "3.2.3",
2129
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
2130
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
2131
- "dev": true,
2132
  "license": "MIT"
2133
  },
2134
  "node_modules/debug": {
@@ -2193,6 +3768,12 @@
2193
  "node": ">=8"
2194
  }
2195
  },
 
 
 
 
 
 
2196
  "node_modules/dunder-proto": {
2197
  "version": "1.0.1",
2198
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -2555,6 +4136,15 @@
2555
  "url": "https://github.com/sponsors/ljharb"
2556
  }
2557
  },
 
 
 
 
 
 
 
 
 
2558
  "node_modules/get-port": {
2559
  "version": "5.1.1",
2560
  "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
@@ -3007,6 +4597,15 @@
3007
  "yallist": "^3.0.2"
3008
  }
3009
  },
 
 
 
 
 
 
 
 
 
3010
  "node_modules/magic-string": {
3011
  "version": "0.30.21",
3012
  "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
@@ -3359,6 +4958,83 @@
3359
  "url": "https://github.com/sponsors/ljharb"
3360
  }
3361
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3362
  "node_modules/range-parser": {
3363
  "version": "1.2.1",
3364
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -3414,6 +5090,53 @@
3414
  "node": ">=0.10.0"
3415
  }
3416
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3417
  "node_modules/react-router": {
3418
  "version": "7.12.0",
3419
  "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz",
@@ -3449,6 +5172,28 @@
3449
  "url": "https://opencollective.com/express"
3450
  }
3451
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3452
  "node_modules/readdirp": {
3453
  "version": "4.1.2",
3454
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -3729,6 +5474,16 @@
3729
  "node": ">= 0.8"
3730
  }
3731
  },
 
 
 
 
 
 
 
 
 
 
3732
  "node_modules/tailwindcss": {
3733
  "version": "4.1.18",
3734
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
@@ -3797,6 +5552,22 @@
3797
  }
3798
  }
3799
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3800
  "node_modules/type-is": {
3801
  "version": "1.6.18",
3802
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -3871,6 +5642,58 @@
3871
  "browserslist": ">= 4.21.0"
3872
  }
3873
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3874
  "node_modules/utils-merge": {
3875
  "version": "1.0.1",
3876
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 
8
  "dependencies": {
9
  "@react-router/node": "7.12.0",
10
  "@react-router/serve": "7.12.0",
11
+ "class-variance-authority": "^0.7.1",
12
+ "clsx": "^2.1.1",
13
  "isbot": "^5.1.31",
14
+ "lucide-react": "^0.563.0",
15
+ "radix-ui": "^1.4.3",
16
  "react": "^19.2.4",
17
  "react-dom": "^19.2.4",
18
+ "react-router": "7.12.0",
19
+ "tailwind-merge": "^3.4.0"
20
  },
21
  "devDependencies": {
22
  "@react-router/dev": "7.12.0",
 
25
  "@types/react": "^19.2.7",
26
  "@types/react-dom": "^19.2.3",
27
  "tailwindcss": "^4.1.13",
28
+ "tw-animate-css": "^1.4.0",
29
  "typescript": "^5.9.2",
30
  "vite": "^7.1.7",
31
  "vite-tsconfig-paths": "^5.1.4"
 
902
  "node": ">=18"
903
  }
904
  },
905
+ "node_modules/@esbuild/win32-ia32": {
906
+ "version": "0.27.2",
907
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
908
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
909
+ "cpu": [
910
+ "ia32"
911
+ ],
912
+ "dev": true,
913
+ "license": "MIT",
914
+ "optional": true,
915
+ "os": [
916
+ "win32"
917
+ ],
918
+ "engines": {
919
+ "node": ">=18"
920
+ }
921
+ },
922
+ "node_modules/@esbuild/win32-x64": {
923
+ "version": "0.27.2",
924
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
925
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
926
+ "cpu": [
927
+ "x64"
928
+ ],
929
+ "dev": true,
930
+ "license": "MIT",
931
+ "optional": true,
932
+ "os": [
933
+ "win32"
934
+ ],
935
+ "engines": {
936
+ "node": ">=18"
937
+ }
938
+ },
939
+ "node_modules/@floating-ui/core": {
940
+ "version": "1.7.4",
941
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz",
942
+ "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==",
943
+ "license": "MIT",
944
+ "dependencies": {
945
+ "@floating-ui/utils": "^0.2.10"
946
+ }
947
+ },
948
+ "node_modules/@floating-ui/dom": {
949
+ "version": "1.7.5",
950
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz",
951
+ "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==",
952
+ "license": "MIT",
953
+ "dependencies": {
954
+ "@floating-ui/core": "^1.7.4",
955
+ "@floating-ui/utils": "^0.2.10"
956
+ }
957
+ },
958
+ "node_modules/@floating-ui/react-dom": {
959
+ "version": "2.1.7",
960
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz",
961
+ "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==",
962
+ "license": "MIT",
963
+ "dependencies": {
964
+ "@floating-ui/dom": "^1.7.5"
965
+ },
966
+ "peerDependencies": {
967
+ "react": ">=16.8.0",
968
+ "react-dom": ">=16.8.0"
969
+ }
970
+ },
971
+ "node_modules/@floating-ui/utils": {
972
+ "version": "0.2.10",
973
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
974
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
975
+ "license": "MIT"
976
+ },
977
+ "node_modules/@jridgewell/gen-mapping": {
978
+ "version": "0.3.13",
979
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
980
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
981
+ "dev": true,
982
+ "license": "MIT",
983
+ "dependencies": {
984
+ "@jridgewell/sourcemap-codec": "^1.5.0",
985
+ "@jridgewell/trace-mapping": "^0.3.24"
986
+ }
987
+ },
988
+ "node_modules/@jridgewell/remapping": {
989
+ "version": "2.3.5",
990
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
991
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
992
+ "dev": true,
993
+ "license": "MIT",
994
+ "dependencies": {
995
+ "@jridgewell/gen-mapping": "^0.3.5",
996
+ "@jridgewell/trace-mapping": "^0.3.24"
997
+ }
998
+ },
999
+ "node_modules/@jridgewell/resolve-uri": {
1000
+ "version": "3.1.2",
1001
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
1002
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
1003
+ "dev": true,
1004
+ "license": "MIT",
1005
+ "engines": {
1006
+ "node": ">=6.0.0"
1007
+ }
1008
+ },
1009
+ "node_modules/@jridgewell/sourcemap-codec": {
1010
+ "version": "1.5.5",
1011
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
1012
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
1013
+ "dev": true,
1014
+ "license": "MIT"
1015
+ },
1016
+ "node_modules/@jridgewell/trace-mapping": {
1017
+ "version": "0.3.31",
1018
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
1019
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
1020
+ "dev": true,
1021
+ "license": "MIT",
1022
+ "dependencies": {
1023
+ "@jridgewell/resolve-uri": "^3.1.0",
1024
+ "@jridgewell/sourcemap-codec": "^1.4.14"
1025
+ }
1026
+ },
1027
+ "node_modules/@mjackson/node-fetch-server": {
1028
+ "version": "0.2.0",
1029
+ "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz",
1030
+ "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==",
1031
+ "license": "MIT"
1032
+ },
1033
+ "node_modules/@radix-ui/number": {
1034
+ "version": "1.1.1",
1035
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
1036
+ "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
1037
+ "license": "MIT"
1038
+ },
1039
+ "node_modules/@radix-ui/primitive": {
1040
+ "version": "1.1.3",
1041
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
1042
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
1043
+ "license": "MIT"
1044
+ },
1045
+ "node_modules/@radix-ui/react-accessible-icon": {
1046
+ "version": "1.1.7",
1047
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz",
1048
+ "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==",
1049
+ "license": "MIT",
1050
+ "dependencies": {
1051
+ "@radix-ui/react-visually-hidden": "1.2.3"
1052
+ },
1053
+ "peerDependencies": {
1054
+ "@types/react": "*",
1055
+ "@types/react-dom": "*",
1056
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1057
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1058
+ },
1059
+ "peerDependenciesMeta": {
1060
+ "@types/react": {
1061
+ "optional": true
1062
+ },
1063
+ "@types/react-dom": {
1064
+ "optional": true
1065
+ }
1066
+ }
1067
+ },
1068
+ "node_modules/@radix-ui/react-accordion": {
1069
+ "version": "1.2.12",
1070
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
1071
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
1072
+ "license": "MIT",
1073
+ "dependencies": {
1074
+ "@radix-ui/primitive": "1.1.3",
1075
+ "@radix-ui/react-collapsible": "1.1.12",
1076
+ "@radix-ui/react-collection": "1.1.7",
1077
+ "@radix-ui/react-compose-refs": "1.1.2",
1078
+ "@radix-ui/react-context": "1.1.2",
1079
+ "@radix-ui/react-direction": "1.1.1",
1080
+ "@radix-ui/react-id": "1.1.1",
1081
+ "@radix-ui/react-primitive": "2.1.3",
1082
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1083
+ },
1084
+ "peerDependencies": {
1085
+ "@types/react": "*",
1086
+ "@types/react-dom": "*",
1087
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1088
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1089
+ },
1090
+ "peerDependenciesMeta": {
1091
+ "@types/react": {
1092
+ "optional": true
1093
+ },
1094
+ "@types/react-dom": {
1095
+ "optional": true
1096
+ }
1097
+ }
1098
+ },
1099
+ "node_modules/@radix-ui/react-alert-dialog": {
1100
+ "version": "1.1.15",
1101
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz",
1102
+ "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==",
1103
+ "license": "MIT",
1104
+ "dependencies": {
1105
+ "@radix-ui/primitive": "1.1.3",
1106
+ "@radix-ui/react-compose-refs": "1.1.2",
1107
+ "@radix-ui/react-context": "1.1.2",
1108
+ "@radix-ui/react-dialog": "1.1.15",
1109
+ "@radix-ui/react-primitive": "2.1.3",
1110
+ "@radix-ui/react-slot": "1.2.3"
1111
+ },
1112
+ "peerDependencies": {
1113
+ "@types/react": "*",
1114
+ "@types/react-dom": "*",
1115
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1116
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1117
+ },
1118
+ "peerDependenciesMeta": {
1119
+ "@types/react": {
1120
+ "optional": true
1121
+ },
1122
+ "@types/react-dom": {
1123
+ "optional": true
1124
+ }
1125
+ }
1126
+ },
1127
+ "node_modules/@radix-ui/react-arrow": {
1128
+ "version": "1.1.7",
1129
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
1130
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
1131
+ "license": "MIT",
1132
+ "dependencies": {
1133
+ "@radix-ui/react-primitive": "2.1.3"
1134
+ },
1135
+ "peerDependencies": {
1136
+ "@types/react": "*",
1137
+ "@types/react-dom": "*",
1138
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1139
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1140
+ },
1141
+ "peerDependenciesMeta": {
1142
+ "@types/react": {
1143
+ "optional": true
1144
+ },
1145
+ "@types/react-dom": {
1146
+ "optional": true
1147
+ }
1148
+ }
1149
+ },
1150
+ "node_modules/@radix-ui/react-aspect-ratio": {
1151
+ "version": "1.1.7",
1152
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz",
1153
+ "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==",
1154
+ "license": "MIT",
1155
+ "dependencies": {
1156
+ "@radix-ui/react-primitive": "2.1.3"
1157
+ },
1158
+ "peerDependencies": {
1159
+ "@types/react": "*",
1160
+ "@types/react-dom": "*",
1161
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1162
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1163
+ },
1164
+ "peerDependenciesMeta": {
1165
+ "@types/react": {
1166
+ "optional": true
1167
+ },
1168
+ "@types/react-dom": {
1169
+ "optional": true
1170
+ }
1171
+ }
1172
+ },
1173
+ "node_modules/@radix-ui/react-avatar": {
1174
+ "version": "1.1.10",
1175
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz",
1176
+ "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==",
1177
+ "license": "MIT",
1178
+ "dependencies": {
1179
+ "@radix-ui/react-context": "1.1.2",
1180
+ "@radix-ui/react-primitive": "2.1.3",
1181
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1182
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
1183
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1184
+ },
1185
+ "peerDependencies": {
1186
+ "@types/react": "*",
1187
+ "@types/react-dom": "*",
1188
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1189
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1190
+ },
1191
+ "peerDependenciesMeta": {
1192
+ "@types/react": {
1193
+ "optional": true
1194
+ },
1195
+ "@types/react-dom": {
1196
+ "optional": true
1197
+ }
1198
+ }
1199
+ },
1200
+ "node_modules/@radix-ui/react-checkbox": {
1201
+ "version": "1.3.3",
1202
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz",
1203
+ "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==",
1204
+ "license": "MIT",
1205
+ "dependencies": {
1206
+ "@radix-ui/primitive": "1.1.3",
1207
+ "@radix-ui/react-compose-refs": "1.1.2",
1208
+ "@radix-ui/react-context": "1.1.2",
1209
+ "@radix-ui/react-presence": "1.1.5",
1210
+ "@radix-ui/react-primitive": "2.1.3",
1211
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1212
+ "@radix-ui/react-use-previous": "1.1.1",
1213
+ "@radix-ui/react-use-size": "1.1.1"
1214
+ },
1215
+ "peerDependencies": {
1216
+ "@types/react": "*",
1217
+ "@types/react-dom": "*",
1218
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1219
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1220
+ },
1221
+ "peerDependenciesMeta": {
1222
+ "@types/react": {
1223
+ "optional": true
1224
+ },
1225
+ "@types/react-dom": {
1226
+ "optional": true
1227
+ }
1228
+ }
1229
+ },
1230
+ "node_modules/@radix-ui/react-collapsible": {
1231
+ "version": "1.1.12",
1232
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
1233
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
1234
+ "license": "MIT",
1235
+ "dependencies": {
1236
+ "@radix-ui/primitive": "1.1.3",
1237
+ "@radix-ui/react-compose-refs": "1.1.2",
1238
+ "@radix-ui/react-context": "1.1.2",
1239
+ "@radix-ui/react-id": "1.1.1",
1240
+ "@radix-ui/react-presence": "1.1.5",
1241
+ "@radix-ui/react-primitive": "2.1.3",
1242
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1243
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1244
+ },
1245
+ "peerDependencies": {
1246
+ "@types/react": "*",
1247
+ "@types/react-dom": "*",
1248
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1249
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1250
+ },
1251
+ "peerDependenciesMeta": {
1252
+ "@types/react": {
1253
+ "optional": true
1254
+ },
1255
+ "@types/react-dom": {
1256
+ "optional": true
1257
+ }
1258
+ }
1259
+ },
1260
+ "node_modules/@radix-ui/react-collection": {
1261
+ "version": "1.1.7",
1262
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
1263
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
1264
+ "license": "MIT",
1265
+ "dependencies": {
1266
+ "@radix-ui/react-compose-refs": "1.1.2",
1267
+ "@radix-ui/react-context": "1.1.2",
1268
+ "@radix-ui/react-primitive": "2.1.3",
1269
+ "@radix-ui/react-slot": "1.2.3"
1270
+ },
1271
+ "peerDependencies": {
1272
+ "@types/react": "*",
1273
+ "@types/react-dom": "*",
1274
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1275
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1276
+ },
1277
+ "peerDependenciesMeta": {
1278
+ "@types/react": {
1279
+ "optional": true
1280
+ },
1281
+ "@types/react-dom": {
1282
+ "optional": true
1283
+ }
1284
+ }
1285
+ },
1286
+ "node_modules/@radix-ui/react-compose-refs": {
1287
+ "version": "1.1.2",
1288
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
1289
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
1290
+ "license": "MIT",
1291
+ "peerDependencies": {
1292
+ "@types/react": "*",
1293
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1294
+ },
1295
+ "peerDependenciesMeta": {
1296
+ "@types/react": {
1297
+ "optional": true
1298
+ }
1299
+ }
1300
+ },
1301
+ "node_modules/@radix-ui/react-context": {
1302
+ "version": "1.1.2",
1303
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
1304
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
1305
+ "license": "MIT",
1306
+ "peerDependencies": {
1307
+ "@types/react": "*",
1308
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1309
+ },
1310
+ "peerDependenciesMeta": {
1311
+ "@types/react": {
1312
+ "optional": true
1313
+ }
1314
+ }
1315
+ },
1316
+ "node_modules/@radix-ui/react-context-menu": {
1317
+ "version": "2.2.16",
1318
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz",
1319
+ "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==",
1320
+ "license": "MIT",
1321
+ "dependencies": {
1322
+ "@radix-ui/primitive": "1.1.3",
1323
+ "@radix-ui/react-context": "1.1.2",
1324
+ "@radix-ui/react-menu": "2.1.16",
1325
+ "@radix-ui/react-primitive": "2.1.3",
1326
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1327
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1328
+ },
1329
+ "peerDependencies": {
1330
+ "@types/react": "*",
1331
+ "@types/react-dom": "*",
1332
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1333
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1334
+ },
1335
+ "peerDependenciesMeta": {
1336
+ "@types/react": {
1337
+ "optional": true
1338
+ },
1339
+ "@types/react-dom": {
1340
+ "optional": true
1341
+ }
1342
+ }
1343
+ },
1344
+ "node_modules/@radix-ui/react-dialog": {
1345
+ "version": "1.1.15",
1346
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
1347
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
1348
+ "license": "MIT",
1349
+ "dependencies": {
1350
+ "@radix-ui/primitive": "1.1.3",
1351
+ "@radix-ui/react-compose-refs": "1.1.2",
1352
+ "@radix-ui/react-context": "1.1.2",
1353
+ "@radix-ui/react-dismissable-layer": "1.1.11",
1354
+ "@radix-ui/react-focus-guards": "1.1.3",
1355
+ "@radix-ui/react-focus-scope": "1.1.7",
1356
+ "@radix-ui/react-id": "1.1.1",
1357
+ "@radix-ui/react-portal": "1.1.9",
1358
+ "@radix-ui/react-presence": "1.1.5",
1359
+ "@radix-ui/react-primitive": "2.1.3",
1360
+ "@radix-ui/react-slot": "1.2.3",
1361
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1362
+ "aria-hidden": "^1.2.4",
1363
+ "react-remove-scroll": "^2.6.3"
1364
+ },
1365
+ "peerDependencies": {
1366
+ "@types/react": "*",
1367
+ "@types/react-dom": "*",
1368
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1369
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1370
+ },
1371
+ "peerDependenciesMeta": {
1372
+ "@types/react": {
1373
+ "optional": true
1374
+ },
1375
+ "@types/react-dom": {
1376
+ "optional": true
1377
+ }
1378
+ }
1379
+ },
1380
+ "node_modules/@radix-ui/react-direction": {
1381
+ "version": "1.1.1",
1382
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
1383
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
1384
+ "license": "MIT",
1385
+ "peerDependencies": {
1386
+ "@types/react": "*",
1387
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1388
+ },
1389
+ "peerDependenciesMeta": {
1390
+ "@types/react": {
1391
+ "optional": true
1392
+ }
1393
+ }
1394
+ },
1395
+ "node_modules/@radix-ui/react-dismissable-layer": {
1396
+ "version": "1.1.11",
1397
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
1398
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
1399
+ "license": "MIT",
1400
+ "dependencies": {
1401
+ "@radix-ui/primitive": "1.1.3",
1402
+ "@radix-ui/react-compose-refs": "1.1.2",
1403
+ "@radix-ui/react-primitive": "2.1.3",
1404
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1405
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
1406
+ },
1407
+ "peerDependencies": {
1408
+ "@types/react": "*",
1409
+ "@types/react-dom": "*",
1410
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1411
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1412
+ },
1413
+ "peerDependenciesMeta": {
1414
+ "@types/react": {
1415
+ "optional": true
1416
+ },
1417
+ "@types/react-dom": {
1418
+ "optional": true
1419
+ }
1420
+ }
1421
+ },
1422
+ "node_modules/@radix-ui/react-dropdown-menu": {
1423
+ "version": "2.1.16",
1424
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
1425
+ "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
1426
+ "license": "MIT",
1427
+ "dependencies": {
1428
+ "@radix-ui/primitive": "1.1.3",
1429
+ "@radix-ui/react-compose-refs": "1.1.2",
1430
+ "@radix-ui/react-context": "1.1.2",
1431
+ "@radix-ui/react-id": "1.1.1",
1432
+ "@radix-ui/react-menu": "2.1.16",
1433
+ "@radix-ui/react-primitive": "2.1.3",
1434
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1435
+ },
1436
+ "peerDependencies": {
1437
+ "@types/react": "*",
1438
+ "@types/react-dom": "*",
1439
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1440
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1441
+ },
1442
+ "peerDependenciesMeta": {
1443
+ "@types/react": {
1444
+ "optional": true
1445
+ },
1446
+ "@types/react-dom": {
1447
+ "optional": true
1448
+ }
1449
+ }
1450
+ },
1451
+ "node_modules/@radix-ui/react-focus-guards": {
1452
+ "version": "1.1.3",
1453
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
1454
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
1455
+ "license": "MIT",
1456
+ "peerDependencies": {
1457
+ "@types/react": "*",
1458
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1459
+ },
1460
+ "peerDependenciesMeta": {
1461
+ "@types/react": {
1462
+ "optional": true
1463
+ }
1464
+ }
1465
+ },
1466
+ "node_modules/@radix-ui/react-focus-scope": {
1467
+ "version": "1.1.7",
1468
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
1469
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
1470
+ "license": "MIT",
1471
+ "dependencies": {
1472
+ "@radix-ui/react-compose-refs": "1.1.2",
1473
+ "@radix-ui/react-primitive": "2.1.3",
1474
+ "@radix-ui/react-use-callback-ref": "1.1.1"
1475
+ },
1476
+ "peerDependencies": {
1477
+ "@types/react": "*",
1478
+ "@types/react-dom": "*",
1479
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1480
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1481
+ },
1482
+ "peerDependenciesMeta": {
1483
+ "@types/react": {
1484
+ "optional": true
1485
+ },
1486
+ "@types/react-dom": {
1487
+ "optional": true
1488
+ }
1489
+ }
1490
+ },
1491
+ "node_modules/@radix-ui/react-form": {
1492
+ "version": "0.1.8",
1493
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz",
1494
+ "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==",
1495
+ "license": "MIT",
1496
+ "dependencies": {
1497
+ "@radix-ui/primitive": "1.1.3",
1498
+ "@radix-ui/react-compose-refs": "1.1.2",
1499
+ "@radix-ui/react-context": "1.1.2",
1500
+ "@radix-ui/react-id": "1.1.1",
1501
+ "@radix-ui/react-label": "2.1.7",
1502
+ "@radix-ui/react-primitive": "2.1.3"
1503
+ },
1504
+ "peerDependencies": {
1505
+ "@types/react": "*",
1506
+ "@types/react-dom": "*",
1507
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1508
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1509
+ },
1510
+ "peerDependenciesMeta": {
1511
+ "@types/react": {
1512
+ "optional": true
1513
+ },
1514
+ "@types/react-dom": {
1515
+ "optional": true
1516
+ }
1517
+ }
1518
+ },
1519
+ "node_modules/@radix-ui/react-hover-card": {
1520
+ "version": "1.1.15",
1521
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz",
1522
+ "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==",
1523
+ "license": "MIT",
1524
+ "dependencies": {
1525
+ "@radix-ui/primitive": "1.1.3",
1526
+ "@radix-ui/react-compose-refs": "1.1.2",
1527
+ "@radix-ui/react-context": "1.1.2",
1528
+ "@radix-ui/react-dismissable-layer": "1.1.11",
1529
+ "@radix-ui/react-popper": "1.2.8",
1530
+ "@radix-ui/react-portal": "1.1.9",
1531
+ "@radix-ui/react-presence": "1.1.5",
1532
+ "@radix-ui/react-primitive": "2.1.3",
1533
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1534
+ },
1535
+ "peerDependencies": {
1536
+ "@types/react": "*",
1537
+ "@types/react-dom": "*",
1538
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1539
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1540
+ },
1541
+ "peerDependenciesMeta": {
1542
+ "@types/react": {
1543
+ "optional": true
1544
+ },
1545
+ "@types/react-dom": {
1546
+ "optional": true
1547
+ }
1548
+ }
1549
+ },
1550
+ "node_modules/@radix-ui/react-id": {
1551
+ "version": "1.1.1",
1552
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
1553
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
1554
+ "license": "MIT",
1555
+ "dependencies": {
1556
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1557
+ },
1558
+ "peerDependencies": {
1559
+ "@types/react": "*",
1560
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1561
+ },
1562
+ "peerDependenciesMeta": {
1563
+ "@types/react": {
1564
+ "optional": true
1565
+ }
1566
+ }
1567
+ },
1568
+ "node_modules/@radix-ui/react-label": {
1569
+ "version": "2.1.7",
1570
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
1571
+ "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
1572
+ "license": "MIT",
1573
+ "dependencies": {
1574
+ "@radix-ui/react-primitive": "2.1.3"
1575
+ },
1576
+ "peerDependencies": {
1577
+ "@types/react": "*",
1578
+ "@types/react-dom": "*",
1579
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1580
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1581
+ },
1582
+ "peerDependenciesMeta": {
1583
+ "@types/react": {
1584
+ "optional": true
1585
+ },
1586
+ "@types/react-dom": {
1587
+ "optional": true
1588
+ }
1589
+ }
1590
+ },
1591
+ "node_modules/@radix-ui/react-menu": {
1592
+ "version": "2.1.16",
1593
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
1594
+ "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
1595
+ "license": "MIT",
1596
+ "dependencies": {
1597
+ "@radix-ui/primitive": "1.1.3",
1598
+ "@radix-ui/react-collection": "1.1.7",
1599
+ "@radix-ui/react-compose-refs": "1.1.2",
1600
+ "@radix-ui/react-context": "1.1.2",
1601
+ "@radix-ui/react-direction": "1.1.1",
1602
+ "@radix-ui/react-dismissable-layer": "1.1.11",
1603
+ "@radix-ui/react-focus-guards": "1.1.3",
1604
+ "@radix-ui/react-focus-scope": "1.1.7",
1605
+ "@radix-ui/react-id": "1.1.1",
1606
+ "@radix-ui/react-popper": "1.2.8",
1607
+ "@radix-ui/react-portal": "1.1.9",
1608
+ "@radix-ui/react-presence": "1.1.5",
1609
+ "@radix-ui/react-primitive": "2.1.3",
1610
+ "@radix-ui/react-roving-focus": "1.1.11",
1611
+ "@radix-ui/react-slot": "1.2.3",
1612
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1613
+ "aria-hidden": "^1.2.4",
1614
+ "react-remove-scroll": "^2.6.3"
1615
+ },
1616
+ "peerDependencies": {
1617
+ "@types/react": "*",
1618
+ "@types/react-dom": "*",
1619
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1620
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1621
+ },
1622
+ "peerDependenciesMeta": {
1623
+ "@types/react": {
1624
+ "optional": true
1625
+ },
1626
+ "@types/react-dom": {
1627
+ "optional": true
1628
+ }
1629
+ }
1630
+ },
1631
+ "node_modules/@radix-ui/react-menubar": {
1632
+ "version": "1.1.16",
1633
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz",
1634
+ "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==",
1635
+ "license": "MIT",
1636
+ "dependencies": {
1637
+ "@radix-ui/primitive": "1.1.3",
1638
+ "@radix-ui/react-collection": "1.1.7",
1639
+ "@radix-ui/react-compose-refs": "1.1.2",
1640
+ "@radix-ui/react-context": "1.1.2",
1641
+ "@radix-ui/react-direction": "1.1.1",
1642
+ "@radix-ui/react-id": "1.1.1",
1643
+ "@radix-ui/react-menu": "2.1.16",
1644
+ "@radix-ui/react-primitive": "2.1.3",
1645
+ "@radix-ui/react-roving-focus": "1.1.11",
1646
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1647
+ },
1648
+ "peerDependencies": {
1649
+ "@types/react": "*",
1650
+ "@types/react-dom": "*",
1651
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1652
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1653
+ },
1654
+ "peerDependenciesMeta": {
1655
+ "@types/react": {
1656
+ "optional": true
1657
+ },
1658
+ "@types/react-dom": {
1659
+ "optional": true
1660
+ }
1661
+ }
1662
+ },
1663
+ "node_modules/@radix-ui/react-navigation-menu": {
1664
+ "version": "1.2.14",
1665
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz",
1666
+ "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==",
1667
+ "license": "MIT",
1668
+ "dependencies": {
1669
+ "@radix-ui/primitive": "1.1.3",
1670
+ "@radix-ui/react-collection": "1.1.7",
1671
+ "@radix-ui/react-compose-refs": "1.1.2",
1672
+ "@radix-ui/react-context": "1.1.2",
1673
+ "@radix-ui/react-direction": "1.1.1",
1674
+ "@radix-ui/react-dismissable-layer": "1.1.11",
1675
+ "@radix-ui/react-id": "1.1.1",
1676
+ "@radix-ui/react-presence": "1.1.5",
1677
+ "@radix-ui/react-primitive": "2.1.3",
1678
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1679
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1680
+ "@radix-ui/react-use-layout-effect": "1.1.1",
1681
+ "@radix-ui/react-use-previous": "1.1.1",
1682
+ "@radix-ui/react-visually-hidden": "1.2.3"
1683
+ },
1684
+ "peerDependencies": {
1685
+ "@types/react": "*",
1686
+ "@types/react-dom": "*",
1687
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1688
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1689
+ },
1690
+ "peerDependenciesMeta": {
1691
+ "@types/react": {
1692
+ "optional": true
1693
+ },
1694
+ "@types/react-dom": {
1695
+ "optional": true
1696
+ }
1697
+ }
1698
+ },
1699
+ "node_modules/@radix-ui/react-one-time-password-field": {
1700
+ "version": "0.1.8",
1701
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz",
1702
+ "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==",
1703
+ "license": "MIT",
1704
+ "dependencies": {
1705
+ "@radix-ui/number": "1.1.1",
1706
+ "@radix-ui/primitive": "1.1.3",
1707
+ "@radix-ui/react-collection": "1.1.7",
1708
+ "@radix-ui/react-compose-refs": "1.1.2",
1709
+ "@radix-ui/react-context": "1.1.2",
1710
+ "@radix-ui/react-direction": "1.1.1",
1711
+ "@radix-ui/react-primitive": "2.1.3",
1712
+ "@radix-ui/react-roving-focus": "1.1.11",
1713
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1714
+ "@radix-ui/react-use-effect-event": "0.0.2",
1715
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
1716
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1717
+ },
1718
+ "peerDependencies": {
1719
+ "@types/react": "*",
1720
+ "@types/react-dom": "*",
1721
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1722
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1723
+ },
1724
+ "peerDependenciesMeta": {
1725
+ "@types/react": {
1726
+ "optional": true
1727
+ },
1728
+ "@types/react-dom": {
1729
+ "optional": true
1730
+ }
1731
+ }
1732
+ },
1733
+ "node_modules/@radix-ui/react-password-toggle-field": {
1734
+ "version": "0.1.3",
1735
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz",
1736
+ "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==",
1737
+ "license": "MIT",
1738
+ "dependencies": {
1739
+ "@radix-ui/primitive": "1.1.3",
1740
+ "@radix-ui/react-compose-refs": "1.1.2",
1741
+ "@radix-ui/react-context": "1.1.2",
1742
+ "@radix-ui/react-id": "1.1.1",
1743
+ "@radix-ui/react-primitive": "2.1.3",
1744
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1745
+ "@radix-ui/react-use-effect-event": "0.0.2",
1746
+ "@radix-ui/react-use-is-hydrated": "0.1.0"
1747
+ },
1748
+ "peerDependencies": {
1749
+ "@types/react": "*",
1750
+ "@types/react-dom": "*",
1751
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1752
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1753
+ },
1754
+ "peerDependenciesMeta": {
1755
+ "@types/react": {
1756
+ "optional": true
1757
+ },
1758
+ "@types/react-dom": {
1759
+ "optional": true
1760
+ }
1761
+ }
1762
+ },
1763
+ "node_modules/@radix-ui/react-popover": {
1764
+ "version": "1.1.15",
1765
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz",
1766
+ "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==",
1767
+ "license": "MIT",
1768
+ "dependencies": {
1769
+ "@radix-ui/primitive": "1.1.3",
1770
+ "@radix-ui/react-compose-refs": "1.1.2",
1771
+ "@radix-ui/react-context": "1.1.2",
1772
+ "@radix-ui/react-dismissable-layer": "1.1.11",
1773
+ "@radix-ui/react-focus-guards": "1.1.3",
1774
+ "@radix-ui/react-focus-scope": "1.1.7",
1775
+ "@radix-ui/react-id": "1.1.1",
1776
+ "@radix-ui/react-popper": "1.2.8",
1777
+ "@radix-ui/react-portal": "1.1.9",
1778
+ "@radix-ui/react-presence": "1.1.5",
1779
+ "@radix-ui/react-primitive": "2.1.3",
1780
+ "@radix-ui/react-slot": "1.2.3",
1781
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1782
+ "aria-hidden": "^1.2.4",
1783
+ "react-remove-scroll": "^2.6.3"
1784
+ },
1785
+ "peerDependencies": {
1786
+ "@types/react": "*",
1787
+ "@types/react-dom": "*",
1788
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1789
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1790
+ },
1791
+ "peerDependenciesMeta": {
1792
+ "@types/react": {
1793
+ "optional": true
1794
+ },
1795
+ "@types/react-dom": {
1796
+ "optional": true
1797
+ }
1798
+ }
1799
+ },
1800
+ "node_modules/@radix-ui/react-popper": {
1801
+ "version": "1.2.8",
1802
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
1803
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
1804
+ "license": "MIT",
1805
+ "dependencies": {
1806
+ "@floating-ui/react-dom": "^2.0.0",
1807
+ "@radix-ui/react-arrow": "1.1.7",
1808
+ "@radix-ui/react-compose-refs": "1.1.2",
1809
+ "@radix-ui/react-context": "1.1.2",
1810
+ "@radix-ui/react-primitive": "2.1.3",
1811
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1812
+ "@radix-ui/react-use-layout-effect": "1.1.1",
1813
+ "@radix-ui/react-use-rect": "1.1.1",
1814
+ "@radix-ui/react-use-size": "1.1.1",
1815
+ "@radix-ui/rect": "1.1.1"
1816
+ },
1817
+ "peerDependencies": {
1818
+ "@types/react": "*",
1819
+ "@types/react-dom": "*",
1820
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1821
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1822
+ },
1823
+ "peerDependenciesMeta": {
1824
+ "@types/react": {
1825
+ "optional": true
1826
+ },
1827
+ "@types/react-dom": {
1828
+ "optional": true
1829
+ }
1830
+ }
1831
+ },
1832
+ "node_modules/@radix-ui/react-portal": {
1833
+ "version": "1.1.9",
1834
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
1835
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
1836
+ "license": "MIT",
1837
+ "dependencies": {
1838
+ "@radix-ui/react-primitive": "2.1.3",
1839
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1840
+ },
1841
+ "peerDependencies": {
1842
+ "@types/react": "*",
1843
+ "@types/react-dom": "*",
1844
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1845
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1846
+ },
1847
+ "peerDependenciesMeta": {
1848
+ "@types/react": {
1849
+ "optional": true
1850
+ },
1851
+ "@types/react-dom": {
1852
+ "optional": true
1853
+ }
1854
+ }
1855
+ },
1856
+ "node_modules/@radix-ui/react-presence": {
1857
+ "version": "1.1.5",
1858
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
1859
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
1860
+ "license": "MIT",
1861
+ "dependencies": {
1862
+ "@radix-ui/react-compose-refs": "1.1.2",
1863
+ "@radix-ui/react-use-layout-effect": "1.1.1"
1864
+ },
1865
+ "peerDependencies": {
1866
+ "@types/react": "*",
1867
+ "@types/react-dom": "*",
1868
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1869
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1870
+ },
1871
+ "peerDependenciesMeta": {
1872
+ "@types/react": {
1873
+ "optional": true
1874
+ },
1875
+ "@types/react-dom": {
1876
+ "optional": true
1877
+ }
1878
+ }
1879
+ },
1880
+ "node_modules/@radix-ui/react-primitive": {
1881
+ "version": "2.1.3",
1882
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
1883
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
1884
+ "license": "MIT",
1885
+ "dependencies": {
1886
+ "@radix-ui/react-slot": "1.2.3"
1887
+ },
1888
+ "peerDependencies": {
1889
+ "@types/react": "*",
1890
+ "@types/react-dom": "*",
1891
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1892
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1893
+ },
1894
+ "peerDependenciesMeta": {
1895
+ "@types/react": {
1896
+ "optional": true
1897
+ },
1898
+ "@types/react-dom": {
1899
+ "optional": true
1900
+ }
1901
+ }
1902
+ },
1903
+ "node_modules/@radix-ui/react-progress": {
1904
+ "version": "1.1.7",
1905
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz",
1906
+ "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==",
1907
+ "license": "MIT",
1908
+ "dependencies": {
1909
+ "@radix-ui/react-context": "1.1.2",
1910
+ "@radix-ui/react-primitive": "2.1.3"
1911
+ },
1912
+ "peerDependencies": {
1913
+ "@types/react": "*",
1914
+ "@types/react-dom": "*",
1915
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1916
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1917
+ },
1918
+ "peerDependenciesMeta": {
1919
+ "@types/react": {
1920
+ "optional": true
1921
+ },
1922
+ "@types/react-dom": {
1923
+ "optional": true
1924
+ }
1925
+ }
1926
+ },
1927
+ "node_modules/@radix-ui/react-radio-group": {
1928
+ "version": "1.3.8",
1929
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz",
1930
+ "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==",
1931
+ "license": "MIT",
1932
+ "dependencies": {
1933
+ "@radix-ui/primitive": "1.1.3",
1934
+ "@radix-ui/react-compose-refs": "1.1.2",
1935
+ "@radix-ui/react-context": "1.1.2",
1936
+ "@radix-ui/react-direction": "1.1.1",
1937
+ "@radix-ui/react-presence": "1.1.5",
1938
+ "@radix-ui/react-primitive": "2.1.3",
1939
+ "@radix-ui/react-roving-focus": "1.1.11",
1940
+ "@radix-ui/react-use-controllable-state": "1.2.2",
1941
+ "@radix-ui/react-use-previous": "1.1.1",
1942
+ "@radix-ui/react-use-size": "1.1.1"
1943
+ },
1944
+ "peerDependencies": {
1945
+ "@types/react": "*",
1946
+ "@types/react-dom": "*",
1947
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1948
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1949
+ },
1950
+ "peerDependenciesMeta": {
1951
+ "@types/react": {
1952
+ "optional": true
1953
+ },
1954
+ "@types/react-dom": {
1955
+ "optional": true
1956
+ }
1957
+ }
1958
+ },
1959
+ "node_modules/@radix-ui/react-roving-focus": {
1960
+ "version": "1.1.11",
1961
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
1962
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
1963
+ "license": "MIT",
1964
+ "dependencies": {
1965
+ "@radix-ui/primitive": "1.1.3",
1966
+ "@radix-ui/react-collection": "1.1.7",
1967
+ "@radix-ui/react-compose-refs": "1.1.2",
1968
+ "@radix-ui/react-context": "1.1.2",
1969
+ "@radix-ui/react-direction": "1.1.1",
1970
+ "@radix-ui/react-id": "1.1.1",
1971
+ "@radix-ui/react-primitive": "2.1.3",
1972
+ "@radix-ui/react-use-callback-ref": "1.1.1",
1973
+ "@radix-ui/react-use-controllable-state": "1.2.2"
1974
+ },
1975
+ "peerDependencies": {
1976
+ "@types/react": "*",
1977
+ "@types/react-dom": "*",
1978
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1979
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1980
+ },
1981
+ "peerDependenciesMeta": {
1982
+ "@types/react": {
1983
+ "optional": true
1984
+ },
1985
+ "@types/react-dom": {
1986
+ "optional": true
1987
+ }
1988
+ }
1989
+ },
1990
+ "node_modules/@radix-ui/react-scroll-area": {
1991
+ "version": "1.2.10",
1992
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
1993
+ "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
1994
+ "license": "MIT",
1995
+ "dependencies": {
1996
+ "@radix-ui/number": "1.1.1",
1997
+ "@radix-ui/primitive": "1.1.3",
1998
+ "@radix-ui/react-compose-refs": "1.1.2",
1999
+ "@radix-ui/react-context": "1.1.2",
2000
+ "@radix-ui/react-direction": "1.1.1",
2001
+ "@radix-ui/react-presence": "1.1.5",
2002
+ "@radix-ui/react-primitive": "2.1.3",
2003
+ "@radix-ui/react-use-callback-ref": "1.1.1",
2004
+ "@radix-ui/react-use-layout-effect": "1.1.1"
2005
+ },
2006
+ "peerDependencies": {
2007
+ "@types/react": "*",
2008
+ "@types/react-dom": "*",
2009
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2010
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2011
+ },
2012
+ "peerDependenciesMeta": {
2013
+ "@types/react": {
2014
+ "optional": true
2015
+ },
2016
+ "@types/react-dom": {
2017
+ "optional": true
2018
+ }
2019
+ }
2020
+ },
2021
+ "node_modules/@radix-ui/react-select": {
2022
+ "version": "2.2.6",
2023
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
2024
+ "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==",
2025
+ "license": "MIT",
2026
+ "dependencies": {
2027
+ "@radix-ui/number": "1.1.1",
2028
+ "@radix-ui/primitive": "1.1.3",
2029
+ "@radix-ui/react-collection": "1.1.7",
2030
+ "@radix-ui/react-compose-refs": "1.1.2",
2031
+ "@radix-ui/react-context": "1.1.2",
2032
+ "@radix-ui/react-direction": "1.1.1",
2033
+ "@radix-ui/react-dismissable-layer": "1.1.11",
2034
+ "@radix-ui/react-focus-guards": "1.1.3",
2035
+ "@radix-ui/react-focus-scope": "1.1.7",
2036
+ "@radix-ui/react-id": "1.1.1",
2037
+ "@radix-ui/react-popper": "1.2.8",
2038
+ "@radix-ui/react-portal": "1.1.9",
2039
+ "@radix-ui/react-primitive": "2.1.3",
2040
+ "@radix-ui/react-slot": "1.2.3",
2041
+ "@radix-ui/react-use-callback-ref": "1.1.1",
2042
+ "@radix-ui/react-use-controllable-state": "1.2.2",
2043
+ "@radix-ui/react-use-layout-effect": "1.1.1",
2044
+ "@radix-ui/react-use-previous": "1.1.1",
2045
+ "@radix-ui/react-visually-hidden": "1.2.3",
2046
+ "aria-hidden": "^1.2.4",
2047
+ "react-remove-scroll": "^2.6.3"
2048
+ },
2049
+ "peerDependencies": {
2050
+ "@types/react": "*",
2051
+ "@types/react-dom": "*",
2052
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2053
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2054
+ },
2055
+ "peerDependenciesMeta": {
2056
+ "@types/react": {
2057
+ "optional": true
2058
+ },
2059
+ "@types/react-dom": {
2060
+ "optional": true
2061
+ }
2062
+ }
2063
+ },
2064
+ "node_modules/@radix-ui/react-separator": {
2065
+ "version": "1.1.7",
2066
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
2067
+ "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
2068
+ "license": "MIT",
2069
+ "dependencies": {
2070
+ "@radix-ui/react-primitive": "2.1.3"
2071
+ },
2072
+ "peerDependencies": {
2073
+ "@types/react": "*",
2074
+ "@types/react-dom": "*",
2075
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2076
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2077
+ },
2078
+ "peerDependenciesMeta": {
2079
+ "@types/react": {
2080
+ "optional": true
2081
+ },
2082
+ "@types/react-dom": {
2083
+ "optional": true
2084
+ }
2085
+ }
2086
+ },
2087
+ "node_modules/@radix-ui/react-slider": {
2088
+ "version": "1.3.6",
2089
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz",
2090
+ "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==",
2091
+ "license": "MIT",
2092
+ "dependencies": {
2093
+ "@radix-ui/number": "1.1.1",
2094
+ "@radix-ui/primitive": "1.1.3",
2095
+ "@radix-ui/react-collection": "1.1.7",
2096
+ "@radix-ui/react-compose-refs": "1.1.2",
2097
+ "@radix-ui/react-context": "1.1.2",
2098
+ "@radix-ui/react-direction": "1.1.1",
2099
+ "@radix-ui/react-primitive": "2.1.3",
2100
+ "@radix-ui/react-use-controllable-state": "1.2.2",
2101
+ "@radix-ui/react-use-layout-effect": "1.1.1",
2102
+ "@radix-ui/react-use-previous": "1.1.1",
2103
+ "@radix-ui/react-use-size": "1.1.1"
2104
+ },
2105
+ "peerDependencies": {
2106
+ "@types/react": "*",
2107
+ "@types/react-dom": "*",
2108
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2109
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2110
+ },
2111
+ "peerDependenciesMeta": {
2112
+ "@types/react": {
2113
+ "optional": true
2114
+ },
2115
+ "@types/react-dom": {
2116
+ "optional": true
2117
+ }
2118
+ }
2119
+ },
2120
+ "node_modules/@radix-ui/react-slot": {
2121
+ "version": "1.2.3",
2122
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
2123
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
2124
+ "license": "MIT",
2125
+ "dependencies": {
2126
+ "@radix-ui/react-compose-refs": "1.1.2"
2127
+ },
2128
+ "peerDependencies": {
2129
+ "@types/react": "*",
2130
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2131
+ },
2132
+ "peerDependenciesMeta": {
2133
+ "@types/react": {
2134
+ "optional": true
2135
+ }
2136
+ }
2137
+ },
2138
+ "node_modules/@radix-ui/react-switch": {
2139
+ "version": "1.2.6",
2140
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz",
2141
+ "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==",
2142
+ "license": "MIT",
2143
+ "dependencies": {
2144
+ "@radix-ui/primitive": "1.1.3",
2145
+ "@radix-ui/react-compose-refs": "1.1.2",
2146
+ "@radix-ui/react-context": "1.1.2",
2147
+ "@radix-ui/react-primitive": "2.1.3",
2148
+ "@radix-ui/react-use-controllable-state": "1.2.2",
2149
+ "@radix-ui/react-use-previous": "1.1.1",
2150
+ "@radix-ui/react-use-size": "1.1.1"
2151
+ },
2152
+ "peerDependencies": {
2153
+ "@types/react": "*",
2154
+ "@types/react-dom": "*",
2155
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2156
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2157
+ },
2158
+ "peerDependenciesMeta": {
2159
+ "@types/react": {
2160
+ "optional": true
2161
+ },
2162
+ "@types/react-dom": {
2163
+ "optional": true
2164
+ }
2165
+ }
2166
+ },
2167
+ "node_modules/@radix-ui/react-tabs": {
2168
+ "version": "1.1.13",
2169
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
2170
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
2171
+ "license": "MIT",
2172
+ "dependencies": {
2173
+ "@radix-ui/primitive": "1.1.3",
2174
+ "@radix-ui/react-context": "1.1.2",
2175
+ "@radix-ui/react-direction": "1.1.1",
2176
+ "@radix-ui/react-id": "1.1.1",
2177
+ "@radix-ui/react-presence": "1.1.5",
2178
+ "@radix-ui/react-primitive": "2.1.3",
2179
+ "@radix-ui/react-roving-focus": "1.1.11",
2180
+ "@radix-ui/react-use-controllable-state": "1.2.2"
2181
+ },
2182
+ "peerDependencies": {
2183
+ "@types/react": "*",
2184
+ "@types/react-dom": "*",
2185
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2186
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2187
+ },
2188
+ "peerDependenciesMeta": {
2189
+ "@types/react": {
2190
+ "optional": true
2191
+ },
2192
+ "@types/react-dom": {
2193
+ "optional": true
2194
+ }
2195
+ }
2196
+ },
2197
+ "node_modules/@radix-ui/react-toast": {
2198
+ "version": "1.2.15",
2199
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz",
2200
+ "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==",
2201
+ "license": "MIT",
2202
+ "dependencies": {
2203
+ "@radix-ui/primitive": "1.1.3",
2204
+ "@radix-ui/react-collection": "1.1.7",
2205
+ "@radix-ui/react-compose-refs": "1.1.2",
2206
+ "@radix-ui/react-context": "1.1.2",
2207
+ "@radix-ui/react-dismissable-layer": "1.1.11",
2208
+ "@radix-ui/react-portal": "1.1.9",
2209
+ "@radix-ui/react-presence": "1.1.5",
2210
+ "@radix-ui/react-primitive": "2.1.3",
2211
+ "@radix-ui/react-use-callback-ref": "1.1.1",
2212
+ "@radix-ui/react-use-controllable-state": "1.2.2",
2213
+ "@radix-ui/react-use-layout-effect": "1.1.1",
2214
+ "@radix-ui/react-visually-hidden": "1.2.3"
2215
+ },
2216
+ "peerDependencies": {
2217
+ "@types/react": "*",
2218
+ "@types/react-dom": "*",
2219
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2220
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2221
+ },
2222
+ "peerDependenciesMeta": {
2223
+ "@types/react": {
2224
+ "optional": true
2225
+ },
2226
+ "@types/react-dom": {
2227
+ "optional": true
2228
+ }
2229
+ }
2230
+ },
2231
+ "node_modules/@radix-ui/react-toggle": {
2232
+ "version": "1.1.10",
2233
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz",
2234
+ "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==",
2235
+ "license": "MIT",
2236
+ "dependencies": {
2237
+ "@radix-ui/primitive": "1.1.3",
2238
+ "@radix-ui/react-primitive": "2.1.3",
2239
+ "@radix-ui/react-use-controllable-state": "1.2.2"
2240
+ },
2241
+ "peerDependencies": {
2242
+ "@types/react": "*",
2243
+ "@types/react-dom": "*",
2244
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2245
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2246
+ },
2247
+ "peerDependenciesMeta": {
2248
+ "@types/react": {
2249
+ "optional": true
2250
+ },
2251
+ "@types/react-dom": {
2252
+ "optional": true
2253
+ }
2254
+ }
2255
+ },
2256
+ "node_modules/@radix-ui/react-toggle-group": {
2257
+ "version": "1.1.11",
2258
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz",
2259
+ "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==",
2260
+ "license": "MIT",
2261
+ "dependencies": {
2262
+ "@radix-ui/primitive": "1.1.3",
2263
+ "@radix-ui/react-context": "1.1.2",
2264
+ "@radix-ui/react-direction": "1.1.1",
2265
+ "@radix-ui/react-primitive": "2.1.3",
2266
+ "@radix-ui/react-roving-focus": "1.1.11",
2267
+ "@radix-ui/react-toggle": "1.1.10",
2268
+ "@radix-ui/react-use-controllable-state": "1.2.2"
2269
+ },
2270
+ "peerDependencies": {
2271
+ "@types/react": "*",
2272
+ "@types/react-dom": "*",
2273
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2274
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2275
+ },
2276
+ "peerDependenciesMeta": {
2277
+ "@types/react": {
2278
+ "optional": true
2279
+ },
2280
+ "@types/react-dom": {
2281
+ "optional": true
2282
+ }
2283
+ }
2284
+ },
2285
+ "node_modules/@radix-ui/react-toolbar": {
2286
+ "version": "1.1.11",
2287
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz",
2288
+ "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==",
2289
+ "license": "MIT",
2290
+ "dependencies": {
2291
+ "@radix-ui/primitive": "1.1.3",
2292
+ "@radix-ui/react-context": "1.1.2",
2293
+ "@radix-ui/react-direction": "1.1.1",
2294
+ "@radix-ui/react-primitive": "2.1.3",
2295
+ "@radix-ui/react-roving-focus": "1.1.11",
2296
+ "@radix-ui/react-separator": "1.1.7",
2297
+ "@radix-ui/react-toggle-group": "1.1.11"
2298
+ },
2299
+ "peerDependencies": {
2300
+ "@types/react": "*",
2301
+ "@types/react-dom": "*",
2302
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2303
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2304
+ },
2305
+ "peerDependenciesMeta": {
2306
+ "@types/react": {
2307
+ "optional": true
2308
+ },
2309
+ "@types/react-dom": {
2310
+ "optional": true
2311
+ }
2312
+ }
2313
+ },
2314
+ "node_modules/@radix-ui/react-tooltip": {
2315
+ "version": "1.2.8",
2316
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
2317
+ "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
2318
+ "license": "MIT",
2319
+ "dependencies": {
2320
+ "@radix-ui/primitive": "1.1.3",
2321
+ "@radix-ui/react-compose-refs": "1.1.2",
2322
+ "@radix-ui/react-context": "1.1.2",
2323
+ "@radix-ui/react-dismissable-layer": "1.1.11",
2324
+ "@radix-ui/react-id": "1.1.1",
2325
+ "@radix-ui/react-popper": "1.2.8",
2326
+ "@radix-ui/react-portal": "1.1.9",
2327
+ "@radix-ui/react-presence": "1.1.5",
2328
+ "@radix-ui/react-primitive": "2.1.3",
2329
+ "@radix-ui/react-slot": "1.2.3",
2330
+ "@radix-ui/react-use-controllable-state": "1.2.2",
2331
+ "@radix-ui/react-visually-hidden": "1.2.3"
2332
+ },
2333
+ "peerDependencies": {
2334
+ "@types/react": "*",
2335
+ "@types/react-dom": "*",
2336
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2337
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2338
+ },
2339
+ "peerDependenciesMeta": {
2340
+ "@types/react": {
2341
+ "optional": true
2342
+ },
2343
+ "@types/react-dom": {
2344
+ "optional": true
2345
+ }
2346
+ }
2347
+ },
2348
+ "node_modules/@radix-ui/react-use-callback-ref": {
2349
+ "version": "1.1.1",
2350
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
2351
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
2352
+ "license": "MIT",
2353
+ "peerDependencies": {
2354
+ "@types/react": "*",
2355
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2356
+ },
2357
+ "peerDependenciesMeta": {
2358
+ "@types/react": {
2359
+ "optional": true
2360
+ }
2361
+ }
2362
+ },
2363
+ "node_modules/@radix-ui/react-use-controllable-state": {
2364
+ "version": "1.2.2",
2365
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
2366
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
2367
+ "license": "MIT",
2368
+ "dependencies": {
2369
+ "@radix-ui/react-use-effect-event": "0.0.2",
2370
+ "@radix-ui/react-use-layout-effect": "1.1.1"
2371
+ },
2372
+ "peerDependencies": {
2373
+ "@types/react": "*",
2374
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2375
+ },
2376
+ "peerDependenciesMeta": {
2377
+ "@types/react": {
2378
+ "optional": true
2379
+ }
2380
+ }
2381
+ },
2382
+ "node_modules/@radix-ui/react-use-effect-event": {
2383
+ "version": "0.0.2",
2384
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
2385
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
2386
+ "license": "MIT",
2387
+ "dependencies": {
2388
+ "@radix-ui/react-use-layout-effect": "1.1.1"
2389
+ },
2390
+ "peerDependencies": {
2391
+ "@types/react": "*",
2392
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2393
+ },
2394
+ "peerDependenciesMeta": {
2395
+ "@types/react": {
2396
+ "optional": true
2397
+ }
2398
+ }
2399
+ },
2400
+ "node_modules/@radix-ui/react-use-escape-keydown": {
2401
+ "version": "1.1.1",
2402
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
2403
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
2404
  "license": "MIT",
2405
+ "dependencies": {
2406
+ "@radix-ui/react-use-callback-ref": "1.1.1"
2407
+ },
2408
+ "peerDependencies": {
2409
+ "@types/react": "*",
2410
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2411
+ },
2412
+ "peerDependenciesMeta": {
2413
+ "@types/react": {
2414
+ "optional": true
2415
+ }
2416
  }
2417
  },
2418
+ "node_modules/@radix-ui/react-use-is-hydrated": {
2419
+ "version": "0.1.0",
2420
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
2421
+ "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
 
 
 
 
2422
  "license": "MIT",
2423
+ "dependencies": {
2424
+ "use-sync-external-store": "^1.5.0"
2425
+ },
2426
+ "peerDependencies": {
2427
+ "@types/react": "*",
2428
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2429
+ },
2430
+ "peerDependenciesMeta": {
2431
+ "@types/react": {
2432
+ "optional": true
2433
+ }
2434
  }
2435
  },
2436
+ "node_modules/@radix-ui/react-use-layout-effect": {
2437
+ "version": "1.1.1",
2438
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
2439
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
 
2440
  "license": "MIT",
2441
+ "peerDependencies": {
2442
+ "@types/react": "*",
2443
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2444
+ },
2445
+ "peerDependenciesMeta": {
2446
+ "@types/react": {
2447
+ "optional": true
2448
+ }
2449
  }
2450
  },
2451
+ "node_modules/@radix-ui/react-use-previous": {
2452
+ "version": "1.1.1",
2453
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
2454
+ "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
 
2455
  "license": "MIT",
2456
+ "peerDependencies": {
2457
+ "@types/react": "*",
2458
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2459
+ },
2460
+ "peerDependenciesMeta": {
2461
+ "@types/react": {
2462
+ "optional": true
2463
+ }
2464
  }
2465
  },
2466
+ "node_modules/@radix-ui/react-use-rect": {
2467
+ "version": "1.1.1",
2468
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
2469
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
 
2470
  "license": "MIT",
2471
+ "dependencies": {
2472
+ "@radix-ui/rect": "1.1.1"
2473
+ },
2474
+ "peerDependencies": {
2475
+ "@types/react": "*",
2476
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2477
+ },
2478
+ "peerDependenciesMeta": {
2479
+ "@types/react": {
2480
+ "optional": true
2481
+ }
2482
  }
2483
  },
2484
+ "node_modules/@radix-ui/react-use-size": {
2485
+ "version": "1.1.1",
2486
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
2487
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
2488
+ "license": "MIT",
2489
+ "dependencies": {
2490
+ "@radix-ui/react-use-layout-effect": "1.1.1"
2491
+ },
2492
+ "peerDependencies": {
2493
+ "@types/react": "*",
2494
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2495
+ },
2496
+ "peerDependenciesMeta": {
2497
+ "@types/react": {
2498
+ "optional": true
2499
+ }
2500
+ }
2501
  },
2502
+ "node_modules/@radix-ui/react-visually-hidden": {
2503
+ "version": "1.2.3",
2504
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
2505
+ "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
 
2506
  "license": "MIT",
2507
  "dependencies": {
2508
+ "@radix-ui/react-primitive": "2.1.3"
2509
+ },
2510
+ "peerDependencies": {
2511
+ "@types/react": "*",
2512
+ "@types/react-dom": "*",
2513
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
2514
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
2515
+ },
2516
+ "peerDependenciesMeta": {
2517
+ "@types/react": {
2518
+ "optional": true
2519
+ },
2520
+ "@types/react-dom": {
2521
+ "optional": true
2522
+ }
2523
  }
2524
  },
2525
+ "node_modules/@radix-ui/rect": {
2526
+ "version": "1.1.1",
2527
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
2528
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
2529
  "license": "MIT"
2530
  },
2531
  "node_modules/@react-router/dev": {
 
3315
  "version": "19.2.10",
3316
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.10.tgz",
3317
  "integrity": "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==",
3318
+ "devOptional": true,
3319
  "license": "MIT",
3320
  "dependencies": {
3321
  "csstype": "^3.2.2"
 
3325
  "version": "19.2.3",
3326
  "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
3327
  "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
3328
+ "devOptional": true,
3329
  "license": "MIT",
3330
  "peerDependencies": {
3331
  "@types/react": "^19.2.0"
 
3360
  "dev": true,
3361
  "license": "MIT"
3362
  },
3363
+ "node_modules/aria-hidden": {
3364
+ "version": "1.2.6",
3365
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
3366
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
3367
+ "license": "MIT",
3368
+ "dependencies": {
3369
+ "tslib": "^2.0.0"
3370
+ },
3371
+ "engines": {
3372
+ "node": ">=10"
3373
+ }
3374
+ },
3375
  "node_modules/array-flatten": {
3376
  "version": "1.1.1",
3377
  "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 
3583
  "url": "https://paulmillr.com/funding/"
3584
  }
3585
  },
3586
+ "node_modules/class-variance-authority": {
3587
+ "version": "0.7.1",
3588
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
3589
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
3590
+ "license": "Apache-2.0",
3591
+ "dependencies": {
3592
+ "clsx": "^2.1.1"
3593
+ },
3594
+ "funding": {
3595
+ "url": "https://polar.sh/cva"
3596
+ }
3597
+ },
3598
+ "node_modules/clsx": {
3599
+ "version": "2.1.1",
3600
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
3601
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
3602
+ "license": "MIT",
3603
+ "engines": {
3604
+ "node": ">=6"
3605
+ }
3606
+ },
3607
  "node_modules/compressible": {
3608
  "version": "2.0.18",
3609
  "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
 
3703
  "version": "3.2.3",
3704
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
3705
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
3706
+ "devOptional": true,
3707
  "license": "MIT"
3708
  },
3709
  "node_modules/debug": {
 
3768
  "node": ">=8"
3769
  }
3770
  },
3771
+ "node_modules/detect-node-es": {
3772
+ "version": "1.1.0",
3773
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
3774
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
3775
+ "license": "MIT"
3776
+ },
3777
  "node_modules/dunder-proto": {
3778
  "version": "1.0.1",
3779
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 
4136
  "url": "https://github.com/sponsors/ljharb"
4137
  }
4138
  },
4139
+ "node_modules/get-nonce": {
4140
+ "version": "1.0.1",
4141
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
4142
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
4143
+ "license": "MIT",
4144
+ "engines": {
4145
+ "node": ">=6"
4146
+ }
4147
+ },
4148
  "node_modules/get-port": {
4149
  "version": "5.1.1",
4150
  "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
 
4597
  "yallist": "^3.0.2"
4598
  }
4599
  },
4600
+ "node_modules/lucide-react": {
4601
+ "version": "0.563.0",
4602
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz",
4603
+ "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==",
4604
+ "license": "ISC",
4605
+ "peerDependencies": {
4606
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
4607
+ }
4608
+ },
4609
  "node_modules/magic-string": {
4610
  "version": "0.30.21",
4611
  "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
 
4958
  "url": "https://github.com/sponsors/ljharb"
4959
  }
4960
  },
4961
+ "node_modules/radix-ui": {
4962
+ "version": "1.4.3",
4963
+ "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz",
4964
+ "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==",
4965
+ "license": "MIT",
4966
+ "dependencies": {
4967
+ "@radix-ui/primitive": "1.1.3",
4968
+ "@radix-ui/react-accessible-icon": "1.1.7",
4969
+ "@radix-ui/react-accordion": "1.2.12",
4970
+ "@radix-ui/react-alert-dialog": "1.1.15",
4971
+ "@radix-ui/react-arrow": "1.1.7",
4972
+ "@radix-ui/react-aspect-ratio": "1.1.7",
4973
+ "@radix-ui/react-avatar": "1.1.10",
4974
+ "@radix-ui/react-checkbox": "1.3.3",
4975
+ "@radix-ui/react-collapsible": "1.1.12",
4976
+ "@radix-ui/react-collection": "1.1.7",
4977
+ "@radix-ui/react-compose-refs": "1.1.2",
4978
+ "@radix-ui/react-context": "1.1.2",
4979
+ "@radix-ui/react-context-menu": "2.2.16",
4980
+ "@radix-ui/react-dialog": "1.1.15",
4981
+ "@radix-ui/react-direction": "1.1.1",
4982
+ "@radix-ui/react-dismissable-layer": "1.1.11",
4983
+ "@radix-ui/react-dropdown-menu": "2.1.16",
4984
+ "@radix-ui/react-focus-guards": "1.1.3",
4985
+ "@radix-ui/react-focus-scope": "1.1.7",
4986
+ "@radix-ui/react-form": "0.1.8",
4987
+ "@radix-ui/react-hover-card": "1.1.15",
4988
+ "@radix-ui/react-label": "2.1.7",
4989
+ "@radix-ui/react-menu": "2.1.16",
4990
+ "@radix-ui/react-menubar": "1.1.16",
4991
+ "@radix-ui/react-navigation-menu": "1.2.14",
4992
+ "@radix-ui/react-one-time-password-field": "0.1.8",
4993
+ "@radix-ui/react-password-toggle-field": "0.1.3",
4994
+ "@radix-ui/react-popover": "1.1.15",
4995
+ "@radix-ui/react-popper": "1.2.8",
4996
+ "@radix-ui/react-portal": "1.1.9",
4997
+ "@radix-ui/react-presence": "1.1.5",
4998
+ "@radix-ui/react-primitive": "2.1.3",
4999
+ "@radix-ui/react-progress": "1.1.7",
5000
+ "@radix-ui/react-radio-group": "1.3.8",
5001
+ "@radix-ui/react-roving-focus": "1.1.11",
5002
+ "@radix-ui/react-scroll-area": "1.2.10",
5003
+ "@radix-ui/react-select": "2.2.6",
5004
+ "@radix-ui/react-separator": "1.1.7",
5005
+ "@radix-ui/react-slider": "1.3.6",
5006
+ "@radix-ui/react-slot": "1.2.3",
5007
+ "@radix-ui/react-switch": "1.2.6",
5008
+ "@radix-ui/react-tabs": "1.1.13",
5009
+ "@radix-ui/react-toast": "1.2.15",
5010
+ "@radix-ui/react-toggle": "1.1.10",
5011
+ "@radix-ui/react-toggle-group": "1.1.11",
5012
+ "@radix-ui/react-toolbar": "1.1.11",
5013
+ "@radix-ui/react-tooltip": "1.2.8",
5014
+ "@radix-ui/react-use-callback-ref": "1.1.1",
5015
+ "@radix-ui/react-use-controllable-state": "1.2.2",
5016
+ "@radix-ui/react-use-effect-event": "0.0.2",
5017
+ "@radix-ui/react-use-escape-keydown": "1.1.1",
5018
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
5019
+ "@radix-ui/react-use-layout-effect": "1.1.1",
5020
+ "@radix-ui/react-use-size": "1.1.1",
5021
+ "@radix-ui/react-visually-hidden": "1.2.3"
5022
+ },
5023
+ "peerDependencies": {
5024
+ "@types/react": "*",
5025
+ "@types/react-dom": "*",
5026
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
5027
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
5028
+ },
5029
+ "peerDependenciesMeta": {
5030
+ "@types/react": {
5031
+ "optional": true
5032
+ },
5033
+ "@types/react-dom": {
5034
+ "optional": true
5035
+ }
5036
+ }
5037
+ },
5038
  "node_modules/range-parser": {
5039
  "version": "1.2.1",
5040
  "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 
5090
  "node": ">=0.10.0"
5091
  }
5092
  },
5093
+ "node_modules/react-remove-scroll": {
5094
+ "version": "2.7.2",
5095
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
5096
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
5097
+ "license": "MIT",
5098
+ "dependencies": {
5099
+ "react-remove-scroll-bar": "^2.3.7",
5100
+ "react-style-singleton": "^2.2.3",
5101
+ "tslib": "^2.1.0",
5102
+ "use-callback-ref": "^1.3.3",
5103
+ "use-sidecar": "^1.1.3"
5104
+ },
5105
+ "engines": {
5106
+ "node": ">=10"
5107
+ },
5108
+ "peerDependencies": {
5109
+ "@types/react": "*",
5110
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
5111
+ },
5112
+ "peerDependenciesMeta": {
5113
+ "@types/react": {
5114
+ "optional": true
5115
+ }
5116
+ }
5117
+ },
5118
+ "node_modules/react-remove-scroll-bar": {
5119
+ "version": "2.3.8",
5120
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
5121
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
5122
+ "license": "MIT",
5123
+ "dependencies": {
5124
+ "react-style-singleton": "^2.2.2",
5125
+ "tslib": "^2.0.0"
5126
+ },
5127
+ "engines": {
5128
+ "node": ">=10"
5129
+ },
5130
+ "peerDependencies": {
5131
+ "@types/react": "*",
5132
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
5133
+ },
5134
+ "peerDependenciesMeta": {
5135
+ "@types/react": {
5136
+ "optional": true
5137
+ }
5138
+ }
5139
+ },
5140
  "node_modules/react-router": {
5141
  "version": "7.12.0",
5142
  "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz",
 
5172
  "url": "https://opencollective.com/express"
5173
  }
5174
  },
5175
+ "node_modules/react-style-singleton": {
5176
+ "version": "2.2.3",
5177
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
5178
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
5179
+ "license": "MIT",
5180
+ "dependencies": {
5181
+ "get-nonce": "^1.0.0",
5182
+ "tslib": "^2.0.0"
5183
+ },
5184
+ "engines": {
5185
+ "node": ">=10"
5186
+ },
5187
+ "peerDependencies": {
5188
+ "@types/react": "*",
5189
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
5190
+ },
5191
+ "peerDependenciesMeta": {
5192
+ "@types/react": {
5193
+ "optional": true
5194
+ }
5195
+ }
5196
+ },
5197
  "node_modules/readdirp": {
5198
  "version": "4.1.2",
5199
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
 
5474
  "node": ">= 0.8"
5475
  }
5476
  },
5477
+ "node_modules/tailwind-merge": {
5478
+ "version": "3.4.0",
5479
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
5480
+ "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==",
5481
+ "license": "MIT",
5482
+ "funding": {
5483
+ "type": "github",
5484
+ "url": "https://github.com/sponsors/dcastil"
5485
+ }
5486
+ },
5487
  "node_modules/tailwindcss": {
5488
  "version": "4.1.18",
5489
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
 
5552
  }
5553
  }
5554
  },
5555
+ "node_modules/tslib": {
5556
+ "version": "2.8.1",
5557
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
5558
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
5559
+ "license": "0BSD"
5560
+ },
5561
+ "node_modules/tw-animate-css": {
5562
+ "version": "1.4.0",
5563
+ "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz",
5564
+ "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==",
5565
+ "dev": true,
5566
+ "license": "MIT",
5567
+ "funding": {
5568
+ "url": "https://github.com/sponsors/Wombosvideo"
5569
+ }
5570
+ },
5571
  "node_modules/type-is": {
5572
  "version": "1.6.18",
5573
  "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 
5642
  "browserslist": ">= 4.21.0"
5643
  }
5644
  },
5645
+ "node_modules/use-callback-ref": {
5646
+ "version": "1.3.3",
5647
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
5648
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
5649
+ "license": "MIT",
5650
+ "dependencies": {
5651
+ "tslib": "^2.0.0"
5652
+ },
5653
+ "engines": {
5654
+ "node": ">=10"
5655
+ },
5656
+ "peerDependencies": {
5657
+ "@types/react": "*",
5658
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
5659
+ },
5660
+ "peerDependenciesMeta": {
5661
+ "@types/react": {
5662
+ "optional": true
5663
+ }
5664
+ }
5665
+ },
5666
+ "node_modules/use-sidecar": {
5667
+ "version": "1.1.3",
5668
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
5669
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
5670
+ "license": "MIT",
5671
+ "dependencies": {
5672
+ "detect-node-es": "^1.1.0",
5673
+ "tslib": "^2.0.0"
5674
+ },
5675
+ "engines": {
5676
+ "node": ">=10"
5677
+ },
5678
+ "peerDependencies": {
5679
+ "@types/react": "*",
5680
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
5681
+ },
5682
+ "peerDependenciesMeta": {
5683
+ "@types/react": {
5684
+ "optional": true
5685
+ }
5686
+ }
5687
+ },
5688
+ "node_modules/use-sync-external-store": {
5689
+ "version": "1.6.0",
5690
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
5691
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
5692
+ "license": "MIT",
5693
+ "peerDependencies": {
5694
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
5695
+ }
5696
+ },
5697
  "node_modules/utils-merge": {
5698
  "version": "1.0.1",
5699
  "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
package.json CHANGED
@@ -11,10 +11,15 @@
11
  "dependencies": {
12
  "@react-router/node": "7.12.0",
13
  "@react-router/serve": "7.12.0",
 
 
14
  "isbot": "^5.1.31",
 
 
15
  "react": "^19.2.4",
16
  "react-dom": "^19.2.4",
17
- "react-router": "7.12.0"
 
18
  },
19
  "devDependencies": {
20
  "@react-router/dev": "7.12.0",
@@ -23,8 +28,9 @@
23
  "@types/react": "^19.2.7",
24
  "@types/react-dom": "^19.2.3",
25
  "tailwindcss": "^4.1.13",
 
26
  "typescript": "^5.9.2",
27
  "vite": "^7.1.7",
28
  "vite-tsconfig-paths": "^5.1.4"
29
  }
30
- }
 
11
  "dependencies": {
12
  "@react-router/node": "7.12.0",
13
  "@react-router/serve": "7.12.0",
14
+ "class-variance-authority": "^0.7.1",
15
+ "clsx": "^2.1.1",
16
  "isbot": "^5.1.31",
17
+ "lucide-react": "^0.563.0",
18
+ "radix-ui": "^1.4.3",
19
  "react": "^19.2.4",
20
  "react-dom": "^19.2.4",
21
+ "react-router": "7.12.0",
22
+ "tailwind-merge": "^3.4.0"
23
  },
24
  "devDependencies": {
25
  "@react-router/dev": "7.12.0",
 
28
  "@types/react": "^19.2.7",
29
  "@types/react-dom": "^19.2.3",
30
  "tailwindcss": "^4.1.13",
31
+ "tw-animate-css": "^1.4.0",
32
  "typescript": "^5.9.2",
33
  "vite": "^7.1.7",
34
  "vite-tsconfig-paths": "^5.1.4"
35
  }
36
+ }
tailwind.config.cjs ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ darkMode: 'class',
3
+ content: [
4
+ './index.html',
5
+ './app/**/*.{js,ts,jsx,tsx,css}',
6
+ './src/**/*.{js,ts,jsx,tsx,css}'
7
+ ],
8
+ theme: {
9
+ extend: {},
10
+ },
11
+ plugins: [],
12
+ }