feat(v0.5): home session chooser — no auto-created/restored tabs

Opening the app no longer auto-creates a blank tab or auto-restores/discovers
sessions as tabs. Instead it lands on a launcher (session chooser): a grid of the
host's running sessions as live preview thumbnails — pick one to open (replays its
full scrollback), or '+ New session'. Closing the last tab returns to the chooser.

- public/launcher.ts: mountLauncher() renders the chooser into the terminal area
  (live xterm thumbnails via /live-sessions + /preview, 5s refresh), New session +
  Manage link
- tabs.ts: drop restore()/syncLiveSessions() auto-tab behavior; constructor lands
  on the launcher; rebuild() toggles launcher when tab count is 0; closeTab no
  longer spawns a blank tab
- style.css: .launcher chrome (reuses the .mg-* card/grid/thumbnail styles)

Verified: fresh load → 0 tabs, chooser with thumbnails; Open → tab + chooser
hides; close last tab → chooser returns. 228 tests green, tsc + build clean.
This commit is contained in:
Yaojia Wang
2026-06-19 14:52:05 +02:00
parent 9466bf4b6e
commit 50406caab0
3 changed files with 305 additions and 100 deletions

View File

@@ -660,6 +660,50 @@ body {
color: #2a0808;
}
/* ── Launcher (home session chooser, shown when no tab is open) ──── */
.launcher {
position: absolute;
inset: 0;
overflow-y: auto;
padding: 22px 18px 40px;
box-sizing: border-box;
background: var(--bg);
}
.launcher-head {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 10px 16px;
margin-bottom: 18px;
}
.launcher-title {
font-size: 20px;
font-weight: 700;
color: #fff;
}
.launcher-sub {
flex: 1 1 auto;
color: var(--text-dim);
font-size: 13px;
}
.launcher-actions {
display: flex;
gap: 8px;
}
.launcher-new {
background: var(--accent);
color: #fff;
border: none;
border-radius: 8px;
padding: 9px 16px;
font: inherit;
font-weight: 600;
cursor: pointer;
}
.launcher-new:hover {
background: var(--accent-2);
}
/* ── Session Manager page (manage.html) ──────────────────────────── */
#manage-root {
max-width: 1200px;