// components.jsx
// Shared chrome: Nav, Footer, Marquee, abstract-art primitives, anonymized speaker card.
const NAV_LINKS = [
{ href: '#/', label: 'Index', n: '00' },
{ href: '#/about', label: 'About', n: '01' },
{ href: '#/program', label: 'Program', n: '02' },
{ href: '#/speakers', label: 'Speakers', n: '03' },
{ href: '#/riyadh', label: 'Riyadh', n: '04' },
{ href: '#/partner', label: 'Partner', n: '05' },
{ href: '#/resources', label: 'Resources', n: '06' },
{ href: '#/faq', label: 'FAQ', n: '07' },
{ href: '#/contact', label: 'Contact', n: '08' },
];
// ───────── Top status bar (live ticker, dates, coords) ─────────
function StatusBar() {
const [now, setNow] = React.useState(new Date());
React.useEffect(() => {
const id = setInterval(() => setNow(new Date()), 1000);
return () => clearInterval(id);
}, []);
// Target date: 19 Mar 2027 at 09:00 Riyadh (UTC+3)
const target = new Date(Date.UTC(2027, 2, 19, 6, 0, 0));
const diff = Math.max(0, target.getTime() - now.getTime());
const d = Math.floor(diff / 86400000);
const h = Math.floor((diff % 86400000) / 3600000);
const m = Math.floor((diff % 3600000) / 60000);
const s = Math.floor((diff % 60000) / 1000);
const pad = (n) => String(n).padStart(2, '0');
const stamp = now.toISOString().slice(11, 19) + ' UTC';
return (
Live
24°44′N · 46°43′E
Riyadh, KSA
T-minus {pad(d)}d : {pad(h)}h : {pad(m)}m : {pad(s)}s
{stamp}
Mar 19 — Mar 22 / 2027
);
}
// ───────── Logo ─────────
// Mark is the brand "FLS" sparkle glyph (img/futureLabsSummit_logo_alone.svg),
// inlined so it picks up theme color via currentColor instead of being a flat asset.
function Logo({ size = 32 }) {
const w = size * (42.5 / 36) * 0.9; // native aspect, narrowed 10% to read less stretched
return (
Future Labs / Summit
);
}
// ───────── Top nav ─────────
function Nav({ path }) {
const [open, setOpen] = React.useState(false);
return (
{NAV_LINKS.slice(0, 8).map((l) => {
const active = path === l.href.slice(1) || (path === '/' && l.href === '#/');
return (
{l.n}
{l.label}
{active && }
);
})}
setOpen(!open)} aria-label="Menu"
style={{
display: 'none', border: '1px solid var(--rule)', background: 'transparent',
width: 40, height: 40, borderRadius: 999,
}}>
≡
{open && (
)}
);
}
// ───────── Footer ─────────
function Footer() {
return (
);
}
function NewsletterStrip() {
const [email, setEmail] = React.useState('');
const [sent, setSent] = React.useState(false);
return (
// Field Dispatch
Three emails a month. No filler.
Mostly: who's announcing what, and when.
);
}
// ───────── Marquee ─────────
function Marquee({ items, signal = false, size = 18, id }) {
const doubled = [...items, ...items];
return (
{doubled.map((t, i) => (
{t}
◆
))}
);
}
// ───────── Abstract art primitives ─────────
// These replace photos with intentional geometric placeholders.
function DotField({ rows = 18, cols = 24, accentChance = 0.04, height = 320 }) {
const cells = [];
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
const accent = Math.random() < accentChance;
const size = accent ? 6 : 2;
cells.push(
,
);
}
}
return (
{cells}
);
}
function Orbits({ height = 480 }) {
return (
{[40, 80, 120, 160, 200].map((r, i) => (
))}
{[0, 1, 2, 3].map((i) => {
const a = i * 90;
const x = 200 + Math.cos(a) * 160;
const y = 200 + Math.sin(a) * 64;
return ;
})}
);
}
function StripePlaceholder({ label, height = 280, dark = false, ratio }) {
return (
);
}
// Wave-form / topo lines
function TopoLines({ height = 240 }) {
const lines = [];
for (let i = 0; i < 22; i++) {
const y = (i / 22) * 100;
const amp = 3 + (i % 4);
const path = Array.from({ length: 40 }, (_, x) => {
const px = (x / 40) * 100;
const py = y + Math.sin((x + i) * 0.4) * amp * 0.4;
return `${x === 0 ? 'M' : 'L'} ${px} ${py}`;
}).join(' ');
lines.push( );
}
return (
{lines}
);
}
// ───────── Anonymized speaker card ─────────
// Variants: 'initial', 'glyph', 'silhouette', 'manifest'
const SPEAKERS = [
{ id: 'A01', initials: 'AR', role: 'CEO, AI-native drug discovery', sector: 'Pharma · AI', region: 'US' },
{ id: 'A02', initials: 'KM', role: 'Founder, longevity therapeutics', sector: 'Longevity', region: 'EU' },
{ id: 'A03', initials: 'JN', role: 'Director, gene-edit foundry', sector: 'Bio', region: 'US' },
{ id: 'A04', initials: 'DR', role: 'Chief Scientist, lab robotics', sector: 'Automation', region: 'KSA' },
{ id: 'A05', initials: 'SY', role: 'Co-founder, DeSci protocol', sector: 'DeSci', region: 'CH' },
{ id: 'A06', initials: 'BT', role: 'Lead, autonomous surgery', sector: 'Robotics', region: 'JP' },
{ id: 'A07', initials: 'MO', role: 'GP, deep-tech fund', sector: 'Capital', region: 'UK' },
{ id: 'A08', initials: 'CL', role: 'Principal, foundation-model bio', sector: 'AI · Bio', region: 'US' },
{ id: 'A09', initials: 'EH', role: 'Founder, AI-diagnostic clinic', sector: 'Pharma · AI', region: 'AE' },
{ id: 'A10', initials: 'TF', role: 'CSO, protein design platform', sector: 'Bio · AI', region: 'US' },
{ id: 'A11', initials: 'NW', role: 'Director, public-health AI', sector: 'Policy', region: 'KE' },
{ id: 'A12', initials: 'IS', role: 'Founder, cloud-lab infrastructure', sector: 'Automation', region: 'DE' },
{ id: 'A13', initials: 'PG', role: 'Director, biosecurity research', sector: 'Policy', region: 'US' },
{ id: 'A14', initials: 'RV', role: 'CEO, synthetic biology foundry', sector: 'Bio', region: 'IN' },
{ id: 'A15', initials: 'OB', role: 'Principal investigator, ML4Sci', sector: 'AI · Bio', region: 'IL' },
{ id: 'A16', initials: 'XT', role: 'Founder, AI radiology', sector: 'Pharma · AI', region: 'SG' },
{ id: 'A17', initials: 'AN', role: 'Director, autonomous diagnostics', sector: 'Automation', region: 'SA' },
{ id: 'A18', initials: 'YL', role: 'Lead, agentic research systems', sector: 'AI', region: 'CA' },
{ id: 'A19', initials: 'ZK', role: 'Founder, citizen-science network', sector: 'DeSci', region: 'BR' },
{ id: 'A20', initials: 'HD', role: 'CSO, cell therapy at scale', sector: 'Bio · Pharma', region: 'CH' },
{ id: 'A21', initials: 'GT', role: 'Director, AR for surgery', sector: 'AR · Robotics', region: 'US' },
{ id: 'A22', initials: 'PE', role: 'Founder, biomarker discovery', sector: 'Pharma', region: 'UK' },
{ id: 'A23', initials: 'MV', role: 'Lead, foundation model alignment', sector: 'AI', region: 'US' },
{ id: 'A24', initials: 'QR', role: 'Director, AI-doctor pilot', sector: 'Pharma · AI', region: 'SA' },
{ id: 'A25', initials: 'LF', role: 'Founder, decentralized clinical trials', sector: 'DeSci', region: 'US' },
{ id: 'A26', initials: 'SD', role: 'Lead, neuroprosthetics platform', sector: 'BCI', region: 'US' },
{ id: 'A27', initials: 'BO', role: 'CSO, microbiome therapeutics', sector: 'Bio', region: 'NL' },
{ id: 'A28', initials: 'WC', role: 'Co-founder, lab-on-chip platform', sector: 'Automation', region: 'CN' },
{ id: 'A29', initials: 'HA', role: 'Director, longevity clinical research', sector: 'Longevity', region: 'AE' },
{ id: 'A30', initials: 'RP', role: 'Director, public-good biotech', sector: 'Policy', region: 'ZA' },
];
function SpeakerCard({ s, variant = 'initial' }) {
const common = {
border: '1px solid var(--rule)',
background: 'var(--paper)',
display: 'flex', flexDirection: 'column',
color: 'var(--ink)', minHeight: 280, position: 'relative', overflow: 'hidden',
};
if (variant === 'glyph') {
return (
{[0, 1, 2, 3, 4, 5].map((i) => (
))}
{s.initials}
);
}
if (variant === 'silhouette') {
return (
);
}
if (variant === 'manifest') {
return (
// SPEAKER {s.id}
{s.initials}
{s.role}
{s.sector}
{s.region}
);
}
// 'initial' — default
return (
);
}
function CardMeta({ s }) {
return (
{s.role}
{s.sector}
{s.region}
);
}
// ───────── Section helpers ─────────
function SectionHead({ index, eyebrow, title, lede }) {
return (
);
}
Object.assign(window, {
StatusBar, Nav, Footer, Logo, Marquee, SectionHead, NewsletterStrip,
DotField, Orbits, StripePlaceholder, TopoLines,
SpeakerCard, SPEAKERS, NAV_LINKS,
});