* { box-sizing: border-box; } html, body, #root { height: 100%; margin: 0; } body { background: #0f1115; color: #d7dae0; font: 13px/1.4 system-ui, sans-serif; overflow: hidden; } .app { display: flex; flex-direction: column; height: 100%; } .loading { padding: 2rem; color: #888; } header, .transport { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: #191c22; border-bottom: 1px solid #262a33; flex: none; } .brand { font-weight: 700; color: #5aa9e6; letter-spacing: 0.5px; } .spacer { flex: 1; } button { background: #262b35; color: #d7dae0; border: 1px solid #333a47; border-radius: 4px; padding: 4px 10px; cursor: pointer; font: inherit; } button:hover { background: #303747; } button:disabled { opacity: 0.5; cursor: default; } button.toggled { background: #3a5b82; border-color: #5aa9e6; } button.rec { color: #ff5252; } button.rec.toggled { background: #6e2424; border-color: #ff5252; } button.mini { padding: 1px 6px; font-size: 11px; } button.danger:hover { background: #6e2424; border-color: #ff5252; } input, select { background: #10131a; color: #d7dae0; border: 1px solid #333a47; border-radius: 4px; padding: 3px 6px; font: inherit; } input[type='number'] { width: 56px; } input[type='checkbox'] { accent-color: #5aa9e6; } input[type='range'] { padding: 0; flex: 1; accent-color: #5aa9e6; } label { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; } .songname { width: 200px; } .devicebar { display: flex; align-items: center; gap: 8px; } .dot { width: 9px; height: 9px; border-radius: 50%; background: #555; display: inline-block; } .dot.ok { background: #4cd964; } .err { color: #e07a7a; } .transport .pos { font-variant-numeric: tabular-nums; background: #10131a; border: 1px solid #333a47; border-radius: 4px; padding: 3px 8px; min-width: 52px; text-align: center; } .transport .status { color: #aaa; } .main { display: flex; flex: 1; min-height: 0; } .tracklist { width: 250px; flex: none; overflow-y: auto; background: #14161c; border-right: 1px solid #262a33; padding: 6px; display: flex; flex-direction: column; gap: 6px; } .trackrow { background: #1b1f27; border: 1px solid #262a33; border-radius: 6px; padding: 6px; cursor: pointer; display: flex; flex-direction: column; gap: 5px; } .trackrow.active { border-color: #5aa9e6; background: #1e2530; } .trackrow-top, .trackrow-bottom, .trackrow-vol { display: flex; align-items: center; gap: 5px; } .trackrow .chip { width: 10px; height: 10px; border-radius: 3px; flex: none; } .trackrow .trackname { flex: 1; min-width: 0; background: transparent; border-color: transparent; } .trackrow .trackname:hover, .trackrow .trackname:focus { border-color: #333a47; background: #10131a; } .trackrow select { flex: 1; min-width: 0; } .trackrow .notecount { color: #777; font-size: 11px; white-space: nowrap; } .trackrow-knobs { display: flex; flex-direction: column; gap: 2px; } .knob { display: flex; align-items: center; gap: 5px; font-size: 11px; color: #9aa0ab; } .knob .knoblabel { flex: none; width: 88px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .knob input[type='range'] { flex: 1; } .knob .knobvalue { flex: none; width: 44px; text-align: right; font-variant-numeric: tabular-nums; } .addtrack { margin-top: 2px; } .pianoroll { flex: 1; min-width: 0; position: relative; } .pianoroll canvas { position: absolute; inset: 0; display: block; touch-action: none; } .statusbar { flex: none; padding: 3px 10px; background: #191c22; border-top: 1px solid #262a33; color: #8a8f99; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .modal-backdrop { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.55); display: flex; align-items: center; justify-content: center; z-index: 10; } .modal { background: #191c22; border: 1px solid #333a47; border-radius: 8px; width: min(560px, 92vw); max-height: 80vh; display: flex; flex-direction: column; padding: 14px; gap: 10px; } .modal-head { display: flex; align-items: center; gap: 8px; } .modal-head h2 { margin: 0; font-size: 16px; flex: none; } .songlist { overflow-y: auto; display: flex; flex-direction: column; gap: 4px; } .songrow { display: flex; align-items: center; gap: 6px; } .songrow.active .songname { color: #5aa9e6; } .songopen { flex: 1; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; text-align: left; } .dim { color: #777; font-size: 11px; }