From 52ac4a5da202e9c4f48efff19971b1a614fd04b0 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 16:57:43 +0530 Subject: [PATCH 01/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Responsive-design?= =?UTF-8?q?=20V2Navbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/DashboardV2/V2Navbar.tsx | 34 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) 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()} */} From 5c8f8e5061da771f97011826c1c3ce524919321f Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 17:29:12 +0530 Subject: [PATCH 02/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20small=20breakpoint?= =?UTF-8?q?=20settled=20for=20navbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboardComponents/DashboardNavbar.tsx | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) 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 }) => (
- - -
+ + +
); }; From cc06ae62d3f5f545680e16331ba73707fa6c05f1 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 17:38:18 +0530 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Improve=20the=20he?= =?UTF-8?q?ader=20input=20fields=20of=20problem=20dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/problems/page.tsx | 209 +++++++++++++++++--------------- 1 file changed, 113 insertions(+), 96 deletions(-) diff --git a/app/dashboard/problems/page.tsx b/app/dashboard/problems/page.tsx index 9bd8671..8ec8802 100644 --- a/app/dashboard/problems/page.tsx +++ b/app/dashboard/problems/page.tsx @@ -93,140 +93,157 @@ export default function Home() { }, [difficulty, tagSearch, page, limit]); return ( -
-
+ // Mobile first - small padding on mobile, more on larger screens +
+ {/* Header section */} +
- {/* Div icons to show the color pattern for Free & Paid problems */} - {/*
-
-

- Free Problems -

-
-
-

- Paid Problems -

-
-
*/} + {/* Removed color pattern div */}
{loading ? (
) : error ? ( -
+

{error}

) : ( <> -
-
- - Page {page} + Page {page}
-
- - +
+ {/* Compact difficulty selector */} + + + {/* Streamlined tag search */} + 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" - /> -
-
- - setLimit(Number(e.target.value))} - className="outline-none bg-black text-white border border-white px-4 py-2" - > + className="h-8 px-2 text-xs sm:text-sm bg-black text-white border border-white rounded-sm + hover:bg-white hover:text-black transition-colors duration-200 w-16" + > {[10, 20, 30].map((e) => ( - + ))} - -
+ +
+
-
- - - - - - - - - - - - - - - - {Array.isArray(problems) && problems.length > 0 ? ( - problems.map((problem, index) => ( - - - - - - - - - - - - ))) : ( - - + + {/* Table container with horizontal scroll for small screens */} +
+
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
+ + + {/* Responsive 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 + + )} + + +
)}
From fa6d60dcaed6677a9065e4555363ec880bc8ba14 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 17:54:21 +0530 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20the=20page=20span?= =?UTF-8?q?=20spaces=20for=20value=20of=20page=20number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/problems/page.tsx | 66 ++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/app/dashboard/problems/page.tsx b/app/dashboard/problems/page.tsx index 8ec8802..672fcbe 100644 --- a/app/dashboard/problems/page.tsx +++ b/app/dashboard/problems/page.tsx @@ -93,13 +93,11 @@ export default function Home() { }, [difficulty, tagSearch, page, limit]); return ( - // Mobile first - small padding on mobile, more on larger screens
{/* Header section */}
- {/* Removed color pattern div */}
{loading ? (
@@ -136,11 +134,13 @@ export default function Home() { > Prev - Page {page} + + Page {page} +
- {/* Table container with horizontal scroll for small screens */} -
- + {/* Enhanced table container with better responsiveness */} +
+
- {/* Responsive column widths */} - - - - - - - - - + {/* Optimized column widths */} + + + + + + + + + {Array.isArray(problems) && problems.length > 0 ? ( problems.map((problem, index) => ( - - + - - - - - + + + - - ))) : ( - + )} From 678f2c44073008c2cbc9b45fec5a268cf55891a0 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 18:21:28 +0530 Subject: [PATCH 05/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Fix=20the=20dark=20?= =?UTF-8?q?mode=20for=20problems=20and=20alignment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/problems/page.tsx | 152 +++++++++++++++++--------------- components/theme-provider.tsx | 9 +- components/theme-toggle.tsx | 45 ++++------ package-lock.json | 1 + package.json | 1 + 5 files changed, 106 insertions(+), 102 deletions(-) diff --git a/app/dashboard/problems/page.tsx b/app/dashboard/problems/page.tsx index 672fcbe..800cb9a 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,18 +96,17 @@ export default function Home() { }, [difficulty, tagSearch, page, limit]); return ( -
+
{/* Header section */} -
-
-
+
+

LeetCode Problems

{loading ? (
- +
) : error ? ( -
+

{error}

@@ -112,34 +114,34 @@ export default function Home() { ) : ( <> {/* Filter and pagination controls - stack vertically on mobile, horizontally on larger screens */} -
+
{/* Pagination controls - centered on mobile, left-aligned on larger screens */}
{/* Smaller, more compact buttons with consistent styling */} - - Page {page} - + + Page {page} +
- {/* Filter controls with improved alignment and sizing */} -
+ {/* 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-black text-white border border-white rounded-sm - w-full sm:w-48 md:w-64 lg:w-80 focus:outline-none focus:border-purple-500" + type="text" + placeholder="Search by tags (comma-separated)" + value={tagSearch} + onChange={(e) => 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: + Per page:
-
-
+
+ {/* Enhanced table container with better responsiveness */}
-
IDTitleDifficultyAccuracyVideoTagsHintsIDTitleDifficultyAccuracyVideoTagsHints
{detailedProblems[index]?.questionId} + {detailedProblems[index]?.questionId} + target="_blank" + className="block truncate" + title={problem.title}> {`${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` + {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 > 1000 ? (`${Math.round(detailedProblems[index]?.dislikes / 1000)}K` ) : (detailedProblems[index]?.dislikes)} + {detailedProblems[index]?.hints?.length > 0 ? ( ) : ( @@ -238,7 +244,7 @@ export default function Home() {
No problems foundNo problems found
+
- + {/* Optimized column widths */} - - - - - - - - - + + + + + + + + + - + {Array.isArray(problems) && problems.length > 0 ? ( problems.map((problem, index) => ( - - - + + - - - - + + + - - - ))) : ( - + )} 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..96cf2a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 0859fe9..21d9668 100644 --- a/package.json +++ b/package.json @@ -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", From 3d660ee2e0edba5a253e4a45435ec215f8e8671d Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 18:23:04 +0530 Subject: [PATCH 06/14] =?UTF-8?q?refactor:=20=F0=9F=9B=A0=EF=B8=8F=20Remov?= =?UTF-8?q?e=20unused=20header=20section=20from=20problems=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/problems/page.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/dashboard/problems/page.tsx b/app/dashboard/problems/page.tsx index 800cb9a..fcc42c2 100644 --- a/app/dashboard/problems/page.tsx +++ b/app/dashboard/problems/page.tsx @@ -97,10 +97,6 @@ export default function Home() { return (
- {/* Header section */} -
-

LeetCode Problems

-
{loading ? (
From d153c4507051205c0896aa88e2c9915207a7edc3 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 18:26:22 +0530 Subject: [PATCH 07/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Update=20HintCard?= =?UTF-8?q?=20styles=20for=20better=20responsiveness=20and=20dark=20mode?= =?UTF-8?q?=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/HintCard.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/HintCard.tsx b/components/HintCard.tsx index f73acc8..9cb834a 100644 --- a/components/HintCard.tsx +++ b/components/HintCard.tsx @@ -15,18 +15,18 @@ import { Button } from "@/components/ui/button"; export function HintCard({ hints }: { hints: string[] }) { return ( - - + + - + - Hints + Hints
    {hints.slice(0, 3).map((hint, index) => ( -
  • {String(hint)}
  • +
  • {String(hint)}
  • ))}
From 9bf6126a12108a6223ee6e91afa2def9ccdeb317 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 18:27:38 +0530 Subject: [PATCH 08/14] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Remove=20unnecessar?= =?UTF-8?q?y=20period=20from=20NotFound=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/not-found.tsx | 1 - 1 file changed, 1 deletion(-) 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 From b7d79c1f6f1b7b35e81015f2c4f0017d595f26bb Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 19:07:20 +0530 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20=F0=9F=9B=A0=EF=B8=8F=20Impro?= =?UTF-8?q?ve=20layout=20structure=20and=20styling=20for=20dashboard=20and?= =?UTF-8?q?=20hint=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/layout.tsx | 22 ++++++++++++++-------- app/dashboard/problems/page.tsx | 5 +++-- components/HintCard.tsx | 10 +++++----- 3 files changed, 22 insertions(+), 15 deletions(-) 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/problems/page.tsx b/app/dashboard/problems/page.tsx index fcc42c2..ac22099 100644 --- a/app/dashboard/problems/page.tsx +++ b/app/dashboard/problems/page.tsx @@ -207,9 +207,10 @@ export default function Home() {
- + + {Array.isArray(problems) && problems.length > 0 ? ( problems.map((problem, index) => ( @@ -244,7 +245,7 @@ export default function Home() { ) : (detailedProblems[index]?.likes)} -
IDTitleDifficultyAccuracyVideoTagsHintsIDTitleDifficultyAccuracyVideoTagsHints
{detailedProblems[index]?.questionId} +
{detailedProblems[index]?.questionId} {problem.difficulty}{Math.round((problem.acRate))}%{problem.hasVideoSolution ? "Yes" : "No"} + {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 > 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 > 1000 ? (`${Math.round(detailedProblems[index]?.dislikes / 1000)}K` ) : (detailedProblems[index]?.dislikes)} + {detailedProblems[index]?.hints?.length > 0 ? ( ) : ( @@ -244,7 +258,7 @@ export default function Home() {
No problems foundNo problems found
Tags HintsHints
{detailedProblems[index]?.dislikes > 1000 ? (`${Math.round(detailedProblems[index]?.dislikes / 1000)}K` ) : (detailedProblems[index]?.dislikes)} + {detailedProblems[index]?.hints?.length > 0 ? ( ) : ( diff --git a/components/HintCard.tsx b/components/HintCard.tsx index 9cb834a..cea09bf 100644 --- a/components/HintCard.tsx +++ b/components/HintCard.tsx @@ -15,18 +15,18 @@ import { Button } from "@/components/ui/button"; export function HintCard({ hints }: { hints: string[] }) { return ( - - + + - + - Hints + Hints
    {hints.slice(0, 3).map((hint, index) => ( -
  • {String(hint)}
  • +
  • {String(hint)}
  • ))}
From 3df0059a5db9fce27541f02940b4c190a5dfd365 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 19:13:09 +0530 Subject: [PATCH 10/14] =?UTF-8?q?chore:=20=F0=9F=90=9B=20Pruned=20npm=20li?= =?UTF-8?q?bs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 545 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 4 +- 2 files changed, 515 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96cf2a8..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", @@ -74,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" } @@ -114,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", @@ -996,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": { @@ -1018,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": { @@ -4207,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", @@ -8134,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 21d9668..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", @@ -75,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" } From dbb7311c91d39e15ab76d06d0e8f762dbe47c02e Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 19:22:20 +0530 Subject: [PATCH 11/14] =?UTF-8?q?refactor:=20=F0=9F=9B=A0=EF=B8=8F=20Enhan?= =?UTF-8?q?ce=20QuickStat=20component=20layout=20and=20responsiveness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/page.tsx | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 754b782..ca1eaa9 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -356,14 +356,20 @@ function QuickStat({ icon, label, value, color = "blue" }: { icon: React.ReactNo }; return ( -
-
-
- {icon} +
+
+
+
+ {icon} +
-
-
{value.toLocaleString()}
-
{label}
+
+
+ {value.toLocaleString()} +
+
+ {label} +
From d6f7dfe2bb794b4e14a5c2099fe93f21e510f710 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 19:38:16 +0530 Subject: [PATCH 12/14] commit message goes here --- app/dashboard/page.tsx | 216 +++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 106 deletions(-) diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index ca1eaa9..549e104 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: }, ]} /> @@ -291,16 +293,16 @@ export default function Dashboard() { {/* Problem Distribution Chart */} - +
- -

Problem Distribution

+ +

Problem Distribution

- -
+ +
{ @@ -356,18 +358,18 @@ function QuickStat({ icon, label, value, color = "blue" }: { icon: React.ReactNo }; return ( -
-
-
-
+
+
+
+
{icon}
-
- {value.toLocaleString()} +
+ {typeof value === 'number' ? value.toLocaleString() : value}
-
+
{label}
@@ -379,23 +381,25 @@ 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}
))}
@@ -420,32 +424,32 @@ function SocialLink({ href, icon }: { href?: string; icon: React.ReactNode }) { function DashboardSkeleton() { return ( -
-
- -
- - -
- - - +
+
+ +
+ + +
+ + +
-
-
- +
+
+
- -
-
- - + +
+
+ +
- +
); From 8af78ab10e07dec701bad484c87865288f5072ad Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 19:51:49 +0530 Subject: [PATCH 13/14] =?UTF-8?q?refactor:=20=F0=9F=9B=A0=EF=B8=8F=20Updat?= =?UTF-8?q?e=20styling=20and=20layout=20for=20Dashboard=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/page.tsx | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 549e104..81a763c 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -118,9 +118,9 @@ export default function Dashboard() { @{userDetails.username} • Rank #{userDetails.profile.ranking}

- } /> - } /> - } /> + } /> + } /> + } />
@@ -149,7 +149,7 @@ export default function Dashboard() {
{/* Activity Calendar Section */} - +
@@ -199,7 +199,7 @@ export default function Dashboard() { {/* Recent Submissions Card */} - +
@@ -233,7 +233,7 @@ export default function Dashboard() { {/* Statistics Cards */} -
+
{/* Problem Distribution Chart */} - +
@@ -352,15 +352,15 @@ 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}
@@ -380,7 +380,7 @@ function QuickStat({ icon, label, value, color = "blue" }: { icon: React.ReactNo function DetailCard({ title, icon, stats }: { title: string; icon: React.ReactNode; stats: any[] }) { return ( - +
{icon} @@ -391,7 +391,7 @@ function DetailCard({ title, icon, stats }: { title: string; icon: React.ReactNo
{stats.map((stat, idx) => (
{stat.icon} From 06162aa020f7bc54cd370837dd18a2fde911f074 Mon Sep 17 00:00:00 2001 From: yashksaini-coder Date: Mon, 3 Mar 2025 20:07:46 +0530 Subject: [PATCH 14/14] =?UTF-8?q?refactor:=20=F0=9F=9B=A0=EF=B8=8F=20Enhan?= =?UTF-8?q?ce=20layout=20and=20responsiveness=20of=20Problem=20Distributio?= =?UTF-8?q?n=20Chart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/dashboard/page.tsx | 78 ++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 81a763c..0d47816 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -292,8 +292,8 @@ export default function Dashboard() {
{/* Problem Distribution Chart */} - - + +
@@ -301,47 +301,49 @@ export default function Dashboard() {
- -
- +
+
+ { - 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}%)`; + } } } } - } - }} - /> + }} + /> +