// tenants-section.jsx — multi-tenant split animation const TenantsSection = () => { const ref = React.useRef(null); const progress = useScrollProgress(ref); // Split progress: 0 = single block, 1 = three tenants separated const split = Math.max(0, Math.min(1, (progress - 0.3) * 2.2)); const easeOut = 1 - Math.pow(1 - split, 3); const tenants = [ { name: 'ACME CORP', users: '124 users', slug: 'acme', tokens: 8 }, { name: 'FINSOL BANK', users: '512 users', slug: 'finsol', tokens: 24 }, { name: 'MEDICA HEALTH', users: '89 users', slug: 'medica', tokens: 6 }, ]; return (
{/* Subtle grid */}
04 · Multi-tenant

Una plataforma.
Muchas organizaciones.
Aisladas por diseño.

{/* Split visual */}
{tenants.map((tenant, i) => { const offset = (i - 1); // -1, 0, 1 const finalLeft = 20 + i * 30; // percentages const initialLeft = 35; // stacked center-ish const leftPct = initialLeft + (finalLeft - initialLeft) * easeOut; const topPct = 10 + offset * 3 * (1 - easeOut) + easeOut * (10 + (i % 2) * 15); const rotate = offset * 3 * (1 - easeOut); const scale = 0.92 + easeOut * 0.08; const opacity = i === 1 ? 1 : (0.35 + easeOut * 0.65); const zIndex = i === 1 ? 3 : (easeOut > 0.5 ? 2 : 1); return (
TENANT · {tenant.slug}
{tenant.name}
users{tenant.users.replace(' users','')}
mcp_tokens{tenant.tokens}
posts{(i + 1) * 214}
chunks{(i + 1) * 8400}
); })} {/* Connecting lines from top platform to each tenant (appear as split completes) */} {[20, 50, 80].map((x) => ( ))} {/* Platform label up top */}
Nexus platform
); }; Object.assign(window, { TenantsSection });