/* --------------------------------------------------------------------------- Los Santos RP - design tokens. The interface is a set of documents from the city's Office of Vital Records, lying on a dark desk while the city runs on behind them. Paper is the only surface; the game is the room the desk is in. Nothing here is a dark glass panel, because a city clerk does not hand you one. Three typographic voices, and the rule between them is literal: preprinted Archivo, expanded, caps what the form was printed with typed IBM Plex Mono what somebody entered on it prose IBM Plex Sans plain-English notes in the margin Shared verbatim by rp_loading and rp_ui so every screen reads as one product. --------------------------------------------------------------------------- */ @font-face { font-family: 'Archivo'; src: url('fonts/archivo-var.woff2') format('woff2-variations'); font-weight: 100 900; font-stretch: 62% 125%; font-display: block; } @font-face { font-family: 'Plex Sans'; src: url('fonts/plexsans-var.woff2') format('woff2-variations'); font-weight: 100 700; font-display: block; } @font-face { font-family: 'Plex Mono'; src: url('fonts/plex-400.woff2') format('woff2'); font-weight: 400; font-display: block; } @font-face { font-family: 'Plex Mono'; src: url('fonts/plex-500.woff2') format('woff2'); font-weight: 500; font-display: block; } :root { /* --- the room ---------------------------------------------------------- */ --room: #0b0c0a; /* the dark the desk stands in, never pure black */ --desk: #1a1b16; /* desk surface where the lamp reaches it */ --lamp: rgba(224, 196, 128, 0.10); /* --- the paper --------------------------------------------------------- */ --stock: #e3dbc2; /* manila card stock: warm, but grey-olive, not cream */ --stock-hi: #efe9d7; /* the top sheet, directly under the lamp */ --stock-2: #cbc09f; /* the sheet underneath, and every tab edge */ --stock-3: #b3a888; /* deepest fold */ /* --- what is written on it --------------------------------------------- */ --ink: #191c18; /* ballpoint black with a green cast */ --ink-2: #4e5449; /* second-rank text */ --ink-3: #7d8175; /* captions, disabled, ruled lines */ /* --- the three official inks, each with exactly one job ---------------- */ --canary: #d9b23c; /* municipal form yellow: what is selected, now */ --canary-dp: #a8801d; --stamp: #7e2b26; /* oxblood rubber stamp: filed, refused, destroyed */ --verdi: #2e6155; /* municipal teal: checked, valid, approved */ /* rules printed on the form */ --rule: rgba(25, 28, 24, 0.22); --rule-soft: rgba(25, 28, 24, 0.11); --rule-firm: rgba(25, 28, 24, 0.55); /* paper fibre, laid over every sheet at low opacity */ --fiber: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='f'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23f)'/%3E%3C/svg%3E"); /* uneven rubber-stamp ink: large soft blobs, not fine noise */ --inkmask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='200'%3E%3Cfilter id='r'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.028' numOctaves='4' seed='11'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.4 0 0 0 -0.32'/%3E%3C/filter%3E%3Crect width='400' height='200' filter='url(%23r)'/%3E%3C/svg%3E"); /* a sheet of paper casts a real shadow onto the desk */ --lift-1: 0 1px 0 rgba(255,255,255,.28) inset, 0 10px 22px -8px rgba(0,0,0,.7); --lift-2: 0 1px 0 rgba(255,255,255,.34) inset, 0 26px 48px -18px rgba(0,0,0,.82); --sheet: clamp(360px, 27vw, 460px); --sheet-w: clamp(440px, 34vw, 580px); --gut-x: clamp(26px, 2.4vw, 40px); --gut-y: clamp(22px, 2.2vw, 34px); --ease: cubic-bezier(0.22, 0.61, 0.36, 1); --ease-out: cubic-bezier(0.16, 1, 0.3, 1); } * { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; overflow: hidden; background: var(--room); color: var(--ink); font-family: 'Plex Sans', system-ui, sans-serif; font-size: 15px; line-height: 1.55; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } /* --------------------------------------------------------------------------- The three voices. --------------------------------------------------------------------------- */ /* preprinted: everything the form arrived with */ .pp, .eyebrow, .head, label, .btn, .tab, .ctrl-label, .charname, .spawnname, .stagechip span { font-family: 'Archivo', system-ui, sans-serif; font-variation-settings: 'wdth' 112, 'wght' 700; text-transform: uppercase; letter-spacing: 0.07em; } /* typed: everything a person put on the form */ .data, .typed, input, textarea, .ctrl-val, .stepval, .charmeta, .charmoney, .counter, .stagechip em, .filetag { font-family: 'Plex Mono', ui-monospace, monospace; font-variation-settings: normal; text-transform: none; letter-spacing: 0.01em; font-variant-numeric: tabular-nums; } /* prose: the plain-English notes, the only voice allowed sentence case */ .sub, .hint, .spawnblurb, .switch { font-family: 'Plex Sans', system-ui, sans-serif; text-transform: none; letter-spacing: 0; } .eyebrow { font-size: 10px; font-variation-settings: 'wdth' 104, 'wght' 600; letter-spacing: 0.19em; color: var(--ink-3); } .data { font-size: 11.5px; color: var(--ink-2); } .rule { height: 1px; background: var(--rule); border: 0; } /* Focus is always the canary, always visible, and never subtle. */ :focus-visible { outline: 2px solid var(--canary-dp); outline-offset: 2px; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; } }