diff --git a/apps/web/src/lib/stores/use-theme-store.ts b/apps/web/src/lib/stores/use-theme-store.ts index fe51651..63db0ea 100644 --- a/apps/web/src/lib/stores/use-theme-store.ts +++ b/apps/web/src/lib/stores/use-theme-store.ts @@ -2,7 +2,7 @@ import { create } from "zustand"; import { persist } from "zustand/middleware"; export type ThemeMode = "light" | "dark" | "system"; -export type AccentColor = "slate" | "blue" | "green" | "purple" | "orange"; +export type AccentColor = "slate" | "blue" | "green" | "purple" | "orange" | "rose"; interface ThemeState { mode: ThemeMode; @@ -18,6 +18,7 @@ export const ACCENT_PALETTE: Record green: { name: "Green", hsl: "142 71% 45%" }, purple: { name: "Purple", hsl: "271 81% 56%" }, orange: { name: "Orange", hsl: "24 95% 53%" }, + rose: { name: "Rose", hsl: "340 82% 52%" }, }; export const useThemeStore = create()( diff --git a/apps/web/src/routes/_app/settings.tsx b/apps/web/src/routes/_app/settings.tsx index 9851304..1181976 100644 --- a/apps/web/src/routes/_app/settings.tsx +++ b/apps/web/src/routes/_app/settings.tsx @@ -18,6 +18,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog"; import { cn } from "@/lib/utils"; +import { useThemeStore, ACCENT_PALETTE, type ThemeMode, type AccentColor } from "@/lib/stores/use-theme-store"; import type { Domain, CustomField, Webhook as WebhookType, ErrorLog, Agent, PaginatedResponse } from "@/lib/types"; const SETTINGS_TABS = [ @@ -32,13 +33,10 @@ const SETTINGS_TABS = [ { id: "error-log", label: "Error Log", icon: AlertCircle }, ] as const; -const ACCENT_COLORS = [ - { name: "Blue", value: "#3b82f6" }, - { name: "Green", value: "#22c55e" }, - { name: "Purple", value: "#a855f7" }, - { name: "Orange", value: "#f97316" }, - { name: "Rose", value: "#e11d48" }, -]; +const ACCENT_COLORS = Object.entries(ACCENT_PALETTE).map(([key, val]) => ({ + name: val.name, + value: key as AccentColor, +})); const SHORTCUTS_MAP: Record = { "Cmd+K": "Command palette", @@ -57,15 +55,12 @@ const SHORTCUTS_MAP: Record = { // ─── Appearance Tab ────────────────────────────────────────────────────── function AppearanceTab() { - const [theme, setTheme] = useState(localStorage.getItem("theme") || "system"); - const [accent, setAccent] = useState(localStorage.getItem("accent-color") || "#3b82f6"); + const { mode, setMode, accent, setAccent } = useThemeStore(); const [fontSize, setFontSize] = useState(localStorage.getItem("font-size") || "normal"); const [density, setDensity] = useState(localStorage.getItem("density") || "comfortable"); const [sidebarPos, setSidebarPos] = useState(localStorage.getItem("sidebar-position") || "left"); const [reducedMotion, setReducedMotion] = useState(localStorage.getItem("reduced-motion") === "true"); - useEffect(() => { localStorage.setItem("theme", theme); document.documentElement.className = theme; }, [theme]); - useEffect(() => { localStorage.setItem("accent-color", accent); document.documentElement.style.setProperty("--accent-color", accent); }, [accent]); useEffect(() => { localStorage.setItem("font-size", fontSize); document.documentElement.style.fontSize = fontSize === "large" ? "18px" : fontSize === "small" ? "13px" : "16px"; }, [fontSize]); useEffect(() => { localStorage.setItem("density", density); }, [density]); useEffect(() => { localStorage.setItem("sidebar-position", sidebarPos); }, [sidebarPos]); @@ -81,8 +76,8 @@ function AppearanceTab() { { id: "dark", icon: Moon, label: "Dark" }, { id: "system", icon: Monitor, label: "System" }, ].map((t) => ( - @@ -93,11 +88,14 @@ function AppearanceTab() {

Accent Color

- {ACCENT_COLORS.map((c) => ( -
@@ -147,8 +145,6 @@ function AppearanceTab() { ); } -// ─── Domains Tab ───────────────────────────────────────────────────────── - function DomainsTab() { const queryClient = useQueryClient(); const { data } = useApiQuery>(["domains"], "/domains");