// 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 (
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 */}
{/* Depth meter */}
{/* 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 (
);
})}
);
}
// ─── 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}
);
})}
{/* 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 */}
{/* 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 });