:root { --bg-primary: #0a0a0a; --bg-panel: #0f0f0f; --bg-panel-dark: #080808; --border-dim: #1a4a4a; --accent: #00ffff; --border-bright: var(--accent); --text-primary: #cccccc; --text-dim: #555555; --text-accent: var(--accent); --font-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace; --font-size: 13px; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { background: var(--bg-primary); color: var(--text-primary); font-family: var(--font-mono); font-size: var(--font-size); line-height: 1.4; height: 100vh; overflow: hidden; } /* Layout: header / (sidebar + main) / transport */ .app-shell { display: grid; grid-template-rows: 36px 1fr 52px; grid-template-columns: 200px 1fr; grid-template-areas: "header header" "sidebar main" "transport transport"; height: 100vh; gap: 1px; background: #111; } /* ── Header ─────────────────────────────────── */ .header { grid-area: header; background: var(--bg-panel-dark); border-bottom: 1px solid var(--border-dim); display: flex; align-items: center; padding: 0 12px; gap: 10px; } .header-title { color: var(--text-accent); font-size: 14px; font-weight: 600; letter-spacing: 0.15em; } .header-sep { color: var(--border-dim); } .status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--text-dim); flex-shrink: 0; } .status-dot.connected { background: #00ff88; } .status-dot.error { background: #ff3333; } .beat-indicator { width: 9px; height: 9px; border-radius: 50%; background: var(--text-dim); flex-shrink: 0; transition: background 0.05s; } .beat-indicator.beat-flash { background: #ffcc00; box-shadow: 0 0 10px #ffcc00; } .beat-label { font-size: 10px; letter-spacing: 0.12em; } /* ── Sidebar ─────────────────────────────────── */ .sidebar { grid-area: sidebar; display: flex; flex-direction: column; background: var(--bg-panel); border-right: 1px solid var(--border-dim); overflow: hidden; } .panel { display: flex; flex-direction: column; overflow: hidden; flex: 1; min-height: 0; } .panel-header { background: var(--bg-panel-dark); border-bottom: 1px solid var(--border-dim); padding: 5px 10px; font-size: 10px; letter-spacing: 0.14em; color: var(--text-accent); text-transform: uppercase; flex-shrink: 0; } .panel-content { flex: 1; padding: 8px 10px; overflow-y: auto; min-height: 0; } ::-webkit-scrollbar { width: 3px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--border-dim); } .device-row { display: flex; align-items: center; justify-content: space-between; padding: 5px 0; border-bottom: 1px solid #111; gap: 6px; } .device-row:last-child { border-bottom: none; } .device-row-info { display: flex; flex-direction: column; gap: 1px; min-width: 0; font-size: 12px; } .device-remove { background: none; border: none; color: var(--text-dim); font-size: 14px; cursor: pointer; padding: 0 2px; line-height: 1; flex-shrink: 0; } .device-remove:hover { color: #ff3333; border: none; } .device-manage-section { border-top: 1px solid var(--border-dim); flex-shrink: 0; } .device-manage-section > summary { padding: 5px 10px; font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--text-dim); cursor: pointer; user-select: none; list-style: none; } .device-manage-section > summary::-webkit-details-marker { display: none; } .device-manage-section > summary::before { content: "▶ "; font-size: 8px; } .device-manage-section[open] > summary { color: var(--text-accent); } .device-manage-section[open] > summary::before { content: "▼ "; } .device-form { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px; } .device-form button[type="submit"] { margin-top: 2px; text-transform: uppercase; letter-spacing: 0.08em; } /* ── Main area — Animation grid ─────────────── */ .main-area { grid-area: main; background: var(--bg-primary); display: flex; flex-direction: column; overflow: hidden; } .section-header { padding: 5px 14px; font-size: 10px; letter-spacing: 0.14em; color: var(--text-accent); text-transform: uppercase; background: var(--bg-panel-dark); border-bottom: 1px solid var(--border-dim); flex-shrink: 0; } .animation-list { display: flex; flex-direction: column; overflow-y: auto; flex: 1; } .anim-tile { background: transparent; border: none; border-bottom: 1px solid #111; color: var(--text-dim); font-family: var(--font-mono); font-size: var(--font-size); cursor: pointer; padding: 8px 14px; display: flex; align-items: baseline; gap: 10px; text-align: left; } .anim-tile:hover { background: #0d0d0d; color: var(--text-primary); } .anim-tile.active { background: #0a1a1a; color: var(--accent); } .anim-cursor { color: transparent; flex-shrink: 0; font-size: 12px; } .anim-tile.active .anim-cursor { color: var(--accent); } .anim-name { font-size: 12px; letter-spacing: 0.06em; flex-shrink: 0; } .anim-desc { font-size: 11px; color: var(--text-dim); } /* ── Transport bar ───────────────────────────── */ .transport-bar { grid-area: transport; background: var(--bg-panel-dark); border-top: 1px solid var(--border-dim); display: flex; align-items: center; gap: 8px; padding: 0 12px; } .transport-btn { background: var(--bg-panel); color: var(--accent); border: 1px solid var(--border-dim); padding: 5px 10px; font-family: var(--font-mono); font-size: 12px; cursor: pointer; white-space: nowrap; flex-shrink: 0; text-align: center; } .transport-btn:hover { background: var(--accent); color: var(--bg-primary); border-color: var(--accent); } .transport-playpause { min-width: 38px; font-size: 14px; } .transport-time { font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--text-primary); flex-shrink: 0; } .seek-slider { flex: 1; min-width: 60px; accent-color: var(--accent); cursor: pointer; height: 3px; } .transport-sep { width: 1px; height: 20px; background: var(--border-dim); flex-shrink: 0; } .transport-file-select { background: var(--bg-panel); color: var(--text-primary); border: 1px solid var(--border-dim); font-family: var(--font-mono); font-size: 12px; padding: 4px 6px; max-width: 200px; min-width: 100px; cursor: pointer; flex-shrink: 1; } /* Form base */ input, select, button { background: var(--bg-panel); border: 1px solid var(--border-dim); color: var(--text-primary); font-family: var(--font-mono); font-size: var(--font-size); padding: 4px 8px; outline: none; border-radius: 0; } button:hover { border-color: var(--border-bright); color: var(--text-accent); cursor: pointer; } .text-dim { color: var(--text-dim); } .text-accent { color: var(--text-accent); } /* ── Timeline ──────────────────────────────────── */ #timeline-canvas { flex: 1; display: block; min-height: 0; cursor: default; } .timeline-toolbar { height: 32px; background: var(--bg-panel-dark); border-bottom: 1px solid var(--border-dim); display: flex; align-items: center; gap: 16px; padding: 0 12px; flex-shrink: 0; } .toolbar-field { display: flex; align-items: center; gap: 6px; } .toolbar-label { font-size: 10px; text-transform: uppercase; color: var(--text-dim); letter-spacing: 0.1em; white-space: nowrap; } .toolbar-unit { font-size: 10px; color: var(--text-dim); } .toolbar-sep { width: 1px; height: 20px; background: var(--border-dim); flex-shrink: 0; } #zoom-slider { width: 100px; accent-color: var(--accent); height: 3px; } #beat-offset { width: 70px; font-size: 12px; padding: 2px 4px; } .snap-btn.active { background: var(--accent); color: var(--bg-primary); border-color: var(--accent); } /* ── Block Inspector Strip ─────────────────────── */ .block-inspector { height: 40px; background: var(--bg-panel-dark); border-top: 1px solid var(--border-dim); display: flex; align-items: center; gap: 16px; padding: 0 12px; flex-shrink: 0; } .inspector-label { color: var(--text-accent); font-size: 14px; font-weight: 600; text-transform: uppercase; flex-shrink: 0; min-width: 120px; } .inspector-field { display: flex; align-items: center; gap: 4px; font-size: 10px; text-transform: uppercase; color: var(--text-dim); letter-spacing: 0.1em; } .inspector-field input, .inspector-field select { font-size: 12px; padding: 2px 4px; background: var(--bg-panel); border: 1px solid var(--border-dim); color: var(--text-primary); font-family: var(--font-mono); } .inspector-field input[type="number"] { width: 60px; } .inspector-color-swatch { width: 16px; height: 16px; border: 1px solid var(--border-dim); cursor: pointer; flex-shrink: 0; } .inspector-remove { margin-left: auto; background: none; border: none; color: var(--text-dim); font-size: 16px; cursor: pointer; padding: 0 4px; } .inspector-remove:hover { color: #ff3333; border: none; } /* ── Live Preview Panel (Phase 5) ──────────────────────────────────────────── */ .live-preview { border-top: 1px solid var(--border-dim); border-bottom: 1px solid var(--border-dim); background: var(--bg-panel-dark); display: flex; flex-direction: column; gap: 1px; padding: 4px 0; max-height: 60px; overflow-y: auto; flex-shrink: 0; } .device-strip { display: flex; align-items: center; height: 18px; padding: 0 4px; background: var(--bg-panel); gap: 8px; font-size: 12px; font-family: var(--font-mono); letter-spacing: 0.05em; transition: background-color 0.1s; } .strip-label { color: var(--text-dim); text-transform: uppercase; min-width: 80px; flex-shrink: 0; font-size: 10px; letter-spacing: 0.12em; } .strip-color { width: 40px; height: 10px; background: var(--text-dim); flex-shrink: 0; transition: background-color 0.15s; } .strip-anim { color: var(--text-dim); font-size: 10px; letter-spacing: 0.05em; text-transform: uppercase; } .device-strip.active .strip-label { color: var(--text-primary); } .device-strip.active .strip-anim { color: var(--text-primary); } .keyboard-hint { color: var(--text-dim); font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.05em; white-space: nowrap; flex-shrink: 0; } /* YouTube URL input (Phase 6) */ .yt-url-input { background: var(--bg-panel); border: 1px solid var(--border-dim); color: var(--text-primary); font-family: var(--font-mono); font-size: 12px; padding: 2px 6px; width: 180px; outline: none; } .yt-url-input:focus { border-color: var(--accent); } .yt-url-input:disabled { opacity: 0.4; cursor: not-allowed; } .yt-progress { font-family: var(--font-mono); font-size: 11px; color: var(--accent); white-space: nowrap; min-width: 200px; } /* AI Sync panel (Phase 6) */ .ai-sync-panel { background: var(--bg-panel-dark); border: 1px solid var(--border-dim); margin: 0 4px; padding: 0; font-family: var(--font-mono); } .ai-sync-header { background: var(--bg-panel); padding: 4px 8px; font-size: 11px; color: var(--accent); text-transform: uppercase; letter-spacing: 1px; border-bottom: 1px solid var(--border-dim); } .ai-sync-body { padding: 6px 8px; display: flex; align-items: center; gap: 12px; } .ai-sync-info { font-size: 11px; color: var(--text-dim); min-width: 140px; } .ai-sync-toggles { display: flex; gap: 8px; } .ai-sync-toggle { font-size: 11px; color: var(--text-primary); cursor: pointer; display: flex; align-items: center; gap: 3px; } .ai-sync-toggle input[type="checkbox"] { accent-color: var(--accent); } .ai-sync-actions { display: flex; align-items: center; gap: 8px; margin-left: auto; } .ai-sync-generate { background: var(--accent); color: var(--bg-primary); font-weight: bold; padding: 3px 12px; } .ai-sync-generate:disabled { opacity: 0.3; cursor: not-allowed; } .ai-sync-llm-toggle { opacity: 0.4; } .ai-sync-llm-toggle:not(.disabled) { opacity: 1; }