// App entry — router, language state, tweaks.
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"heroLayout": "poster",
"accent": "ember",
"density": "standard",
"defaultLang": "ko"
}/*EDITMODE-END*/;
const ACCENTS = {
ember: { color: '#cc4a1c', tone: 'ember', label: 'Ember' },
forest: { color: '#3d6b3a', tone: 'forest', label: 'Forest' },
dusk: { color: '#445d7e', tone: 'dusk', label: 'Dusk Blue' },
mono: { color: '#191712', tone: 'mono', label: 'Monochrome' },
};
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [route, setRoute] = React.useState(() => {
const h = (location.hash || '').replace('#', '');
const ids = ['home','about','sermons','events','welcome','gallery','contact'];
return ids.includes(h) ? h : 'home';
});
const [lang, setLang] = React.useState(tweaks.defaultLang || 'ko');
React.useEffect(() => {
history.replaceState(null, '', `#${route}`);
window.scrollTo({ top: 0, behavior: 'smooth' });
}, [route]);
React.useEffect(() => {
document.body.dataset.density = tweaks.density;
const a = ACCENTS[tweaks.accent] || ACCENTS.ember;
document.documentElement.style.setProperty('--accent', a.color);
}, [tweaks.density, tweaks.accent]);
React.useEffect(() => {
document.documentElement.lang = lang;
}, [lang]);
const t = CONTENT[lang];
const accentObj = ACCENTS[tweaks.accent] || ACCENTS.ember;
const accent = accentObj.color;
const accentTone = accentObj.tone;
const pageProps = { lang, t, setRoute, accent, accentTone };
return (
<>
{route === 'home' && }
{route === 'about' && }
{route === 'sermons' && }
{route === 'events' && }
{route === 'welcome' && }
{route === 'gallery' && }
{route === 'contact' && }
{route !== 'contact' && route !== 'welcome' && (
)}
setTweak('heroLayout', v)}
options={[
{ value: 'poster', label: 'Poster' },
{ value: 'fullbleed', label: 'Full bleed' },
{ value: 'split', label: 'Split' },
]}
/>
setTweak('accent', v)}
options={Object.entries(ACCENTS).map(([k, a]) => ({ value: k, label: a.label }))}
/>
setTweak('density', v)}
options={[
{ value: 'airy', label: 'Airy' },
{ value: 'standard', label: 'Standard' },
{ value: 'compact', label: 'Compact' },
]}
/>
{ setTweak('defaultLang', v); setLang(v); }}
options={[
{ value: 'ko', label: '한국어' },
{ value: 'en', label: 'English' },
]}
/>
>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render();