export interface CapsuleCurtainProps { /** Columns across. The reference draws 8 on a 70px pitch. */ columns?: number; /** Capsules per column. Each covers all but `step` of the one above it. */ capsules?: number; /** Capsule width in user units; the pitch equals it, so columns touch. */ width?: number; /** Capsule height. `rx` is always width / 2 — a stadium, never a rounded box. */ height?: number; /** Hue of the top stop of the first capsule, in degrees. */ hueTop?: number; /** Hue of the bottom stop of the first capsule, in degrees. */ hueBottom?: number; className?: string; } /** * The signature element: a curtain of gradient capsules, generated rather than * chosen. The top stop rotates forward around the hue wheel and the bottom stop * rotates backward, so the two stay near-complementary and every column inverts * its own gradient between its first capsule and its last. * * Decoration only — `aria-hidden`, `pointer-events: none`, and it carries no * information. Position it with the page's own transform; this component draws. */ export function CapsuleCurtain({ columns = 8, capsules = 12, width = 70, height = 170, hueTop = 247, hueBottom = 29, className, }: CapsuleCurtainProps) { const stepTop = 12.4; const stepBottom = -10.3; const overlap = height / 4.93; // 34.5 at the reference's 170 const w = columns * width; const h = (capsules - 1) * overlap + height; return ( ); }