/* Root: app, routing, tweaks panel */
const { useState: useStateA, useEffect: useEffectA, useCallback: useCallbackA } = React;
function App() {
const t = window.useTweaks(window.TWEAK_DEFAULTS);
const [tweaks, setTweak] = [t[0], t[1]];
// route state — supports 'home' | 'inventory' | 'vehicle' | 'services' | 'export' | 'contact'
const [route, setRoute] = useStateA(() => {
const h = window.location.hash.slice(1).split('/');
return h[0] || 'home';
});
const [vehicleId, setVehicleId] = useStateA(() => window.location.hash.split('/')[1] || VEHICLES[0].id);
const go = useCallbackA((r, id) => {
setRoute(r);
if (id) setVehicleId(id);
window.location.hash = id ? `${r}/${id}` : r;
window.scrollTo({ top: 0, behavior: 'instant' });
}, []);
useEffectA(() => {
const onHash = () => {
const [r, id] = window.location.hash.slice(1).split('/');
setRoute(r || 'home');
if (id) setVehicleId(id);
};
window.addEventListener('hashchange', onHash);
return () => window.removeEventListener('hashchange', onHash);
}, []);
// lead modal
const [lead, setLead] = useStateA({ open: false, ctx: null });
const openLead = useCallbackA((ctx) => setLead({ open: true, ctx }), []);
const closeLead = useCallbackA(() => setLead({ open: false, ctx: null }), []);
// tweaks → html data attrs
useEffectA(() => {
const el = document.documentElement;
el.setAttribute('data-palette', tweaks.palette);
el.setAttribute('data-accent', tweaks.accent);
el.setAttribute('data-display', tweaks.displayFont);
el.setAttribute('data-hero', tweaks.heroTreatment);
el.setAttribute('data-density', tweaks.density);
el.setAttribute('dir', tweaks.locale === 'ar' ? 'rtl' : 'ltr');
el.setAttribute('lang', tweaks.locale);
}, [tweaks]);
// set locale via tweaks: keep them in sync
const setLocale = (loc) => setTweak('locale', loc);
const locale = tweaks.locale === 'ar' ? 'ar' : 'en';
return (
<>
{route === 'home' && }
{route === 'inventory' && }
{route === 'vehicle' && }
{route === 'services' && }
{route === 'export' && }
{route === 'contact' && }
>
);
}
/* ---------- Tweaks panel UI ---------- */
function TweaksUI({ tweaks, setTweak }) {
return (
setTweak('palette', v)}
options={[
{ value: 'noir', label: 'Noir' },
{ value: 'hybrid', label: 'Hybrid' },
{ value: 'editorial', label: 'Light' },
]} />
setTweak('accent', v)}
options={[
{ value: 'champagne', label: 'Champagne' },
{ value: 'platinum', label: 'Platinum' },
{ value: 'copper', label: 'Copper' },
]} />
setTweak('displayFont', v)}
options={[
{ value: 'serif', label: 'Serif' },
{ value: 'grotesque', label: 'Grotesque' },
]} />
setTweak('heroTreatment', v)}
options={[
{ value: 'still', label: 'Still' },
{ value: 'loop', label: 'Loop' },
{ value: 'split', label: 'Split' },
]} />
setTweak('locale', v)}
options={[
{ value: 'en', label: 'EN' },
{ value: 'ar', label: 'AR · RTL' },
]} />
setTweak('density', v)}
options={[
{ value: 'cinematic', label: 'Cinematic' },
{ value: 'compact', label: 'Compact' },
]} />
);
}
ReactDOM.createRoot(document.getElementById('app')).render();