const { Button, Badge } = window.ZaviFxDesignSystem_f15c31; /* stacked-deck showcase: autoplay, prev/next, category tags, word-blur copy */ function ProjectShowcase({ go }) { const all = window.PORTFOLIO; const cats = window.CATEGORIES; const detail = (slug) => (window.PROJECTS || []).find((d) => d.slug === slug); const [cat, setCat] = React.useState('All'); const list = React.useMemo( () => (cat === 'All' ? all : all.filter((p) => p.c === cat)), [cat, all] ); const [i, setI] = React.useState(0); const [paused, setPaused] = React.useState(false); const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; React.useEffect(() => { setI(0); }, [cat]); React.useEffect(() => { if (reduce || paused || list.length < 2) return; const t = setInterval(() => setI((n) => (n + 1) % list.length), 5200); return () => clearInterval(t); }, [paused, list.length, reduce]); const next = () => setI((n) => (n + 1) % list.length); const prev = () => setI((n) => (n - 1 + list.length) % list.length); const active = list[i]; if (!active) return null; /* three visible cards in the deck */ const deck = [0, 1, 2].map((o) => list[(i + o) % list.length]).filter(Boolean); return (
Selected work

{all.length} builds, sorted by the world they live in

{cats.map((c) => ( ))}
setPaused(true)} onMouseLeave={() => setPaused(false)}> {deck.map((p, o) => (
o === 0 ? window.openShowcase?.(p) : setI((i + o) % list.length)}> {p.n {o === 0 && }
))}

{active.n}

{active.c} · {active.tech.join(' · ')}

{((detail(active.s) || {}).challenge || (active.n + ' — a ' + active.c.toLowerCase() + ' build covering ' + active.svc.join(', ').toLowerCase() + ', shipped with a documented design system, a measured performance budget and a tracking plan handed over on launch day.')).split(' ').map((w, n) => ( {w}  ))}

{active.svc.map((v) => {v})}
); } Object.assign(window, { ProjectShowcase });