@import "tailwindcss"; /* Bloomberg-terminal aesthetic: dense, dark, monospace, keyboard-first. Tailwind v4 — design tokens live here in @theme (no tailwind.config.js). The booth runs on a fixed appliance display; we optimise for a dark room, glanceable status colour, and high information density over whitespace. Token vocabulary adopted from the "TRM" design system (Tracking & Race Management) — TOKENS ONLY: colours, type scale, spacing, radii, shadows. None of TRM's race-timing components are used. The existing `term-*` accents are aligned onto TRM's exact values so the whole booth UI inherits the TRM palette without renaming a single class. TRM's full vocabulary is also exposed as utilities (night-*, ink-*, paper-*, flag/amber/green/blue, the spacing/type/shadow scales) for new work. Offline appliance: NO webfont @import (no network at runtime). The primary face is Chakra Petch, SELF-HOSTED from public/fonts/chakra-petch (SIL OFL, license alongside the files) — latin subset only (covers en + sq ë/ç), the weights the UI actually uses (400/600/700 + 400 italic). Not a true monospace: it stays FIRST in --font-mono for the look, with the real mono stack behind it as fallback; .num/.tabular still request tabular figures. */ @font-face { font-family: "Chakra Petch"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/chakra-petch/chakra-petch-latin-400.woff2") format("woff2"); } @font-face { font-family: "Chakra Petch"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/chakra-petch/chakra-petch-latin-600.woff2") format("woff2"); } @font-face { font-family: "Chakra Petch"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/chakra-petch/chakra-petch-latin-700.woff2") format("woff2"); } @font-face { font-family: "Chakra Petch"; font-style: italic; font-weight: 400; font-display: swap; src: url("/fonts/chakra-petch/chakra-petch-latin-400-italic.woff2") format("woff2"); } @theme { /* ============================================================ TERMINAL ACCENTS — aligned onto TRM's exact values. These keep their `term-*` names (used across every screen), but now resolve to TRM colours so the palette is unified. ============================================================ */ /* Surfaces — TRM "night" (trackside dark) scale. */ --color-term-bg: #0b0d10; /* TRM --night */ --color-term-panel: #14171c; /* TRM --night-2 */ --color-term-panel-2: #1e222a; /* TRM --night-3 */ --color-term-border: #2a2f38; /* TRM --night-line */ --color-term-muted: #8a8a82; /* TRM --night-fg-3 / --ink-4 */ --color-term-text: #f2f2ee; /* TRM --night-fg */ /* Status accents — TRM semantic colours. */ --color-term-amber: #f2a516; /* TRM --amber (caution / accent / focus) */ --color-term-green: #2e8c4a; /* TRM --green (entry / ok / free) */ --color-term-red: #e8412b; /* TRM --flag (exit / fault / full) */ --color-term-cyan: #2563c8; /* TRM --blue (payment / info / live) */ /* ============================================================ TRM FULL VOCABULARY — exposed as Tailwind utilities for new work. ============================================================ */ /* Ink & paper (light surfaces — for any light-on-dark inversions). */ --color-paper: #fafaf7; --color-paper-2: #f2f2ee; --color-paper-3: #e8e8e2; --color-ink: #0e0e0c; --color-ink-2: #2a2a26; --color-ink-3: #5a5a53; --color-ink-4: #8a8a82; --color-ink-5: #b8b8b0; --color-ink-6: #dcdcd4; /* Night scale (the booth's working surfaces). */ --color-night: #0b0d10; --color-night-2: #14171c; --color-night-3: #1e222a; --color-night-line: #2a2f38; --color-night-fg: #f2f2ee; --color-night-fg-2: #b8b8b0; --color-night-fg-3: #8a8a82; /* Race accents + semantic. */ --color-flag: #e8412b; --color-flag-2: #c8331f; --color-flag-tint: #fbe3de; --color-amber: #f2a516; --color-amber-2: #c88500; --color-amber-tint: #fbefd0; --color-green: #2e8c4a; --color-green-2: #1f6a36; --color-green-tint: #ddefe2; --color-blue: #2563c8; --color-blue-2: #1a4fa8; --color-blue-tint: #dce6f8; --color-violet: #6b46c1; --color-magenta: #c9296f; --color-teal: #188c8a; --color-ok: #2e8c4a; --color-warn: #f2a516; --color-danger: #e8412b; --color-info: #2563c8; /* Data-viz categorical (8). */ --color-viz-1: #e8412b; --color-viz-2: #2563c8; --color-viz-3: #2e8c4a; --color-viz-4: #f2a516; --color-viz-5: #6b46c1; --color-viz-6: #188c8a; --color-viz-7: #c9296f; --color-viz-8: #5a5a53; /* ---------- TYPE — families ---------- */ /* Chakra Petch (self-hosted, see @font-face above) is the booth's primary face everywhere — it leads every stack so headings, body, and the `font-mono` chrome all render with it; the stacks behind it are the pre-2026-07-05 fallbacks for glyphs outside the latin subset. */ --font-mono: "Chakra Petch", "JetBrains Mono", "IBM Plex Mono", ui-monospace, "SFMono-Regular", "Menlo", "Consolas", monospace; --font-display: "Chakra Petch", "Helvetica Neue", Arial, sans-serif; --font-ui: "Chakra Petch", "Helvetica Neue", Arial, sans-serif; --font-body: "Chakra Petch", "Inter", "Helvetica Neue", Arial, sans-serif; /* ---------- TYPE — scale (TRM, optimised for data density) ---------- */ --text-overline: 11px; --text-micro: 12px; --text-small: 13px; --text-body: 15px; --text-lead: 17px; --text-h6: 14px; --text-h5: 16px; --text-h4: 20px; --text-h3: 26px; --text-h2: 34px; --text-h1: 48px; --text-display: 72px; --text-jumbo: 120px; /* ---------- SPACING (TRM 4px base) ---------- */ --spacing-s0: 0; --spacing-s1: 2px; --spacing-s2: 4px; --spacing-s3: 8px; --spacing-s4: 12px; --spacing-s5: 16px; --spacing-s6: 20px; --spacing-s7: 24px; --spacing-s8: 32px; --spacing-s9: 40px; --spacing-s10: 48px; --spacing-s11: 64px; --spacing-s12: 80px; --spacing-s13: 96px; /* ---------- RADIUS — TRM is square-edged ---------- */ --radius-term: 2px; /* existing alias, kept */ --radius-r0: 0; --radius-r1: 2px; --radius-r2: 4px; --radius-r3: 6px; --radius-r4: 10px; /* ---------- ELEVATION — TRM sharp "printed" offset shadows ---------- */ --shadow-term-1: 0 1px 0 0 #0e0e0c; --shadow-term-2: 2px 2px 0 0 #0e0e0c; --shadow-term-3: 4px 4px 0 0 #0e0e0c; --shadow-soft: 0 1px 2px rgba(14, 14, 12, 0.06), 0 4px 12px rgba(14, 14, 12, 0.04); --shadow-pop: 0 8px 24px rgba(14, 14, 12, 0.12); /* ---------- MOTION (TRM) ---------- */ --ease-snap: cubic-bezier(0.2, 0.8, 0.2, 1); --ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* ---------- COMPONENT TOKENS (TRM control heights, table rows) ---------- */ --control-h-sm: 28px; --control-h-md: 36px; --control-h-lg: 44px; --table-row-h: 36px; --table-row-h-dense: 28px; } html, body, #root { height: 100%; } /* Tell the engine the UI is dark so NATIVE controls — the opened to a WHITE option list. `.theme-light` flips it back. */ html { color-scheme: dark; } html.theme-light { color-scheme: light; } body { margin: 0; background: var(--color-term-bg); color: var(--color-term-text); font-family: var(--font-mono); font-size: 0.8125rem; line-height: 1.4; -webkit-font-smoothing: antialiased; /* Crisp text and no rubber-banding on the fixed appliance display. */ overscroll-behavior: none; } /* Tabular numerics everywhere — counts, money, clocks must not jitter. */ .num, .tabular { font-variant-numeric: tabular-nums; letter-spacing: -0.01em; } /* Terminal scrollbars — thin, dark, unobtrusive. */ * { scrollbar-width: thin; scrollbar-color: var(--color-term-border) transparent; } /* A visible keyboard-focus ring in the amber accent (keyboard-first UI). */ :focus-visible { outline: 1px solid var(--color-term-amber); outline-offset: 1px; } /* ============================================================ COMPONENT LAYER The TRM tokens are good, but every screen hand-rolled inputs and buttons as bare outlines on near-black panels, so a field, a card, and a button were visually indistinguishable. These classes give each control a real identity: - inputs read as RECESSED slots (lighter fill + inset shadow) - the primary button is FILLED (accent body, dark text) — the one obvious action; neutrals are filled grey, not bare outlines - explicit hover / active / focus / disabled states everywhere Use @apply so the classes compose with Tailwind utilities. ============================================================ */ @layer components { /* ---- Form fields: a recessed slot, clearly an input ---- */ .input, .select, .textarea { @apply w-full rounded-term border bg-term-bg px-2.5 text-term-text placeholder:text-term-muted; border-color: #3a414c; /* lighter than panel borders */ height: var(--control-h-md); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.45); transition: border-color 120ms var(--ease-snap), box-shadow 120ms var(--ease-snap); } .textarea { height: auto; @apply py-2 leading-snug; } .input::placeholder, .textarea::placeholder { @apply text-term-muted; } .input:hover, .select:hover, .textarea:hover { border-color: #4a525f; } .input:focus, .select:focus, .textarea:focus { outline: none; border-color: var(--color-term-amber); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.45), 0 0 0 1px var(--color-term-amber); } .input:disabled, .select:disabled, .textarea:disabled { @apply cursor-not-allowed opacity-50; } /* Native