"use client"; import { useEffect, useState, useCallback } from "react"; const projects = [ { name: "acme-api", branch: "main", time: "25m ago", status: "busy" as const }, { name: "quantum-dash", branch: "feat/charts", time: "1h ago", status: "idle" as const, elapsed: "4m" }, { name: "ml-pipeline", branch: "exp/bert", time: "just now", status: "busy" as const }, ]; type Phase = | "typing" | "selecting" | "enter" | "grid" | "hold" | "fadeout" | "pause"; export function TerminalCascade() { const [phase, setPhase] = useState("typing"); const [selectedCount, setSelectedCount] = useState(0); const [cycle, setCycle] = useState(0); const runCycle = useCallback(() => { setSelectedCount(0); setPhase("typing"); const t1 = setTimeout(() => setPhase("selecting"), 800); const t2 = setTimeout(() => setSelectedCount(1), 1200); const t3 = setTimeout(() => setSelectedCount(2), 1600); const t4 = setTimeout(() => setSelectedCount(3), 2000); const t5 = setTimeout(() => setPhase("enter"), 2600); const t6 = setTimeout(() => setPhase("grid"), 3400); const t7 = setTimeout(() => setPhase("hold"), 4000); const t8 = setTimeout(() => setPhase("fadeout"), 7000); const t9 = setTimeout(() => { setPhase("pause"); setCycle((c) => c + 1); }, 7800); return [t1, t2, t3, t4, t5, t6, t7, t8, t9]; }, []); useEffect(() => { const delay = cycle === 0 ? 400 : 2000; const start = setTimeout(() => { const timers = runCycle(); return () => timers.forEach(clearTimeout); }, delay); return () => clearTimeout(start); }, [cycle, runCycle]); const showPicker = phase === "typing" || phase === "selecting" || phase === "enter"; const showGrid = phase === "grid" || phase === "hold" || phase === "fadeout"; return (
{/* ── Picker (select projects) ── */}
cladm — {selectedCount} selected
{" PROJECT BRANCH LAST USE"}
{projects.map((proj, i) => { const checked = i < selectedCount; const isActive = i === selectedCount - 1 && phase === "selecting"; const dot = proj.status === "busy" ? : ; const tag = proj.status === "idle" && proj.elapsed ? {proj.elapsed.padEnd(2)} : ; return (
{dot}{tag} {checked ? "[✓]" : "[ ]"} {proj.name.padEnd(18)} {proj.branch.padEnd(13)} {proj.time}
); })}
[ ] pixel-engine{" "}develop{" "}3h ago
{phase === "enter" ? ( ⏎ Launching 3 sessions into grid... ) : ( ↑↓ navigate · space toggle · enter launch grid )}
{/* ── Grid workspace (result) ── */}
{/* Tab bar */}
acme-api · quantum-dash
ml-pipeline
{/* Pane grid */}
{/* Pane 1: acme-api (busy) */}
acme-api
> I'll fix the token refresh bug
Reading src/auth/token.ts...
Reading src/auth/middleware.ts...
Grep: refreshToken pattern_
{/* Pane 2: quantum-dash (idle) */}
4m quantum-dash
Updated chart component
New hook: useChartData.ts
Waiting for input...
{/* Pane 3: ml-pipeline (busy, full width) */}
ml-pipeline
> Building BERT fine-tuning pipeline
Processing dataset: train.jsonl
Epoch 3/10 ████████░░░░░░░░░░░░ 30%
); }