eny.space Landingpage
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'feature/Implement-ShadCN-UI-Components#CU-86c8mtrjp' into develop

+9122 -231
+495
app/actions/components/component-example.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + 5 + import { 6 + Example, 7 + ExampleWrapper, 8 + } from "@/actions/components/example" 9 + import { 10 + AlertDialog, 11 + AlertDialogAction, 12 + AlertDialogCancel, 13 + AlertDialogContent, 14 + AlertDialogDescription, 15 + AlertDialogFooter, 16 + AlertDialogHeader, 17 + AlertDialogMedia, 18 + AlertDialogTitle, 19 + AlertDialogTrigger, 20 + } from "@/actions/components/ui/alert-dialog" 21 + import { Badge } from "@/actions/components/ui/badge" 22 + import { Button } from "@/actions/components/ui/button" 23 + import { 24 + Card, 25 + CardAction, 26 + CardContent, 27 + CardDescription, 28 + CardFooter, 29 + CardHeader, 30 + CardTitle, 31 + } from "@/actions/components/ui/card" 32 + import { 33 + Combobox, 34 + ComboboxContent, 35 + ComboboxEmpty, 36 + ComboboxInput, 37 + ComboboxItem, 38 + ComboboxList, 39 + } from "@/actions/components/ui/combobox" 40 + import { 41 + DropdownMenu, 42 + DropdownMenuCheckboxItem, 43 + DropdownMenuContent, 44 + DropdownMenuGroup, 45 + DropdownMenuItem, 46 + DropdownMenuLabel, 47 + DropdownMenuPortal, 48 + DropdownMenuRadioGroup, 49 + DropdownMenuRadioItem, 50 + DropdownMenuSeparator, 51 + DropdownMenuShortcut, 52 + DropdownMenuSub, 53 + DropdownMenuSubContent, 54 + DropdownMenuSubTrigger, 55 + DropdownMenuTrigger, 56 + } from "@/actions/components/ui/dropdown-menu" 57 + import { Field, FieldGroup, FieldLabel } from "@/actions/components/ui/field" 58 + import { Input } from "@/actions/components/ui/input" 59 + import { 60 + Select, 61 + SelectContent, 62 + SelectGroup, 63 + SelectItem, 64 + SelectTrigger, 65 + SelectValue, 66 + } from "@/actions/components/ui/select" 67 + import { Textarea } from "@/actions/components/ui/textarea" 68 + import { PlusIcon, BluetoothIcon, MoreVerticalIcon, FileIcon, FolderIcon, FolderOpenIcon, FileCodeIcon, MoreHorizontalIcon, FolderSearchIcon, SaveIcon, DownloadIcon, EyeIcon, LayoutIcon, PaletteIcon, SunIcon, MoonIcon, MonitorIcon, UserIcon, CreditCardIcon, SettingsIcon, KeyboardIcon, LanguagesIcon, BellIcon, MailIcon, ShieldIcon, HelpCircleIcon, FileTextIcon, LogOutIcon } from "lucide-react" 69 + 70 + export function ComponentExample() { 71 + return ( 72 + <ExampleWrapper> 73 + <CardExample /> 74 + <FormExample /> 75 + </ExampleWrapper> 76 + ) 77 + } 78 + 79 + function CardExample() { 80 + return ( 81 + <Example title="Card" className="items-center justify-center"> 82 + <Card className="relative w-full max-w-sm overflow-hidden pt-0"> 83 + <div className="absolute inset-0 z-30 aspect-video bg-primary opacity-50 mix-blend-color" /> 84 + <img 85 + src="https://images.unsplash.com/photo-1604076850742-4c7221f3101b?q=80&w=1887&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" 86 + alt="Photo by mymind on Unsplash" 87 + title="Photo by mymind on Unsplash" 88 + className="relative z-20 aspect-video w-full object-cover brightness-60 grayscale" 89 + /> 90 + <CardHeader> 91 + <CardTitle>Observability Plus is replacing Monitoring</CardTitle> 92 + <CardDescription> 93 + Switch to the improved way to explore your data, with natural 94 + language. Monitoring will no longer be available on the Pro plan in 95 + November, 2025 96 + </CardDescription> 97 + </CardHeader> 98 + <CardFooter> 99 + <AlertDialog> 100 + <AlertDialogTrigger asChild> 101 + <Button> 102 + <PlusIcon data-icon="inline-start" /> 103 + Show Dialog 104 + </Button> 105 + </AlertDialogTrigger> 106 + <AlertDialogContent size="sm"> 107 + <AlertDialogHeader> 108 + <AlertDialogMedia> 109 + <BluetoothIcon 110 + /> 111 + </AlertDialogMedia> 112 + <AlertDialogTitle>Allow accessory to connect?</AlertDialogTitle> 113 + <AlertDialogDescription> 114 + Do you want to allow the USB accessory to connect to this 115 + device? 116 + </AlertDialogDescription> 117 + </AlertDialogHeader> 118 + <AlertDialogFooter> 119 + <AlertDialogCancel>Don&apos;t allow</AlertDialogCancel> 120 + <AlertDialogAction>Allow</AlertDialogAction> 121 + </AlertDialogFooter> 122 + </AlertDialogContent> 123 + </AlertDialog> 124 + <Badge variant="secondary" className="ml-auto"> 125 + Warning 126 + </Badge> 127 + </CardFooter> 128 + </Card> 129 + </Example> 130 + ) 131 + } 132 + 133 + const frameworks = [ 134 + "Next.js", 135 + "SvelteKit", 136 + "Nuxt.js", 137 + "Remix", 138 + "Astro", 139 + ] as const 140 + 141 + function FormExample() { 142 + const [notifications, setNotifications] = React.useState({ 143 + email: true, 144 + sms: false, 145 + push: true, 146 + }) 147 + const [theme, setTheme] = React.useState("light") 148 + 149 + return ( 150 + <Example title="Form"> 151 + <Card className="w-full max-w-md"> 152 + <CardHeader> 153 + <CardTitle>User Information</CardTitle> 154 + <CardDescription>Please fill in your details below</CardDescription> 155 + <CardAction> 156 + <DropdownMenu> 157 + <DropdownMenuTrigger asChild> 158 + <Button variant="ghost" size="icon"> 159 + <MoreVerticalIcon 160 + /> 161 + <span className="sr-only">More options</span> 162 + </Button> 163 + </DropdownMenuTrigger> 164 + <DropdownMenuContent align="end" className="w-56"> 165 + <DropdownMenuGroup> 166 + <DropdownMenuLabel>File</DropdownMenuLabel> 167 + <DropdownMenuItem> 168 + <FileIcon 169 + /> 170 + New File 171 + <DropdownMenuShortcut>⌘N</DropdownMenuShortcut> 172 + </DropdownMenuItem> 173 + <DropdownMenuItem> 174 + <FolderIcon 175 + /> 176 + New Folder 177 + <DropdownMenuShortcut>⇧⌘N</DropdownMenuShortcut> 178 + </DropdownMenuItem> 179 + <DropdownMenuSub> 180 + <DropdownMenuSubTrigger> 181 + <FolderOpenIcon 182 + /> 183 + Open Recent 184 + </DropdownMenuSubTrigger> 185 + <DropdownMenuPortal> 186 + <DropdownMenuSubContent> 187 + <DropdownMenuGroup> 188 + <DropdownMenuLabel>Recent Projects</DropdownMenuLabel> 189 + <DropdownMenuItem> 190 + <FileCodeIcon 191 + /> 192 + Project Alpha 193 + </DropdownMenuItem> 194 + <DropdownMenuItem> 195 + <FileCodeIcon 196 + /> 197 + Project Beta 198 + </DropdownMenuItem> 199 + <DropdownMenuSub> 200 + <DropdownMenuSubTrigger> 201 + <MoreHorizontalIcon 202 + /> 203 + More Projects 204 + </DropdownMenuSubTrigger> 205 + <DropdownMenuPortal> 206 + <DropdownMenuSubContent> 207 + <DropdownMenuItem> 208 + <FileCodeIcon 209 + /> 210 + Project Gamma 211 + </DropdownMenuItem> 212 + <DropdownMenuItem> 213 + <FileCodeIcon 214 + /> 215 + Project Delta 216 + </DropdownMenuItem> 217 + </DropdownMenuSubContent> 218 + </DropdownMenuPortal> 219 + </DropdownMenuSub> 220 + </DropdownMenuGroup> 221 + <DropdownMenuSeparator /> 222 + <DropdownMenuGroup> 223 + <DropdownMenuItem> 224 + <FolderSearchIcon 225 + /> 226 + Browse... 227 + </DropdownMenuItem> 228 + </DropdownMenuGroup> 229 + </DropdownMenuSubContent> 230 + </DropdownMenuPortal> 231 + </DropdownMenuSub> 232 + <DropdownMenuSeparator /> 233 + <DropdownMenuItem> 234 + <SaveIcon 235 + /> 236 + Save 237 + <DropdownMenuShortcut>⌘S</DropdownMenuShortcut> 238 + </DropdownMenuItem> 239 + <DropdownMenuItem> 240 + <DownloadIcon 241 + /> 242 + Export 243 + <DropdownMenuShortcut>⇧⌘E</DropdownMenuShortcut> 244 + </DropdownMenuItem> 245 + </DropdownMenuGroup> 246 + <DropdownMenuSeparator /> 247 + <DropdownMenuGroup> 248 + <DropdownMenuLabel>View</DropdownMenuLabel> 249 + <DropdownMenuCheckboxItem 250 + checked={notifications.email} 251 + onCheckedChange={(checked) => 252 + setNotifications({ 253 + ...notifications, 254 + email: checked === true, 255 + }) 256 + } 257 + > 258 + <EyeIcon 259 + /> 260 + Show Sidebar 261 + </DropdownMenuCheckboxItem> 262 + <DropdownMenuCheckboxItem 263 + checked={notifications.sms} 264 + onCheckedChange={(checked) => 265 + setNotifications({ 266 + ...notifications, 267 + sms: checked === true, 268 + }) 269 + } 270 + > 271 + <LayoutIcon 272 + /> 273 + Show Status Bar 274 + </DropdownMenuCheckboxItem> 275 + <DropdownMenuSub> 276 + <DropdownMenuSubTrigger> 277 + <PaletteIcon 278 + /> 279 + Theme 280 + </DropdownMenuSubTrigger> 281 + <DropdownMenuPortal> 282 + <DropdownMenuSubContent> 283 + <DropdownMenuGroup> 284 + <DropdownMenuLabel>Appearance</DropdownMenuLabel> 285 + <DropdownMenuRadioGroup 286 + value={theme} 287 + onValueChange={setTheme} 288 + > 289 + <DropdownMenuRadioItem value="light"> 290 + <SunIcon 291 + /> 292 + Light 293 + </DropdownMenuRadioItem> 294 + <DropdownMenuRadioItem value="dark"> 295 + <MoonIcon 296 + /> 297 + Dark 298 + </DropdownMenuRadioItem> 299 + <DropdownMenuRadioItem value="system"> 300 + <MonitorIcon 301 + /> 302 + System 303 + </DropdownMenuRadioItem> 304 + </DropdownMenuRadioGroup> 305 + </DropdownMenuGroup> 306 + </DropdownMenuSubContent> 307 + </DropdownMenuPortal> 308 + </DropdownMenuSub> 309 + </DropdownMenuGroup> 310 + <DropdownMenuSeparator /> 311 + <DropdownMenuGroup> 312 + <DropdownMenuLabel>Account</DropdownMenuLabel> 313 + <DropdownMenuItem> 314 + <UserIcon 315 + /> 316 + Profile 317 + <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut> 318 + </DropdownMenuItem> 319 + <DropdownMenuItem> 320 + <CreditCardIcon 321 + /> 322 + Billing 323 + </DropdownMenuItem> 324 + <DropdownMenuSub> 325 + <DropdownMenuSubTrigger> 326 + <SettingsIcon 327 + /> 328 + Settings 329 + </DropdownMenuSubTrigger> 330 + <DropdownMenuPortal> 331 + <DropdownMenuSubContent> 332 + <DropdownMenuGroup> 333 + <DropdownMenuLabel>Preferences</DropdownMenuLabel> 334 + <DropdownMenuItem> 335 + <KeyboardIcon 336 + /> 337 + Keyboard Shortcuts 338 + </DropdownMenuItem> 339 + <DropdownMenuItem> 340 + <LanguagesIcon 341 + /> 342 + Language 343 + </DropdownMenuItem> 344 + <DropdownMenuSub> 345 + <DropdownMenuSubTrigger> 346 + <BellIcon 347 + /> 348 + Notifications 349 + </DropdownMenuSubTrigger> 350 + <DropdownMenuPortal> 351 + <DropdownMenuSubContent> 352 + <DropdownMenuGroup> 353 + <DropdownMenuLabel> 354 + Notification Types 355 + </DropdownMenuLabel> 356 + <DropdownMenuCheckboxItem 357 + checked={notifications.push} 358 + onCheckedChange={(checked) => 359 + setNotifications({ 360 + ...notifications, 361 + push: checked === true, 362 + }) 363 + } 364 + > 365 + <BellIcon 366 + /> 367 + Push Notifications 368 + </DropdownMenuCheckboxItem> 369 + <DropdownMenuCheckboxItem 370 + checked={notifications.email} 371 + onCheckedChange={(checked) => 372 + setNotifications({ 373 + ...notifications, 374 + email: checked === true, 375 + }) 376 + } 377 + > 378 + <MailIcon 379 + /> 380 + Email Notifications 381 + </DropdownMenuCheckboxItem> 382 + </DropdownMenuGroup> 383 + </DropdownMenuSubContent> 384 + </DropdownMenuPortal> 385 + </DropdownMenuSub> 386 + </DropdownMenuGroup> 387 + <DropdownMenuSeparator /> 388 + <DropdownMenuGroup> 389 + <DropdownMenuItem> 390 + <ShieldIcon 391 + /> 392 + Privacy & Security 393 + </DropdownMenuItem> 394 + </DropdownMenuGroup> 395 + </DropdownMenuSubContent> 396 + </DropdownMenuPortal> 397 + </DropdownMenuSub> 398 + </DropdownMenuGroup> 399 + <DropdownMenuSeparator /> 400 + <DropdownMenuGroup> 401 + <DropdownMenuItem> 402 + <HelpCircleIcon 403 + /> 404 + Help & Support 405 + </DropdownMenuItem> 406 + <DropdownMenuItem> 407 + <FileTextIcon 408 + /> 409 + Documentation 410 + </DropdownMenuItem> 411 + </DropdownMenuGroup> 412 + <DropdownMenuSeparator /> 413 + <DropdownMenuGroup> 414 + <DropdownMenuItem variant="destructive"> 415 + <LogOutIcon 416 + /> 417 + Sign Out 418 + <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut> 419 + </DropdownMenuItem> 420 + </DropdownMenuGroup> 421 + </DropdownMenuContent> 422 + </DropdownMenu> 423 + </CardAction> 424 + </CardHeader> 425 + <CardContent> 426 + <form> 427 + <FieldGroup> 428 + <div className="grid grid-cols-2 gap-4"> 429 + <Field> 430 + <FieldLabel htmlFor="small-form-name">Name</FieldLabel> 431 + <Input 432 + id="small-form-name" 433 + placeholder="Enter your name" 434 + required 435 + /> 436 + </Field> 437 + <Field> 438 + <FieldLabel htmlFor="small-form-role">Role</FieldLabel> 439 + <Select defaultValue=""> 440 + <SelectTrigger id="small-form-role"> 441 + <SelectValue placeholder="Select a role" /> 442 + </SelectTrigger> 443 + <SelectContent> 444 + <SelectGroup> 445 + <SelectItem value="developer">Developer</SelectItem> 446 + <SelectItem value="designer">Designer</SelectItem> 447 + <SelectItem value="manager">Manager</SelectItem> 448 + <SelectItem value="other">Other</SelectItem> 449 + </SelectGroup> 450 + </SelectContent> 451 + </Select> 452 + </Field> 453 + </div> 454 + <Field> 455 + <FieldLabel htmlFor="small-form-framework"> 456 + Framework 457 + </FieldLabel> 458 + <Combobox items={frameworks}> 459 + <ComboboxInput 460 + id="small-form-framework" 461 + placeholder="Select a framework" 462 + required 463 + /> 464 + <ComboboxContent> 465 + <ComboboxEmpty>No frameworks found.</ComboboxEmpty> 466 + <ComboboxList> 467 + {(item) => ( 468 + <ComboboxItem key={item} value={item}> 469 + {item} 470 + </ComboboxItem> 471 + )} 472 + </ComboboxList> 473 + </ComboboxContent> 474 + </Combobox> 475 + </Field> 476 + <Field> 477 + <FieldLabel htmlFor="small-form-comments">Comments</FieldLabel> 478 + <Textarea 479 + id="small-form-comments" 480 + placeholder="Add any additional comments" 481 + /> 482 + </Field> 483 + <Field orientation="horizontal"> 484 + <Button type="submit">Submit</Button> 485 + <Button variant="outline" type="button"> 486 + Cancel 487 + </Button> 488 + </Field> 489 + </FieldGroup> 490 + </form> 491 + </CardContent> 492 + </Card> 493 + </Example> 494 + ) 495 + }
+55
app/actions/components/example.tsx
··· 1 + import { cn } from "@/actions/lib/utils" 2 + 3 + function ExampleWrapper({ className, ...props }: React.ComponentProps<"div">) { 4 + return ( 5 + <div className="w-full bg-background"> 6 + <div 7 + data-slot="example-wrapper" 8 + className={cn( 9 + "mx-auto grid min-h-screen w-full max-w-5xl min-w-0 content-center items-start gap-8 p-4 pt-2 sm:gap-12 sm:p-6 md:grid-cols-2 md:gap-8 lg:p-12 2xl:max-w-6xl", 10 + className 11 + )} 12 + {...props} 13 + /> 14 + </div> 15 + ) 16 + } 17 + 18 + function Example({ 19 + title, 20 + children, 21 + className, 22 + containerClassName, 23 + ...props 24 + }: React.ComponentProps<"div"> & { 25 + title?: string 26 + containerClassName?: string 27 + }) { 28 + return ( 29 + <div 30 + data-slot="example" 31 + className={cn( 32 + "mx-auto flex w-full max-w-lg min-w-0 flex-col gap-1 self-stretch lg:max-w-none", 33 + containerClassName 34 + )} 35 + {...props} 36 + > 37 + {title && ( 38 + <div className="px-1.5 py-2 text-xs font-medium text-muted-foreground"> 39 + {title} 40 + </div> 41 + )} 42 + <div 43 + data-slot="example-content" 44 + className={cn( 45 + "flex min-w-0 flex-1 flex-col items-start gap-6 border border-dashed bg-background p-4 text-foreground sm:p-6 *:[div:not([class*='w-'])]:w-full", 46 + className 47 + )} 48 + > 49 + {children} 50 + </div> 51 + </div> 52 + ) 53 + } 54 + 55 + export { ExampleWrapper, Example }
+199
app/actions/components/ui/alert-dialog.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { AlertDialog as AlertDialogPrimitive } from "radix-ui" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { Button } from "@/actions/components/ui/button" 8 + 9 + function AlertDialog({ 10 + ...props 11 + }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) { 12 + return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} /> 13 + } 14 + 15 + function AlertDialogTrigger({ 16 + ...props 17 + }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) { 18 + return ( 19 + <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} /> 20 + ) 21 + } 22 + 23 + function AlertDialogPortal({ 24 + ...props 25 + }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) { 26 + return ( 27 + <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} /> 28 + ) 29 + } 30 + 31 + function AlertDialogOverlay({ 32 + className, 33 + ...props 34 + }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) { 35 + return ( 36 + <AlertDialogPrimitive.Overlay 37 + data-slot="alert-dialog-overlay" 38 + className={cn( 39 + "fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", 40 + className 41 + )} 42 + {...props} 43 + /> 44 + ) 45 + } 46 + 47 + function AlertDialogContent({ 48 + className, 49 + size = "default", 50 + ...props 51 + }: React.ComponentProps<typeof AlertDialogPrimitive.Content> & { 52 + size?: "default" | "sm" 53 + }) { 54 + return ( 55 + <AlertDialogPortal> 56 + <AlertDialogOverlay /> 57 + <AlertDialogPrimitive.Content 58 + data-slot="alert-dialog-content" 59 + data-size={size} 60 + className={cn( 61 + "group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-background p-4 ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", 62 + className 63 + )} 64 + {...props} 65 + /> 66 + </AlertDialogPortal> 67 + ) 68 + } 69 + 70 + function AlertDialogHeader({ 71 + className, 72 + ...props 73 + }: React.ComponentProps<"div">) { 74 + return ( 75 + <div 76 + data-slot="alert-dialog-header" 77 + className={cn( 78 + "grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", 79 + className 80 + )} 81 + {...props} 82 + /> 83 + ) 84 + } 85 + 86 + function AlertDialogFooter({ 87 + className, 88 + ...props 89 + }: React.ComponentProps<"div">) { 90 + return ( 91 + <div 92 + data-slot="alert-dialog-footer" 93 + className={cn( 94 + "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end", 95 + className 96 + )} 97 + {...props} 98 + /> 99 + ) 100 + } 101 + 102 + function AlertDialogMedia({ 103 + className, 104 + ...props 105 + }: React.ComponentProps<"div">) { 106 + return ( 107 + <div 108 + data-slot="alert-dialog-media" 109 + className={cn( 110 + "mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6", 111 + className 112 + )} 113 + {...props} 114 + /> 115 + ) 116 + } 117 + 118 + function AlertDialogTitle({ 119 + className, 120 + ...props 121 + }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) { 122 + return ( 123 + <AlertDialogPrimitive.Title 124 + data-slot="alert-dialog-title" 125 + className={cn( 126 + "text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", 127 + className 128 + )} 129 + {...props} 130 + /> 131 + ) 132 + } 133 + 134 + function AlertDialogDescription({ 135 + className, 136 + ...props 137 + }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) { 138 + return ( 139 + <AlertDialogPrimitive.Description 140 + data-slot="alert-dialog-description" 141 + className={cn( 142 + "text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", 143 + className 144 + )} 145 + {...props} 146 + /> 147 + ) 148 + } 149 + 150 + function AlertDialogAction({ 151 + className, 152 + variant = "default", 153 + size = "default", 154 + ...props 155 + }: React.ComponentProps<typeof AlertDialogPrimitive.Action> & 156 + Pick<React.ComponentProps<typeof Button>, "variant" | "size">) { 157 + return ( 158 + <Button variant={variant} size={size} asChild> 159 + <AlertDialogPrimitive.Action 160 + data-slot="alert-dialog-action" 161 + className={cn(className)} 162 + {...props} 163 + /> 164 + </Button> 165 + ) 166 + } 167 + 168 + function AlertDialogCancel({ 169 + className, 170 + variant = "outline", 171 + size = "default", 172 + ...props 173 + }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> & 174 + Pick<React.ComponentProps<typeof Button>, "variant" | "size">) { 175 + return ( 176 + <Button variant={variant} size={size} asChild> 177 + <AlertDialogPrimitive.Cancel 178 + data-slot="alert-dialog-cancel" 179 + className={cn(className)} 180 + {...props} 181 + /> 182 + </Button> 183 + ) 184 + } 185 + 186 + export { 187 + AlertDialog, 188 + AlertDialogAction, 189 + AlertDialogCancel, 190 + AlertDialogContent, 191 + AlertDialogDescription, 192 + AlertDialogFooter, 193 + AlertDialogHeader, 194 + AlertDialogMedia, 195 + AlertDialogOverlay, 196 + AlertDialogPortal, 197 + AlertDialogTitle, 198 + AlertDialogTrigger, 199 + }
+49
app/actions/components/ui/badge.tsx
··· 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 "@/actions/lib/utils" 6 + 7 + const badgeVariants = cva( 8 + "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", 9 + { 10 + variants: { 11 + variant: { 12 + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", 13 + secondary: 14 + "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80", 15 + destructive: 16 + "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20", 17 + outline: 18 + "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground", 19 + ghost: 20 + "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50", 21 + link: "text-primary underline-offset-4 hover:underline", 22 + }, 23 + }, 24 + defaultVariants: { 25 + variant: "default", 26 + }, 27 + } 28 + ) 29 + 30 + function Badge({ 31 + className, 32 + variant = "default", 33 + asChild = false, 34 + ...props 35 + }: React.ComponentProps<"span"> & 36 + VariantProps<typeof badgeVariants> & { asChild?: boolean }) { 37 + const Comp = asChild ? Slot.Root : "span" 38 + 39 + return ( 40 + <Comp 41 + data-slot="badge" 42 + data-variant={variant} 43 + className={cn(badgeVariants({ variant }), className)} 44 + {...props} 45 + /> 46 + ) 47 + } 48 + 49 + export { Badge, badgeVariants }
+67
app/actions/components/ui/button.tsx
··· 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 "@/actions/lib/utils" 6 + 7 + const buttonVariants = cva( 8 + "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 9 + { 10 + variants: { 11 + variant: { 12 + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", 13 + outline: 14 + "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50", 15 + secondary: 16 + "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", 17 + ghost: 18 + "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50", 19 + destructive: 20 + "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40", 21 + link: "text-primary underline-offset-4 hover:underline", 22 + }, 23 + size: { 24 + default: 25 + "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", 26 + xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", 27 + sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5", 28 + lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", 29 + icon: "size-8", 30 + "icon-xs": 31 + "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3", 32 + "icon-sm": 33 + "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg", 34 + "icon-lg": "size-9", 35 + }, 36 + }, 37 + defaultVariants: { 38 + variant: "default", 39 + size: "default", 40 + }, 41 + } 42 + ) 43 + 44 + function Button({ 45 + className, 46 + variant = "default", 47 + size = "default", 48 + asChild = false, 49 + ...props 50 + }: React.ComponentProps<"button"> & 51 + VariantProps<typeof buttonVariants> & { 52 + asChild?: boolean 53 + }) { 54 + const Comp = asChild ? Slot.Root : "button" 55 + 56 + return ( 57 + <Comp 58 + data-slot="button" 59 + data-variant={variant} 60 + data-size={size} 61 + className={cn(buttonVariants({ variant, size, className }))} 62 + {...props} 63 + /> 64 + ) 65 + } 66 + 67 + export { Button, buttonVariants }
+103
app/actions/components/ui/card.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/actions/lib/utils" 4 + 5 + function Card({ 6 + className, 7 + size = "default", 8 + ...props 9 + }: React.ComponentProps<"div"> & { size?: "default" | "sm" }) { 10 + return ( 11 + <div 12 + data-slot="card" 13 + data-size={size} 14 + className={cn( 15 + "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", 16 + className 17 + )} 18 + {...props} 19 + /> 20 + ) 21 + } 22 + 23 + function CardHeader({ className, ...props }: React.ComponentProps<"div">) { 24 + return ( 25 + <div 26 + data-slot="card-header" 27 + className={cn( 28 + "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3", 29 + className 30 + )} 31 + {...props} 32 + /> 33 + ) 34 + } 35 + 36 + function CardTitle({ className, ...props }: React.ComponentProps<"div">) { 37 + return ( 38 + <div 39 + data-slot="card-title" 40 + className={cn( 41 + "text-base leading-snug font-medium group-data-[size=sm]/card:text-sm", 42 + className 43 + )} 44 + {...props} 45 + /> 46 + ) 47 + } 48 + 49 + function CardDescription({ className, ...props }: React.ComponentProps<"div">) { 50 + return ( 51 + <div 52 + data-slot="card-description" 53 + className={cn("text-sm text-muted-foreground", className)} 54 + {...props} 55 + /> 56 + ) 57 + } 58 + 59 + function CardAction({ className, ...props }: React.ComponentProps<"div">) { 60 + return ( 61 + <div 62 + data-slot="card-action" 63 + className={cn( 64 + "col-start-2 row-span-2 row-start-1 self-start justify-self-end", 65 + className 66 + )} 67 + {...props} 68 + /> 69 + ) 70 + } 71 + 72 + function CardContent({ className, ...props }: React.ComponentProps<"div">) { 73 + return ( 74 + <div 75 + data-slot="card-content" 76 + className={cn("px-4 group-data-[size=sm]/card:px-3", className)} 77 + {...props} 78 + /> 79 + ) 80 + } 81 + 82 + function CardFooter({ className, ...props }: React.ComponentProps<"div">) { 83 + return ( 84 + <div 85 + data-slot="card-footer" 86 + className={cn( 87 + "flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3", 88 + className 89 + )} 90 + {...props} 91 + /> 92 + ) 93 + } 94 + 95 + export { 96 + Card, 97 + CardHeader, 98 + CardFooter, 99 + CardTitle, 100 + CardAction, 101 + CardDescription, 102 + CardContent, 103 + }
+299
app/actions/components/ui/combobox.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { Combobox as ComboboxPrimitive } from "@base-ui/react" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { Button } from "@/actions/components/ui/button" 8 + import { 9 + InputGroup, 10 + InputGroupAddon, 11 + InputGroupButton, 12 + InputGroupInput, 13 + } from "@/actions/components/ui/input-group" 14 + import { ChevronDownIcon, XIcon, CheckIcon } from "lucide-react" 15 + 16 + const Combobox = ComboboxPrimitive.Root 17 + 18 + function ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) { 19 + return <ComboboxPrimitive.Value data-slot="combobox-value" {...props} /> 20 + } 21 + 22 + function ComboboxTrigger({ 23 + className, 24 + children, 25 + ...props 26 + }: ComboboxPrimitive.Trigger.Props) { 27 + return ( 28 + <ComboboxPrimitive.Trigger 29 + data-slot="combobox-trigger" 30 + className={cn("[&_svg:not([class*='size-'])]:size-4", className)} 31 + {...props} 32 + > 33 + {children} 34 + <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" /> 35 + </ComboboxPrimitive.Trigger> 36 + ) 37 + } 38 + 39 + function ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) { 40 + return ( 41 + <ComboboxPrimitive.Clear 42 + data-slot="combobox-clear" 43 + render={<InputGroupButton variant="ghost" size="icon-xs" />} 44 + className={cn(className)} 45 + {...props} 46 + > 47 + <XIcon className="pointer-events-none" /> 48 + </ComboboxPrimitive.Clear> 49 + ) 50 + } 51 + 52 + function ComboboxInput({ 53 + className, 54 + children, 55 + disabled = false, 56 + showTrigger = true, 57 + showClear = false, 58 + ...props 59 + }: ComboboxPrimitive.Input.Props & { 60 + showTrigger?: boolean 61 + showClear?: boolean 62 + }) { 63 + return ( 64 + <InputGroup className={cn("w-auto", className)}> 65 + <ComboboxPrimitive.Input 66 + render={<InputGroupInput disabled={disabled} />} 67 + {...props} 68 + /> 69 + <InputGroupAddon align="inline-end"> 70 + {showTrigger && ( 71 + <InputGroupButton 72 + size="icon-xs" 73 + variant="ghost" 74 + asChild 75 + data-slot="input-group-button" 76 + className="group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent" 77 + disabled={disabled} 78 + > 79 + <ComboboxTrigger /> 80 + </InputGroupButton> 81 + )} 82 + {showClear && <ComboboxClear disabled={disabled} />} 83 + </InputGroupAddon> 84 + {children} 85 + </InputGroup> 86 + ) 87 + } 88 + 89 + function ComboboxContent({ 90 + className, 91 + side = "bottom", 92 + sideOffset = 6, 93 + align = "start", 94 + alignOffset = 0, 95 + anchor, 96 + ...props 97 + }: ComboboxPrimitive.Popup.Props & 98 + Pick< 99 + ComboboxPrimitive.Positioner.Props, 100 + "side" | "align" | "sideOffset" | "alignOffset" | "anchor" 101 + >) { 102 + return ( 103 + <ComboboxPrimitive.Portal> 104 + <ComboboxPrimitive.Positioner 105 + side={side} 106 + sideOffset={sideOffset} 107 + align={align} 108 + alignOffset={alignOffset} 109 + anchor={anchor} 110 + className="isolate z-50" 111 + > 112 + <ComboboxPrimitive.Popup 113 + data-slot="combobox-content" 114 + data-chips={!!anchor} 115 + className={cn("group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )} 116 + {...props} 117 + /> 118 + </ComboboxPrimitive.Positioner> 119 + </ComboboxPrimitive.Portal> 120 + ) 121 + } 122 + 123 + function ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) { 124 + return ( 125 + <ComboboxPrimitive.List 126 + data-slot="combobox-list" 127 + className={cn( 128 + "no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0", 129 + className 130 + )} 131 + {...props} 132 + /> 133 + ) 134 + } 135 + 136 + function ComboboxItem({ 137 + className, 138 + children, 139 + ...props 140 + }: ComboboxPrimitive.Item.Props) { 141 + return ( 142 + <ComboboxPrimitive.Item 143 + data-slot="combobox-item" 144 + className={cn( 145 + "relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 146 + className 147 + )} 148 + {...props} 149 + > 150 + {children} 151 + <ComboboxPrimitive.ItemIndicator 152 + render={ 153 + <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" /> 154 + } 155 + > 156 + <CheckIcon className="pointer-events-none" /> 157 + </ComboboxPrimitive.ItemIndicator> 158 + </ComboboxPrimitive.Item> 159 + ) 160 + } 161 + 162 + function ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) { 163 + return ( 164 + <ComboboxPrimitive.Group 165 + data-slot="combobox-group" 166 + className={cn(className)} 167 + {...props} 168 + /> 169 + ) 170 + } 171 + 172 + function ComboboxLabel({ 173 + className, 174 + ...props 175 + }: ComboboxPrimitive.GroupLabel.Props) { 176 + return ( 177 + <ComboboxPrimitive.GroupLabel 178 + data-slot="combobox-label" 179 + className={cn("px-2 py-1.5 text-xs text-muted-foreground", className)} 180 + {...props} 181 + /> 182 + ) 183 + } 184 + 185 + function ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) { 186 + return ( 187 + <ComboboxPrimitive.Collection data-slot="combobox-collection" {...props} /> 188 + ) 189 + } 190 + 191 + function ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) { 192 + return ( 193 + <ComboboxPrimitive.Empty 194 + data-slot="combobox-empty" 195 + className={cn( 196 + "hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex", 197 + className 198 + )} 199 + {...props} 200 + /> 201 + ) 202 + } 203 + 204 + function ComboboxSeparator({ 205 + className, 206 + ...props 207 + }: ComboboxPrimitive.Separator.Props) { 208 + return ( 209 + <ComboboxPrimitive.Separator 210 + data-slot="combobox-separator" 211 + className={cn("-mx-1 my-1 h-px bg-border", className)} 212 + {...props} 213 + /> 214 + ) 215 + } 216 + 217 + function ComboboxChips({ 218 + className, 219 + ...props 220 + }: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> & 221 + ComboboxPrimitive.Chips.Props) { 222 + return ( 223 + <ComboboxPrimitive.Chips 224 + data-slot="combobox-chips" 225 + className={cn( 226 + "flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40", 227 + className 228 + )} 229 + {...props} 230 + /> 231 + ) 232 + } 233 + 234 + function ComboboxChip({ 235 + className, 236 + children, 237 + showRemove = true, 238 + ...props 239 + }: ComboboxPrimitive.Chip.Props & { 240 + showRemove?: boolean 241 + }) { 242 + return ( 243 + <ComboboxPrimitive.Chip 244 + data-slot="combobox-chip" 245 + className={cn( 246 + "flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0", 247 + className 248 + )} 249 + {...props} 250 + > 251 + {children} 252 + {showRemove && ( 253 + <ComboboxPrimitive.ChipRemove 254 + render={<Button variant="ghost" size="icon-xs" />} 255 + className="-ml-1 opacity-50 hover:opacity-100" 256 + data-slot="combobox-chip-remove" 257 + > 258 + <XIcon className="pointer-events-none" /> 259 + </ComboboxPrimitive.ChipRemove> 260 + )} 261 + </ComboboxPrimitive.Chip> 262 + ) 263 + } 264 + 265 + function ComboboxChipsInput({ 266 + className, 267 + ...props 268 + }: ComboboxPrimitive.Input.Props) { 269 + return ( 270 + <ComboboxPrimitive.Input 271 + data-slot="combobox-chip-input" 272 + className={cn("min-w-16 flex-1 outline-none", className)} 273 + {...props} 274 + /> 275 + ) 276 + } 277 + 278 + function useComboboxAnchor() { 279 + return React.useRef<HTMLDivElement | null>(null) 280 + } 281 + 282 + export { 283 + Combobox, 284 + ComboboxInput, 285 + ComboboxContent, 286 + ComboboxList, 287 + ComboboxItem, 288 + ComboboxGroup, 289 + ComboboxLabel, 290 + ComboboxCollection, 291 + ComboboxEmpty, 292 + ComboboxSeparator, 293 + ComboboxChips, 294 + ComboboxChip, 295 + ComboboxChipsInput, 296 + ComboboxTrigger, 297 + ComboboxValue, 298 + useComboboxAnchor, 299 + }
+269
app/actions/components/ui/dropdown-menu.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { CheckIcon, ChevronRightIcon } from "lucide-react" 8 + 9 + function DropdownMenu({ 10 + ...props 11 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) { 12 + return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} /> 13 + } 14 + 15 + function DropdownMenuPortal({ 16 + ...props 17 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) { 18 + return ( 19 + <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} /> 20 + ) 21 + } 22 + 23 + function DropdownMenuTrigger({ 24 + ...props 25 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) { 26 + return ( 27 + <DropdownMenuPrimitive.Trigger 28 + data-slot="dropdown-menu-trigger" 29 + {...props} 30 + /> 31 + ) 32 + } 33 + 34 + function DropdownMenuContent({ 35 + className, 36 + align = "start", 37 + sideOffset = 4, 38 + ...props 39 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) { 40 + return ( 41 + <DropdownMenuPrimitive.Portal> 42 + <DropdownMenuPrimitive.Content 43 + data-slot="dropdown-menu-content" 44 + sideOffset={sideOffset} 45 + align={align} 46 + className={cn("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )} 47 + {...props} 48 + /> 49 + </DropdownMenuPrimitive.Portal> 50 + ) 51 + } 52 + 53 + function DropdownMenuGroup({ 54 + ...props 55 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) { 56 + return ( 57 + <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} /> 58 + ) 59 + } 60 + 61 + function DropdownMenuItem({ 62 + className, 63 + inset, 64 + variant = "default", 65 + ...props 66 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & { 67 + inset?: boolean 68 + variant?: "default" | "destructive" 69 + }) { 70 + return ( 71 + <DropdownMenuPrimitive.Item 72 + data-slot="dropdown-menu-item" 73 + data-inset={inset} 74 + data-variant={variant} 75 + className={cn( 76 + "group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive", 77 + className 78 + )} 79 + {...props} 80 + /> 81 + ) 82 + } 83 + 84 + function DropdownMenuCheckboxItem({ 85 + className, 86 + children, 87 + checked, 88 + inset, 89 + ...props 90 + }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & { 91 + inset?: boolean 92 + }) { 93 + return ( 94 + <DropdownMenuPrimitive.CheckboxItem 95 + data-slot="dropdown-menu-checkbox-item" 96 + data-inset={inset} 97 + className={cn( 98 + "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 99 + className 100 + )} 101 + checked={checked} 102 + {...props} 103 + > 104 + <span 105 + className="pointer-events-none absolute right-2 flex items-center justify-center" 106 + data-slot="dropdown-menu-checkbox-item-indicator" 107 + > 108 + <DropdownMenuPrimitive.ItemIndicator> 109 + <CheckIcon 110 + /> 111 + </DropdownMenuPrimitive.ItemIndicator> 112 + </span> 113 + {children} 114 + </DropdownMenuPrimitive.CheckboxItem> 115 + ) 116 + } 117 + 118 + function DropdownMenuRadioGroup({ 119 + ...props 120 + }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) { 121 + return ( 122 + <DropdownMenuPrimitive.RadioGroup 123 + data-slot="dropdown-menu-radio-group" 124 + {...props} 125 + /> 126 + ) 127 + } 128 + 129 + function DropdownMenuRadioItem({ 130 + className, 131 + children, 132 + inset, 133 + ...props 134 + }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & { 135 + inset?: boolean 136 + }) { 137 + return ( 138 + <DropdownMenuPrimitive.RadioItem 139 + data-slot="dropdown-menu-radio-item" 140 + data-inset={inset} 141 + className={cn( 142 + "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 143 + className 144 + )} 145 + {...props} 146 + > 147 + <span 148 + className="pointer-events-none absolute right-2 flex items-center justify-center" 149 + data-slot="dropdown-menu-radio-item-indicator" 150 + > 151 + <DropdownMenuPrimitive.ItemIndicator> 152 + <CheckIcon 153 + /> 154 + </DropdownMenuPrimitive.ItemIndicator> 155 + </span> 156 + {children} 157 + </DropdownMenuPrimitive.RadioItem> 158 + ) 159 + } 160 + 161 + function DropdownMenuLabel({ 162 + className, 163 + inset, 164 + ...props 165 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & { 166 + inset?: boolean 167 + }) { 168 + return ( 169 + <DropdownMenuPrimitive.Label 170 + data-slot="dropdown-menu-label" 171 + data-inset={inset} 172 + className={cn( 173 + "px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", 174 + className 175 + )} 176 + {...props} 177 + /> 178 + ) 179 + } 180 + 181 + function DropdownMenuSeparator({ 182 + className, 183 + ...props 184 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) { 185 + return ( 186 + <DropdownMenuPrimitive.Separator 187 + data-slot="dropdown-menu-separator" 188 + className={cn("-mx-1 my-1 h-px bg-border", className)} 189 + {...props} 190 + /> 191 + ) 192 + } 193 + 194 + function DropdownMenuShortcut({ 195 + className, 196 + ...props 197 + }: React.ComponentProps<"span">) { 198 + return ( 199 + <span 200 + data-slot="dropdown-menu-shortcut" 201 + className={cn( 202 + "ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground", 203 + className 204 + )} 205 + {...props} 206 + /> 207 + ) 208 + } 209 + 210 + function DropdownMenuSub({ 211 + ...props 212 + }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) { 213 + return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} /> 214 + } 215 + 216 + function DropdownMenuSubTrigger({ 217 + className, 218 + inset, 219 + children, 220 + ...props 221 + }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & { 222 + inset?: boolean 223 + }) { 224 + return ( 225 + <DropdownMenuPrimitive.SubTrigger 226 + data-slot="dropdown-menu-sub-trigger" 227 + data-inset={inset} 228 + className={cn( 229 + "flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 230 + className 231 + )} 232 + {...props} 233 + > 234 + {children} 235 + <ChevronRightIcon className="ml-auto" /> 236 + </DropdownMenuPrimitive.SubTrigger> 237 + ) 238 + } 239 + 240 + function DropdownMenuSubContent({ 241 + className, 242 + ...props 243 + }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) { 244 + return ( 245 + <DropdownMenuPrimitive.SubContent 246 + data-slot="dropdown-menu-sub-content" 247 + className={cn("z-50 min-w-[96px] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className )} 248 + {...props} 249 + /> 250 + ) 251 + } 252 + 253 + export { 254 + DropdownMenu, 255 + DropdownMenuPortal, 256 + DropdownMenuTrigger, 257 + DropdownMenuContent, 258 + DropdownMenuGroup, 259 + DropdownMenuLabel, 260 + DropdownMenuItem, 261 + DropdownMenuCheckboxItem, 262 + DropdownMenuRadioGroup, 263 + DropdownMenuRadioItem, 264 + DropdownMenuSeparator, 265 + DropdownMenuShortcut, 266 + DropdownMenuSub, 267 + DropdownMenuSubTrigger, 268 + DropdownMenuSubContent, 269 + }
+238
app/actions/components/ui/field.tsx
··· 1 + "use client" 2 + 3 + import { useMemo } from "react" 4 + import { cva, type VariantProps } from "class-variance-authority" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { Label } from "@/actions/components/ui/label" 8 + import { Separator } from "@/actions/components/ui/separator" 9 + 10 + function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { 11 + return ( 12 + <fieldset 13 + data-slot="field-set" 14 + className={cn( 15 + "flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3", 16 + className 17 + )} 18 + {...props} 19 + /> 20 + ) 21 + } 22 + 23 + function FieldLegend({ 24 + className, 25 + variant = "legend", 26 + ...props 27 + }: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { 28 + return ( 29 + <legend 30 + data-slot="field-legend" 31 + data-variant={variant} 32 + className={cn( 33 + "mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base", 34 + className 35 + )} 36 + {...props} 37 + /> 38 + ) 39 + } 40 + 41 + function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { 42 + return ( 43 + <div 44 + data-slot="field-group" 45 + className={cn( 46 + "group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4", 47 + className 48 + )} 49 + {...props} 50 + /> 51 + ) 52 + } 53 + 54 + const fieldVariants = cva( 55 + "group/field flex w-full gap-2 data-[invalid=true]:text-destructive", 56 + { 57 + variants: { 58 + orientation: { 59 + vertical: "flex-col *:w-full [&>.sr-only]:w-auto", 60 + horizontal: 61 + "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", 62 + responsive: 63 + "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", 64 + }, 65 + }, 66 + defaultVariants: { 67 + orientation: "vertical", 68 + }, 69 + } 70 + ) 71 + 72 + function Field({ 73 + className, 74 + orientation = "vertical", 75 + ...props 76 + }: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>) { 77 + return ( 78 + <div 79 + role="group" 80 + data-slot="field" 81 + data-orientation={orientation} 82 + className={cn(fieldVariants({ orientation }), className)} 83 + {...props} 84 + /> 85 + ) 86 + } 87 + 88 + function FieldContent({ className, ...props }: React.ComponentProps<"div">) { 89 + return ( 90 + <div 91 + data-slot="field-content" 92 + className={cn( 93 + "group/field-content flex flex-1 flex-col gap-0.5 leading-snug", 94 + className 95 + )} 96 + {...props} 97 + /> 98 + ) 99 + } 100 + 101 + function FieldLabel({ 102 + className, 103 + ...props 104 + }: React.ComponentProps<typeof Label>) { 105 + return ( 106 + <Label 107 + data-slot="field-label" 108 + className={cn( 109 + "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10", 110 + "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col", 111 + className 112 + )} 113 + {...props} 114 + /> 115 + ) 116 + } 117 + 118 + function FieldTitle({ className, ...props }: React.ComponentProps<"div">) { 119 + return ( 120 + <div 121 + data-slot="field-label" 122 + className={cn( 123 + "flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50", 124 + className 125 + )} 126 + {...props} 127 + /> 128 + ) 129 + } 130 + 131 + function FieldDescription({ className, ...props }: React.ComponentProps<"p">) { 132 + return ( 133 + <p 134 + data-slot="field-description" 135 + className={cn( 136 + "text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5", 137 + "last:mt-0 nth-last-2:-mt-1", 138 + "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", 139 + className 140 + )} 141 + {...props} 142 + /> 143 + ) 144 + } 145 + 146 + function FieldSeparator({ 147 + children, 148 + className, 149 + ...props 150 + }: React.ComponentProps<"div"> & { 151 + children?: React.ReactNode 152 + }) { 153 + return ( 154 + <div 155 + data-slot="field-separator" 156 + data-content={!!children} 157 + className={cn( 158 + "relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2", 159 + className 160 + )} 161 + {...props} 162 + > 163 + <Separator className="absolute inset-0 top-1/2" /> 164 + {children && ( 165 + <span 166 + className="relative mx-auto block w-fit bg-background px-2 text-muted-foreground" 167 + data-slot="field-separator-content" 168 + > 169 + {children} 170 + </span> 171 + )} 172 + </div> 173 + ) 174 + } 175 + 176 + function FieldError({ 177 + className, 178 + children, 179 + errors, 180 + ...props 181 + }: React.ComponentProps<"div"> & { 182 + errors?: Array<{ message?: string } | undefined> 183 + }) { 184 + const content = useMemo(() => { 185 + if (children) { 186 + return children 187 + } 188 + 189 + if (!errors?.length) { 190 + return null 191 + } 192 + 193 + const uniqueErrors = [ 194 + ...new Map(errors.map((error) => [error?.message, error])).values(), 195 + ] 196 + 197 + if (uniqueErrors?.length == 1) { 198 + return uniqueErrors[0]?.message 199 + } 200 + 201 + return ( 202 + <ul className="ml-4 flex list-disc flex-col gap-1"> 203 + {uniqueErrors.map( 204 + (error, index) => 205 + error?.message && <li key={index}>{error.message}</li> 206 + )} 207 + </ul> 208 + ) 209 + }, [children, errors]) 210 + 211 + if (!content) { 212 + return null 213 + } 214 + 215 + return ( 216 + <div 217 + role="alert" 218 + data-slot="field-error" 219 + className={cn("text-sm font-normal text-destructive", className)} 220 + {...props} 221 + > 222 + {content} 223 + </div> 224 + ) 225 + } 226 + 227 + export { 228 + Field, 229 + FieldLabel, 230 + FieldDescription, 231 + FieldError, 232 + FieldGroup, 233 + FieldLegend, 234 + FieldSeparator, 235 + FieldSet, 236 + FieldContent, 237 + FieldTitle, 238 + }
+156
app/actions/components/ui/input-group.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { cva, type VariantProps } from "class-variance-authority" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { Button } from "@/actions/components/ui/button" 8 + import { Input } from "@/actions/components/ui/input" 9 + import { Textarea } from "@/actions/components/ui/textarea" 10 + 11 + function InputGroup({ className, ...props }: React.ComponentProps<"div">) { 12 + return ( 13 + <div 14 + data-slot="input-group" 15 + role="group" 16 + className={cn( 17 + "group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5", 18 + className 19 + )} 20 + {...props} 21 + /> 22 + ) 23 + } 24 + 25 + const inputGroupAddonVariants = cva( 26 + "flex h-auto cursor-pointer items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4", 27 + { 28 + variants: { 29 + align: { 30 + "inline-start": 31 + "order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]", 32 + "inline-end": 33 + "order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]", 34 + "block-start": 35 + "order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2", 36 + "block-end": 37 + "order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2", 38 + }, 39 + }, 40 + defaultVariants: { 41 + align: "inline-start", 42 + }, 43 + } 44 + ) 45 + 46 + function InputGroupAddon({ 47 + className, 48 + align = "inline-start", 49 + ...props 50 + }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>) { 51 + return ( 52 + <div 53 + role="group" 54 + data-slot="input-group-addon" 55 + data-align={align} 56 + className={cn(inputGroupAddonVariants({ align }), className)} 57 + onClick={(e) => { 58 + if ((e.target as HTMLElement).closest("button")) { 59 + return 60 + } 61 + e.currentTarget.parentElement?.querySelector("input")?.focus() 62 + }} 63 + {...props} 64 + /> 65 + ) 66 + } 67 + 68 + const inputGroupButtonVariants = cva( 69 + "flex items-center gap-2 text-sm shadow-none", 70 + { 71 + variants: { 72 + size: { 73 + xs: "h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5", 74 + sm: "", 75 + "icon-xs": 76 + "size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0", 77 + "icon-sm": "size-8 p-0 has-[>svg]:p-0", 78 + }, 79 + }, 80 + defaultVariants: { 81 + size: "xs", 82 + }, 83 + } 84 + ) 85 + 86 + function InputGroupButton({ 87 + className, 88 + type = "button", 89 + variant = "ghost", 90 + size = "xs", 91 + ...props 92 + }: Omit<React.ComponentProps<typeof Button>, "size"> & 93 + VariantProps<typeof inputGroupButtonVariants>) { 94 + return ( 95 + <Button 96 + type={type} 97 + data-size={size} 98 + variant={variant} 99 + className={cn(inputGroupButtonVariants({ size }), className)} 100 + {...props} 101 + /> 102 + ) 103 + } 104 + 105 + function InputGroupText({ className, ...props }: React.ComponentProps<"span">) { 106 + return ( 107 + <span 108 + className={cn( 109 + "flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4", 110 + className 111 + )} 112 + {...props} 113 + /> 114 + ) 115 + } 116 + 117 + function InputGroupInput({ 118 + className, 119 + ...props 120 + }: React.ComponentProps<"input">) { 121 + return ( 122 + <Input 123 + data-slot="input-group-control" 124 + className={cn( 125 + "flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", 126 + className 127 + )} 128 + {...props} 129 + /> 130 + ) 131 + } 132 + 133 + function InputGroupTextarea({ 134 + className, 135 + ...props 136 + }: React.ComponentProps<"textarea">) { 137 + return ( 138 + <Textarea 139 + data-slot="input-group-control" 140 + className={cn( 141 + "flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent", 142 + className 143 + )} 144 + {...props} 145 + /> 146 + ) 147 + } 148 + 149 + export { 150 + InputGroup, 151 + InputGroupAddon, 152 + InputGroupButton, 153 + InputGroupText, 154 + InputGroupInput, 155 + InputGroupTextarea, 156 + }
+19
app/actions/components/ui/input.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/actions/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 + "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", 12 + className 13 + )} 14 + {...props} 15 + /> 16 + ) 17 + } 18 + 19 + export { Input }
+24
app/actions/components/ui/label.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { Label as LabelPrimitive } from "radix-ui" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + 8 + function Label({ 9 + className, 10 + ...props 11 + }: React.ComponentProps<typeof LabelPrimitive.Root>) { 12 + return ( 13 + <LabelPrimitive.Root 14 + data-slot="label" 15 + className={cn( 16 + "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", 17 + className 18 + )} 19 + {...props} 20 + /> 21 + ) 22 + } 23 + 24 + export { Label }
+164
app/actions/components/ui/navigation-menu.tsx
··· 1 + import * as React from "react" 2 + import { cva } from "class-variance-authority" 3 + import { NavigationMenu as NavigationMenuPrimitive } from "radix-ui" 4 + 5 + import { cn } from "@/actions/lib/utils" 6 + import { ChevronDownIcon } from "lucide-react" 7 + 8 + function NavigationMenu({ 9 + className, 10 + children, 11 + viewport = true, 12 + ...props 13 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & { 14 + viewport?: boolean 15 + }) { 16 + return ( 17 + <NavigationMenuPrimitive.Root 18 + data-slot="navigation-menu" 19 + data-viewport={viewport} 20 + className={cn( 21 + "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center", 22 + className 23 + )} 24 + {...props} 25 + > 26 + {children} 27 + {viewport && <NavigationMenuViewport />} 28 + </NavigationMenuPrimitive.Root> 29 + ) 30 + } 31 + 32 + function NavigationMenuList({ 33 + className, 34 + ...props 35 + }: React.ComponentProps<typeof NavigationMenuPrimitive.List>) { 36 + return ( 37 + <NavigationMenuPrimitive.List 38 + data-slot="navigation-menu-list" 39 + className={cn( 40 + "group flex flex-1 list-none items-center justify-center gap-0", 41 + className 42 + )} 43 + {...props} 44 + /> 45 + ) 46 + } 47 + 48 + function NavigationMenuItem({ 49 + className, 50 + ...props 51 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) { 52 + return ( 53 + <NavigationMenuPrimitive.Item 54 + data-slot="navigation-menu-item" 55 + className={cn("relative", className)} 56 + {...props} 57 + /> 58 + ) 59 + } 60 + 61 + const navigationMenuTriggerStyle = cva( 62 + "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-lg bg-background px-2.5 py-1.5 text-sm font-medium transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted data-open:bg-muted/50 data-open:hover:bg-muted data-open:focus:bg-muted" 63 + ) 64 + 65 + function NavigationMenuTrigger({ 66 + className, 67 + children, 68 + ...props 69 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) { 70 + return ( 71 + <NavigationMenuPrimitive.Trigger 72 + data-slot="navigation-menu-trigger" 73 + className={cn(navigationMenuTriggerStyle(), "group", className)} 74 + {...props} 75 + > 76 + {children}{" "} 77 + <ChevronDownIcon className="relative top-px ml-1 size-3 transition duration-300 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180" aria-hidden="true" /> 78 + </NavigationMenuPrimitive.Trigger> 79 + ) 80 + } 81 + 82 + function NavigationMenuContent({ 83 + className, 84 + ...props 85 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) { 86 + return ( 87 + <NavigationMenuPrimitive.Content 88 + data-slot="navigation-menu-content" 89 + className={cn( 90 + "top-0 left-0 w-full p-1 ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:ring-foreground/10 group-data-[viewport=false]/navigation-menu:duration-300 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95", 91 + className 92 + )} 93 + {...props} 94 + /> 95 + ) 96 + } 97 + 98 + function NavigationMenuViewport({ 99 + className, 100 + ...props 101 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) { 102 + return ( 103 + <div 104 + className={cn( 105 + "absolute top-full left-0 isolate z-50 flex justify-center" 106 + )} 107 + > 108 + <NavigationMenuPrimitive.Viewport 109 + data-slot="navigation-menu-viewport" 110 + className={cn( 111 + "origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden rounded-lg bg-popover text-popover-foreground shadow ring-1 ring-foreground/10 duration-100 md:w-(--radix-navigation-menu-viewport-width) data-open:animate-in data-open:zoom-in-90 data-closed:animate-out data-closed:zoom-out-95", 112 + className 113 + )} 114 + {...props} 115 + /> 116 + </div> 117 + ) 118 + } 119 + 120 + function NavigationMenuLink({ 121 + className, 122 + ...props 123 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) { 124 + return ( 125 + <NavigationMenuPrimitive.Link 126 + data-slot="navigation-menu-link" 127 + className={cn( 128 + "flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none hover:bg-muted focus:bg-muted focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [&_svg:not([class*='size-'])]:size-4", 129 + className 130 + )} 131 + {...props} 132 + /> 133 + ) 134 + } 135 + 136 + function NavigationMenuIndicator({ 137 + className, 138 + ...props 139 + }: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) { 140 + return ( 141 + <NavigationMenuPrimitive.Indicator 142 + data-slot="navigation-menu-indicator" 143 + className={cn( 144 + "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in", 145 + className 146 + )} 147 + {...props} 148 + > 149 + <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" /> 150 + </NavigationMenuPrimitive.Indicator> 151 + ) 152 + } 153 + 154 + export { 155 + NavigationMenu, 156 + NavigationMenuList, 157 + NavigationMenuItem, 158 + NavigationMenuContent, 159 + NavigationMenuTrigger, 160 + NavigationMenuLink, 161 + NavigationMenuIndicator, 162 + NavigationMenuViewport, 163 + navigationMenuTriggerStyle, 164 + }
+192
app/actions/components/ui/select.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { Select as SelectPrimitive } from "radix-ui" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react" 8 + 9 + function Select({ 10 + ...props 11 + }: React.ComponentProps<typeof SelectPrimitive.Root>) { 12 + return <SelectPrimitive.Root data-slot="select" {...props} /> 13 + } 14 + 15 + function SelectGroup({ 16 + className, 17 + ...props 18 + }: React.ComponentProps<typeof SelectPrimitive.Group>) { 19 + return ( 20 + <SelectPrimitive.Group 21 + data-slot="select-group" 22 + className={cn("scroll-my-1 p-1", className)} 23 + {...props} 24 + /> 25 + ) 26 + } 27 + 28 + function SelectValue({ 29 + ...props 30 + }: React.ComponentProps<typeof SelectPrimitive.Value>) { 31 + return <SelectPrimitive.Value data-slot="select-value" {...props} /> 32 + } 33 + 34 + function SelectTrigger({ 35 + className, 36 + size = "default", 37 + children, 38 + ...props 39 + }: React.ComponentProps<typeof SelectPrimitive.Trigger> & { 40 + size?: "sm" | "default" 41 + }) { 42 + return ( 43 + <SelectPrimitive.Trigger 44 + data-slot="select-trigger" 45 + data-size={size} 46 + className={cn( 47 + "flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", 48 + className 49 + )} 50 + {...props} 51 + > 52 + {children} 53 + <SelectPrimitive.Icon asChild> 54 + <ChevronDownIcon className="pointer-events-none size-4 text-muted-foreground" /> 55 + </SelectPrimitive.Icon> 56 + </SelectPrimitive.Trigger> 57 + ) 58 + } 59 + 60 + function SelectContent({ 61 + className, 62 + children, 63 + position = "item-aligned", 64 + align = "center", 65 + ...props 66 + }: React.ComponentProps<typeof SelectPrimitive.Content>) { 67 + return ( 68 + <SelectPrimitive.Portal> 69 + <SelectPrimitive.Content 70 + data-slot="select-content" 71 + data-align-trigger={position === "item-aligned"} 72 + className={cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", position ==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className )} 73 + position={position} 74 + align={align} 75 + {...props} 76 + > 77 + <SelectScrollUpButton /> 78 + <SelectPrimitive.Viewport 79 + data-position={position} 80 + className={cn( 81 + "data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)", 82 + position === "popper" && "" 83 + )} 84 + > 85 + {children} 86 + </SelectPrimitive.Viewport> 87 + <SelectScrollDownButton /> 88 + </SelectPrimitive.Content> 89 + </SelectPrimitive.Portal> 90 + ) 91 + } 92 + 93 + function SelectLabel({ 94 + className, 95 + ...props 96 + }: React.ComponentProps<typeof SelectPrimitive.Label>) { 97 + return ( 98 + <SelectPrimitive.Label 99 + data-slot="select-label" 100 + className={cn("px-1.5 py-1 text-xs text-muted-foreground", className)} 101 + {...props} 102 + /> 103 + ) 104 + } 105 + 106 + function SelectItem({ 107 + className, 108 + children, 109 + ...props 110 + }: React.ComponentProps<typeof SelectPrimitive.Item>) { 111 + return ( 112 + <SelectPrimitive.Item 113 + data-slot="select-item" 114 + className={cn( 115 + "relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2", 116 + className 117 + )} 118 + {...props} 119 + > 120 + <span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center"> 121 + <SelectPrimitive.ItemIndicator> 122 + <CheckIcon className="pointer-events-none" /> 123 + </SelectPrimitive.ItemIndicator> 124 + </span> 125 + <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText> 126 + </SelectPrimitive.Item> 127 + ) 128 + } 129 + 130 + function SelectSeparator({ 131 + className, 132 + ...props 133 + }: React.ComponentProps<typeof SelectPrimitive.Separator>) { 134 + return ( 135 + <SelectPrimitive.Separator 136 + data-slot="select-separator" 137 + className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)} 138 + {...props} 139 + /> 140 + ) 141 + } 142 + 143 + function SelectScrollUpButton({ 144 + className, 145 + ...props 146 + }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) { 147 + return ( 148 + <SelectPrimitive.ScrollUpButton 149 + data-slot="select-scroll-up-button" 150 + className={cn( 151 + "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", 152 + className 153 + )} 154 + {...props} 155 + > 156 + <ChevronUpIcon 157 + /> 158 + </SelectPrimitive.ScrollUpButton> 159 + ) 160 + } 161 + 162 + function SelectScrollDownButton({ 163 + className, 164 + ...props 165 + }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) { 166 + return ( 167 + <SelectPrimitive.ScrollDownButton 168 + data-slot="select-scroll-down-button" 169 + className={cn( 170 + "z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4", 171 + className 172 + )} 173 + {...props} 174 + > 175 + <ChevronDownIcon 176 + /> 177 + </SelectPrimitive.ScrollDownButton> 178 + ) 179 + } 180 + 181 + export { 182 + Select, 183 + SelectContent, 184 + SelectGroup, 185 + SelectItem, 186 + SelectLabel, 187 + SelectScrollDownButton, 188 + SelectScrollUpButton, 189 + SelectSeparator, 190 + SelectTrigger, 191 + SelectValue, 192 + }
+28
app/actions/components/ui/separator.tsx
··· 1 + "use client" 2 + 3 + import * as React from "react" 4 + import { Separator as SeparatorPrimitive } from "radix-ui" 5 + 6 + import { cn } from "@/actions/lib/utils" 7 + 8 + function Separator({ 9 + className, 10 + orientation = "horizontal", 11 + decorative = true, 12 + ...props 13 + }: React.ComponentProps<typeof SeparatorPrimitive.Root>) { 14 + return ( 15 + <SeparatorPrimitive.Root 16 + data-slot="separator" 17 + decorative={decorative} 18 + orientation={orientation} 19 + className={cn( 20 + "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch", 21 + className 22 + )} 23 + {...props} 24 + /> 25 + ) 26 + } 27 + 28 + export { Separator }
+18
app/actions/components/ui/textarea.tsx
··· 1 + import * as React from "react" 2 + 3 + import { cn } from "@/actions/lib/utils" 4 + 5 + function Textarea({ className, ...props }: React.ComponentProps<"textarea">) { 6 + return ( 7 + <textarea 8 + data-slot="textarea" 9 + className={cn( 10 + "flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40", 11 + className 12 + )} 13 + {...props} 14 + /> 15 + ) 16 + } 17 + 18 + export { Textarea }
+29
app/components/button-link.tsx
··· 1 + import Link from "next/link"; 2 + import { cn } from "@/actions/lib/utils"; 3 + 4 + interface ButtonLinkProps { 5 + href: string; 6 + children: React.ReactNode; 7 + className?: string; 8 + endIcon?: React.ReactNode; 9 + } 10 + 11 + export function ButtonLink({ 12 + href, 13 + children, 14 + className, 15 + endIcon, 16 + }: ButtonLinkProps) { 17 + return ( 18 + <Link 19 + href={href} 20 + className={cn( 21 + "inline-flex h-11 items-center justify-center gap-2 rounded-full px-5 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2", 22 + className 23 + )} 24 + > 25 + {children} 26 + {endIcon} 27 + </Link> 28 + ); 29 + }
+54
app/components/cta/cta-section.tsx
··· 1 + import Image from "next/image"; 2 + import { ButtonLink } from "@/components/button-link"; 3 + import { Heading } from "@/components/heading"; 4 + import { Paragraph } from "@/components/paragraph"; 5 + import { ArrowRightIcon } from "lucide-react"; 6 + 7 + export function CTASection() { 8 + return ( 9 + <section className="relative w-full bg-neutral-950 px-4 py-16 sm:px-6 sm:py-20"> 10 + <div className="mx-auto flex max-w-5xl flex-col items-center gap-6 text-center sm:gap-7"> 11 + <div className="flex items-center gap-2 text-white/80"> 12 + <Image 13 + src="/logo.svg" 14 + alt="eny.space" 15 + width={40} 16 + height={40} 17 + className="shrink-0" 18 + /> 19 + <Paragraph className="text-xs font-semibold uppercase tracking-[0.2em]"> 20 + eny.space 21 + </Paragraph> 22 + </div> 23 + <Heading 24 + as="h2" 25 + className="text-2xl font-semibold tracking-tight text-white sm:text-3xl md:text-4xl" 26 + > 27 + Try eny.space for Free - No Strings Attached. 28 + </Heading> 29 + <Paragraph className="max-w-2xl text-sm text-white/70 sm:text-base"> 30 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do 31 + eiusmod tempor incididunt ut labore et dolore magna aliqua. Deploy 32 + your first app or website in just a few minutes. 33 + </Paragraph> 34 + 35 + <div className="mt-2 flex flex-wrap items-center justify-center gap-3"> 36 + <ButtonLink 37 + href="/demo" 38 + className="border border-white/30 bg-transparent px-6 text-xs font-semibold uppercase tracking-wide text-white hover:border-white hover:bg-white/10" 39 + endIcon={<ArrowRightIcon className="size-4" aria-hidden />} 40 + > 41 + Placeholder 42 + </ButtonLink> 43 + <ButtonLink 44 + href="/signup" 45 + className="px-6 text-xs font-semibold uppercase tracking-wide text-neutral-950 shadow-[0_0_40px_rgba(190,242,100,0.45)] bg-amber-400 hover:bg-amber-300" 46 + endIcon={<ArrowRightIcon className="size-4" aria-hidden />} 47 + > 48 + Start free trial 49 + </ButtonLink> 50 + </div> 51 + </div> 52 + </section> 53 + ); 54 + }
+2
app/components/cta/index.ts
··· 1 + export { CTASection } from "./cta-section"; 2 +
+113
app/components/faq/faq-section.tsx
··· 1 + "use client"; 2 + 3 + import { useState } from "react"; 4 + import { Heading } from "@/components/heading"; 5 + import { Paragraph } from "@/components/paragraph"; 6 + import { MinusIcon, PlusIcon } from "lucide-react"; 7 + 8 + type FaqItem = { 9 + id: string; 10 + question: string; 11 + answer: string; 12 + }; 13 + 14 + const FAQ_ITEMS: FaqItem[] = [ 15 + { 16 + id: "web3-vs-traditional", 17 + question: "Why is your Web3 hosting better than traditional hosting?", 18 + answer: 19 + "Unlike traditional hosting, eny.space offers decentralized infrastructure designed for uptime, security, and scalability. Your projects are backed by blockchain-based guarantees, reducing single points of failure and giving you the resilience you need to grow.", 20 + }, 21 + { 22 + id: "choose-plan", 23 + question: "How do I know which pricing plan is right for me?", 24 + answer: 25 + "Start with the plan that matches your expected storage and traffic. You can upgrade at any time without downtime, and our team can help you right-size based on your current and projected usage.", 26 + }, 27 + { 28 + id: "secure-platform", 29 + question: "What makes your platform secure for hosting my Web3 project?", 30 + answer: 31 + "We combine audited smart contract infrastructure with strong network isolation, encryption in transit and at rest, and continuous monitoring. This layered approach helps protect your data and on-chain assets from common attack vectors.", 32 + }, 33 + { 34 + id: "switch-plans", 35 + question: "Can I switch plans later if my needs change?", 36 + answer: 37 + "Yes. You can move between plans at any time. Billing is prorated, and your deployments stay online during the switch so you can scale up or down without interruptions.", 38 + }, 39 + { 40 + id: "time-to-deploy", 41 + question: "How soon can I deploy my Web3 project on eny.space?", 42 + answer: 43 + "Most teams deploy in minutes. Connect your wallet or Git repository, choose a plan, and follow the guided setup. Our onboarding flow is optimized so you can go from zero to live as quickly as possible.", 44 + }, 45 + ]; 46 + 47 + export function FAQSection() { 48 + const [openId, setOpenId] = useState<string | null>(FAQ_ITEMS[0]?.id ?? null); 49 + 50 + return ( 51 + <section 52 + id="faq" 53 + className="relative w-full bg-neutral-950 px-4 py-20 sm:px-6 sm:py-24" 54 + > 55 + <div className="mx-auto max-w-4xl text-center"> 56 + <Heading 57 + as="h2" 58 + className="text-2xl font-semibold tracking-tight text-white sm:text-3xl md:text-4xl" 59 + > 60 + Frequently Asked Questions 61 + </Heading> 62 + <Paragraph className="mt-4 text-sm text-white/70 sm:text-base"> 63 + All the details you need about the product and billing. If you can't 64 + find what you're looking for, feel free to{" "} 65 + <span className="font-semibold text-white"> 66 + reach out to our friendly team 67 + </span> 68 + . 69 + </Paragraph> 70 + </div> 71 + 72 + <div className="mx-auto mt-10 max-w-3xl space-y-3 sm:mt-12"> 73 + {FAQ_ITEMS.map((item) => { 74 + const isOpen = openId === item.id; 75 + 76 + return ( 77 + <div 78 + key={item.id} 79 + className={[ 80 + "overflow-hidden rounded-2xl border border-white/10 bg-neutral-900/40 transition-colors", 81 + isOpen ? "bg-neutral-900/80" : "hover:bg-neutral-900/60", 82 + ].join(" ")} 83 + > 84 + <button 85 + type="button" 86 + onClick={() => setOpenId(isOpen ? null : item.id)} 87 + className="flex w-full cursor-pointer items-center justify-between gap-4 px-5 py-4 text-left" 88 + aria-expanded={isOpen} 89 + > 90 + <span className="text-sm font-medium text-white sm:text-base"> 91 + {item.question} 92 + </span> 93 + <span className="flex size-7 items-center justify-center rounded-full bg-white/8 text-white"> 94 + {isOpen ? ( 95 + <MinusIcon className="size-4" aria-hidden /> 96 + ) : ( 97 + <PlusIcon className="size-4" aria-hidden /> 98 + )} 99 + </span> 100 + </button> 101 + 102 + {isOpen && ( 103 + <div className="border-t border-white/10 px-5 pb-5 pt-3 text-sm text-white/75"> 104 + {item.answer} 105 + </div> 106 + )} 107 + </div> 108 + ); 109 + })} 110 + </div> 111 + </section> 112 + ); 113 + }
+2
app/components/faq/index.ts
··· 1 + export { FAQSection } from "./faq-section"; 2 +
+39
app/components/features/feature-card.tsx
··· 1 + import { cn } from "@/actions/lib/utils"; 2 + import { Heading } from "@/components/heading"; 3 + import { Paragraph } from "@/components/paragraph"; 4 + 5 + interface FeatureCardProps { 6 + icon: React.ReactNode; 7 + title: string; 8 + description: string; 9 + className?: string; 10 + } 11 + 12 + export function FeatureCard({ 13 + icon, 14 + title, 15 + description, 16 + className, 17 + }: FeatureCardProps) { 18 + return ( 19 + <div 20 + className={cn( 21 + "relative flex flex-col items-center gap-3 rounded-2xl bg-neutral-900/80 px-5 py-6 shadow-[0_0_40px_rgba(0,0,0,0.6)] ring-1 ring-white/5", 22 + className, 23 + )} 24 + > 25 + <div className="mb-1 inline-flex size-10 items-center justify-center rounded-xl bg-amber-400/15 text-amber-300 shadow-[0_0_30px_rgba(190,242,100,0.6)]"> 26 + {icon} 27 + </div> 28 + <Heading 29 + as="h3" 30 + className="text-base font-semibold text-white text-center" 31 + > 32 + {title} 33 + </Heading> 34 + <Paragraph className="text-sm leading-relaxed text-white/70 text-center"> 35 + {description} 36 + </Paragraph> 37 + </div> 38 + ); 39 + }
+84
app/components/features/features-section.tsx
··· 1 + import { 2 + CloudIcon, 3 + NetworkIcon, 4 + ScaleIcon, 5 + ShieldCheckIcon, 6 + ZapIcon, 7 + RocketIcon, 8 + } from "lucide-react"; 9 + import { Heading } from "@/components/heading"; 10 + import { Paragraph } from "@/components/paragraph"; 11 + import { FeatureCard } from "./feature-card"; 12 + 13 + const FEATURES = [ 14 + { 15 + title: "Example Feature One.", 16 + description: 17 + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus efficitur urna a augue pulvinar, vitae facilisis massa dictum.", 18 + icon: <NetworkIcon className="size-5" aria-hidden />, 19 + }, 20 + { 21 + title: "Sample Multi-Network.", 22 + description: 23 + "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse potenti.", 24 + icon: <CloudIcon className="size-5" aria-hidden />, 25 + }, 26 + { 27 + title: "Lorem Scalability.", 28 + description: 29 + "Suspendisse vitae dictum lectus. Ut bibendum, leo eu tempor ullamcorper, eros ex euismod nunc, nec cursus nisi ex non purus.", 30 + icon: <ScaleIcon className="size-5" aria-hidden />, 31 + }, 32 + { 33 + title: "Secure Example.", 34 + description: 35 + "Etiam egestas, erat sit amet dictum cursus, sapien quam gravida ex, nec imperdiet libero sem at sapien faucibus consequat.", 36 + icon: <ShieldCheckIcon className="size-5" aria-hidden />, 37 + }, 38 + // { 39 + // title: "Instant Launchpad.", 40 + // description: 41 + // "Quisque congue elit eu velit maximus auctor. Nullam ac mauris quam. Nullam eget erat convallis, consequat purus non, cursus enim.", 42 + // icon: <RocketIcon className="size-5" aria-hidden />, 43 + // }, 44 + { 45 + title: "Performance Demo.", 46 + description: 47 + "Praesent iaculis urna non eros pretium, in posuere lectus cursus. Sed facilisis facilisis ex, ac molestie tellus posuere vitae.", 48 + icon: <ZapIcon className="size-5" aria-hidden />, 49 + }, 50 + ]; 51 + 52 + export function FeaturesSection() { 53 + return ( 54 + <section 55 + id="features" 56 + className="relative w-full bg-neutral-950 px-4 py-16 sm:px-6 sm:py-20" 57 + > 58 + <div className="mx-auto max-w-5xl text-center"> 59 + <Heading 60 + as="h2" 61 + className="text-2xl font-semibold tracking-tight text-white sm:text-3xl md:text-4xl" 62 + > 63 + Lorem Ipsum Dolor Sit Amet - Fast, Reliable, Easy. 64 + </Heading> 65 + <Paragraph className="mt-4 text-sm text-white/70 sm:text-base"> 66 + Pellentesque habitant morbi tristique senectus et netus et malesuada 67 + fames ac turpis egestas. Proin facilisis nec erat eu molestie. 68 + </Paragraph> 69 + </div> 70 + 71 + <div className="mx-auto mt-10 flex max-w-6xl flex-wrap justify-center gap-6 sm:mt-12"> 72 + {FEATURES.map((feature) => ( 73 + <FeatureCard 74 + key={feature.title} 75 + icon={feature.icon} 76 + title={feature.title} 77 + description={feature.description} 78 + className="basis-[min(100%,320px)]" 79 + /> 80 + ))} 81 + </div> 82 + </section> 83 + ); 84 + }
+3
app/components/features/index.ts
··· 1 + export { FeatureCard } from "./feature-card"; 2 + export { FeaturesSection } from "./features-section"; 3 +
+43
app/components/footer/footer.tsx
··· 1 + import Link from "next/link"; 2 + import Image from "next/image"; 3 + import { Paragraph } from "@/components/paragraph"; 4 + 5 + export function Footer() { 6 + const year = new Date().getFullYear(); 7 + 8 + return ( 9 + <footer className="w-full border-t border-white/10 bg-neutral-950"> 10 + <div className="mx-auto flex max-w-7xl flex-col gap-6 px-4 py-8 sm:flex-row sm:items-center sm:justify-between sm:px-6"> 11 + <div className="flex items-center gap-3"> 12 + <Image 13 + src="/logo.svg" 14 + alt="eny.space" 15 + width={32} 16 + height={32} 17 + className="shrink-0" 18 + /> 19 + <div className="flex flex-col"> 20 + <span className="text-sm font-semibold text-white">eny.space</span> 21 + <Paragraph className="text-xs text-white/60"> 22 + © {year} eny.space. All rights reserved. 23 + </Paragraph> 24 + </div> 25 + </div> 26 + 27 + <div className="flex flex-wrap items-center gap-4 text-xs text-white/60"> 28 + <nav className="flex flex-wrap items-center gap-4"> 29 + <Link href="/#features" className="hover:text-white"> 30 + Features 31 + </Link> 32 + <Link href="/#pricing" className="hover:text-white"> 33 + Pricing 34 + </Link> 35 + <Link href="/#faq" className="hover:text-white"> 36 + FAQ 37 + </Link> 38 + </nav> 39 + </div> 40 + </div> 41 + </footer> 42 + ); 43 + }
+2
app/components/footer/index.ts
··· 1 + export { Footer } from "./footer"; 2 +
+13
app/components/heading.tsx
··· 1 + import { cn } from "@/actions/lib/utils"; 2 + 3 + type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; 4 + 5 + interface HeadingProps { 6 + as?: HeadingLevel; 7 + children: React.ReactNode; 8 + className?: string; 9 + } 10 + 11 + export function Heading({ as: Tag = "h1", children, className }: HeadingProps) { 12 + return <Tag className={cn(className)}>{children}</Tag>; 13 + }
+36
app/components/hero/hero-background.tsx
··· 1 + import Image from "next/image"; 2 + 3 + export function HeroBackground() { 4 + return ( 5 + <div 6 + className="absolute inset-0 -z-10 bg-neutral-950" 7 + aria-hidden 8 + > 9 + {/* Gradient from dark top to warm orange-yellow bottom */} 10 + <div 11 + className="absolute inset-0 opacity-90" 12 + style={{ 13 + background: 14 + "linear-gradient(180deg, transparent 0%, transparent 45%, oklch(0.75 0.12 75 / 0.4) 85%, oklch(0.8 0.14 85 / 0.6) 100%)", 15 + }} 16 + /> 17 + {/* Subtle grain overlay */} 18 + <div 19 + className="absolute inset-0 opacity-[0.03] mix-blend-overlay" 20 + style={{ 21 + backgroundImage: `url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E")`, 22 + }} 23 + /> 24 + {/* Large decorative logo - subtle, upper center */} 25 + <div className="absolute left-1/2 top-[20%] -translate-x-1/2 opacity-20"> 26 + <Image 27 + src="/logo.svg" 28 + alt="" 29 + width={480} 30 + height={480} 31 + className="shrink-0" 32 + /> 33 + </div> 34 + </div> 35 + ); 36 + }
+38
app/components/hero/hero-left.tsx
··· 1 + import { ButtonLink } from "@/components/button-link"; 2 + import { Heading } from "@/components/heading"; 3 + import { Paragraph } from "@/components/paragraph"; 4 + import { ArrowUpRightIcon } from "lucide-react"; 5 + 6 + export function HeroLeft() { 7 + return ( 8 + <div className="flex max-w-xl flex-col gap-6"> 9 + <Heading 10 + as="h1" 11 + className="text-4xl leading-tight tracking-tight text-white sm:text-5xl md:text-6xl" 12 + > 13 + Lorem ipsum dolor sit amet 14 + </Heading> 15 + <Paragraph className="text-lg text-white/90 sm:text-xl"> 16 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod 17 + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 18 + veniam. 19 + </Paragraph> 20 + <div className="flex flex-wrap gap-3"> 21 + <ButtonLink 22 + href="/signup" 23 + className="border border-white/80 bg-transparent uppercase tracking-wide text-white hover:bg-white/10 hover:border-white focus-visible:ring-white/50" 24 + endIcon={<ArrowUpRightIcon className="size-4" aria-hidden />} 25 + > 26 + Button 1 27 + </ButtonLink> 28 + <ButtonLink 29 + href="/dashboard" 30 + className="border border-white/80 bg-transparent uppercase tracking-wide text-white hover:bg-white/10 hover:border-white focus-visible:ring-white/50" 31 + endIcon={<ArrowUpRightIcon className="size-4" aria-hidden />} 32 + > 33 + Button 2 34 + </ButtonLink> 35 + </div> 36 + </div> 37 + ); 38 + }
+34
app/components/hero/hero-right.tsx
··· 1 + import Link from "next/link"; 2 + import { ChevronDownIcon } from "lucide-react"; 3 + 4 + const navItems = [ 5 + { label: "Key features", href: "/#features" }, 6 + { label: "Build with eny.space", href: "/#build" }, 7 + { label: "Latest news", href: "/#news" }, 8 + ]; 9 + 10 + export function HeroRight() { 11 + return ( 12 + <nav className="flex flex-col gap-1"> 13 + <Link 14 + href="/#discover" 15 + className="border-b border-white/60 pb-1 text-sm font-medium uppercase tracking-wide text-white hover:border-white hover:text-white" 16 + > 17 + /// Discover eny.space 18 + </Link> 19 + <ul className="mt-4 flex flex-col gap-3"> 20 + {navItems.map((item) => ( 21 + <li key={item.href}> 22 + <Link 23 + href={item.href} 24 + className="inline-flex items-center gap-2 text-sm font-medium uppercase tracking-wide text-white/90 transition-colors hover:text-white" 25 + > 26 + {item.label} 27 + <ChevronDownIcon className="size-4" aria-hidden /> 28 + </Link> 29 + </li> 30 + ))} 31 + </ul> 32 + </nav> 33 + ); 34 + }
+15
app/components/hero/hero.tsx
··· 1 + import { HeroBackground } from "./hero-background"; 2 + import { HeroLeft } from "./hero-left"; 3 + import { HeroRight } from "./hero-right"; 4 + 5 + export function Hero() { 6 + return ( 7 + <section className="relative flex min-h-[calc(100vh-3.5rem)] w-full flex-col justify-end overflow-hidden px-4 pb-12 pt-16 sm:px-6 sm:pt-24"> 8 + <HeroBackground /> 9 + <div className="mx-auto grid w-full max-w-7xl gap-12 md:grid-cols-[1fr_auto] md:items-center md:gap-16"> 10 + <HeroLeft /> 11 + <HeroRight /> 12 + </div> 13 + </section> 14 + ); 15 + }
+4
app/components/hero/index.ts
··· 1 + export { Hero } from "./hero"; 2 + export { HeroBackground } from "./hero-background"; 3 + export { HeroLeft } from "./hero-left"; 4 + export { HeroRight } from "./hero-right";
+1
app/components/logo-bar/index.ts
··· 1 + export { LogoBar } from "./logo-bar";
+92
app/components/logo-bar/logo-bar.tsx
··· 1 + import Link from "next/link"; 2 + import { 3 + BoxIcon, 4 + CircleIcon, 5 + HexagonIcon, 6 + LayersIcon, 7 + SparklesIcon, 8 + SquareIcon, 9 + CircleDotIcon, 10 + } from "lucide-react"; 11 + import { Paragraph } from "@/components/paragraph"; 12 + 13 + const PLACEHOLDER_LINKS = [ 14 + { label: "Short", href: "#", icon: BoxIcon }, 15 + { label: "Medium Label", href: "#", icon: SparklesIcon }, 16 + { label: "Descriptive Text", href: "#", icon: CircleIcon }, 17 + { label: "Another Link", href: "#", icon: LayersIcon }, 18 + { label: "Quick Label", href: "#", icon: CircleDotIcon }, 19 + { label: "Label Name Text", href: "#", icon: SquareIcon }, 20 + { label: "Final Example", href: "#", icon: HexagonIcon }, 21 + ]; 22 + 23 + function LogoBarItem({ 24 + item, 25 + index, 26 + }: { 27 + item: (typeof PLACEHOLDER_LINKS)[number]; 28 + index: number; 29 + }) { 30 + const Icon = item.icon; 31 + return ( 32 + <Link 33 + href={item.href} 34 + className="flex shrink-0 items-center gap-3 text-base font-medium text-white/90 transition-colors hover:text-white" 35 + > 36 + <span className="flex size-10 shrink-0 items-center justify-center rounded-lg bg-white/5"> 37 + <Icon className="size-5 text-white/90" aria-hidden /> 38 + </span> 39 + {item.label} 40 + </Link> 41 + ); 42 + } 43 + 44 + function LogoBarScroll() { 45 + return ( 46 + <div className="relative w-full overflow-hidden py-8"> 47 + <div 48 + className="pointer-events-none absolute inset-y-0 left-0 w-24 bg-gradient-to-r from-neutral-950 to-transparent z-10" 49 + aria-hidden="true" 50 + /> 51 + <div 52 + className="pointer-events-none absolute inset-y-0 right-0 w-24 bg-gradient-to-l from-neutral-950 to-transparent z-10" 53 + aria-hidden="true" 54 + /> 55 + <div className="flex w-max animate-marquee items-center [transform:translateZ(0)]"> 56 + {["a", "b"].map((blockId) => ( 57 + <div 58 + key={blockId} 59 + className="flex shrink-0 items-center gap-16 whitespace-nowrap" 60 + > 61 + {PLACEHOLDER_LINKS.slice(0, 6).map((item, i) => ( 62 + <LogoBarItem key={`${blockId}-${i}`} item={item} index={i} /> 63 + ))} 64 + <div className="flex shrink-0 items-center"> 65 + <LogoBarItem 66 + key={`${blockId}-6`} 67 + item={PLACEHOLDER_LINKS[6]} 68 + index={6} 69 + /> 70 + <span className="w-16 shrink-0" aria-hidden /> 71 + </div> 72 + </div> 73 + ))} 74 + </div> 75 + </div> 76 + ); 77 + } 78 + 79 + export function LogoBar() { 80 + return ( 81 + <section className="w-full bg-neutral-950"> 82 + <div className="mx-auto max-w-7xl px-4 py-10 sm:px-6"> 83 + <Paragraph className="mx-auto max-w-2xl text-center text-base text-white/60"> 84 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do 85 + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad 86 + minim veniam, quis nostrud exercitation. 87 + </Paragraph> 88 + <LogoBarScroll /> 89 + </div> 90 + </section> 91 + ); 92 + }
+10
app/components/paragraph.tsx
··· 1 + import { cn } from "@/actions/lib/utils"; 2 + 3 + interface ParagraphProps { 4 + children: React.ReactNode; 5 + className?: string; 6 + } 7 + 8 + export function Paragraph({ children, className }: ParagraphProps) { 9 + return <p className={cn(className)}>{children}</p>; 10 + }
+2
app/components/pricing/index.ts
··· 1 + export { PricingSection } from "./pricing-section"; 2 +
+171
app/components/pricing/pricing-section.tsx
··· 1 + import { 2 + Card, 3 + CardContent, 4 + CardHeader, 5 + CardTitle, 6 + } from "@/actions/components/ui/card"; 7 + import { ButtonLink } from "@/components/button-link"; 8 + import { Heading } from "@/components/heading"; 9 + import { Paragraph } from "@/components/paragraph"; 10 + 11 + type PricingPlan = { 12 + name: string; 13 + price: string; 14 + period: string; 15 + badge?: string; 16 + description: string; 17 + highlight?: boolean; 18 + features: string[]; 19 + }; 20 + 21 + const PLANS: PricingPlan[] = [ 22 + { 23 + name: "Starter plan", 24 + price: "$19", 25 + period: "per month", 26 + description: "Perfect for small projects.", 27 + features: [ 28 + "1 GB storage", 29 + "5 app deployments", 30 + "Basic security protocols", 31 + "24/7 support access", 32 + ], 33 + }, 34 + { 35 + name: "Growth plan", 36 + price: "$49", 37 + period: "per month", 38 + badge: "Popular", 39 + description: "Scale without limits.", 40 + highlight: true, 41 + features: [ 42 + "10 GB storage", 43 + "Unlimited app deployments", 44 + "Advanced security and encryption", 45 + "Priority support with dedicated manager", 46 + ], 47 + }, 48 + { 49 + name: "Pro plan", 50 + price: "$99", 51 + period: "per month", 52 + description: "Enterprise‑level performance.", 53 + features: [ 54 + "Unlimited storage", 55 + "Custom domain support", 56 + "Dedicated node hosting", 57 + "Real‑time monitoring and analytics", 58 + "Premium 24/7 support with SLA", 59 + ], 60 + }, 61 + ]; 62 + 63 + export function PricingSection() { 64 + return ( 65 + <section 66 + id="pricing" 67 + className="relative w-full bg-neutral-950 px-4 py-20 sm:px-6 sm:py-24" 68 + > 69 + <div className="mx-auto max-w-5xl text-center"> 70 + <Heading 71 + as="h2" 72 + className="text-2xl font-semibold tracking-tight text-white sm:text-3xl md:text-4xl" 73 + > 74 + Flexible Pricing for Every Stage of Growth. 75 + </Heading> 76 + <Paragraph className="mt-4 text-sm text-white/70 sm:text-base"> 77 + From startups to enterprises, choose a plan that fits your needs. Pay 78 + only for what you use and scale effortlessly. 79 + </Paragraph> 80 + </div> 81 + 82 + <div className="mx-auto mt-12 grid max-w-6xl gap-6 md:grid-cols-3"> 83 + {PLANS.map((plan) => ( 84 + <Card 85 + key={plan.name} 86 + className={[ 87 + "flex h-full flex-col justify-between rounded-3xl border-none bg-gradient-to-b from-neutral-800/90 to-neutral-900/90 p-6 text-white shadow-xl/30", 88 + plan.highlight 89 + ? "relative bg-gradient-to-b from-amber-400/90 via-amber-400/80 to-amber-500/90 text-neutral-950 shadow-[0_0_40px_rgba(190,242,100,0.4)]" 90 + : "", 91 + ] 92 + .filter(Boolean) 93 + .join(" ")} 94 + > 95 + <CardHeader className="flex flex-col gap-2 px-0"> 96 + <div className="flex items-center justify-between gap-3"> 97 + <CardTitle className="text-sm font-semibold uppercase tracking-wide"> 98 + {plan.name} 99 + </CardTitle> 100 + {plan.badge ? ( 101 + <span className="rounded-full bg-neutral-900/80 px-3 py-1 text-xs font-medium uppercase tracking-wide text-amber-300 md:text-[11px]"> 102 + {plan.badge} 103 + </span> 104 + ) : null} 105 + </div> 106 + <div className="mt-4 flex items-baseline gap-2"> 107 + <span className="text-4xl font-semibold sm:text-5xl"> 108 + {plan.price} 109 + </span> 110 + <span className="text-sm font-medium opacity-80"> 111 + {plan.period} 112 + </span> 113 + </div> 114 + <Paragraph 115 + className={[ 116 + "mt-3 text-sm", 117 + plan.highlight ? "text-neutral-900/80" : "text-white/70", 118 + ].join(" ")} 119 + > 120 + {plan.description} 121 + </Paragraph> 122 + </CardHeader> 123 + 124 + <CardContent className="mt-6 flex flex-1 flex-col gap-6 px-0"> 125 + <ButtonLink 126 + href="/signup" 127 + className={[ 128 + "w-full rounded-full px-4 py-3 text-center text-sm font-semibold uppercase tracking-wide transition", 129 + plan.highlight 130 + ? "bg-neutral-950 text-amber-300 hover:bg-neutral-900" 131 + : "bg-white text-neutral-950 hover:bg-neutral-200", 132 + ].join(" ")} 133 + > 134 + Get started 135 + </ButtonLink> 136 + 137 + <div className="pt-2 text-left"> 138 + <Paragraph 139 + className={[ 140 + "text-xs font-semibold uppercase tracking-[0.18em]", 141 + plan.highlight ? "text-neutral-900/70" : "text-white/60", 142 + ].join(" ")} 143 + > 144 + Key features on {plan.name.split(" ")[0]} 145 + </Paragraph> 146 + <ul className="mt-4 space-y-2 text-sm"> 147 + {plan.features.map((feature) => ( 148 + <li 149 + key={feature} 150 + className={[ 151 + "flex items-start gap-2", 152 + plan.highlight 153 + ? "text-neutral-900/80" 154 + : "text-white/75", 155 + ].join(" ")} 156 + > 157 + <div className="inline-flex items-center gap-2"> 158 + <span className="inline-block size-1.5 rounded-full bg-amber-400" /> 159 + <span>{feature}</span> 160 + </div> 161 + </li> 162 + ))} 163 + </ul> 164 + </div> 165 + </CardContent> 166 + </Card> 167 + ))} 168 + </div> 169 + </section> 170 + ); 171 + }
+2
app/components/site-header/index.ts
··· 1 + export { SiteHeader } from "./site-header"; 2 +
+175
app/components/site-header/site-header.tsx
··· 1 + "use client"; 2 + 3 + import { useState } from "react"; 4 + import Link from "next/link"; 5 + import Image from "next/image"; 6 + import { signOut } from "@/actions/auth"; 7 + import { Button } from "@/actions/components/ui/button"; 8 + import { ArrowUpRightIcon, MenuIcon, XIcon } from "lucide-react"; 9 + import type { User } from "@supabase/supabase-js"; 10 + 11 + const navLinkClass = 12 + "inline-flex h-9 items-center justify-center rounded-full bg-transparent px-4 py-2 text-xs font-medium uppercase tracking-wide text-white/90 transition-colors hover:bg-white/5 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30"; 13 + 14 + interface SiteHeaderProps { 15 + user: User | null; 16 + } 17 + 18 + export function SiteHeader({ user }: SiteHeaderProps) { 19 + const [mobileOpen, setMobileOpen] = useState(false); 20 + 21 + const closeMobile = () => setMobileOpen(false); 22 + 23 + return ( 24 + <header className="sticky top-0 z-50 w-full border-b border-white/10 bg-neutral-950"> 25 + <div className="mx-auto flex h-14 max-w-7xl items-center justify-between gap-4 px-4 sm:px-6"> 26 + <Link 27 + href="/" 28 + className="flex items-center gap-2 font-semibold text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30 focus-visible:ring-offset-2 focus-visible:ring-offset-neutral-950" 29 + onClick={closeMobile} 30 + > 31 + <Image 32 + src="/logo.svg" 33 + alt="" 34 + width={40} 35 + height={40} 36 + className="shrink-0" 37 + /> 38 + <span className="text-lg">eny.space</span> 39 + </Link> 40 + 41 + <nav className="hidden flex-1 justify-center gap-1 md:flex"> 42 + <Link href="/" className={navLinkClass}> 43 + Home 44 + </Link> 45 + {user && ( 46 + <Link href="/dashboard" className={navLinkClass}> 47 + Dashboard 48 + </Link> 49 + )} 50 + <Link href="/#about" className={navLinkClass}> 51 + About 52 + </Link> 53 + </nav> 54 + 55 + <div className="hidden items-center gap-2 md:flex"> 56 + {user ? ( 57 + <form action={signOut}> 58 + <Button 59 + type="submit" 60 + size="default" 61 + className="inline-flex items-center rounded-full bg-white px-4 text-xs font-medium uppercase tracking-wide text-neutral-950 hover:bg-white/90" 62 + > 63 + <span>Sign out</span> 64 + <ArrowUpRightIcon className="ml-1 size-3.5" aria-hidden /> 65 + </Button> 66 + </form> 67 + ) : ( 68 + <> 69 + <Button 70 + variant="outline" 71 + size="default" 72 + className="rounded-full border-white/20 bg-transparent px-4 text-xs font-medium uppercase tracking-wide text-white/90 hover:bg-white/10 hover:text-white" 73 + asChild 74 + > 75 + <Link href="/login">Login</Link> 76 + </Button> 77 + <Button 78 + size="default" 79 + className="rounded-full bg-white px-4 text-xs font-medium uppercase tracking-wide text-neutral-950 hover:bg-white/90" 80 + asChild 81 + > 82 + <Link href="/signup"> 83 + Get started 84 + <ArrowUpRightIcon className="ml-1 size-3.5" aria-hidden /> 85 + </Link> 86 + </Button> 87 + </> 88 + )} 89 + </div> 90 + 91 + <button 92 + type="button" 93 + aria-label="Toggle navigation" 94 + className="inline-flex h-9 w-9 cursor-pointer items-center justify-center rounded-full border border-white/20 text-white md:hidden" 95 + onClick={() => setMobileOpen((open) => !open)} 96 + > 97 + {mobileOpen ? ( 98 + <XIcon className="size-4" aria-hidden /> 99 + ) : ( 100 + <MenuIcon className="size-4" aria-hidden /> 101 + )} 102 + </button> 103 + </div> 104 + 105 + {mobileOpen && ( 106 + <div className="border-t border-white/10 bg-neutral-950 px-4 pb-4 pt-3 md:hidden"> 107 + <nav className="flex flex-col gap-2"> 108 + <Link 109 + href="/" 110 + className="text-sm font-medium text-white/90" 111 + onClick={closeMobile} 112 + > 113 + Home 114 + </Link> 115 + {user && ( 116 + <Link 117 + href="/dashboard" 118 + className="text-sm font-medium text-white/90" 119 + onClick={closeMobile} 120 + > 121 + Dashboard 122 + </Link> 123 + )} 124 + <Link 125 + href="/#about" 126 + className="text-sm font-medium text-white/90" 127 + onClick={closeMobile} 128 + > 129 + About 130 + </Link> 131 + </nav> 132 + 133 + <div className="mt-3 flex flex-col gap-2"> 134 + {user ? ( 135 + <form action={signOut}> 136 + <Button 137 + type="submit" 138 + size="default" 139 + className="inline-flex h-9 items-center justify-center rounded-full bg-white px-4 text-xs font-medium uppercase tracking-wide text-neutral-950 hover:bg-white/90" 140 + > 141 + <span>Sign out</span> 142 + <ArrowUpRightIcon className="ml-1 size-3.5" aria-hidden /> 143 + </Button> 144 + </form> 145 + ) : ( 146 + <> 147 + <Button 148 + variant="outline" 149 + size="default" 150 + className="inline-flex h-9 w-full items-center justify-center rounded-full border-white/20 bg-transparent px-4 text-xs font-medium uppercase tracking-wide text-white/90 hover:bg-white/10 hover:text-white" 151 + asChild 152 + > 153 + <Link href="/login" onClick={closeMobile}> 154 + Login 155 + </Link> 156 + </Button> 157 + <Button 158 + size="default" 159 + className="inline-flex h-9 w-full items-center justify-center rounded-full bg-white px-4 text-xs font-medium uppercase tracking-wide text-neutral-950 hover:bg-white/90" 160 + asChild 161 + > 162 + <Link href="/signup" onClick={closeMobile}> 163 + Get started 164 + <ArrowUpRightIcon className="ml-1 size-3.5" aria-hidden /> 165 + </Link> 166 + </Button> 167 + </> 168 + )} 169 + </div> 170 + </div> 171 + )} 172 + </header> 173 + ); 174 + } 175 +
+2
app/components/testimonials/index.ts
··· 1 + export { TestimonialsSection } from "./testimonials-section"; 2 +
+116
app/components/testimonials/testimonials-section.tsx
··· 1 + import { Card, CardHeader, CardFooter } from "@/actions/components/ui/card"; 2 + import { Heading } from "@/components/heading"; 3 + import { Paragraph } from "@/components/paragraph"; 4 + import { SparklesIcon } from "lucide-react"; 5 + 6 + type Testimonial = { 7 + quote: string; 8 + name: string; 9 + role: string; 10 + company: string; 11 + }; 12 + 13 + const TESTIMONIALS: Testimonial[] = [ 14 + { 15 + quote: 16 + "Switching to eny.space was the best decision for our DeFi platform. Uptime and performance are unmatched.", 17 + name: "Isagi Yoichi", 18 + role: "Chief Technology Officer", 19 + company: "3Portals", 20 + }, 21 + { 22 + quote: 23 + "We can finally deploy smart contracts confidently without worrying about central servers failing.", 24 + name: "Oliver Aiku", 25 + role: "Digital Community Lead", 26 + company: "Acme Corp", 27 + }, 28 + { 29 + quote: 30 + "The migration was seamless and our team now ships faster than ever, with full visibility into our data.", 31 + name: "Alex Rivera", 32 + role: "Head of Engineering", 33 + company: "Nebula Labs", 34 + }, 35 + ]; 36 + 37 + function TestimonialCard({ testimonial }: { testimonial: Testimonial }) { 38 + return ( 39 + <Card className="flex h-full min-w-[280px] max-w-sm flex-col justify-between rounded-3xl border-none bg-gradient-to-b from-neutral-900/80 to-neutral-950/90 p-6 text-white/90 shadow-xl/30 whitespace-normal"> 40 + <CardHeader className="px-0"> 41 + <Paragraph className="text-sm text-white/80"> 42 + {testimonial.quote} 43 + </Paragraph> 44 + </CardHeader> 45 + 46 + <CardFooter className="mt-4 items-center justify-between gap-4 border-t border-white/10 bg-transparent px-0 pt-4"> 47 + <div className="flex items-center gap-3"> 48 + <div className="flex size-9 items-center justify-center rounded-full bg-white/10 text-xs font-semibold uppercase tracking-wide text-white/90"> 49 + {testimonial.name 50 + .split(" ") 51 + .map((part) => part[0]) 52 + .join("")} 53 + </div> 54 + <div className="flex flex-col"> 55 + <span className="text-sm font-medium text-white"> 56 + {testimonial.name} 57 + </span> 58 + <span className="text-xs text-white/60">{testimonial.role}</span> 59 + </div> 60 + </div> 61 + <div className="flex items-center gap-2 text-sm font-semibold text-white/85"> 62 + <span className="flex size-6 items-center justify-center rounded-full bg-amber-400/15"> 63 + <SparklesIcon className="size-3.5 text-amber-300" aria-hidden /> 64 + </span> 65 + <span>{testimonial.company}</span> 66 + </div> 67 + </CardFooter> 68 + </Card> 69 + ); 70 + } 71 + 72 + export function TestimonialsSection() { 73 + return ( 74 + <section className="relative w-full bg-neutral-950 px-4 py-20 sm:px-6 sm:py-24"> 75 + <div className="mx-auto max-w-5xl text-center"> 76 + <Heading 77 + as="h2" 78 + className="text-2xl font-semibold tracking-tight text-white sm:text-3xl md:text-4xl" 79 + > 80 + Trusted by Innovators Worldwide. 81 + </Heading> 82 + <Paragraph className="mt-4 text-sm text-white/70 sm:text-base"> 83 + Hear first-hand from our incredible community of customers. 84 + </Paragraph> 85 + </div> 86 + 87 + <div className="mx-auto mt-12 max-w-6xl"> 88 + <div className="relative w-full overflow-hidden py-4"> 89 + <div 90 + className="pointer-events-none absolute inset-y-0 left-0 w-16 bg-gradient-to-r from-neutral-950 to-transparent z-10" 91 + aria-hidden="true" 92 + /> 93 + <div 94 + className="pointer-events-none absolute inset-y-0 right-0 w-16 bg-gradient-to-l from-neutral-950 to-transparent z-10" 95 + aria-hidden="true" 96 + /> 97 + <div className="flex w-max animate-marquee items-stretch gap-6 [transform:translateZ(0)]"> 98 + {["a", "b"].map((blockId) => ( 99 + <div 100 + key={blockId} 101 + className="flex shrink-0 items-stretch gap-6 whitespace-nowrap" 102 + > 103 + {TESTIMONIALS.map((testimonial) => ( 104 + <TestimonialCard 105 + key={`${blockId}-${testimonial.name}`} 106 + testimonial={testimonial} 107 + /> 108 + ))} 109 + </div> 110 + ))} 111 + </div> 112 + </div> 113 + </div> 114 + </section> 115 + ); 116 + }
+33 -7
app/dashboard/dashboard-client.tsx
··· 74 74 <div> 75 75 <h2>Subscribe to Access</h2> 76 76 <p>You need an active subscription to access the server features.</p> 77 - <button onClick={handleSubscribe} disabled={loading}> 77 + <button 78 + className="cursor-pointer" 79 + onClick={handleSubscribe} 80 + disabled={loading} 81 + > 78 82 {loading ? "Loading..." : "Subscribe Now"} 79 83 </button> 80 84 </div> ··· 88 92 <p> 89 93 Your subscription has been canceled. Subscribe again to regain access. 90 94 </p> 91 - <button onClick={handleSubscribe} disabled={loading}> 95 + <button 96 + className="cursor-pointer" 97 + onClick={handleSubscribe} 98 + disabled={loading} 99 + > 92 100 {loading ? "Loading..." : "Subscribe Again"} 93 101 </button> 94 102 </div> ··· 183 191 )} 184 192 185 193 <p> 186 - <button onClick={handleManageBilling} disabled={actionLoading !== null}> 194 + <button 195 + className="cursor-pointer" 196 + onClick={handleManageBilling} 197 + disabled={actionLoading !== null} 198 + > 187 199 {actionLoading === "billing" 188 200 ? "Loading..." 189 201 : "Manage Payment Method"} ··· 192 204 193 205 <p> 194 206 {isCanceling ? ( 195 - <button onClick={handleResume} disabled={actionLoading !== null}> 207 + <button 208 + className="cursor-pointer" 209 + onClick={handleResume} 210 + disabled={actionLoading !== null} 211 + > 196 212 {actionLoading === "resume" 197 213 ? "Loading..." 198 214 : "Resume Subscription"} 199 215 </button> 200 216 ) : ( 201 - <button onClick={handleCancel} disabled={actionLoading !== null}> 217 + <button 218 + className="cursor-pointer" 219 + onClick={handleCancel} 220 + disabled={actionLoading !== null} 221 + > 202 222 {actionLoading === "cancel" 203 223 ? "Loading..." 204 224 : "Cancel Subscription"} ··· 210 230 <h2>Server Actions</h2> 211 231 <p>You have access to the following server endpoints:</p> 212 232 <p> 213 - <button onClick={() => handleServerCall("action1")}> 233 + <button 234 + className="cursor-pointer" 235 + onClick={() => handleServerCall("action1")} 236 + > 214 237 Call Server Action 1 215 238 </button> 216 239 </p> 217 240 <p> 218 - <button onClick={() => handleServerCall("action2")}> 241 + <button 242 + className="cursor-pointer" 243 + onClick={() => handleServerCall("action2")} 244 + > 219 245 Call Server Action 2 220 246 </button> 221 247 </p>
+21 -8
app/dashboard/page.tsx
··· 1 1 import { redirect } from "next/navigation"; 2 2 import { createClient } from "@/lib/supabase/server"; 3 3 import { getSubscriptionStatus } from "@/actions/subscription"; 4 + import { 5 + Card, 6 + CardContent, 7 + CardHeader, 8 + CardTitle, 9 + CardDescription, 10 + } from "@/actions/components/ui/card"; 4 11 import DashboardClient from "./dashboard-client"; 5 12 6 13 export default async function DashboardPage() { ··· 16 23 const { subscribed, subscription } = await getSubscriptionStatus(); 17 24 18 25 return ( 19 - <main> 20 - <h1>Dashboard</h1> 21 - <p>Welcome, {user.email}!</p> 22 - <DashboardClient 23 - subscribed={subscribed} 24 - subscription={subscription} 25 - priceId={process.env.NEXT_PUBLIC_STRIPE_PRICE_ID || ""} 26 - /> 26 + <main className="flex flex-col gap-6 px-4 py-6"> 27 + <Card> 28 + <CardHeader> 29 + <CardTitle>Dashboard</CardTitle> 30 + <CardDescription>Welcome back, {user.email}.</CardDescription> 31 + </CardHeader> 32 + <CardContent> 33 + <DashboardClient 34 + subscribed={subscribed} 35 + subscription={subscription} 36 + priceId={process.env.NEXT_PUBLIC_STRIPE_PRICE_ID || ""} 37 + /> 38 + </CardContent> 39 + </Card> 27 40 </main> 28 41 ); 29 42 }
+134
app/globals.css
··· 1 1 @import "tailwindcss"; 2 + @import "tw-animate-css"; 3 + @import "shadcn/tailwind.css"; 4 + 5 + @custom-variant dark (&:is(.dark *)); 6 + 7 + :root { 8 + --background: oklch(1 0 0); 9 + --foreground: oklch(0.145 0 0); 10 + --card: oklch(1 0 0); 11 + --card-foreground: oklch(0.145 0 0); 12 + --popover: oklch(1 0 0); 13 + --popover-foreground: oklch(0.145 0 0); 14 + --primary: oklch(0.65 0.18 132); 15 + --primary-foreground: oklch(0.99 0.03 121); 16 + --secondary: oklch(0.967 0.001 286.375); 17 + --secondary-foreground: oklch(0.21 0.006 285.885); 18 + --muted: oklch(0.97 0 0); 19 + --muted-foreground: oklch(0.556 0 0); 20 + --accent: oklch(0.97 0 0); 21 + --accent-foreground: oklch(0.205 0 0); 22 + --destructive: oklch(0.58 0.22 27); 23 + --border: oklch(0.922 0 0); 24 + --input: oklch(0.922 0 0); 25 + --ring: oklch(0.708 0 0); 26 + --chart-1: oklch(0.9 0.18 127); 27 + --chart-2: oklch(0.85 0.21 129); 28 + --chart-3: oklch(0.77 0.2 131); 29 + --chart-4: oklch(0.65 0.18 132); 30 + --chart-5: oklch(0.53 0.14 132); 31 + --radius: 0.625rem; 32 + --sidebar: oklch(0.985 0 0); 33 + --sidebar-foreground: oklch(0.145 0 0); 34 + --sidebar-primary: oklch(0.65 0.18 132); 35 + --sidebar-primary-foreground: oklch(0.99 0.03 121); 36 + --sidebar-accent: oklch(0.97 0 0); 37 + --sidebar-accent-foreground: oklch(0.205 0 0); 38 + --sidebar-border: oklch(0.922 0 0); 39 + --sidebar-ring: oklch(0.708 0 0); 40 + } 41 + 42 + .dark { 43 + --background: oklch(0.145 0 0); 44 + --foreground: oklch(0.985 0 0); 45 + --card: oklch(0.205 0 0); 46 + --card-foreground: oklch(0.985 0 0); 47 + --popover: oklch(0.205 0 0); 48 + --popover-foreground: oklch(0.985 0 0); 49 + --primary: oklch(0.77 0.2 131); 50 + --primary-foreground: oklch(0.27 0.07 132); 51 + --secondary: oklch(0.274 0.006 286.033); 52 + --secondary-foreground: oklch(0.985 0 0); 53 + --muted: oklch(0.269 0 0); 54 + --muted-foreground: oklch(0.708 0 0); 55 + --accent: oklch(0.371 0 0); 56 + --accent-foreground: oklch(0.985 0 0); 57 + --destructive: oklch(0.704 0.191 22.216); 58 + --border: oklch(1 0 0 / 10%); 59 + --input: oklch(1 0 0 / 15%); 60 + --ring: oklch(0.556 0 0); 61 + --chart-1: oklch(0.9 0.18 127); 62 + --chart-2: oklch(0.85 0.21 129); 63 + --chart-3: oklch(0.77 0.2 131); 64 + --chart-4: oklch(0.65 0.18 132); 65 + --chart-5: oklch(0.53 0.14 132); 66 + --sidebar: oklch(0.205 0 0); 67 + --sidebar-foreground: oklch(0.985 0 0); 68 + --sidebar-primary: oklch(0.85 0.21 129); 69 + --sidebar-primary-foreground: oklch(0.27 0.07 132); 70 + --sidebar-accent: oklch(0.269 0 0); 71 + --sidebar-accent-foreground: oklch(0.985 0 0); 72 + --sidebar-border: oklch(1 0 0 / 10%); 73 + --sidebar-ring: oklch(0.556 0 0); 74 + } 75 + 76 + @theme inline { 77 + --font-sans: var(--font-sans); 78 + --color-sidebar-ring: var(--sidebar-ring); 79 + --color-sidebar-border: var(--sidebar-border); 80 + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 81 + --color-sidebar-accent: var(--sidebar-accent); 82 + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 83 + --color-sidebar-primary: var(--sidebar-primary); 84 + --color-sidebar-foreground: var(--sidebar-foreground); 85 + --color-sidebar: var(--sidebar); 86 + --color-chart-5: var(--chart-5); 87 + --color-chart-4: var(--chart-4); 88 + --color-chart-3: var(--chart-3); 89 + --color-chart-2: var(--chart-2); 90 + --color-chart-1: var(--chart-1); 91 + --color-ring: var(--ring); 92 + --color-input: var(--input); 93 + --color-border: var(--border); 94 + --color-destructive: var(--destructive); 95 + --color-accent-foreground: var(--accent-foreground); 96 + --color-accent: var(--accent); 97 + --color-muted-foreground: var(--muted-foreground); 98 + --color-muted: var(--muted); 99 + --color-secondary-foreground: var(--secondary-foreground); 100 + --color-secondary: var(--secondary); 101 + --color-primary-foreground: var(--primary-foreground); 102 + --color-primary: var(--primary); 103 + --color-popover-foreground: var(--popover-foreground); 104 + --color-popover: var(--popover); 105 + --color-card-foreground: var(--card-foreground); 106 + --color-card: var(--card); 107 + --color-foreground: var(--foreground); 108 + --color-background: var(--background); 109 + --radius-sm: calc(var(--radius) - 4px); 110 + --radius-md: calc(var(--radius) - 2px); 111 + --radius-lg: var(--radius); 112 + --radius-xl: calc(var(--radius) + 4px); 113 + --radius-2xl: calc(var(--radius) + 8px); 114 + --radius-3xl: calc(var(--radius) + 12px); 115 + --radius-4xl: calc(var(--radius) + 16px); 116 + --animate-marquee: marquee 25s linear infinite; 117 + 118 + @keyframes marquee { 119 + 0% { 120 + transform: translate3d(0, 0, 0); 121 + } 122 + 100% { 123 + transform: translate3d(-50%, 0, 0); 124 + } 125 + } 126 + } 127 + 128 + @layer base { 129 + * { 130 + @apply border-border outline-ring/50; 131 + } 132 + body { 133 + @apply bg-background text-foreground; 134 + } 135 + }
+8 -25
app/layout.tsx
··· 1 1 import type { Metadata } from "next"; 2 2 import { SpeedInsights } from "@vercel/speed-insights/next"; 3 3 import { Analytics } from "@vercel/analytics/next"; 4 - import Link from "next/link"; 5 4 import { createClient } from "@/lib/supabase/server"; 6 - import { signOut } from "@/actions/auth"; 5 + import { SiteHeader } from "@/components/site-header"; 6 + import { Footer } from "@/components/footer"; 7 7 8 8 import "./globals.css"; 9 + import { Noto_Sans } from "next/font/google"; 10 + 11 + const notoSans = Noto_Sans({ variable: "--font-sans" }); 9 12 10 13 interface LayoutProps { 11 14 children: React.ReactNode; ··· 29 32 } = await supabase.auth.getUser(); 30 33 31 34 return ( 32 - <html lang="en"> 35 + <html lang="en" className={notoSans.variable}> 33 36 <body> 34 - <header> 35 - <Link href="/">eny.space</Link> 36 - {" | "} 37 - <nav style={{ display: "inline" }}> 38 - {user ? ( 39 - <> 40 - <Link href="/dashboard">Dashboard</Link> 41 - {" | "} 42 - <form action={signOut} style={{ display: "inline" }}> 43 - <button type="submit">Sign Out</button> 44 - </form> 45 - </> 46 - ) : ( 47 - <> 48 - <Link href="/login">Login</Link> 49 - {" | "} 50 - <Link href="/signup">Sign Up</Link> 51 - </> 52 - )} 53 - </nav> 54 - </header> 55 - <hr /> 37 + <SiteHeader user={user} /> 56 38 {children} 39 + <Footer /> 57 40 <SpeedInsights /> 58 41 <Analytics /> 59 42 </body>
+56 -68
app/login/page.tsx
··· 1 - import { signIn } from "@/actions/auth"; 2 1 import Link from "next/link"; 2 + import { signIn } from "@/actions/auth"; 3 + import { Button } from "@/actions/components/ui/button"; 4 + import { 5 + Card, 6 + CardContent, 7 + CardDescription, 8 + CardHeader, 9 + CardTitle, 10 + CardFooter, 11 + } from "@/actions/components/ui/card"; 12 + import { Input } from "@/actions/components/ui/input"; 13 + import { Label } from "@/actions/components/ui/label"; 3 14 4 15 export default function LoginPage() { 5 16 return ( 6 - <main 7 - className="page-container" 8 - style={{ maxWidth: "400px", margin: "0 auto" }} 9 - > 10 - <h1>Login</h1> 11 - <form 12 - action={signIn} 13 - style={{ display: "flex", flexDirection: "column", gap: "16px" }} 14 - > 15 - <div> 16 - <label 17 - htmlFor="email" 18 - style={{ display: "block", marginBottom: "8px" }} 19 - > 20 - Email 21 - </label> 22 - <input 23 - type="email" 24 - id="email" 25 - name="email" 26 - required 27 - style={{ 28 - width: "100%", 29 - padding: "8px", 30 - borderRadius: "4px", 31 - border: "1px solid #ccc", 32 - }} 33 - /> 34 - </div> 35 - <div> 36 - <label 37 - htmlFor="password" 38 - style={{ display: "block", marginBottom: "8px" }} 39 - > 40 - Password 41 - </label> 42 - <input 43 - type="password" 44 - id="password" 45 - name="password" 46 - required 47 - style={{ 48 - width: "100%", 49 - padding: "8px", 50 - borderRadius: "4px", 51 - border: "1px solid #ccc", 52 - }} 53 - /> 54 - </div> 55 - <button 56 - type="submit" 57 - style={{ 58 - padding: "12px 24px", 59 - borderRadius: "6px", 60 - backgroundColor: "#000000", 61 - color: "#ffffff", 62 - border: "1px solid #ffffff", 63 - cursor: "pointer", 64 - fontWeight: 600, 65 - }} 66 - > 67 - Login 68 - </button> 69 - </form> 70 - <p style={{ marginTop: "16px", textAlign: "center" }}> 71 - Don&apos;t have an account? <Link href="/signup">Sign up</Link> 72 - </p> 17 + <main className="flex min-h-[60vh] items-center justify-center px-4"> 18 + <Card className="w-full max-w-sm"> 19 + <CardHeader> 20 + <CardTitle>Login</CardTitle> 21 + <CardDescription> 22 + Sign in to access your eny.space dashboard. 23 + </CardDescription> 24 + </CardHeader> 25 + <CardContent> 26 + <form action={signIn} className="space-y-4"> 27 + <div className="space-y-2"> 28 + <Label htmlFor="email">Email</Label> 29 + <Input 30 + id="email" 31 + name="email" 32 + type="email" 33 + autoComplete="email" 34 + required 35 + /> 36 + </div> 37 + <div className="space-y-2"> 38 + <Label htmlFor="password">Password</Label> 39 + <Input 40 + id="password" 41 + name="password" 42 + type="password" 43 + autoComplete="current-password" 44 + required 45 + /> 46 + </div> 47 + <Button type="submit" className="w-full"> 48 + Login 49 + </Button> 50 + </form> 51 + </CardContent> 52 + <CardFooter className="flex justify-center text-sm text-muted-foreground"> 53 + <span> 54 + Don&apos;t have an account?{" "} 55 + <Link href="/signup" className="underline underline-offset-4"> 56 + Sign up 57 + </Link> 58 + </span> 59 + </CardFooter> 60 + </Card> 73 61 </main> 74 62 ); 75 63 }
+17 -37
app/page.tsx
··· 1 - import type { Metadata } from "next"; 2 - 3 - import Link from "next/link"; 1 + import { Hero } from "@/components/hero/hero"; 2 + import { LogoBar } from "@/components/logo-bar"; 3 + import { FeaturesSection } from "@/components/features"; 4 + import { PricingSection } from "@/components/pricing"; 5 + import { TestimonialsSection } from "@/components/testimonials"; 6 + import { FAQSection } from "@/components/faq"; 7 + import { CTASection } from "@/components/cta"; 4 8 5 - export const metadata: Metadata = { 6 - title: "eny.space – your data, your space, use it enywhere", 7 - }; 8 - 9 - export default function IndexPage(): JSX.Element { 9 + export default function Page() { 10 10 return ( 11 - <main> 12 - <h1>Your own custom PDS in seconds</h1> 13 - <h2>One-click ATProto hosting with eny.space</h2> 14 - <p> 15 - We&apos;re building a managed ATProto Personal Data Server (PDS) 16 - platform so you can focus on your product while we handle the 17 - infrastructure, scaling, and compliance. 18 - </p> 19 - 20 - <h3>What&apos;s coming soon</h3> 21 - <ul> 22 - <li>One-click provisioning of dedicated ATProto PDS instances</li> 23 - <li>Automatic backups and seamless upgrades</li> 24 - <li>Usage-based pricing with clear, predictable costs</li> 25 - </ul> 26 - 27 - <h3>Be the first to know</h3> 28 - <p> 29 - We&apos;re onboarding early adopters now. If you&apos;re building on 30 - ATProto and want reliable managed hosting, we&apos;d love to hear from 31 - you. 32 - </p> 33 - 34 - <p> 35 - <Link href="mailto:hello@krekeny.com?subject=I%27d%20like%20early%20access%20to%20eny.space%20PDS"> 36 - Request early access 37 - </Link> 38 - </p> 39 - </main> 11 + <> 12 + <Hero /> 13 + <LogoBar /> 14 + <FeaturesSection /> 15 + <PricingSection /> 16 + <TestimonialsSection /> 17 + <FAQSection /> 18 + <CTASection /> 19 + </> 40 20 ); 41 21 }
+57 -69
app/signup/page.tsx
··· 1 - import { signUp } from "@/actions/auth"; 2 1 import Link from "next/link"; 2 + import { signUp } from "@/actions/auth"; 3 + import { Button } from "@/actions/components/ui/button"; 4 + import { 5 + Card, 6 + CardContent, 7 + CardDescription, 8 + CardHeader, 9 + CardTitle, 10 + CardFooter, 11 + } from "@/actions/components/ui/card"; 12 + import { Input } from "@/actions/components/ui/input"; 13 + import { Label } from "@/actions/components/ui/label"; 3 14 4 15 export default function SignUpPage() { 5 16 return ( 6 - <main 7 - className="page-container" 8 - style={{ maxWidth: "400px", margin: "0 auto" }} 9 - > 10 - <h1>Sign Up</h1> 11 - <form 12 - action={signUp} 13 - style={{ display: "flex", flexDirection: "column", gap: "16px" }} 14 - > 15 - <div> 16 - <label 17 - htmlFor="email" 18 - style={{ display: "block", marginBottom: "8px" }} 19 - > 20 - Email 21 - </label> 22 - <input 23 - type="email" 24 - id="email" 25 - name="email" 26 - required 27 - style={{ 28 - width: "100%", 29 - padding: "8px", 30 - borderRadius: "4px", 31 - border: "1px solid #ccc", 32 - }} 33 - /> 34 - </div> 35 - <div> 36 - <label 37 - htmlFor="password" 38 - style={{ display: "block", marginBottom: "8px" }} 39 - > 40 - Password 41 - </label> 42 - <input 43 - type="password" 44 - id="password" 45 - name="password" 46 - required 47 - minLength={6} 48 - style={{ 49 - width: "100%", 50 - padding: "8px", 51 - borderRadius: "4px", 52 - border: "1px solid #ccc", 53 - }} 54 - /> 55 - </div> 56 - <button 57 - type="submit" 58 - style={{ 59 - padding: "12px 24px", 60 - borderRadius: "6px", 61 - backgroundColor: "#000000", 62 - color: "#ffffff", 63 - border: "1px solid #ffffff", 64 - cursor: "pointer", 65 - fontWeight: 600, 66 - }} 67 - > 68 - Sign Up 69 - </button> 70 - </form> 71 - <p style={{ marginTop: "16px", textAlign: "center" }}> 72 - Already have an account? <Link href="/login">Login</Link> 73 - </p> 17 + <main className="flex min-h-[60vh] items-center justify-center px-4"> 18 + <Card className="w-full max-w-sm"> 19 + <CardHeader> 20 + <CardTitle>Create account</CardTitle> 21 + <CardDescription> 22 + Get started with eny.space in a few seconds. 23 + </CardDescription> 24 + </CardHeader> 25 + <CardContent> 26 + <form action={signUp} className="space-y-4"> 27 + <div className="space-y-2"> 28 + <Label htmlFor="email">Email</Label> 29 + <Input 30 + id="email" 31 + name="email" 32 + type="email" 33 + autoComplete="email" 34 + required 35 + /> 36 + </div> 37 + <div className="space-y-2"> 38 + <Label htmlFor="password">Password</Label> 39 + <Input 40 + id="password" 41 + name="password" 42 + type="password" 43 + minLength={6} 44 + autoComplete="new-password" 45 + required 46 + /> 47 + </div> 48 + <Button type="submit" className="w-full"> 49 + Sign Up 50 + </Button> 51 + </form> 52 + </CardContent> 53 + <CardFooter className="flex justify-center text-sm text-muted-foreground"> 54 + <span> 55 + Already have an account?{" "} 56 + <Link href="/login" className="underline underline-offset-4"> 57 + Login 58 + </Link> 59 + </span> 60 + </CardFooter> 61 + </Card> 74 62 </main> 75 63 ); 76 64 }
+5 -2
components.json
··· 1 1 { 2 2 "$schema": "https://ui.shadcn.com/schema.json", 3 - "style": "new-york", 3 + "style": "radix-nova", 4 4 "rsc": true, 5 5 "tsx": true, 6 6 "tailwind": { 7 7 "config": "", 8 8 "css": "app/globals.css", 9 - "baseColor": "zinc", 9 + "baseColor": "neutral", 10 10 "cssVariables": true, 11 11 "prefix": "" 12 12 }, 13 13 "iconLibrary": "lucide", 14 + "rtl": false, 14 15 "aliases": { 15 16 "components": "@/actions/components", 16 17 "utils": "@/actions/lib/utils", ··· 18 19 "lib": "@/actions/lib", 19 20 "hooks": "@/actions/hooks" 20 21 }, 22 + "menuColor": "default", 23 + "menuAccent": "subtle", 21 24 "registries": {} 22 25 }
+5325 -14
package-lock.json
··· 5 5 "packages": { 6 6 "": { 7 7 "dependencies": { 8 + "@base-ui/react": "^1.2.0", 8 9 "@radix-ui/react-slot": "^1.2.4", 9 10 "@supabase/ssr": "^0.8.0", 10 11 "@supabase/supabase-js": "^2.90.1", ··· 16 17 "lucide-react": "^0.562.0", 17 18 "next": "latest", 18 19 "postcss": "^8.5.6", 20 + "radix-ui": "^1.4.3", 19 21 "react": "18.2.0", 20 22 "react-dom": "18.2.0", 21 23 "server-only": "0.0.1", 24 + "shadcn": "^3.8.5", 22 25 "stripe": "14.8.0", 23 - "tailwind-merge": "^3.4.0", 26 + "tailwind-merge": "^3.5.0", 24 27 "tailwindcss": "^4.1.18" 25 28 }, 26 29 "devDependencies": { ··· 42 45 "url": "https://github.com/sponsors/sindresorhus" 43 46 } 44 47 }, 48 + "node_modules/@antfu/ni": { 49 + "version": "25.0.0", 50 + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-25.0.0.tgz", 51 + "integrity": "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==", 52 + "dependencies": { 53 + "ansis": "^4.0.0", 54 + "fzf": "^0.5.2", 55 + "package-manager-detector": "^1.3.0", 56 + "tinyexec": "^1.0.1" 57 + }, 58 + "bin": { 59 + "na": "bin/na.mjs", 60 + "nci": "bin/nci.mjs", 61 + "ni": "bin/ni.mjs", 62 + "nlx": "bin/nlx.mjs", 63 + "nr": "bin/nr.mjs", 64 + "nun": "bin/nun.mjs", 65 + "nup": "bin/nup.mjs" 66 + } 67 + }, 68 + "node_modules/@babel/code-frame": { 69 + "version": "7.29.0", 70 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", 71 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", 72 + "dependencies": { 73 + "@babel/helper-validator-identifier": "^7.28.5", 74 + "js-tokens": "^4.0.0", 75 + "picocolors": "^1.1.1" 76 + }, 77 + "engines": { 78 + "node": ">=6.9.0" 79 + } 80 + }, 81 + "node_modules/@babel/compat-data": { 82 + "version": "7.29.0", 83 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", 84 + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", 85 + "engines": { 86 + "node": ">=6.9.0" 87 + } 88 + }, 89 + "node_modules/@babel/core": { 90 + "version": "7.29.0", 91 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", 92 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", 93 + "dependencies": { 94 + "@babel/code-frame": "^7.29.0", 95 + "@babel/generator": "^7.29.0", 96 + "@babel/helper-compilation-targets": "^7.28.6", 97 + "@babel/helper-module-transforms": "^7.28.6", 98 + "@babel/helpers": "^7.28.6", 99 + "@babel/parser": "^7.29.0", 100 + "@babel/template": "^7.28.6", 101 + "@babel/traverse": "^7.29.0", 102 + "@babel/types": "^7.29.0", 103 + "@jridgewell/remapping": "^2.3.5", 104 + "convert-source-map": "^2.0.0", 105 + "debug": "^4.1.0", 106 + "gensync": "^1.0.0-beta.2", 107 + "json5": "^2.2.3", 108 + "semver": "^6.3.1" 109 + }, 110 + "engines": { 111 + "node": ">=6.9.0" 112 + }, 113 + "funding": { 114 + "type": "opencollective", 115 + "url": "https://opencollective.com/babel" 116 + } 117 + }, 118 + "node_modules/@babel/core/node_modules/semver": { 119 + "version": "6.3.1", 120 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 121 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 122 + "bin": { 123 + "semver": "bin/semver.js" 124 + } 125 + }, 126 + "node_modules/@babel/generator": { 127 + "version": "7.29.1", 128 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", 129 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", 130 + "dependencies": { 131 + "@babel/parser": "^7.29.0", 132 + "@babel/types": "^7.29.0", 133 + "@jridgewell/gen-mapping": "^0.3.12", 134 + "@jridgewell/trace-mapping": "^0.3.28", 135 + "jsesc": "^3.0.2" 136 + }, 137 + "engines": { 138 + "node": ">=6.9.0" 139 + } 140 + }, 141 + "node_modules/@babel/helper-annotate-as-pure": { 142 + "version": "7.27.3", 143 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", 144 + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", 145 + "dependencies": { 146 + "@babel/types": "^7.27.3" 147 + }, 148 + "engines": { 149 + "node": ">=6.9.0" 150 + } 151 + }, 152 + "node_modules/@babel/helper-compilation-targets": { 153 + "version": "7.28.6", 154 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", 155 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", 156 + "dependencies": { 157 + "@babel/compat-data": "^7.28.6", 158 + "@babel/helper-validator-option": "^7.27.1", 159 + "browserslist": "^4.24.0", 160 + "lru-cache": "^5.1.1", 161 + "semver": "^6.3.1" 162 + }, 163 + "engines": { 164 + "node": ">=6.9.0" 165 + } 166 + }, 167 + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { 168 + "version": "6.3.1", 169 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 170 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 171 + "bin": { 172 + "semver": "bin/semver.js" 173 + } 174 + }, 175 + "node_modules/@babel/helper-create-class-features-plugin": { 176 + "version": "7.28.6", 177 + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", 178 + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", 179 + "dependencies": { 180 + "@babel/helper-annotate-as-pure": "^7.27.3", 181 + "@babel/helper-member-expression-to-functions": "^7.28.5", 182 + "@babel/helper-optimise-call-expression": "^7.27.1", 183 + "@babel/helper-replace-supers": "^7.28.6", 184 + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", 185 + "@babel/traverse": "^7.28.6", 186 + "semver": "^6.3.1" 187 + }, 188 + "engines": { 189 + "node": ">=6.9.0" 190 + }, 191 + "peerDependencies": { 192 + "@babel/core": "^7.0.0" 193 + } 194 + }, 195 + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { 196 + "version": "6.3.1", 197 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 198 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 199 + "bin": { 200 + "semver": "bin/semver.js" 201 + } 202 + }, 203 + "node_modules/@babel/helper-globals": { 204 + "version": "7.28.0", 205 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 206 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 207 + "engines": { 208 + "node": ">=6.9.0" 209 + } 210 + }, 211 + "node_modules/@babel/helper-member-expression-to-functions": { 212 + "version": "7.28.5", 213 + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", 214 + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", 215 + "dependencies": { 216 + "@babel/traverse": "^7.28.5", 217 + "@babel/types": "^7.28.5" 218 + }, 219 + "engines": { 220 + "node": ">=6.9.0" 221 + } 222 + }, 223 + "node_modules/@babel/helper-module-imports": { 224 + "version": "7.28.6", 225 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", 226 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", 227 + "dependencies": { 228 + "@babel/traverse": "^7.28.6", 229 + "@babel/types": "^7.28.6" 230 + }, 231 + "engines": { 232 + "node": ">=6.9.0" 233 + } 234 + }, 235 + "node_modules/@babel/helper-module-transforms": { 236 + "version": "7.28.6", 237 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", 238 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", 239 + "dependencies": { 240 + "@babel/helper-module-imports": "^7.28.6", 241 + "@babel/helper-validator-identifier": "^7.28.5", 242 + "@babel/traverse": "^7.28.6" 243 + }, 244 + "engines": { 245 + "node": ">=6.9.0" 246 + }, 247 + "peerDependencies": { 248 + "@babel/core": "^7.0.0" 249 + } 250 + }, 251 + "node_modules/@babel/helper-optimise-call-expression": { 252 + "version": "7.27.1", 253 + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", 254 + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", 255 + "dependencies": { 256 + "@babel/types": "^7.27.1" 257 + }, 258 + "engines": { 259 + "node": ">=6.9.0" 260 + } 261 + }, 262 + "node_modules/@babel/helper-plugin-utils": { 263 + "version": "7.28.6", 264 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", 265 + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", 266 + "engines": { 267 + "node": ">=6.9.0" 268 + } 269 + }, 270 + "node_modules/@babel/helper-replace-supers": { 271 + "version": "7.28.6", 272 + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", 273 + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", 274 + "dependencies": { 275 + "@babel/helper-member-expression-to-functions": "^7.28.5", 276 + "@babel/helper-optimise-call-expression": "^7.27.1", 277 + "@babel/traverse": "^7.28.6" 278 + }, 279 + "engines": { 280 + "node": ">=6.9.0" 281 + }, 282 + "peerDependencies": { 283 + "@babel/core": "^7.0.0" 284 + } 285 + }, 286 + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { 287 + "version": "7.27.1", 288 + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", 289 + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", 290 + "dependencies": { 291 + "@babel/traverse": "^7.27.1", 292 + "@babel/types": "^7.27.1" 293 + }, 294 + "engines": { 295 + "node": ">=6.9.0" 296 + } 297 + }, 298 + "node_modules/@babel/helper-string-parser": { 299 + "version": "7.27.1", 300 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 301 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 302 + "engines": { 303 + "node": ">=6.9.0" 304 + } 305 + }, 306 + "node_modules/@babel/helper-validator-identifier": { 307 + "version": "7.28.5", 308 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 309 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 310 + "engines": { 311 + "node": ">=6.9.0" 312 + } 313 + }, 314 + "node_modules/@babel/helper-validator-option": { 315 + "version": "7.27.1", 316 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 317 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 318 + "engines": { 319 + "node": ">=6.9.0" 320 + } 321 + }, 322 + "node_modules/@babel/helpers": { 323 + "version": "7.28.6", 324 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", 325 + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", 326 + "dependencies": { 327 + "@babel/template": "^7.28.6", 328 + "@babel/types": "^7.28.6" 329 + }, 330 + "engines": { 331 + "node": ">=6.9.0" 332 + } 333 + }, 334 + "node_modules/@babel/parser": { 335 + "version": "7.29.0", 336 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", 337 + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", 338 + "dependencies": { 339 + "@babel/types": "^7.29.0" 340 + }, 341 + "bin": { 342 + "parser": "bin/babel-parser.js" 343 + }, 344 + "engines": { 345 + "node": ">=6.0.0" 346 + } 347 + }, 348 + "node_modules/@babel/plugin-syntax-jsx": { 349 + "version": "7.28.6", 350 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", 351 + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", 352 + "dependencies": { 353 + "@babel/helper-plugin-utils": "^7.28.6" 354 + }, 355 + "engines": { 356 + "node": ">=6.9.0" 357 + }, 358 + "peerDependencies": { 359 + "@babel/core": "^7.0.0-0" 360 + } 361 + }, 362 + "node_modules/@babel/plugin-syntax-typescript": { 363 + "version": "7.28.6", 364 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", 365 + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", 366 + "dependencies": { 367 + "@babel/helper-plugin-utils": "^7.28.6" 368 + }, 369 + "engines": { 370 + "node": ">=6.9.0" 371 + }, 372 + "peerDependencies": { 373 + "@babel/core": "^7.0.0-0" 374 + } 375 + }, 376 + "node_modules/@babel/plugin-transform-modules-commonjs": { 377 + "version": "7.28.6", 378 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", 379 + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", 380 + "dependencies": { 381 + "@babel/helper-module-transforms": "^7.28.6", 382 + "@babel/helper-plugin-utils": "^7.28.6" 383 + }, 384 + "engines": { 385 + "node": ">=6.9.0" 386 + }, 387 + "peerDependencies": { 388 + "@babel/core": "^7.0.0-0" 389 + } 390 + }, 391 + "node_modules/@babel/plugin-transform-typescript": { 392 + "version": "7.28.6", 393 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", 394 + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", 395 + "dependencies": { 396 + "@babel/helper-annotate-as-pure": "^7.27.3", 397 + "@babel/helper-create-class-features-plugin": "^7.28.6", 398 + "@babel/helper-plugin-utils": "^7.28.6", 399 + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", 400 + "@babel/plugin-syntax-typescript": "^7.28.6" 401 + }, 402 + "engines": { 403 + "node": ">=6.9.0" 404 + }, 405 + "peerDependencies": { 406 + "@babel/core": "^7.0.0-0" 407 + } 408 + }, 409 + "node_modules/@babel/preset-typescript": { 410 + "version": "7.28.5", 411 + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", 412 + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", 413 + "dependencies": { 414 + "@babel/helper-plugin-utils": "^7.27.1", 415 + "@babel/helper-validator-option": "^7.27.1", 416 + "@babel/plugin-syntax-jsx": "^7.27.1", 417 + "@babel/plugin-transform-modules-commonjs": "^7.27.1", 418 + "@babel/plugin-transform-typescript": "^7.28.5" 419 + }, 420 + "engines": { 421 + "node": ">=6.9.0" 422 + }, 423 + "peerDependencies": { 424 + "@babel/core": "^7.0.0-0" 425 + } 426 + }, 427 + "node_modules/@babel/runtime": { 428 + "version": "7.28.6", 429 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", 430 + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", 431 + "engines": { 432 + "node": ">=6.9.0" 433 + } 434 + }, 435 + "node_modules/@babel/template": { 436 + "version": "7.28.6", 437 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", 438 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", 439 + "dependencies": { 440 + "@babel/code-frame": "^7.28.6", 441 + "@babel/parser": "^7.28.6", 442 + "@babel/types": "^7.28.6" 443 + }, 444 + "engines": { 445 + "node": ">=6.9.0" 446 + } 447 + }, 448 + "node_modules/@babel/traverse": { 449 + "version": "7.29.0", 450 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", 451 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", 452 + "dependencies": { 453 + "@babel/code-frame": "^7.29.0", 454 + "@babel/generator": "^7.29.0", 455 + "@babel/helper-globals": "^7.28.0", 456 + "@babel/parser": "^7.29.0", 457 + "@babel/template": "^7.28.6", 458 + "@babel/types": "^7.29.0", 459 + "debug": "^4.3.1" 460 + }, 461 + "engines": { 462 + "node": ">=6.9.0" 463 + } 464 + }, 465 + "node_modules/@babel/types": { 466 + "version": "7.29.0", 467 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", 468 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", 469 + "dependencies": { 470 + "@babel/helper-string-parser": "^7.27.1", 471 + "@babel/helper-validator-identifier": "^7.28.5" 472 + }, 473 + "engines": { 474 + "node": ">=6.9.0" 475 + } 476 + }, 477 + "node_modules/@base-ui/react": { 478 + "version": "1.2.0", 479 + "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.2.0.tgz", 480 + "integrity": "sha512-O6aEQHcm+QyGTFY28xuwRD3SEJGZOBDpyjN2WvpfWYFVhg+3zfXPysAILqtM0C1kWC82MccOE/v1j+GHXE4qIw==", 481 + "dependencies": { 482 + "@babel/runtime": "^7.28.6", 483 + "@base-ui/utils": "0.2.5", 484 + "@floating-ui/react-dom": "^2.1.6", 485 + "@floating-ui/utils": "^0.2.10", 486 + "tabbable": "^6.4.0", 487 + "use-sync-external-store": "^1.6.0" 488 + }, 489 + "engines": { 490 + "node": ">=14.0.0" 491 + }, 492 + "funding": { 493 + "type": "opencollective", 494 + "url": "https://opencollective.com/mui-org" 495 + }, 496 + "peerDependencies": { 497 + "@types/react": "^17 || ^18 || ^19", 498 + "react": "^17 || ^18 || ^19", 499 + "react-dom": "^17 || ^18 || ^19" 500 + }, 501 + "peerDependenciesMeta": { 502 + "@types/react": { 503 + "optional": true 504 + } 505 + } 506 + }, 507 + "node_modules/@base-ui/utils": { 508 + "version": "0.2.5", 509 + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.5.tgz", 510 + "integrity": "sha512-oYC7w0gp76RI5MxprlGLV0wze0SErZaRl3AAkeP3OnNB/UBMb6RqNf6ZSIlxOc9Qp68Ab3C2VOcJQyRs7Xc7Vw==", 511 + "dependencies": { 512 + "@babel/runtime": "^7.28.6", 513 + "@floating-ui/utils": "^0.2.10", 514 + "reselect": "^5.1.1", 515 + "use-sync-external-store": "^1.6.0" 516 + }, 517 + "peerDependencies": { 518 + "@types/react": "^17 || ^18 || ^19", 519 + "react": "^17 || ^18 || ^19", 520 + "react-dom": "^17 || ^18 || ^19" 521 + }, 522 + "peerDependenciesMeta": { 523 + "@types/react": { 524 + "optional": true 525 + } 526 + } 527 + }, 528 + "node_modules/@dotenvx/dotenvx": { 529 + "version": "1.53.0", 530 + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.53.0.tgz", 531 + "integrity": "sha512-OnsVuJ5O2WCUMXBnyuYah08/I6Tnt1FEZ2PGH9skSRuRh3LK5UoGa6Bzi5Toj/F/0mbeFfv+eNKTsYRoGgRh3Q==", 532 + "dependencies": { 533 + "commander": "^11.1.0", 534 + "dotenv": "^17.2.1", 535 + "eciesjs": "^0.4.10", 536 + "execa": "^5.1.1", 537 + "fdir": "^6.2.0", 538 + "ignore": "^5.3.0", 539 + "object-treeify": "1.1.33", 540 + "picomatch": "^4.0.2", 541 + "which": "^4.0.0" 542 + }, 543 + "bin": { 544 + "dotenvx": "src/cli/dotenvx.js" 545 + }, 546 + "funding": { 547 + "url": "https://dotenvx.com" 548 + } 549 + }, 550 + "node_modules/@dotenvx/dotenvx/node_modules/commander": { 551 + "version": "11.1.0", 552 + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", 553 + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", 554 + "engines": { 555 + "node": ">=16" 556 + } 557 + }, 558 + "node_modules/@dotenvx/dotenvx/node_modules/execa": { 559 + "version": "5.1.1", 560 + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 561 + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 562 + "dependencies": { 563 + "cross-spawn": "^7.0.3", 564 + "get-stream": "^6.0.0", 565 + "human-signals": "^2.1.0", 566 + "is-stream": "^2.0.0", 567 + "merge-stream": "^2.0.0", 568 + "npm-run-path": "^4.0.1", 569 + "onetime": "^5.1.2", 570 + "signal-exit": "^3.0.3", 571 + "strip-final-newline": "^2.0.0" 572 + }, 573 + "engines": { 574 + "node": ">=10" 575 + }, 576 + "funding": { 577 + "url": "https://github.com/sindresorhus/execa?sponsor=1" 578 + } 579 + }, 580 + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { 581 + "version": "6.0.1", 582 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 583 + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 584 + "engines": { 585 + "node": ">=10" 586 + }, 587 + "funding": { 588 + "url": "https://github.com/sponsors/sindresorhus" 589 + } 590 + }, 591 + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { 592 + "version": "2.1.0", 593 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 594 + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 595 + "engines": { 596 + "node": ">=10.17.0" 597 + } 598 + }, 599 + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { 600 + "version": "2.0.1", 601 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 602 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 603 + "engines": { 604 + "node": ">=8" 605 + }, 606 + "funding": { 607 + "url": "https://github.com/sponsors/sindresorhus" 608 + } 609 + }, 610 + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { 611 + "version": "4.0.1", 612 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 613 + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 614 + "dependencies": { 615 + "path-key": "^3.0.0" 616 + }, 617 + "engines": { 618 + "node": ">=8" 619 + } 620 + }, 621 + "node_modules/@dotenvx/dotenvx/node_modules/onetime": { 622 + "version": "5.1.2", 623 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 624 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 625 + "dependencies": { 626 + "mimic-fn": "^2.1.0" 627 + }, 628 + "engines": { 629 + "node": ">=6" 630 + }, 631 + "funding": { 632 + "url": "https://github.com/sponsors/sindresorhus" 633 + } 634 + }, 635 + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { 636 + "version": "3.0.7", 637 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 638 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 639 + }, 640 + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { 641 + "version": "2.0.0", 642 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 643 + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 644 + "engines": { 645 + "node": ">=6" 646 + } 647 + }, 648 + "node_modules/@ecies/ciphers": { 649 + "version": "0.2.5", 650 + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.5.tgz", 651 + "integrity": "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==", 652 + "engines": { 653 + "bun": ">=1", 654 + "deno": ">=2", 655 + "node": ">=16" 656 + }, 657 + "peerDependencies": { 658 + "@noble/ciphers": "^1.0.0" 659 + } 660 + }, 45 661 "node_modules/@emnapi/runtime": { 46 662 "version": "1.7.1", 47 663 "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", ··· 50 666 "optional": true, 51 667 "dependencies": { 52 668 "tslib": "^2.4.0" 669 + } 670 + }, 671 + "node_modules/@floating-ui/core": { 672 + "version": "1.7.5", 673 + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", 674 + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", 675 + "dependencies": { 676 + "@floating-ui/utils": "^0.2.11" 677 + } 678 + }, 679 + "node_modules/@floating-ui/dom": { 680 + "version": "1.7.6", 681 + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", 682 + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", 683 + "dependencies": { 684 + "@floating-ui/core": "^1.7.5", 685 + "@floating-ui/utils": "^0.2.11" 686 + } 687 + }, 688 + "node_modules/@floating-ui/react-dom": { 689 + "version": "2.1.8", 690 + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", 691 + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", 692 + "dependencies": { 693 + "@floating-ui/dom": "^1.7.6" 694 + }, 695 + "peerDependencies": { 696 + "react": ">=16.8.0", 697 + "react-dom": ">=16.8.0" 698 + } 699 + }, 700 + "node_modules/@floating-ui/utils": { 701 + "version": "0.2.11", 702 + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", 703 + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==" 704 + }, 705 + "node_modules/@hono/node-server": { 706 + "version": "1.19.11", 707 + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", 708 + "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", 709 + "engines": { 710 + "node": ">=18.14.1" 711 + }, 712 + "peerDependencies": { 713 + "hono": "^4" 53 714 } 54 715 }, 55 716 "node_modules/@img/colour": { ··· 518 1179 "url": "https://opencollective.com/libvips" 519 1180 } 520 1181 }, 1182 + "node_modules/@inquirer/ansi": { 1183 + "version": "1.0.2", 1184 + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", 1185 + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", 1186 + "engines": { 1187 + "node": ">=18" 1188 + } 1189 + }, 1190 + "node_modules/@inquirer/confirm": { 1191 + "version": "5.1.21", 1192 + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", 1193 + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", 1194 + "dependencies": { 1195 + "@inquirer/core": "^10.3.2", 1196 + "@inquirer/type": "^3.0.10" 1197 + }, 1198 + "engines": { 1199 + "node": ">=18" 1200 + }, 1201 + "peerDependencies": { 1202 + "@types/node": ">=18" 1203 + }, 1204 + "peerDependenciesMeta": { 1205 + "@types/node": { 1206 + "optional": true 1207 + } 1208 + } 1209 + }, 1210 + "node_modules/@inquirer/core": { 1211 + "version": "10.3.2", 1212 + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", 1213 + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", 1214 + "dependencies": { 1215 + "@inquirer/ansi": "^1.0.2", 1216 + "@inquirer/figures": "^1.0.15", 1217 + "@inquirer/type": "^3.0.10", 1218 + "cli-width": "^4.1.0", 1219 + "mute-stream": "^2.0.0", 1220 + "signal-exit": "^4.1.0", 1221 + "wrap-ansi": "^6.2.0", 1222 + "yoctocolors-cjs": "^2.1.3" 1223 + }, 1224 + "engines": { 1225 + "node": ">=18" 1226 + }, 1227 + "peerDependencies": { 1228 + "@types/node": ">=18" 1229 + }, 1230 + "peerDependenciesMeta": { 1231 + "@types/node": { 1232 + "optional": true 1233 + } 1234 + } 1235 + }, 1236 + "node_modules/@inquirer/figures": { 1237 + "version": "1.0.15", 1238 + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", 1239 + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", 1240 + "engines": { 1241 + "node": ">=18" 1242 + } 1243 + }, 1244 + "node_modules/@inquirer/type": { 1245 + "version": "3.0.10", 1246 + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", 1247 + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", 1248 + "engines": { 1249 + "node": ">=18" 1250 + }, 1251 + "peerDependencies": { 1252 + "@types/node": ">=18" 1253 + }, 1254 + "peerDependenciesMeta": { 1255 + "@types/node": { 1256 + "optional": true 1257 + } 1258 + } 1259 + }, 521 1260 "node_modules/@jridgewell/gen-mapping": { 522 1261 "version": "0.3.13", 523 1262 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", ··· 563 1302 "@jridgewell/sourcemap-codec": "^1.4.14" 564 1303 } 565 1304 }, 1305 + "node_modules/@modelcontextprotocol/sdk": { 1306 + "version": "1.27.1", 1307 + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", 1308 + "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", 1309 + "dependencies": { 1310 + "@hono/node-server": "^1.19.9", 1311 + "ajv": "^8.17.1", 1312 + "ajv-formats": "^3.0.1", 1313 + "content-type": "^1.0.5", 1314 + "cors": "^2.8.5", 1315 + "cross-spawn": "^7.0.5", 1316 + "eventsource": "^3.0.2", 1317 + "eventsource-parser": "^3.0.0", 1318 + "express": "^5.2.1", 1319 + "express-rate-limit": "^8.2.1", 1320 + "hono": "^4.11.4", 1321 + "jose": "^6.1.3", 1322 + "json-schema-typed": "^8.0.2", 1323 + "pkce-challenge": "^5.0.0", 1324 + "raw-body": "^3.0.0", 1325 + "zod": "^3.25 || ^4.0", 1326 + "zod-to-json-schema": "^3.25.1" 1327 + }, 1328 + "engines": { 1329 + "node": ">=18" 1330 + }, 1331 + "peerDependencies": { 1332 + "@cfworker/json-schema": "^4.1.1", 1333 + "zod": "^3.25 || ^4.0" 1334 + }, 1335 + "peerDependenciesMeta": { 1336 + "@cfworker/json-schema": { 1337 + "optional": true 1338 + }, 1339 + "zod": { 1340 + "optional": false 1341 + } 1342 + } 1343 + }, 1344 + "node_modules/@mswjs/interceptors": { 1345 + "version": "0.41.3", 1346 + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", 1347 + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", 1348 + "dependencies": { 1349 + "@open-draft/deferred-promise": "^2.2.0", 1350 + "@open-draft/logger": "^0.3.0", 1351 + "@open-draft/until": "^2.0.0", 1352 + "is-node-process": "^1.2.0", 1353 + "outvariant": "^1.4.3", 1354 + "strict-event-emitter": "^0.5.1" 1355 + }, 1356 + "engines": { 1357 + "node": ">=18" 1358 + } 1359 + }, 566 1360 "node_modules/@next/env": { 567 1361 "version": "16.0.10", 568 1362 "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", ··· 697 1491 "node": ">= 10" 698 1492 } 699 1493 }, 1494 + "node_modules/@noble/ciphers": { 1495 + "version": "1.3.0", 1496 + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", 1497 + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", 1498 + "engines": { 1499 + "node": "^14.21.3 || >=16" 1500 + }, 1501 + "funding": { 1502 + "url": "https://paulmillr.com/funding/" 1503 + } 1504 + }, 1505 + "node_modules/@noble/curves": { 1506 + "version": "1.9.7", 1507 + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", 1508 + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", 1509 + "dependencies": { 1510 + "@noble/hashes": "1.8.0" 1511 + }, 1512 + "engines": { 1513 + "node": "^14.21.3 || >=16" 1514 + }, 1515 + "funding": { 1516 + "url": "https://paulmillr.com/funding/" 1517 + } 1518 + }, 1519 + "node_modules/@noble/hashes": { 1520 + "version": "1.8.0", 1521 + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", 1522 + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", 1523 + "engines": { 1524 + "node": "^14.21.3 || >=16" 1525 + }, 1526 + "funding": { 1527 + "url": "https://paulmillr.com/funding/" 1528 + } 1529 + }, 1530 + "node_modules/@nodelib/fs.scandir": { 1531 + "version": "2.1.5", 1532 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1533 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1534 + "dependencies": { 1535 + "@nodelib/fs.stat": "2.0.5", 1536 + "run-parallel": "^1.1.9" 1537 + }, 1538 + "engines": { 1539 + "node": ">= 8" 1540 + } 1541 + }, 1542 + "node_modules/@nodelib/fs.stat": { 1543 + "version": "2.0.5", 1544 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1545 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1546 + "engines": { 1547 + "node": ">= 8" 1548 + } 1549 + }, 1550 + "node_modules/@nodelib/fs.walk": { 1551 + "version": "1.2.8", 1552 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1553 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1554 + "dependencies": { 1555 + "@nodelib/fs.scandir": "2.1.5", 1556 + "fastq": "^1.6.0" 1557 + }, 1558 + "engines": { 1559 + "node": ">= 8" 1560 + } 1561 + }, 1562 + "node_modules/@open-draft/deferred-promise": { 1563 + "version": "2.2.0", 1564 + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", 1565 + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" 1566 + }, 1567 + "node_modules/@open-draft/logger": { 1568 + "version": "0.3.0", 1569 + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", 1570 + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", 1571 + "dependencies": { 1572 + "is-node-process": "^1.2.0", 1573 + "outvariant": "^1.4.0" 1574 + } 1575 + }, 1576 + "node_modules/@open-draft/until": { 1577 + "version": "2.1.0", 1578 + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", 1579 + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" 1580 + }, 1581 + "node_modules/@radix-ui/number": { 1582 + "version": "1.1.1", 1583 + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", 1584 + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==" 1585 + }, 1586 + "node_modules/@radix-ui/primitive": { 1587 + "version": "1.1.3", 1588 + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", 1589 + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==" 1590 + }, 700 1591 "node_modules/@radix-ui/react-compose-refs": { 701 1592 "version": "1.1.2", 702 1593 "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", ··· 712 1603 } 713 1604 } 714 1605 }, 1606 + "node_modules/@radix-ui/react-context": { 1607 + "version": "1.1.2", 1608 + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", 1609 + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", 1610 + "peerDependencies": { 1611 + "@types/react": "*", 1612 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1613 + }, 1614 + "peerDependenciesMeta": { 1615 + "@types/react": { 1616 + "optional": true 1617 + } 1618 + } 1619 + }, 1620 + "node_modules/@radix-ui/react-direction": { 1621 + "version": "1.1.1", 1622 + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", 1623 + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", 1624 + "peerDependencies": { 1625 + "@types/react": "*", 1626 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1627 + }, 1628 + "peerDependenciesMeta": { 1629 + "@types/react": { 1630 + "optional": true 1631 + } 1632 + } 1633 + }, 1634 + "node_modules/@radix-ui/react-focus-guards": { 1635 + "version": "1.1.3", 1636 + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", 1637 + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", 1638 + "peerDependencies": { 1639 + "@types/react": "*", 1640 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1641 + }, 1642 + "peerDependenciesMeta": { 1643 + "@types/react": { 1644 + "optional": true 1645 + } 1646 + } 1647 + }, 1648 + "node_modules/@radix-ui/react-id": { 1649 + "version": "1.1.1", 1650 + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", 1651 + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", 1652 + "dependencies": { 1653 + "@radix-ui/react-use-layout-effect": "1.1.1" 1654 + }, 1655 + "peerDependencies": { 1656 + "@types/react": "*", 1657 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1658 + }, 1659 + "peerDependenciesMeta": { 1660 + "@types/react": { 1661 + "optional": true 1662 + } 1663 + } 1664 + }, 715 1665 "node_modules/@radix-ui/react-slot": { 716 1666 "version": "1.2.4", 717 1667 "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", ··· 730 1680 } 731 1681 } 732 1682 }, 1683 + "node_modules/@radix-ui/react-use-callback-ref": { 1684 + "version": "1.1.1", 1685 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", 1686 + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", 1687 + "peerDependencies": { 1688 + "@types/react": "*", 1689 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1690 + }, 1691 + "peerDependenciesMeta": { 1692 + "@types/react": { 1693 + "optional": true 1694 + } 1695 + } 1696 + }, 1697 + "node_modules/@radix-ui/react-use-controllable-state": { 1698 + "version": "1.2.2", 1699 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", 1700 + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", 1701 + "dependencies": { 1702 + "@radix-ui/react-use-effect-event": "0.0.2", 1703 + "@radix-ui/react-use-layout-effect": "1.1.1" 1704 + }, 1705 + "peerDependencies": { 1706 + "@types/react": "*", 1707 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1708 + }, 1709 + "peerDependenciesMeta": { 1710 + "@types/react": { 1711 + "optional": true 1712 + } 1713 + } 1714 + }, 1715 + "node_modules/@radix-ui/react-use-effect-event": { 1716 + "version": "0.0.2", 1717 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", 1718 + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", 1719 + "dependencies": { 1720 + "@radix-ui/react-use-layout-effect": "1.1.1" 1721 + }, 1722 + "peerDependencies": { 1723 + "@types/react": "*", 1724 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1725 + }, 1726 + "peerDependenciesMeta": { 1727 + "@types/react": { 1728 + "optional": true 1729 + } 1730 + } 1731 + }, 1732 + "node_modules/@radix-ui/react-use-escape-keydown": { 1733 + "version": "1.1.1", 1734 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", 1735 + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", 1736 + "dependencies": { 1737 + "@radix-ui/react-use-callback-ref": "1.1.1" 1738 + }, 1739 + "peerDependencies": { 1740 + "@types/react": "*", 1741 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1742 + }, 1743 + "peerDependenciesMeta": { 1744 + "@types/react": { 1745 + "optional": true 1746 + } 1747 + } 1748 + }, 1749 + "node_modules/@radix-ui/react-use-is-hydrated": { 1750 + "version": "0.1.0", 1751 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", 1752 + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", 1753 + "dependencies": { 1754 + "use-sync-external-store": "^1.5.0" 1755 + }, 1756 + "peerDependencies": { 1757 + "@types/react": "*", 1758 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1759 + }, 1760 + "peerDependenciesMeta": { 1761 + "@types/react": { 1762 + "optional": true 1763 + } 1764 + } 1765 + }, 1766 + "node_modules/@radix-ui/react-use-layout-effect": { 1767 + "version": "1.1.1", 1768 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", 1769 + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", 1770 + "peerDependencies": { 1771 + "@types/react": "*", 1772 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1773 + }, 1774 + "peerDependenciesMeta": { 1775 + "@types/react": { 1776 + "optional": true 1777 + } 1778 + } 1779 + }, 1780 + "node_modules/@radix-ui/react-use-previous": { 1781 + "version": "1.1.1", 1782 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", 1783 + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", 1784 + "peerDependencies": { 1785 + "@types/react": "*", 1786 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1787 + }, 1788 + "peerDependenciesMeta": { 1789 + "@types/react": { 1790 + "optional": true 1791 + } 1792 + } 1793 + }, 1794 + "node_modules/@radix-ui/react-use-rect": { 1795 + "version": "1.1.1", 1796 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", 1797 + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", 1798 + "dependencies": { 1799 + "@radix-ui/rect": "1.1.1" 1800 + }, 1801 + "peerDependencies": { 1802 + "@types/react": "*", 1803 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1804 + }, 1805 + "peerDependenciesMeta": { 1806 + "@types/react": { 1807 + "optional": true 1808 + } 1809 + } 1810 + }, 1811 + "node_modules/@radix-ui/react-use-size": { 1812 + "version": "1.1.1", 1813 + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", 1814 + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", 1815 + "dependencies": { 1816 + "@radix-ui/react-use-layout-effect": "1.1.1" 1817 + }, 1818 + "peerDependencies": { 1819 + "@types/react": "*", 1820 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 1821 + }, 1822 + "peerDependenciesMeta": { 1823 + "@types/react": { 1824 + "optional": true 1825 + } 1826 + } 1827 + }, 1828 + "node_modules/@radix-ui/rect": { 1829 + "version": "1.1.1", 1830 + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", 1831 + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" 1832 + }, 1833 + "node_modules/@sec-ant/readable-stream": { 1834 + "version": "0.4.1", 1835 + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", 1836 + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" 1837 + }, 1838 + "node_modules/@sindresorhus/merge-streams": { 1839 + "version": "4.0.0", 1840 + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", 1841 + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", 1842 + "engines": { 1843 + "node": ">=18" 1844 + }, 1845 + "funding": { 1846 + "url": "https://github.com/sponsors/sindresorhus" 1847 + } 1848 + }, 733 1849 "node_modules/@supabase/auth-js": { 734 1850 "version": "2.90.1", 735 1851 "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.90.1.tgz", ··· 1087 2203 "tailwindcss": "4.1.18" 1088 2204 } 1089 2205 }, 2206 + "node_modules/@ts-morph/common": { 2207 + "version": "0.27.0", 2208 + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", 2209 + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", 2210 + "dependencies": { 2211 + "fast-glob": "^3.3.3", 2212 + "minimatch": "^10.0.1", 2213 + "path-browserify": "^1.0.1" 2214 + } 2215 + }, 1090 2216 "node_modules/@types/node": { 1091 2217 "version": "20.4.6", 1092 2218 "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.6.tgz", ··· 1124 2250 "integrity": "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==", 1125 2251 "devOptional": true, 1126 2252 "license": "MIT" 2253 + }, 2254 + "node_modules/@types/statuses": { 2255 + "version": "2.0.6", 2256 + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", 2257 + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==" 2258 + }, 2259 + "node_modules/@types/validate-npm-package-name": { 2260 + "version": "4.0.2", 2261 + "resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz", 2262 + "integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==" 1127 2263 }, 1128 2264 "node_modules/@types/ws": { 1129 2265 "version": "8.18.1", ··· 1206 2342 } 1207 2343 } 1208 2344 }, 2345 + "node_modules/accepts": { 2346 + "version": "2.0.0", 2347 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 2348 + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 2349 + "dependencies": { 2350 + "mime-types": "^3.0.0", 2351 + "negotiator": "^1.0.0" 2352 + }, 2353 + "engines": { 2354 + "node": ">= 0.6" 2355 + } 2356 + }, 2357 + "node_modules/agent-base": { 2358 + "version": "7.1.4", 2359 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 2360 + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 2361 + "engines": { 2362 + "node": ">= 14" 2363 + } 2364 + }, 2365 + "node_modules/ajv": { 2366 + "version": "8.18.0", 2367 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", 2368 + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", 2369 + "dependencies": { 2370 + "fast-deep-equal": "^3.1.3", 2371 + "fast-uri": "^3.0.1", 2372 + "json-schema-traverse": "^1.0.0", 2373 + "require-from-string": "^2.0.2" 2374 + }, 2375 + "funding": { 2376 + "type": "github", 2377 + "url": "https://github.com/sponsors/epoberezkin" 2378 + } 2379 + }, 2380 + "node_modules/ajv-formats": { 2381 + "version": "3.0.1", 2382 + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", 2383 + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", 2384 + "dependencies": { 2385 + "ajv": "^8.0.0" 2386 + }, 2387 + "peerDependencies": { 2388 + "ajv": "^8.0.0" 2389 + }, 2390 + "peerDependenciesMeta": { 2391 + "ajv": { 2392 + "optional": true 2393 + } 2394 + } 2395 + }, 2396 + "node_modules/ansi-regex": { 2397 + "version": "6.2.2", 2398 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", 2399 + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", 2400 + "engines": { 2401 + "node": ">=12" 2402 + }, 2403 + "funding": { 2404 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2405 + } 2406 + }, 2407 + "node_modules/ansi-styles": { 2408 + "version": "4.3.0", 2409 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2410 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2411 + "dependencies": { 2412 + "color-convert": "^2.0.1" 2413 + }, 2414 + "engines": { 2415 + "node": ">=8" 2416 + }, 2417 + "funding": { 2418 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2419 + } 2420 + }, 2421 + "node_modules/ansis": { 2422 + "version": "4.2.0", 2423 + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", 2424 + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", 2425 + "engines": { 2426 + "node": ">=14" 2427 + } 2428 + }, 2429 + "node_modules/argparse": { 2430 + "version": "2.0.1", 2431 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2432 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 2433 + }, 2434 + "node_modules/aria-hidden": { 2435 + "version": "1.2.6", 2436 + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", 2437 + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", 2438 + "dependencies": { 2439 + "tslib": "^2.0.0" 2440 + }, 2441 + "engines": { 2442 + "node": ">=10" 2443 + } 2444 + }, 2445 + "node_modules/ast-types": { 2446 + "version": "0.16.1", 2447 + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", 2448 + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", 2449 + "dependencies": { 2450 + "tslib": "^2.0.1" 2451 + }, 2452 + "engines": { 2453 + "node": ">=4" 2454 + } 2455 + }, 2456 + "node_modules/balanced-match": { 2457 + "version": "4.0.4", 2458 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", 2459 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", 2460 + "engines": { 2461 + "node": "18 || 20 || >=22" 2462 + } 2463 + }, 2464 + "node_modules/baseline-browser-mapping": { 2465 + "version": "2.10.0", 2466 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", 2467 + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", 2468 + "bin": { 2469 + "baseline-browser-mapping": "dist/cli.cjs" 2470 + }, 2471 + "engines": { 2472 + "node": ">=6.0.0" 2473 + } 2474 + }, 2475 + "node_modules/body-parser": { 2476 + "version": "2.2.2", 2477 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", 2478 + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", 2479 + "dependencies": { 2480 + "bytes": "^3.1.2", 2481 + "content-type": "^1.0.5", 2482 + "debug": "^4.4.3", 2483 + "http-errors": "^2.0.0", 2484 + "iconv-lite": "^0.7.0", 2485 + "on-finished": "^2.4.1", 2486 + "qs": "^6.14.1", 2487 + "raw-body": "^3.0.1", 2488 + "type-is": "^2.0.1" 2489 + }, 2490 + "engines": { 2491 + "node": ">=18" 2492 + }, 2493 + "funding": { 2494 + "type": "opencollective", 2495 + "url": "https://opencollective.com/express" 2496 + } 2497 + }, 2498 + "node_modules/brace-expansion": { 2499 + "version": "5.0.4", 2500 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", 2501 + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", 2502 + "dependencies": { 2503 + "balanced-match": "^4.0.2" 2504 + }, 2505 + "engines": { 2506 + "node": "18 || 20 || >=22" 2507 + } 2508 + }, 2509 + "node_modules/braces": { 2510 + "version": "3.0.3", 2511 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2512 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2513 + "dependencies": { 2514 + "fill-range": "^7.1.1" 2515 + }, 2516 + "engines": { 2517 + "node": ">=8" 2518 + } 2519 + }, 2520 + "node_modules/browserslist": { 2521 + "version": "4.28.1", 2522 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 2523 + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 2524 + "funding": [ 2525 + { 2526 + "type": "opencollective", 2527 + "url": "https://opencollective.com/browserslist" 2528 + }, 2529 + { 2530 + "type": "tidelift", 2531 + "url": "https://tidelift.com/funding/github/npm/browserslist" 2532 + }, 2533 + { 2534 + "type": "github", 2535 + "url": "https://github.com/sponsors/ai" 2536 + } 2537 + ], 2538 + "dependencies": { 2539 + "baseline-browser-mapping": "^2.9.0", 2540 + "caniuse-lite": "^1.0.30001759", 2541 + "electron-to-chromium": "^1.5.263", 2542 + "node-releases": "^2.0.27", 2543 + "update-browserslist-db": "^1.2.0" 2544 + }, 2545 + "bin": { 2546 + "browserslist": "cli.js" 2547 + }, 2548 + "engines": { 2549 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2550 + } 2551 + }, 2552 + "node_modules/bundle-name": { 2553 + "version": "4.1.0", 2554 + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", 2555 + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 2556 + "dependencies": { 2557 + "run-applescript": "^7.0.0" 2558 + }, 2559 + "engines": { 2560 + "node": ">=18" 2561 + }, 2562 + "funding": { 2563 + "url": "https://github.com/sponsors/sindresorhus" 2564 + } 2565 + }, 2566 + "node_modules/bytes": { 2567 + "version": "3.1.2", 2568 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 2569 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 2570 + "engines": { 2571 + "node": ">= 0.8" 2572 + } 2573 + }, 1209 2574 "node_modules/call-bind-apply-helpers": { 1210 2575 "version": "1.0.2", 1211 2576 "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", ··· 1235 2600 "url": "https://github.com/sponsors/ljharb" 1236 2601 } 1237 2602 }, 2603 + "node_modules/callsites": { 2604 + "version": "3.1.0", 2605 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2606 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2607 + "engines": { 2608 + "node": ">=6" 2609 + } 2610 + }, 1238 2611 "node_modules/caniuse-lite": { 1239 2612 "version": "1.0.30001760", 1240 2613 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", ··· 1255 2628 ], 1256 2629 "license": "CC-BY-4.0" 1257 2630 }, 2631 + "node_modules/chalk": { 2632 + "version": "5.6.2", 2633 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", 2634 + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", 2635 + "engines": { 2636 + "node": "^12.17.0 || ^14.13 || >=16.0.0" 2637 + }, 2638 + "funding": { 2639 + "url": "https://github.com/chalk/chalk?sponsor=1" 2640 + } 2641 + }, 1258 2642 "node_modules/class-variance-authority": { 1259 2643 "version": "0.7.1", 1260 2644 "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", 1261 2645 "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", 1262 - "license": "Apache-2.0", 1263 2646 "dependencies": { 1264 2647 "clsx": "^2.1.1" 1265 2648 }, ··· 1267 2650 "url": "https://polar.sh/cva" 1268 2651 } 1269 2652 }, 2653 + "node_modules/cli-cursor": { 2654 + "version": "5.0.0", 2655 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", 2656 + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", 2657 + "dependencies": { 2658 + "restore-cursor": "^5.0.0" 2659 + }, 2660 + "engines": { 2661 + "node": ">=18" 2662 + }, 2663 + "funding": { 2664 + "url": "https://github.com/sponsors/sindresorhus" 2665 + } 2666 + }, 2667 + "node_modules/cli-spinners": { 2668 + "version": "2.9.2", 2669 + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", 2670 + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", 2671 + "engines": { 2672 + "node": ">=6" 2673 + }, 2674 + "funding": { 2675 + "url": "https://github.com/sponsors/sindresorhus" 2676 + } 2677 + }, 2678 + "node_modules/cli-width": { 2679 + "version": "4.1.0", 2680 + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", 2681 + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", 2682 + "engines": { 2683 + "node": ">= 12" 2684 + } 2685 + }, 1270 2686 "node_modules/client-only": { 1271 2687 "version": "0.0.1", 1272 2688 "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 1273 2689 "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 1274 2690 "license": "MIT" 1275 2691 }, 2692 + "node_modules/cliui": { 2693 + "version": "8.0.1", 2694 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 2695 + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 2696 + "dependencies": { 2697 + "string-width": "^4.2.0", 2698 + "strip-ansi": "^6.0.1", 2699 + "wrap-ansi": "^7.0.0" 2700 + }, 2701 + "engines": { 2702 + "node": ">=12" 2703 + } 2704 + }, 2705 + "node_modules/cliui/node_modules/ansi-regex": { 2706 + "version": "5.0.1", 2707 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2708 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2709 + "engines": { 2710 + "node": ">=8" 2711 + } 2712 + }, 2713 + "node_modules/cliui/node_modules/emoji-regex": { 2714 + "version": "8.0.0", 2715 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2716 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 2717 + }, 2718 + "node_modules/cliui/node_modules/string-width": { 2719 + "version": "4.2.3", 2720 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2721 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2722 + "dependencies": { 2723 + "emoji-regex": "^8.0.0", 2724 + "is-fullwidth-code-point": "^3.0.0", 2725 + "strip-ansi": "^6.0.1" 2726 + }, 2727 + "engines": { 2728 + "node": ">=8" 2729 + } 2730 + }, 2731 + "node_modules/cliui/node_modules/strip-ansi": { 2732 + "version": "6.0.1", 2733 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2734 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2735 + "dependencies": { 2736 + "ansi-regex": "^5.0.1" 2737 + }, 2738 + "engines": { 2739 + "node": ">=8" 2740 + } 2741 + }, 2742 + "node_modules/cliui/node_modules/wrap-ansi": { 2743 + "version": "7.0.0", 2744 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2745 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2746 + "dependencies": { 2747 + "ansi-styles": "^4.0.0", 2748 + "string-width": "^4.1.0", 2749 + "strip-ansi": "^6.0.0" 2750 + }, 2751 + "engines": { 2752 + "node": ">=10" 2753 + }, 2754 + "funding": { 2755 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2756 + } 2757 + }, 1276 2758 "node_modules/clsx": { 1277 2759 "version": "2.1.1", 1278 2760 "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1279 2761 "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1280 - "license": "MIT", 1281 2762 "engines": { 1282 2763 "node": ">=6" 1283 2764 } 1284 2765 }, 2766 + "node_modules/code-block-writer": { 2767 + "version": "13.0.3", 2768 + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", 2769 + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" 2770 + }, 2771 + "node_modules/color-convert": { 2772 + "version": "2.0.1", 2773 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2774 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2775 + "dependencies": { 2776 + "color-name": "~1.1.4" 2777 + }, 2778 + "engines": { 2779 + "node": ">=7.0.0" 2780 + } 2781 + }, 2782 + "node_modules/color-name": { 2783 + "version": "1.1.4", 2784 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2785 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2786 + }, 2787 + "node_modules/commander": { 2788 + "version": "14.0.3", 2789 + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", 2790 + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", 2791 + "engines": { 2792 + "node": ">=20" 2793 + } 2794 + }, 2795 + "node_modules/content-disposition": { 2796 + "version": "1.0.1", 2797 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", 2798 + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", 2799 + "engines": { 2800 + "node": ">=18" 2801 + }, 2802 + "funding": { 2803 + "type": "opencollective", 2804 + "url": "https://opencollective.com/express" 2805 + } 2806 + }, 2807 + "node_modules/content-type": { 2808 + "version": "1.0.5", 2809 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 2810 + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 2811 + "engines": { 2812 + "node": ">= 0.6" 2813 + } 2814 + }, 2815 + "node_modules/convert-source-map": { 2816 + "version": "2.0.0", 2817 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2818 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 2819 + }, 1285 2820 "node_modules/cookie": { 1286 2821 "version": "1.1.1", 1287 2822 "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", ··· 1295 2830 "url": "https://opencollective.com/express" 1296 2831 } 1297 2832 }, 2833 + "node_modules/cookie-signature": { 2834 + "version": "1.2.2", 2835 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 2836 + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 2837 + "engines": { 2838 + "node": ">=6.6.0" 2839 + } 2840 + }, 2841 + "node_modules/cors": { 2842 + "version": "2.8.6", 2843 + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", 2844 + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", 2845 + "dependencies": { 2846 + "object-assign": "^4", 2847 + "vary": "^1" 2848 + }, 2849 + "engines": { 2850 + "node": ">= 0.10" 2851 + }, 2852 + "funding": { 2853 + "type": "opencollective", 2854 + "url": "https://opencollective.com/express" 2855 + } 2856 + }, 2857 + "node_modules/cosmiconfig": { 2858 + "version": "9.0.1", 2859 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", 2860 + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", 2861 + "dependencies": { 2862 + "env-paths": "^2.2.1", 2863 + "import-fresh": "^3.3.0", 2864 + "js-yaml": "^4.1.0", 2865 + "parse-json": "^5.2.0" 2866 + }, 2867 + "engines": { 2868 + "node": ">=14" 2869 + }, 2870 + "funding": { 2871 + "url": "https://github.com/sponsors/d-fischer" 2872 + }, 2873 + "peerDependencies": { 2874 + "typescript": ">=4.9.5" 2875 + }, 2876 + "peerDependenciesMeta": { 2877 + "typescript": { 2878 + "optional": true 2879 + } 2880 + } 2881 + }, 2882 + "node_modules/cross-spawn": { 2883 + "version": "7.0.6", 2884 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2885 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2886 + "dependencies": { 2887 + "path-key": "^3.1.0", 2888 + "shebang-command": "^2.0.0", 2889 + "which": "^2.0.1" 2890 + }, 2891 + "engines": { 2892 + "node": ">= 8" 2893 + } 2894 + }, 2895 + "node_modules/cross-spawn/node_modules/isexe": { 2896 + "version": "2.0.0", 2897 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2898 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 2899 + }, 2900 + "node_modules/cross-spawn/node_modules/which": { 2901 + "version": "2.0.2", 2902 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2903 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2904 + "dependencies": { 2905 + "isexe": "^2.0.0" 2906 + }, 2907 + "bin": { 2908 + "node-which": "bin/node-which" 2909 + }, 2910 + "engines": { 2911 + "node": ">= 8" 2912 + } 2913 + }, 2914 + "node_modules/cssesc": { 2915 + "version": "3.0.0", 2916 + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 2917 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 2918 + "bin": { 2919 + "cssesc": "bin/cssesc" 2920 + }, 2921 + "engines": { 2922 + "node": ">=4" 2923 + } 2924 + }, 1298 2925 "node_modules/csstype": { 1299 2926 "version": "3.2.3", 1300 2927 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", ··· 1302 2929 "devOptional": true, 1303 2930 "license": "MIT" 1304 2931 }, 2932 + "node_modules/data-uri-to-buffer": { 2933 + "version": "4.0.1", 2934 + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 2935 + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 2936 + "engines": { 2937 + "node": ">= 12" 2938 + } 2939 + }, 2940 + "node_modules/debug": { 2941 + "version": "4.4.3", 2942 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 2943 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 2944 + "dependencies": { 2945 + "ms": "^2.1.3" 2946 + }, 2947 + "engines": { 2948 + "node": ">=6.0" 2949 + }, 2950 + "peerDependenciesMeta": { 2951 + "supports-color": { 2952 + "optional": true 2953 + } 2954 + } 2955 + }, 2956 + "node_modules/dedent": { 2957 + "version": "1.7.2", 2958 + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", 2959 + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", 2960 + "peerDependencies": { 2961 + "babel-plugin-macros": "^3.1.0" 2962 + }, 2963 + "peerDependenciesMeta": { 2964 + "babel-plugin-macros": { 2965 + "optional": true 2966 + } 2967 + } 2968 + }, 2969 + "node_modules/deepmerge": { 2970 + "version": "4.3.1", 2971 + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 2972 + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 2973 + "engines": { 2974 + "node": ">=0.10.0" 2975 + } 2976 + }, 2977 + "node_modules/default-browser": { 2978 + "version": "5.5.0", 2979 + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", 2980 + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", 2981 + "dependencies": { 2982 + "bundle-name": "^4.1.0", 2983 + "default-browser-id": "^5.0.0" 2984 + }, 2985 + "engines": { 2986 + "node": ">=18" 2987 + }, 2988 + "funding": { 2989 + "url": "https://github.com/sponsors/sindresorhus" 2990 + } 2991 + }, 2992 + "node_modules/default-browser-id": { 2993 + "version": "5.0.1", 2994 + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", 2995 + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", 2996 + "engines": { 2997 + "node": ">=18" 2998 + }, 2999 + "funding": { 3000 + "url": "https://github.com/sponsors/sindresorhus" 3001 + } 3002 + }, 3003 + "node_modules/define-lazy-prop": { 3004 + "version": "3.0.0", 3005 + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 3006 + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 3007 + "engines": { 3008 + "node": ">=12" 3009 + }, 3010 + "funding": { 3011 + "url": "https://github.com/sponsors/sindresorhus" 3012 + } 3013 + }, 3014 + "node_modules/depd": { 3015 + "version": "2.0.0", 3016 + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 3017 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 3018 + "engines": { 3019 + "node": ">= 0.8" 3020 + } 3021 + }, 1305 3022 "node_modules/detect-libc": { 1306 3023 "version": "2.1.2", 1307 3024 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", ··· 1311 3028 "node": ">=8" 1312 3029 } 1313 3030 }, 3031 + "node_modules/detect-node-es": { 3032 + "version": "1.1.0", 3033 + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", 3034 + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" 3035 + }, 3036 + "node_modules/diff": { 3037 + "version": "8.0.3", 3038 + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", 3039 + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", 3040 + "engines": { 3041 + "node": ">=0.3.1" 3042 + } 3043 + }, 3044 + "node_modules/dotenv": { 3045 + "version": "17.3.1", 3046 + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", 3047 + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", 3048 + "engines": { 3049 + "node": ">=12" 3050 + }, 3051 + "funding": { 3052 + "url": "https://dotenvx.com" 3053 + } 3054 + }, 1314 3055 "node_modules/dunder-proto": { 1315 3056 "version": "1.0.1", 1316 3057 "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ··· 1325 3066 "node": ">= 0.4" 1326 3067 } 1327 3068 }, 3069 + "node_modules/eciesjs": { 3070 + "version": "0.4.17", 3071 + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.17.tgz", 3072 + "integrity": "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==", 3073 + "dependencies": { 3074 + "@ecies/ciphers": "^0.2.5", 3075 + "@noble/ciphers": "^1.3.0", 3076 + "@noble/curves": "^1.9.7", 3077 + "@noble/hashes": "^1.8.0" 3078 + }, 3079 + "engines": { 3080 + "bun": ">=1", 3081 + "deno": ">=2", 3082 + "node": ">=16" 3083 + } 3084 + }, 3085 + "node_modules/ee-first": { 3086 + "version": "1.1.1", 3087 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 3088 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 3089 + }, 3090 + "node_modules/electron-to-chromium": { 3091 + "version": "1.5.307", 3092 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", 3093 + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==" 3094 + }, 3095 + "node_modules/emoji-regex": { 3096 + "version": "10.6.0", 3097 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", 3098 + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" 3099 + }, 3100 + "node_modules/encodeurl": { 3101 + "version": "2.0.0", 3102 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 3103 + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 3104 + "engines": { 3105 + "node": ">= 0.8" 3106 + } 3107 + }, 1328 3108 "node_modules/enhanced-resolve": { 1329 3109 "version": "5.18.4", 1330 3110 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", ··· 1338 3118 "node": ">=10.13.0" 1339 3119 } 1340 3120 }, 3121 + "node_modules/env-paths": { 3122 + "version": "2.2.1", 3123 + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 3124 + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 3125 + "engines": { 3126 + "node": ">=6" 3127 + } 3128 + }, 3129 + "node_modules/error-ex": { 3130 + "version": "1.3.4", 3131 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", 3132 + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", 3133 + "dependencies": { 3134 + "is-arrayish": "^0.2.1" 3135 + } 3136 + }, 1341 3137 "node_modules/es-define-property": { 1342 3138 "version": "1.0.1", 1343 3139 "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ··· 1368 3164 "node": ">= 0.4" 1369 3165 } 1370 3166 }, 3167 + "node_modules/escalade": { 3168 + "version": "3.2.0", 3169 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 3170 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 3171 + "engines": { 3172 + "node": ">=6" 3173 + } 3174 + }, 3175 + "node_modules/escape-html": { 3176 + "version": "1.0.3", 3177 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 3178 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 3179 + }, 3180 + "node_modules/esprima": { 3181 + "version": "4.0.1", 3182 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 3183 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 3184 + "bin": { 3185 + "esparse": "bin/esparse.js", 3186 + "esvalidate": "bin/esvalidate.js" 3187 + }, 3188 + "engines": { 3189 + "node": ">=4" 3190 + } 3191 + }, 3192 + "node_modules/etag": { 3193 + "version": "1.8.1", 3194 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 3195 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 3196 + "engines": { 3197 + "node": ">= 0.6" 3198 + } 3199 + }, 3200 + "node_modules/eventsource": { 3201 + "version": "3.0.7", 3202 + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", 3203 + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", 3204 + "dependencies": { 3205 + "eventsource-parser": "^3.0.1" 3206 + }, 3207 + "engines": { 3208 + "node": ">=18.0.0" 3209 + } 3210 + }, 3211 + "node_modules/eventsource-parser": { 3212 + "version": "3.0.6", 3213 + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", 3214 + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", 3215 + "engines": { 3216 + "node": ">=18.0.0" 3217 + } 3218 + }, 3219 + "node_modules/execa": { 3220 + "version": "9.6.1", 3221 + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", 3222 + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", 3223 + "dependencies": { 3224 + "@sindresorhus/merge-streams": "^4.0.0", 3225 + "cross-spawn": "^7.0.6", 3226 + "figures": "^6.1.0", 3227 + "get-stream": "^9.0.0", 3228 + "human-signals": "^8.0.1", 3229 + "is-plain-obj": "^4.1.0", 3230 + "is-stream": "^4.0.1", 3231 + "npm-run-path": "^6.0.0", 3232 + "pretty-ms": "^9.2.0", 3233 + "signal-exit": "^4.1.0", 3234 + "strip-final-newline": "^4.0.0", 3235 + "yoctocolors": "^2.1.1" 3236 + }, 3237 + "engines": { 3238 + "node": "^18.19.0 || >=20.5.0" 3239 + }, 3240 + "funding": { 3241 + "url": "https://github.com/sindresorhus/execa?sponsor=1" 3242 + } 3243 + }, 3244 + "node_modules/express": { 3245 + "version": "5.2.1", 3246 + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", 3247 + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", 3248 + "dependencies": { 3249 + "accepts": "^2.0.0", 3250 + "body-parser": "^2.2.1", 3251 + "content-disposition": "^1.0.0", 3252 + "content-type": "^1.0.5", 3253 + "cookie": "^0.7.1", 3254 + "cookie-signature": "^1.2.1", 3255 + "debug": "^4.4.0", 3256 + "depd": "^2.0.0", 3257 + "encodeurl": "^2.0.0", 3258 + "escape-html": "^1.0.3", 3259 + "etag": "^1.8.1", 3260 + "finalhandler": "^2.1.0", 3261 + "fresh": "^2.0.0", 3262 + "http-errors": "^2.0.0", 3263 + "merge-descriptors": "^2.0.0", 3264 + "mime-types": "^3.0.0", 3265 + "on-finished": "^2.4.1", 3266 + "once": "^1.4.0", 3267 + "parseurl": "^1.3.3", 3268 + "proxy-addr": "^2.0.7", 3269 + "qs": "^6.14.0", 3270 + "range-parser": "^1.2.1", 3271 + "router": "^2.2.0", 3272 + "send": "^1.1.0", 3273 + "serve-static": "^2.2.0", 3274 + "statuses": "^2.0.1", 3275 + "type-is": "^2.0.1", 3276 + "vary": "^1.1.2" 3277 + }, 3278 + "engines": { 3279 + "node": ">= 18" 3280 + }, 3281 + "funding": { 3282 + "type": "opencollective", 3283 + "url": "https://opencollective.com/express" 3284 + } 3285 + }, 3286 + "node_modules/express-rate-limit": { 3287 + "version": "8.3.0", 3288 + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.0.tgz", 3289 + "integrity": "sha512-KJzBawY6fB9FiZGdE/0aftepZ91YlaGIrV8vgblRM3J8X+dHx/aiowJWwkx6LIGyuqGiANsjSwwrbb8mifOJ4Q==", 3290 + "dependencies": { 3291 + "ip-address": "10.1.0" 3292 + }, 3293 + "engines": { 3294 + "node": ">= 16" 3295 + }, 3296 + "funding": { 3297 + "url": "https://github.com/sponsors/express-rate-limit" 3298 + }, 3299 + "peerDependencies": { 3300 + "express": ">= 4.11" 3301 + } 3302 + }, 3303 + "node_modules/express/node_modules/cookie": { 3304 + "version": "0.7.2", 3305 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 3306 + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 3307 + "engines": { 3308 + "node": ">= 0.6" 3309 + } 3310 + }, 3311 + "node_modules/fast-deep-equal": { 3312 + "version": "3.1.3", 3313 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 3314 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 3315 + }, 3316 + "node_modules/fast-glob": { 3317 + "version": "3.3.3", 3318 + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 3319 + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 3320 + "dependencies": { 3321 + "@nodelib/fs.stat": "^2.0.2", 3322 + "@nodelib/fs.walk": "^1.2.3", 3323 + "glob-parent": "^5.1.2", 3324 + "merge2": "^1.3.0", 3325 + "micromatch": "^4.0.8" 3326 + }, 3327 + "engines": { 3328 + "node": ">=8.6.0" 3329 + } 3330 + }, 3331 + "node_modules/fast-uri": { 3332 + "version": "3.1.0", 3333 + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", 3334 + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", 3335 + "funding": [ 3336 + { 3337 + "type": "github", 3338 + "url": "https://github.com/sponsors/fastify" 3339 + }, 3340 + { 3341 + "type": "opencollective", 3342 + "url": "https://opencollective.com/fastify" 3343 + } 3344 + ] 3345 + }, 3346 + "node_modules/fastq": { 3347 + "version": "1.20.1", 3348 + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", 3349 + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", 3350 + "dependencies": { 3351 + "reusify": "^1.0.4" 3352 + } 3353 + }, 3354 + "node_modules/fdir": { 3355 + "version": "6.5.0", 3356 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 3357 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 3358 + "engines": { 3359 + "node": ">=12.0.0" 3360 + }, 3361 + "peerDependencies": { 3362 + "picomatch": "^3 || ^4" 3363 + }, 3364 + "peerDependenciesMeta": { 3365 + "picomatch": { 3366 + "optional": true 3367 + } 3368 + } 3369 + }, 3370 + "node_modules/fetch-blob": { 3371 + "version": "3.2.0", 3372 + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 3373 + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 3374 + "funding": [ 3375 + { 3376 + "type": "github", 3377 + "url": "https://github.com/sponsors/jimmywarting" 3378 + }, 3379 + { 3380 + "type": "paypal", 3381 + "url": "https://paypal.me/jimmywarting" 3382 + } 3383 + ], 3384 + "dependencies": { 3385 + "node-domexception": "^1.0.0", 3386 + "web-streams-polyfill": "^3.0.3" 3387 + }, 3388 + "engines": { 3389 + "node": "^12.20 || >= 14.13" 3390 + } 3391 + }, 3392 + "node_modules/figures": { 3393 + "version": "6.1.0", 3394 + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", 3395 + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", 3396 + "dependencies": { 3397 + "is-unicode-supported": "^2.0.0" 3398 + }, 3399 + "engines": { 3400 + "node": ">=18" 3401 + }, 3402 + "funding": { 3403 + "url": "https://github.com/sponsors/sindresorhus" 3404 + } 3405 + }, 3406 + "node_modules/fill-range": { 3407 + "version": "7.1.1", 3408 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 3409 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 3410 + "dependencies": { 3411 + "to-regex-range": "^5.0.1" 3412 + }, 3413 + "engines": { 3414 + "node": ">=8" 3415 + } 3416 + }, 3417 + "node_modules/finalhandler": { 3418 + "version": "2.1.1", 3419 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", 3420 + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", 3421 + "dependencies": { 3422 + "debug": "^4.4.0", 3423 + "encodeurl": "^2.0.0", 3424 + "escape-html": "^1.0.3", 3425 + "on-finished": "^2.4.1", 3426 + "parseurl": "^1.3.3", 3427 + "statuses": "^2.0.1" 3428 + }, 3429 + "engines": { 3430 + "node": ">= 18.0.0" 3431 + }, 3432 + "funding": { 3433 + "type": "opencollective", 3434 + "url": "https://opencollective.com/express" 3435 + } 3436 + }, 3437 + "node_modules/formdata-polyfill": { 3438 + "version": "4.0.10", 3439 + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 3440 + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 3441 + "dependencies": { 3442 + "fetch-blob": "^3.1.2" 3443 + }, 3444 + "engines": { 3445 + "node": ">=12.20.0" 3446 + } 3447 + }, 3448 + "node_modules/forwarded": { 3449 + "version": "0.2.0", 3450 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 3451 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 3452 + "engines": { 3453 + "node": ">= 0.6" 3454 + } 3455 + }, 3456 + "node_modules/fresh": { 3457 + "version": "2.0.0", 3458 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 3459 + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 3460 + "engines": { 3461 + "node": ">= 0.8" 3462 + } 3463 + }, 3464 + "node_modules/fs-extra": { 3465 + "version": "11.3.4", 3466 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", 3467 + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", 3468 + "dependencies": { 3469 + "graceful-fs": "^4.2.0", 3470 + "jsonfile": "^6.0.1", 3471 + "universalify": "^2.0.0" 3472 + }, 3473 + "engines": { 3474 + "node": ">=14.14" 3475 + } 3476 + }, 1371 3477 "node_modules/function-bind": { 1372 3478 "version": "1.1.2", 1373 3479 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", ··· 1377 3483 "url": "https://github.com/sponsors/ljharb" 1378 3484 } 1379 3485 }, 3486 + "node_modules/fuzzysort": { 3487 + "version": "3.1.0", 3488 + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz", 3489 + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==" 3490 + }, 3491 + "node_modules/fzf": { 3492 + "version": "0.5.2", 3493 + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", 3494 + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==" 3495 + }, 3496 + "node_modules/gensync": { 3497 + "version": "1.0.0-beta.2", 3498 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3499 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3500 + "engines": { 3501 + "node": ">=6.9.0" 3502 + } 3503 + }, 3504 + "node_modules/get-caller-file": { 3505 + "version": "2.0.5", 3506 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 3507 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 3508 + "engines": { 3509 + "node": "6.* || 8.* || >= 10.*" 3510 + } 3511 + }, 3512 + "node_modules/get-east-asian-width": { 3513 + "version": "1.5.0", 3514 + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", 3515 + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", 3516 + "engines": { 3517 + "node": ">=18" 3518 + }, 3519 + "funding": { 3520 + "url": "https://github.com/sponsors/sindresorhus" 3521 + } 3522 + }, 1380 3523 "node_modules/get-intrinsic": { 1381 3524 "version": "1.3.0", 1382 3525 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", ··· 1401 3544 "url": "https://github.com/sponsors/ljharb" 1402 3545 } 1403 3546 }, 3547 + "node_modules/get-nonce": { 3548 + "version": "1.0.1", 3549 + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", 3550 + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", 3551 + "engines": { 3552 + "node": ">=6" 3553 + } 3554 + }, 3555 + "node_modules/get-own-enumerable-keys": { 3556 + "version": "1.0.0", 3557 + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", 3558 + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", 3559 + "engines": { 3560 + "node": ">=14.16" 3561 + }, 3562 + "funding": { 3563 + "url": "https://github.com/sponsors/sindresorhus" 3564 + } 3565 + }, 1404 3566 "node_modules/get-proto": { 1405 3567 "version": "1.0.1", 1406 3568 "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", ··· 1414 3576 "node": ">= 0.4" 1415 3577 } 1416 3578 }, 3579 + "node_modules/get-stream": { 3580 + "version": "9.0.1", 3581 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", 3582 + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", 3583 + "dependencies": { 3584 + "@sec-ant/readable-stream": "^0.4.1", 3585 + "is-stream": "^4.0.1" 3586 + }, 3587 + "engines": { 3588 + "node": ">=18" 3589 + }, 3590 + "funding": { 3591 + "url": "https://github.com/sponsors/sindresorhus" 3592 + } 3593 + }, 3594 + "node_modules/glob-parent": { 3595 + "version": "5.1.2", 3596 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 3597 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 3598 + "dependencies": { 3599 + "is-glob": "^4.0.1" 3600 + }, 3601 + "engines": { 3602 + "node": ">= 6" 3603 + } 3604 + }, 1417 3605 "node_modules/gopd": { 1418 3606 "version": "1.2.0", 1419 3607 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ··· 1431 3619 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1432 3620 "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1433 3621 "license": "ISC" 3622 + }, 3623 + "node_modules/graphql": { 3624 + "version": "16.13.1", 3625 + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", 3626 + "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", 3627 + "engines": { 3628 + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" 3629 + } 1434 3630 }, 1435 3631 "node_modules/has-symbols": { 1436 3632 "version": "1.1.0", ··· 1454 3650 }, 1455 3651 "engines": { 1456 3652 "node": ">= 0.4" 3653 + } 3654 + }, 3655 + "node_modules/headers-polyfill": { 3656 + "version": "4.0.3", 3657 + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", 3658 + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==" 3659 + }, 3660 + "node_modules/hono": { 3661 + "version": "4.12.5", 3662 + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.5.tgz", 3663 + "integrity": "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==", 3664 + "engines": { 3665 + "node": ">=16.9.0" 3666 + } 3667 + }, 3668 + "node_modules/http-errors": { 3669 + "version": "2.0.1", 3670 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", 3671 + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", 3672 + "dependencies": { 3673 + "depd": "~2.0.0", 3674 + "inherits": "~2.0.4", 3675 + "setprototypeof": "~1.2.0", 3676 + "statuses": "~2.0.2", 3677 + "toidentifier": "~1.0.1" 3678 + }, 3679 + "engines": { 3680 + "node": ">= 0.8" 3681 + }, 3682 + "funding": { 3683 + "type": "opencollective", 3684 + "url": "https://opencollective.com/express" 3685 + } 3686 + }, 3687 + "node_modules/https-proxy-agent": { 3688 + "version": "7.0.6", 3689 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 3690 + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 3691 + "dependencies": { 3692 + "agent-base": "^7.1.2", 3693 + "debug": "4" 3694 + }, 3695 + "engines": { 3696 + "node": ">= 14" 3697 + } 3698 + }, 3699 + "node_modules/human-signals": { 3700 + "version": "8.0.1", 3701 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", 3702 + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", 3703 + "engines": { 3704 + "node": ">=18.18.0" 1457 3705 } 1458 3706 }, 1459 3707 "node_modules/iceberg-js": { ··· 1465 3713 "node": ">=20.0.0" 1466 3714 } 1467 3715 }, 3716 + "node_modules/iconv-lite": { 3717 + "version": "0.7.2", 3718 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", 3719 + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", 3720 + "dependencies": { 3721 + "safer-buffer": ">= 2.1.2 < 3.0.0" 3722 + }, 3723 + "engines": { 3724 + "node": ">=0.10.0" 3725 + }, 3726 + "funding": { 3727 + "type": "opencollective", 3728 + "url": "https://opencollective.com/express" 3729 + } 3730 + }, 3731 + "node_modules/ignore": { 3732 + "version": "5.3.2", 3733 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 3734 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 3735 + "engines": { 3736 + "node": ">= 4" 3737 + } 3738 + }, 3739 + "node_modules/import-fresh": { 3740 + "version": "3.3.1", 3741 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 3742 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 3743 + "dependencies": { 3744 + "parent-module": "^1.0.0", 3745 + "resolve-from": "^4.0.0" 3746 + }, 3747 + "engines": { 3748 + "node": ">=6" 3749 + }, 3750 + "funding": { 3751 + "url": "https://github.com/sponsors/sindresorhus" 3752 + } 3753 + }, 3754 + "node_modules/inherits": { 3755 + "version": "2.0.4", 3756 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 3757 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 3758 + }, 3759 + "node_modules/ip-address": { 3760 + "version": "10.1.0", 3761 + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", 3762 + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", 3763 + "engines": { 3764 + "node": ">= 12" 3765 + } 3766 + }, 3767 + "node_modules/ipaddr.js": { 3768 + "version": "1.9.1", 3769 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 3770 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 3771 + "engines": { 3772 + "node": ">= 0.10" 3773 + } 3774 + }, 3775 + "node_modules/is-arrayish": { 3776 + "version": "0.2.1", 3777 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 3778 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 3779 + }, 3780 + "node_modules/is-docker": { 3781 + "version": "3.0.0", 3782 + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 3783 + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 3784 + "bin": { 3785 + "is-docker": "cli.js" 3786 + }, 3787 + "engines": { 3788 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3789 + }, 3790 + "funding": { 3791 + "url": "https://github.com/sponsors/sindresorhus" 3792 + } 3793 + }, 3794 + "node_modules/is-extglob": { 3795 + "version": "2.1.1", 3796 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3797 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3798 + "engines": { 3799 + "node": ">=0.10.0" 3800 + } 3801 + }, 3802 + "node_modules/is-fullwidth-code-point": { 3803 + "version": "3.0.0", 3804 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 3805 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 3806 + "engines": { 3807 + "node": ">=8" 3808 + } 3809 + }, 3810 + "node_modules/is-glob": { 3811 + "version": "4.0.3", 3812 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3813 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3814 + "dependencies": { 3815 + "is-extglob": "^2.1.1" 3816 + }, 3817 + "engines": { 3818 + "node": ">=0.10.0" 3819 + } 3820 + }, 3821 + "node_modules/is-in-ssh": { 3822 + "version": "1.0.0", 3823 + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", 3824 + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", 3825 + "engines": { 3826 + "node": ">=20" 3827 + }, 3828 + "funding": { 3829 + "url": "https://github.com/sponsors/sindresorhus" 3830 + } 3831 + }, 3832 + "node_modules/is-inside-container": { 3833 + "version": "1.0.0", 3834 + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 3835 + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 3836 + "dependencies": { 3837 + "is-docker": "^3.0.0" 3838 + }, 3839 + "bin": { 3840 + "is-inside-container": "cli.js" 3841 + }, 3842 + "engines": { 3843 + "node": ">=14.16" 3844 + }, 3845 + "funding": { 3846 + "url": "https://github.com/sponsors/sindresorhus" 3847 + } 3848 + }, 3849 + "node_modules/is-interactive": { 3850 + "version": "2.0.0", 3851 + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", 3852 + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", 3853 + "engines": { 3854 + "node": ">=12" 3855 + }, 3856 + "funding": { 3857 + "url": "https://github.com/sponsors/sindresorhus" 3858 + } 3859 + }, 3860 + "node_modules/is-node-process": { 3861 + "version": "1.2.0", 3862 + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", 3863 + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" 3864 + }, 3865 + "node_modules/is-number": { 3866 + "version": "7.0.0", 3867 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 3868 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3869 + "engines": { 3870 + "node": ">=0.12.0" 3871 + } 3872 + }, 3873 + "node_modules/is-obj": { 3874 + "version": "3.0.0", 3875 + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", 3876 + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", 3877 + "engines": { 3878 + "node": ">=12" 3879 + }, 3880 + "funding": { 3881 + "url": "https://github.com/sponsors/sindresorhus" 3882 + } 3883 + }, 3884 + "node_modules/is-plain-obj": { 3885 + "version": "4.1.0", 3886 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", 3887 + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", 3888 + "engines": { 3889 + "node": ">=12" 3890 + }, 3891 + "funding": { 3892 + "url": "https://github.com/sponsors/sindresorhus" 3893 + } 3894 + }, 3895 + "node_modules/is-promise": { 3896 + "version": "4.0.0", 3897 + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 3898 + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" 3899 + }, 3900 + "node_modules/is-regexp": { 3901 + "version": "3.1.0", 3902 + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", 3903 + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", 3904 + "engines": { 3905 + "node": ">=12" 3906 + }, 3907 + "funding": { 3908 + "url": "https://github.com/sponsors/sindresorhus" 3909 + } 3910 + }, 3911 + "node_modules/is-stream": { 3912 + "version": "4.0.1", 3913 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", 3914 + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", 3915 + "engines": { 3916 + "node": ">=18" 3917 + }, 3918 + "funding": { 3919 + "url": "https://github.com/sponsors/sindresorhus" 3920 + } 3921 + }, 3922 + "node_modules/is-unicode-supported": { 3923 + "version": "2.1.0", 3924 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", 3925 + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", 3926 + "engines": { 3927 + "node": ">=18" 3928 + }, 3929 + "funding": { 3930 + "url": "https://github.com/sponsors/sindresorhus" 3931 + } 3932 + }, 3933 + "node_modules/is-wsl": { 3934 + "version": "3.1.1", 3935 + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", 3936 + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", 3937 + "dependencies": { 3938 + "is-inside-container": "^1.0.0" 3939 + }, 3940 + "engines": { 3941 + "node": ">=16" 3942 + }, 3943 + "funding": { 3944 + "url": "https://github.com/sponsors/sindresorhus" 3945 + } 3946 + }, 3947 + "node_modules/isexe": { 3948 + "version": "3.1.5", 3949 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", 3950 + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", 3951 + "engines": { 3952 + "node": ">=18" 3953 + } 3954 + }, 1468 3955 "node_modules/jiti": { 1469 3956 "version": "2.6.1", 1470 3957 "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", ··· 1474 3961 "jiti": "lib/jiti-cli.mjs" 1475 3962 } 1476 3963 }, 3964 + "node_modules/jose": { 3965 + "version": "6.2.0", 3966 + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.0.tgz", 3967 + "integrity": "sha512-xsfE1TcSCbUdo6U07tR0mvhg0flGxU8tPLbF03mirl2ukGQENhUg4ubGYQnhVH0b5stLlPM+WOqDkEl1R1y5sQ==", 3968 + "funding": { 3969 + "url": "https://github.com/sponsors/panva" 3970 + } 3971 + }, 1477 3972 "node_modules/js-tokens": { 1478 3973 "version": "4.0.0", 1479 3974 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1480 3975 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1481 3976 "license": "MIT" 1482 3977 }, 3978 + "node_modules/js-yaml": { 3979 + "version": "4.1.1", 3980 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 3981 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 3982 + "dependencies": { 3983 + "argparse": "^2.0.1" 3984 + }, 3985 + "bin": { 3986 + "js-yaml": "bin/js-yaml.js" 3987 + } 3988 + }, 3989 + "node_modules/jsesc": { 3990 + "version": "3.1.0", 3991 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 3992 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 3993 + "bin": { 3994 + "jsesc": "bin/jsesc" 3995 + }, 3996 + "engines": { 3997 + "node": ">=6" 3998 + } 3999 + }, 4000 + "node_modules/json-parse-even-better-errors": { 4001 + "version": "2.3.1", 4002 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 4003 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 4004 + }, 4005 + "node_modules/json-schema-traverse": { 4006 + "version": "1.0.0", 4007 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 4008 + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 4009 + }, 4010 + "node_modules/json-schema-typed": { 4011 + "version": "8.0.2", 4012 + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", 4013 + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==" 4014 + }, 4015 + "node_modules/json5": { 4016 + "version": "2.2.3", 4017 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 4018 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 4019 + "bin": { 4020 + "json5": "lib/cli.js" 4021 + }, 4022 + "engines": { 4023 + "node": ">=6" 4024 + } 4025 + }, 4026 + "node_modules/jsonfile": { 4027 + "version": "6.2.0", 4028 + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", 4029 + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", 4030 + "dependencies": { 4031 + "universalify": "^2.0.0" 4032 + }, 4033 + "optionalDependencies": { 4034 + "graceful-fs": "^4.1.6" 4035 + } 4036 + }, 4037 + "node_modules/kleur": { 4038 + "version": "4.1.5", 4039 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 4040 + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 4041 + "engines": { 4042 + "node": ">=6" 4043 + } 4044 + }, 1483 4045 "node_modules/lightningcss": { 1484 4046 "version": "1.30.2", 1485 4047 "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", ··· 1729 4291 "url": "https://opencollective.com/parcel" 1730 4292 } 1731 4293 }, 4294 + "node_modules/lines-and-columns": { 4295 + "version": "1.2.4", 4296 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 4297 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 4298 + }, 4299 + "node_modules/log-symbols": { 4300 + "version": "6.0.0", 4301 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", 4302 + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", 4303 + "dependencies": { 4304 + "chalk": "^5.3.0", 4305 + "is-unicode-supported": "^1.3.0" 4306 + }, 4307 + "engines": { 4308 + "node": ">=18" 4309 + }, 4310 + "funding": { 4311 + "url": "https://github.com/sponsors/sindresorhus" 4312 + } 4313 + }, 4314 + "node_modules/log-symbols/node_modules/is-unicode-supported": { 4315 + "version": "1.3.0", 4316 + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", 4317 + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", 4318 + "engines": { 4319 + "node": ">=12" 4320 + }, 4321 + "funding": { 4322 + "url": "https://github.com/sponsors/sindresorhus" 4323 + } 4324 + }, 1732 4325 "node_modules/loose-envify": { 1733 4326 "version": "1.4.0", 1734 4327 "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ··· 1739 4332 }, 1740 4333 "bin": { 1741 4334 "loose-envify": "cli.js" 4335 + } 4336 + }, 4337 + "node_modules/lru-cache": { 4338 + "version": "5.1.1", 4339 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 4340 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 4341 + "dependencies": { 4342 + "yallist": "^3.0.2" 1742 4343 } 1743 4344 }, 1744 4345 "node_modules/lucide-react": { 1745 4346 "version": "0.562.0", 1746 4347 "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", 1747 4348 "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", 1748 - "license": "ISC", 1749 4349 "peerDependencies": { 1750 4350 "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" 1751 4351 } ··· 1768 4368 "node": ">= 0.4" 1769 4369 } 1770 4370 }, 4371 + "node_modules/media-typer": { 4372 + "version": "1.1.0", 4373 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 4374 + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 4375 + "engines": { 4376 + "node": ">= 0.8" 4377 + } 4378 + }, 4379 + "node_modules/merge-descriptors": { 4380 + "version": "2.0.0", 4381 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 4382 + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 4383 + "engines": { 4384 + "node": ">=18" 4385 + }, 4386 + "funding": { 4387 + "url": "https://github.com/sponsors/sindresorhus" 4388 + } 4389 + }, 4390 + "node_modules/merge-stream": { 4391 + "version": "2.0.0", 4392 + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 4393 + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 4394 + }, 4395 + "node_modules/merge2": { 4396 + "version": "1.4.1", 4397 + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 4398 + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 4399 + "engines": { 4400 + "node": ">= 8" 4401 + } 4402 + }, 4403 + "node_modules/micromatch": { 4404 + "version": "4.0.8", 4405 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 4406 + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 4407 + "dependencies": { 4408 + "braces": "^3.0.3", 4409 + "picomatch": "^2.3.1" 4410 + }, 4411 + "engines": { 4412 + "node": ">=8.6" 4413 + } 4414 + }, 4415 + "node_modules/micromatch/node_modules/picomatch": { 4416 + "version": "2.3.1", 4417 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 4418 + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 4419 + "engines": { 4420 + "node": ">=8.6" 4421 + }, 4422 + "funding": { 4423 + "url": "https://github.com/sponsors/jonschlinkert" 4424 + } 4425 + }, 4426 + "node_modules/mime-db": { 4427 + "version": "1.54.0", 4428 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 4429 + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 4430 + "engines": { 4431 + "node": ">= 0.6" 4432 + } 4433 + }, 4434 + "node_modules/mime-types": { 4435 + "version": "3.0.2", 4436 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", 4437 + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", 4438 + "dependencies": { 4439 + "mime-db": "^1.54.0" 4440 + }, 4441 + "engines": { 4442 + "node": ">=18" 4443 + }, 4444 + "funding": { 4445 + "type": "opencollective", 4446 + "url": "https://opencollective.com/express" 4447 + } 4448 + }, 4449 + "node_modules/mimic-fn": { 4450 + "version": "2.1.0", 4451 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 4452 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 4453 + "engines": { 4454 + "node": ">=6" 4455 + } 4456 + }, 4457 + "node_modules/mimic-function": { 4458 + "version": "5.0.1", 4459 + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", 4460 + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", 4461 + "engines": { 4462 + "node": ">=18" 4463 + }, 4464 + "funding": { 4465 + "url": "https://github.com/sponsors/sindresorhus" 4466 + } 4467 + }, 4468 + "node_modules/minimatch": { 4469 + "version": "10.2.4", 4470 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", 4471 + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", 4472 + "dependencies": { 4473 + "brace-expansion": "^5.0.2" 4474 + }, 4475 + "engines": { 4476 + "node": "18 || 20 || >=22" 4477 + }, 4478 + "funding": { 4479 + "url": "https://github.com/sponsors/isaacs" 4480 + } 4481 + }, 4482 + "node_modules/minimist": { 4483 + "version": "1.2.8", 4484 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 4485 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 4486 + "funding": { 4487 + "url": "https://github.com/sponsors/ljharb" 4488 + } 4489 + }, 4490 + "node_modules/ms": { 4491 + "version": "2.1.3", 4492 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 4493 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 4494 + }, 4495 + "node_modules/msw": { 4496 + "version": "2.12.10", 4497 + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.10.tgz", 4498 + "integrity": "sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw==", 4499 + "hasInstallScript": true, 4500 + "dependencies": { 4501 + "@inquirer/confirm": "^5.0.0", 4502 + "@mswjs/interceptors": "^0.41.2", 4503 + "@open-draft/deferred-promise": "^2.2.0", 4504 + "@types/statuses": "^2.0.6", 4505 + "cookie": "^1.0.2", 4506 + "graphql": "^16.12.0", 4507 + "headers-polyfill": "^4.0.2", 4508 + "is-node-process": "^1.2.0", 4509 + "outvariant": "^1.4.3", 4510 + "path-to-regexp": "^6.3.0", 4511 + "picocolors": "^1.1.1", 4512 + "rettime": "^0.10.1", 4513 + "statuses": "^2.0.2", 4514 + "strict-event-emitter": "^0.5.1", 4515 + "tough-cookie": "^6.0.0", 4516 + "type-fest": "^5.2.0", 4517 + "until-async": "^3.0.2", 4518 + "yargs": "^17.7.2" 4519 + }, 4520 + "bin": { 4521 + "msw": "cli/index.js" 4522 + }, 4523 + "engines": { 4524 + "node": ">=18" 4525 + }, 4526 + "funding": { 4527 + "url": "https://github.com/sponsors/mswjs" 4528 + }, 4529 + "peerDependencies": { 4530 + "typescript": ">= 4.8.x" 4531 + }, 4532 + "peerDependenciesMeta": { 4533 + "typescript": { 4534 + "optional": true 4535 + } 4536 + } 4537 + }, 4538 + "node_modules/mute-stream": { 4539 + "version": "2.0.0", 4540 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", 4541 + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", 4542 + "engines": { 4543 + "node": "^18.17.0 || >=20.5.0" 4544 + } 4545 + }, 1771 4546 "node_modules/nanoid": { 1772 4547 "version": "3.3.11", 1773 4548 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", ··· 1784 4559 }, 1785 4560 "engines": { 1786 4561 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 4562 + } 4563 + }, 4564 + "node_modules/negotiator": { 4565 + "version": "1.0.0", 4566 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 4567 + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 4568 + "engines": { 4569 + "node": ">= 0.6" 1787 4570 } 1788 4571 }, 1789 4572 "node_modules/next": { ··· 1866 4649 "node": "^10 || ^12 || >=14" 1867 4650 } 1868 4651 }, 4652 + "node_modules/node-domexception": { 4653 + "version": "1.0.0", 4654 + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 4655 + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 4656 + "deprecated": "Use your platform's native DOMException instead", 4657 + "funding": [ 4658 + { 4659 + "type": "github", 4660 + "url": "https://github.com/sponsors/jimmywarting" 4661 + }, 4662 + { 4663 + "type": "github", 4664 + "url": "https://paypal.me/jimmywarting" 4665 + } 4666 + ], 4667 + "engines": { 4668 + "node": ">=10.5.0" 4669 + } 4670 + }, 4671 + "node_modules/node-fetch": { 4672 + "version": "3.3.2", 4673 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 4674 + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 4675 + "dependencies": { 4676 + "data-uri-to-buffer": "^4.0.0", 4677 + "fetch-blob": "^3.1.4", 4678 + "formdata-polyfill": "^4.0.10" 4679 + }, 4680 + "engines": { 4681 + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 4682 + }, 4683 + "funding": { 4684 + "type": "opencollective", 4685 + "url": "https://opencollective.com/node-fetch" 4686 + } 4687 + }, 4688 + "node_modules/node-releases": { 4689 + "version": "2.0.36", 4690 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", 4691 + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==" 4692 + }, 4693 + "node_modules/npm-run-path": { 4694 + "version": "6.0.0", 4695 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", 4696 + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", 4697 + "dependencies": { 4698 + "path-key": "^4.0.0", 4699 + "unicorn-magic": "^0.3.0" 4700 + }, 4701 + "engines": { 4702 + "node": ">=18" 4703 + }, 4704 + "funding": { 4705 + "url": "https://github.com/sponsors/sindresorhus" 4706 + } 4707 + }, 4708 + "node_modules/npm-run-path/node_modules/path-key": { 4709 + "version": "4.0.0", 4710 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 4711 + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 4712 + "engines": { 4713 + "node": ">=12" 4714 + }, 4715 + "funding": { 4716 + "url": "https://github.com/sponsors/sindresorhus" 4717 + } 4718 + }, 4719 + "node_modules/object-assign": { 4720 + "version": "4.1.1", 4721 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 4722 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 4723 + "engines": { 4724 + "node": ">=0.10.0" 4725 + } 4726 + }, 1869 4727 "node_modules/object-inspect": { 1870 4728 "version": "1.13.4", 1871 4729 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", ··· 1878 4736 "url": "https://github.com/sponsors/ljharb" 1879 4737 } 1880 4738 }, 4739 + "node_modules/object-treeify": { 4740 + "version": "1.1.33", 4741 + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", 4742 + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", 4743 + "engines": { 4744 + "node": ">= 10" 4745 + } 4746 + }, 4747 + "node_modules/on-finished": { 4748 + "version": "2.4.1", 4749 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 4750 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 4751 + "dependencies": { 4752 + "ee-first": "1.1.1" 4753 + }, 4754 + "engines": { 4755 + "node": ">= 0.8" 4756 + } 4757 + }, 4758 + "node_modules/once": { 4759 + "version": "1.4.0", 4760 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 4761 + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 4762 + "dependencies": { 4763 + "wrappy": "1" 4764 + } 4765 + }, 4766 + "node_modules/onetime": { 4767 + "version": "7.0.0", 4768 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", 4769 + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", 4770 + "dependencies": { 4771 + "mimic-function": "^5.0.0" 4772 + }, 4773 + "engines": { 4774 + "node": ">=18" 4775 + }, 4776 + "funding": { 4777 + "url": "https://github.com/sponsors/sindresorhus" 4778 + } 4779 + }, 4780 + "node_modules/open": { 4781 + "version": "11.0.0", 4782 + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", 4783 + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", 4784 + "dependencies": { 4785 + "default-browser": "^5.4.0", 4786 + "define-lazy-prop": "^3.0.0", 4787 + "is-in-ssh": "^1.0.0", 4788 + "is-inside-container": "^1.0.0", 4789 + "powershell-utils": "^0.1.0", 4790 + "wsl-utils": "^0.3.0" 4791 + }, 4792 + "engines": { 4793 + "node": ">=20" 4794 + }, 4795 + "funding": { 4796 + "url": "https://github.com/sponsors/sindresorhus" 4797 + } 4798 + }, 4799 + "node_modules/ora": { 4800 + "version": "8.2.0", 4801 + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", 4802 + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", 4803 + "dependencies": { 4804 + "chalk": "^5.3.0", 4805 + "cli-cursor": "^5.0.0", 4806 + "cli-spinners": "^2.9.2", 4807 + "is-interactive": "^2.0.0", 4808 + "is-unicode-supported": "^2.0.0", 4809 + "log-symbols": "^6.0.0", 4810 + "stdin-discarder": "^0.2.2", 4811 + "string-width": "^7.2.0", 4812 + "strip-ansi": "^7.1.0" 4813 + }, 4814 + "engines": { 4815 + "node": ">=18" 4816 + }, 4817 + "funding": { 4818 + "url": "https://github.com/sponsors/sindresorhus" 4819 + } 4820 + }, 4821 + "node_modules/outvariant": { 4822 + "version": "1.4.3", 4823 + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", 4824 + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" 4825 + }, 4826 + "node_modules/package-manager-detector": { 4827 + "version": "1.6.0", 4828 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", 4829 + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==" 4830 + }, 4831 + "node_modules/parent-module": { 4832 + "version": "1.0.1", 4833 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 4834 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 4835 + "dependencies": { 4836 + "callsites": "^3.0.0" 4837 + }, 4838 + "engines": { 4839 + "node": ">=6" 4840 + } 4841 + }, 4842 + "node_modules/parse-json": { 4843 + "version": "5.2.0", 4844 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 4845 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 4846 + "dependencies": { 4847 + "@babel/code-frame": "^7.0.0", 4848 + "error-ex": "^1.3.1", 4849 + "json-parse-even-better-errors": "^2.3.0", 4850 + "lines-and-columns": "^1.1.6" 4851 + }, 4852 + "engines": { 4853 + "node": ">=8" 4854 + }, 4855 + "funding": { 4856 + "url": "https://github.com/sponsors/sindresorhus" 4857 + } 4858 + }, 4859 + "node_modules/parse-ms": { 4860 + "version": "4.0.0", 4861 + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", 4862 + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", 4863 + "engines": { 4864 + "node": ">=18" 4865 + }, 4866 + "funding": { 4867 + "url": "https://github.com/sponsors/sindresorhus" 4868 + } 4869 + }, 4870 + "node_modules/parseurl": { 4871 + "version": "1.3.3", 4872 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 4873 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 4874 + "engines": { 4875 + "node": ">= 0.8" 4876 + } 4877 + }, 4878 + "node_modules/path-browserify": { 4879 + "version": "1.0.1", 4880 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 4881 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 4882 + }, 4883 + "node_modules/path-key": { 4884 + "version": "3.1.1", 4885 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 4886 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 4887 + "engines": { 4888 + "node": ">=8" 4889 + } 4890 + }, 4891 + "node_modules/path-to-regexp": { 4892 + "version": "6.3.0", 4893 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 4894 + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" 4895 + }, 1881 4896 "node_modules/picocolors": { 1882 4897 "version": "1.1.1", 1883 4898 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1884 4899 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1885 4900 "license": "ISC" 1886 4901 }, 4902 + "node_modules/picomatch": { 4903 + "version": "4.0.3", 4904 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 4905 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 4906 + "engines": { 4907 + "node": ">=12" 4908 + }, 4909 + "funding": { 4910 + "url": "https://github.com/sponsors/jonschlinkert" 4911 + } 4912 + }, 4913 + "node_modules/pkce-challenge": { 4914 + "version": "5.0.1", 4915 + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", 4916 + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", 4917 + "engines": { 4918 + "node": ">=16.20.0" 4919 + } 4920 + }, 1887 4921 "node_modules/postcss": { 1888 4922 "version": "8.5.6", 1889 4923 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", ··· 1912 4946 "node": "^10 || ^12 || >=14" 1913 4947 } 1914 4948 }, 4949 + "node_modules/postcss-selector-parser": { 4950 + "version": "7.1.1", 4951 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", 4952 + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", 4953 + "dependencies": { 4954 + "cssesc": "^3.0.0", 4955 + "util-deprecate": "^1.0.2" 4956 + }, 4957 + "engines": { 4958 + "node": ">=4" 4959 + } 4960 + }, 4961 + "node_modules/powershell-utils": { 4962 + "version": "0.1.0", 4963 + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", 4964 + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", 4965 + "engines": { 4966 + "node": ">=20" 4967 + }, 4968 + "funding": { 4969 + "url": "https://github.com/sponsors/sindresorhus" 4970 + } 4971 + }, 4972 + "node_modules/pretty-ms": { 4973 + "version": "9.3.0", 4974 + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", 4975 + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", 4976 + "dependencies": { 4977 + "parse-ms": "^4.0.0" 4978 + }, 4979 + "engines": { 4980 + "node": ">=18" 4981 + }, 4982 + "funding": { 4983 + "url": "https://github.com/sponsors/sindresorhus" 4984 + } 4985 + }, 4986 + "node_modules/prompts": { 4987 + "version": "2.4.2", 4988 + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 4989 + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 4990 + "dependencies": { 4991 + "kleur": "^3.0.3", 4992 + "sisteransi": "^1.0.5" 4993 + }, 4994 + "engines": { 4995 + "node": ">= 6" 4996 + } 4997 + }, 4998 + "node_modules/prompts/node_modules/kleur": { 4999 + "version": "3.0.3", 5000 + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 5001 + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 5002 + "engines": { 5003 + "node": ">=6" 5004 + } 5005 + }, 5006 + "node_modules/proxy-addr": { 5007 + "version": "2.0.7", 5008 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 5009 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 5010 + "dependencies": { 5011 + "forwarded": "0.2.0", 5012 + "ipaddr.js": "1.9.1" 5013 + }, 5014 + "engines": { 5015 + "node": ">= 0.10" 5016 + } 5017 + }, 1915 5018 "node_modules/qs": { 1916 - "version": "6.14.0", 1917 - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 1918 - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 1919 - "license": "BSD-3-Clause", 5019 + "version": "6.15.0", 5020 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", 5021 + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", 1920 5022 "dependencies": { 1921 5023 "side-channel": "^1.1.0" 1922 5024 }, ··· 1927 5029 "url": "https://github.com/sponsors/ljharb" 1928 5030 } 1929 5031 }, 5032 + "node_modules/queue-microtask": { 5033 + "version": "1.2.3", 5034 + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 5035 + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 5036 + "funding": [ 5037 + { 5038 + "type": "github", 5039 + "url": "https://github.com/sponsors/feross" 5040 + }, 5041 + { 5042 + "type": "patreon", 5043 + "url": "https://www.patreon.com/feross" 5044 + }, 5045 + { 5046 + "type": "consulting", 5047 + "url": "https://feross.org/support" 5048 + } 5049 + ] 5050 + }, 5051 + "node_modules/radix-ui": { 5052 + "version": "1.4.3", 5053 + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.3.tgz", 5054 + "integrity": "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==", 5055 + "dependencies": { 5056 + "@radix-ui/primitive": "1.1.3", 5057 + "@radix-ui/react-accessible-icon": "1.1.7", 5058 + "@radix-ui/react-accordion": "1.2.12", 5059 + "@radix-ui/react-alert-dialog": "1.1.15", 5060 + "@radix-ui/react-arrow": "1.1.7", 5061 + "@radix-ui/react-aspect-ratio": "1.1.7", 5062 + "@radix-ui/react-avatar": "1.1.10", 5063 + "@radix-ui/react-checkbox": "1.3.3", 5064 + "@radix-ui/react-collapsible": "1.1.12", 5065 + "@radix-ui/react-collection": "1.1.7", 5066 + "@radix-ui/react-compose-refs": "1.1.2", 5067 + "@radix-ui/react-context": "1.1.2", 5068 + "@radix-ui/react-context-menu": "2.2.16", 5069 + "@radix-ui/react-dialog": "1.1.15", 5070 + "@radix-ui/react-direction": "1.1.1", 5071 + "@radix-ui/react-dismissable-layer": "1.1.11", 5072 + "@radix-ui/react-dropdown-menu": "2.1.16", 5073 + "@radix-ui/react-focus-guards": "1.1.3", 5074 + "@radix-ui/react-focus-scope": "1.1.7", 5075 + "@radix-ui/react-form": "0.1.8", 5076 + "@radix-ui/react-hover-card": "1.1.15", 5077 + "@radix-ui/react-label": "2.1.7", 5078 + "@radix-ui/react-menu": "2.1.16", 5079 + "@radix-ui/react-menubar": "1.1.16", 5080 + "@radix-ui/react-navigation-menu": "1.2.14", 5081 + "@radix-ui/react-one-time-password-field": "0.1.8", 5082 + "@radix-ui/react-password-toggle-field": "0.1.3", 5083 + "@radix-ui/react-popover": "1.1.15", 5084 + "@radix-ui/react-popper": "1.2.8", 5085 + "@radix-ui/react-portal": "1.1.9", 5086 + "@radix-ui/react-presence": "1.1.5", 5087 + "@radix-ui/react-primitive": "2.1.3", 5088 + "@radix-ui/react-progress": "1.1.7", 5089 + "@radix-ui/react-radio-group": "1.3.8", 5090 + "@radix-ui/react-roving-focus": "1.1.11", 5091 + "@radix-ui/react-scroll-area": "1.2.10", 5092 + "@radix-ui/react-select": "2.2.6", 5093 + "@radix-ui/react-separator": "1.1.7", 5094 + "@radix-ui/react-slider": "1.3.6", 5095 + "@radix-ui/react-slot": "1.2.3", 5096 + "@radix-ui/react-switch": "1.2.6", 5097 + "@radix-ui/react-tabs": "1.1.13", 5098 + "@radix-ui/react-toast": "1.2.15", 5099 + "@radix-ui/react-toggle": "1.1.10", 5100 + "@radix-ui/react-toggle-group": "1.1.11", 5101 + "@radix-ui/react-toolbar": "1.1.11", 5102 + "@radix-ui/react-tooltip": "1.2.8", 5103 + "@radix-ui/react-use-callback-ref": "1.1.1", 5104 + "@radix-ui/react-use-controllable-state": "1.2.2", 5105 + "@radix-ui/react-use-effect-event": "0.0.2", 5106 + "@radix-ui/react-use-escape-keydown": "1.1.1", 5107 + "@radix-ui/react-use-is-hydrated": "0.1.0", 5108 + "@radix-ui/react-use-layout-effect": "1.1.1", 5109 + "@radix-ui/react-use-size": "1.1.1", 5110 + "@radix-ui/react-visually-hidden": "1.2.3" 5111 + }, 5112 + "peerDependencies": { 5113 + "@types/react": "*", 5114 + "@types/react-dom": "*", 5115 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5116 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5117 + }, 5118 + "peerDependenciesMeta": { 5119 + "@types/react": { 5120 + "optional": true 5121 + }, 5122 + "@types/react-dom": { 5123 + "optional": true 5124 + } 5125 + } 5126 + }, 5127 + "node_modules/radix-ui/node_modules/@radix-ui/react-accessible-icon": { 5128 + "version": "1.1.7", 5129 + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", 5130 + "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", 5131 + "dependencies": { 5132 + "@radix-ui/react-visually-hidden": "1.2.3" 5133 + }, 5134 + "peerDependencies": { 5135 + "@types/react": "*", 5136 + "@types/react-dom": "*", 5137 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5138 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5139 + }, 5140 + "peerDependenciesMeta": { 5141 + "@types/react": { 5142 + "optional": true 5143 + }, 5144 + "@types/react-dom": { 5145 + "optional": true 5146 + } 5147 + } 5148 + }, 5149 + "node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { 5150 + "version": "1.2.12", 5151 + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", 5152 + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", 5153 + "dependencies": { 5154 + "@radix-ui/primitive": "1.1.3", 5155 + "@radix-ui/react-collapsible": "1.1.12", 5156 + "@radix-ui/react-collection": "1.1.7", 5157 + "@radix-ui/react-compose-refs": "1.1.2", 5158 + "@radix-ui/react-context": "1.1.2", 5159 + "@radix-ui/react-direction": "1.1.1", 5160 + "@radix-ui/react-id": "1.1.1", 5161 + "@radix-ui/react-primitive": "2.1.3", 5162 + "@radix-ui/react-use-controllable-state": "1.2.2" 5163 + }, 5164 + "peerDependencies": { 5165 + "@types/react": "*", 5166 + "@types/react-dom": "*", 5167 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5168 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5169 + }, 5170 + "peerDependenciesMeta": { 5171 + "@types/react": { 5172 + "optional": true 5173 + }, 5174 + "@types/react-dom": { 5175 + "optional": true 5176 + } 5177 + } 5178 + }, 5179 + "node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { 5180 + "version": "1.1.15", 5181 + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", 5182 + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", 5183 + "dependencies": { 5184 + "@radix-ui/primitive": "1.1.3", 5185 + "@radix-ui/react-compose-refs": "1.1.2", 5186 + "@radix-ui/react-context": "1.1.2", 5187 + "@radix-ui/react-dialog": "1.1.15", 5188 + "@radix-ui/react-primitive": "2.1.3", 5189 + "@radix-ui/react-slot": "1.2.3" 5190 + }, 5191 + "peerDependencies": { 5192 + "@types/react": "*", 5193 + "@types/react-dom": "*", 5194 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5195 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5196 + }, 5197 + "peerDependenciesMeta": { 5198 + "@types/react": { 5199 + "optional": true 5200 + }, 5201 + "@types/react-dom": { 5202 + "optional": true 5203 + } 5204 + } 5205 + }, 5206 + "node_modules/radix-ui/node_modules/@radix-ui/react-arrow": { 5207 + "version": "1.1.7", 5208 + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", 5209 + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", 5210 + "dependencies": { 5211 + "@radix-ui/react-primitive": "2.1.3" 5212 + }, 5213 + "peerDependencies": { 5214 + "@types/react": "*", 5215 + "@types/react-dom": "*", 5216 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5217 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5218 + }, 5219 + "peerDependenciesMeta": { 5220 + "@types/react": { 5221 + "optional": true 5222 + }, 5223 + "@types/react-dom": { 5224 + "optional": true 5225 + } 5226 + } 5227 + }, 5228 + "node_modules/radix-ui/node_modules/@radix-ui/react-aspect-ratio": { 5229 + "version": "1.1.7", 5230 + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", 5231 + "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", 5232 + "dependencies": { 5233 + "@radix-ui/react-primitive": "2.1.3" 5234 + }, 5235 + "peerDependencies": { 5236 + "@types/react": "*", 5237 + "@types/react-dom": "*", 5238 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5239 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5240 + }, 5241 + "peerDependenciesMeta": { 5242 + "@types/react": { 5243 + "optional": true 5244 + }, 5245 + "@types/react-dom": { 5246 + "optional": true 5247 + } 5248 + } 5249 + }, 5250 + "node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { 5251 + "version": "1.1.10", 5252 + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", 5253 + "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", 5254 + "dependencies": { 5255 + "@radix-ui/react-context": "1.1.2", 5256 + "@radix-ui/react-primitive": "2.1.3", 5257 + "@radix-ui/react-use-callback-ref": "1.1.1", 5258 + "@radix-ui/react-use-is-hydrated": "0.1.0", 5259 + "@radix-ui/react-use-layout-effect": "1.1.1" 5260 + }, 5261 + "peerDependencies": { 5262 + "@types/react": "*", 5263 + "@types/react-dom": "*", 5264 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5265 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5266 + }, 5267 + "peerDependenciesMeta": { 5268 + "@types/react": { 5269 + "optional": true 5270 + }, 5271 + "@types/react-dom": { 5272 + "optional": true 5273 + } 5274 + } 5275 + }, 5276 + "node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { 5277 + "version": "1.3.3", 5278 + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", 5279 + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", 5280 + "dependencies": { 5281 + "@radix-ui/primitive": "1.1.3", 5282 + "@radix-ui/react-compose-refs": "1.1.2", 5283 + "@radix-ui/react-context": "1.1.2", 5284 + "@radix-ui/react-presence": "1.1.5", 5285 + "@radix-ui/react-primitive": "2.1.3", 5286 + "@radix-ui/react-use-controllable-state": "1.2.2", 5287 + "@radix-ui/react-use-previous": "1.1.1", 5288 + "@radix-ui/react-use-size": "1.1.1" 5289 + }, 5290 + "peerDependencies": { 5291 + "@types/react": "*", 5292 + "@types/react-dom": "*", 5293 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5294 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5295 + }, 5296 + "peerDependenciesMeta": { 5297 + "@types/react": { 5298 + "optional": true 5299 + }, 5300 + "@types/react-dom": { 5301 + "optional": true 5302 + } 5303 + } 5304 + }, 5305 + "node_modules/radix-ui/node_modules/@radix-ui/react-collapsible": { 5306 + "version": "1.1.12", 5307 + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", 5308 + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", 5309 + "dependencies": { 5310 + "@radix-ui/primitive": "1.1.3", 5311 + "@radix-ui/react-compose-refs": "1.1.2", 5312 + "@radix-ui/react-context": "1.1.2", 5313 + "@radix-ui/react-id": "1.1.1", 5314 + "@radix-ui/react-presence": "1.1.5", 5315 + "@radix-ui/react-primitive": "2.1.3", 5316 + "@radix-ui/react-use-controllable-state": "1.2.2", 5317 + "@radix-ui/react-use-layout-effect": "1.1.1" 5318 + }, 5319 + "peerDependencies": { 5320 + "@types/react": "*", 5321 + "@types/react-dom": "*", 5322 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5323 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5324 + }, 5325 + "peerDependenciesMeta": { 5326 + "@types/react": { 5327 + "optional": true 5328 + }, 5329 + "@types/react-dom": { 5330 + "optional": true 5331 + } 5332 + } 5333 + }, 5334 + "node_modules/radix-ui/node_modules/@radix-ui/react-collection": { 5335 + "version": "1.1.7", 5336 + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", 5337 + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", 5338 + "dependencies": { 5339 + "@radix-ui/react-compose-refs": "1.1.2", 5340 + "@radix-ui/react-context": "1.1.2", 5341 + "@radix-ui/react-primitive": "2.1.3", 5342 + "@radix-ui/react-slot": "1.2.3" 5343 + }, 5344 + "peerDependencies": { 5345 + "@types/react": "*", 5346 + "@types/react-dom": "*", 5347 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5348 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5349 + }, 5350 + "peerDependenciesMeta": { 5351 + "@types/react": { 5352 + "optional": true 5353 + }, 5354 + "@types/react-dom": { 5355 + "optional": true 5356 + } 5357 + } 5358 + }, 5359 + "node_modules/radix-ui/node_modules/@radix-ui/react-context-menu": { 5360 + "version": "2.2.16", 5361 + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", 5362 + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", 5363 + "dependencies": { 5364 + "@radix-ui/primitive": "1.1.3", 5365 + "@radix-ui/react-context": "1.1.2", 5366 + "@radix-ui/react-menu": "2.1.16", 5367 + "@radix-ui/react-primitive": "2.1.3", 5368 + "@radix-ui/react-use-callback-ref": "1.1.1", 5369 + "@radix-ui/react-use-controllable-state": "1.2.2" 5370 + }, 5371 + "peerDependencies": { 5372 + "@types/react": "*", 5373 + "@types/react-dom": "*", 5374 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5375 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5376 + }, 5377 + "peerDependenciesMeta": { 5378 + "@types/react": { 5379 + "optional": true 5380 + }, 5381 + "@types/react-dom": { 5382 + "optional": true 5383 + } 5384 + } 5385 + }, 5386 + "node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { 5387 + "version": "1.1.15", 5388 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", 5389 + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", 5390 + "dependencies": { 5391 + "@radix-ui/primitive": "1.1.3", 5392 + "@radix-ui/react-compose-refs": "1.1.2", 5393 + "@radix-ui/react-context": "1.1.2", 5394 + "@radix-ui/react-dismissable-layer": "1.1.11", 5395 + "@radix-ui/react-focus-guards": "1.1.3", 5396 + "@radix-ui/react-focus-scope": "1.1.7", 5397 + "@radix-ui/react-id": "1.1.1", 5398 + "@radix-ui/react-portal": "1.1.9", 5399 + "@radix-ui/react-presence": "1.1.5", 5400 + "@radix-ui/react-primitive": "2.1.3", 5401 + "@radix-ui/react-slot": "1.2.3", 5402 + "@radix-ui/react-use-controllable-state": "1.2.2", 5403 + "aria-hidden": "^1.2.4", 5404 + "react-remove-scroll": "^2.6.3" 5405 + }, 5406 + "peerDependencies": { 5407 + "@types/react": "*", 5408 + "@types/react-dom": "*", 5409 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5410 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5411 + }, 5412 + "peerDependenciesMeta": { 5413 + "@types/react": { 5414 + "optional": true 5415 + }, 5416 + "@types/react-dom": { 5417 + "optional": true 5418 + } 5419 + } 5420 + }, 5421 + "node_modules/radix-ui/node_modules/@radix-ui/react-dismissable-layer": { 5422 + "version": "1.1.11", 5423 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", 5424 + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", 5425 + "dependencies": { 5426 + "@radix-ui/primitive": "1.1.3", 5427 + "@radix-ui/react-compose-refs": "1.1.2", 5428 + "@radix-ui/react-primitive": "2.1.3", 5429 + "@radix-ui/react-use-callback-ref": "1.1.1", 5430 + "@radix-ui/react-use-escape-keydown": "1.1.1" 5431 + }, 5432 + "peerDependencies": { 5433 + "@types/react": "*", 5434 + "@types/react-dom": "*", 5435 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5436 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5437 + }, 5438 + "peerDependenciesMeta": { 5439 + "@types/react": { 5440 + "optional": true 5441 + }, 5442 + "@types/react-dom": { 5443 + "optional": true 5444 + } 5445 + } 5446 + }, 5447 + "node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { 5448 + "version": "2.1.16", 5449 + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", 5450 + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", 5451 + "dependencies": { 5452 + "@radix-ui/primitive": "1.1.3", 5453 + "@radix-ui/react-compose-refs": "1.1.2", 5454 + "@radix-ui/react-context": "1.1.2", 5455 + "@radix-ui/react-id": "1.1.1", 5456 + "@radix-ui/react-menu": "2.1.16", 5457 + "@radix-ui/react-primitive": "2.1.3", 5458 + "@radix-ui/react-use-controllable-state": "1.2.2" 5459 + }, 5460 + "peerDependencies": { 5461 + "@types/react": "*", 5462 + "@types/react-dom": "*", 5463 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5464 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5465 + }, 5466 + "peerDependenciesMeta": { 5467 + "@types/react": { 5468 + "optional": true 5469 + }, 5470 + "@types/react-dom": { 5471 + "optional": true 5472 + } 5473 + } 5474 + }, 5475 + "node_modules/radix-ui/node_modules/@radix-ui/react-focus-scope": { 5476 + "version": "1.1.7", 5477 + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", 5478 + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", 5479 + "dependencies": { 5480 + "@radix-ui/react-compose-refs": "1.1.2", 5481 + "@radix-ui/react-primitive": "2.1.3", 5482 + "@radix-ui/react-use-callback-ref": "1.1.1" 5483 + }, 5484 + "peerDependencies": { 5485 + "@types/react": "*", 5486 + "@types/react-dom": "*", 5487 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5488 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5489 + }, 5490 + "peerDependenciesMeta": { 5491 + "@types/react": { 5492 + "optional": true 5493 + }, 5494 + "@types/react-dom": { 5495 + "optional": true 5496 + } 5497 + } 5498 + }, 5499 + "node_modules/radix-ui/node_modules/@radix-ui/react-form": { 5500 + "version": "0.1.8", 5501 + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.8.tgz", 5502 + "integrity": "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==", 5503 + "dependencies": { 5504 + "@radix-ui/primitive": "1.1.3", 5505 + "@radix-ui/react-compose-refs": "1.1.2", 5506 + "@radix-ui/react-context": "1.1.2", 5507 + "@radix-ui/react-id": "1.1.1", 5508 + "@radix-ui/react-label": "2.1.7", 5509 + "@radix-ui/react-primitive": "2.1.3" 5510 + }, 5511 + "peerDependencies": { 5512 + "@types/react": "*", 5513 + "@types/react-dom": "*", 5514 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5515 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5516 + }, 5517 + "peerDependenciesMeta": { 5518 + "@types/react": { 5519 + "optional": true 5520 + }, 5521 + "@types/react-dom": { 5522 + "optional": true 5523 + } 5524 + } 5525 + }, 5526 + "node_modules/radix-ui/node_modules/@radix-ui/react-hover-card": { 5527 + "version": "1.1.15", 5528 + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", 5529 + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", 5530 + "dependencies": { 5531 + "@radix-ui/primitive": "1.1.3", 5532 + "@radix-ui/react-compose-refs": "1.1.2", 5533 + "@radix-ui/react-context": "1.1.2", 5534 + "@radix-ui/react-dismissable-layer": "1.1.11", 5535 + "@radix-ui/react-popper": "1.2.8", 5536 + "@radix-ui/react-portal": "1.1.9", 5537 + "@radix-ui/react-presence": "1.1.5", 5538 + "@radix-ui/react-primitive": "2.1.3", 5539 + "@radix-ui/react-use-controllable-state": "1.2.2" 5540 + }, 5541 + "peerDependencies": { 5542 + "@types/react": "*", 5543 + "@types/react-dom": "*", 5544 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5545 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5546 + }, 5547 + "peerDependenciesMeta": { 5548 + "@types/react": { 5549 + "optional": true 5550 + }, 5551 + "@types/react-dom": { 5552 + "optional": true 5553 + } 5554 + } 5555 + }, 5556 + "node_modules/radix-ui/node_modules/@radix-ui/react-label": { 5557 + "version": "2.1.7", 5558 + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", 5559 + "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", 5560 + "dependencies": { 5561 + "@radix-ui/react-primitive": "2.1.3" 5562 + }, 5563 + "peerDependencies": { 5564 + "@types/react": "*", 5565 + "@types/react-dom": "*", 5566 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5567 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5568 + }, 5569 + "peerDependenciesMeta": { 5570 + "@types/react": { 5571 + "optional": true 5572 + }, 5573 + "@types/react-dom": { 5574 + "optional": true 5575 + } 5576 + } 5577 + }, 5578 + "node_modules/radix-ui/node_modules/@radix-ui/react-menu": { 5579 + "version": "2.1.16", 5580 + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", 5581 + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", 5582 + "dependencies": { 5583 + "@radix-ui/primitive": "1.1.3", 5584 + "@radix-ui/react-collection": "1.1.7", 5585 + "@radix-ui/react-compose-refs": "1.1.2", 5586 + "@radix-ui/react-context": "1.1.2", 5587 + "@radix-ui/react-direction": "1.1.1", 5588 + "@radix-ui/react-dismissable-layer": "1.1.11", 5589 + "@radix-ui/react-focus-guards": "1.1.3", 5590 + "@radix-ui/react-focus-scope": "1.1.7", 5591 + "@radix-ui/react-id": "1.1.1", 5592 + "@radix-ui/react-popper": "1.2.8", 5593 + "@radix-ui/react-portal": "1.1.9", 5594 + "@radix-ui/react-presence": "1.1.5", 5595 + "@radix-ui/react-primitive": "2.1.3", 5596 + "@radix-ui/react-roving-focus": "1.1.11", 5597 + "@radix-ui/react-slot": "1.2.3", 5598 + "@radix-ui/react-use-callback-ref": "1.1.1", 5599 + "aria-hidden": "^1.2.4", 5600 + "react-remove-scroll": "^2.6.3" 5601 + }, 5602 + "peerDependencies": { 5603 + "@types/react": "*", 5604 + "@types/react-dom": "*", 5605 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5606 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5607 + }, 5608 + "peerDependenciesMeta": { 5609 + "@types/react": { 5610 + "optional": true 5611 + }, 5612 + "@types/react-dom": { 5613 + "optional": true 5614 + } 5615 + } 5616 + }, 5617 + "node_modules/radix-ui/node_modules/@radix-ui/react-menubar": { 5618 + "version": "1.1.16", 5619 + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", 5620 + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", 5621 + "dependencies": { 5622 + "@radix-ui/primitive": "1.1.3", 5623 + "@radix-ui/react-collection": "1.1.7", 5624 + "@radix-ui/react-compose-refs": "1.1.2", 5625 + "@radix-ui/react-context": "1.1.2", 5626 + "@radix-ui/react-direction": "1.1.1", 5627 + "@radix-ui/react-id": "1.1.1", 5628 + "@radix-ui/react-menu": "2.1.16", 5629 + "@radix-ui/react-primitive": "2.1.3", 5630 + "@radix-ui/react-roving-focus": "1.1.11", 5631 + "@radix-ui/react-use-controllable-state": "1.2.2" 5632 + }, 5633 + "peerDependencies": { 5634 + "@types/react": "*", 5635 + "@types/react-dom": "*", 5636 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5637 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5638 + }, 5639 + "peerDependenciesMeta": { 5640 + "@types/react": { 5641 + "optional": true 5642 + }, 5643 + "@types/react-dom": { 5644 + "optional": true 5645 + } 5646 + } 5647 + }, 5648 + "node_modules/radix-ui/node_modules/@radix-ui/react-navigation-menu": { 5649 + "version": "1.2.14", 5650 + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", 5651 + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", 5652 + "dependencies": { 5653 + "@radix-ui/primitive": "1.1.3", 5654 + "@radix-ui/react-collection": "1.1.7", 5655 + "@radix-ui/react-compose-refs": "1.1.2", 5656 + "@radix-ui/react-context": "1.1.2", 5657 + "@radix-ui/react-direction": "1.1.1", 5658 + "@radix-ui/react-dismissable-layer": "1.1.11", 5659 + "@radix-ui/react-id": "1.1.1", 5660 + "@radix-ui/react-presence": "1.1.5", 5661 + "@radix-ui/react-primitive": "2.1.3", 5662 + "@radix-ui/react-use-callback-ref": "1.1.1", 5663 + "@radix-ui/react-use-controllable-state": "1.2.2", 5664 + "@radix-ui/react-use-layout-effect": "1.1.1", 5665 + "@radix-ui/react-use-previous": "1.1.1", 5666 + "@radix-ui/react-visually-hidden": "1.2.3" 5667 + }, 5668 + "peerDependencies": { 5669 + "@types/react": "*", 5670 + "@types/react-dom": "*", 5671 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5672 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5673 + }, 5674 + "peerDependenciesMeta": { 5675 + "@types/react": { 5676 + "optional": true 5677 + }, 5678 + "@types/react-dom": { 5679 + "optional": true 5680 + } 5681 + } 5682 + }, 5683 + "node_modules/radix-ui/node_modules/@radix-ui/react-one-time-password-field": { 5684 + "version": "0.1.8", 5685 + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.8.tgz", 5686 + "integrity": "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==", 5687 + "dependencies": { 5688 + "@radix-ui/number": "1.1.1", 5689 + "@radix-ui/primitive": "1.1.3", 5690 + "@radix-ui/react-collection": "1.1.7", 5691 + "@radix-ui/react-compose-refs": "1.1.2", 5692 + "@radix-ui/react-context": "1.1.2", 5693 + "@radix-ui/react-direction": "1.1.1", 5694 + "@radix-ui/react-primitive": "2.1.3", 5695 + "@radix-ui/react-roving-focus": "1.1.11", 5696 + "@radix-ui/react-use-controllable-state": "1.2.2", 5697 + "@radix-ui/react-use-effect-event": "0.0.2", 5698 + "@radix-ui/react-use-is-hydrated": "0.1.0", 5699 + "@radix-ui/react-use-layout-effect": "1.1.1" 5700 + }, 5701 + "peerDependencies": { 5702 + "@types/react": "*", 5703 + "@types/react-dom": "*", 5704 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5705 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5706 + }, 5707 + "peerDependenciesMeta": { 5708 + "@types/react": { 5709 + "optional": true 5710 + }, 5711 + "@types/react-dom": { 5712 + "optional": true 5713 + } 5714 + } 5715 + }, 5716 + "node_modules/radix-ui/node_modules/@radix-ui/react-password-toggle-field": { 5717 + "version": "0.1.3", 5718 + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.3.tgz", 5719 + "integrity": "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==", 5720 + "dependencies": { 5721 + "@radix-ui/primitive": "1.1.3", 5722 + "@radix-ui/react-compose-refs": "1.1.2", 5723 + "@radix-ui/react-context": "1.1.2", 5724 + "@radix-ui/react-id": "1.1.1", 5725 + "@radix-ui/react-primitive": "2.1.3", 5726 + "@radix-ui/react-use-controllable-state": "1.2.2", 5727 + "@radix-ui/react-use-effect-event": "0.0.2", 5728 + "@radix-ui/react-use-is-hydrated": "0.1.0" 5729 + }, 5730 + "peerDependencies": { 5731 + "@types/react": "*", 5732 + "@types/react-dom": "*", 5733 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5734 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5735 + }, 5736 + "peerDependenciesMeta": { 5737 + "@types/react": { 5738 + "optional": true 5739 + }, 5740 + "@types/react-dom": { 5741 + "optional": true 5742 + } 5743 + } 5744 + }, 5745 + "node_modules/radix-ui/node_modules/@radix-ui/react-popover": { 5746 + "version": "1.1.15", 5747 + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", 5748 + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", 5749 + "dependencies": { 5750 + "@radix-ui/primitive": "1.1.3", 5751 + "@radix-ui/react-compose-refs": "1.1.2", 5752 + "@radix-ui/react-context": "1.1.2", 5753 + "@radix-ui/react-dismissable-layer": "1.1.11", 5754 + "@radix-ui/react-focus-guards": "1.1.3", 5755 + "@radix-ui/react-focus-scope": "1.1.7", 5756 + "@radix-ui/react-id": "1.1.1", 5757 + "@radix-ui/react-popper": "1.2.8", 5758 + "@radix-ui/react-portal": "1.1.9", 5759 + "@radix-ui/react-presence": "1.1.5", 5760 + "@radix-ui/react-primitive": "2.1.3", 5761 + "@radix-ui/react-slot": "1.2.3", 5762 + "@radix-ui/react-use-controllable-state": "1.2.2", 5763 + "aria-hidden": "^1.2.4", 5764 + "react-remove-scroll": "^2.6.3" 5765 + }, 5766 + "peerDependencies": { 5767 + "@types/react": "*", 5768 + "@types/react-dom": "*", 5769 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5770 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5771 + }, 5772 + "peerDependenciesMeta": { 5773 + "@types/react": { 5774 + "optional": true 5775 + }, 5776 + "@types/react-dom": { 5777 + "optional": true 5778 + } 5779 + } 5780 + }, 5781 + "node_modules/radix-ui/node_modules/@radix-ui/react-popper": { 5782 + "version": "1.2.8", 5783 + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", 5784 + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", 5785 + "dependencies": { 5786 + "@floating-ui/react-dom": "^2.0.0", 5787 + "@radix-ui/react-arrow": "1.1.7", 5788 + "@radix-ui/react-compose-refs": "1.1.2", 5789 + "@radix-ui/react-context": "1.1.2", 5790 + "@radix-ui/react-primitive": "2.1.3", 5791 + "@radix-ui/react-use-callback-ref": "1.1.1", 5792 + "@radix-ui/react-use-layout-effect": "1.1.1", 5793 + "@radix-ui/react-use-rect": "1.1.1", 5794 + "@radix-ui/react-use-size": "1.1.1", 5795 + "@radix-ui/rect": "1.1.1" 5796 + }, 5797 + "peerDependencies": { 5798 + "@types/react": "*", 5799 + "@types/react-dom": "*", 5800 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5801 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5802 + }, 5803 + "peerDependenciesMeta": { 5804 + "@types/react": { 5805 + "optional": true 5806 + }, 5807 + "@types/react-dom": { 5808 + "optional": true 5809 + } 5810 + } 5811 + }, 5812 + "node_modules/radix-ui/node_modules/@radix-ui/react-portal": { 5813 + "version": "1.1.9", 5814 + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", 5815 + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", 5816 + "dependencies": { 5817 + "@radix-ui/react-primitive": "2.1.3", 5818 + "@radix-ui/react-use-layout-effect": "1.1.1" 5819 + }, 5820 + "peerDependencies": { 5821 + "@types/react": "*", 5822 + "@types/react-dom": "*", 5823 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5824 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5825 + }, 5826 + "peerDependenciesMeta": { 5827 + "@types/react": { 5828 + "optional": true 5829 + }, 5830 + "@types/react-dom": { 5831 + "optional": true 5832 + } 5833 + } 5834 + }, 5835 + "node_modules/radix-ui/node_modules/@radix-ui/react-presence": { 5836 + "version": "1.1.5", 5837 + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", 5838 + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", 5839 + "dependencies": { 5840 + "@radix-ui/react-compose-refs": "1.1.2", 5841 + "@radix-ui/react-use-layout-effect": "1.1.1" 5842 + }, 5843 + "peerDependencies": { 5844 + "@types/react": "*", 5845 + "@types/react-dom": "*", 5846 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5847 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5848 + }, 5849 + "peerDependenciesMeta": { 5850 + "@types/react": { 5851 + "optional": true 5852 + }, 5853 + "@types/react-dom": { 5854 + "optional": true 5855 + } 5856 + } 5857 + }, 5858 + "node_modules/radix-ui/node_modules/@radix-ui/react-primitive": { 5859 + "version": "2.1.3", 5860 + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", 5861 + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", 5862 + "dependencies": { 5863 + "@radix-ui/react-slot": "1.2.3" 5864 + }, 5865 + "peerDependencies": { 5866 + "@types/react": "*", 5867 + "@types/react-dom": "*", 5868 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5869 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5870 + }, 5871 + "peerDependenciesMeta": { 5872 + "@types/react": { 5873 + "optional": true 5874 + }, 5875 + "@types/react-dom": { 5876 + "optional": true 5877 + } 5878 + } 5879 + }, 5880 + "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { 5881 + "version": "1.1.7", 5882 + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", 5883 + "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", 5884 + "dependencies": { 5885 + "@radix-ui/react-context": "1.1.2", 5886 + "@radix-ui/react-primitive": "2.1.3" 5887 + }, 5888 + "peerDependencies": { 5889 + "@types/react": "*", 5890 + "@types/react-dom": "*", 5891 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5892 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5893 + }, 5894 + "peerDependenciesMeta": { 5895 + "@types/react": { 5896 + "optional": true 5897 + }, 5898 + "@types/react-dom": { 5899 + "optional": true 5900 + } 5901 + } 5902 + }, 5903 + "node_modules/radix-ui/node_modules/@radix-ui/react-radio-group": { 5904 + "version": "1.3.8", 5905 + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", 5906 + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", 5907 + "dependencies": { 5908 + "@radix-ui/primitive": "1.1.3", 5909 + "@radix-ui/react-compose-refs": "1.1.2", 5910 + "@radix-ui/react-context": "1.1.2", 5911 + "@radix-ui/react-direction": "1.1.1", 5912 + "@radix-ui/react-presence": "1.1.5", 5913 + "@radix-ui/react-primitive": "2.1.3", 5914 + "@radix-ui/react-roving-focus": "1.1.11", 5915 + "@radix-ui/react-use-controllable-state": "1.2.2", 5916 + "@radix-ui/react-use-previous": "1.1.1", 5917 + "@radix-ui/react-use-size": "1.1.1" 5918 + }, 5919 + "peerDependencies": { 5920 + "@types/react": "*", 5921 + "@types/react-dom": "*", 5922 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5923 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5924 + }, 5925 + "peerDependenciesMeta": { 5926 + "@types/react": { 5927 + "optional": true 5928 + }, 5929 + "@types/react-dom": { 5930 + "optional": true 5931 + } 5932 + } 5933 + }, 5934 + "node_modules/radix-ui/node_modules/@radix-ui/react-roving-focus": { 5935 + "version": "1.1.11", 5936 + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", 5937 + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", 5938 + "dependencies": { 5939 + "@radix-ui/primitive": "1.1.3", 5940 + "@radix-ui/react-collection": "1.1.7", 5941 + "@radix-ui/react-compose-refs": "1.1.2", 5942 + "@radix-ui/react-context": "1.1.2", 5943 + "@radix-ui/react-direction": "1.1.1", 5944 + "@radix-ui/react-id": "1.1.1", 5945 + "@radix-ui/react-primitive": "2.1.3", 5946 + "@radix-ui/react-use-callback-ref": "1.1.1", 5947 + "@radix-ui/react-use-controllable-state": "1.2.2" 5948 + }, 5949 + "peerDependencies": { 5950 + "@types/react": "*", 5951 + "@types/react-dom": "*", 5952 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5953 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5954 + }, 5955 + "peerDependenciesMeta": { 5956 + "@types/react": { 5957 + "optional": true 5958 + }, 5959 + "@types/react-dom": { 5960 + "optional": true 5961 + } 5962 + } 5963 + }, 5964 + "node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { 5965 + "version": "1.2.10", 5966 + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", 5967 + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", 5968 + "dependencies": { 5969 + "@radix-ui/number": "1.1.1", 5970 + "@radix-ui/primitive": "1.1.3", 5971 + "@radix-ui/react-compose-refs": "1.1.2", 5972 + "@radix-ui/react-context": "1.1.2", 5973 + "@radix-ui/react-direction": "1.1.1", 5974 + "@radix-ui/react-presence": "1.1.5", 5975 + "@radix-ui/react-primitive": "2.1.3", 5976 + "@radix-ui/react-use-callback-ref": "1.1.1", 5977 + "@radix-ui/react-use-layout-effect": "1.1.1" 5978 + }, 5979 + "peerDependencies": { 5980 + "@types/react": "*", 5981 + "@types/react-dom": "*", 5982 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 5983 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 5984 + }, 5985 + "peerDependenciesMeta": { 5986 + "@types/react": { 5987 + "optional": true 5988 + }, 5989 + "@types/react-dom": { 5990 + "optional": true 5991 + } 5992 + } 5993 + }, 5994 + "node_modules/radix-ui/node_modules/@radix-ui/react-select": { 5995 + "version": "2.2.6", 5996 + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", 5997 + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", 5998 + "dependencies": { 5999 + "@radix-ui/number": "1.1.1", 6000 + "@radix-ui/primitive": "1.1.3", 6001 + "@radix-ui/react-collection": "1.1.7", 6002 + "@radix-ui/react-compose-refs": "1.1.2", 6003 + "@radix-ui/react-context": "1.1.2", 6004 + "@radix-ui/react-direction": "1.1.1", 6005 + "@radix-ui/react-dismissable-layer": "1.1.11", 6006 + "@radix-ui/react-focus-guards": "1.1.3", 6007 + "@radix-ui/react-focus-scope": "1.1.7", 6008 + "@radix-ui/react-id": "1.1.1", 6009 + "@radix-ui/react-popper": "1.2.8", 6010 + "@radix-ui/react-portal": "1.1.9", 6011 + "@radix-ui/react-primitive": "2.1.3", 6012 + "@radix-ui/react-slot": "1.2.3", 6013 + "@radix-ui/react-use-callback-ref": "1.1.1", 6014 + "@radix-ui/react-use-controllable-state": "1.2.2", 6015 + "@radix-ui/react-use-layout-effect": "1.1.1", 6016 + "@radix-ui/react-use-previous": "1.1.1", 6017 + "@radix-ui/react-visually-hidden": "1.2.3", 6018 + "aria-hidden": "^1.2.4", 6019 + "react-remove-scroll": "^2.6.3" 6020 + }, 6021 + "peerDependencies": { 6022 + "@types/react": "*", 6023 + "@types/react-dom": "*", 6024 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6025 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6026 + }, 6027 + "peerDependenciesMeta": { 6028 + "@types/react": { 6029 + "optional": true 6030 + }, 6031 + "@types/react-dom": { 6032 + "optional": true 6033 + } 6034 + } 6035 + }, 6036 + "node_modules/radix-ui/node_modules/@radix-ui/react-separator": { 6037 + "version": "1.1.7", 6038 + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", 6039 + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", 6040 + "dependencies": { 6041 + "@radix-ui/react-primitive": "2.1.3" 6042 + }, 6043 + "peerDependencies": { 6044 + "@types/react": "*", 6045 + "@types/react-dom": "*", 6046 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6047 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6048 + }, 6049 + "peerDependenciesMeta": { 6050 + "@types/react": { 6051 + "optional": true 6052 + }, 6053 + "@types/react-dom": { 6054 + "optional": true 6055 + } 6056 + } 6057 + }, 6058 + "node_modules/radix-ui/node_modules/@radix-ui/react-slider": { 6059 + "version": "1.3.6", 6060 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", 6061 + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", 6062 + "dependencies": { 6063 + "@radix-ui/number": "1.1.1", 6064 + "@radix-ui/primitive": "1.1.3", 6065 + "@radix-ui/react-collection": "1.1.7", 6066 + "@radix-ui/react-compose-refs": "1.1.2", 6067 + "@radix-ui/react-context": "1.1.2", 6068 + "@radix-ui/react-direction": "1.1.1", 6069 + "@radix-ui/react-primitive": "2.1.3", 6070 + "@radix-ui/react-use-controllable-state": "1.2.2", 6071 + "@radix-ui/react-use-layout-effect": "1.1.1", 6072 + "@radix-ui/react-use-previous": "1.1.1", 6073 + "@radix-ui/react-use-size": "1.1.1" 6074 + }, 6075 + "peerDependencies": { 6076 + "@types/react": "*", 6077 + "@types/react-dom": "*", 6078 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6079 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6080 + }, 6081 + "peerDependenciesMeta": { 6082 + "@types/react": { 6083 + "optional": true 6084 + }, 6085 + "@types/react-dom": { 6086 + "optional": true 6087 + } 6088 + } 6089 + }, 6090 + "node_modules/radix-ui/node_modules/@radix-ui/react-slot": { 6091 + "version": "1.2.3", 6092 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", 6093 + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", 6094 + "dependencies": { 6095 + "@radix-ui/react-compose-refs": "1.1.2" 6096 + }, 6097 + "peerDependencies": { 6098 + "@types/react": "*", 6099 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6100 + }, 6101 + "peerDependenciesMeta": { 6102 + "@types/react": { 6103 + "optional": true 6104 + } 6105 + } 6106 + }, 6107 + "node_modules/radix-ui/node_modules/@radix-ui/react-switch": { 6108 + "version": "1.2.6", 6109 + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", 6110 + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", 6111 + "dependencies": { 6112 + "@radix-ui/primitive": "1.1.3", 6113 + "@radix-ui/react-compose-refs": "1.1.2", 6114 + "@radix-ui/react-context": "1.1.2", 6115 + "@radix-ui/react-primitive": "2.1.3", 6116 + "@radix-ui/react-use-controllable-state": "1.2.2", 6117 + "@radix-ui/react-use-previous": "1.1.1", 6118 + "@radix-ui/react-use-size": "1.1.1" 6119 + }, 6120 + "peerDependencies": { 6121 + "@types/react": "*", 6122 + "@types/react-dom": "*", 6123 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6124 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6125 + }, 6126 + "peerDependenciesMeta": { 6127 + "@types/react": { 6128 + "optional": true 6129 + }, 6130 + "@types/react-dom": { 6131 + "optional": true 6132 + } 6133 + } 6134 + }, 6135 + "node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { 6136 + "version": "1.1.13", 6137 + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", 6138 + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", 6139 + "dependencies": { 6140 + "@radix-ui/primitive": "1.1.3", 6141 + "@radix-ui/react-context": "1.1.2", 6142 + "@radix-ui/react-direction": "1.1.1", 6143 + "@radix-ui/react-id": "1.1.1", 6144 + "@radix-ui/react-presence": "1.1.5", 6145 + "@radix-ui/react-primitive": "2.1.3", 6146 + "@radix-ui/react-roving-focus": "1.1.11", 6147 + "@radix-ui/react-use-controllable-state": "1.2.2" 6148 + }, 6149 + "peerDependencies": { 6150 + "@types/react": "*", 6151 + "@types/react-dom": "*", 6152 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6153 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6154 + }, 6155 + "peerDependenciesMeta": { 6156 + "@types/react": { 6157 + "optional": true 6158 + }, 6159 + "@types/react-dom": { 6160 + "optional": true 6161 + } 6162 + } 6163 + }, 6164 + "node_modules/radix-ui/node_modules/@radix-ui/react-toast": { 6165 + "version": "1.2.15", 6166 + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", 6167 + "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", 6168 + "dependencies": { 6169 + "@radix-ui/primitive": "1.1.3", 6170 + "@radix-ui/react-collection": "1.1.7", 6171 + "@radix-ui/react-compose-refs": "1.1.2", 6172 + "@radix-ui/react-context": "1.1.2", 6173 + "@radix-ui/react-dismissable-layer": "1.1.11", 6174 + "@radix-ui/react-portal": "1.1.9", 6175 + "@radix-ui/react-presence": "1.1.5", 6176 + "@radix-ui/react-primitive": "2.1.3", 6177 + "@radix-ui/react-use-callback-ref": "1.1.1", 6178 + "@radix-ui/react-use-controllable-state": "1.2.2", 6179 + "@radix-ui/react-use-layout-effect": "1.1.1", 6180 + "@radix-ui/react-visually-hidden": "1.2.3" 6181 + }, 6182 + "peerDependencies": { 6183 + "@types/react": "*", 6184 + "@types/react-dom": "*", 6185 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6186 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6187 + }, 6188 + "peerDependenciesMeta": { 6189 + "@types/react": { 6190 + "optional": true 6191 + }, 6192 + "@types/react-dom": { 6193 + "optional": true 6194 + } 6195 + } 6196 + }, 6197 + "node_modules/radix-ui/node_modules/@radix-ui/react-toggle": { 6198 + "version": "1.1.10", 6199 + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", 6200 + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", 6201 + "dependencies": { 6202 + "@radix-ui/primitive": "1.1.3", 6203 + "@radix-ui/react-primitive": "2.1.3", 6204 + "@radix-ui/react-use-controllable-state": "1.2.2" 6205 + }, 6206 + "peerDependencies": { 6207 + "@types/react": "*", 6208 + "@types/react-dom": "*", 6209 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6210 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6211 + }, 6212 + "peerDependenciesMeta": { 6213 + "@types/react": { 6214 + "optional": true 6215 + }, 6216 + "@types/react-dom": { 6217 + "optional": true 6218 + } 6219 + } 6220 + }, 6221 + "node_modules/radix-ui/node_modules/@radix-ui/react-toggle-group": { 6222 + "version": "1.1.11", 6223 + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", 6224 + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", 6225 + "dependencies": { 6226 + "@radix-ui/primitive": "1.1.3", 6227 + "@radix-ui/react-context": "1.1.2", 6228 + "@radix-ui/react-direction": "1.1.1", 6229 + "@radix-ui/react-primitive": "2.1.3", 6230 + "@radix-ui/react-roving-focus": "1.1.11", 6231 + "@radix-ui/react-toggle": "1.1.10", 6232 + "@radix-ui/react-use-controllable-state": "1.2.2" 6233 + }, 6234 + "peerDependencies": { 6235 + "@types/react": "*", 6236 + "@types/react-dom": "*", 6237 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6238 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6239 + }, 6240 + "peerDependenciesMeta": { 6241 + "@types/react": { 6242 + "optional": true 6243 + }, 6244 + "@types/react-dom": { 6245 + "optional": true 6246 + } 6247 + } 6248 + }, 6249 + "node_modules/radix-ui/node_modules/@radix-ui/react-toolbar": { 6250 + "version": "1.1.11", 6251 + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.11.tgz", 6252 + "integrity": "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==", 6253 + "dependencies": { 6254 + "@radix-ui/primitive": "1.1.3", 6255 + "@radix-ui/react-context": "1.1.2", 6256 + "@radix-ui/react-direction": "1.1.1", 6257 + "@radix-ui/react-primitive": "2.1.3", 6258 + "@radix-ui/react-roving-focus": "1.1.11", 6259 + "@radix-ui/react-separator": "1.1.7", 6260 + "@radix-ui/react-toggle-group": "1.1.11" 6261 + }, 6262 + "peerDependencies": { 6263 + "@types/react": "*", 6264 + "@types/react-dom": "*", 6265 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6266 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6267 + }, 6268 + "peerDependenciesMeta": { 6269 + "@types/react": { 6270 + "optional": true 6271 + }, 6272 + "@types/react-dom": { 6273 + "optional": true 6274 + } 6275 + } 6276 + }, 6277 + "node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { 6278 + "version": "1.2.8", 6279 + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", 6280 + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", 6281 + "dependencies": { 6282 + "@radix-ui/primitive": "1.1.3", 6283 + "@radix-ui/react-compose-refs": "1.1.2", 6284 + "@radix-ui/react-context": "1.1.2", 6285 + "@radix-ui/react-dismissable-layer": "1.1.11", 6286 + "@radix-ui/react-id": "1.1.1", 6287 + "@radix-ui/react-popper": "1.2.8", 6288 + "@radix-ui/react-portal": "1.1.9", 6289 + "@radix-ui/react-presence": "1.1.5", 6290 + "@radix-ui/react-primitive": "2.1.3", 6291 + "@radix-ui/react-slot": "1.2.3", 6292 + "@radix-ui/react-use-controllable-state": "1.2.2", 6293 + "@radix-ui/react-visually-hidden": "1.2.3" 6294 + }, 6295 + "peerDependencies": { 6296 + "@types/react": "*", 6297 + "@types/react-dom": "*", 6298 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6299 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6300 + }, 6301 + "peerDependenciesMeta": { 6302 + "@types/react": { 6303 + "optional": true 6304 + }, 6305 + "@types/react-dom": { 6306 + "optional": true 6307 + } 6308 + } 6309 + }, 6310 + "node_modules/radix-ui/node_modules/@radix-ui/react-visually-hidden": { 6311 + "version": "1.2.3", 6312 + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", 6313 + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", 6314 + "dependencies": { 6315 + "@radix-ui/react-primitive": "2.1.3" 6316 + }, 6317 + "peerDependencies": { 6318 + "@types/react": "*", 6319 + "@types/react-dom": "*", 6320 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", 6321 + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 6322 + }, 6323 + "peerDependenciesMeta": { 6324 + "@types/react": { 6325 + "optional": true 6326 + }, 6327 + "@types/react-dom": { 6328 + "optional": true 6329 + } 6330 + } 6331 + }, 6332 + "node_modules/range-parser": { 6333 + "version": "1.2.1", 6334 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 6335 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 6336 + "engines": { 6337 + "node": ">= 0.6" 6338 + } 6339 + }, 6340 + "node_modules/raw-body": { 6341 + "version": "3.0.2", 6342 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", 6343 + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", 6344 + "dependencies": { 6345 + "bytes": "~3.1.2", 6346 + "http-errors": "~2.0.1", 6347 + "iconv-lite": "~0.7.0", 6348 + "unpipe": "~1.0.0" 6349 + }, 6350 + "engines": { 6351 + "node": ">= 0.10" 6352 + } 6353 + }, 1930 6354 "node_modules/react": { 1931 6355 "version": "18.2.0", 1932 6356 "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", ··· 1952 6376 "react": "^18.2.0" 1953 6377 } 1954 6378 }, 6379 + "node_modules/react-remove-scroll": { 6380 + "version": "2.7.2", 6381 + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", 6382 + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", 6383 + "dependencies": { 6384 + "react-remove-scroll-bar": "^2.3.7", 6385 + "react-style-singleton": "^2.2.3", 6386 + "tslib": "^2.1.0", 6387 + "use-callback-ref": "^1.3.3", 6388 + "use-sidecar": "^1.1.3" 6389 + }, 6390 + "engines": { 6391 + "node": ">=10" 6392 + }, 6393 + "peerDependencies": { 6394 + "@types/react": "*", 6395 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 6396 + }, 6397 + "peerDependenciesMeta": { 6398 + "@types/react": { 6399 + "optional": true 6400 + } 6401 + } 6402 + }, 6403 + "node_modules/react-remove-scroll-bar": { 6404 + "version": "2.3.8", 6405 + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", 6406 + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", 6407 + "dependencies": { 6408 + "react-style-singleton": "^2.2.2", 6409 + "tslib": "^2.0.0" 6410 + }, 6411 + "engines": { 6412 + "node": ">=10" 6413 + }, 6414 + "peerDependencies": { 6415 + "@types/react": "*", 6416 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 6417 + }, 6418 + "peerDependenciesMeta": { 6419 + "@types/react": { 6420 + "optional": true 6421 + } 6422 + } 6423 + }, 6424 + "node_modules/react-style-singleton": { 6425 + "version": "2.2.3", 6426 + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", 6427 + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", 6428 + "dependencies": { 6429 + "get-nonce": "^1.0.0", 6430 + "tslib": "^2.0.0" 6431 + }, 6432 + "engines": { 6433 + "node": ">=10" 6434 + }, 6435 + "peerDependencies": { 6436 + "@types/react": "*", 6437 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 6438 + }, 6439 + "peerDependenciesMeta": { 6440 + "@types/react": { 6441 + "optional": true 6442 + } 6443 + } 6444 + }, 6445 + "node_modules/recast": { 6446 + "version": "0.23.11", 6447 + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", 6448 + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", 6449 + "dependencies": { 6450 + "ast-types": "^0.16.1", 6451 + "esprima": "~4.0.0", 6452 + "source-map": "~0.6.1", 6453 + "tiny-invariant": "^1.3.3", 6454 + "tslib": "^2.0.1" 6455 + }, 6456 + "engines": { 6457 + "node": ">= 4" 6458 + } 6459 + }, 6460 + "node_modules/require-directory": { 6461 + "version": "2.1.1", 6462 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 6463 + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 6464 + "engines": { 6465 + "node": ">=0.10.0" 6466 + } 6467 + }, 6468 + "node_modules/require-from-string": { 6469 + "version": "2.0.2", 6470 + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 6471 + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 6472 + "engines": { 6473 + "node": ">=0.10.0" 6474 + } 6475 + }, 6476 + "node_modules/reselect": { 6477 + "version": "5.1.1", 6478 + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", 6479 + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" 6480 + }, 6481 + "node_modules/resolve-from": { 6482 + "version": "4.0.0", 6483 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 6484 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 6485 + "engines": { 6486 + "node": ">=4" 6487 + } 6488 + }, 6489 + "node_modules/restore-cursor": { 6490 + "version": "5.1.0", 6491 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", 6492 + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", 6493 + "dependencies": { 6494 + "onetime": "^7.0.0", 6495 + "signal-exit": "^4.1.0" 6496 + }, 6497 + "engines": { 6498 + "node": ">=18" 6499 + }, 6500 + "funding": { 6501 + "url": "https://github.com/sponsors/sindresorhus" 6502 + } 6503 + }, 6504 + "node_modules/rettime": { 6505 + "version": "0.10.1", 6506 + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", 6507 + "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==" 6508 + }, 6509 + "node_modules/reusify": { 6510 + "version": "1.1.0", 6511 + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 6512 + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 6513 + "engines": { 6514 + "iojs": ">=1.0.0", 6515 + "node": ">=0.10.0" 6516 + } 6517 + }, 6518 + "node_modules/router": { 6519 + "version": "2.2.0", 6520 + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 6521 + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 6522 + "dependencies": { 6523 + "debug": "^4.4.0", 6524 + "depd": "^2.0.0", 6525 + "is-promise": "^4.0.0", 6526 + "parseurl": "^1.3.3", 6527 + "path-to-regexp": "^8.0.0" 6528 + }, 6529 + "engines": { 6530 + "node": ">= 18" 6531 + } 6532 + }, 6533 + "node_modules/router/node_modules/path-to-regexp": { 6534 + "version": "8.3.0", 6535 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", 6536 + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", 6537 + "funding": { 6538 + "type": "opencollective", 6539 + "url": "https://opencollective.com/express" 6540 + } 6541 + }, 6542 + "node_modules/run-applescript": { 6543 + "version": "7.1.0", 6544 + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", 6545 + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", 6546 + "engines": { 6547 + "node": ">=18" 6548 + }, 6549 + "funding": { 6550 + "url": "https://github.com/sponsors/sindresorhus" 6551 + } 6552 + }, 6553 + "node_modules/run-parallel": { 6554 + "version": "1.2.0", 6555 + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 6556 + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 6557 + "funding": [ 6558 + { 6559 + "type": "github", 6560 + "url": "https://github.com/sponsors/feross" 6561 + }, 6562 + { 6563 + "type": "patreon", 6564 + "url": "https://www.patreon.com/feross" 6565 + }, 6566 + { 6567 + "type": "consulting", 6568 + "url": "https://feross.org/support" 6569 + } 6570 + ], 6571 + "dependencies": { 6572 + "queue-microtask": "^1.2.2" 6573 + } 6574 + }, 6575 + "node_modules/safer-buffer": { 6576 + "version": "2.1.2", 6577 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 6578 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 6579 + }, 1955 6580 "node_modules/scheduler": { 1956 6581 "version": "0.23.2", 1957 6582 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", ··· 1974 6599 "node": ">=10" 1975 6600 } 1976 6601 }, 6602 + "node_modules/send": { 6603 + "version": "1.2.1", 6604 + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", 6605 + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", 6606 + "dependencies": { 6607 + "debug": "^4.4.3", 6608 + "encodeurl": "^2.0.0", 6609 + "escape-html": "^1.0.3", 6610 + "etag": "^1.8.1", 6611 + "fresh": "^2.0.0", 6612 + "http-errors": "^2.0.1", 6613 + "mime-types": "^3.0.2", 6614 + "ms": "^2.1.3", 6615 + "on-finished": "^2.4.1", 6616 + "range-parser": "^1.2.1", 6617 + "statuses": "^2.0.2" 6618 + }, 6619 + "engines": { 6620 + "node": ">= 18" 6621 + }, 6622 + "funding": { 6623 + "type": "opencollective", 6624 + "url": "https://opencollective.com/express" 6625 + } 6626 + }, 6627 + "node_modules/serve-static": { 6628 + "version": "2.2.1", 6629 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", 6630 + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", 6631 + "dependencies": { 6632 + "encodeurl": "^2.0.0", 6633 + "escape-html": "^1.0.3", 6634 + "parseurl": "^1.3.3", 6635 + "send": "^1.2.0" 6636 + }, 6637 + "engines": { 6638 + "node": ">= 18" 6639 + }, 6640 + "funding": { 6641 + "type": "opencollective", 6642 + "url": "https://opencollective.com/express" 6643 + } 6644 + }, 1977 6645 "node_modules/server-only": { 1978 6646 "version": "0.0.1", 1979 6647 "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", 1980 6648 "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", 1981 6649 "license": "MIT" 1982 6650 }, 6651 + "node_modules/setprototypeof": { 6652 + "version": "1.2.0", 6653 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 6654 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 6655 + }, 6656 + "node_modules/shadcn": { 6657 + "version": "3.8.5", 6658 + "resolved": "https://registry.npmjs.org/shadcn/-/shadcn-3.8.5.tgz", 6659 + "integrity": "sha512-jPRx44e+eyeV7xwY3BLJXcfrks00+M0h5BGB9l6DdcBW4BpAj4x3lVmVy0TXPEs2iHEisxejr62sZAAw6B1EVA==", 6660 + "dependencies": { 6661 + "@antfu/ni": "^25.0.0", 6662 + "@babel/core": "^7.28.0", 6663 + "@babel/parser": "^7.28.0", 6664 + "@babel/plugin-transform-typescript": "^7.28.0", 6665 + "@babel/preset-typescript": "^7.27.1", 6666 + "@dotenvx/dotenvx": "^1.48.4", 6667 + "@modelcontextprotocol/sdk": "^1.26.0", 6668 + "@types/validate-npm-package-name": "^4.0.2", 6669 + "browserslist": "^4.26.2", 6670 + "commander": "^14.0.0", 6671 + "cosmiconfig": "^9.0.0", 6672 + "dedent": "^1.6.0", 6673 + "deepmerge": "^4.3.1", 6674 + "diff": "^8.0.2", 6675 + "execa": "^9.6.0", 6676 + "fast-glob": "^3.3.3", 6677 + "fs-extra": "^11.3.1", 6678 + "fuzzysort": "^3.1.0", 6679 + "https-proxy-agent": "^7.0.6", 6680 + "kleur": "^4.1.5", 6681 + "msw": "^2.10.4", 6682 + "node-fetch": "^3.3.2", 6683 + "open": "^11.0.0", 6684 + "ora": "^8.2.0", 6685 + "postcss": "^8.5.6", 6686 + "postcss-selector-parser": "^7.1.0", 6687 + "prompts": "^2.4.2", 6688 + "recast": "^0.23.11", 6689 + "stringify-object": "^5.0.0", 6690 + "tailwind-merge": "^3.0.1", 6691 + "ts-morph": "^26.0.0", 6692 + "tsconfig-paths": "^4.2.0", 6693 + "validate-npm-package-name": "^7.0.1", 6694 + "zod": "^3.24.1", 6695 + "zod-to-json-schema": "^3.24.6" 6696 + }, 6697 + "bin": { 6698 + "shadcn": "dist/index.js" 6699 + } 6700 + }, 1983 6701 "node_modules/sharp": { 1984 6702 "version": "0.34.5", 1985 6703 "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", ··· 2025 6743 "@img/sharp-win32-x64": "0.34.5" 2026 6744 } 2027 6745 }, 6746 + "node_modules/shebang-command": { 6747 + "version": "2.0.0", 6748 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 6749 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 6750 + "dependencies": { 6751 + "shebang-regex": "^3.0.0" 6752 + }, 6753 + "engines": { 6754 + "node": ">=8" 6755 + } 6756 + }, 6757 + "node_modules/shebang-regex": { 6758 + "version": "3.0.0", 6759 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 6760 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 6761 + "engines": { 6762 + "node": ">=8" 6763 + } 6764 + }, 2028 6765 "node_modules/side-channel": { 2029 6766 "version": "1.1.0", 2030 6767 "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ··· 2097 6834 "url": "https://github.com/sponsors/ljharb" 2098 6835 } 2099 6836 }, 6837 + "node_modules/signal-exit": { 6838 + "version": "4.1.0", 6839 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 6840 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 6841 + "engines": { 6842 + "node": ">=14" 6843 + }, 6844 + "funding": { 6845 + "url": "https://github.com/sponsors/isaacs" 6846 + } 6847 + }, 6848 + "node_modules/sisteransi": { 6849 + "version": "1.0.5", 6850 + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 6851 + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" 6852 + }, 6853 + "node_modules/source-map": { 6854 + "version": "0.6.1", 6855 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 6856 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 6857 + "engines": { 6858 + "node": ">=0.10.0" 6859 + } 6860 + }, 2100 6861 "node_modules/source-map-js": { 2101 6862 "version": "1.2.1", 2102 6863 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 2106 6867 "node": ">=0.10.0" 2107 6868 } 2108 6869 }, 6870 + "node_modules/statuses": { 6871 + "version": "2.0.2", 6872 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", 6873 + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", 6874 + "engines": { 6875 + "node": ">= 0.8" 6876 + } 6877 + }, 6878 + "node_modules/stdin-discarder": { 6879 + "version": "0.2.2", 6880 + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", 6881 + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", 6882 + "engines": { 6883 + "node": ">=18" 6884 + }, 6885 + "funding": { 6886 + "url": "https://github.com/sponsors/sindresorhus" 6887 + } 6888 + }, 6889 + "node_modules/strict-event-emitter": { 6890 + "version": "0.5.1", 6891 + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", 6892 + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" 6893 + }, 6894 + "node_modules/string-width": { 6895 + "version": "7.2.0", 6896 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", 6897 + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 6898 + "dependencies": { 6899 + "emoji-regex": "^10.3.0", 6900 + "get-east-asian-width": "^1.0.0", 6901 + "strip-ansi": "^7.1.0" 6902 + }, 6903 + "engines": { 6904 + "node": ">=18" 6905 + }, 6906 + "funding": { 6907 + "url": "https://github.com/sponsors/sindresorhus" 6908 + } 6909 + }, 6910 + "node_modules/stringify-object": { 6911 + "version": "5.0.0", 6912 + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-5.0.0.tgz", 6913 + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", 6914 + "dependencies": { 6915 + "get-own-enumerable-keys": "^1.0.0", 6916 + "is-obj": "^3.0.0", 6917 + "is-regexp": "^3.1.0" 6918 + }, 6919 + "engines": { 6920 + "node": ">=14.16" 6921 + }, 6922 + "funding": { 6923 + "url": "https://github.com/yeoman/stringify-object?sponsor=1" 6924 + } 6925 + }, 6926 + "node_modules/strip-ansi": { 6927 + "version": "7.2.0", 6928 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", 6929 + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", 6930 + "dependencies": { 6931 + "ansi-regex": "^6.2.2" 6932 + }, 6933 + "engines": { 6934 + "node": ">=12" 6935 + }, 6936 + "funding": { 6937 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 6938 + } 6939 + }, 6940 + "node_modules/strip-bom": { 6941 + "version": "3.0.0", 6942 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 6943 + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", 6944 + "engines": { 6945 + "node": ">=4" 6946 + } 6947 + }, 6948 + "node_modules/strip-final-newline": { 6949 + "version": "4.0.0", 6950 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", 6951 + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", 6952 + "engines": { 6953 + "node": ">=18" 6954 + }, 6955 + "funding": { 6956 + "url": "https://github.com/sponsors/sindresorhus" 6957 + } 6958 + }, 2109 6959 "node_modules/stripe": { 2110 6960 "version": "14.8.0", 2111 6961 "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.8.0.tgz", ··· 2142 6992 } 2143 6993 } 2144 6994 }, 6995 + "node_modules/tabbable": { 6996 + "version": "6.4.0", 6997 + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", 6998 + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==" 6999 + }, 7000 + "node_modules/tagged-tag": { 7001 + "version": "1.0.0", 7002 + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", 7003 + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", 7004 + "engines": { 7005 + "node": ">=20" 7006 + }, 7007 + "funding": { 7008 + "url": "https://github.com/sponsors/sindresorhus" 7009 + } 7010 + }, 2145 7011 "node_modules/tailwind-merge": { 2146 - "version": "3.4.0", 2147 - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", 2148 - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", 2149 - "license": "MIT", 7012 + "version": "3.5.0", 7013 + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", 7014 + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", 2150 7015 "funding": { 2151 7016 "type": "github", 2152 7017 "url": "https://github.com/sponsors/dcastil" ··· 2171 7036 "url": "https://opencollective.com/webpack" 2172 7037 } 2173 7038 }, 7039 + "node_modules/tiny-invariant": { 7040 + "version": "1.3.3", 7041 + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", 7042 + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" 7043 + }, 7044 + "node_modules/tinyexec": { 7045 + "version": "1.0.2", 7046 + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", 7047 + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", 7048 + "engines": { 7049 + "node": ">=18" 7050 + } 7051 + }, 7052 + "node_modules/tldts": { 7053 + "version": "7.0.24", 7054 + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.24.tgz", 7055 + "integrity": "sha512-1r6vQTTt1rUiJkI5vX7KG8PR342Ru/5Oh13kEQP2SMbRSZpOey9SrBe27IDxkoWulx8ShWu4K6C0BkctP8Z1bQ==", 7056 + "dependencies": { 7057 + "tldts-core": "^7.0.24" 7058 + }, 7059 + "bin": { 7060 + "tldts": "bin/cli.js" 7061 + } 7062 + }, 7063 + "node_modules/tldts-core": { 7064 + "version": "7.0.24", 7065 + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.24.tgz", 7066 + "integrity": "sha512-pj7yygNMoMRqG7ML2SDQ0xNIOfN3IBDUcPVM2Sg6hP96oFNN2nqnzHreT3z9xLq85IWJyNTvD38O002DdOrPMw==" 7067 + }, 7068 + "node_modules/to-regex-range": { 7069 + "version": "5.0.1", 7070 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 7071 + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 7072 + "dependencies": { 7073 + "is-number": "^7.0.0" 7074 + }, 7075 + "engines": { 7076 + "node": ">=8.0" 7077 + } 7078 + }, 7079 + "node_modules/toidentifier": { 7080 + "version": "1.0.1", 7081 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 7082 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 7083 + "engines": { 7084 + "node": ">=0.6" 7085 + } 7086 + }, 7087 + "node_modules/tough-cookie": { 7088 + "version": "6.0.0", 7089 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", 7090 + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", 7091 + "dependencies": { 7092 + "tldts": "^7.0.5" 7093 + }, 7094 + "engines": { 7095 + "node": ">=16" 7096 + } 7097 + }, 7098 + "node_modules/ts-morph": { 7099 + "version": "26.0.0", 7100 + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", 7101 + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", 7102 + "dependencies": { 7103 + "@ts-morph/common": "~0.27.0", 7104 + "code-block-writer": "^13.0.3" 7105 + } 7106 + }, 7107 + "node_modules/tsconfig-paths": { 7108 + "version": "4.2.0", 7109 + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", 7110 + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", 7111 + "dependencies": { 7112 + "json5": "^2.2.2", 7113 + "minimist": "^1.2.6", 7114 + "strip-bom": "^3.0.0" 7115 + }, 7116 + "engines": { 7117 + "node": ">=6" 7118 + } 7119 + }, 2174 7120 "node_modules/tslib": { 2175 7121 "version": "2.8.1", 2176 7122 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", ··· 2182 7128 "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", 2183 7129 "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", 2184 7130 "dev": true, 2185 - "license": "MIT", 2186 7131 "funding": { 2187 7132 "url": "https://github.com/sponsors/Wombosvideo" 2188 7133 } 2189 7134 }, 7135 + "node_modules/type-fest": { 7136 + "version": "5.4.4", 7137 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", 7138 + "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", 7139 + "dependencies": { 7140 + "tagged-tag": "^1.0.0" 7141 + }, 7142 + "engines": { 7143 + "node": ">=20" 7144 + }, 7145 + "funding": { 7146 + "url": "https://github.com/sponsors/sindresorhus" 7147 + } 7148 + }, 7149 + "node_modules/type-is": { 7150 + "version": "2.0.1", 7151 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 7152 + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 7153 + "dependencies": { 7154 + "content-type": "^1.0.5", 7155 + "media-typer": "^1.1.0", 7156 + "mime-types": "^3.0.0" 7157 + }, 7158 + "engines": { 7159 + "node": ">= 0.6" 7160 + } 7161 + }, 2190 7162 "node_modules/typescript": { 2191 7163 "version": "5.1.6", 2192 7164 "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 2193 7165 "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 2194 - "dev": true, 7166 + "devOptional": true, 2195 7167 "license": "Apache-2.0", 2196 7168 "bin": { 2197 7169 "tsc": "bin/tsc", ··· 2201 7173 "node": ">=14.17" 2202 7174 } 2203 7175 }, 7176 + "node_modules/unicorn-magic": { 7177 + "version": "0.3.0", 7178 + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", 7179 + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", 7180 + "engines": { 7181 + "node": ">=18" 7182 + }, 7183 + "funding": { 7184 + "url": "https://github.com/sponsors/sindresorhus" 7185 + } 7186 + }, 7187 + "node_modules/universalify": { 7188 + "version": "2.0.1", 7189 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 7190 + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 7191 + "engines": { 7192 + "node": ">= 10.0.0" 7193 + } 7194 + }, 7195 + "node_modules/unpipe": { 7196 + "version": "1.0.0", 7197 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 7198 + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 7199 + "engines": { 7200 + "node": ">= 0.8" 7201 + } 7202 + }, 7203 + "node_modules/until-async": { 7204 + "version": "3.0.2", 7205 + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", 7206 + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", 7207 + "funding": { 7208 + "url": "https://github.com/sponsors/kettanaito" 7209 + } 7210 + }, 7211 + "node_modules/update-browserslist-db": { 7212 + "version": "1.2.3", 7213 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 7214 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 7215 + "funding": [ 7216 + { 7217 + "type": "opencollective", 7218 + "url": "https://opencollective.com/browserslist" 7219 + }, 7220 + { 7221 + "type": "tidelift", 7222 + "url": "https://tidelift.com/funding/github/npm/browserslist" 7223 + }, 7224 + { 7225 + "type": "github", 7226 + "url": "https://github.com/sponsors/ai" 7227 + } 7228 + ], 7229 + "dependencies": { 7230 + "escalade": "^3.2.0", 7231 + "picocolors": "^1.1.1" 7232 + }, 7233 + "bin": { 7234 + "update-browserslist-db": "cli.js" 7235 + }, 7236 + "peerDependencies": { 7237 + "browserslist": ">= 4.21.0" 7238 + } 7239 + }, 7240 + "node_modules/use-callback-ref": { 7241 + "version": "1.3.3", 7242 + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", 7243 + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", 7244 + "dependencies": { 7245 + "tslib": "^2.0.0" 7246 + }, 7247 + "engines": { 7248 + "node": ">=10" 7249 + }, 7250 + "peerDependencies": { 7251 + "@types/react": "*", 7252 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 7253 + }, 7254 + "peerDependenciesMeta": { 7255 + "@types/react": { 7256 + "optional": true 7257 + } 7258 + } 7259 + }, 7260 + "node_modules/use-sidecar": { 7261 + "version": "1.1.3", 7262 + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", 7263 + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", 7264 + "dependencies": { 7265 + "detect-node-es": "^1.1.0", 7266 + "tslib": "^2.0.0" 7267 + }, 7268 + "engines": { 7269 + "node": ">=10" 7270 + }, 7271 + "peerDependencies": { 7272 + "@types/react": "*", 7273 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" 7274 + }, 7275 + "peerDependenciesMeta": { 7276 + "@types/react": { 7277 + "optional": true 7278 + } 7279 + } 7280 + }, 7281 + "node_modules/use-sync-external-store": { 7282 + "version": "1.6.0", 7283 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", 7284 + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", 7285 + "peerDependencies": { 7286 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 7287 + } 7288 + }, 7289 + "node_modules/util-deprecate": { 7290 + "version": "1.0.2", 7291 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 7292 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 7293 + }, 7294 + "node_modules/validate-npm-package-name": { 7295 + "version": "7.0.2", 7296 + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", 7297 + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", 7298 + "engines": { 7299 + "node": "^20.17.0 || >=22.9.0" 7300 + } 7301 + }, 7302 + "node_modules/vary": { 7303 + "version": "1.1.2", 7304 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 7305 + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 7306 + "engines": { 7307 + "node": ">= 0.8" 7308 + } 7309 + }, 7310 + "node_modules/web-streams-polyfill": { 7311 + "version": "3.3.3", 7312 + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 7313 + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 7314 + "engines": { 7315 + "node": ">= 8" 7316 + } 7317 + }, 7318 + "node_modules/which": { 7319 + "version": "4.0.0", 7320 + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", 7321 + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", 7322 + "dependencies": { 7323 + "isexe": "^3.1.1" 7324 + }, 7325 + "bin": { 7326 + "node-which": "bin/which.js" 7327 + }, 7328 + "engines": { 7329 + "node": "^16.13.0 || >=18.0.0" 7330 + } 7331 + }, 7332 + "node_modules/wrap-ansi": { 7333 + "version": "6.2.0", 7334 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 7335 + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 7336 + "dependencies": { 7337 + "ansi-styles": "^4.0.0", 7338 + "string-width": "^4.1.0", 7339 + "strip-ansi": "^6.0.0" 7340 + }, 7341 + "engines": { 7342 + "node": ">=8" 7343 + } 7344 + }, 7345 + "node_modules/wrap-ansi/node_modules/ansi-regex": { 7346 + "version": "5.0.1", 7347 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 7348 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 7349 + "engines": { 7350 + "node": ">=8" 7351 + } 7352 + }, 7353 + "node_modules/wrap-ansi/node_modules/emoji-regex": { 7354 + "version": "8.0.0", 7355 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 7356 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 7357 + }, 7358 + "node_modules/wrap-ansi/node_modules/string-width": { 7359 + "version": "4.2.3", 7360 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 7361 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 7362 + "dependencies": { 7363 + "emoji-regex": "^8.0.0", 7364 + "is-fullwidth-code-point": "^3.0.0", 7365 + "strip-ansi": "^6.0.1" 7366 + }, 7367 + "engines": { 7368 + "node": ">=8" 7369 + } 7370 + }, 7371 + "node_modules/wrap-ansi/node_modules/strip-ansi": { 7372 + "version": "6.0.1", 7373 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 7374 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 7375 + "dependencies": { 7376 + "ansi-regex": "^5.0.1" 7377 + }, 7378 + "engines": { 7379 + "node": ">=8" 7380 + } 7381 + }, 7382 + "node_modules/wrappy": { 7383 + "version": "1.0.2", 7384 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 7385 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 7386 + }, 2204 7387 "node_modules/ws": { 2205 7388 "version": "8.19.0", 2206 7389 "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", ··· 2220 7403 "utf-8-validate": { 2221 7404 "optional": true 2222 7405 } 7406 + } 7407 + }, 7408 + "node_modules/wsl-utils": { 7409 + "version": "0.3.1", 7410 + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", 7411 + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", 7412 + "dependencies": { 7413 + "is-wsl": "^3.1.0", 7414 + "powershell-utils": "^0.1.0" 7415 + }, 7416 + "engines": { 7417 + "node": ">=20" 7418 + }, 7419 + "funding": { 7420 + "url": "https://github.com/sponsors/sindresorhus" 7421 + } 7422 + }, 7423 + "node_modules/y18n": { 7424 + "version": "5.0.8", 7425 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 7426 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 7427 + "engines": { 7428 + "node": ">=10" 7429 + } 7430 + }, 7431 + "node_modules/yallist": { 7432 + "version": "3.1.1", 7433 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 7434 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 7435 + }, 7436 + "node_modules/yargs": { 7437 + "version": "17.7.2", 7438 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 7439 + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 7440 + "dependencies": { 7441 + "cliui": "^8.0.1", 7442 + "escalade": "^3.1.1", 7443 + "get-caller-file": "^2.0.5", 7444 + "require-directory": "^2.1.1", 7445 + "string-width": "^4.2.3", 7446 + "y18n": "^5.0.5", 7447 + "yargs-parser": "^21.1.1" 7448 + }, 7449 + "engines": { 7450 + "node": ">=12" 7451 + } 7452 + }, 7453 + "node_modules/yargs-parser": { 7454 + "version": "21.1.1", 7455 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 7456 + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 7457 + "engines": { 7458 + "node": ">=12" 7459 + } 7460 + }, 7461 + "node_modules/yargs/node_modules/ansi-regex": { 7462 + "version": "5.0.1", 7463 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 7464 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 7465 + "engines": { 7466 + "node": ">=8" 7467 + } 7468 + }, 7469 + "node_modules/yargs/node_modules/emoji-regex": { 7470 + "version": "8.0.0", 7471 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 7472 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 7473 + }, 7474 + "node_modules/yargs/node_modules/string-width": { 7475 + "version": "4.2.3", 7476 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 7477 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 7478 + "dependencies": { 7479 + "emoji-regex": "^8.0.0", 7480 + "is-fullwidth-code-point": "^3.0.0", 7481 + "strip-ansi": "^6.0.1" 7482 + }, 7483 + "engines": { 7484 + "node": ">=8" 7485 + } 7486 + }, 7487 + "node_modules/yargs/node_modules/strip-ansi": { 7488 + "version": "6.0.1", 7489 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 7490 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 7491 + "dependencies": { 7492 + "ansi-regex": "^5.0.1" 7493 + }, 7494 + "engines": { 7495 + "node": ">=8" 7496 + } 7497 + }, 7498 + "node_modules/yoctocolors": { 7499 + "version": "2.1.2", 7500 + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", 7501 + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", 7502 + "engines": { 7503 + "node": ">=18" 7504 + }, 7505 + "funding": { 7506 + "url": "https://github.com/sponsors/sindresorhus" 7507 + } 7508 + }, 7509 + "node_modules/yoctocolors-cjs": { 7510 + "version": "2.1.3", 7511 + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", 7512 + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", 7513 + "engines": { 7514 + "node": ">=18" 7515 + }, 7516 + "funding": { 7517 + "url": "https://github.com/sponsors/sindresorhus" 7518 + } 7519 + }, 7520 + "node_modules/zod": { 7521 + "version": "3.25.76", 7522 + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 7523 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 7524 + "funding": { 7525 + "url": "https://github.com/sponsors/colinhacks" 7526 + } 7527 + }, 7528 + "node_modules/zod-to-json-schema": { 7529 + "version": "3.25.1", 7530 + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", 7531 + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", 7532 + "peerDependencies": { 7533 + "zod": "^3.25 || ^4" 2223 7534 } 2224 7535 } 2225 7536 }
+4 -1
package.json
··· 6 6 "start": "next start" 7 7 }, 8 8 "dependencies": { 9 + "@base-ui/react": "^1.2.0", 9 10 "@radix-ui/react-slot": "^1.2.4", 10 11 "@supabase/ssr": "^0.8.0", 11 12 "@supabase/supabase-js": "^2.90.1", ··· 17 18 "lucide-react": "^0.562.0", 18 19 "next": "latest", 19 20 "postcss": "^8.5.6", 21 + "radix-ui": "^1.4.3", 20 22 "react": "18.2.0", 21 23 "react-dom": "18.2.0", 22 24 "server-only": "0.0.1", 25 + "shadcn": "^3.8.5", 23 26 "stripe": "14.8.0", 24 - "tailwind-merge": "^3.4.0", 27 + "tailwind-merge": "^3.5.0", 25 28 "tailwindcss": "^4.1.18" 26 29 }, 27 30 "devDependencies": {
+5
public/logo.svg
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1280" height="1280"> 3 + <path d="M0 0 C0.81952148 0.37697021 1.63904297 0.75394043 2.48339844 1.14233398 C11.60285155 5.34423447 20.53345418 9.57571453 29 15 C30.18360833 15.72476307 31.36863018 16.44722038 32.5546875 17.16796875 C46.72974953 25.82640202 60.36518708 35.19579918 73 46 C74.16665776 46.99219797 75.33332501 47.98438479 76.5 48.9765625 C79.49524674 51.52960075 82.4772543 54.09757669 85.45507812 56.67089844 C86.77004037 57.80216495 88.09493747 58.92186671 89.421875 60.0390625 C93.40501694 63.42010158 96.85096472 66.9899968 100.2265625 70.9765625 C102.02461917 73.02808972 103.9157426 74.91519541 105.875 76.8125 C117.27976871 88.08567523 126.98680285 101.77032865 136 115 C136.72445312 116.02609375 137.44890625 117.0521875 138.1953125 118.109375 C149.2185272 133.93422347 158.34831911 151.30931379 166 169 C166.47308594 170.08667969 166.94617188 171.17335938 167.43359375 172.29296875 C173.60118867 187.08516795 178.77580507 202.5412441 183 218 C191.44559799 218.17788528 199.80780198 217.69099294 208.22385406 217.07402039 C210.57253644 216.90208377 212.92154201 216.73537984 215.27069092 216.56994629 C221.9422003 216.09910602 228.612987 215.61832316 235.28369141 215.13623047 C239.38744579 214.84000895 243.49154851 214.54903854 247.5958786 214.26091003 C249.88180192 214.09880775 252.16722718 213.93067445 254.45269775 213.7623291 C261.35894704 213.26645294 268.26668378 212.8695614 275.19042969 212.74414062 C276.94356476 212.70673767 276.94356476 212.70673767 278.7321167 212.6685791 C283.6286285 213.1651716 286.87960948 214.81736556 290.25 218.375 C292.86510786 222.2976618 294.04899829 224.65254715 293.875 229.4375 C292.5211383 234.9496512 290.58481365 237.89055902 285.91914368 241.15673828 C279.09492723 244.37226141 271.22051996 243.4377612 263.85620117 243.3046875 C261.98679061 243.28616696 260.11736129 243.26947191 258.24792004 243.25436401 C253.95263776 243.21536571 249.65777666 243.1624677 245.36275864 243.10095215 C238.03405749 242.99698969 230.70519033 242.92239103 223.37612181 242.85097337 C205.08949117 242.67173396 186.80341632 242.45106706 168.51730435 242.22583044 C159.25423381 242.11181257 149.99112738 242.00084257 140.72801854 241.88998723 C124.2191264 241.69234224 107.71026259 241.49242862 91.20141602 241.29101562 C75.19850098 241.09578017 59.19557304 240.90165839 43.19262695 240.70898438 C42.20029355 240.69703639 41.20796015 240.68508841 40.18555603 240.67277837 C35.20554558 240.6128243 30.22553488 240.5528916 25.24552405 240.49296951 C-15.83635763 239.99862339 -56.91819366 239.50056505 -98 239 C-98 238.34 -98 237.68 -98 237 C-94.0772445 236.11799576 -90.25605616 235.73677137 -86.24584961 235.47509766 C-85.58342034 235.43094601 -84.92099108 235.38679436 -84.2384882 235.34130478 C-82.04330016 235.19576448 -79.84783634 235.05492764 -77.65234375 234.9140625 C-76.09722926 234.81179793 -74.54213522 234.70922196 -72.98706055 234.60635376 C-68.83005453 234.33214466 -64.67280103 234.06187973 -60.51548386 233.79243469 C-56.21599178 233.51319162 -51.91671364 233.23069836 -47.61743164 232.94824219 C-46.76663497 232.89235176 -45.9158383 232.83646133 -45.03925991 232.77887726 C-43.32703585 232.66639738 -41.61481248 232.55390708 -39.9025898 232.44140625 C-37.34604683 232.27358827 -34.78947358 232.10623782 -32.2328949 231.93896484 C-22.87255654 231.32580498 -13.51349711 230.69804944 -4.15625 230.0390625 C-3.17010208 229.96968979 -2.18395416 229.90031708 -1.16792297 229.82884216 C0.69423473 229.69778159 2.55639194 229.56671403 4.41854858 229.43563843 C20.27341435 228.32242873 36.1087474 227.41589311 52 227 C28.48303999 174.33120936 -8.88782019 132.94486147 -63.59375 111.59765625 C-67.04662044 110.3410253 -70.50394586 109.12915527 -74 108 C-74.94004883 107.69078613 -75.88009766 107.38157227 -76.84863281 107.06298828 C-118.45317339 93.75330041 -164.24458983 95.77523221 -205 111 C-205.8161377 111.30276855 -206.63227539 111.60553711 -207.47314453 111.91748047 C-230.53456122 120.64579466 -252.10337515 134.03226571 -270 151 C-271.68585984 152.48103575 -273.37338885 153.96017343 -275.0625 155.4375 C-300.22364275 178.21166031 -318.80195062 210.61137709 -328.39599609 242.97558594 C-328.95177564 244.83836846 -329.54636871 246.68945411 -330.14453125 248.5390625 C-333.58184819 259.94529026 -334.52692461 271.69369358 -335.67456055 283.51074219 C-336 286 -336 286 -337 289 C-336.24820213 288.98955375 -335.49640427 288.97910749 -334.72182465 288.96834469 C-293.24246821 288.39439767 -251.76291629 287.90813975 -210.28125 287.53515625 C-209.23160655 287.52569292 -208.1819631 287.5162296 -207.10051227 287.5064795 C-197.31794611 287.41828419 -187.53537512 287.3306339 -177.75279903 287.24354649 C-106.47918426 286.60890316 -35.20721591 285.9227042 36.0625 284.9375 C37.62000779 284.91601508 39.17751562 284.89453324 40.7350235 284.8730545 C55.2741428 284.67240874 69.8132208 284.468893 84.3522644 284.26283836 C136.85791209 283.51880763 189.36409672 282.94243828 241.87305307 282.48904628 C246.38426787 282.45004984 250.8954738 282.41012889 255.40667725 282.36984253 C268.67279676 282.25224972 281.93888756 282.1470754 295.20529938 282.068326 C301.35536669 282.03155845 307.50527833 281.98835802 313.6552124 281.93341064 C319.95170712 281.87751368 326.2481379 281.8366901 332.54480553 281.80629158 C334.91375068 281.79235237 337.28267174 281.77321585 339.65152931 281.74853325 C342.91841738 281.71539305 346.18487402 281.70125976 349.4519043 281.69165039 C350.40687742 281.67755945 351.36185055 281.66346851 352.34576225 281.64895058 C360.63382175 281.65973849 367.26181189 283.53746305 373.4609375 289.26953125 C377.91126877 294.27333011 380.10440405 300.31814082 380 307 C379.2633535 313.73505373 376.30879778 319.88072763 371.36328125 324.54296875 C364.94911712 329.45809228 358.17568314 330.31464934 350.3125 330.1875 C349.60544922 330.18685547 348.89839844 330.18621094 348.16992188 330.18554688 C342.52031747 330.14249316 336.8900743 329.84474055 331.25 329.54296875 C319.50622724 328.92311547 307.75605631 328.61867614 296.00097179 328.29819489 C271.19987653 327.62177489 246.41454064 326.76666647 221.62908173 325.65774918 C188.37191297 324.16991624 155.10709618 323.11636312 121.83016777 322.17552948 C116.83594671 322.03412419 111.84178383 321.89076116 106.84765625 321.74609375 C105.86691006 321.71772808 104.88616386 321.68936241 103.87569809 321.66013718 C87.60406101 321.18452577 71.34266729 320.53954986 55.07943153 319.83660507 C38.37624292 319.1161931 21.67655252 318.57284445 4.96310425 318.16629028 C-22.95005425 317.4841153 -50.84562012 316.51288028 -78.74337769 315.37091064 C-83.50076148 315.17617174 -88.25817341 314.98213834 -93.015625 314.7890625 C-94.21104007 314.74052061 -94.21104007 314.74052061 -95.43060493 314.69099808 C-116.38782218 313.84312763 -137.35012931 313.14386423 -158.3125 312.4375 C-181.3783415 311.65978759 -204.44001782 310.86464293 -227.49557495 309.81860352 C-248.019523 308.89296795 -268.55379362 308.29634458 -289.08935547 307.69702148 C-305.06426974 307.2287885 -321.03269911 306.68195513 -337 306 C-332.83721069 350.28271298 -321.03864146 390.35389674 -292 425 C-291.54044922 425.54978516 -291.08089844 426.09957031 -290.60742188 426.66601562 C-270.49209967 450.66278202 -245.21131168 471.03688217 -216 483 C-214.86433594 483.47953125 -213.72867187 483.9590625 -212.55859375 484.453125 C-166.45230384 503.6473276 -113.04922114 506.33421506 -66.0625 488.125 C-63.69932313 487.10393917 -61.34516891 486.06176878 -59 485 C-57.64873805 484.42117287 -56.29716258 483.84307723 -54.9453125 483.265625 C-36.87201051 475.35334032 -15.51439117 463.69376054 -7.625 444.6875 C-6.23861212 436.50781149 -7.30923154 428.90899331 -12 422 C-15.78006204 416.99967521 -19.59482757 413.24310346 -25 410 C-25.84498047 409.37931641 -25.84498047 409.37931641 -26.70703125 408.74609375 C-39.74845449 399.30585247 -55.43098238 393.79178019 -70.59179688 388.79980469 C-72.8874013 388.03739592 -75.17098743 387.24700731 -77.453125 386.4453125 C-94.46665541 380.5215192 -111.97492709 376.24400154 -129.58813477 372.51586914 C-131.42643526 372.12267864 -133.26247165 371.71888686 -135.09741211 371.31030273 C-143.83687428 369.38482551 -152.59916928 367.83348946 -161.4375 366.4375 C-163.37206055 366.12522461 -163.37206055 366.12522461 -165.34570312 365.80664062 C-174.21378779 364.39005625 -183.09361855 363.14600372 -192 362 C-192 361.01 -192 360.02 -192 359 C-174.93963303 359.24208307 -157.87928634 359.48554849 -140.81896019 359.73049068 C-132.89054582 359.84429281 -124.96212626 359.95770164 -117.03369141 360.07006836 C-107.84275483 360.20037598 -98.65183887 360.33207676 -89.4609375 360.46484375 C-88.70015616 360.47580755 -87.93937483 360.48677135 -87.15553951 360.49806738 C-67.8765974 360.77615397 -48.59910296 361.09006679 -29.32185745 361.47047615 C-3.01784746 361.98873757 23.28473973 362.25424325 49.59298706 362.44555664 C62.43835546 362.5390792 75.28362534 362.64526654 88.12890625 362.75 C89.4088553 362.76035782 90.68880436 362.77071564 92.00753975 362.78138733 C124.73477588 363.04668073 157.46095613 363.38671159 190.18638611 363.82156372 C198.45325137 363.93116943 206.72007292 364.0313398 214.98725033 364.11433029 C220.94016887 364.17467005 226.89280754 364.24914014 232.8454895 364.32983398 C235.19819474 364.35941695 237.55096674 364.38417571 239.90377808 364.40356445 C243.03906095 364.43013636 246.17359396 364.47440242 249.30859375 364.5234375 C250.20195435 364.52665009 251.09531494 364.52986267 252.01574707 364.53317261 C257.39856495 364.64128791 261.2242674 365.45955875 266 368 C267.70091875 370.21858967 267.95238868 371.69052639 268.375 374.4375 C267.86233872 377.94068541 266.47871818 379.52128182 264 382 C261.14387256 382.97054331 258.50107568 383.12186828 255.5 383.140625 C237.48314124 383.46327056 220.98389724 386.36246221 205 395 C203.73542969 395.65742187 203.73542969 395.65742187 202.4453125 396.328125 C179.13021457 409.28923376 166.78509512 430.60877584 154.37109375 453.22924805 C148.12930001 464.59791958 141.71783758 475.56523937 134 486 C133.51966309 486.66 133.03932617 487.32 132.54443359 488 C126.16026194 496.76967189 119.50449706 505.24579868 112.37329102 513.421875 C111.40855875 514.53050244 110.45135077 515.64570077 109.49975586 516.765625 C104.77542249 522.27443144 99.74056099 527.44563145 94.60961914 532.57568359 C93.16718144 534.02034996 91.73298435 535.47289854 90.29882812 536.92578125 C88.93467773 538.29283203 88.93467773 538.29283203 87.54296875 539.6875 C86.71821045 540.51636719 85.89345215 541.34523438 85.04370117 542.19921875 C83 544 83 544 81 544 C81 544.66 81 545.32 81 546 C68.9840536 557.56601008 53.95203579 566.95219487 40 576 C39.09121094 576.60328125 38.18242188 577.2065625 37.24609375 577.828125 C31.76658773 581.41357702 26.21191334 584.50545563 20.31640625 587.3515625 C17.94737407 588.52910264 15.64571165 589.73445795 13.33984375 591.0234375 C1.87345416 597.39507428 -10.03038028 602.27948577 -22.27587891 606.95751953 C-24.44496308 607.78759566 -26.60489965 608.63496421 -28.76171875 609.49609375 C-50.30974428 617.74220139 -73.86861575 622.64622575 -96.75 625.1875 C-97.52223907 625.27371613 -98.29447815 625.35993225 -99.09011841 625.44876099 C-125.94408589 628.37463847 -152.22105241 627.52049032 -179 624 C-179.94004883 623.88253418 -180.88009766 623.76506836 -181.84863281 623.64404297 C-231.68341913 617.35750272 -278.44029652 597.7658453 -320 570 C-320.92425781 569.38382813 -321.84851563 568.76765625 -322.80078125 568.1328125 C-333.85919468 560.5674822 -344.14703878 552.06335109 -354 543 C-355.41207844 541.74481917 -356.8284912 540.49449073 -358.25 539.25 C-358.89324219 538.68667969 -359.53648437 538.12335937 -360.19921875 537.54296875 C-361.78999235 536.17994148 -363.42343723 534.86706017 -365.0625 533.5625 C-368.10505563 530.90835573 -370.62166258 528.08480873 -373.23046875 525.015625 C-374.83077503 523.19275957 -376.48869775 521.53961978 -378.25 519.875 C-383.20730242 514.99515543 -387.30767706 509.37557702 -391.54296875 503.87597656 C-392.98029226 502.02537438 -394.43861788 500.19381589 -395.90625 498.3671875 C-401.41672544 491.49483608 -406.44046932 484.55337566 -411 477 C-412.37430079 474.77040219 -413.74932368 472.54124935 -415.125 470.3125 C-415.79789063 469.21164062 -416.47078125 468.11078125 -417.1640625 466.9765625 C-418.57625843 464.68700229 -420.0243424 462.4356495 -421.5 460.1875 C-436.90389769 435.53092552 -447.26413521 406.07933033 -454 378 C-454.22139648 377.08911621 -454.44279297 376.17823242 -454.67089844 375.23974609 C-460.44738189 351.00141796 -463.8098876 325.9249354 -463 301 C-464.21362213 301.0104686 -465.42724426 301.02093719 -466.67764282 301.03172302 C-477.87407841 301.09810038 -489.00490254 300.81780458 -500.18492508 300.23461723 C-518.06717644 299.31075482 -535.95266072 298.67532138 -553.8515625 298.18359375 C-554.9869622 298.15226978 -556.12236191 298.12094582 -557.29216766 298.08867264 C-564.2312066 297.89827166 -571.17038034 297.7132298 -578.10961914 297.53027344 C-587.49793899 297.2825089 -596.88612916 297.0301319 -606.27421188 296.77354622 C-609.49204809 296.68655439 -612.70995627 296.60280548 -615.92788696 296.51939392 C-627.63337202 296.20732084 -639.31294993 295.7305766 -651 295 C-651 294.34 -651 293.68 -651 293 C-647.26788977 291.75596326 -643.78316281 291.83133129 -639.89428711 291.81054688 C-638.64620569 291.79807718 -638.64620569 291.79807718 -637.3729105 291.78535557 C-634.59107611 291.75864525 -631.8092337 291.73876882 -629.02734375 291.71875 C-627.05822324 291.70094416 -625.08910701 291.68265953 -623.11999512 291.66392517 C-618.91618657 291.62471772 -614.71236708 291.58831685 -610.5085144 291.5541687 C-600.62843159 291.47370501 -590.74847797 291.37938452 -580.86851692 291.28530693 C-578.65935492 291.26432422 -576.45019123 291.24351841 -574.24102592 291.22288704 C-551.699903 291.01204131 -529.16157638 290.68837798 -506.62280273 290.3046875 C-492.08021035 290.06158667 -477.54466498 289.93917051 -463 290 C-463.02392822 289.19892822 -463.04785645 288.39785645 -463.07250977 287.57250977 C-463.23685879 277.53725862 -462.27784296 267.86796153 -460.9375 257.9375 C-460.82740601 257.11051605 -460.71731201 256.2835321 -460.60388184 255.43148804 C-451.80786134 190.21780463 -423.21981592 128.7489231 -379 80 C-378.46036621 79.40396973 -377.92073242 78.80793945 -377.36474609 78.19384766 C-373.94530852 74.4290949 -370.50856591 70.68197919 -367 67 C-366.46874512 66.43812988 -365.93749023 65.87625977 -365.39013672 65.29736328 C-363.96690655 63.82501163 -362.48719596 62.40771151 -361 61 C-360.34 61 -359.68 61 -359 61 C-359 60.34 -359 59.68 -359 59 C-357.3203125 57.2734375 -357.3203125 57.2734375 -355.125 55.375 C-354.40570313 54.74335938 -353.68640625 54.11171875 -352.9453125 53.4609375 C-351 52 -351 52 -349 52 C-349 51.34 -349 50.68 -349 50 C-346.86956389 48.16878244 -344.73240909 46.44881162 -342.5 44.75 C-341.85361572 44.25129395 -341.20723145 43.75258789 -340.54125977 43.23876953 C-338.69861779 41.81992826 -336.84988012 40.40938175 -335 39 C-333.88431641 38.13761719 -333.88431641 38.13761719 -332.74609375 37.2578125 C-330.85079942 35.80871057 -328.93326669 34.39806857 -327 33 C-326.11957031 32.360625 -325.23914063 31.72125 -324.33203125 31.0625 C-294.20508548 9.67962341 -260.54434815 -6.88838167 -225 -17 C-224.28102539 -17.21317871 -223.56205078 -17.42635742 -222.82128906 -17.64599609 C-207.81351426 -22.08269882 -192.45887415 -24.67633728 -177 -27 C-176.10684082 -27.13567383 -175.21368164 -27.27134766 -174.29345703 -27.41113281 C-115.79417589 -35.81042293 -53.22637909 -24.81181726 0 0 Z " fill="#FDFDFD" transform="translate(739,332)"/> 4 + <path d="" fill="#FFFFFF" transform="translate(0,0)"/> 5 + </svg>