/* global React */ /* eslint-disable */ const { useState, useCallback } = React; /* ============================================================ useTweaks — persists tweaks in localStorage ============================================================ */ function useTweaks(defaults) { const key = "mariany_tweaks_v1"; const [tweaks, setTweaks] = useState(() => { try { const stored = JSON.parse(localStorage.getItem(key) || "{}"); return { ...defaults, ...stored }; } catch { return { ...defaults }; } }); const setTweak = useCallback((k, v) => { setTweaks((prev) => { const next = { ...prev, [k]: v }; try { localStorage.setItem(key, JSON.stringify(next)); } catch {} return next; }); }, []); return [tweaks, setTweak]; } /* ============================================================ Panel primitives ============================================================ */ function TweaksPanel({ title, children }) { const [open, setOpen] = useState(false); return (
{open && (
{title}
{children}
)}
); } function TweakSection({ label, children }) { return (
{label}
{children}
); } function TweakToggle({ label, value, onChange }) { return (
); } function TweakSlider({ label, value, min, max, step, onChange }) { return (
onChange(Number(e.target.value))} />
); } function TweakText({ label, value, onChange }) { return (
onChange(e.target.value)} />
); } function TweakRadio({ label, value, options, onChange }) { return (
{options.map((opt) => ( ))}
); }