// scenes-landscape.jsx — Al Rawdatain brand intro scenes, 1920×1080 landscape. // Same narrative, same 6 scenes, same timings, recomposed for horizontal screens. const W = 1920; const H = 1080; // ─── Shared atoms (same as portrait, retuned sizes) ───────────────────────── function CornerHUD_L({ time, duration, sceneName, sceneIdx, total }) { const mono = 'JetBrains Mono, ui-monospace, monospace'; const ink = 'var(--ink)'; const dim = 'var(--dim)'; const fmt = (t) => { const s = Math.floor(t % 60); const ms = Math.floor((t * 100) % 100); return `00:${String(s).padStart(2, '0')}.${String(ms).padStart(2, '0')}`; }; return ( <>
REC {fmt(time)} / {fmt(duration)}
{String(sceneIdx).padStart(2,'0')} / {String(total).padStart(2,'0')} {sceneName}
AL RAWDATAIN · الروضتين · EST. 1981
29.8°N 48.1°E N. KUWAIT · AL‑RAUDHATAIN FIELD
); } function CounterL({ from = 0, to, progress, suffix = '', decimals = 0, style = {} }) { const v = from + (to - from) * Easing.easeOutQuart(clamp(progress, 0, 1)); const display = decimals > 0 ? v.toFixed(decimals) : Math.floor(v).toLocaleString(); return ( {display}{suffix} ); } function TickerL({ progress, style = {} }) { return (
); } // ─── Kuwait map (reused logic, size-agnostic) ────────────────────────────── const SRC_W_L = 1134.2744; const SRC_H_L = 979.20728; const KW_MIN_X_L = 30; const KW_MIN_Y_L = 20; const KW_W_L = 1000; const KW_H_L = 920; const RAUDHATAIN_SRC_X_L = 620; const RAUDHATAIN_SRC_Y_L = 187; const RAUD_FRAC_X_L = (RAUDHATAIN_SRC_X_L - KW_MIN_X_L) / KW_W_L; const RAUD_FRAC_Y_L = (RAUDHATAIN_SRC_Y_L - KW_MIN_Y_L) / KW_H_L; function KuwaitMapL({ revealProgress }) { const imgWidthPct = (SRC_W_L / KW_W_L) * 100; const imgHeightPct = (SRC_H_L / KW_H_L) * 100; const leftPct = -(KW_MIN_X_L / KW_W_L) * 100; const topPct = -(KW_MIN_Y_L / KW_H_L) * 100; return (
Kuwait
IRAQ
SAUDI ARABIA
ARABIAN GULF
KUWAIT
); } // ─── SCENE 01 — Origin (0 – 5s) ───────────────────────────────────────────── // Layout: left column (text + coords + depth), right column (Kuwait map) function Scene01L() { const { localTime } = useSprite(); const latProg = clamp((localTime - 0.2) / 0.9, 0, 1); const longProg = clamp((localTime - 0.6) / 0.9, 0, 1); const mapFillProg = clamp((localTime - 0.6) / 1.2, 0, 1); const depthProg = clamp((localTime - 1.4) / 1.2, 0, 1); const pinProg = clamp((localTime - 1.8) / 0.8, 0, 1); const ink = 'var(--ink)'; const accent = 'var(--accent)'; const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; // Map block on the right, large & centered vertically const MAP_W = 820; const MAP_H = 820; const mapLeft = W - MAP_W - 120; const mapTop = (H - MAP_H) / 2; return (
{/* Grid overlay */}
{/* LEFT COLUMN */}
{/* Coord row: LAT + LONG side-by-side */}
LAT
LONG
{/* Depth meter */}
AQUIFER DEPTH
{/* Bilingual headline */}
—— the source
From the depths
of Kuwait's desert.
من أعماق صحراء الكويت
{/* RIGHT COLUMN: Kuwait map */}
{/* Ripples */} {[...Array(4)].map((_, i) => { const delay = i * 0.25; const p = clamp((localTime - 1.8 - delay) / 2.5, 0, 1); const size = 50 + p * 360; const op = (1 - p) * 0.55; return (
); })} {/* Pin */}
{/* Callout */}
AL-RAUDHATAIN
AQUIFER · N. KUWAIT
); } // ─── SCENE 02 — Heritage timeline (5 – 11s) ───────────────────────────────── // Layout: left column headline, right column horizontal timeline with 5 milestones function Scene02L() { const { localTime } = useSprite(); const ink = 'var(--ink)'; const accent = 'var(--accent)'; const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; const milestones = [ { year: 1981, t: 0.4, label: 'Incorporated\nin Sharq, Kuwait.' }, { year: 1986, t: 1.3, label: 'First bottling plant\nopens at source.' }, { year: 2004, t: 2.2, label: 'International\ncertifications.' }, { year: 2024, t: 3.1, label: 'Rawdatain app\nlaunches.' }, { year: 2026, t: 4.0, label: 'Leading bottler\nin Kuwait.' }, ]; const lineProg = clamp(localTime / 4.2, 0, 1); return (
{/* LEFT headline block */}
—— 45 years of heritage
A history
poured
daily.
تاريخ يُسكب يوميًا
{/* RIGHT vertical timeline */}
{/* Track */}
{/* Milestones */} {milestones.map((m, i) => { const appear = clamp((localTime - m.t) / 0.5, 0, 1); const yBase = 20 + i * 150; return (
{m.year}
{m.label}
); })}
); } // ─── SCENE 03 — Stats (11 – 17s) ──────────────────────────────────────────── // Layout: headline top-left, horizontal row of 4 stats across bottom function Scene03L() { const { localTime } = useSprite(); const ink = 'var(--ink)'; const accent = 'var(--accent)'; const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; const stats = [ { t: 0.3, value: 45, suffix: '+', label: 'Years bottling', ar: 'سنة من التعبئة' }, { t: 0.9, value: 100, suffix: '%', label: 'Recyclable PET', ar: 'قابل لإعادة التدوير' }, { t: 1.5, value: 1, suffix: 'st', label: 'In Kuwait', ar: 'الأولى في الكويت' }, { t: 2.1, value: 24, suffix: '/7', label: 'Daily bottling', ar: 'يوميًا' }, ]; return (
{/* Header */}
—— by the numbers
Light. Balanced.
Pure.
خفيفة. متوازنة. نقية.
{/* Stats row */}
{stats.map((s, i) => { const prog = clamp((localTime - s.t) / 1.0, 0, 1); const appear = clamp((localTime - s.t) / 0.4, 0, 1); return (
{s.suffix}
{s.label}
{s.ar}
); })}
{/* Ticker */}
NSF · KQM · FDA · IAS · CPG ↗ LIVE
); } // ─── SCENE 04 — Product range (17 – 24s) ──────────────────────────────────── // Layout: hero image centered-right, meta block left, giant watermark numeral behind function Scene04L() { const { localTime } = useSprite(); const ink = 'var(--ink)'; const accent = 'var(--accent)'; const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; const SEG = 1.3; const products = [ { code: '01', name: 'Rawdatain 330 mL', ar: 'روضتين ٣٣٠ مل', size: '330 mL PET · 20-pack', hero: 'uploads/rawdatain-330ml.png', tone: '#1B3A6B' }, { code: '02', name: 'Glass Bottle', ar: 'زجاجة زجاجية', size: '240 mL glass · 24-pack', hero: 'uploads/52996.png', tone: '#2A5588' }, { code: '03', name: 'Bared', ar: 'بارد', size: 'Sparkling citrus soda', hero: 'uploads/54475.png', tone: '#2F7A4F' }, { code: '04', name: 'Bloom', ar: 'بلوم', size: 'Sparkling fruit juice', hero: 'uploads/54457.png', tone: '#B86A4A' }, { code: '05', name: 'Flavored Water', ar: 'مياه بنكهات', size: 'Light & refreshing', hero: 'uploads/53000.png', tone: '#A89334' }, ]; const idx = Math.max(0, Math.min(products.length - 1, Math.floor((localTime - 0.2) / SEG))); return (
{/* Header */}
—— the range
One source.
Many expressions.
منبع واحد. تعبيرات عديدة.
{/* Hero stage — right half */}
{products.map((p, i) => { const segStart = 0.2 + i * SEG; const inProg = clamp((localTime - segStart) / 0.4, 0, 1); const outProg = clamp((localTime - segStart - SEG + 0.25) / 0.25, 0, 1); const visible = inProg * (1 - outProg); if (visible <= 0) return null; return (
{/* Giant watermark numeral behind */}
{p.code}
{p.name}
); })}
{/* Segment progress chips */}
{products.map((p, i) => { const segStart = 0.2 + i * SEG; const fillProg = clamp((localTime - segStart) / SEG, 0, 1); const passed = i < idx; const active = i === idx; return (
); })}
{/* Product meta — bottom-left, fixed panel */}
{products.map((p, i) => { const segStart = 0.2 + i * SEG; const inProg = clamp((localTime - segStart) / 0.35, 0, 1); const outProg = clamp((localTime - segStart - SEG + 0.2) / 0.2, 0, 1); const visible = inProg * (1 - outProg); if (visible <= 0) return null; return (
{p.code} / {String(products.length).padStart(2, '0')}
{p.name}
{p.ar}
{p.size}
); })}
); } // ─── SCENE 05 — Certifications (24 – 29s) ─────────────────────────────────── // Layout: left headline, right stacked cert list (5 items) function Scene05L() { const { localTime } = useSprite(); const ink = 'var(--ink)'; const accent = 'var(--accent)'; const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; const certs = [ { t: 0.4, name: 'NSF', full: 'National Sanitation Foundation' }, { t: 0.7, name: 'FDA', full: 'U.S. Food & Drug Administration' }, { t: 1.0, name: 'KQM', full: 'Kuwait Quality Mark' }, { t: 1.3, name: 'CPG', full: 'Current Good Manufacturing Practices' }, { t: 1.6, name: 'IAS', full: 'International Accreditation Service' }, ]; return (
{/* LEFT headline */}
—— verified
Purity,
audited
at every step.
نقاء مُدقق في كل خطوة
{/* RIGHT cert list */}
{certs.map((c, i) => { const appear = clamp((localTime - c.t) / 0.4, 0, 1); return (
{c.name}
{c.full}
✓ ACTIVE
); })}
); } // ─── SCENE 06 — Signoff (29 – 35s) ────────────────────────────────────────── function Scene06L() { const { localTime } = useSprite(); const display = 'var(--display-font)'; const mono = 'JetBrains Mono, monospace'; const arabic = 'var(--arabic-font)'; const wordmarkProg = clamp(localTime / 1.2, 0, 1); const tagProg = clamp((localTime - 1.4) / 0.6, 0, 1); const ctaProg = clamp((localTime - 2.4) / 0.5, 0, 1); return (
{/* Radial glow */}
{/* Logo */}
Al Rawdatain
{/* Tagline */}
Heritage, bottled daily.
تراث يُعبأ يوميًا
{/* CTA band */}
alrawdatain.com Sharq · Kuwait · Since 1981 +965 1881234
); } // ─── Root composition for landscape ───────────────────────────────────────── const SCENES_L = [ { name: 'ORIGIN', start: 0, end: 5, Component: Scene01L }, { name: 'HERITAGE', start: 5, end: 11, Component: Scene02L }, { name: 'STATS', start: 11, end: 17, Component: Scene03L }, { name: 'PRODUCTS', start: 17, end: 24, Component: Scene04L }, { name: 'CERTIFICATIONS', start: 24, end: 29, Component: Scene05L }, { name: 'SIGNOFF', start: 29, end: 35, Component: Scene06L }, ]; const TOTAL_L = SCENES_L[SCENES_L.length - 1].end; function CompositionL() { const { time } = useTimeline(); const activeIdx = SCENES_L.findIndex(s => time >= s.start && time < s.end); const idx = activeIdx === -1 ? SCENES_L.length - 1 : activeIdx; const active = SCENES_L[idx]; return ( <> {SCENES_L.map((s) => ( ))} ); } Object.assign(window, { CompositionL, TOTAL_L });