/* App root — view router, tweaks, language, enquiry modal state */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "marina", "type": "serif-inter", "lang": "en", "density": "default", "fab": "panel", "heroLayout": "marquee" }/*EDITMODE-END*/; const App = () => { const [tweaks, setTweak] = window.useTweaks(TWEAK_DEFAULTS); const [view, setView] = React.useState({ name: 'home' }); const [enquiry, setEnquiry] = React.useState({ open: false, category: null, message: '' }); // Sync html attributes for palette/type/density/lang/dir React.useEffect(() => { const html = document.documentElement; if (tweaks.palette && tweaks.palette !== 'marina') html.setAttribute('data-palette', tweaks.palette); else html.removeAttribute('data-palette'); if (tweaks.type && tweaks.type !== 'serif-inter') html.setAttribute('data-type', tweaks.type); else html.removeAttribute('data-type'); if (tweaks.density && tweaks.density !== 'default') html.setAttribute('data-density', tweaks.density); else html.removeAttribute('data-density'); html.lang = tweaks.lang || 'en'; html.dir = tweaks.lang === 'ar' ? 'rtl' : 'ltr'; }, [tweaks.palette, tweaks.type, tweaks.density, tweaks.lang]); // Scroll to top on view change React.useEffect(() => { window.scrollTo({ top: 0, behavior: 'instant' }); }, [view.name, view.id]); const openEnquiry = (cat, msg) => { // cat can be a category object, a string id, or null let category = null; if (cat && typeof cat === 'object' && cat.id) category = cat; else if (typeof cat === 'string') category = window.BENO.categories.find(c => c.id === cat) || null; setEnquiry({ open: true, category, message: typeof cat === 'string' && !category ? cat : (msg || '') }); }; const navHandlers = { onNav: v => setView(v), onCategory: id => setView({ name: 'category', id }), onExperience: id => setView({ name: 'experience', id }), onEnquire: (cat, msg) => openEnquiry(cat, msg), }; const dark = view.name === 'home' || view.name === 'rentals' || view.name === 'experiences' || view.name === 'category' || view.name === 'experience' || view.name === 'about'; // Nav is dark when first thing after it is dark — home/category/about have dark heroes const navDark = ['home', 'rentals', 'category', 'experiences', 'experience', 'about'].includes(view.name); return (
); }; ReactDOM.createRoot(document.getElementById('root')).render();