// Soul MVNT — app root const { useState, useEffect } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "terracotta", "ground": "ivory", "displayFont": "fraunces" }/*EDITMODE-END*/; const ACCENT_PALETTES = { terracotta: { accent: "#B85F44", deep: "#8E4329", rose: "#D9B1A5" }, burl: { accent: "#7A5B3A", deep: "#574736", rose: "#C5AC8E" }, sage: { accent: "#6B8367", deep: "#4F6A4E", rose: "#B8C7AF" }, noir: { accent: "#211C16", deep: "#000000", rose: "#8C7B66" }, }; const GROUND_PALETTES = { ivory: { bg: "#F8F3EA", surface: "#EFE7D9", marble: "#F2ECE2", line: "#E6DCCD" }, pearl: { bg: "#F4F2EE", surface: "#E8E3DB", marble: "#EEEAE3", line: "#DCD5C9" }, bone: { bg: "#EFE7D9", surface: "#E5DBCA", marble: "#E9DFCD", line: "#D6C9B3" }, }; const DISPLAY_FONTS = { fraunces: '"Fraunces", "Cormorant Garamond", Georgia, serif', syne: '"Syne", Georgia, serif', mont: '"Montserrat", -apple-system, sans-serif', }; function App() { const [route, setRoute] = useState("home"); const [activeFormat, setActiveFormat] = useState(null); const [cart, setCart] = useState([]); const [cartOpen, setCartOpen] = useState(false); const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); // Expose nav for logo / footer links useEffect(() => { window.__nav = setRoute; }, []); // Apply palette tokens useEffect(() => { const a = ACCENT_PALETTES[t.accent] || ACCENT_PALETTES.terracotta; const g = GROUND_PALETTES[t.ground] || GROUND_PALETTES.ivory; const root = document.documentElement; root.style.setProperty("--terracotta", a.accent); root.style.setProperty("--terracotta-deep", a.deep); root.style.setProperty("--rose", a.rose); root.style.setProperty("--ivory", g.bg); root.style.setProperty("--bone", g.surface); root.style.setProperty("--marble", g.marble); root.style.setProperty("--line", g.line); root.style.setProperty("--font-serif", DISPLAY_FONTS[t.displayFont] || DISPLAY_FONTS.fraunces); }, [t.accent, t.ground, t.displayFont]); // Scroll to top on route change useEffect(() => { window.scrollTo({ top: 0, behavior: "smooth" }); }, [route]); const onAdd = (p) => { setCart(prev => { const ex = prev.find(x => x.id === p.id); if (ex) return prev.map(x => x.id === p.id ? { ...x, qty: x.qty + 1 } : x); return [...prev, { ...p, qty: 1 }]; }); }; const onChangeQty = (id, delta) => { setCart(prev => prev .map(x => x.id === id ? { ...x, qty: x.qty + delta } : x) .filter(x => x.qty > 0)); }; const cartCount = cart.reduce((s, i) => s + i.qty, 0); return (