// app.jsx — main shell, routing, tweaks integration const { useState, useEffect } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "violet-indigo", "displayFont": "Poppins", "gridDensity": "comfortable", "headerStyle": "dark-hero", "showRightsBanners": true }/*EDITMODE-END*/; function App() { // route: { page, params? } const [route, setRoute] = useState({ page: "home", params: {} }); const [enquireOpen, setEnquireOpen] = useState(false); const [enquireService, setEnquireService] = useState(null); const [lightboxSrc, setLightboxSrc] = useState(null); const [t, setTweak] = window.useTweaks(TWEAK_DEFAULTS); // navigation helper const navigate = (page, params = {}) => { setRoute({ page, params }); window.scrollTo({ top: 0, behavior: "instant" }); }; // apply tweaks useEffect(() => { const root = document.documentElement; // Palette presets const palettes = { "violet-indigo": { "--primary": "#6A2CB8", "--accent": "#7E33CB", "--secondary": "#303180", "--focus": "#7E33CB", "--brand-grad": "linear-gradient(120deg, #7E33CB 0%, #50329C 55%, #303180 100%)", "--dark": "#1B1530", "--text": "#1B1530", }, "magenta-fuchsia": { "--primary": "#C42AA0", "--accent": "#E14BC0", "--secondary": "#7A1066", "--focus": "#E14BC0", "--brand-grad": "linear-gradient(120deg, #E14BC0 0%, #9B1E80 55%, #4F0A4A 100%)", "--dark": "#1B0820", "--text": "#1B0820", }, "indigo-cyan": { "--primary": "#1E5BCF", "--accent": "#2A8FE3", "--secondary": "#0E2A6E", "--focus": "#2A8FE3", "--brand-grad": "linear-gradient(120deg, #2A8FE3 0%, #1E5BCF 55%, #0E2A6E 100%)", "--dark": "#0A1530", "--text": "#0A1530", }, "amber-ink": { "--primary": "#9A6B0F", "--accent": "#E0A41A", "--secondary": "#3A2C0E", "--focus": "#E0A41A", "--brand-grad": "linear-gradient(120deg, #F2C04A 0%, #C58814 55%, #6B4408 100%)", "--dark": "#1F1A0E", "--text": "#1F1A0E", }, }; const p = palettes[t.palette] || palettes["violet-indigo"]; Object.entries(p).forEach(([k, v]) => root.style.setProperty(k, v)); // Display font const fontStacks = { "Poppins": "'Poppins', 'Segoe UI', system-ui, sans-serif", "Space Grotesk": "'Space Grotesk', 'Segoe UI', system-ui, sans-serif", "Bricolage Grotesque": "'Bricolage Grotesque', 'Segoe UI', system-ui, sans-serif", "Manrope": "'Manrope', 'Segoe UI', system-ui, sans-serif", }; root.style.setProperty("--font-display", fontStacks[t.displayFont] || fontStacks["Poppins"]); // Container width via grid density if (t.gridDensity === "tight") root.style.setProperty("--container", "1200px"); else if (t.gridDensity === "loose") root.style.setProperty("--container", "1360px"); else root.style.setProperty("--container", "1280px"); }, [t.palette, t.displayFont, t.gridDensity]); const onDarkNav = route.page === "home" && t.headerStyle === "dark-hero"; const openEnquire = (service) => { if (service) setEnquireService(service); setEnquireOpen(true); }; let pageEl; switch (route.page) { case "home": pageEl = ; break; case "work": pageEl = ; break; case "case-study": pageEl = ; break; case "services": pageEl = ; break; case "about": pageEl = ; break; case "clients": pageEl = ; break; case "contact": pageEl = ; break; default: pageEl = ; } return ( <> openEnquire()} /> {pageEl}