// app.jsx — root component, ties together all sections and the Tweaks panel const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "lang": "zh", "accent": "#B5612C", "paperTone": "warm", "snap": true }/*EDITMODE-END*/; function App() { // Static config — Tweaks panel removed, so the runtime knobs collapse to the defaults. const t = TWEAK_DEFAULTS; // Apply tweaks to via attributes so CSS can react. React.useEffect(() => { const root = document.documentElement; root.dataset.lang = t.lang; root.dataset.tone = t.paperTone; root.style.setProperty("--brick", t.accent); // hover & soft shades derived from accent (simple darker) root.style.setProperty("--brick-hover", shade(t.accent, -.12)); // tone swaps the paper bg const toneMap = { warm: { paper: "#F4ECDD", warm: "#EEE3CE", card: "#FBF6EA", deep: "#E5D8BD" }, ivory: { paper: "#F7F1E4", warm: "#F0E8D3", card: "#FDF8EC", deep: "#E8DDC1" }, stone: { paper: "#E8DFCB", warm: "#DBCFB4", card: "#F4EDDA", deep: "#CFC0A1" }, dusk: { paper: "#1F1A12", warm: "#27201A", card: "#2C2519", deep: "#3A2F1F" }, }; const m = toneMap[t.paperTone] || toneMap.warm; root.style.setProperty("--paper", m.paper); root.style.setProperty("--paper-warm", m.warm); root.style.setProperty("--paper-card", m.card); root.style.setProperty("--paper-deep", m.deep); document.body.style.background = m.paper; document.body.style.color = (t.paperTone === "dusk") ? "#E5DABF" : "#1F1A12"; // Scroll snap toggle — written as data-snap on , CSS does the rest. root.dataset.snap = t.snap ? "1" : "0"; }, [t.lang, t.accent, t.paperTone, t.snap]); const copy = (window.COPY || {})[t.lang] || (window.COPY || {}).zh; if (!copy) return