Skip to content
Guide

Theme it

Pick the pack, re-value the token contract in one artifact, and check the contrast the components actually paint.

Start from the defaults

“No skin” shows the neutral library baseline. Your application owns its theme and can override only the values that need to change. Refined and the other named presets remain optional starting points.

What you should see now

Components and portals render without a skin config or provider. Add your brand through application CSS.

Paint the document, not just the body

Apply bg-background to your document’s <html> element so overscroll and viewport gaps use the active theme. The Next.js starter includes this root background. Keep the skin and color-mode attributes on the same theme boundary.

With a named skin on <html data-skin>, SkinProvider applies the config's motion and colorScheme to the root. A skin that declares a fixed colorScheme holds the page in that mode while it is mounted, whatever the theme toggle asks for. A skin scoped to a wrapper spreads skinScopeAttributes(skin) on that element and follows the page mode. Create a skin shows both installs.

Keep frequent feedback immediate

Hover colors and hover-following highlights update immediately, as do desktop sidebar toggles. Press feedback, selection indicators, and popup entrances retain their motion tokens and respect reduced-motion preferences.

Group neighboring tooltips in one TooltipProvider: the first hover waits 500 ms, then neighboring tooltips open immediately within Base UI’s 400 ms grouping window. Use the provider’s delay and timeout props when your interaction needs different timing.

One artifact owns the theme

A theme is one file — <short-name>.control-ui-theme.json, format control-ui-theme/v1 — with tokens split into shared, light, and dark. Color-valued tokens go in light and dark; everything else in shared. A token left out inherits the base skin, so the artifact composes onto the pack instead of forking it.

Edit it live in the theme editor, then copy the CSS variables it writes — the toolbar's palette button opens it on any page.
Or write it with your agent from a brief: the setup prompt carries the contract and the token rules.
Each app consumes the artifact as one derived CSS file, imported after the pack's own theme so source order decides.

Contrast is part of the theme

Contrast is a property of the theme, not a follow-up audit. Normal and small text clears 4.5:1 after alpha compositing in both modes; focus indicators and control boundaries clear 3:1.

The accessibility page checks the canonical colors plus what the components actually paint — popups, badges, active tabs — and the same checks run from the CLI, on every commit, over the baseline and every preset mode.

Go deeper

See every ramp, role, type rung, surface, and elevation of the active skin on Foundations.
Re-valuing tokens is not enough? Create a skin — own a full pack of three files, then reach the component knobs beneath.
One component off? The knob cascade in the architecture guide names the smallest surface that fixes it.