theme
The printed look of HELSINKI LIFE, in one place.
local T = require("game.screens.theme")
local m = T.metrics()
metrics()
Reads ui.screenSize() every time it is called and returns the numbers every
builder lays out from, for THAT screen. Nothing downstream holds a pixel chosen
for one frame.
| Key | What it is |
|---|---|
w, h, aspect, portrait | the live screen |
s | one scale for type and spacing, tied to the SHORT edge, clamped 0.52..1.5 |
pad, gap | page and stack spacing |
tap | the smallest a finger gets: at least 46 points |
cardW, cardMaxH | the modal card, a share of the screen capped at a readable measure |
colW | the HUD player column, a column at every aspect |
t | the type scale: mega title head sub body small tiny num |
The look
Cream paper, ink type, a green header band, a hairline double rule, and a halftone dot screen over the band: a 1950s HKL enamel sign. Display type is condensed, set in capitals with wide letter spacing, the way a tram destination board is.
C | the palette: paper, ink, HKL green, copper, sea, sun, brick, plum, rose |
F | the families: anton display, archivoblack heavy, arimo body, jetbrainsmono numbers |
All four families are bundled, so the web build draws the same faces as the desktop one.
Style builders
scrim card band display body rowStyle primaryStyle chipStyle
return style tables; text rule spacer return nodes.
enter(index, rise), enterCard(rise, scale) and pulse() return animation
tables, and nil while the clock is held (animating() is the test). An
entrance holds its first keyframe when time is not advancing, so a card built
with one under a held clock would be invisible; skipping the animation there
shows the settled pose instead.
Scoped to this part · feeds back into the world's score.