ui/recoiltuner.razor.scss
// RECOIL TUNER — a dev panel, so it reads as one.
//
// ⚠️ MODELLED ON SoulBoxTuner.razor.scss, NOT SHARING IT. Razor components scope their own
// styles; a shared sheet would make either tuner's tweak silently change the other. Same
// argument that file already makes about its own copy of TradeTableTuner's.
//
// ⚠️ COOL GREY, DELIBERATELY PLAIN. It sits over the game while the player watches a gun kick —
// a styled panel would compete with the thing being judged, which is the whole job here.
.tuner {
position: absolute;
width: 100%;
height: 100%;
pointer-events: none;
align-items: flex-start;
justify-content: flex-start;
padding: 60px 0 0 40px;
font-family: Inter;
// ⛔ NOT `display: none`. A zero-opacity panel keeps its layout, so the rows do not reflow on
// the frame it opens.
&.hidden {
opacity: 0;
pointer-events: none;
}
}
.panel {
flex-direction: column;
width: 520px;
background-color: rgba(8, 10, 12, 0.92);
border: 1px solid rgba(255, 255, 255, 0.10);
border-radius: 4px;
padding: 14px 16px 16px;
// ⚠️ The ROOT is pointer-events:none so the game keeps the mouse everywhere else; only the
// panel itself takes clicks, or the sliders cannot be dragged.
pointer-events: all;
}
.head {
flex-direction: row;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
padding-bottom: 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
.title {
font-size: 13px;
font-weight: 600;
letter-spacing: 1.6px;
color: rgba(228, 234, 240, 1);
}
.close {
font-size: 20px;
color: rgba(150, 160, 172, 1);
padding: 0 4px;
cursor: pointer;
&:hover { color: rgba(235, 240, 245, 1); }
}
}
.warn {
font-size: 12.5px;
color: rgba(226, 180, 110, 1);
margin-bottom: 10px;
}
// ⚠️ THE GROUP HEADINGS ARE THE POINT OF THE LAYOUT. Six sliders in a flat list is six numbers;
// grouped under what they move, it is three decisions. The three parts got names for the same
// reason.
.group {
font-size: 11px;
letter-spacing: 1.1px;
color: rgba(128, 140, 154, 1);
margin: 12px 0 4px;
padding-bottom: 4px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.row {
flex-direction: row;
align-items: center;
height: 30px;
.label {
width: 68px;
font-size: 13px;
color: rgba(160, 170, 182, 1);
}
.s {
flex-grow: 1;
margin: 0 10px;
}
// ⚠️ Tabular figures and a fixed width, so the number does not shove the slider sideways as it
// ticks through 9 -> 10 -> 100.
.val {
width: 58px;
justify-content: flex-end;
text-align: right;
font-size: 13px;
color: rgba(224, 230, 236, 1);
font-variant-numeric: tabular-nums;
}
}
// The delivered figure. Monospace because it is data, green because it is the answer rather than
// the input — the sliders above are what you set, this is what the gun does.
.out {
margin-top: 10px;
padding: 8px 10px;
background-color: rgba(0, 0, 0, 0.45);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 3px;
font-family: Consolas;
font-size: 12px;
color: rgba(150, 210, 170, 1);
white-space: nowrap;
&.climb {
margin-top: 4px;
color: rgba(200, 190, 140, 1);
}
}
.buttons {
flex-direction: row;
margin-top: 12px;
}
.btn {
padding: 7px 14px;
margin-right: 8px;
background-color: rgba(255, 255, 255, 0.07);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 3px;
font-size: 12.5px;
letter-spacing: 0.6px;
color: rgba(224, 230, 236, 1);
cursor: pointer;
&:hover { background-color: rgba(255, 255, 255, 0.13); }
&.copy {
background-color: rgba(70, 130, 100, 0.35);
border-color: rgba(120, 200, 160, 0.35);
}
// ⚠️ AN ON STATE THAT IS NOT JUST THE LABEL. "Using base" and "Use base" differ by three
// characters; at a glance, while shooting, the colour is what actually reads.
&.on {
background-color: rgba(80, 120, 180, 0.35);
border-color: rgba(130, 175, 235, 0.40);
}
}