// Homepage — Lifestyle edition // More editorial, slower, story-led. Inspired by lifestyle-brand structure // (marquee strip, tabbed discoveries, journey steps, single portrait quote). const { useState: useStateH, useEffect: useEffectH, useRef: useRefH } = React; /* -------- Hero — Clean / single-line with morphing word -------- */ function Hero({ onBookClick }) { const scenes = [ { word: 'weekend', label: 'Coastal weekend', img: HERO_SLIDES[0].image, lede: 'Pack on Friday. Unpack on Sunday. The road in between is yours.', meta: [ ['Destination', 'Cherating, Pahang'], ['Drive from KL', '3 hours east'], ['Recommended van', 'Anggun 07 motorhome'], ], }, { word: 'morning', label: 'Highland morning', img: HERO_SLIDES[1].image, lede: 'Kettle on at first light. Tea estates outside the window, mist below.', meta: [ ['Destination', 'Cameron Highlands'], ['Drive from KL', '2.5 hours north'], ['Recommended van', 'Anggun 10 motorhome'], ], }, { word: 'detour', label: 'Jungle detour', img: HERO_SLIDES[2].image, lede: 'No itinerary. No hotel check-in. No reason to rush back.', meta: [ ['Destination', 'Taman Negara, Pahang'], ['Drive from KL', '4 hours north'], ['Recommended van', 'Anggun 14 off-grid'], ], }, ]; const [idx, setIdx] = useStateH(0); useEffectH(() => { const t = setInterval(() => setIdx(i => (i + 1) % scenes.length), 6000); return () => clearInterval(t); }, []); const s = scenes[idx]; return (
{/* slim top bar */}
VR Motorhome · Est. 2016
— A Field Guide to Slow Weekends —
{String(idx+1).padStart(2,'0')} / {String(scenes.length).padStart(2,'0')}
{/* headline */}

A slow {s.word} on wheels.

{s.lede}

{/* full photo */}
{scenes.map((sc, i) => (
))}
); } /* -------- Marquee tagline strip -------- */ function Marquee() { const items = ['Wander further', 'Live lighter', 'Sleep wider skies', 'Drive slower', 'Stay longer']; const loop = [...items, ...items, ...items, ...items]; return (
{loop.map((t, i) => ( {t} ))}
); } /* -------- Our Story — editorial split screen -------- */ function OurStory({ setPage }) { return (
Anggun 07 — flagship build, 2024
Our Story

Ten years. Eighty vans.
One philosophy.

What started as one Toyota Hilux conversion in a small Klang workshop has grown into Malaysia's most-trusted motorhome maker — quietly, deliberately, one van at a time. We've never wanted to be the biggest; we've only ever wanted the next van out to feel a little better than the last.

founded
builds
rentals
); } /* -------- Why Choose Us — certification stamps -------- */ function WhyChooseUs() { const reasons = [ { n: '01', tag: 'Origin', title: 'Made in Malaysia', copy: 'Designed, fabricated and finished in our Klang workshop. Built by hands that have driven the same routes you will.', accent: 'Klang · Selangor', rotate: '-4deg', icon: ( {/* Map pin — location marker */} {/* inner cut-out */} {/* tiny dot inside (Klang mark) */} ), }, { n: '02', tag: 'Craft', title: 'Hand-built quality', copy: 'Cabinet-makers and engineers in-house. No production line, no shortcuts — the cup-holder is where you reach for it.', accent: '80+ bespoke builds', rotate: '3deg', icon: ( {/* Open-end wrench at -28deg */} {/* handle */} {/* open-end head — C shape */} {/* spark — small decorative dot for "craft" */} ), }, { n: '03', tag: 'Support', title: 'On call, on Sundays', copy: 'Real roadside dispatch from real people. We answer the phone in monsoons, on public holidays, after midnight.', accent: '24 / 7 · ten years on', rotate: '-2deg', icon: ( {/* Headset arc band */} {/* Left ear cup */} {/* Right ear cup */} {/* Mic boom */} {/* Mic tip */} ), }, ]; return (
Why Choose Us

Three reasons,
certified.

Stamped, signed, and inspected on every van — for ten quiet years.

{reasons.map(r => (

{r.title}

{r.copy}

{r.accent}
))}
); } /* -------- Manifesto / Editorial intro -------- */ function Manifesto() { return (
A different kind of weekend

A house on wheels.
A weekend, redefined.

For ten years we've quietly hand-built motorhomes in a Klang workshop — not for collectors, not for the algorithm, but for families who'd rather wake up by a river than in a hotel room. Every van leaves with the same idea baked in: the road should feel like home, and home should travel well.

); } /* -------- Main Services — Editorial zigzag rows -------- */ function MainServices({ setPage }) { const services = [ { n: '01', title: 'Modification', tag: 'Build', go: 'modification', copy: 'Customize from chassis to cabinetry. Every panel, plumbing, electrical and finish is detailed and built in our Klang workshop — no outsourcing, no surprises.', features: ['90-minute studio consult', 'Walk the workshop floor', '12 — 16 week build'], img: 'images/service-modification.png', meta: 'From RM 95,000', }, { n: '02', title: 'Rental', tag: 'Drive', go: 'rental', copy: 'Six fully-equipped motorhomes and campervans, road-ready Friday morning. Bedding, kitchen, RFID and offline maps included. Pick a date, we handle the rest.', features: ['Pickup in Klang or KLIA', 'No mileage cap in Peninsula', 'Free cancel until D-14'], img: 'images/service-rental.png', meta: 'From RM 320 / night', }, { n: '03', title: 'Pre-order', tag: 'Reserve', go: 'motorhomes', copy: 'Stay ahead of the next season. Reserve a build slot for our newest layouts, lock in your spec, and move up the queue with a refundable deposit.', features: ['6 layouts in rotation', 'Refundable deposit', 'Quarterly intakes'], img: 'images/service-preorder.png', meta: 'Q1 / Q3 / Q4 intake', }, { n: '04', title: 'Accessories', tag: 'Outfit', go: 'about', copy: 'Personalize your journey with curated accessories — awnings, roof racks, water filtration, solar add-ons. Tested on the same roads you\'ll drive.', features: ['Awnings & overlanding gear', 'Lithium / solar upgrades', 'Workshop fitting available'], img: 'images/service-accessories.png', meta: 'Walk-in fitting · Mon–Sat', }, ]; return (
Our main services

Four ways
to get on the road.

Build, rent, pre-order or accessorise — all under one roof in a small Klang workshop, in-house, since 2016.

{services.map((s, i) => (
setPage(s.go)} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setPage(s.go); } }} role="button" tabIndex="0" aria-label={`Read more about ${s.title}`}>
{s.tag} № {s.n}
{s.tag} · service {s.n}

{s.title}

{s.copy}

    {s.features.map((f, j) => (
  • {f}
  • ))}
{s.meta}
))}
); } /* -------- Three pillars (replaces commercial "Why") -------- */ function Pillars() { const items = [ { kicker: '01', title: 'Hand-built in Klang', copy: 'Every panel, every cabinet, every wire crimp leaves our workshop. No sub-contractors. No surprises.' }, { kicker: '02', title: 'Quietly considered', copy: 'A decade of layouts, refined by 400+ real trips. The cup holder is where you reach for it.' }, { kicker: '03', title: 'Friend on the road', copy: 'Real humans answer the phone. We\'ve dispatched help on Sundays, in monsoons, after midnight.' }, ]; return (
{items.map(p => (
{p.kicker}

{p.title}

{p.copy}

))}
); } /* -------- Companions — Cinema spotlight + thumbnail rail -------- */ function Companions({ setPage }) { const vans = FLEET.slice(0, 5); const [active, setActive] = useStateH(0); const [paused, setPaused] = useStateH(false); useEffectH(() => { if (paused) return; const t = setInterval(() => setActive(i => (i + 1) % vans.length), 5500); return () => clearInterval(t); }, [paused, vans.length]); const v = vans[active]; return (
setPaused(true)} onMouseLeave={() => setPaused(false)}>
Your companions

Six vans,
one philosophy.

Each van has a name and a personality. Pick the one that matches your kind of slow.

{/* huge background number */}
0{active+1}
{/* spotlight cinema */}
{vans.map((vn, i) => (
))}
{v.badge && {v.badge}} {v.tag} · {v.sub}

{v.name}

Sleeps {v.sleeps}
{v.seats} seats
{v.length}
from RM {v.price} / night
{/* thumbnail rail with progress bars */}
{vans.map((vn, i) => ( ))}
); } /* -------- Routes — kept, lighter copy -------- */ function Routes() { return (
Where to point the van

Three roads,
three Malaysias.

Loved by our crew, road-tested by 400+ renters. We'll send the offline maps and food stops the night before pickup.

{ROUTES.map(r => (
{r.eyebrow}
{r.title}
{r.meta.map((m, i) => {m})}
))}
); } /* -------- Story / Portrait quote (single big testimonial) -------- */ function StoryQuote() { return (
A customer story
What it actually feels like
We thought we were renting a van. We came back having renamed the dog, finished a book, and decided to do this every school holiday for the rest of our lives.
Aishah & Daniel Petaling Jaya · Anggun 07 · 6 nights East Coast
/ 5average rating
weekends sent off
quietly building
); } /* -------- Visit Workshop — final CTA paired with photo -------- */ function VisitWorkshop({ setPage }) { return (
Come say hi

Drop by the workshop.
Kopi's on us.

We're a small team in Klang — half mechanics, half cabinet-makers, all sambal enthusiasts. Walk in any weekday, climb into the vans, and bring your trip ideas.

Workshop Lot 5, Klang · Selangor
Open Mon–Sat · 9am – 6pm
); } /* -------- FAQ — practical questions, accordion -------- */ function FAQ() { const items = [ { q: 'What driving license do I need?', a: 'A standard Malaysian Class D license is enough for our Anggun 07 motorhome (under 3.5T). No special van or commercial license required. Minimum age 23 with 2+ years driving experience.' }, { q: 'What\'s included in the rental?', a: 'Bedding, kitchenware, gas, RFID / Touch \'n Go credit, offline maps, basic recovery kit, and 24/7 roadside support. Just bring clothes, food, and your sense of adventure.' }, { q: 'Where do I pick up and drop off?', a: 'Standard pickup is from our Klang HQ — free, with a 30-minute orientation walkthrough. Delivery to KLIA, KLIA2 or KL Sentral for a small fee. Pickup from 09:00, return by 18:00.' }, { q: 'Is there a mileage limit?', a: 'No mileage cap within Peninsular Malaysia. East Malaysia trips need advance arrangement (ferry logistics). Fuel is on you — return with the same level you picked up.' }, { q: 'What if I need to cancel?', a: 'Full refund up to 14 days before pickup. 50% refund 7–14 days out. Within 7 days we\'ll work with you to reschedule rather than cancel — life happens.' }, { q: 'What if something breaks down on the road?', a: '24/7 roadside support — real humans on the phone, real callbacks within 30 minutes. We\'ve dispatched help on Sundays, in monsoons, after midnight. Ten years and counting.' }, ]; const [open, setOpen] = useStateH(0); return (
Practical things

The short answers,
up front.

{items.map((item, i) => (

{item.a}

))}
); } /* -------- Page -------- */ function HomePage({ setPage, bookingState, setBookingState }) { const onSubmit = (state) => { setBookingState(state); setPage('rental'); }; return (
setPage('rental')}/>
); } window.HomePage = HomePage;