diff --git a/app/layout.tsx b/app/layout.tsx index 68f4072..b09040c 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -27,8 +27,8 @@ export default function RootLayout({ diff --git a/app/settings/page.tsx b/app/settings/page.tsx index 215d3c0..0a32e84 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -10,6 +10,7 @@ import { PasswordCard, ReconcileDateRangeCard, BackgroundCard, + ThemeCard, } from "@/components/settings"; import { useBankingData } from "@/lib/hooks"; import type { BankingData } from "@/lib/types"; @@ -127,6 +128,8 @@ export default function SettingsPage() { + + diff --git a/components/settings/index.ts b/components/settings/index.ts index e28bc05..1654f04 100644 --- a/components/settings/index.ts +++ b/components/settings/index.ts @@ -5,3 +5,4 @@ export { BackupCard } from "./backup-card"; export { PasswordCard } from "./password-card"; export { ReconcileDateRangeCard } from "./reconcile-date-range-card"; export { BackgroundCard } from "./background-card"; +export { ThemeCard } from "./theme-card"; diff --git a/components/settings/theme-card.tsx b/components/settings/theme-card.tsx new file mode 100644 index 0000000..f0d21c9 --- /dev/null +++ b/components/settings/theme-card.tsx @@ -0,0 +1,93 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { useEffect, useState } from "react"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import { Moon, Sun } from "lucide-react"; +import { cn } from "@/lib/utils"; + +const THEMES = [ + { + value: "light", + label: "Clair", + icon: Sun, + description: "Thème clair", + }, + { + value: "dark", + label: "Sombre", + icon: Moon, + description: "Thème sombre", + }, +] as const; + +export function ThemeCard() { + const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + // Éviter le flash de contenu non stylé + useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) { + return null; + } + + const currentTheme = theme || "light"; + + return ( + + + + + Thème + + + Choisissez le thème d'affichage de l'application + + + + setTheme(value)} + > +
+ {THEMES.map((themeOption) => { + const Icon = themeOption.icon; + return ( + + ); + })} +
+
+
+
+ ); +} diff --git a/components/ui/sonner.tsx b/components/ui/sonner.tsx index f125983..28a69f7 100644 --- a/components/ui/sonner.tsx +++ b/components/ui/sonner.tsx @@ -4,11 +4,11 @@ import { useTheme } from "next-themes"; import { Toaster as Sonner, ToasterProps } from "sonner"; const Toaster = ({ ...props }: ToasterProps) => { - const { theme = "system" } = useTheme(); + const { theme = "light" } = useTheme(); return (