/* Hortman Clinics — main app + inline tweaks panel */ const { useState: aUseState, useEffect: aUseEffect, useRef: aUseRef } = React; /* ============================================================ Inline Tweaks panel — self-contained, no external import ============================================================ */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "jade", "display": "serif" }/*EDITMODE-END*/; function useTweaks(defaults) { const [values, setValues] = aUseState(defaults); const setTweak = (keyOrEdits, val) => { const edits = typeof keyOrEdits === "object" && keyOrEdits !== null ? keyOrEdits : { [keyOrEdits]: val }; setValues((prev) => ({ ...prev, ...edits })); try { window.parent.postMessage({ type: "__edit_mode_set_keys", edits }, "*"); } catch (e) {} }; return [values, setTweak]; } function TweaksPanel({ children }) { const [open, setOpen] = aUseState(false); aUseEffect(() => { const onMsg = (e) => { const t = e?.data?.type; if (t === "__activate_edit_mode") setOpen(true); else if (t === "__deactivate_edit_mode") setOpen(false); }; window.addEventListener("message", onMsg); try { window.parent.postMessage({ type: "__edit_mode_available" }, "*"); } catch (e) {} return () => window.removeEventListener("message", onMsg); }, []); const dismiss = () => { setOpen(false); try { window.parent.postMessage({ type: "__edit_mode_dismissed" }, "*"); } catch (e) {} }; if (!open) return null; return (
Tweaks
{children}
); } function TweakRadio({ label, value, options, onChange }) { return (
{label}
{options.map(([k, lbl]) => ( ))}
); } const PALETTES = { jade: { "--paper":"#F6F1E8","--paper-2":"#EDE6D7","--paper-3":"#E4DCC9", "--ink":"#18221F","--ink-2":"#3A4844","--muted":"#6E7872", "--jade":"#1F4A41","--jade-2":"#2C6A5C","--jade-soft":"#D6E0DB", "--bronze":"#A88248","--bronze-2":"#C39E68", "--line":"rgba(24, 34, 31, 0.12)","--line-2":"rgba(24, 34, 31, 0.06)" }, midnight: { "--paper":"#F2EFE9","--paper-2":"#E5E0D5","--paper-3":"#D6D0C0", "--ink":"#0F1622","--ink-2":"#2E3645","--muted":"#666E7E", "--jade":"#1A3A66","--jade-2":"#27548A","--jade-soft":"#D9E0EE", "--bronze":"#B08653","--bronze-2":"#CCA277", "--line":"rgba(15, 22, 34, 0.12)","--line-2":"rgba(15, 22, 34, 0.06)" }, stone: { "--paper":"#F4EFE7","--paper-2":"#E9E2D2","--paper-3":"#DFD6C2", "--ink":"#2A211A","--ink-2":"#4A3E33","--muted":"#7A6E62", "--jade":"#6E4E2E","--jade-2":"#8F6A45","--jade-soft":"#E8DDCB", "--bronze":"#9B7B4F","--bronze-2":"#BE9B6A", "--line":"rgba(42, 33, 26, 0.12)","--line-2":"rgba(42, 33, 26, 0.06)" } }; function App() { const [bookOpen, setBookOpen] = aUseState(false); const [bookPrefill, setBookPrefill] = aUseState(null); const [doctor, setDoctor] = aUseState(null); const [consentOpen, setConsentOpen] = aUseState(false); const [openSpec, setOpenSpec] = aUseState("aesthetics"); const [lang, setLang] = aUseState("EN"); const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS); const openBook = (pre = null) => { setBookPrefill(pre); setBookOpen(true); }; const openSpecialtyById = (id) => { setOpenSpec(id); setTimeout(() => { document.getElementById("specialties")?.scrollIntoView({ behavior: "smooth", block: "start" }); }, 50); }; /* Apply tweak palettes + display font */ aUseEffect(() => { const root = document.documentElement; const p = PALETTES[tweaks.palette] || PALETTES.jade; Object.entries(p).forEach(([k, v]) => root.style.setProperty(k, v)); root.style.setProperty("--serif", tweaks.display === "sans" ? '"Manrope", system-ui, sans-serif' : '"Cormorant Garamond", "EB Garamond", Georgia, serif' ); }, [tweaks.palette, tweaks.display]); const specialtyToId = (d) => { const t = d.specialty.toLowerCase(); if (t.includes("plastic")) return "plastic"; if (t.includes("derm")) return "dermatology"; if (t.includes("hair")) return "hair"; if (t.includes("dent")) return "dentistry"; if (t.includes("wellness")) return "wellness"; return "aesthetics"; }; return ( <> openBook()} lang={lang} setLang={setLang} onOpenSpecialty={openSpecialtyById} />
openBook()} /> openBook({ specialty: openSpec })} /> setConsentOpen(true)} /> openBook()} /> openBook()} />
openBook()} /> {bookOpen && ( setBookOpen(false)} prefill={bookPrefill} /> )} {doctor && ( setDoctor(null)} onBook={(d) => openBook({ specialty: specialtyToId(d), doctorId: d.id })} /> )} {consentOpen && ( setConsentOpen(false)} /> )} setTweak("palette", v)} /> setTweak("display", v)} /> ); } ReactDOM.createRoot(document.getElementById("root")).render();