feat: app shell with sidebar + bug fixes

UI:
- Add persistent sidebar (210px) with band switcher dropdown, Library/Player/Settings nav, user avatar row, and sign-out button
- Align design system CSS vars to CLAUDE.md spec (#0f0f12 bg, #e8a22a amber accent, rgba borders/text)
- Remove light mode toggle (no light mode in v1)
- Homepage auto-redirects to first band; shows create-band form only when no bands exist
- Strip full-page wrappers from all pages (shell owns layout)
- Remove debug console.log statements from SongPage

Bug fixes:
- nginx: trailing slash on `location ^~ /api/v1/bands/` caused 301 redirect on POST, dropping the request body — removed trailing slash
- API: _member_from_request (used by nc-scan stream) only accepted Bearer token, not httpOnly cookie — add rh_token cookie fallback
- API: internal_secret config field now has a dev default so the service starts without INTERNAL_SECRET env var set

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mistral Vibe
2026-04-01 09:43:47 +02:00
parent ae7bf96dc1
commit d9035acdff
11 changed files with 763 additions and 255 deletions

View File

@@ -4,7 +4,7 @@
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
-webkit-font-smoothing: antialiased;
background: var(--bg);
color: var(--text);
@@ -14,39 +14,23 @@ input, textarea, button, select {
font-family: inherit;
}
/* ── Dark theme (default) — GitHub Primer slate ─────────────────────────── */
:root,
[data-theme="dark"] {
--bg: #0d1117;
--bg-subtle: #161b22;
--bg-inset: #21262d;
--border: #30363d;
--text: #e6edf3;
--text-muted: #8b949e;
--text-subtle: #484f58;
--accent: #f0a840;
--accent-bg: #2a1e08;
--accent-fg: #080c10;
--teal: #38c9a8;
--teal-bg: #0a2820;
--danger: #f85149;
--danger-bg: #1a0810;
}
/* ── Light theme ─────────────────────────────────────────────────────────── */
[data-theme="light"] {
--bg: #ffffff;
--bg-subtle: #f6f8fa;
--bg-inset: #eef1f5;
--border: #d0d7de;
--text: #24292f;
--text-muted: #57606a;
--text-subtle: #afb8c1;
--accent: #f0a840;
--accent-bg: #fff8e1;
--accent-fg: #1c1007;
--teal: #0a6b56;
--teal-bg: #d1f7ef;
--danger: #cf222e;
--danger-bg: #ffebe9;
/* ── Design system (dark only — no light mode in v1) ─────────────────────── */
:root {
--bg: #0f0f12;
--bg-subtle: rgba(255,255,255,0.025);
--bg-inset: rgba(255,255,255,0.04);
--border: rgba(255,255,255,0.08);
--border-subtle: rgba(255,255,255,0.05);
--text: #eeeef2;
--text-muted: rgba(255,255,255,0.35);
--text-subtle: rgba(255,255,255,0.22);
--accent: #e8a22a;
--accent-hover: #f0b740;
--accent-bg: rgba(232,162,42,0.1);
--accent-border: rgba(232,162,42,0.28);
--accent-fg: #0f0f12;
--teal: #4dba85;
--teal-bg: rgba(61,200,120,0.1);
--danger: #e07070;
--danger-bg: rgba(220,80,80,0.1);
}