From 5cc77ae5b0056445ef3d1345b882cb797db5399e Mon Sep 17 00:00:00 2001
From: Mathis HERRIOT <197931332+0x485254@users.noreply.github.com>
Date: Tue, 20 Jan 2026 16:27:59 +0100
Subject: [PATCH] feat(theme): add appearance settings and theme provider
integration
- Added theme selection in settings page for light, dark, and system modes.
- Integrated ThemeProvider into application layout.
- Updated dashboard layout to include theme toggle in the header.
---
frontend/src/app/(dashboard)/layout.tsx | 6 +-
.../src/app/(dashboard)/settings/page.tsx | 60 ++++++++++++++++++-
frontend/src/app/layout.tsx | 16 +++--
3 files changed, 76 insertions(+), 6 deletions(-)
diff --git a/frontend/src/app/(dashboard)/layout.tsx b/frontend/src/app/(dashboard)/layout.tsx
index fe976cb..0f03f20 100644
--- a/frontend/src/app/(dashboard)/layout.tsx
+++ b/frontend/src/app/(dashboard)/layout.tsx
@@ -8,6 +8,7 @@ import {
SidebarTrigger,
} from "@/components/ui/sidebar";
import { UserNavMobile } from "@/components/user-nav-mobile";
+import { ModeToggle } from "@/components/mode-toggle";
export default function DashboardLayout({
children,
@@ -27,7 +28,10 @@ export default function DashboardLayout({
MemeGoat
-
+
+
+
+
{children}
diff --git a/frontend/src/app/(dashboard)/settings/page.tsx b/frontend/src/app/(dashboard)/settings/page.tsx
index f5e56ea..0aa5d0b 100644
--- a/frontend/src/app/(dashboard)/settings/page.tsx
+++ b/frontend/src/app/(dashboard)/settings/page.tsx
@@ -1,7 +1,8 @@
"use client";
import { zodResolver } from "@hookform/resolvers/zod";
-import { Loader2, Save, User as UserIcon } from "lucide-react";
+import { Loader2, Moon, Laptop, Palette, Save, Sun, User as UserIcon } from "lucide-react";
+import { useTheme } from "next-themes";
import * as React from "react";
import { useForm } from "react-hook-form";
import { toast } from "sonner";
@@ -24,6 +25,8 @@ import {
FormMessage,
} from "@/components/ui/form";
import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
import { Spinner } from "@/components/ui/spinner";
import { Textarea } from "@/components/ui/textarea";
import { useAuth } from "@/providers/auth-provider";
@@ -37,8 +40,14 @@ const settingsSchema = z.object({
type SettingsFormValues = z.infer;
export default function SettingsPage() {
+ const { theme, setTheme } = useTheme();
const { user, isLoading, refreshUser } = useAuth();
const [isSaving, setIsSaving] = React.useState(false);
+ const [mounted, setMounted] = React.useState(false);
+
+ React.useEffect(() => {
+ setMounted(true);
+ }, []);
const form = useForm({
resolver: zodResolver(settingsSchema),
@@ -185,6 +194,55 @@ export default function SettingsPage() {
+
+
+
+
+ Personnalisez l'apparence de l'application selon vos préférences.
+
+
+
+ setTheme(value)}
+ className="grid grid-cols-1 sm:grid-cols-3 gap-4"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx
index 2146a75..1e826a0 100644
--- a/frontend/src/app/layout.tsx
+++ b/frontend/src/app/layout.tsx
@@ -2,6 +2,7 @@ import type { Metadata } from "next";
import { Ubuntu_Mono, Ubuntu_Sans } from "next/font/google";
import { Toaster } from "@/components/ui/sonner";
import { AuthProvider } from "@/providers/auth-provider";
+import { ThemeProvider } from "@/providers/theme-provider";
import "./globals.css";
const ubuntuSans = Ubuntu_Sans({
@@ -60,10 +61,17 @@ export default function RootLayout({
-
- {children}
-
-
+
+
+ {children}
+
+
+