"use client"; import { useEffect, useState, useCallback } from "react"; import Image from "next/image"; const projects = [ { name: "acme-api", branch: "main", time: "25m ago" }, { name: "quantum-dash", branch: "feat/charts", time: "1h ago" }, { name: "ml-pipeline", branch: "exp/bert", time: "just now" }, ]; type Phase = | "typing" // cladm console visible, cursor selecting projects | "selecting" // checkboxes toggling on one by one | "enter" // "Enter" flash, cladm fades | "cascade" // terminals fly in | "hold" // terminals visible | "fadeout" // everything fades, restart | "pause"; // brief gap before loop 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"); // Typing/appear cladm console const t1 = setTimeout(() => setPhase("selecting"), 800); // Toggle checkboxes one by one const t2 = setTimeout(() => setSelectedCount(1), 1200); const t3 = setTimeout(() => setSelectedCount(2), 1600); const t4 = setTimeout(() => setSelectedCount(3), 2000); // Enter pressed const t5 = setTimeout(() => setPhase("enter"), 2600); // Cascade terminals in const t6 = setTimeout(() => setPhase("cascade"), 3200); // Hold const t7 = setTimeout(() => setPhase("hold"), 3800); // Fade out const t8 = setTimeout(() => setPhase("fadeout"), 6200); // Pause then restart const t9 = setTimeout(() => { setPhase("pause"); setCycle((c) => c + 1); }, 7000); 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 showCladm = phase === "typing" || phase === "selecting" || phase === "enter"; const showCascade = phase === "cascade" || phase === "hold" || phase === "fadeout"; return (
{/* ── CLADM console (cause) ── */}
{/* Title bar */}
cladm — {selectedCount} selected
{/* Project rows */}
{" PROJECT BRANCH LAST USE"}
{projects.map((proj, i) => { const checked = i < selectedCount; const isActive = i === selectedCount - 1 && phase === "selecting"; return (
{checked ? "[✓]" : "[ ]"} {proj.name.padEnd(20)} {proj.branch.padEnd(13)} {proj.time}
); })}
[ ] pixel-engine{" "}develop{" "}3h ago
{/* Enter hint */}
{phase === "enter" ? ( ⏎ Launching 3 projects... ) : ( ↑↓ navigate · space toggle · enter launch )}
{/* ── Terminal cascade (effect) ── */}
{projects.map((proj, i) => (
claude — {proj.name}
Claude Code welcome screen
))}
); }