CLADM
@@ -116,46 +117,54 @@ export default function Home() {
- {/* Hero content */}
-
-
+ {/* Two-column hero */}
+
+ {/* Left — text + CTA */}
+
+
-
- CLADM
-
+
+ CLADM
+
-
- TUI LAUNCHER FOR CLAUDE CODE
-
+
+ TUI LAUNCHER FOR CLAUDE CODE
+
-
- Browse all your projects. See git status at a glance. Expand into
- sessions and branches. Launch everything in parallel Terminal
- windows.
-
+
+ Browse all your projects. See git status at a glance. Expand
+ into sessions and branches. Launch everything in parallel
+ Terminal windows.
+
- {/* Install command */}
-
-
- $ bun install -g cladm
- _
-
+ {/* Install command */}
+
+
+ $ bun install -g cladm
+ _
+
+
+
+
+ requires{" "}
+
+ bun
+ {" "}
+ >= 1.3 + macOS
+
-
- requires{" "}
-
- bun
- {" "}
- >= 1.3 + macOS
-
+ {/* Right — terminal cascade */}
+
+
+
diff --git a/site/app/terminal-cascade.tsx b/site/app/terminal-cascade.tsx
new file mode 100644
index 0000000..6ef619e
--- /dev/null
+++ b/site/app/terminal-cascade.tsx
@@ -0,0 +1,176 @@
+"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}
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/site/public/claude-welcome.png b/site/public/claude-welcome.png
new file mode 100644
index 0000000..d661dd4
Binary files /dev/null and b/site/public/claude-welcome.png differ