ui/theme.scss
// Shared UI theme tokens. Import this into a component's .razor.scss with `@import "Theme.scss";`
// so the font (and palette) are defined in ONE place. To change the UI font everywhere, edit $font.
$font: "m6x11plus";
// Monospaced, used for digit runs that
// want fixed-width cells — leaderboard times/scores, score tallies, the replay clock — so columns
// line up and numbers don't jitter as they change. $font stays the default for prose and names.
$font-mono: "m6x11plus";
// Game palette (matches the original BudgetBoy swatches).
$white: #f8f5e6; // game WHITE (248,245,230)
$black: #3a404c; // game BLACK (58,64,76)
$player-name: #f4f0c7;
// Web links (workshop author credit): a muted blue, brighter on hover. Judged in OKLCH like the
// rest of the palette (L≈0.70 / C≈0.08 / H≈250), not a saturated browser blue.
$link: #7fa6cc;
$link-hover: #a9c8e6;
// Score outcomes: victories read bright and warm; incomplete runs stay muted.
$score-victory: #f0df80;
$score-non-victory: #8f9068;
// Hard offset shadow under the square letterbox buttons. Plain dark-with-alpha so it reads on
// both the dark in-game letterbox and the light rolled menu backgrounds.
$square-btn-shadow: rgba( 0, 0, 0, 0.45 );
// s&box requires mouse-down and mouse-up to resolve to the exact same panel before emitting a
// click. Button contents are presentation only, so keep labels, icons and badges from becoming
// separate hit targets as animated or pressed buttons move beneath the cursor.
button > * {
pointer-events: none;
}
// Square 72px letterbox icon button (gear, home, test-play, …) — ONE shared look for every
// screen: dark body, accent border, a 40×40 hand-editable pixel-art icon (drawn white, coloured
// via background-tint), and a hard drop shadow. On press the face sinks INTO the shadow: the
// translate + the remaining shadow offset always sum to the resting 6px, so the shadow's outer
// edge stays put and only the face moves (same trick as the title menu's text buttons).
// Per-screen rules add ONLY position and accent colours (border-color / .img background-tint).
.square-btn {
width: 72px;
height: 72px;
justify-content: center;
align-items: center;
pointer-events: all;
cursor: blank-hand;
background-color: rgba( $black, 0.6 );
border: 4px solid $white;
border-radius: 0;
box-shadow: 6px 6px 0 $square-btn-shadow;
transition: background-color 0.1s ease;
.img {
width: 40px;
height: 40px;
background-size: 100% 100%;
background-repeat: no-repeat;
image-rendering: pixelated;
background-tint: $white;
}
&:hover {
background-color: rgba( $black, 0.9 );
}
&:active {
transform: translate( 2px, 2px );
box-shadow: 4px 4px 0 $square-btn-shadow;
}
// Icon images: 40×40 white-on-transparent PNGs in Assets/ui/icons, one class per glyph.
&.i-home .img { background-image: url( "ui/icons/icon_home.png" ); }
&.i-edit .img { background-image: url( "ui/icons/icon_edit.png" ); }
&.i-gear .img { background-image: url( "ui/icons/icon_gear.png" ); }
&.i-close .img { background-image: url( "ui/icons/icon_close.png" ); }
&.i-reload .img { background-image: url( "ui/icons/icon_reload.png" ); }
&.i-restart .img { background-image: url( "ui/icons/icon_restart.png" ); }
&.i-back .img { background-image: url( "ui/icons/icon_back.png" ); }
&.i-play .img { background-image: url( "ui/icons/icon_play.png" ); }
&.i-browse .img { background-image: url( "ui/icons/icon_browse.png" ); }
&.i-clear .img { background-image: url( "ui/icons/icon_clear.png" ); }
&.i-share .img { background-image: url( "ui/icons/icon_share.png" ); }
&.i-import .img { background-image: url( "ui/icons/icon_import.png" ); }
&.i-gif .img { background-image: url( "ui/icons/icon_gif.png" ); }
&.i-help .img { background-image: url( "ui/icons/icon_help.png" ); }
&.i-heart .img { background-image: url( "ui/icons/icon_heart.png" ); }
&.i-heart-outline .img { background-image: url( "ui/icons/icon_heart_outline.png" ); }
&.i-check .img { background-image: url( "ui/icons/icon_check.png" ); }
&.i-trophy .img { background-image: url( "ui/icons/icon_trophy.png" ); }
&.i-thumbsup .img { background-image: url( "ui/icons/icon_thumbsup.png" ); }
&.i-replay .img { background-image: url( "ui/icons/icon_replay.png" ); }
&.i-arrow-left .img { background-image: url( "ui/icons/icon_arrow_left.png" ); }
&.i-arrow-right .img { background-image: url( "ui/icons/icon_arrow_right.png" ); }
}