ChenyuRabbitLove commited on
Commit
e0d6b69
Β·
1 Parent(s): c6f90aa

chore: rearrange the folder structure and add shadcn/ui to manage the ui comp

Browse files
.gitignore CHANGED
@@ -48,3 +48,6 @@ env/
48
  venv/
49
  .env
50
  node_modules
 
 
 
 
48
  venv/
49
  .env
50
  node_modules
51
+
52
+ # local files
53
+ /local_files
app/components/ThemeProvider.tsx DELETED
@@ -1,46 +0,0 @@
1
- 'use client'
2
-
3
- import { createContext, useContext, useEffect, useState } from 'react'
4
-
5
- type Theme = 'light' | 'dark'
6
-
7
- type ThemeContextType = {
8
- theme: Theme
9
- toggleTheme: () => void
10
- }
11
-
12
- const ThemeContext = createContext<ThemeContextType | undefined>(undefined)
13
-
14
- export function ThemeProvider({ children }: { children: React.ReactNode }) {
15
- const [theme, setTheme] = useState<Theme>('light')
16
-
17
- useEffect(() => {
18
- // On mount, read theme from localStorage or default to light
19
- const savedTheme = localStorage.getItem('theme') as Theme
20
- if (savedTheme) {
21
- setTheme(savedTheme)
22
- document.documentElement.setAttribute('data-theme', savedTheme)
23
- }
24
- }, [])
25
-
26
- const toggleTheme = () => {
27
- const newTheme = theme === 'light' ? 'dark' : 'light'
28
- setTheme(newTheme)
29
- localStorage.setItem('theme', newTheme)
30
- document.documentElement.setAttribute('data-theme', newTheme)
31
- }
32
-
33
- return (
34
- <ThemeContext.Provider value={{ theme, toggleTheme }}>
35
- {children}
36
- </ThemeContext.Provider>
37
- )
38
- }
39
-
40
- export function useTheme() {
41
- const context = useContext(ThemeContext)
42
- if (context === undefined) {
43
- throw new Error('useTheme must be used within a ThemeProvider')
44
- }
45
- return context
46
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/for-students/components/ChatBotCard.tsx DELETED
@@ -1,36 +0,0 @@
1
- interface ChatBotCardProps {
2
- chatbot: {
3
- id: string
4
- title: string
5
- description: string
6
- subject: string
7
- icon: string
8
- author?: string
9
- }
10
- }
11
-
12
- export default function ChatBotCard({ chatbot }: ChatBotCardProps) {
13
- return (
14
- <div className="group relative overflow-hidden rounded-2xl border border-border/50 bg-background-primary/50 p-6 shadow-sm transition-all hover:shadow-md backdrop-blur-sm">
15
- <div className="mb-4 flex items-center justify-between">
16
- <div className="flex items-center gap-3">
17
- <span className="text-3xl">{chatbot.icon}</span>
18
- <h3 className="text-xl font-semibold text-text-primary">{chatbot.title}</h3>
19
- </div>
20
- <span className="rounded-full bg-background-secondary/50 px-3 py-1 text-sm text-text-secondary">
21
- {chatbot.subject}
22
- </span>
23
- </div>
24
-
25
- <p className="mb-4 text-text-secondary">{chatbot.description}</p>
26
-
27
- {chatbot.author && (
28
- <p className="text-sm text-text-secondary">δ½œθ€…οΌš{chatbot.author}</p>
29
- )}
30
-
31
- <button className="mt-4 w-full rounded-xl bg-primary px-4 py-2 text-white transition-colors hover:bg-primary/90">
32
- 開始對話
33
- </button>
34
- </div>
35
- )
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/for-students/page.tsx CHANGED
@@ -1,8 +1,8 @@
1
  import { Suspense } from 'react'
2
- import ChatBotGrid from './components/ChatBotGrid'
3
- import SubjectFilter from './components/SubjectFilter'
4
- import SearchBar from './components/SearchBar'
5
- import ChatBotGridSkeleton from './components/ChatBotGridSkeleton'
6
 
7
  export default function ForStudentsPage() {
8
  return (
@@ -33,4 +33,4 @@ export default function ForStudentsPage() {
33
  </div>
34
  </main>
35
  )
36
- }
 
1
  import { Suspense } from 'react'
2
+ import ChatBotGrid from '@/components/custom/ChatBotGrid'
3
+ import SubjectFilter from '@/components/custom/SubjectFilter'
4
+ import SearchBar from '@/components/custom/SearchBar'
5
+ import ChatBotGridSkeleton from '@/components/custom/ChatBotGridSkeleton'
6
 
7
  export default function ForStudentsPage() {
8
  return (
 
33
  </div>
34
  </main>
35
  )
36
+ }
app/globals.css CHANGED
@@ -2,48 +2,68 @@
2
  @tailwind components;
3
  @tailwind utilities;
4
 
5
- :root {
6
- /* Light mode */
7
- --background-primary: #ffffff;
8
- --background-secondary: #f8f9fa;
9
- --background-tertiary: #f1f3f5;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- --text-primary: #171717;
12
- --text-secondary: #4b5563;
13
- --text-tertiary: #6b7280;
14
-
15
- --border: #e5e7eb;
16
- --border-secondary: #d1d5db;
17
-
18
- --card-background: rgba(255, 255, 255, 0.8);
19
- --card-border: rgba(229, 231, 235, 0.5);
20
- --glass-background: rgba(255, 255, 255, 0.7);
21
- }
22
-
23
- [data-theme='dark'] {
24
- /* Dark mode - updated for better contrast and aesthetics */
25
- --background-primary: #0f172a; /* Darker blue-gray */
26
- --background-secondary: #1e293b; /* Rich blue-gray */
27
- --background-tertiary: #334155; /* Medium blue-gray */
28
-
29
- --text-primary: #f8fafc; /* Very light blue-gray */
30
- --text-secondary: #cbd5e1; /* Light blue-gray */
31
- --text-tertiary: #94a3b8; /* Medium blue-gray */
32
-
33
- --border: #334155; /* Medium blue-gray */
34
- --border-secondary: #475569; /* Light blue-gray */
35
-
36
- --card-background: rgba(30, 41, 59, 0.8); /* Transparent blue-gray */
37
- --card-border: rgba(51, 65, 85, 0.5); /* Transparent border */
38
- --glass-background: rgba(15, 23, 42, 0.7); /* Transparent dark blue-gray */
39
- }
40
-
41
- body {
42
- color: var(--text-primary);
43
- background: var(--background-primary);
44
  }
45
 
46
- /* Add smooth transitions for theme switching */
47
- body * {
48
- transition: background-color 0.3s ease, border-color 0.3s ease;
 
 
 
 
49
  }
 
2
  @tailwind components;
3
  @tailwind utilities;
4
 
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 20 14.3% 4.1%;
9
+ --card: 0 0% 100%;
10
+ --card-foreground: 20 14.3% 4.1%;
11
+ --popover: 0 0% 100%;
12
+ --popover-foreground: 20 14.3% 4.1%;
13
+ --primary: 24.6 95% 53.1%;
14
+ --primary-foreground: 60 9.1% 97.8%;
15
+ --secondary: 60 4.8% 95.9%;
16
+ --secondary-foreground: 24 9.8% 10%;
17
+ --muted: 60 4.8% 95.9%;
18
+ --muted-foreground: 25 5.3% 44.7%;
19
+ --accent: 60 4.8% 95.9%;
20
+ --accent-foreground: 24 9.8% 10%;
21
+ --destructive: 0 84.2% 60.2%;
22
+ --destructive-foreground: 60 9.1% 97.8%;
23
+ --border: 20 5.9% 90%;
24
+ --input: 20 5.9% 90%;
25
+ --ring: 24.6 95% 53.1%;
26
+ --radius: 1rem;
27
+ --chart-1: 12 76% 61%;
28
+ --chart-2: 173 58% 39%;
29
+ --chart-3: 197 37% 24%;
30
+ --chart-4: 43 74% 66%;
31
+ --chart-5: 27 87% 67%;
32
+ }
33
 
34
+ .dark {
35
+ --background: 20 14.3% 4.1%;
36
+ --foreground: 60 9.1% 97.8%;
37
+ --card: 20 14.3% 4.1%;
38
+ --card-foreground: 60 9.1% 97.8%;
39
+ --popover: 20 14.3% 4.1%;
40
+ --popover-foreground: 60 9.1% 97.8%;
41
+ --primary: 20.5 90.2% 48.2%;
42
+ --primary-foreground: 60 9.1% 97.8%;
43
+ --secondary: 12 6.5% 15.1%;
44
+ --secondary-foreground: 60 9.1% 97.8%;
45
+ --muted: 12 6.5% 15.1%;
46
+ --muted-foreground: 24 5.4% 63.9%;
47
+ --accent: 12 6.5% 15.1%;
48
+ --accent-foreground: 60 9.1% 97.8%;
49
+ --destructive: 0 72.2% 50.6%;
50
+ --destructive-foreground: 60 9.1% 97.8%;
51
+ --border: 12 6.5% 15.1%;
52
+ --input: 12 6.5% 15.1%;
53
+ --ring: 20.5 90.2% 48.2%;
54
+ --chart-1: 220 70% 50%;
55
+ --chart-2: 160 60% 45%;
56
+ --chart-3: 30 80% 55%;
57
+ --chart-4: 280 65% 60%;
58
+ --chart-5: 340 75% 55%;
59
+ }
 
 
 
 
 
 
 
60
  }
61
 
62
+ @layer base {
63
+ * {
64
+ @apply border-border;
65
+ }
66
+ body {
67
+ @apply bg-background text-foreground;
68
+ }
69
  }
app/layout.tsx CHANGED
@@ -1,8 +1,8 @@
1
  import type { Metadata } from "next";
2
  import localFont from "next/font/local";
3
  import "./globals.css";
4
- import { ThemeProvider } from './components/ThemeProvider'
5
- import { TopNav } from './components/TopNav'
6
 
7
  const geistSans = localFont({
8
  src: "./fonts/GeistVF.woff",
@@ -21,9 +21,14 @@ export default function RootLayout({
21
  children: React.ReactNode
22
  }) {
23
  return (
24
- <html lang="en" className={`${geistSans.variable}`}>
25
  <body className="antialiased">
26
- <ThemeProvider>
 
 
 
 
 
27
  <TopNav />
28
  <main className="pt-14">
29
  {children}
 
1
  import type { Metadata } from "next";
2
  import localFont from "next/font/local";
3
  import "./globals.css";
4
+ import { ThemeProvider } from '@/components/custom/theme-provider'
5
+ import { TopNav } from '../components/custom/top-nav'
6
 
7
  const geistSans = localFont({
8
  src: "./fonts/GeistVF.woff",
 
21
  children: React.ReactNode
22
  }) {
23
  return (
24
+ <html lang="en" suppressHydrationWarning className={`${geistSans.variable}`}>
25
  <body className="antialiased">
26
+ <ThemeProvider
27
+ attribute="class"
28
+ defaultTheme="system"
29
+ enableSystem
30
+ disableTransitionOnChange
31
+ >
32
  <TopNav />
33
  <main className="pt-14">
34
  {children}
app/page.tsx CHANGED
@@ -1,7 +1,7 @@
1
  'use client'
2
 
3
  import Link from "next/link"
4
- import ChatBot from './components/LandingPageChatBot'
5
 
6
  export default function LandingPage() {
7
  return (
 
1
  'use client'
2
 
3
  import Link from "next/link"
4
+ import ChatBot from '@/components/custom/LandingPageChatBot'
5
 
6
  export default function LandingPage() {
7
  return (
components.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "tailwind.config.ts",
8
+ "css": "app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils",
16
+ "ui": "@/components/ui",
17
+ "lib": "@/lib",
18
+ "hooks": "@/hooks"
19
+ },
20
+ "iconLibrary": "lucide"
21
+ }
components/custom/ChatBotCard.tsx ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Card, CardHeader, CardContent, CardFooter } from "@/components/ui/card"
2
+
3
+ interface ChatBotCardProps {
4
+ chatbot: {
5
+ id: string
6
+ title: string
7
+ description: string
8
+ subject: string
9
+ icon: string
10
+ author?: string
11
+ }
12
+ }
13
+
14
+ export default function ChatBotCard({ chatbot }: ChatBotCardProps) {
15
+ return (
16
+ <Card className="group relative overflow-hidden bg-background-primary/50 shadow-sm transition-all hover:shadow-md backdrop-blur-sm">
17
+ <CardHeader className="space-y-0">
18
+ <div className="flex items-center justify-between">
19
+ <div className="flex items-center gap-3">
20
+ <span className="text-3xl">{chatbot.icon}</span>
21
+ <h3 className="text-xl font-semibold text-text-primary">{chatbot.title}</h3>
22
+ </div>
23
+ <span className="rounded-full bg-background-secondary/50 px-3 py-1 text-sm text-text-secondary">
24
+ {chatbot.subject}
25
+ </span>
26
+ </div>
27
+ </CardHeader>
28
+
29
+ <CardContent>
30
+ <p className="text-text-secondary">{chatbot.description}</p>
31
+ {chatbot.author && (
32
+ <p className="mt-2 text-sm text-text-secondary">δ½œθ€…οΌš{chatbot.author}</p>
33
+ )}
34
+ </CardContent>
35
+
36
+ <CardFooter>
37
+ <button className="w-full rounded-xl bg-primary px-4 py-2 text-white transition-colors hover:bg-primary/90">
38
+ 開始對話
39
+ </button>
40
+ </CardFooter>
41
+ </Card>
42
+ )
43
+ }
{app/for-students/components β†’ components/custom}/ChatBotGrid.tsx RENAMED
File without changes
{app/for-students/components β†’ components/custom}/ChatBotGridSkeleton.tsx RENAMED
File without changes
{app/components β†’ components/custom}/LandingPageChatBot.tsx RENAMED
File without changes
{app/for-students/components β†’ components/custom}/SearchBar.tsx RENAMED
File without changes
{app/for-students/components β†’ components/custom}/SubjectFilter.tsx RENAMED
File without changes
components/custom/theme-provider.tsx ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { ThemeProvider as NextThemesProvider } from "next-themes"
5
+
6
+ export function ThemeProvider({
7
+ children,
8
+ ...props
9
+ }: React.ComponentProps<typeof NextThemesProvider>) {
10
+ const [mounted, setMounted] = React.useState(false)
11
+
12
+ // Prevent hydration mismatch by only rendering after mount
13
+ React.useEffect(() => {
14
+ setMounted(true)
15
+ }, [])
16
+
17
+ if (!mounted) {
18
+ return null
19
+ }
20
+
21
+ return <NextThemesProvider {...props}>{children}</NextThemesProvider>
22
+ }
app/components/TopNav.tsx β†’ components/custom/top-nav.tsx RENAMED
@@ -1,10 +1,53 @@
1
  'use client'
2
 
 
 
 
3
  import Link from 'next/link'
4
- import { useTheme } from './ThemeProvider'
 
 
 
 
 
 
5
 
6
  export function TopNav() {
7
- const { theme, toggleTheme } = useTheme()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  return (
10
  <header className="fixed w-full bg-background-secondary/80 backdrop-blur-sm border-b border-border z-50">
@@ -27,13 +70,27 @@ export function TopNav() {
27
  ζˆ‘ζ˜―ε­Έη”Ÿ
28
  </Link>
29
  </nav>
30
- <button
31
- onClick={toggleTheme}
32
- className="px-4 py-2 rounded-lg bg-primary text-white hover:bg-primary/90"
33
- >
34
- {theme === 'light' ? 'πŸŒ™' : 'β˜€οΈ'}
35
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  </div>
37
  </header>
38
  )
39
- }
 
1
  'use client'
2
 
3
+ import * as React from 'react'
4
+ import { Moon, Sun } from "lucide-react"
5
+ import { useTheme } from "next-themes"
6
  import Link from 'next/link'
7
+ import { Button } from "@/components/ui/button"
8
+ import {
9
+ DropdownMenu,
10
+ DropdownMenuContent,
11
+ DropdownMenuItem,
12
+ DropdownMenuTrigger,
13
+ } from "@/components/ui/dropdown-menu"
14
 
15
  export function TopNav() {
16
+ const { setTheme } = useTheme()
17
+ const [mounted, setMounted] = React.useState(false)
18
+
19
+ React.useEffect(() => {
20
+ setMounted(true)
21
+ }, [])
22
+
23
+ // Prevent theme toggle from showing before client-side hydration
24
+ if (!mounted) {
25
+ return (
26
+ <header className="fixed w-full bg-background-secondary/80 backdrop-blur-sm border-b border-border z-50">
27
+ <div className="container mx-auto px-4 py-4 flex items-center">
28
+ <Link href="/" className="text-3xl font-bold">
29
+ <span className="text-[#FF6B6B]">P</span>
30
+ <span className="text-[#4ECDC4]">l</span>
31
+ <span className="text-[#45B7D1]">a</span>
32
+ <span className="text-[#FDCB6E]">y</span>
33
+ <span className="text-[#FF6B6B]">G</span>
34
+ <span className="text-[#4ECDC4]">o</span>
35
+ <span className="ml-2 text-[#45B7D1]">A</span>
36
+ <span className="text-[#FDCB6E]">I</span>
37
+ </Link>
38
+ <nav className="flex items-center justify-center flex-1 space-x-8">
39
+ <Link href="/for-teachers" className="text-text-secondary hover:text-primary">
40
+ ζˆ‘ζ˜―θ€εΈ«
41
+ </Link>
42
+ <Link href="/for-students" className="text-text-secondary hover:text-primary">
43
+ ζˆ‘ζ˜―ε­Έη”Ÿ
44
+ </Link>
45
+ </nav>
46
+ <div className="w-9 h-9" /> {/* Placeholder for theme toggle */}
47
+ </div>
48
+ </header>
49
+ )
50
+ }
51
 
52
  return (
53
  <header className="fixed w-full bg-background-secondary/80 backdrop-blur-sm border-b border-border z-50">
 
70
  ζˆ‘ζ˜―ε­Έη”Ÿ
71
  </Link>
72
  </nav>
73
+ <DropdownMenu>
74
+ <DropdownMenuTrigger asChild>
75
+ <Button>
76
+ <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
77
+ <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
78
+ <span className="sr-only">Toggle theme</span>
79
+ </Button>
80
+ </DropdownMenuTrigger>
81
+ <DropdownMenuContent align="end">
82
+ <DropdownMenuItem onClick={() => setTheme("light")}>
83
+ Light
84
+ </DropdownMenuItem>
85
+ <DropdownMenuItem onClick={() => setTheme("dark")}>
86
+ Dark
87
+ </DropdownMenuItem>
88
+ <DropdownMenuItem onClick={() => setTheme("system")}>
89
+ System
90
+ </DropdownMenuItem>
91
+ </DropdownMenuContent>
92
+ </DropdownMenu>
93
  </div>
94
  </header>
95
  )
96
+ }
components/ui/button.tsx ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { Slot } from "@radix-ui/react-slot"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default:
13
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
14
+ destructive:
15
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
16
+ outline:
17
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
18
+ secondary:
19
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
20
+ ghost: "hover:bg-accent hover:text-accent-foreground",
21
+ link: "text-primary underline-offset-4 hover:underline",
22
+ },
23
+ size: {
24
+ default: "h-9 px-4 py-2",
25
+ sm: "h-8 rounded-md px-3 text-xs",
26
+ lg: "h-10 rounded-md px-8",
27
+ icon: "h-9 w-9",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ size: "default",
33
+ },
34
+ }
35
+ )
36
+
37
+ export interface ButtonProps
38
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
39
+ VariantProps<typeof buttonVariants> {
40
+ asChild?: boolean
41
+ }
42
+
43
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
44
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
45
+ const Comp = asChild ? Slot : "button"
46
+ return (
47
+ <Comp
48
+ className={cn(buttonVariants({ variant, size, className }))}
49
+ ref={ref}
50
+ {...props}
51
+ />
52
+ )
53
+ }
54
+ )
55
+ Button.displayName = "Button"
56
+
57
+ export { Button, buttonVariants }
components/ui/card.tsx ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ const Card = React.forwardRef<
6
+ HTMLDivElement,
7
+ React.HTMLAttributes<HTMLDivElement>
8
+ >(({ className, ...props }, ref) => (
9
+ <div
10
+ ref={ref}
11
+ className={cn(
12
+ "rounded-xl border bg-card text-card-foreground shadow",
13
+ className
14
+ )}
15
+ {...props}
16
+ />
17
+ ))
18
+ Card.displayName = "Card"
19
+
20
+ const CardHeader = React.forwardRef<
21
+ HTMLDivElement,
22
+ React.HTMLAttributes<HTMLDivElement>
23
+ >(({ className, ...props }, ref) => (
24
+ <div
25
+ ref={ref}
26
+ className={cn("flex flex-col space-y-1.5 p-6", className)}
27
+ {...props}
28
+ />
29
+ ))
30
+ CardHeader.displayName = "CardHeader"
31
+
32
+ const CardTitle = React.forwardRef<
33
+ HTMLDivElement,
34
+ React.HTMLAttributes<HTMLDivElement>
35
+ >(({ className, ...props }, ref) => (
36
+ <div
37
+ ref={ref}
38
+ className={cn("font-semibold leading-none tracking-tight", className)}
39
+ {...props}
40
+ />
41
+ ))
42
+ CardTitle.displayName = "CardTitle"
43
+
44
+ const CardDescription = React.forwardRef<
45
+ HTMLDivElement,
46
+ React.HTMLAttributes<HTMLDivElement>
47
+ >(({ className, ...props }, ref) => (
48
+ <div
49
+ ref={ref}
50
+ className={cn("text-sm text-muted-foreground", className)}
51
+ {...props}
52
+ />
53
+ ))
54
+ CardDescription.displayName = "CardDescription"
55
+
56
+ const CardContent = React.forwardRef<
57
+ HTMLDivElement,
58
+ React.HTMLAttributes<HTMLDivElement>
59
+ >(({ className, ...props }, ref) => (
60
+ <div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
61
+ ))
62
+ CardContent.displayName = "CardContent"
63
+
64
+ const CardFooter = React.forwardRef<
65
+ HTMLDivElement,
66
+ React.HTMLAttributes<HTMLDivElement>
67
+ >(({ className, ...props }, ref) => (
68
+ <div
69
+ ref={ref}
70
+ className={cn("flex items-center p-6 pt-0", className)}
71
+ {...props}
72
+ />
73
+ ))
74
+ CardFooter.displayName = "CardFooter"
75
+
76
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
components/ui/dropdown-menu.tsx ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
5
+ import { Check, ChevronRight, Circle } from "lucide-react"
6
+
7
+ import { cn } from "@/lib/utils"
8
+
9
+ const DropdownMenu = DropdownMenuPrimitive.Root
10
+
11
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
12
+
13
+ const DropdownMenuGroup = DropdownMenuPrimitive.Group
14
+
15
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal
16
+
17
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub
18
+
19
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
20
+
21
+ const DropdownMenuSubTrigger = React.forwardRef<
22
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
23
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
24
+ inset?: boolean
25
+ }
26
+ >(({ className, inset, children, ...props }, ref) => (
27
+ <DropdownMenuPrimitive.SubTrigger
28
+ ref={ref}
29
+ className={cn(
30
+ "flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
31
+ inset && "pl-8",
32
+ className
33
+ )}
34
+ {...props}
35
+ >
36
+ {children}
37
+ <ChevronRight className="ml-auto" />
38
+ </DropdownMenuPrimitive.SubTrigger>
39
+ ))
40
+ DropdownMenuSubTrigger.displayName =
41
+ DropdownMenuPrimitive.SubTrigger.displayName
42
+
43
+ const DropdownMenuSubContent = React.forwardRef<
44
+ React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
45
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
46
+ >(({ className, ...props }, ref) => (
47
+ <DropdownMenuPrimitive.SubContent
48
+ ref={ref}
49
+ className={cn(
50
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
51
+ className
52
+ )}
53
+ {...props}
54
+ />
55
+ ))
56
+ DropdownMenuSubContent.displayName =
57
+ DropdownMenuPrimitive.SubContent.displayName
58
+
59
+ const DropdownMenuContent = React.forwardRef<
60
+ React.ElementRef<typeof DropdownMenuPrimitive.Content>,
61
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
62
+ >(({ className, sideOffset = 4, ...props }, ref) => (
63
+ <DropdownMenuPrimitive.Portal>
64
+ <DropdownMenuPrimitive.Content
65
+ ref={ref}
66
+ sideOffset={sideOffset}
67
+ className={cn(
68
+ "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
69
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
70
+ className
71
+ )}
72
+ {...props}
73
+ />
74
+ </DropdownMenuPrimitive.Portal>
75
+ ))
76
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
77
+
78
+ const DropdownMenuItem = React.forwardRef<
79
+ React.ElementRef<typeof DropdownMenuPrimitive.Item>,
80
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
81
+ inset?: boolean
82
+ }
83
+ >(({ className, inset, ...props }, ref) => (
84
+ <DropdownMenuPrimitive.Item
85
+ ref={ref}
86
+ className={cn(
87
+ "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",
88
+ inset && "pl-8",
89
+ className
90
+ )}
91
+ {...props}
92
+ />
93
+ ))
94
+ DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
95
+
96
+ const DropdownMenuCheckboxItem = React.forwardRef<
97
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
98
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
99
+ >(({ className, children, checked, ...props }, ref) => (
100
+ <DropdownMenuPrimitive.CheckboxItem
101
+ ref={ref}
102
+ className={cn(
103
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
104
+ className
105
+ )}
106
+ checked={checked}
107
+ {...props}
108
+ >
109
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
110
+ <DropdownMenuPrimitive.ItemIndicator>
111
+ <Check className="h-4 w-4" />
112
+ </DropdownMenuPrimitive.ItemIndicator>
113
+ </span>
114
+ {children}
115
+ </DropdownMenuPrimitive.CheckboxItem>
116
+ ))
117
+ DropdownMenuCheckboxItem.displayName =
118
+ DropdownMenuPrimitive.CheckboxItem.displayName
119
+
120
+ const DropdownMenuRadioItem = React.forwardRef<
121
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
122
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
123
+ >(({ className, children, ...props }, ref) => (
124
+ <DropdownMenuPrimitive.RadioItem
125
+ ref={ref}
126
+ className={cn(
127
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
128
+ className
129
+ )}
130
+ {...props}
131
+ >
132
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
133
+ <DropdownMenuPrimitive.ItemIndicator>
134
+ <Circle className="h-2 w-2 fill-current" />
135
+ </DropdownMenuPrimitive.ItemIndicator>
136
+ </span>
137
+ {children}
138
+ </DropdownMenuPrimitive.RadioItem>
139
+ ))
140
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
141
+
142
+ const DropdownMenuLabel = React.forwardRef<
143
+ React.ElementRef<typeof DropdownMenuPrimitive.Label>,
144
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
145
+ inset?: boolean
146
+ }
147
+ >(({ className, inset, ...props }, ref) => (
148
+ <DropdownMenuPrimitive.Label
149
+ ref={ref}
150
+ className={cn(
151
+ "px-2 py-1.5 text-sm font-semibold",
152
+ inset && "pl-8",
153
+ className
154
+ )}
155
+ {...props}
156
+ />
157
+ ))
158
+ DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
159
+
160
+ const DropdownMenuSeparator = React.forwardRef<
161
+ React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
162
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
163
+ >(({ className, ...props }, ref) => (
164
+ <DropdownMenuPrimitive.Separator
165
+ ref={ref}
166
+ className={cn("-mx-1 my-1 h-px bg-muted", className)}
167
+ {...props}
168
+ />
169
+ ))
170
+ DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
171
+
172
+ const DropdownMenuShortcut = ({
173
+ className,
174
+ ...props
175
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
176
+ return (
177
+ <span
178
+ className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
179
+ {...props}
180
+ />
181
+ )
182
+ }
183
+ DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
184
+
185
+ export {
186
+ DropdownMenu,
187
+ DropdownMenuTrigger,
188
+ DropdownMenuContent,
189
+ DropdownMenuItem,
190
+ DropdownMenuCheckboxItem,
191
+ DropdownMenuRadioItem,
192
+ DropdownMenuLabel,
193
+ DropdownMenuSeparator,
194
+ DropdownMenuShortcut,
195
+ DropdownMenuGroup,
196
+ DropdownMenuPortal,
197
+ DropdownMenuSub,
198
+ DropdownMenuSubContent,
199
+ DropdownMenuSubTrigger,
200
+ DropdownMenuRadioGroup,
201
+ }
lib/utils.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
package.json CHANGED
@@ -10,10 +10,18 @@
10
  },
11
  "dependencies": {
12
  "@heroicons/react": "^2.1.5",
 
 
13
  "ai": "^3.4.31",
 
 
 
14
  "next": "15.0.2",
 
15
  "react": "19.0.0-rc-02c0e824-20241028",
16
  "react-dom": "19.0.0-rc-02c0e824-20241028",
 
 
17
  "zod": "^3.23.8"
18
  },
19
  "devDependencies": {
 
10
  },
11
  "dependencies": {
12
  "@heroicons/react": "^2.1.5",
13
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
14
+ "@radix-ui/react-slot": "^1.1.0",
15
  "ai": "^3.4.31",
16
+ "class-variance-authority": "^0.7.0",
17
+ "clsx": "^2.1.1",
18
+ "lucide-react": "^0.456.0",
19
  "next": "15.0.2",
20
+ "next-themes": "^0.4.3",
21
  "react": "19.0.0-rc-02c0e824-20241028",
22
  "react-dom": "19.0.0-rc-02c0e824-20241028",
23
+ "tailwind-merge": "^2.5.4",
24
+ "tailwindcss-animate": "^1.0.7",
25
  "zod": "^3.23.8"
26
  },
27
  "devDependencies": {
pnpm-lock.yaml CHANGED
@@ -11,18 +11,42 @@ importers:
11
  '@heroicons/react':
12
  specifier: ^2.1.5
13
  version: 2.1.5([email protected])
 
 
 
 
 
 
14
  ai:
15
  specifier: ^3.4.31
16
 
 
 
 
 
 
 
 
 
17
  next:
18
  specifier: 15.0.2
19
 
 
 
20
  react:
21
  specifier: 19.0.0-rc-02c0e824-20241028
22
  version: 19.0.0-rc-02c0e824-20241028
23
  react-dom:
24
  specifier: 19.0.0-rc-02c0e824-20241028
25
  version: 19.0.0-rc-02c0e824-20241028([email protected])
 
 
 
 
 
 
26
  zod:
27
  specifier: ^3.23.8
28
  version: 3.23.8
@@ -164,6 +188,21 @@ packages:
164
  resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
165
  engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  '@heroicons/[email protected]':
168
  resolution: {integrity: sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==}
169
  peerDependencies:
@@ -387,6 +426,272 @@ packages:
387
  resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
388
  engines: {node: '>=14'}
389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
390
  '@rtsao/[email protected]':
391
  resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
392
 
@@ -581,6 +886,10 @@ packages:
581
582
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
583
 
 
 
 
 
584
585
  resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
586
  engines: {node: '>= 0.4'}
@@ -680,9 +989,20 @@ packages:
680
  resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
681
  engines: {node: '>= 8.10.0'}
682
 
 
 
 
683
684
  resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
685
 
 
 
 
 
 
 
 
 
686
687
  resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
688
  engines: {node: '>=7.0.0'}
@@ -763,6 +1083,9 @@ packages:
763
  resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
764
  engines: {node: '>=8'}
765
 
 
 
 
766
767
  resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
768
 
@@ -1021,6 +1344,10 @@ packages:
1021
  resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
1022
  engines: {node: '>= 0.4'}
1023
 
 
 
 
 
1024
1025
  resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
1026
  engines: {node: '>= 0.4'}
@@ -1110,6 +1437,9 @@ packages:
1110
  resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
1111
  engines: {node: '>= 0.4'}
1112
 
 
 
 
1113
1114
  resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
1115
  engines: {node: '>= 0.4'}
@@ -1319,6 +1649,11 @@ packages:
1319
1320
  resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
1321
 
 
 
 
 
 
1322
1323
  resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
1324
 
@@ -1358,6 +1693,12 @@ packages:
1358
1359
  resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1360
 
 
 
 
 
 
 
1361
1362
  resolution: {integrity: sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ==}
1363
  engines: {node: '>=18.18.0'}
@@ -1546,6 +1887,36 @@ packages:
1546
1547
  resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
1548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1549
1550
  resolution: {integrity: sha512-GbZ7hpPHQMiEu53BqEaPQVM/4GG4hARo+mqEEnx4rYporDvNvUjutiAFxYFSbu6sgHwcr7LeFv8htEOwALVA2A==}
1551
  engines: {node: '>=0.10.0'}
@@ -1748,6 +2119,14 @@ packages:
1748
  peerDependencies:
1749
  vue: '>=3.2.26 < 4'
1750
 
 
 
 
 
 
 
 
 
1751
1752
  resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
1753
  engines: {node: '>=14.0.0'}
@@ -1828,6 +2207,26 @@ packages:
1828
1829
  resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1830
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1831
1832
  resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
1833
  peerDependencies:
@@ -2009,6 +2408,23 @@ snapshots:
2009
 
2010
  '@eslint/[email protected]': {}
2011
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2012
2013
  dependencies:
2014
  react: 19.0.0-rc-02c0e824-20241028
@@ -2175,6 +2591,244 @@ snapshots:
2175
  '@pkgjs/[email protected]':
2176
  optional: true
2177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2178
  '@rtsao/[email protected]': {}
2179
 
2180
  '@rushstack/[email protected]': {}
@@ -2411,6 +3065,10 @@ snapshots:
2411
 
2412
2413
 
 
 
 
 
2414
2415
 
2416
@@ -2542,8 +3200,16 @@ snapshots:
2542
  optionalDependencies:
2543
  fsevents: 2.3.3
2544
 
 
 
 
 
2545
2546
 
 
 
 
 
2547
2548
  dependencies:
2549
  color-name: 1.1.4
@@ -2621,6 +3287,8 @@ snapshots:
2621
2622
  optional: true
2623
 
 
 
2624
2625
 
2626
@@ -3033,6 +3701,8 @@ snapshots:
3033
  has-symbols: 1.0.3
3034
  hasown: 2.0.2
3035
 
 
 
3036
3037
  dependencies:
3038
  call-bind: 1.0.7
@@ -3128,6 +3798,10 @@ snapshots:
3128
  hasown: 2.0.2
3129
  side-channel: 1.0.6
3130
 
 
 
 
 
3131
3132
  dependencies:
3133
  call-bind: 1.0.7
@@ -3323,6 +3997,10 @@ snapshots:
3323
 
3324
3325
 
 
 
 
 
3326
3327
  dependencies:
3328
  '@jridgewell/sourcemap-codec': 1.5.0
@@ -3358,6 +4036,11 @@ snapshots:
3358
 
3359
3360
 
 
 
 
 
 
3361
3362
  dependencies:
3363
  '@next/env': 15.0.2
@@ -3538,6 +4221,34 @@ snapshots:
3538
 
3539
3540
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3541
3542
 
3543
@@ -3802,6 +4513,12 @@ snapshots:
3802
  dependencies:
3803
  vue: 3.5.12([email protected])
3804
 
 
 
 
 
 
 
3805
3806
  dependencies:
3807
  '@alloc/quick-lru': 5.2.0
@@ -3915,6 +4632,21 @@ snapshots:
3915
  dependencies:
3916
  punycode: 2.3.1
3917
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3918
3919
  dependencies:
3920
  react: 19.0.0-rc-02c0e824-20241028
 
11
  '@heroicons/react':
12
  specifier: ^2.1.5
13
  version: 2.1.5([email protected])
14
+ '@radix-ui/react-dropdown-menu':
15
+ specifier: ^2.1.2
16
17
+ '@radix-ui/react-slot':
18
+ specifier: ^1.1.0
19
+ version: 1.1.0(@types/[email protected])([email protected])
20
  ai:
21
  specifier: ^3.4.31
22
23
+ class-variance-authority:
24
+ specifier: ^0.7.0
25
+ version: 0.7.0
26
+ clsx:
27
+ specifier: ^2.1.1
28
+ version: 2.1.1
29
+ lucide-react:
30
+ specifier: ^0.456.0
31
+ version: 0.456.0([email protected])
32
  next:
33
  specifier: 15.0.2
34
35
+ next-themes:
36
+ specifier: ^0.4.3
37
38
  react:
39
  specifier: 19.0.0-rc-02c0e824-20241028
40
  version: 19.0.0-rc-02c0e824-20241028
41
  react-dom:
42
  specifier: 19.0.0-rc-02c0e824-20241028
43
  version: 19.0.0-rc-02c0e824-20241028([email protected])
44
+ tailwind-merge:
45
+ specifier: ^2.5.4
46
+ version: 2.5.4
47
+ tailwindcss-animate:
48
+ specifier: ^1.0.7
49
+ version: 1.0.7([email protected])
50
  zod:
51
  specifier: ^3.23.8
52
  version: 3.23.8
 
188
  resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
189
  engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
190
 
191
+ '@floating-ui/[email protected]':
192
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
193
+
194
+ '@floating-ui/[email protected]':
195
+ resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
196
+
197
+ '@floating-ui/[email protected]':
198
+ resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
199
+ peerDependencies:
200
+ react: '>=16.8.0'
201
+ react-dom: '>=16.8.0'
202
+
203
+ '@floating-ui/[email protected]':
204
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
205
+
206
  '@heroicons/[email protected]':
207
  resolution: {integrity: sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==}
208
  peerDependencies:
 
426
  resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
427
  engines: {node: '>=14'}
428
 
429
+ '@radix-ui/[email protected]':
430
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
431
+
432
+ '@radix-ui/[email protected]':
433
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
434
+ peerDependencies:
435
+ '@types/react': '*'
436
+ '@types/react-dom': '*'
437
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
438
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
439
+ peerDependenciesMeta:
440
+ '@types/react':
441
+ optional: true
442
+ '@types/react-dom':
443
+ optional: true
444
+
445
+ '@radix-ui/[email protected]':
446
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
447
+ peerDependencies:
448
+ '@types/react': '*'
449
+ '@types/react-dom': '*'
450
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
451
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
452
+ peerDependenciesMeta:
453
+ '@types/react':
454
+ optional: true
455
+ '@types/react-dom':
456
+ optional: true
457
+
458
+ '@radix-ui/[email protected]':
459
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
460
+ peerDependencies:
461
+ '@types/react': '*'
462
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
463
+ peerDependenciesMeta:
464
+ '@types/react':
465
+ optional: true
466
+
467
+ '@radix-ui/[email protected]':
468
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
469
+ peerDependencies:
470
+ '@types/react': '*'
471
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
472
+ peerDependenciesMeta:
473
+ '@types/react':
474
+ optional: true
475
+
476
+ '@radix-ui/[email protected]':
477
+ resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==}
478
+ peerDependencies:
479
+ '@types/react': '*'
480
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
481
+ peerDependenciesMeta:
482
+ '@types/react':
483
+ optional: true
484
+
485
+ '@radix-ui/[email protected]':
486
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
487
+ peerDependencies:
488
+ '@types/react': '*'
489
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
490
+ peerDependenciesMeta:
491
+ '@types/react':
492
+ optional: true
493
+
494
+ '@radix-ui/[email protected]':
495
+ resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==}
496
+ peerDependencies:
497
+ '@types/react': '*'
498
+ '@types/react-dom': '*'
499
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
500
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
501
+ peerDependenciesMeta:
502
+ '@types/react':
503
+ optional: true
504
+ '@types/react-dom':
505
+ optional: true
506
+
507
+ '@radix-ui/[email protected]':
508
+ resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==}
509
+ peerDependencies:
510
+ '@types/react': '*'
511
+ '@types/react-dom': '*'
512
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
513
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
514
+ peerDependenciesMeta:
515
+ '@types/react':
516
+ optional: true
517
+ '@types/react-dom':
518
+ optional: true
519
+
520
+ '@radix-ui/[email protected]':
521
+ resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
522
+ peerDependencies:
523
+ '@types/react': '*'
524
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
525
+ peerDependenciesMeta:
526
+ '@types/react':
527
+ optional: true
528
+
529
+ '@radix-ui/[email protected]':
530
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
531
+ peerDependencies:
532
+ '@types/react': '*'
533
+ '@types/react-dom': '*'
534
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
535
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
536
+ peerDependenciesMeta:
537
+ '@types/react':
538
+ optional: true
539
+ '@types/react-dom':
540
+ optional: true
541
+
542
+ '@radix-ui/[email protected]':
543
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
544
+ peerDependencies:
545
+ '@types/react': '*'
546
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
547
+ peerDependenciesMeta:
548
+ '@types/react':
549
+ optional: true
550
+
551
+ '@radix-ui/[email protected]':
552
+ resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==}
553
+ peerDependencies:
554
+ '@types/react': '*'
555
+ '@types/react-dom': '*'
556
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
557
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
558
+ peerDependenciesMeta:
559
+ '@types/react':
560
+ optional: true
561
+ '@types/react-dom':
562
+ optional: true
563
+
564
+ '@radix-ui/[email protected]':
565
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
566
+ peerDependencies:
567
+ '@types/react': '*'
568
+ '@types/react-dom': '*'
569
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
570
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
571
+ peerDependenciesMeta:
572
+ '@types/react':
573
+ optional: true
574
+ '@types/react-dom':
575
+ optional: true
576
+
577
+ '@radix-ui/[email protected]':
578
+ resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==}
579
+ peerDependencies:
580
+ '@types/react': '*'
581
+ '@types/react-dom': '*'
582
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
583
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
584
+ peerDependenciesMeta:
585
+ '@types/react':
586
+ optional: true
587
+ '@types/react-dom':
588
+ optional: true
589
+
590
+ '@radix-ui/[email protected]':
591
+ resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==}
592
+ peerDependencies:
593
+ '@types/react': '*'
594
+ '@types/react-dom': '*'
595
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
596
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
597
+ peerDependenciesMeta:
598
+ '@types/react':
599
+ optional: true
600
+ '@types/react-dom':
601
+ optional: true
602
+
603
+ '@radix-ui/[email protected]':
604
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
605
+ peerDependencies:
606
+ '@types/react': '*'
607
+ '@types/react-dom': '*'
608
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
609
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
610
+ peerDependenciesMeta:
611
+ '@types/react':
612
+ optional: true
613
+ '@types/react-dom':
614
+ optional: true
615
+
616
+ '@radix-ui/[email protected]':
617
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
618
+ peerDependencies:
619
+ '@types/react': '*'
620
+ '@types/react-dom': '*'
621
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
622
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
623
+ peerDependenciesMeta:
624
+ '@types/react':
625
+ optional: true
626
+ '@types/react-dom':
627
+ optional: true
628
+
629
+ '@radix-ui/[email protected]':
630
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
631
+ peerDependencies:
632
+ '@types/react': '*'
633
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
634
+ peerDependenciesMeta:
635
+ '@types/react':
636
+ optional: true
637
+
638
+ '@radix-ui/[email protected]':
639
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
640
+ peerDependencies:
641
+ '@types/react': '*'
642
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
643
+ peerDependenciesMeta:
644
+ '@types/react':
645
+ optional: true
646
+
647
+ '@radix-ui/[email protected]':
648
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
649
+ peerDependencies:
650
+ '@types/react': '*'
651
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
652
+ peerDependenciesMeta:
653
+ '@types/react':
654
+ optional: true
655
+
656
+ '@radix-ui/[email protected]':
657
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
658
+ peerDependencies:
659
+ '@types/react': '*'
660
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
661
+ peerDependenciesMeta:
662
+ '@types/react':
663
+ optional: true
664
+
665
+ '@radix-ui/[email protected]':
666
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
667
+ peerDependencies:
668
+ '@types/react': '*'
669
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
670
+ peerDependenciesMeta:
671
+ '@types/react':
672
+ optional: true
673
+
674
+ '@radix-ui/[email protected]':
675
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
676
+ peerDependencies:
677
+ '@types/react': '*'
678
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
679
+ peerDependenciesMeta:
680
+ '@types/react':
681
+ optional: true
682
+
683
+ '@radix-ui/[email protected]':
684
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
685
+ peerDependencies:
686
+ '@types/react': '*'
687
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
688
+ peerDependenciesMeta:
689
+ '@types/react':
690
+ optional: true
691
+
692
+ '@radix-ui/[email protected]':
693
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
694
+
695
  '@rtsao/[email protected]':
696
  resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
697
 
 
886
887
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
888
 
889
890
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
891
+ engines: {node: '>=10'}
892
+
893
894
  resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
895
  engines: {node: '>= 0.4'}
 
989
  resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
990
  engines: {node: '>= 8.10.0'}
991
 
992
993
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
994
+
995
996
  resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
997
 
998
999
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
1000
+ engines: {node: '>=6'}
1001
+
1002
1003
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
1004
+ engines: {node: '>=6'}
1005
+
1006
1007
  resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1008
  engines: {node: '>=7.0.0'}
 
1083
  resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
1084
  engines: {node: '>=8'}
1085
 
1086
1087
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
1088
+
1089
1090
  resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
1091
 
 
1344
  resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
1345
  engines: {node: '>= 0.4'}
1346
 
1347
1348
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
1349
+ engines: {node: '>=6'}
1350
+
1351
1352
  resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
1353
  engines: {node: '>= 0.4'}
 
1437
  resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
1438
  engines: {node: '>= 0.4'}
1439
 
1440
1441
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
1442
+
1443
1444
  resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
1445
  engines: {node: '>= 0.4'}
 
1649
1650
  resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
1651
 
1652
1653
+ resolution: {integrity: sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA==}
1654
+ peerDependencies:
1655
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
1656
+
1657
1658
  resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
1659
 
 
1693
1694
  resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1695
 
1696
1697
+ resolution: {integrity: sha512-nG84VPkTdUHR2YeD89YchvV4I9RbiMAql3GiLEQlPvq1ioaqPaIReK+yMRdg/zgiXws620qS1rU30TiWmmG9lA==}
1698
+ peerDependencies:
1699
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
1700
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
1701
+
1702
1703
  resolution: {integrity: sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ==}
1704
  engines: {node: '>=18.18.0'}
 
1887
1888
  resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
1889
 
1890
1891
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
1892
+ engines: {node: '>=10'}
1893
+ peerDependencies:
1894
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
1895
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
1896
+ peerDependenciesMeta:
1897
+ '@types/react':
1898
+ optional: true
1899
+
1900
1901
+ resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==}
1902
+ engines: {node: '>=10'}
1903
+ peerDependencies:
1904
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
1905
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
1906
+ peerDependenciesMeta:
1907
+ '@types/react':
1908
+ optional: true
1909
+
1910
1911
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
1912
+ engines: {node: '>=10'}
1913
+ peerDependencies:
1914
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
1915
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
1916
+ peerDependenciesMeta:
1917
+ '@types/react':
1918
+ optional: true
1919
+
1920
1921
  resolution: {integrity: sha512-GbZ7hpPHQMiEu53BqEaPQVM/4GG4hARo+mqEEnx4rYporDvNvUjutiAFxYFSbu6sgHwcr7LeFv8htEOwALVA2A==}
1922
  engines: {node: '>=0.10.0'}
 
2119
  peerDependencies:
2120
  vue: '>=3.2.26 < 4'
2121
 
2122
2123
+ resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
2124
+
2125
2126
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
2127
+ peerDependencies:
2128
+ tailwindcss: '>=3.0.0 || insiders'
2129
+
2130
2131
  resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
2132
  engines: {node: '>=14.0.0'}
 
2207
2208
  resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2209
 
2210
2211
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
2212
+ engines: {node: '>=10'}
2213
+ peerDependencies:
2214
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
2215
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
2216
+ peerDependenciesMeta:
2217
+ '@types/react':
2218
+ optional: true
2219
+
2220
2221
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
2222
+ engines: {node: '>=10'}
2223
+ peerDependencies:
2224
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
2225
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
2226
+ peerDependenciesMeta:
2227
+ '@types/react':
2228
+ optional: true
2229
+
2230
2231
  resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
2232
  peerDependencies:
 
2408
 
2409
  '@eslint/[email protected]': {}
2410
 
2411
+ '@floating-ui/[email protected]':
2412
+ dependencies:
2413
+ '@floating-ui/utils': 0.2.8
2414
+
2415
+ '@floating-ui/[email protected]':
2416
+ dependencies:
2417
+ '@floating-ui/core': 1.6.8
2418
+ '@floating-ui/utils': 0.2.8
2419
+
2420
2421
+ dependencies:
2422
+ '@floating-ui/dom': 1.6.12
2423
+ react: 19.0.0-rc-02c0e824-20241028
2424
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2425
+
2426
+ '@floating-ui/[email protected]': {}
2427
+
2428
2429
  dependencies:
2430
  react: 19.0.0-rc-02c0e824-20241028
 
2591
  '@pkgjs/[email protected]':
2592
  optional: true
2593
 
2594
+ '@radix-ui/[email protected]': {}
2595
+
2596
2597
+ dependencies:
2598
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2599
+ react: 19.0.0-rc-02c0e824-20241028
2600
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2601
+ optionalDependencies:
2602
+ '@types/react': 18.3.12
2603
+ '@types/react-dom': 18.3.1
2604
+
2605
2606
+ dependencies:
2607
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2608
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
2609
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2610
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
2611
+ react: 19.0.0-rc-02c0e824-20241028
2612
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2613
+ optionalDependencies:
2614
+ '@types/react': 18.3.12
2615
+ '@types/react-dom': 18.3.1
2616
+
2617
2618
+ dependencies:
2619
+ react: 19.0.0-rc-02c0e824-20241028
2620
+ optionalDependencies:
2621
+ '@types/react': 18.3.12
2622
+
2623
2624
+ dependencies:
2625
+ react: 19.0.0-rc-02c0e824-20241028
2626
+ optionalDependencies:
2627
+ '@types/react': 18.3.12
2628
+
2629
2630
+ dependencies:
2631
+ react: 19.0.0-rc-02c0e824-20241028
2632
+ optionalDependencies:
2633
+ '@types/react': 18.3.12
2634
+
2635
2636
+ dependencies:
2637
+ react: 19.0.0-rc-02c0e824-20241028
2638
+ optionalDependencies:
2639
+ '@types/react': 18.3.12
2640
+
2641
2642
+ dependencies:
2643
+ '@radix-ui/primitive': 1.1.0
2644
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2645
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2646
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2647
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/[email protected])([email protected])
2648
+ react: 19.0.0-rc-02c0e824-20241028
2649
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2650
+ optionalDependencies:
2651
+ '@types/react': 18.3.12
2652
+ '@types/react-dom': 18.3.1
2653
+
2654
2655
+ dependencies:
2656
+ '@radix-ui/primitive': 1.1.0
2657
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2658
+ '@radix-ui/react-context': 1.1.1(@types/[email protected])([email protected])
2659
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
2660
2661
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2662
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/[email protected])([email protected])
2663
+ react: 19.0.0-rc-02c0e824-20241028
2664
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2665
+ optionalDependencies:
2666
+ '@types/react': 18.3.12
2667
+ '@types/react-dom': 18.3.1
2668
+
2669
2670
+ dependencies:
2671
+ react: 19.0.0-rc-02c0e824-20241028
2672
+ optionalDependencies:
2673
+ '@types/react': 18.3.12
2674
+
2675
2676
+ dependencies:
2677
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2678
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2679
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2680
+ react: 19.0.0-rc-02c0e824-20241028
2681
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2682
+ optionalDependencies:
2683
+ '@types/react': 18.3.12
2684
+ '@types/react-dom': 18.3.1
2685
+
2686
2687
+ dependencies:
2688
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
2689
+ react: 19.0.0-rc-02c0e824-20241028
2690
+ optionalDependencies:
2691
+ '@types/react': 18.3.12
2692
+
2693
2694
+ dependencies:
2695
+ '@radix-ui/primitive': 1.1.0
2696
+ '@radix-ui/react-collection': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2697
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2698
+ '@radix-ui/react-context': 1.1.1(@types/[email protected])([email protected])
2699
+ '@radix-ui/react-direction': 1.1.0(@types/[email protected])([email protected])
2700
+ '@radix-ui/react-dismissable-layer': 1.1.1(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2701
+ '@radix-ui/react-focus-guards': 1.1.1(@types/[email protected])([email protected])
2702
+ '@radix-ui/react-focus-scope': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2703
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
2704
2705
2706
+ '@radix-ui/react-presence': 1.1.1(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2707
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2708
+ '@radix-ui/react-roving-focus': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2709
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
2710
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2711
+ aria-hidden: 1.2.4
2712
+ react: 19.0.0-rc-02c0e824-20241028
2713
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2714
+ react-remove-scroll: 2.6.0(@types/[email protected])([email protected])
2715
+ optionalDependencies:
2716
+ '@types/react': 18.3.12
2717
+ '@types/react-dom': 18.3.1
2718
+
2719
2720
+ dependencies:
2721
+ '@floating-ui/react-dom': 2.1.2([email protected]([email protected]))([email protected])
2722
2723
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2724
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
2725
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2726
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2727
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
2728
+ '@radix-ui/react-use-rect': 1.1.0(@types/[email protected])([email protected])
2729
+ '@radix-ui/react-use-size': 1.1.0(@types/[email protected])([email protected])
2730
+ '@radix-ui/rect': 1.1.0
2731
+ react: 19.0.0-rc-02c0e824-20241028
2732
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2733
+ optionalDependencies:
2734
+ '@types/react': 18.3.12
2735
+ '@types/react-dom': 18.3.1
2736
+
2737
2738
+ dependencies:
2739
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2740
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
2741
+ react: 19.0.0-rc-02c0e824-20241028
2742
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2743
+ optionalDependencies:
2744
+ '@types/react': 18.3.12
2745
+ '@types/react-dom': 18.3.1
2746
+
2747
2748
+ dependencies:
2749
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2750
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
2751
+ react: 19.0.0-rc-02c0e824-20241028
2752
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2753
+ optionalDependencies:
2754
+ '@types/react': 18.3.12
2755
+ '@types/react-dom': 18.3.1
2756
+
2757
2758
+ dependencies:
2759
+ '@radix-ui/react-slot': 1.1.0(@types/[email protected])([email protected])
2760
+ react: 19.0.0-rc-02c0e824-20241028
2761
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2762
+ optionalDependencies:
2763
+ '@types/react': 18.3.12
2764
+ '@types/react-dom': 18.3.1
2765
+
2766
2767
+ dependencies:
2768
+ '@radix-ui/primitive': 1.1.0
2769
+ '@radix-ui/react-collection': 1.1.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2770
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2771
+ '@radix-ui/react-context': 1.1.0(@types/[email protected])([email protected])
2772
+ '@radix-ui/react-direction': 1.1.0(@types/[email protected])([email protected])
2773
+ '@radix-ui/react-id': 1.1.0(@types/[email protected])([email protected])
2774
+ '@radix-ui/react-primitive': 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
2775
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2776
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/[email protected])([email protected])
2777
+ react: 19.0.0-rc-02c0e824-20241028
2778
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
2779
+ optionalDependencies:
2780
+ '@types/react': 18.3.12
2781
+ '@types/react-dom': 18.3.1
2782
+
2783
2784
+ dependencies:
2785
+ '@radix-ui/react-compose-refs': 1.1.0(@types/[email protected])([email protected])
2786
+ react: 19.0.0-rc-02c0e824-20241028
2787
+ optionalDependencies:
2788
+ '@types/react': 18.3.12
2789
+
2790
2791
+ dependencies:
2792
+ react: 19.0.0-rc-02c0e824-20241028
2793
+ optionalDependencies:
2794
+ '@types/react': 18.3.12
2795
+
2796
2797
+ dependencies:
2798
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2799
+ react: 19.0.0-rc-02c0e824-20241028
2800
+ optionalDependencies:
2801
+ '@types/react': 18.3.12
2802
+
2803
2804
+ dependencies:
2805
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/[email protected])([email protected])
2806
+ react: 19.0.0-rc-02c0e824-20241028
2807
+ optionalDependencies:
2808
+ '@types/react': 18.3.12
2809
+
2810
2811
+ dependencies:
2812
+ react: 19.0.0-rc-02c0e824-20241028
2813
+ optionalDependencies:
2814
+ '@types/react': 18.3.12
2815
+
2816
2817
+ dependencies:
2818
+ '@radix-ui/rect': 1.1.0
2819
+ react: 19.0.0-rc-02c0e824-20241028
2820
+ optionalDependencies:
2821
+ '@types/react': 18.3.12
2822
+
2823
2824
+ dependencies:
2825
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/[email protected])([email protected])
2826
+ react: 19.0.0-rc-02c0e824-20241028
2827
+ optionalDependencies:
2828
+ '@types/react': 18.3.12
2829
+
2830
+ '@radix-ui/[email protected]': {}
2831
+
2832
  '@rtsao/[email protected]': {}
2833
 
2834
  '@rushstack/[email protected]': {}
 
3065
 
3066
3067
 
3068
3069
+ dependencies:
3070
+ tslib: 2.8.1
3071
+
3072
3073
 
3074
 
3200
  optionalDependencies:
3201
  fsevents: 2.3.3
3202
 
3203
3204
+ dependencies:
3205
+ clsx: 2.0.0
3206
+
3207
3208
 
3209
3210
+
3211
3212
+
3213
3214
  dependencies:
3215
  color-name: 1.1.4
 
3287
3288
  optional: true
3289
 
3290
3291
+
3292
3293
 
3294
 
3701
  has-symbols: 1.0.3
3702
  hasown: 2.0.2
3703
 
3704
3705
+
3706
3707
  dependencies:
3708
  call-bind: 1.0.7
 
3798
  hasown: 2.0.2
3799
  side-channel: 1.0.6
3800
 
3801
3802
+ dependencies:
3803
+ loose-envify: 1.4.0
3804
+
3805
3806
  dependencies:
3807
  call-bind: 1.0.7
 
3997
 
3998
3999
 
4000
4001
+ dependencies:
4002
+ react: 19.0.0-rc-02c0e824-20241028
4003
+
4004
4005
  dependencies:
4006
  '@jridgewell/sourcemap-codec': 1.5.0
 
4036
 
4037
4038
 
4039
4040
+ dependencies:
4041
+ react: 19.0.0-rc-02c0e824-20241028
4042
+ react-dom: 19.0.0-rc-02c0e824-20241028([email protected])
4043
+
4044
4045
  dependencies:
4046
  '@next/env': 15.0.2
 
4221
 
4222
4223
 
4224
4225
+ dependencies:
4226
+ react: 19.0.0-rc-02c0e824-20241028
4227
+ react-style-singleton: 2.2.1(@types/[email protected])([email protected])
4228
+ tslib: 2.8.1
4229
+ optionalDependencies:
4230
+ '@types/react': 18.3.12
4231
+
4232
4233
+ dependencies:
4234
+ react: 19.0.0-rc-02c0e824-20241028
4235
+ react-remove-scroll-bar: 2.3.6(@types/[email protected])([email protected])
4236
+ react-style-singleton: 2.2.1(@types/[email protected])([email protected])
4237
+ tslib: 2.8.1
4238
+ use-callback-ref: 1.3.2(@types/[email protected])([email protected])
4239
+ use-sidecar: 1.1.2(@types/[email protected])([email protected])
4240
+ optionalDependencies:
4241
+ '@types/react': 18.3.12
4242
+
4243
4244
+ dependencies:
4245
+ get-nonce: 1.0.1
4246
+ invariant: 2.2.4
4247
+ react: 19.0.0-rc-02c0e824-20241028
4248
+ tslib: 2.8.1
4249
+ optionalDependencies:
4250
+ '@types/react': 18.3.12
4251
+
4252
4253
 
4254
 
4513
  dependencies:
4514
  vue: 3.5.12([email protected])
4515
 
4516
4517
+
4518
4519
+ dependencies:
4520
+ tailwindcss: 3.4.14
4521
+
4522
4523
  dependencies:
4524
  '@alloc/quick-lru': 5.2.0
 
4632
  dependencies:
4633
  punycode: 2.3.1
4634
 
4635
4636
+ dependencies:
4637
+ react: 19.0.0-rc-02c0e824-20241028
4638
+ tslib: 2.8.1
4639
+ optionalDependencies:
4640
+ '@types/react': 18.3.12
4641
+
4642
4643
+ dependencies:
4644
+ detect-node-es: 1.1.0
4645
+ react: 19.0.0-rc-02c0e824-20241028
4646
+ tslib: 2.8.1
4647
+ optionalDependencies:
4648
+ '@types/react': 18.3.12
4649
+
4650
4651
  dependencies:
4652
  react: 19.0.0-rc-02c0e824-20241028
tailwind.config.ts CHANGED
@@ -1,61 +1,84 @@
1
  import type { Config } from "tailwindcss";
2
 
3
  const config: Config = {
4
- darkMode: 'class',
5
  content: [
6
  "./pages/**/*.{js,ts,jsx,tsx,mdx}",
7
  "./components/**/*.{js,ts,jsx,tsx,mdx}",
8
  "./app/**/*.{js,ts,jsx,tsx,mdx}",
9
  ],
10
  theme: {
11
- extend: {
12
- colors: {
13
- // Brand colors - slightly adjusted for dark mode compatibility
14
- primary: {
15
- DEFAULT: '#4ECDC4',
16
- dark: '#3DAA9D',
17
- light: '#7EDCD6',
18
- },
19
- secondary: {
20
- DEFAULT: '#FF6B6B',
21
- dark: '#E65555',
22
- light: '#FF8F8F',
23
- },
24
- accent: {
25
- blue: '#45B7D1',
26
- yellow: '#FDCB6E',
27
- dark: {
28
- blue: '#3A9BB2',
29
- yellow: '#D4A85D',
30
- },
31
- },
32
- // Semantic colors
33
- background: {
34
- primary: 'var(--background-primary)',
35
- secondary: 'var(--background-secondary)',
36
- tertiary: 'var(--background-tertiary)',
37
- card: 'var(--card-background)',
38
- glass: 'var(--glass-background)',
39
- },
40
- text: {
41
- primary: 'var(--text-primary)',
42
- secondary: 'var(--text-secondary)',
43
- tertiary: 'var(--text-tertiary)',
44
- },
45
- border: {
46
- DEFAULT: 'var(--border)',
47
- secondary: 'var(--border-secondary)',
48
- card: 'var(--card-border)',
49
- },
50
- },
51
- backdropBlur: {
52
- xs: '2px',
53
- },
54
- boxShadow: {
55
- 'dark': '0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.24)',
56
- },
57
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  },
59
- plugins: [],
60
  };
61
  export default config;
 
1
  import type { Config } from "tailwindcss";
2
 
3
  const config: Config = {
4
+ darkMode: ['class', 'class'],
5
  content: [
6
  "./pages/**/*.{js,ts,jsx,tsx,mdx}",
7
  "./components/**/*.{js,ts,jsx,tsx,mdx}",
8
  "./app/**/*.{js,ts,jsx,tsx,mdx}",
9
  ],
10
  theme: {
11
+ extend: {
12
+ colors: {
13
+ primary: {
14
+ DEFAULT: 'hsl(var(--primary))',
15
+ dark: '#3DAA9D',
16
+ light: '#7EDCD6',
17
+ foreground: 'hsl(var(--primary-foreground))'
18
+ },
19
+ secondary: {
20
+ DEFAULT: 'hsl(var(--secondary))',
21
+ dark: '#E65555',
22
+ light: '#FF8F8F',
23
+ foreground: 'hsl(var(--secondary-foreground))'
24
+ },
25
+ accent: {
26
+ blue: '#45B7D1',
27
+ yellow: '#FDCB6E',
28
+ dark: {
29
+ blue: '#3A9BB2',
30
+ yellow: '#D4A85D'
31
+ },
32
+ DEFAULT: 'hsl(var(--accent))',
33
+ foreground: 'hsl(var(--accent-foreground))'
34
+ },
35
+ background: 'hsl(var(--background))',
36
+ text: {
37
+ primary: 'var(--text-primary)',
38
+ secondary: 'var(--text-secondary)',
39
+ tertiary: 'var(--text-tertiary)'
40
+ },
41
+ border: 'hsl(var(--border))',
42
+ foreground: 'hsl(var(--foreground))',
43
+ card: {
44
+ DEFAULT: 'hsl(var(--card))',
45
+ foreground: 'hsl(var(--card-foreground))'
46
+ },
47
+ popover: {
48
+ DEFAULT: 'hsl(var(--popover))',
49
+ foreground: 'hsl(var(--popover-foreground))'
50
+ },
51
+ muted: {
52
+ DEFAULT: 'hsl(var(--muted))',
53
+ foreground: 'hsl(var(--muted-foreground))'
54
+ },
55
+ destructive: {
56
+ DEFAULT: 'hsl(var(--destructive))',
57
+ foreground: 'hsl(var(--destructive-foreground))'
58
+ },
59
+ input: 'hsl(var(--input))',
60
+ ring: 'hsl(var(--ring))',
61
+ chart: {
62
+ '1': 'hsl(var(--chart-1))',
63
+ '2': 'hsl(var(--chart-2))',
64
+ '3': 'hsl(var(--chart-3))',
65
+ '4': 'hsl(var(--chart-4))',
66
+ '5': 'hsl(var(--chart-5))'
67
+ }
68
+ },
69
+ backdropBlur: {
70
+ xs: '2px'
71
+ },
72
+ boxShadow: {
73
+ dark: '0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.24)'
74
+ },
75
+ borderRadius: {
76
+ lg: 'var(--radius)',
77
+ md: 'calc(var(--radius) - 2px)',
78
+ sm: 'calc(var(--radius) - 4px)'
79
+ }
80
+ }
81
  },
82
+ plugins: [require("tailwindcss-animate")],
83
  };
84
  export default config;