234 lines
4.4 KiB
CSS
234 lines
4.4 KiB
CSS
:root {
|
|
--bg: #07060d;
|
|
--panel: #12101f;
|
|
--panel-edge: #2a2446;
|
|
--text: #d9d4f2;
|
|
--muted: #8d86b3;
|
|
--dmd: #ff9d2e;
|
|
--dmd-dim: rgba(255, 157, 46, 0.12);
|
|
--accent: #ff3fa4;
|
|
--accent-2: #34e7ff;
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
height: 100%;
|
|
margin: 0;
|
|
}
|
|
|
|
body {
|
|
background:
|
|
radial-gradient(ellipse at 30% 0%, #1d1440 0%, transparent 60%),
|
|
radial-gradient(ellipse at 90% 100%, #0f2a44 0%, transparent 55%),
|
|
var(--bg);
|
|
color: var(--text);
|
|
font: 15px/1.45 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.cabinet {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 24px;
|
|
height: 100%;
|
|
padding: 12px;
|
|
}
|
|
|
|
/* A slight downward camera angle onto the table, like looking at a cabinet from in front of it: the
|
|
canvas still renders the flat, straight-down game exactly as the physics sees it — this tilts that
|
|
finished picture in 3D space, so no game or input coordinate changes with it.
|
|
.playfield is sized (by main.js) to the box the tilted table should visually occupy; .playfield-tilt
|
|
is positioned absolutely within it and holds a canvas rendered taller than that box on purpose — the
|
|
tilt's own perspective foreshortening compresses it back down to fit, bottom edge anchored in place. */
|
|
.playfield {
|
|
flex: none;
|
|
position: relative;
|
|
perspective: 1900px;
|
|
perspective-origin: 50% 15%;
|
|
}
|
|
|
|
.playfield-tilt {
|
|
position: absolute;
|
|
left: 50%;
|
|
bottom: 0;
|
|
transform: translateX(-50%) rotateX(28deg);
|
|
transform-origin: 50% 100%;
|
|
line-height: 0;
|
|
border-radius: 14px;
|
|
box-shadow:
|
|
0 0 0 2px #2b2150,
|
|
0 0 50px rgba(120, 70, 255, 0.4),
|
|
0 45px 70px rgba(0, 0, 0, 0.7);
|
|
overflow: hidden;
|
|
}
|
|
|
|
canvas {
|
|
display: block;
|
|
}
|
|
|
|
.backbox {
|
|
flex: none;
|
|
width: 300px;
|
|
max-height: 100%;
|
|
overflow-y: auto;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 14px;
|
|
}
|
|
|
|
.marquee {
|
|
margin: 0;
|
|
font-size: 34px;
|
|
font-weight: 900;
|
|
letter-spacing: 0.08em;
|
|
line-height: 1;
|
|
color: #fff;
|
|
text-shadow: 0 0 6px var(--accent), 0 0 22px var(--accent);
|
|
}
|
|
|
|
.marquee span {
|
|
color: var(--accent-2);
|
|
text-shadow: 0 0 6px var(--accent-2), 0 0 22px var(--accent-2);
|
|
}
|
|
|
|
.dmd {
|
|
background-color: #120a02;
|
|
background-image: radial-gradient(circle, rgba(255, 157, 46, 0.09) 1px, transparent 1.3px);
|
|
background-size: 4px 4px;
|
|
border: 2px solid #3b2508;
|
|
border-radius: 8px;
|
|
padding: 12px 14px;
|
|
text-align: center;
|
|
font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
|
|
color: var(--dmd);
|
|
text-shadow: 0 0 4px var(--dmd), 0 0 12px rgba(255, 140, 20, 0.6);
|
|
box-shadow: inset 0 0 24px rgba(0, 0, 0, 0.8);
|
|
}
|
|
|
|
.dmd-score {
|
|
font-size: 34px;
|
|
font-weight: 800;
|
|
letter-spacing: 0.04em;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.dmd-message {
|
|
font-size: 18px;
|
|
font-weight: 700;
|
|
min-height: 1.4em;
|
|
letter-spacing: 0.1em;
|
|
}
|
|
|
|
.dmd-sub {
|
|
font-size: 12px;
|
|
min-height: 1.4em;
|
|
letter-spacing: 0.12em;
|
|
opacity: 0.85;
|
|
}
|
|
|
|
.stats {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: 8px;
|
|
margin: 0;
|
|
}
|
|
|
|
.stats div {
|
|
background: var(--panel);
|
|
border: 1px solid var(--panel-edge);
|
|
border-radius: 8px;
|
|
padding: 6px 10px;
|
|
}
|
|
|
|
.stats dt {
|
|
font-size: 11px;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.12em;
|
|
color: var(--muted);
|
|
}
|
|
|
|
.stats dd {
|
|
margin: 0;
|
|
font-size: 18px;
|
|
font-weight: 700;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.panel {
|
|
background: var(--panel);
|
|
border: 1px solid var(--panel-edge);
|
|
border-radius: 8px;
|
|
padding: 10px 12px;
|
|
}
|
|
|
|
.panel h2 {
|
|
margin: 0 0 6px;
|
|
font-size: 12px;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.14em;
|
|
color: var(--muted);
|
|
}
|
|
|
|
.panel ul {
|
|
margin: 0;
|
|
padding: 0;
|
|
list-style: none;
|
|
display: grid;
|
|
gap: 5px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.keys li {
|
|
display: flex;
|
|
gap: 8px;
|
|
align-items: baseline;
|
|
}
|
|
|
|
.keys li span {
|
|
flex: none;
|
|
min-width: 70px;
|
|
}
|
|
|
|
.rules li {
|
|
color: var(--text);
|
|
}
|
|
|
|
.rules b {
|
|
color: var(--accent-2);
|
|
font-weight: 600;
|
|
}
|
|
|
|
kbd {
|
|
display: inline-block;
|
|
min-width: 1.6em;
|
|
padding: 1px 5px;
|
|
border: 1px solid #4a4270;
|
|
border-bottom-width: 3px;
|
|
border-radius: 5px;
|
|
background: #1c1833;
|
|
font: 600 12px/1.3 ui-monospace, Menlo, Consolas, monospace;
|
|
text-align: center;
|
|
color: #fff;
|
|
}
|
|
|
|
@media (max-width: 760px) {
|
|
body {
|
|
overflow: auto;
|
|
}
|
|
|
|
.cabinet {
|
|
flex-direction: column;
|
|
height: auto;
|
|
}
|
|
|
|
.backbox {
|
|
width: min(100%, 420px);
|
|
max-height: none;
|
|
}
|
|
}
|