diff --git a/app/layout.tsx b/app/layout.tsx
index 7cf0a76..a2cbfb2 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,6 +1,8 @@
import type { Metadata } from 'next'
import localFont from 'next/font/local'
import './globals.css'
+import { ThemeProvider } from '@/components/providers/theme-provider'
+import { Toaster } from '@/components/ui/toaster'
const geistSans = localFont({
src: './fonts/GeistVF.woff',
@@ -14,8 +16,8 @@ const geistMono = localFont({
})
export const metadata: Metadata = {
- title: 'CodeGuide Starter Lite',
- description: 'Starter kit from codeguide.dev',
+ title: 'Admin Dashboard - CodeGuide',
+ description: 'Modern admin dashboard built with Next.js, Tailwind CSS, and Radix UI',
}
export default function RootLayout({
@@ -24,8 +26,18 @@ export default function RootLayout({
children: React.ReactNode
}>) {
return (
-
-
{children}
+
+
+
+ {children}
+
+
+
)
}
diff --git a/app/page.tsx b/app/page.tsx
index c401399..338fd8e 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,8 +1,12 @@
"use client"
-import { Hero } from '@/components/ui/animated-hero'
-import Image from 'next/image'
+import { DashboardLayout } from '@/components/dashboard/layout'
+import { DashboardOverview } from '@/components/dashboard/overview'
export default function Home() {
- return
+ return (
+
+
+
+ )
}
diff --git a/app/settings/page.tsx b/app/settings/page.tsx
new file mode 100644
index 0000000..9c0aadd
--- /dev/null
+++ b/app/settings/page.tsx
@@ -0,0 +1,12 @@
+"use client"
+
+import { DashboardLayout } from '@/components/dashboard/layout'
+import { SettingsPage } from '@/components/dashboard/settings'
+
+export default function Settings() {
+ return (
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/users/page.tsx b/app/users/page.tsx
new file mode 100644
index 0000000..1ed0d0d
--- /dev/null
+++ b/app/users/page.tsx
@@ -0,0 +1,12 @@
+"use client"
+
+import { DashboardLayout } from '@/components/dashboard/layout'
+import { UserManagement } from '@/components/dashboard/user-management'
+
+export default function UsersPage() {
+ return (
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/dashboard/layout.tsx b/components/dashboard/layout.tsx
new file mode 100644
index 0000000..bb524d5
--- /dev/null
+++ b/components/dashboard/layout.tsx
@@ -0,0 +1,150 @@
+"use client"
+
+import { useState } from 'react'
+import {
+ Home,
+ Users,
+ Settings,
+ BarChart3,
+ FileText,
+ Menu,
+ Moon,
+ Sun,
+ Monitor
+} from 'lucide-react'
+import { useTheme } from 'next-themes'
+import { Button } from '@/components/ui/button'
+import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger
+} from '@/components/ui/dropdown-menu'
+import { cn } from '@/lib/utils'
+import Image from 'next/image'
+
+const navigation = [
+ { name: 'Dashboard', href: '/', icon: Home, current: true },
+ { name: 'Analytics', href: '/analytics', icon: BarChart3, current: false },
+ { name: 'Users', href: '/users', icon: Users, current: false },
+ { name: 'Reports', href: '/reports', icon: FileText, current: false },
+ { name: 'Settings', href: '/settings', icon: Settings, current: false },
+]
+
+interface DashboardLayoutProps {
+ children: React.ReactNode
+}
+
+function ThemeToggle() {
+ const { setTheme } = useTheme()
+
+ return (
+
+
+
+
+
+ setTheme("light")}>
+
+ Light
+
+ setTheme("dark")}>
+
+ Dark
+
+ setTheme("system")}>
+
+ System
+
+
+
+ )
+}
+
+function Sidebar() {
+ return (
+
+ {/* Logo */}
+
+
+ CodeGuide
+
+
+ {/* Navigation */}
+
+
+ )
+}
+
+function MobileSidebar() {
+ const [open, setOpen] = useState(false)
+
+ return (
+
+
+
+
+
+
+
+
+ )
+}
+
+export function DashboardLayout({ children }: DashboardLayoutProps) {
+ return (
+
+ {/* Desktop Sidebar */}
+
+
+
+
+ {/* Main Content */}
+
+ {/* Header */}
+
+
+
+
Dashboard
+
+
+
+
+
+
+
+ {/* Page Content */}
+
+ {children}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/dashboard/overview.tsx b/components/dashboard/overview.tsx
new file mode 100644
index 0000000..a39f745
--- /dev/null
+++ b/components/dashboard/overview.tsx
@@ -0,0 +1,239 @@
+"use client"
+
+import {
+ Users,
+ TrendingUp,
+ Activity,
+ CreditCard,
+ ArrowUpRight,
+ ArrowDownRight
+} from 'lucide-react'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Badge } from '@/components/ui/badge'
+import { Progress } from '@/components/ui/progress'
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
+
+const stats = [
+ {
+ title: 'Total Users',
+ value: '12,234',
+ change: '+12.3%',
+ trend: 'up',
+ icon: Users,
+ description: 'Active users this month'
+ },
+ {
+ title: 'Revenue',
+ value: '$45,231',
+ change: '+8.2%',
+ trend: 'up',
+ icon: CreditCard,
+ description: 'Total revenue this month'
+ },
+ {
+ title: 'Conversion Rate',
+ value: '3.2%',
+ change: '-2.1%',
+ trend: 'down',
+ icon: TrendingUp,
+ description: 'Visitor to customer rate'
+ },
+ {
+ title: 'Active Sessions',
+ value: '2,847',
+ change: '+18.1%',
+ trend: 'up',
+ icon: Activity,
+ description: 'Current active sessions'
+ },
+]
+
+const recentActivity = [
+ {
+ user: 'John Doe',
+ action: 'Created new project',
+ time: '2 minutes ago',
+ status: 'success'
+ },
+ {
+ user: 'Jane Smith',
+ action: 'Updated user profile',
+ time: '5 minutes ago',
+ status: 'info'
+ },
+ {
+ user: 'Mike Johnson',
+ action: 'Deleted project',
+ time: '10 minutes ago',
+ status: 'warning'
+ },
+ {
+ user: 'Sarah Wilson',
+ action: 'Made payment',
+ time: '15 minutes ago',
+ status: 'success'
+ },
+]
+
+const projectProgress = [
+ { name: 'Website Redesign', progress: 75, status: 'In Progress' },
+ { name: 'Mobile App', progress: 40, status: 'Planning' },
+ { name: 'API Integration', progress: 90, status: 'Review' },
+ { name: 'Database Migration', progress: 25, status: 'Started' },
+]
+
+export function DashboardOverview() {
+ return (
+
+ {/* Welcome Section */}
+
+
Welcome back!
+
+ Here's what's happening with your projects today.
+
+
+
+ {/* Stats Grid */}
+
+ {stats.map((stat) => {
+ const Icon = stat.icon
+ return (
+
+
+
+ {stat.title}
+
+
+
+
+ {stat.value}
+
+ {stat.trend === 'up' ? (
+
+ ) : (
+
+ )}
+
+ {stat.change}
+
+
+
+ {stat.description}
+
+
+
+ )
+ })}
+
+
+ {/* Main Content Tabs */}
+
+
+ Overview
+ Analytics
+ Reports
+
+
+
+
+ {/* Recent Activity */}
+
+
+ Recent Activity
+
+ Latest user actions and system events
+
+
+
+
+ {recentActivity.map((activity, index) => (
+
+
+
+ {activity.user}
+
+
+ {activity.action}
+
+
+
+
+ {activity.time}
+
+
+
+ ))}
+
+
+
+
+ {/* Project Progress */}
+
+
+ Project Progress
+
+ Track your ongoing projects
+
+
+
+
+ {projectProgress.map((project, index) => (
+
+
+
{project.name}
+
{project.status}
+
+
+
+ {project.progress}% complete
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Analytics Overview
+
+ Detailed analytics and insights coming soon
+
+
+
+
+
Analytics dashboard will be implemented here
+
+
+
+
+
+
+
+
+ Reports
+
+ Generate and view detailed reports
+
+
+
+
+
Reporting features will be implemented here
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/dashboard/settings.tsx b/components/dashboard/settings.tsx
new file mode 100644
index 0000000..9d35684
--- /dev/null
+++ b/components/dashboard/settings.tsx
@@ -0,0 +1,277 @@
+"use client"
+
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { Label } from '@/components/ui/label'
+import { Switch } from '@/components/ui/switch'
+import { Textarea } from '@/components/ui/textarea'
+import { Separator } from '@/components/ui/separator'
+import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
+import { Badge } from '@/components/ui/badge'
+import {
+ Bell,
+ Shield,
+ Palette,
+ Database,
+ Upload
+} from 'lucide-react'
+
+export function SettingsPage() {
+ return (
+
+ {/* Header */}
+
+
Settings
+
+ Manage your account settings and preferences
+
+
+
+
+ {/* Profile Settings */}
+
+
+
+
+ Profile Settings
+
+
+ Update your personal information and profile picture
+
+
+
+
+
+
+ JD
+
+
+
+
+ JPG, GIF or PNG. 1MB max.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Notification Settings */}
+
+
+
+
+ Notifications
+
+
+ Choose what notifications you want to receive
+
+
+
+
+
+
+
+ Receive notifications via email
+
+
+
+
+
+
+
+
+
+
+
+ Receive push notifications in your browser
+
+
+
+
+
+
+
+
+
+
+
+ Receive updates about new features and products
+
+
+
+
+
+
+
+
+
+
+
+ Get notified about security updates and alerts
+
+
+
+
+
+
+
+ {/* Appearance Settings */}
+
+
+
+
+ Appearance
+
+
+ Customize the look and feel of your dashboard
+
+
+
+
+
+
+ Choose your preferred theme. You can also use the theme toggle in the header.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use a more compact layout to fit more content
+
+
+
+
+
+
+
+ {/* Security Settings */}
+
+
+
+
+ Security
+
+
+ Manage your account security and privacy settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add an extra layer of security to your account
+
+
Not Enabled
+
+
+
+
+
+
+ {/* Data & Privacy */}
+
+
+
+
+ Data & Privacy
+
+
+ Control your data and privacy preferences
+
+
+
+
+
+
+
+ Help us improve by sharing anonymous usage data
+
+
+
+
+
+
+
+
+
+
+ Download a copy of your account data
+
+
+
+
+
+
+
+
+
+ Permanently delete your account and all associated data
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/dashboard/user-management.tsx b/components/dashboard/user-management.tsx
new file mode 100644
index 0000000..fbdf7c9
--- /dev/null
+++ b/components/dashboard/user-management.tsx
@@ -0,0 +1,321 @@
+"use client"
+
+import { useState } from 'react'
+import {
+ MoreHorizontal,
+ UserPlus,
+ Search,
+ Filter,
+ Edit,
+ Trash2,
+ Mail
+} from 'lucide-react'
+import { Button } from '@/components/ui/button'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Input } from '@/components/ui/input'
+import { Badge } from '@/components/ui/badge'
+import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from '@/components/ui/table'
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from '@/components/ui/dropdown-menu'
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from '@/components/ui/dialog'
+import { Label } from '@/components/ui/label'
+
+const users = [
+ {
+ id: '1',
+ name: 'John Doe',
+ email: 'john.doe@example.com',
+ role: 'Admin',
+ status: 'Active',
+ avatar: '',
+ lastActive: '2 hours ago',
+ phone: '+1 (555) 123-4567'
+ },
+ {
+ id: '2',
+ name: 'Jane Smith',
+ email: 'jane.smith@example.com',
+ role: 'User',
+ status: 'Active',
+ avatar: '',
+ lastActive: '5 minutes ago',
+ phone: '+1 (555) 987-6543'
+ },
+ {
+ id: '3',
+ name: 'Mike Johnson',
+ email: 'mike.johnson@example.com',
+ role: 'Editor',
+ status: 'Inactive',
+ avatar: '',
+ lastActive: '1 day ago',
+ phone: '+1 (555) 456-7890'
+ },
+ {
+ id: '4',
+ name: 'Sarah Wilson',
+ email: 'sarah.wilson@example.com',
+ role: 'User',
+ status: 'Active',
+ avatar: '',
+ lastActive: '30 minutes ago',
+ phone: '+1 (555) 321-0987'
+ },
+]
+
+function AddUserDialog() {
+ const [open, setOpen] = useState(false)
+
+ return (
+
+ )
+}
+
+export function UserManagement() {
+ const [searchQuery, setSearchQuery] = useState('')
+
+ return (
+
+ {/* Header */}
+
+
+
User Management
+
+ Manage users and their permissions
+
+
+
+
+
+ {/* Stats Cards */}
+
+
+
+ Total Users
+
+
+ 1,284
+
+ +12 from last month
+
+
+
+
+
+ Active Users
+
+
+ 1,127
+
+ +8% from last week
+
+
+
+
+
+ Admins
+
+
+ 23
+
+ +2 this month
+
+
+
+
+
+ Pending
+
+
+ 45
+
+ Awaiting activation
+
+
+
+
+
+ {/* Search and Filters */}
+
+
+
+
+ Users
+
+ A list of all users in your organization
+
+
+
+
+
+ setSearchQuery(e.target.value)}
+ className="pl-8 w-64"
+ />
+
+
+
+
+
+
+
+
+
+ User
+ Role
+ Status
+ Last Active
+ Actions
+
+
+
+ {users.map((user) => (
+
+
+
+
+
+
+ {user.name.split(' ').map(n => n[0]).join('')}
+
+
+
+
{user.name}
+
{user.email}
+
+
+
+
+
+ {user.role}
+
+
+
+
+ {user.status}
+
+
+
+ {user.lastActive}
+
+
+
+
+
+
+
+ Actions
+
+
+ Edit user
+
+
+
+ Send message
+
+
+
+
+ Delete user
+
+
+
+
+
+ ))}
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/components/providers/theme-provider.tsx b/components/providers/theme-provider.tsx
new file mode 100644
index 0000000..7e38fc4
--- /dev/null
+++ b/components/providers/theme-provider.tsx
@@ -0,0 +1,12 @@
+"use client"
+
+import * as React from "react"
+import { ThemeProvider as NextThemesProvider } from "next-themes"
+
+export function ThemeProvider({
+ children,
+ ...props
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+}: any) {
+ return {children}
+}
\ No newline at end of file
diff --git a/components/ui/animated-hero.tsx b/components/ui/animated-hero.tsx
index b47fa57..bc511c3 100644
--- a/components/ui/animated-hero.tsx
+++ b/components/ui/animated-hero.tsx
@@ -1,6 +1,6 @@
import { useEffect, useMemo, useState } from 'react'
import { motion } from 'framer-motion'
-import { MoveRight, PhoneCall } from 'lucide-react'
+import { MoveRight } from 'lucide-react'
import { Button } from '@/components/ui/button'
import Image from 'next/image'
diff --git a/package-lock.json b/package-lock.json
index fd6ea0a..a4c4d63 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -71,7 +71,7 @@
"prettier": "^3.4.2",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwindcss": "^3.4.1",
- "typescript": "^5"
+ "typescript": "5.8.3"
}
},
"node_modules/@alloc/quick-lru": {
@@ -228,10 +228,11 @@
"integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
},
@@ -2109,20 +2110,21 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz",
- "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz",
+ "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.21.0",
- "@typescript-eslint/type-utils": "8.21.0",
- "@typescript-eslint/utils": "8.21.0",
- "@typescript-eslint/visitor-keys": "8.21.0",
+ "@typescript-eslint/scope-manager": "8.37.0",
+ "@typescript-eslint/type-utils": "8.37.0",
+ "@typescript-eslint/utils": "8.37.0",
+ "@typescript-eslint/visitor-keys": "8.37.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2132,21 +2134,32 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "@typescript-eslint/parser": "^8.37.0",
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz",
- "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz",
+ "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.21.0",
- "@typescript-eslint/types": "8.21.0",
- "@typescript-eslint/typescript-estree": "8.21.0",
- "@typescript-eslint/visitor-keys": "8.21.0",
+ "@typescript-eslint/scope-manager": "8.37.0",
+ "@typescript-eslint/types": "8.37.0",
+ "@typescript-eslint/typescript-estree": "8.37.0",
+ "@typescript-eslint/visitor-keys": "8.37.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2158,17 +2171,40 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz",
+ "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.37.0",
+ "@typescript-eslint/types": "^8.37.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
- "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz",
+ "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.21.0",
- "@typescript-eslint/visitor-keys": "8.21.0"
+ "@typescript-eslint/types": "8.37.0",
+ "@typescript-eslint/visitor-keys": "8.37.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2178,16 +2214,35 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz",
+ "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz",
- "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz",
+ "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.21.0",
- "@typescript-eslint/utils": "8.21.0",
+ "@typescript-eslint/types": "8.37.0",
+ "@typescript-eslint/typescript-estree": "8.37.0",
+ "@typescript-eslint/utils": "8.37.0",
"debug": "^4.3.4",
- "ts-api-utils": "^2.0.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2198,14 +2253,15 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
- "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz",
+ "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -2215,19 +2271,22 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
- "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz",
+ "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.21.0",
- "@typescript-eslint/visitor-keys": "8.21.0",
+ "@typescript-eslint/project-service": "8.37.0",
+ "@typescript-eslint/tsconfig-utils": "8.37.0",
+ "@typescript-eslint/types": "8.37.0",
+ "@typescript-eslint/visitor-keys": "8.37.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^2.0.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2237,14 +2296,15 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -2254,6 +2314,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -2265,15 +2326,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz",
- "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz",
+ "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.21.0",
- "@typescript-eslint/types": "8.21.0",
- "@typescript-eslint/typescript-estree": "8.21.0"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.37.0",
+ "@typescript-eslint/types": "8.37.0",
+ "@typescript-eslint/typescript-estree": "8.37.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2284,17 +2346,18 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
- "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+ "version": "8.37.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz",
+ "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.21.0",
- "eslint-visitor-keys": "^4.2.0"
+ "@typescript-eslint/types": "8.37.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2305,10 +2368,11 @@
}
},
"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -7332,10 +7396,11 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"node_modules/ts-api-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz",
- "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18.12"
},
@@ -7464,10 +7529,11 @@
}
},
"node_modules/typescript": {
- "version": "5.7.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
- "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/package.json b/package.json
index f72ddbc..0321338 100644
--- a/package.json
+++ b/package.json
@@ -72,6 +72,6 @@
"prettier": "^3.4.2",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwindcss": "^3.4.1",
- "typescript": "^5"
+ "typescript": "5.8.3"
}
}
diff --git a/tsconfig.json b/tsconfig.json
index e7ff90f..19ad28c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -17,6 +17,7 @@
"name": "next"
}
],
+ "baseUrl": ".",
"paths": {
"@/*": ["./*"]
}