:root{
  --bg:#12141c; --panel:#1b1f2b; --panel2:#232838; --text:#e8eaf1;
  --muted:#8b93a7; --accent:#7c9cff; --accent2:#4fd6c4; --danger:#ff6b6b;
  --radius:14px;
  /* --line was used by six rules (division blocks, stop knobs, couplers,
     voice chips, the score viewport) and defined by none of them. An
     undefined custom property makes the whole `border: 1px solid var(--line)`
     declaration invalid, so all of those elements simply had no border at
     all -- which is why the console read as a flat wall of text. */
  --line:#2f3547;
  /* Voices on one staff are told apart by colour as well as by stem
     direction; stem direction alone is ambiguous as soon as voices cross. */
  --voice4:#e0b978;
  /* Staff lines are read off, not just bordered with: they need more
     contrast than --line, which is tuned for panel edges. */
  --staff-line:#48506a;
}
*{box-sizing:border-box}
/* Themed scrollbars (Firefox + WebKit/Blink) so long lists/modals don't
   suddenly show a jarring default-white scrollbar against the dark theme */
*{scrollbar-color:#3a4055 var(--panel2); scrollbar-width:thin}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:var(--panel2)}
*::-webkit-scrollbar-thumb{background:#3a4055;border-radius:6px}
*::-webkit-scrollbar-thumb:hover{background:#4a5268}
input[type=checkbox],input[type=range]{accent-color:var(--accent)}
input[type=checkbox]{width:16px;height:16px;vertical-align:middle;margin-right:6px;cursor:pointer}
label:has(input[type=checkbox]){display:flex!important;align-items:center;cursor:pointer}
button:disabled{opacity:.55;cursor:not-allowed;filter:none}
/* Tactile "pressed" feedback -- this UI is frequently operated on a kiosk
   touchscreen, where a hover state alone gives no feedback that a tap
   registered. */
button:not(:disabled):active{filter:brightness(.9);transform:translateY(1px)}
/* Visible focus rings for keyboard navigation, without adding an outline
   to elements the mouse just clicked (focus-visible skips that case). */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,
[tabindex]:focus-visible{outline:2px solid var(--accent2);outline-offset:2px;border-radius:4px}
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.table-scroll .filelist{min-width:480px}
body{margin:0;background:linear-gradient(160deg,#0e0f16,#161a26 60%);color:var(--text);
  font-family:"Segoe UI",Roboto,system-ui,sans-serif;min-height:100vh}
.topbar{display:flex;justify-content:space-between;align-items:center;
  padding:14px 24px;background:rgba(20,23,33,.85);backdrop-filter:blur(8px);
  position:sticky;top:0;z-index:10;border-bottom:1px solid #262b3a}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:1.2rem;letter-spacing:.02em}
.brand img{height:28px;width:auto;border-radius:6px;display:block}
.nav-links a{color:var(--muted);text-decoration:none;margin-left:20px;font-size:.95rem;transition:.15s}
.nav-links a:hover{color:var(--accent)}
.nav-links a.active{color:var(--accent2)}
.lang-switch{display:inline-flex;margin-left:20px;border:1px solid #333a4d;border-radius:8px;overflow:hidden}
.lang-btn{background:transparent;border:none;color:var(--muted);font-size:.78rem;font-weight:700;
  padding:5px 9px;margin:0;border-radius:0;cursor:pointer;letter-spacing:.03em}
.lang-btn:hover{color:var(--text)}
.lang-btn.active{background:var(--accent);color:#0c0e14}
main{max-width:1100px;margin:0 auto;padding:24px}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}
@media(max-width:780px){.grid{grid-template-columns:1fr}}
.card{background:var(--panel);border:1px solid #262b3a;border-radius:var(--radius);
  padding:20px 22px;margin-bottom:20px;box-shadow:0 6px 24px rgba(0,0,0,.25);
  transition:border-color .15s,box-shadow .15s}
.card:hover{border-color:#323950;box-shadow:0 8px 28px rgba(0,0,0,.32)}
.card h2{margin-top:0;font-size:1.1rem;color:var(--accent2)}
.center-card{max-width:360px;margin:60px auto}
label{display:block;margin:12px 0 4px;font-size:.85rem;color:var(--muted)}
input[type=text],input[type=password],input[type=number],select,input[type=file]{
  width:100%;padding:9px 10px;border-radius:9px;border:1px solid #333a4d;
  background:var(--panel2);color:var(--text);font-size:.95rem}
input[type=range]{width:100%}
button{margin-top:14px;padding:9px 16px;border:none;border-radius:9px;
  background:var(--accent);color:#0c0e14;font-weight:600;cursor:pointer;transition:.15s}
button:hover{filter:brightness(1.1)}
.filelist{width:100%;border-collapse:collapse;margin-top:10px}
.filelist th{text-align:left;color:var(--muted);font-weight:500;font-size:.8rem;
  padding:6px 8px;border-bottom:1px solid #262b3a}
.filelist td{padding:8px;border-bottom:1px solid #20242f;font-size:.92rem}
.filelist .empty{color:var(--muted);text-align:center;font-style:italic}
.actions button{margin:0 3px;padding:4px 9px;background:var(--panel2);color:var(--text)}
.actions .btn-delete,.btn-delete-route{background:#2a1e22;color:var(--danger)}
#stopBtn{background:var(--danger);color:#1a0e0e}
.flash-stack{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}
.flash{background:#2a2214;color:#f0c96a;padding:10px 14px;border-radius:9px}
.hint{color:var(--muted);font-size:.88rem}
.lib-search{margin-bottom:12px}
.lib-toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.lib-toolbar .lib-search{flex:1;min-width:180px;margin-bottom:12px}
.lib-sort{width:auto;min-width:0;margin-bottom:12px}
.breadcrumb{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:12px;font-size:.9rem}
.breadcrumb-item{color:var(--muted);cursor:pointer}
.breadcrumb-item:hover{color:var(--accent)}
.breadcrumb-item.current{color:var(--accent2);cursor:default;font-weight:600}
.breadcrumb-sep{color:#3a4055}
.lib-actions-row{margin-bottom:4px}
.bulk-toolbar{display:flex;align-items:center;gap:10px;background:var(--panel2);border:1px solid var(--accent);
  border-radius:9px;padding:8px 14px;margin-bottom:12px;font-size:.88rem}
.bulk-toolbar button{margin:0;padding:6px 12px}
.col-check{width:34px}
.col-meta{color:var(--muted);white-space:nowrap;font-size:.85rem}
.col-name{font-weight:500}
.file-subfolder{color:var(--muted);font-size:.78rem;font-weight:400;margin-top:2px}
.lib-dropzone{border:2px dashed transparent;border-radius:var(--radius);transition:.15s}
.lib-dropzone.drag-over{border-color:var(--accent);background:rgba(124,156,255,.06)}
.folder-grid{display:flex;flex-wrap:wrap;gap:10px}

/* Quick Pick -- minimal file picker on the organ page. Deliberately plain:
   no toolbar, no per-row size/date columns, just folders to tap through and
   a play button, so it stays out of the way of the manuals below it. */
.quickpick{max-height:260px;display:flex;flex-direction:column}
.quickpick-tabs{display:flex;gap:6px;margin-bottom:8px}
.quickpick-tab{background:var(--panel);border:1px solid #333a4d;color:var(--muted);
  font-size:.78rem;padding:4px 10px;border-radius:7px;cursor:pointer;margin:0}
.quickpick-tab.active{background:var(--accent);border-color:var(--accent);color:#0c0e14;font-weight:600}
.quickpick-list{overflow-y:auto;max-height:190px;border-top:1px solid #20242f}
.quickpick-row{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:7px 4px;border-bottom:1px solid #20242f;font-size:.88rem;cursor:pointer}
.quickpick-row:hover{background:var(--panel2)}
.quickpick-row.quickpick-file .btn-play{margin:0;padding:3px 10px;font-size:.78rem}
.folder-card{background:var(--panel2);border:1px solid #333a4d;border-radius:10px;
  padding:10px 16px;cursor:pointer;font-size:.9rem;transition:.15s}
.folder-card:hover{border-color:var(--accent);color:var(--accent)}
.folder-card:active{transform:scale(.97)}
.btn-back{background:var(--panel2);color:var(--text);margin:0 0 10px}
.pagination{display:flex;gap:6px;margin-top:12px;flex-wrap:wrap}
.pagination button{margin:0;padding:5px 11px;background:var(--panel2);color:var(--text)}
.pagination button:disabled{background:var(--accent);color:#0c0e14;opacity:1}

/* Visualizer */
#visualizer{display:flex;flex-direction:column;gap:4px;margin:10px 0;max-height:220px;overflow-y:auto}
.vis-row{display:flex;align-items:center;gap:10px;padding:5px 8px;border-radius:8px;background:var(--panel2);font-size:.85rem}
.vis-row.lit{background:#1d3a2e;color:var(--accent2)}
.vis-dot{width:9px;height:9px;border-radius:50%;background:#3a4055;flex-shrink:0}
.vis-row.lit .vis-dot{background:var(--accent2);box-shadow:0 0 6px var(--accent2)}
.vis-label{min-width:90px;color:var(--muted)}
.vis-row.lit .vis-label{color:var(--text)}
.vis-reg{font-weight:600}

/* Virtual keyboard -- redesigned for density: everything for one manual
   stacks vertically (header, then the full-width keyboard, then its
   controls) instead of a tall side-by-side config column that used to
   force each row to the height of a 16-option listbox while the piano
   itself just sat centered in all that empty space. The goal is that all
   three manuals + pedal are visible together without scrolling. */
.manuals-head{display:flex;flex-direction:column;gap:2px;margin-bottom:14px}
.manuals-head h2{margin:0}
.manual-block{background:var(--panel2);border-radius:var(--radius);padding:12px 16px 14px;margin-bottom:12px}
.manual-block.is-pedal{background:linear-gradient(180deg,var(--panel2),#1e2333)}
.manual-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:6px}
.manual-heading{min-width:0}
.manual-title{margin:0;font-size:1rem}
.manual-auto-toggle{display:flex!important;align-items:center;margin:2px 0 0;color:var(--muted);
  font-size:.82rem;white-space:nowrap;flex-shrink:0}
.manual-reg-summary{color:var(--accent2);font-size:.8rem;margin-top:2px;min-height:1.1em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.piano{position:relative;height:92px;margin-top:2px;background:#0c0e14;border-radius:8px;width:100%}
.piano.pedal{height:56px}
/* Chips get their own full-width row instead of sharing space with the
   register list next to them -- with the full card width available, all
   16 channel chips comfortably fit on one line instead of wrapping to two
   and eating extra vertical space. */
.manual-controls{display:flex;flex-direction:column;gap:10px;margin-top:10px}
.manual-chips{display:flex;flex-wrap:wrap;gap:4px}
.chip{width:28px;height:24px;padding:0;display:flex;align-items:center;justify-content:center;
  font-size:.72rem;font-weight:600;border-radius:6px;background:var(--panel);border:1px solid #333a4d;
  color:var(--muted);cursor:pointer;margin:0;transition:.12s;flex-shrink:0}
.chip:hover{border-color:var(--accent);color:var(--text)}
.chip.selected{background:var(--accent);color:#0c0e14;border-color:var(--accent)}
.manual-stops{display:flex;flex-direction:column;gap:5px}
.stop-row{display:flex;align-items:center;gap:8px}
/* Right-aligned in a fixed-width column: labels of different lengths
   ("Ch1" vs "Ch16") then all line up flush against their dropdown instead
   of the dropdowns starting at ragged, varying offsets. */
.stop-row .stop-channel{color:var(--muted);font-size:.78rem;width:52px;flex-shrink:0;text-align:right}
.stop-row select{flex:0 0 auto;width:64%;margin:0;padding:5px 8px;font-size:.8rem}
select:disabled,input:disabled{opacity:.6;cursor:not-allowed}
#overflowVoices .vis-row{margin-top:6px}
@media(max-width:480px){
  /* Even a narrow phone-width kiosk panel can fit all 16 in one row at a
     slightly smaller size, rather than falling back to wrapping. */
  .chip{width:20px;height:20px;font-size:.6rem;border-radius:5px}
  .manual-chips{gap:2px}
}
@media(max-width:600px){
  .manual-head{flex-direction:column}
}
.key{position:absolute;top:0;box-sizing:border-box;border:1px solid #12141c;border-radius:0 0 4px 4px;
  cursor:pointer;transition:background .06s,box-shadow .06s;touch-action:none;user-select:none;-webkit-user-select:none}
.key.white{height:100%;background:#f2efe6;z-index:1}
.key.black{height:62%;background:#181a22;z-index:2}
.key.active.white{background:var(--accent2);box-shadow:0 0 10px rgba(79,214,196,.55)}
.key.active.black{background:var(--accent);box-shadow:0 0 10px rgba(124,156,255,.55)}
.webmidi-row{padding:6px 0;font-size:.9rem}

/* Toasts (replace silent fetch failures with a visible, auto-dismissing message) */
#toastHost{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);
  display:flex;flex-direction:column;gap:8px;z-index:1000;width:92%;max-width:420px;pointer-events:none}
.toast{background:var(--panel2);border:1px solid #333a4d;border-left:4px solid var(--accent);
  border-radius:9px;padding:10px 14px;font-size:.88rem;box-shadow:0 6px 20px rgba(0,0,0,.35);
  animation:toast-in .18s ease-out}
.toast.error{border-left-color:var(--danger)}
@keyframes toast-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}

.btn-play.busy,.btn-export.busy{opacity:.6}

/* Persistent transport bar (base.html) -- survives soft-navigation between
   Bibliothek and Virtuelle Orgel so playback controls are always at hand */
.transport{display:flex;align-items:center;gap:12px;padding:10px 24px;
  background:rgba(20,23,33,.7);backdrop-filter:blur(8px);border-bottom:1px solid #262b3a;
  position:sticky;top:57px;z-index:9}
.transport select{width:auto;min-width:0;flex:0 1 220px;margin:0}
.transport-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--accent2);font-size:.9rem}
.transport-time{flex-shrink:0;color:var(--muted);font-size:.82rem;font-variant-numeric:tabular-nums;
  min-width:82px;text-align:right}
.transport-btn{margin:0;padding:7px 14px;background:var(--panel2);color:var(--text);flex-shrink:0}
#stopBtn.transport-btn{background:var(--panel2);color:var(--danger)}
#stopBtn.transport-btn:not(:disabled):hover{background:#2a1e22}
#exportAudioBtn.transport-btn.busy{opacity:.6;pointer-events:none}
@media(max-width:600px){
  .transport{padding:10px 14px;flex-wrap:wrap;top:auto;position:static}
  .transport select{flex:1 1 100%;order:1}
  .transport-title{order:2;flex:1 1 auto}
  .transport-time{order:3}
  .transport-btn{order:4}
}

/* Modal */
.modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;
  align-items:center;justify-content:center;z-index:100}
.modal{background:var(--panel);border:1px solid #333a4d;border-radius:14px;padding:22px;
  max-width:600px;width:92%;max-height:85vh;overflow-y:auto}
.modal-channel-row{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.modal-channel-row span{min-width:120px;font-size:.85rem;color:var(--muted)}
.modal-channel-row select{flex:1}
.mute-label{display:flex;align-items:center;gap:4px;font-size:.8rem;color:var(--muted);white-space:nowrap}
.modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px}



/* ===================================================================== */
/* Additions: transport (seek/volume/queue), secondary buttons, system    */
/* diagnostics table, accessibility helpers.                             */
/* ===================================================================== */

/* Keyboard users land on a skip link first instead of tabbing through the
   whole nav on every page. Visually hidden until focused. */
.skip-link{position:absolute;left:-9999px;top:0;z-index:1000;background:var(--accent);
  color:#0c0e14;padding:10px 16px;border-radius:0 0 8px 0;font-weight:600}
.skip-link:focus{left:0}

/* A neutral variant so "Cancel"/"Clear"/"Refresh" don't compete visually
   with the primary action in the same row. */
.btn-secondary,.btn-back{background:var(--panel2);color:var(--text)}
.btn-secondary:hover{filter:brightness(1.15)}
.button-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.badge{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:999px;
  background:var(--accent2);color:#0c0e14;font-size:.7rem;font-weight:700;vertical-align:middle}

/* Transport: two rows now (controls + a full-width seek bar underneath),
   so the seek handle is a comfortable touch target on the kiosk screen
   instead of being squeezed between the buttons. */
.transport{display:flex;flex-direction:column;gap:8px}
.transport-main{display:flex;align-items:center;gap:12px;width:100%}
.transport-buttons{display:flex;align-items:center;gap:6px;flex-shrink:0}
.transport-volume{display:flex;align-items:center;gap:6px;flex-shrink:0}
.transport-volume input[type=range]{width:90px}
.transport-btn.active{background:var(--accent);color:#0c0e14}
.transport-btn.danger{color:var(--danger)}
.transport-btn.danger:not(:disabled):hover{background:#2a1e22}

.transport-seek{width:100%;margin:0;height:22px;-webkit-appearance:none;appearance:none;background:transparent}
.transport-seek:disabled{opacity:.4}
.transport-seek::-webkit-slider-runnable-track{height:6px;border-radius:3px;background:var(--panel2)}
.transport-seek::-moz-range-track{height:6px;border-radius:3px;background:var(--panel2)}
.transport-seek::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;
  margin-top:-5px;border-radius:50%;background:var(--accent2);border:none;cursor:pointer}
.transport-seek::-moz-range-thumb{width:16px;height:16px;border-radius:50%;
  background:var(--accent2);border:none;cursor:pointer}

@media(max-width:600px){
  .transport-main{flex-wrap:wrap}
  .transport select{flex:1 1 100%;order:1}
  .transport-title{order:2;flex:1 1 auto}
  .transport-time{order:3}
  .transport-buttons{order:4;flex:1 1 100%;justify-content:center;flex-wrap:wrap}
  .transport-volume{order:5;flex:1 1 100%}
  .transport-volume input[type=range]{flex:1}
}

/* Library toolbar / pagination */
.lib-sort-dir{margin:0 0 12px;padding:8px 12px}
.lib-toolbar button{margin:0 0 12px}
.bulk-toolbar:empty{display:none}
.pagination-gap{color:var(--muted);padding:0 2px}
.pagination-info{color:var(--muted);font-size:.8rem;margin-left:8px;align-self:center}
.folder-delete{cursor:pointer;opacity:.6}
.folder-delete:hover{opacity:1;color:var(--danger)}

/* System diagnostics */
.system-table td:first-child{color:var(--muted);width:45%}
.system-table td{font-variant-numeric:tabular-nums}

/* Computer-keyboard controls on the organ page */
.kbd-controls{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:10px}
.kbd-toggle{display:flex!important;align-items:center;margin:0;color:var(--text);font-size:.9rem}
.kbd-controls select{width:auto;min-width:140px}

/* Modal: keep the action row usable on a narrow kiosk panel */
.modal-actions{flex-wrap:wrap}
.modal-actions button{margin-top:0}

/* Respect a user's reduced-motion preference (the kiosk is sometimes used
   by people who find the toast/press animations distracting). */
@media(prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important}
}

/* ===================================================================== */
/* Organ console (Werkprinzip), live score, recording                    */
/* ===================================================================== */

.card-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
.card-head h2{margin:0}
.inline-toggle{display:inline-flex!important;align-items:center;gap:6px;margin:0;
  color:var(--muted);font-size:.85rem;white-space:nowrap}

/* -- divisions and stop jambs ----------------------------------------- */
.division-block{border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:12px;
  background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
.division-block.is-pedal{border-color:#3a3320}
.division-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.division-head h3{margin:0;font-size:1rem}
.division-abbr{display:inline-block;min-width:34px;text-align:center;padding:2px 6px;
  border-radius:6px;background:var(--panel2);color:var(--accent2);
  font-weight:700;font-size:.72rem;letter-spacing:.06em}
.division-count{color:var(--muted);font-size:.8rem}
.division-actions{display:flex;gap:6px;align-items:center;margin-left:auto;flex-wrap:wrap}
.division-actions button{margin:0;padding:6px 10px}
.stop-picker{width:auto;min-width:150px;margin:0}
.division-add{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.division-add select{width:auto;min-width:170px;margin:0}
.division-add button{margin:0}

/* A drawn stop is a knob: name over footage, coloured by tonal family so a
   registration can be read at a glance the way a stop jamb is. */
.stop-jamb{display:flex;flex-wrap:wrap;gap:8px}
.stop-knob{display:flex;flex-direction:column;align-items:center;gap:2px;
  min-width:96px;padding:8px 10px;margin:0;border-radius:10px;cursor:pointer;
  border:1px solid var(--line);background:var(--panel2);line-height:1.15}
.stop-knob .stop-name{font-size:.78rem;font-weight:600;color:var(--text)}
.stop-knob .stop-foot{font-size:.72rem;color:var(--muted);font-variant-numeric:tabular-nums}
.stop-knob.drawn{box-shadow:inset 0 0 0 2px var(--accent2),0 2px 6px rgba(0,0,0,.35)}
.stop-knob:hover{filter:brightness(1.2)}
.family-principal{border-left:4px solid #7aa2f7}
.family-flute{border-left:4px solid #7bcf9a}
.family-string{border-left:4px solid #c9a6f0}
.family-aliquot{border-left:4px solid #e0b978}
.family-mixture{border-left:4px solid #f0866b}
.family-reed{border-left:4px solid #e05f7a}
.family-combination{border-left:4px solid #8b90a0}
.family-effect{border-left:4px solid #5ac8d8}
.family-other{border-left:4px solid var(--line)}

.coupler-bar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.coupler{margin:0;padding:8px 14px;border-radius:999px;background:var(--panel2);
  color:var(--muted);border:1px solid var(--line);font-weight:600;font-size:.82rem}
.coupler.on{background:var(--accent);color:#0c0e14;border-color:transparent}
.coupler-add{padding:8px 14px;border-radius:999px}
.coupler-form{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:12px 0}
.coupler-form select{width:auto;min-width:130px;margin:0}
#channelBudget.warn{color:var(--danger)}

/* Compact read-only stop strip shown under each keyboard */
.manual-stop-strip{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.stop-chip{display:inline-flex;align-items:baseline;gap:5px;padding:3px 8px;
  border-radius:6px;background:var(--panel2);font-size:.74rem;color:var(--text)}
.stop-chip .stop-foot{color:var(--muted);font-size:.7rem}

/* -- live score -------------------------------------------------------- */
.score-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.score-controls select{width:auto;margin:0;padding:6px 8px}
.score-controls input[type=range]{width:120px}
.score-voices{display:flex;gap:6px;flex-wrap:wrap;margin:10px 0}
.voice-chip{display:inline-flex!important;align-items:center;gap:5px;margin:0;
  padding:4px 10px;border-radius:999px;background:var(--panel2);
  border:1px solid var(--line);font-size:.78rem;color:var(--muted);cursor:pointer}
.voice-chip.on{color:var(--text);border-color:var(--accent2)}
.voice-chip input{margin:0}
.score-viewport{position:relative;overflow:hidden;border-radius:10px;
  background:linear-gradient(180deg,#171b26,#141824);
  border:1px solid var(--line);min-height:120px;
  /* The score is draggable/scrubbable, so say so with the cursor. */
  cursor:grab;touch-action:none;user-select:none}
.score-viewport:active{cursor:grabbing}
.score-canvas{display:block}
.score-placeholder{padding:24px}
#scoreKey{color:var(--accent2);font-size:.82rem;font-weight:600;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.score-legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:8px;
  color:var(--muted);font-size:.76rem}
.score-legend span{display:inline-flex;align-items:center;gap:5px}
.score-legend i{width:9px;height:9px;border-radius:50%;display:inline-block}
.score-legend .lg-v1{background:var(--text)}
.score-legend .lg-v2{background:var(--accent)}
.score-legend .lg-v3{background:var(--accent2)}
.score-legend .lg-v4{background:var(--voice4)}

/* -- recording --------------------------------------------------------- */
.record-controls{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:12px}
.record-btn{margin:0;background:var(--panel2);color:var(--text);font-weight:600;padding:12px 20px}
.record-btn.armed{background:var(--danger);color:#fff;animation:record-pulse 1.6s ease-in-out infinite}
@keyframes record-pulse{0%,100%{opacity:1}50%{opacity:.72}}
.record-clock{font-variant-numeric:tabular-nums;color:var(--muted);font-size:.9rem}
.record-clock.live{color:var(--danger);font-weight:600}
.record-arm{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.take-name{margin:0;width:100%;min-width:120px;padding:6px 8px}
.muted-row{opacity:.45}
