// Main app — hash router, tweaks integration, root mount. const { useState: useStateApp, useEffect: useEffectApp } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "rose", "type": "cormorant", "heroTreatment": "full", "ornaments": "restrained", "mode": "light", "locale": "EN" }/*EDITMODE-END*/; function parseRoute() { const hash = (window.location.hash || "#/").replace(/^#/, ""); // expected forms: /, /real-weddings, /real-weddings/slug, /services, /destinations, /about, /enquire if (hash === "/" || hash === "") return { name: "home" }; const parts = hash.split("/").filter(Boolean); if (parts[0] === "real-weddings") { if (parts[1]) return { name: "wedding", slug: parts[1] }; return { name: "real-weddings" }; } if (parts[0] === "services") return { name: "services" }; if (parts[0] === "destinations") return { name: "destinations" }; if (parts[0] === "about") return { name: "about" }; if (parts[0] === "enquire") return { name: "enquire" }; return { name: "home" }; } function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [route, setRoute] = useStateApp(parseRoute()); useEffectApp(() => { const onHash = () => { setRoute(parseRoute()); window.scrollTo({ top: 0, behavior: "instant" }); }; window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); // apply data attrs to html root useEffectApp(() => { const html = document.documentElement; html.setAttribute("data-mode", t.mode); html.setAttribute("data-palette", t.palette); html.setAttribute("data-type", t.type); html.setAttribute("data-ornaments", t.ornaments); html.setAttribute("lang", t.locale.toLowerCase()); html.setAttribute("dir", t.locale === "AR" ? "rtl" : "ltr"); }, [t.mode, t.palette, t.type, t.ornaments, t.locale]); const setLocale = (l) => setTweak("locale", l); // Map active nav id from route const navId = route.name === "home" ? "home" : route.name === "wedding" ? "real-weddings" : route.name; return (
{route.name === "home" && } {route.name === "real-weddings" && } {route.name === "wedding" && } {route.name === "services" && } {route.name === "destinations" && } {route.name === "about" && } {route.name === "enquire" && }
); } // Inject form input styles (depend on CSS vars) const inputStyle = document.createElement("style"); inputStyle.textContent = ` .input { width: 100%; background: transparent; border: 0; border-bottom: 1px solid var(--hairline); padding: 12px 0; font-family: var(--font-body); font-size: 15px; color: var(--text); transition: border-color .25s; border-radius: 0; } .input:focus { outline: none; border-bottom-color: var(--primary); } .input::placeholder { color: var(--muted); opacity: 0.6; } textarea.input { border: 1px solid var(--hairline); padding: 14px; resize: vertical; min-height: 120px; } textarea.input:focus { border-color: var(--primary); } select.input { padding: 12px 0; appearance: none; -webkit-appearance: none; background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%); background-position: calc(100% - 14px) 50%, calc(100% - 9px) 50%; background-size: 5px 5px; background-repeat: no-repeat; padding-right: 28px; } .service-tile:hover { background: var(--surface) !important; } .dest-tile h4, .wedding-card h3 { transition: color .25s; } .dest-tile:hover h4, .wedding-card:hover h3 { color: var(--primary); } `; document.head.appendChild(inputStyle); ReactDOM.createRoot(document.getElementById("app")).render();