// ============ App shell — route state, Tweaks, mount ============
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "teal",
"fontPair": "manrope-source-serif",
"density": "comfortable"
}/*EDITMODE-END*/;
const PALETTES = {
teal: {
name: "Brand teal",
swatch: ["#008B8C", "#98B9A8", "#005F66"],
"--teal": "#008B8C",
"--teal-deep": "#005F66",
"--teal-soft": "#D6EAE7",
"--sage": "#98B9A8",
"--sage-soft": "#E7EFE9",
"--focus": "#008B8C",
},
sage: {
name: "Sage forward",
swatch: ["#5A8F7B", "#98B9A8", "#37624F"],
"--teal": "#5A8F7B",
"--teal-deep": "#37624F",
"--teal-soft": "#E2EBE5",
"--sage": "#98B9A8",
"--sage-soft": "#EDF2EE",
"--focus": "#5A8F7B",
},
porcelain: {
name: "Quiet porcelain",
swatch: ["#3A5460", "#B5C0BD", "#1F3A47"],
"--teal": "#3A5460",
"--teal-deep": "#1F3A47",
"--teal-soft": "#E3EAEE",
"--sage": "#B5C0BD",
"--sage-soft": "#EEF1F0",
"--focus": "#3A5460",
},
};
const FONT_PAIRS = {
"manrope-source-serif": {
name: "Manrope + Source Serif",
"--sans": '"Manrope", system-ui, sans-serif',
"--serif": '"Source Serif 4", Georgia, serif',
},
"manrope-newsreader": {
name: "Manrope + Newsreader",
"--sans": '"Manrope", system-ui, sans-serif',
"--serif": '"Newsreader", Georgia, serif',
},
"ibmplex-fraunces": {
name: "IBM Plex + Fraunces",
"--sans": '"IBM Plex Sans", system-ui, sans-serif',
"--serif": '"Fraunces", Georgia, serif',
},
};
function App() {
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [route, setRoute] = React.useState({ name: "home" });
const [bookOpen, setBookOpen] = React.useState(false);
// Apply palette / font tweaks
React.useEffect(() => {
const p = PALETTES[tweaks.palette] || PALETTES.teal;
const f = FONT_PAIRS[tweaks.fontPair] || FONT_PAIRS["manrope-source-serif"];
const root = document.documentElement;
Object.entries(p).forEach(([k, v]) => { if (k.startsWith("--")) root.style.setProperty(k, v); });
Object.entries(f).forEach(([k, v]) => { if (k.startsWith("--")) root.style.setProperty(k, v); });
document.body.classList.toggle("density-compact", tweaks.density === "compact");
}, [tweaks.palette, tweaks.fontPair, tweaks.density]);
// Reset scroll on route change
React.useEffect(() => {
window.scrollTo({ top: 0, behavior: "instant" });
}, [route]);
const onBook = () => setBookOpen(true);
return (
<>
{route.name === "home" && }
{route.name === "specialties" && }
{route.name === "treatment" && }
{route.name === "doctors" && }
{route.name === "doctor" && }
{route.name === "about" && }
{route.name === "contact" && }
setBookOpen(false)} />
setTweak("palette", v)}
options={[
{ value: "teal", label: "Teal" },
{ value: "sage", label: "Sage" },
{ value: "porcelain", label: "Slate" },
]}
/>
setTweak("fontPair", v)}
options={Object.entries(FONT_PAIRS).map(([value, p]) => ({ value, label: p.name }))}
/>
setTweak("density", v)}
options={[
{ value: "compact", label: "Compact" },
{ value: "comfortable", label: "Roomy" },
]}
/>
setBookOpen(true)} />
setRoute({ name: "treatment", id: "fue-hair-transplant" })} secondary />
setRoute({ name: "doctor", id: "ken-arashiro" })} secondary />
>
);
}
ReactDOM.createRoot(document.getElementById("root")).render();