diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx index adb8895..ae350d1 100644 --- a/app/dashboard/layout.tsx +++ b/app/dashboard/layout.tsx @@ -1,23 +1,29 @@ -import { AppSidebar } from "@/components/dashboardComponents/AppSidebar"; import { DashboardNavbar } from "@/components/dashboardComponents/DashboardNavbar"; -import MobileSidear from "@/components/dashboardComponents/MobileSidebar"; import type { Metadata } from "next"; + export const metadata: Metadata = { title: "LeetCode Journal", description: "Track your LeetCode progress and boost your coding skills", }; + export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( -
- -
- +
+
+ {/* Top navbar */} + + + {/* Main content with minimal spacing */} +
+
+ {children} +
+
-
{children}
-
+ ); } diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 754b782..0d47816 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -66,8 +66,8 @@ export default function Dashboard() { if (error) { return ( -
-

{error}

+
+

{error}

); } @@ -97,12 +97,12 @@ export default function Dashboard() { }; return ( -
+
{/* Profile Header Card */} - - -
-
+ + +
+
Profile
-
-

+
+

{userDetails.profile.realName}

-

+

@{userDetails.username} • Rank #{userDetails.profile.ranking}

-
- } /> - } /> - } /> +
+ } /> + } /> + } />
-
+
} - label="Contest Rating" + label="Rating" value={userContestRanking?.rating || 0} color="blue" /> @@ -138,7 +138,7 @@ export default function Dashboard() { /> } - label="Global Rank" + label="Rank" value={userContestRanking?.globalRanking || 0} color="purple" /> @@ -147,47 +147,49 @@ export default function Dashboard() { -
+
{/* Activity Calendar Section */} - - + +
- -

Contribution Calendar

+ +

Contribution Calendar

- + {userDetails.submitStats.totalSubmissionNum[0].count} total submissions
- - { - if (!value) { - return 'color-empty'; - } - return `color-scale-${(value.count)}`; - }} - /> + +
+ { + if (!value) { + return 'color-empty'; + } + return `color-scale-${(value.count)}`; + }} + /> +
-
+
- -

Badges

+ +

Badges

- + {(userDetails.badges).length} total badges
-
+
{userDetails.badges.slice(0, 5).map((badge, idx) => ( -
+
{`Badge
))} @@ -197,33 +199,33 @@ export default function Dashboard() { {/* Recent Submissions Card */} - - + +
- -

Recent Activity

+ +

Recent Activity

- +
{recentSubmissions.map((submission, idx) => (
-

+

{submission.title}

-

+

{new Date(Number(submission.timestamp) * 1000).toISOString().split("T")[0]}

- + ))}
@@ -231,58 +233,58 @@ export default function Dashboard() {
{/* Statistics Cards */} -
-
+
+
} + icon={} stats={[ { label: 'Total Solved', value: userDetails.submitStats.acSubmissionNum[0].count, - icon: + icon: }, { label: 'Easy Problems', value: userDetails.submitStats.acSubmissionNum[1].count, - icon: + icon: }, { label: 'Medium Problems', value: userDetails.submitStats.acSubmissionNum[2].count, - icon: + icon: }, { label: 'Hard Problems', value: userDetails.submitStats.acSubmissionNum[3].count, - icon: + icon: }, ]} /> } + icon={} stats={[ { label: 'Acceptance Rate', value: `${(userDetails.submitStats.acSubmissionNum[0].count / userDetails.submitStats.totalSubmissionNum[0].count * 100).toFixed(1)}%`, - icon: + icon: }, { label: 'Total Submissions', value: userDetails.submitStats.totalSubmissionNum[0].count, - icon: + icon: }, { label: 'Contribution Points', value: userDetails.contributions.points, - icon: + icon: }, { label: 'Contest Count', value: userContestRanking?.attendedContestsCount || 0, - icon: + icon: }, ]} /> @@ -290,56 +292,58 @@ export default function Dashboard() {
{/* Problem Distribution Chart */} - - + +
- -

Problem Distribution

+ +

Problem Distribution

- -
- +
+
+ { - const total = context.dataset.data.reduce((a: number, b: number) => a + b, 0); - const percentage = ((context.raw as number / total) * 100).toFixed(1); - return `${context.label}: ${context.raw} (${percentage}%)`; + tooltip: { + backgroundColor: 'rgba(0, 0, 0, 0.8)', + padding: window.innerWidth < 640 ? 8 : 12, + titleFont: { + size: window.innerWidth < 640 ? 12 : 14, + weight: 'bold' + }, + bodyFont: { + size: window.innerWidth < 640 ? 11 : 13 + }, + callbacks: { + label: (context) => { + const total = context.dataset.data.reduce((a: number, b: number) => a + b, 0); + const percentage = ((context.raw as number / total) * 100).toFixed(1); + return `${context.label}: ${context.raw} (${percentage}%)`; + } } } } - } - }} - /> + }} + /> +
@@ -350,20 +354,26 @@ export default function Dashboard() { function QuickStat({ icon, label, value, color = "blue" }: { icon: React.ReactNode; label: string; value: string | number; color?: "blue" | "yellow" | "purple" }) { const colorVariants = { - blue: "bg-blue-50 dark:bg-blue-900/20", - yellow: "bg-yellow-50 dark:bg-yellow-900/20", - purple: "bg-purple-50 dark:bg-purple-900/20" + blue: "bg-blue-100/80 dark:bg-blue-900/30", + yellow: "bg-yellow-100/80 dark:bg-yellow-900/30", + purple: "bg-purple-100/80 dark:bg-purple-900/30" }; return ( -
-
-
- {icon} +
+
+
+
+ {icon} +
-
-
{value.toLocaleString()}
-
{label}
+
+
+ {typeof value === 'number' ? value.toLocaleString() : value} +
+
+ {label} +
@@ -372,24 +382,26 @@ function QuickStat({ icon, label, value, color = "blue" }: { icon: React.ReactNo function DetailCard({ title, icon, stats }: { title: string; icon: React.ReactNode; stats: any[] }) { return ( - - + +
{icon} -

{title}

+

{title}

- -
+ +
{stats.map((stat, idx) => (
-
+
{stat.icon} -
{stat.label}
+
{stat.label}
+
+
+ {typeof stat.value === 'number' ? stat.value.toLocaleString() : stat.value}
-
{stat.value}
))}
@@ -414,32 +426,32 @@ function SocialLink({ href, icon }: { href?: string; icon: React.ReactNode }) { function DashboardSkeleton() { return ( -
-
- -
- - -
- - - +
+
+ +
+ + +
+ + +
-
-
- +
+
+
- -
-
- - + +
+
+ +
- +
); diff --git a/app/dashboard/problems/page.tsx b/app/dashboard/problems/page.tsx index 9bd8671..ac22099 100644 --- a/app/dashboard/problems/page.tsx +++ b/app/dashboard/problems/page.tsx @@ -4,10 +4,11 @@ import React, { useState, useEffect } from "react"; import { Problem } from "@/utils/problem"; import { HintCard } from "@/components/HintCard"; import { DetailedProblem } from "@/utils/detailedProblem"; // Import the new type -import Link from "next/link"; +// import Link from "next/link"; import { ThumbsUp, ThumbsDown } from 'lucide-react'; import { Loader } from "@/components/ui/percept-ui/loader"; import { getTagSlug } from "@/lib/tags"; +import { useTheme } from "next-themes"; export default function Home() { const [loading, setLoading] = useState(true); @@ -21,6 +22,8 @@ export default function Home() { const [page, setPage] = useState(1); const [limit, setLimit] = useState(10); + const { theme } = useTheme(); + function parseTags(tagSearch: string): string { if (!tagSearch) return ''; return tagSearch @@ -93,140 +96,171 @@ export default function Home() { }, [difficulty, tagSearch, page, limit]); return ( -
-
-
-
- {/* Div icons to show the color pattern for Free & Paid problems */} - {/*
-
-

- Free Problems -

-
-
-

- Paid Problems -

-
-
*/} -
+
{loading ? (
- +
) : error ? ( -
+

{error}

) : ( <> -
-
- - Page {page} + + Page {page} +
-
- - setTagSearch(e.target.value)} - className="mr-2 outline-none min-w-96 h-9 bg-black text-white border border-white px-4 py-2" - /> -
-
- - + {/* Filter controls with improved alignment and sizing */} +
+
+ {/* Compact difficulty selector */} + + + {/* Streamlined tag search */} + setTagSearch(e.target.value)} + className="h-8 px-2 text-xs sm:text-sm bg-white dark:bg-black text-gray-800 dark:text-white + border border-gray-400 dark:border-white rounded-sm w-full sm:w-48 md:w-64 lg:w-80 + focus:outline-none focus:border-blue-500 dark:focus:border-purple-500" + /> +
+
+ + {/* Compact items per page selector */} +
+ Per page: + +
-
-
- - - - - - - - - - - - - - - - {Array.isArray(problems) && problems.length > 0 ? ( - problems.map((problem, index) => ( - - - - - - - - - - - - ))) : ( - - + + + {/* Enhanced table container with better responsiveness */} +
+
IDTitleDifficultyAccuracyVideoTagsHints
{detailedProblems[index]?.questionId} - - {`${problem.title}`} - - {problem.difficulty}{Math.round((problem.acRate))}%{problem.hasVideoSolution ? "Yes" : "No"}{problem.topicTags.map((tag) => tag.name).join(", ")}{detailedProblems[index]?.likes > 1000 ? (`${Math.round(detailedProblems[index]?.likes / 1000)}K` - ) : (detailedProblems[index]?.likes)}{detailedProblems[index]?.dislikes > 1000 ? (`${Math.round(detailedProblems[index]?.dislikes / 1000)}K` - ) : (detailedProblems[index]?.dislikes)} - {detailedProblems[index]?.hints?.length > 0 ? ( - - ) : ( - No hints found - )} -
No problems found
+ + + {/* Optimized column widths */} + + + + + + + + + + + + + + {Array.isArray(problems) && problems.length > 0 ? ( + problems.map((problem, index) => ( + + + + + + + + + + - )} - -
IDTitleDifficultyAccuracyVideoTagsHints
{detailedProblems[index]?.questionId} + + {`${problem.title}`} + + {problem.difficulty}{Math.round((problem.acRate))}%{problem.hasVideoSolution ? "Yes" : "No"} +
+ {problem.topicTags.map((tag) => tag.name).join(", ")} +
+
{detailedProblems[index]?.likes > 1000 ? (`${Math.round(detailedProblems[index]?.likes / 1000)}K` + ) : (detailedProblems[index]?.likes)}{detailedProblems[index]?.dislikes > 1000 ? (`${Math.round(detailedProblems[index]?.dislikes / 1000)}K` + ) : (detailedProblems[index]?.dislikes)} + {detailedProblems[index]?.hints?.length > 0 ? ( + + ) : ( + No hints + )} +
-
+ ))) : ( + + No problems found + + )} + + +
)}
diff --git a/app/not-found.tsx b/app/not-found.tsx index 203a97c..d884732 100644 --- a/app/not-found.tsx +++ b/app/not-found.tsx @@ -15,7 +15,6 @@ export default function NotFound() { help cover his cloud charges by sponsoring him on GitHub. - .

Return to Home diff --git a/components/DashboardV2/V2Navbar.tsx b/components/DashboardV2/V2Navbar.tsx index ac2bff8..2c830c9 100644 --- a/components/DashboardV2/V2Navbar.tsx +++ b/components/DashboardV2/V2Navbar.tsx @@ -38,10 +38,10 @@ interface FeatureProps { } const routeList: RouteProps[] = [ - { - href: "#testimonials", - label: "Testimonials", - }, + // { + // href: "#testimonials", + // label: "Testimonials", + // }, { href: "#team", label: "Team", @@ -97,12 +97,14 @@ export const NavigationContent = () => { ) : ( <> - - - - - - +
+ + + + + + +
); }; @@ -117,6 +119,7 @@ export const NavigationContent = () => { Leetcode Journal + {/* */}
@@ -139,13 +142,13 @@ export const NavigationContent = () => { LC - Leetcode Journal +

Leetcode Journal

- {routeList.map(({ href, label }) => ( + {/* {routeList.map(({ href, label }) => ( - ))} + ))} */} + {renderAuthButtons()}
- + {/* - {renderAuthButtons()} + {renderAuthButtons()} */} diff --git a/components/HintCard.tsx b/components/HintCard.tsx index f73acc8..cea09bf 100644 --- a/components/HintCard.tsx +++ b/components/HintCard.tsx @@ -16,7 +16,7 @@ export function HintCard({ hints }: { hints: string[] }) { return ( - + diff --git a/components/dashboardComponents/DashboardNavbar.tsx b/components/dashboardComponents/DashboardNavbar.tsx index 936a01f..00e17b7 100644 --- a/components/dashboardComponents/DashboardNavbar.tsx +++ b/components/dashboardComponents/DashboardNavbar.tsx @@ -20,7 +20,7 @@ import { SidebarData } from "@/data/SidebarData"; export const DashboardNavbar = () => { const [isOpen, setIsOpen] = React.useState(false); return ( -
+
@@ -39,50 +39,47 @@ export const DashboardNavbar = () => { /> - + >
- - - - - LC - - Leetcode Journal - - + + + + + LC + + Leetcode Journal + + -
- {SidebarData.map(({ href, title }) => ( - - ))} +
+ {SidebarData.map(({ href, title }) => ( + + ))}
- - - - - - - - +
+ + +
+
- + {/* */} -
+
{SidebarData.map(({ href, title }) => (
- - -
+ + +
); }; diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx index 93e647b..5435221 100644 --- a/components/theme-provider.tsx +++ b/components/theme-provider.tsx @@ -1,9 +1,8 @@ -"use client" +"use client"; -import * as React from "react" -import { ThemeProvider as NextThemesProvider } from "next-themes" -import { type ThemeProviderProps } from "next-themes" +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes"; export function ThemeProvider({ children, ...props }: ThemeProviderProps) { - return {children} + return {children}; } diff --git a/components/theme-toggle.tsx b/components/theme-toggle.tsx index 966840c..eb5b2fc 100644 --- a/components/theme-toggle.tsx +++ b/components/theme-toggle.tsx @@ -1,44 +1,33 @@ "use client"; -import * as React from "react"; -import { Moon, Sun } from "lucide-react"; import { useTheme } from "next-themes"; -import { Button } from "@/components/ui/button"; +import { useState, useEffect } from "react"; +import { Sun, Moon } from "lucide-react"; export function ThemeToggle() { - const { setTheme, resolvedTheme } = useTheme(); - const [mounted, setMounted] = React.useState(false); + const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); - React.useEffect(() => { + // Avoid hydration mismatch by only rendering after component is mounted + useEffect(() => { setMounted(true); }, []); - React.useEffect(() => { - if (!resolvedTheme) { - setTheme("dark"); - } - }, [resolvedTheme, setTheme]); - - if (!mounted || !resolvedTheme) { + if (!mounted) { return null; } return ( - + {theme === "dark" ? ( + + ) : ( + + )} + ); } diff --git a/package-lock.json b/package-lock.json index d3f08f5..611dbd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@babel/runtime": "^7.22.5", "@hookform/resolvers": "^3.10.0", - "@prisma/client": "^6.2.1", + "@prisma/client": "^6.4.1", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.3", @@ -46,6 +46,7 @@ "lucide-react": "^0.469.0", "motion": "^11.18.2", "next": "15.1.2", + "next-themes": "^0.2.1", "react": "^18.3.1", "react-calendar-heatmap": "^1.9.0", "react-chartjs-2": "^5.3.0", @@ -73,7 +74,7 @@ "eslint-config-next": "15.1.2", "next-themes": "^0.4.4", "postcss": "^8", - "prisma": "^6.2.1", + "prisma": "^6.4.1", "tailwindcss": "^3.4.1", "typescript": "^5" } @@ -113,6 +114,431 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "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", @@ -995,9 +1421,9 @@ } }, "node_modules/@prisma/client": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.3.1.tgz", - "integrity": "sha512-ARAJaPs+eBkemdky/XU3cvGRl+mIPHCN2lCXsl5Vlb0E2gV+R6IN7aCI8CisRGszEZondwIsW9Iz8EJkTdykyA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.4.1.tgz", + "integrity": "sha512-A7Mwx44+GVZVexT5e2GF/WcKkEkNNKbgr059xpr5mn+oUm2ZW1svhe+0TRNBwCdzhfIZ+q23jEgsNPvKD9u+6g==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -1017,53 +1443,53 @@ } }, "node_modules/@prisma/debug": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.3.1.tgz", - "integrity": "sha512-RrEBkd+HLZx+ydfmYT0jUj7wjLiS95wfTOSQ+8FQbvb6vHh5AeKfEPt/XUQ5+Buljj8hltEfOslEW57/wQIVeA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.4.1.tgz", + "integrity": "sha512-Q9xk6yjEGIThjSD8zZegxd5tBRNHYd13GOIG0nLsanbTXATiPXCLyvlYEfvbR2ft6dlRsziQXfQGxAgv7zcMUA==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.3.1.tgz", - "integrity": "sha512-sXdqEVLyGAJ5/iUoG/Ea5AdHMN71m6PzMBWRQnLmhhOejzqAaEr8rUd623ql6OJpED4s/U4vIn4dg1qkF7vGag==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.4.1.tgz", + "integrity": "sha512-KldENzMHtKYwsOSLThghOIdXOBEsfDuGSrxAZjMnimBiDKd3AE4JQ+Kv+gBD/x77WoV9xIPf25GXMWffXZ17BA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.3.1", - "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "@prisma/fetch-engine": "6.3.1", - "@prisma/get-platform": "6.3.1" + "@prisma/debug": "6.4.1", + "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "@prisma/fetch-engine": "6.4.1", + "@prisma/get-platform": "6.4.1" } }, "node_modules/@prisma/engines-version": { - "version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0.tgz", - "integrity": "sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA==", + "version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d.tgz", + "integrity": "sha512-Xq54qw55vaCGrGgIJqyDwOq0TtjZPJEWsbQAHugk99hpDf2jcEeQhUcF+yzEsSqegBaDNLA4IC8Nn34sXmkiTQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.3.1.tgz", - "integrity": "sha512-HOf/0umOgt+/S2xtZze+FHKoxpVg4YpVxROr6g2YG09VsI3Ipyb+rGvD6QGbCqkq5NTWAAZoOGNL+oy7t+IhaQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.4.1.tgz", + "integrity": "sha512-uZ5hVeTmDspx7KcaRCNoXmcReOD+84nwlO2oFvQPRQh9xiFYnnUKDz7l9bLxp8t4+25CsaNlgrgilXKSQwrIGQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.3.1", - "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", - "@prisma/get-platform": "6.3.1" + "@prisma/debug": "6.4.1", + "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "@prisma/get-platform": "6.4.1" } }, "node_modules/@prisma/get-platform": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.3.1.tgz", - "integrity": "sha512-AYLq6Hk9xG73JdLWJ3Ip9Wg/vlP7xPvftGBalsPzKDOHr/ImhwJ09eS8xC2vNT12DlzGxhfk8BkL0ve2OriNhQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.4.1.tgz", + "integrity": "sha512-gXqZaDI5scDkBF8oza7fOD3Q3QMD0e0rBynlzDDZdTWbWmzjuW58PRZtj+jkvKje2+ZigCWkH8SsWZAsH6q1Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.3.1" + "@prisma/debug": "6.4.1" } }, "node_modules/@radix-ui/number": { @@ -4206,6 +4632,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -8133,14 +8613,16 @@ } }, "node_modules/prisma": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.3.1.tgz", - "integrity": "sha512-JKCZWvBC3enxk51tY4TWzS4b5iRt4sSU1uHn2I183giZTvonXaQonzVtjLzpOHE7qu9MxY510kAtFGJwryKe3Q==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.4.1.tgz", + "integrity": "sha512-q2uJkgXnua/jj66mk6P9bX/zgYJFI/jn4Yp0aS6SPRrjH/n6VyOV7RDe1vHD0DX8Aanx4MvgmUPPoYnR6MJnPg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "6.3.1" + "@prisma/engines": "6.4.1", + "esbuild": ">=0.12 <1", + "esbuild-register": "3.6.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index 0859fe9..2c302b9 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dependencies": { "@babel/runtime": "^7.22.5", "@hookform/resolvers": "^3.10.0", - "@prisma/client": "^6.2.1", + "@prisma/client": "^6.4.1", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-alert-dialog": "^1.1.4", "@radix-ui/react-avatar": "^1.1.3", @@ -47,6 +47,7 @@ "lucide-react": "^0.469.0", "motion": "^11.18.2", "next": "15.1.2", + "next-themes": "^0.2.1", "react": "^18.3.1", "react-calendar-heatmap": "^1.9.0", "react-chartjs-2": "^5.3.0", @@ -74,7 +75,7 @@ "eslint-config-next": "15.1.2", "next-themes": "^0.4.4", "postcss": "^8", - "prisma": "^6.2.1", + "prisma": "^6.4.1", "tailwindcss": "^3.4.1", "typescript": "^5" }