Skip to main content
Every visual value in Borrissol — color, font size, spacing, border radius, shadow — lives in 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.
Rule #1 — The DS is the single source of truth. Never hardcode any color, spacing, font size, or border value. Always reference a token from theme.css. If a value isn’t tokenized yet, add it to theme.css first, then use it.

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 in theme.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:
The 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 of 1.5px and use var(--icon-color) (aliased to var(--color-black)) for their color. Icons are loaded via CDN and initialized with lucide.createIcons():
Do not use any icon library other than Lucide. Do not change the stroke width from 1.5px. Do not use filled icon variants.

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.
The Coiny display font is specified for the .logo-wordmark class on the brand name element in the Navbar and must never appear anywhere else in the UI.