src/styles/theme.css as a CSS custom property. Components never hardcode a color hex, a pixel value, or a font size directly. Instead they reference a token: var(--color-black), var(--space-md), var(--radius-pill). This single-source-of-truth approach means restyling a value like the primary border radius updates every component at once, with zero drift between copies.
Color tokens
The palette is monochromatic — five steps from white to black with one muted gray for secondary text:
Four semantic aliases map the raw tokens to their intended roles:
Typography scale
Roboto is self-hosted as a single WOFF2 file (Roboto-latin.woff2) that covers both weight 400 and weight 500 — only these two weights are used across the entire site. font-display: swap is set to avoid invisible text during load. The display font Coiny is specified for the .logo-wordmark element exclusively and must never appear on headings, hero text, or body copy.
Headings (H1–H4)
Body paragraphs (P1–P3)
UI / Utility
Button typography (shared)
Spacing scale
Border radius
Border tokens
Button styles
All buttons share uppercase text,font-weight: 500, and letter-spacing: 0.05em — these are never overridden.
An optional
.btn-sm modifier reduces the size for compact contexts.
Utility classes
Utility classes are defined intheme.css and carry the type system site-wide. Scoped component CSS carries layout only.
Typography utilities
Container utilities
Button utilities
Miscellaneous utilities
The hybrid model: utility classes + scoped CSS
Utility classes carry the type system; scoped CSS carries layout. Both apply to the same element when needed:text-h2 class sets size, weight, line-height, and letter-spacing. The tb-h2 class adds only the margin that is specific to this layout. This prevents the type scale from drifting when tokens are updated, because every heading across the site references the same .text-h* definition.
.text-* utilities set type only — color comes from .text-muted or the inherited body default. Margins are never baked into utility classes; always add them in scoped CSS.Icons
Borrissol uses Lucide Icons exclusively. All icons are outline-style with a stroke width of1.5px and use var(--icon-color) (aliased to var(--color-black)) for their color.
Icons are loaded via CDN and initialized with
lucide.createIcons():
Fonts: self-hosted Roboto
Roboto is self-hosted as a single WOFF2 file (Roboto-latin.woff2) — no Google Fonts CDN request at runtime. A single @font-face block covers both weights using a range declaration. Requesting any other weight (300, 700, etc.) would introduce unused bytes and a render-blocking request.
.logo-wordmark class on the brand name element in the Navbar and must never appear anywhere else in the UI.