/* App — Tierra de Vino y Sal */ const { useState, useEffect, useMemo } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "direction": "A", "dark": false, "hero": "cover", "lang": "es", "order": "default" }/*EDITMODE-END*/; function App() { const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS); const [editable, setEditable] = useState(false); const [copyOverrides, setCopyOverrides] = useState({}); const lang = tweaks.lang || 'es'; const t = useMemo(() => { const base = window.I18N[lang]; if (!Object.keys(copyOverrides).length) return base; return { ...base, hero: { ...base.hero, ...copyOverrides }, }; }, [lang, copyOverrides]); useReveal([lang, tweaks.order, tweaks.hero, tweaks.direction]); // body data attributes useEffect(() => { document.body.dataset.direction = tweaks.direction; document.body.dataset.dark = tweaks.dark ? 'true' : 'false'; document.documentElement.lang = lang; }, [tweaks.direction, tweaks.dark, lang]); // initialize editable hero copy from i18n useEffect(() => { const base = window.I18N[lang]; setCopyOverrides({ title_1: base.hero.title_1, pitch: base.hero.pitch, }); }, [lang]); // Section ordering tweak const orderings = { default: ['hero','synopsis','characters','world','video','author','buy','newsletter'], 'video-first': ['hero','video','synopsis','characters','world','author','buy','newsletter'], 'buy-first': ['hero','buy','synopsis','characters','world','video','author','newsletter'], 'author-first': ['hero','author','synopsis','characters','world','video','buy','newsletter'], }; const order = orderings[tweaks.order] || orderings.default; const sections = { hero: setCopyOverrides(c => ({...c, ...patch}))} />, synopsis: , characters: , world: , video: