/* Symphony — App shell, hash router, tweaks */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "coral",
"displayFont": "serif",
"heroVariant": "split",
"density": "default"
}/*EDITMODE-END*/;
const ROUTES = ['home', 'treatments', 'laser', 'team', 'reviews', 'contact'];
function App() {
const [route, setRoute] = React.useState(() => {
const fallback = window.__BYTESGLUE_SHOWCASE_ROUTE || 'home';
const h = (location.hash || '#' + fallback).slice(1);
return ROUTES.includes(h) ? h : 'home';
});
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply tweaks → root data-attributes
React.useEffect(() => {
const r = document.documentElement;
r.dataset.palette = tweaks.palette;
r.dataset.display = tweaks.displayFont === 'sans' ? 'sans' : '';
r.dataset.density = tweaks.density === 'default' ? '' : tweaks.density;
}, [tweaks.palette, tweaks.displayFont, tweaks.density]);
// Hash sync
React.useEffect(() => {
const onHash = () => {
const fallback = window.__BYTESGLUE_SHOWCASE_ROUTE || 'home';
const h = (location.hash || '#' + fallback).slice(1);
if (ROUTES.includes(h)) {
setRoute(h);
window.scrollTo({ top: 0, behavior: 'instant' });
}
};
window.addEventListener('hashchange', onHash);
return () => window.removeEventListener('hashchange', onHash);
}, []);
const navigate = (r) => {
if (location.hash !== '#' + r) { location.hash = r; }
setRoute(r);
window.scrollTo({ top: 0, behavior: 'instant' });
};
let Page;
switch (route) {
case 'treatments': Page = ; break;
case 'laser': Page = ; break;
case 'team': Page = ; break;
case 'reviews': Page = ; break;
case 'contact': Page = ; break;
default: Page = ;
}
return (
<>
{Page}
>
);
}
// ───────────── Tweaks UI ─────────────
function SymphonyTweaks({ tweaks, setTweak }) {
return (
setTweak('palette', v)}
options={[
{ value: 'coral', label: 'Coral · brand (default)' },
{ value: 'champagne', label: 'Champagne · classic' },
{ value: 'noir', label: 'Editorial · noir' },
]}
/>
setTweak('displayFont', v)}
options={[
{ value: 'serif', label: 'Cormorant' },
{ value: 'sans', label: 'Montserrat' },
]}
/>
setTweak('heroVariant', v)}
options={[
{ value: 'split', label: 'Asymmetric split' },
{ value: 'editorial', label: 'Editorial full-bleed' },
{ value: 'quiet', label: 'Quiet typographic' },
]}
/>
setTweak('density', v)}
options={[
{ value: 'tight', label: 'Tight' },
{ value: 'default', label: 'Default' },
{ value: 'airy', label: 'Airy' },
]}
/>
);
}
// Mount
ReactDOM.createRoot(document.getElementById('root')).render();