/* ================================================================= Hero variants — 3 directions for the top of the page. Selected via Tweaks ("topDirection"): index | reel | vault ================================================================= */ /* shared scroll cue */ function ScrollCue({ label, onClick }) { if (onClick) { return ( ); } return (
{label}
); } /* ---- letter-by-letter title ---- */ function SplitTitle({ text, className }) { return ( {text.split('').map((ch, i) => ( {ch === ' ' ? '\u00A0' : ch} ))} ); } /* ========================================================= A · INDEX — quiet, film-credit. Big serif name, numbered index. ========================================================= */ function HeroIndex({ data, lang, onCue }) { const m = data.meta; return (
{L(m.roleLine, lang)} EST. {m.sinceYear}
{m.nameJp}

{L(m.tagline, lang)}

    {data.categories.map((c, i) => (
  1. {c.no} {L(c.label, lang)} {String(data.works[c.id].length).padStart(2,'0')}
  2. ))}
); } /* ========================================================= B · REEL — kinetic. Looping marquee of titles, big name, motion. ========================================================= */ function HeroReel({ data, lang, onCue }) { const m = data.meta; const allTitles = [ ...data.works.film, ...data.works.app, ...data.works.web, ].map((w) => w.title); const lineA = allTitles.filter((_, i) => i % 2 === 0); const lineB = allTitles.filter((_, i) => i % 2 === 1); const Marquee = ({ items, reverse, speed }) => (
{[...items, ...items, ...items].map((t, i) => ( {t}· ))}
); return (