Code/UI/SkafinityMusicPanel.razor.scss
// ── Theme ─────────────────────────────────────────────────────────────────────
// Re-theming the panel is a one-stop edit: override these variables. The palette is
// rotaliate's dark-purple CRT look; nothing below hardcodes a colour outside this block.
$bg: #07051a; // panel background (rotaliate dark purple)
$btn: #03021a; // buttons / cells — deeper than the panel
$btn-hover: #0a1052; // button / cell hover
$border: rgba(120,150,255,0.6); // hover border
$filled: #2a3aa8; // filled ticks / selected volume cells
$accent: #58e87a; // on / ok accent (green)
$accent-bg: rgba(88,232,122,0.25); // accent toggle background
$text: rgba(255,255,255,0.85); // primary text
$text-dim: rgba(255,255,255,0.45); // labels
// ────────────────────────────────────────────────────────────────────────────────
skafinitymusicpanel {
// Fill the ScreenPanel; flex-centre the board. pointer-events:none so a closed panel
// never blocks anything — only the board / button itself take pointer events.
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
justify-content: center; align-items: center;
pointer-events: none;
font-family: Poppins;
// Floating toggle button (shown when the board is closed), bottom-left.
.fab {
position: absolute; left: 24px; bottom: 24px;
width: 52px; height: 52px;
justify-content: center; align-items: center;
font-size: 28px; color: $text;
background-color: $btn;
border: 2px solid rgba(255,255,255,0.12); border-radius: 26px;
cursor: pointer; pointer-events: all;
&:hover { background-color: $btn-hover; border-color: $border; }
}
// The board — sized to its content (no scroll range to drag-pan). Keep it lean enough
// to fit a 1080-tall reference; it extends past the box rather than scrolling.
.music {
flex-shrink: 0;
width: 96%; max-width: 1320px;
flex-direction: column;
align-items: stretch;
padding: 14px 32px;
background-color: $bg;
border: 1.5px solid rgba(255,255,255,0.12);
border-radius: 16px;
gap: 6px;
pointer-events: all;
}
.music > div { flex-shrink: 0; }
.header { flex-direction: row; align-items: center; justify-content: space-between; }
.title {
justify-content: center; white-space: nowrap;
font-size: 26px; font-weight: bold; letter-spacing: 6px; color: white;
}
.close {
width: 34px; height: 34px; justify-content: center; align-items: center;
font-size: 20px; font-weight: bold; color: rgba(255,255,255,0.6);
background-color: rgba(255,255,255,0.08); border-radius: 8px;
cursor: pointer; pointer-events: all;
&:hover { color: #ffffff; background-color: rgba(255,255,255,0.2); }
}
.divider { height: 2px; background-color: rgba(255,255,255,0.1); margin: 0; }
.top { flex-direction: row; flex-wrap: wrap; gap: 6px 32px; }
.top > .row { width: 46%; }
.row { flex-direction: column; gap: 3px; }
.genre-row .cells { gap: 6px; }
.label {
font-size: 14px; letter-spacing: 2px;
color: $text-dim; white-space: nowrap;
}
.play-row { flex-direction: row; align-items: center; gap: 8px; }
.seed-box, .num {
justify-content: center; align-items: center; height: 32px; padding: 0 14px;
font-size: 15px; letter-spacing: 1px; color: white;
background-color: rgba(255,255,255,0.07); border-radius: 6px;
}
.num { min-width: 60px; font-weight: bold; }
.tag-input {
width: 360px; height: 32px; padding: 0 12px; font-size: 15px; color: white;
background-color: rgba(255,255,255,0.07);
border: 2px solid rgba(255,255,255,0.15); border-radius: 6px; pointer-events: all;
}
.cells { flex-direction: row; align-items: center; flex-wrap: wrap; gap: 4px; }
.btn {
justify-content: center; align-items: center; height: 32px; padding: 0 16px;
font-size: 14px; color: $text;
background-color: $btn;
border: 2px solid transparent; border-radius: 6px; cursor: pointer; pointer-events: all;
&.wide { min-width: 96px; }
&.reroll { height: 28px; padding: 0 12px; font-size: 13px; margin-left: 12px; }
&:hover { background-color: $btn-hover; border: 2px solid $border; }
&.toggle.on { background-color: $accent-bg; border: 2px solid rgba(88,232,122,0.7); color: #d6ffe2; }
}
.cell {
justify-content: center; align-items: center; height: 19px;
font-size: 13px; color: rgba(255,255,255,0.8);
background-color: $btn;
border: 2px solid transparent; border-radius: 5px; cursor: pointer; pointer-events: all;
&:hover { background-color: $btn-hover; border: 2px solid $border; }
&.choice { padding: 0 10px; height: 28px; }
&.tick { width: 11px; }
&.tick.filled { background-color: $filled; }
&.filled { background-color: $filled; }
&.selected { border: 2px solid rgba(255,255,255,0.85); }
}
// GLOBAL knobs: four compact columns.
.vibe-grid { flex-direction: row; flex-wrap: wrap; gap: 6px 16px; }
.vibe { width: 22%; flex-direction: column; gap: 2px; }
.vibe-head { flex-direction: row; justify-content: flex-start; align-items: center; gap: 6px; }
.vibe-name { font-size: 12px; letter-spacing: 1px; color: rgba(255,255,255,0.55); white-space: nowrap; }
.vibe-val { font-size: 12px; color: white; white-space: nowrap; }
// instrument mixer matrix: rows = voices, Volume leftmost
.matrix { flex-direction: column; gap: 3px; }
.mrow { flex-direction: row; align-items: flex-start; gap: 12px; }
.mvoice { width: 76px; flex-shrink: 0; align-items: flex-start; justify-content: flex-start;
font-size: 13px; font-weight: bold; letter-spacing: 1px; color: white; }
.mhead .mlabel { font-size: 11px; letter-spacing: 2px; color: rgba(255,255,255,0.4); }
.mcell { width: 0; flex-grow: 1; flex-direction: column; gap: 3px; }
.hint { font-size: 14px; letter-spacing: 1px; color: rgba(255,255,255,0.4); white-space: nowrap; }
.hint.ok { color: $accent; }
}