// SubdomainIndex — the navigation as a refined index, not a button farm. // Tolerates a growing, uneven set; a "not yet live" item is quiet, not broken. // Hover: row indents a touch and a hairline tick draws in (felt, not seen). const SUBDOMAINS = [ { n: '01', name: 'Blog', desc: 'Writing', live: true }, { n: '02', name: 'Code', desc: 'Experiments & tools', live: true }, { n: '03', name: 'Art', desc: 'Generative & physical', live: true }, { n: '04', name: 'Signage', desc: 'Chalk on easel', live: true }, { n: '05', name: 'Keycaps', desc: 'Mechanical', live: true }, { n: '06', name: 'Social', desc: '', live: false }, ]; function IndexRow({ item, onDark }) { const [hover, setHover] = React.useState(false); const live = item.live; const c = onDark ? { fg: 'var(--fg-on-dark-1)', dim: 'var(--fg-on-dark-3)', rule: 'var(--hairline-on-dark)' } : { fg: 'var(--fg-1)', dim: 'var(--fg-3)', rule: 'var(--hairline)' }; const row = { display: 'flex', alignItems: 'baseline', gap: '16px', textDecoration: 'none', padding: '13px 0', borderTop: `1px solid ${c.rule}`, paddingLeft: hover && live ? '10px' : '0', transition: 'padding-left var(--dur-base) var(--ease-out)', cursor: live ? 'pointer' : 'default', }; const num = { fontFamily: 'var(--font-mono)', fontSize: '10px', color: c.dim, width: '24px', flex: 'none', fontFeatureSettings: '"onum" 1', }; const name = { fontFamily: 'var(--font-display)', fontWeight: 500, fontSize: 'clamp(19px, 2vw, 24px)', letterSpacing: '0.01em', color: live ? c.fg : c.dim, }; const tick = { width: hover && live ? '22px' : '0px', height: '1px', background: 'var(--accent-deep)', alignSelf: 'center', transition: 'width var(--dur-base) var(--ease-out)', }; const desc = { fontFamily: 'var(--font-body)', fontSize: '12px', color: c.dim, marginLeft: 'auto', }; const soon = { fontFamily: 'var(--font-mono)', fontSize: '9.5px', letterSpacing: '0.12em', textTransform: 'uppercase', color: c.dim, marginLeft: 'auto', border: `1px solid ${c.rule}`, borderRadius: '2px', padding: '2px 7px', }; return ( setHover(true)} onMouseLeave={() => setHover(false)} onClick={(e) => e.preventDefault()} > {item.n} {item.name} {live ? {item.desc} : soon} ); } function SubdomainIndex({ onDark = false }) { return ( ); } Object.assign(window, { SubdomainIndex });