* { 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; }
.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; }