import React, { useEffect, useState } from "react"; import { X } from "lucide-react"; type Theme = "system" | "light" | "dark"; export interface AppSettings { theme: Theme; compactMode: boolean; } const STORAGE_KEY = "water_project_settings_v1"; export const defaultSettings: AppSettings = { theme: "system", compactMode: false, }; export const loadSettings = (): AppSettings => { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return defaultSettings; const parsed = JSON.parse(raw) as Partial; return { theme: parsed.theme ?? defaultSettings.theme, compactMode: parsed.compactMode ?? defaultSettings.compactMode, }; } catch { return defaultSettings; } }; export const saveSettings = (s: AppSettings) => { localStorage.setItem(STORAGE_KEY, JSON.stringify(s)); }; const applyTheme = (theme: Theme) => { const root = document.documentElement; root.classList.remove("dark"); if (theme === "dark") root.classList.add("dark"); if (theme === "system") { const prefersDark = window.matchMedia?.("(prefers-color-scheme: dark)")?.matches; if (prefersDark) root.classList.add("dark"); } }; export default function SettingsModal({ open, onClose, settings, setSettings, }: { open: boolean; onClose: () => void; settings: AppSettings; setSettings: (s: AppSettings) => void; }) { const [local, setLocal] = useState(settings); useEffect(() => { if (open) setLocal(settings); }, [open, settings]); useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; if (open) window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, [open, onClose]); if (!open) return null; const onSave = () => { setSettings(local); saveSettings(local); applyTheme(local.theme); onClose(); }; const onReset = () => setLocal(defaultSettings); return (
{/* Overlay */}
{/* Tema */}

Tema

{([ { key: "system", label: "Sistema" }, { key: "light", label: "Claro" }, { key: "dark", label: "Oscuro" }, ] as const).map((t) => { const active = local.theme === t.key; return ( ); })}
{/* Compact mode */}

Modo compacto

Reduce paddings/espaciado en tablas y tarjetas.

); }