Skip to book
Tarva BXD · LumosIndex › Themes
1920 × 1080 · Landscape
Lumos Index › Themes the theming system

Themes · Overview

Two layers.

Every surface in the product is two layers composed — a light/dark mode times a color scheme — over one semantic token contract. Schemes aren't hand-painted: a per-scheme palette of primitives is run through the generator (build-themes.mjs) into the contract, the intent tier, and a shadcn bridge — emitting the CSS the components read and the Figma variables design works from, from one source.

The two-layer model · mode × scheme
Modenext-themes · data-theme
light dark

Light and dark, switched at runtime. This book renders Lumos in light; the same tokens carry the dark surface.

×composed per surface
Schemedata-color-scheme
lumos meadow safetrekr chronica-classic + more

The palette layer — swap it and the whole product re-skins. Fifteen schemes ship today; Lumos is one of them.

resolves to
Lumos · Light One rendered cell of the matrix — --bg-canvas, --fg-primary, --accent, the intent tier, all bound. Components stay scheme-agnostic.
The generator · palette → surface
1
Palette primitives
palette.ts

A per-scheme set of primitive ramps (Lumos ships ten, each ten steps) — brand, ink, neutral, and warm status ramps. The one hand-authored input.

2
Semantic + intent contract
_contract/*.ts

Every scheme binds the same alias contract — --bg-canvas … --accent — plus the 30-token intent tier and the shadcn bridge the components read.

3
Generated tokens
build-themes.mjs

One run emits tokens.generated.css for both modes and {scheme}.figma.json — code and Figma variables from the same source, never re-typed.

4
Rendered surface
@tarva/ui

Components read the bound tokens through the shadcn vocabulary. Build against the names, not the colors — the surface re-skins with no component edit.

The chapter

Lumos brand book slide: Themes
Rotate your phone for a larger view. Tap the slide to open it full size and zoom.
8.5 × 11 · Portrait