diff --git a/src/app/dashboard/settings/_components/color-theme-selector.tsx b/src/app/dashboard/settings/_components/color-theme-selector.tsx
new file mode 100644
index 0000000..ec0cb8a
--- /dev/null
+++ b/src/app/dashboard/settings/_components/color-theme-selector.tsx
@@ -0,0 +1,54 @@
+"use client";
+
+import { useTheme } from "next-themes";
+import { Check, Palette } from "lucide-react";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "~/components/ui/dropdown-menu";
+import { Button } from "~/components/ui/button";
+
+export function ColorThemeSelector() {
+ const { theme, setTheme } = useTheme();
+
+ const themes = [
+ { name: "theme-ocean", label: "Ocean" },
+ { name: "theme-sunset", label: "Sunset" },
+ { name: "theme-forest", label: "Forest" },
+ ];
+
+ const currentTheme = themes.find((t) => t.name === theme)?.label ?? "Ocean";
+
+ return (
+
+
+
+
+ Select a color theme for the application.
+
+
+
+
+
+
+
+ {themes.map((t) => (
+ setTheme(t.name)}
+ >
+ {t.label}
+ {theme === t.name && }
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/app/dashboard/settings/_components/mode-switcher.tsx b/src/app/dashboard/settings/_components/mode-switcher.tsx
new file mode 100644
index 0000000..0cec1a5
--- /dev/null
+++ b/src/app/dashboard/settings/_components/mode-switcher.tsx
@@ -0,0 +1,33 @@
+"use client";
+
+import { useTheme } from "next-themes";
+import { Sun, Moon, Laptop } from "lucide-react";
+import { Tabs, TabsList, TabsTrigger } from "~/components/ui/tabs";
+
+export function ModeSwitcher() {
+ const { theme, setTheme } = useTheme();
+
+ return (
+
+
+
+
+ Select a light or dark mode, or sync with your system.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/dashboard/settings/_components/settings-content.tsx b/src/app/dashboard/settings/_components/settings-content.tsx
index 1e5e926..8923ed6 100644
--- a/src/app/dashboard/settings/_components/settings-content.tsx
+++ b/src/app/dashboard/settings/_components/settings-content.tsx
@@ -62,7 +62,8 @@ import { Textarea } from "~/components/ui/textarea";
import { api } from "~/trpc/react";
import { Switch } from "~/components/ui/switch";
import { Slider } from "~/components/ui/slider";
-import { ThemeSelector } from "./theme-selector";
+import { ModeSwitcher } from "./mode-switcher";
+import { ColorThemeSelector } from "./color-theme-selector";
import { useAnimationPreferences } from "~/components/providers/animation-preferences-provider";
export function SettingsContent() {
@@ -628,8 +629,9 @@ export function SettingsContent() {
Customize the look and feel of the application
-
-
+
+
+
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 17d5cd3..ff6e9cb 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -2,7 +2,7 @@ import "~/styles/globals.css";
import { Analytics } from "@vercel/analytics/next";
import { type Metadata } from "next";
-import { Geist_Mono } from "next/font/google";
+import { Geist, Geist_Mono, Instrument_Serif } from "next/font/google";
import { TRPCReactProvider } from "~/trpc/react";
import { Toaster } from "~/components/ui/sonner";
@@ -17,17 +17,34 @@ export const metadata: Metadata = {
icons: [{ rel: "icon", url: "/favicon.ico" }],
};
+const geistSans = Geist({
+ subsets: ["latin"],
+ variable: "--font-geist-sans",
+ display: "swap",
+});
+
const geistMono = Geist_Mono({
subsets: ["latin"],
variable: "--font-geist-mono",
display: "swap",
});
+const instrumentSerif = Instrument_Serif({
+ subsets: ["latin"],
+ variable: "--font-serif",
+ display: "swap",
+ weight: "400",
+});
+
export default function RootLayout({
children,
}: Readonly<{ children: React.ReactNode }>) {
return (
-
+
{/* Inline early animation preference script to avoid FOUC */}