// home.jsx — Home page
function Nav({ t, locale, onLocale, onNav, transparent, onBookOpen }) {
return (
);
}
function Hero({ t, heroMode, featured, onOpenCar, onBookOpen }) {
const [scroll, setScroll] = React.useState(0);
React.useEffect(() => {
if (heroMode !== "parallax") return;
const onScroll = () => setScroll(window.scrollY);
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, [heroMode]);
const parY = heroMode === "parallax" ? Math.min(scroll * 0.25, 220) : 0;
const parZ = heroMode === "parallax" ? 1 + Math.min(scroll * 0.0003, 0.08) : 1;
return (
{t.hero.kicker}
Dubai · UAE
{t.hero.title[0]}
{t.hero.title[1]}
{t.hero.title[2]}
{t.hero.sub}
{/* Featured release strip */}
onOpenCar(featured.id)}>
{t.hero.featured_label}
{featured.make}
{featured.model}
Engine{featured.engine}
Power{featured.power}
0–100{featured.accel}
{t.fleet.from}{featured.daily}/{t.fleet.day}
{t.cta.view}
);
}
function TrustStrip({ t }) {
return (
{t.trust.map((it, i) => (
{it.k}
{it.label}
{it.body}
))}
);
}
function FleetSection({ t, locale, onOpenCar }) {
const [filter, setFilter] = React.useState("all");
const filtered = window.FLEET.filter(c => {
if (filter === "all") return true;
if (filter === "long") return true; // demo: all available for long-term
if (filter === "convertible") return /convert/i.test(c.body);
return c.bodyKey === filter;
});
return (
{t.fleet.sub}
{t.fleet.title.split(" ")[0]}
{t.fleet.title.split(" ").slice(1).join(" ")}
{t.fleet.filters.map((f, i) => {
const key = t.fleet.filterKeys[i];
return (
);
})}
{filtered.map((c, i) => (
onOpenCar(c.id)} idx={i} />
))}
);
}
function CarCard({ car, t, onOpen, idx }) {
return (
{!car.available && (
{t.fleet.sold_out}
)}
{car.featured && car.available && idx === 0 && (
Featured
)}
{car.make}
{car.model}
{car.body}
·
{car.power}
·
{car.accel} 0–100
{t.fleet.from}
{car.daily}
/ {t.fleet.day}
);
}
function PromoBlock({ t, showPromo }) {
if (!showPromo) return null;
return (
{t.promo.kicker}
{t.promo.title}
{t.promo.sub}
WindowFri 26 Jun – Sun 28 Jun
DeliveryAED 0 in Dubai
DetailComplimentary
);
}
function ServicesSection({ t }) {
return (
04 services
{t.services.title.split(" ").slice(0, -1).join(" ")}{" "}
{t.services.title.split(" ").slice(-1)[0]}
{t.services.items.map((s, i) => (
))}
);
}
function Footer({ t, locale }) {
return (
);
}
function MobileCta({ t, onBookOpen }) {
return (
);
}
Object.assign(window, { Nav, Hero, TrustStrip, FleetSection, CarCard, PromoBlock, ServicesSection, Footer, MobileCta });