Seven themes. One brand token.
Each preset sets only the brand: --fg-brand, its hover, its two measured inks, the tint and the focus ring. Everything else (zinc neutrals, status colors, spacing, type) is shared.
Default. Violet, playful.
--theme=entrepta#7C6BFFCherry red. Bold and confident.
--theme=blossom#CC2E36Warm orange. Editorial and energetic.
--theme=marmalade#FF8213Warm pink. Soft and expressive.
--theme=julia#E85A8AForest green. Calm and grounded.
--theme=ivy#35A365Deep blue. Technical and steady.
--theme=bosco#2563EBMonochrome and flat. White on dark, black on light.
--theme=taylor#FAFAFAEach preset is one block of CSS variables per mode. The two inks are set per theme because no single one reads on all seven brands. Every pair clears WCAG AA in both modes.
taylor has no hue. Its brand is white on dark and black on light, so there is no brand glow: a card and an overlay lose the light in their top-left corner. That light is one number, --finish-glow, from 0 to 1. Any theme can set it, and a project can set it once for all of them. The charts keep their color. White has nothing to turn, so --chart-from names the hue they start from. In taylor the brand ink is the primary ink, so a state is never shown by brand color alone.
With --themes=all, each theme lives under data-theme on <html>, and the one you picked is the default. Add the theme-switcher component to let people choose.
Every theme works in both dark and light mode. Dark is the default (no attribute needed). Light mode is opted into by setting data-mode="light" on <html>. Surface, foreground and border tokens flip; the brand color shifts slightly darker to keep AA contrast on white. Dark surfaces (the CodeBlock terminal variant) stay dark in both modes by carrying data-surface="dark" internally.
To let people toggle it, add the mode-toggle component. It stores the choice, and its ModeScript sets the attribute before the page paints.
A switch lands all at once. For its length, the hooks hold every transition, so no component eases into the new colors on its own clock. Where the browser has view transitions, the old and new page crossfade as one picture. With reduced motion, the switch is instant. If you set the attributes yourself, wrap the change in transitionTheme.