Skip to main content
The simplest integration, and the one every other guide is built on. It works with no framework, and equally with shadcn/ui, Angular Material or Skeleton — anything that styles through CSS custom properties. Theme integration required: any pair whose library is Plain CSS (or Tailwind, Chakra UI, shadcn/ui, Angular Material, Skeleton — they all build tokens.css).
Livry first, your own stylesheets second. Custom properties must be defined before the rules that reference them are evaluated, or the first paint uses your fallbacks and then flashes.
The file declares everything on :root:

2. Reference, never copy

Always write the fallback. The value after the comma is what the browser uses if the property is not defined — because the stylesheet failed to load, or because that token does not exist in this Theme yet. Use your Theme’s own value, so the unbranded state is your default brand rather than nothing.

3. Switch brands

That is the whole brand-switching mechanism. No re-render, because nothing in your app holds a value — the browser recomputes every var() when the stylesheet changes. Pass "-" (or nothing) for the Theme with no Variant applied — your own default styling.

Avoiding the flash on switch

Swapping an href makes the browser fetch before it repaints, so there is a brief moment with the old brand. If that matters, preload the next one:
In a multi-tenant app you usually know the brand before the page loads — render the right <link> server-side and never switch at all.

Dark mode

Livry has no mode concept. Two approaches, both yours rather than Livry’s:
The first is simpler and keeps one Variant per brand. The second gives a brand genuinely independent light and dark palettes.

What is not in the file

tokens.css is a lossy projection. CSS has no token types, no groups and no descriptions, and some DTCG values have no CSS spelling at all. A token that cannot be written becomes a comment naming its path:
So you can diff the stylesheet against your token list and see exactly what is missing. If you need the full fidelity, read tokens.json instead — see What gets served.