Color.
A little color. A clear purpose.
Semantic color names describe a role, not a particular shade. A border stays a border when the appearance changes.
Stops with a purpose.
39 palettes: 11 neutral bases and 28 color families. Separate light and dark ramps, plus black and white alpha overlays.
Workspace settings
Manage your preferences.
Change the brand accent above: Delete stays destructive, Approve stays positive, and feedback retains its own roles. Personalities are configurations of the same semantic system.
Twelve stops. More possibilities.
Explore cool, warm, and tinted neutrals, the full color family set, and transparent black/white overlays. Choose a family and inspect any stop.
--dixy-color-neutral-9oklch(0.49 0 0)light paletteOverlays that blend with the surface.
Black and white alpha scales have 12 stops from 5% to 95% opacity. Modal scrims use color.background.overlay; subtle, strong, and inverse roles cover quieter washes and white overlays. Contrast depends on the surface underneath.
Use meaning in your interface.
--dixy-color-blue-9--dixy-color-background-action-primary--dixy-button-primary-backgroundChoose a role for backgrounds, text, icons, borders, and interactions. Override semantic variables at the Theme boundary; component aliases and portaled dialogs resolve that local theme.
| Semantic token | light mapping |
|---|---|
color.background.overlay | black.a8 |
color.background.overlay.subtle | black.a4 |
color.background.overlay.strong | black.a10 |
color.background.overlay.inverse | white.a8 |
color.background.canvas | base.1 |
color.background.surface | base.2 |
color.background.surface.raised | white |
color.background.surface.sunken | base.3 |
color.background.subtle | base.3 |
color.background.inverse | base.12 |
color.background.selected | brand.5 |
color.background.disabled | base.3 |
color.background.action.primary | brand.9 |
color.background.action.primary.hover | brand.10 |
color.background.action.primary.pressed | brand.pressed |
color.background.action.primary.subtle | brand.3 |
color.background.action.primary.subtle.hover | brand.4 |
color.background.action.primary.subtle.pressed | brand.5 |
color.background.action.secondary | base.9 |
color.background.action.secondary.hover | base.10 |
color.background.action.secondary.pressed | base.pressed |
color.background.action.secondary.subtle | base.3 |
color.background.action.secondary.subtle.hover | base.4 |
color.background.action.secondary.subtle.pressed | base.5 |
color.background.action.destructive | red.9 |
color.background.action.destructive.hover | red.10 |
color.background.action.destructive.pressed | red.pressed |
color.background.action.destructive.subtle | red.3 |
color.background.action.destructive.subtle.hover | red.4 |
color.background.action.destructive.subtle.pressed | red.5 |
color.background.action.success | green.9 |
color.background.action.success.hover | green.10 |
color.background.action.success.pressed | green.pressed |
color.background.action.success.subtle | green.3 |
color.background.action.success.subtle.hover | green.4 |
color.background.action.success.subtle.pressed | green.5 |
color.background.success | green.3 |
color.background.success.bold | green.9 |
color.background.danger | red.3 |
color.background.danger.bold | red.9 |
color.background.warning | amber.3 |
color.background.warning.bold | amber.9 |
color.background.information | blue.3 |
color.background.information.bold | blue.9 |
color.background.discovery | purple.3 |
color.background.discovery.bold | purple.9 |
Pairs, states, and contrast.
Solid actions use a dedicated foreground shared across default, hover, and pressed backgrounds. Amber uses a dark foreground in light mode. Validation errors use danger text and border roles, independently of destructive actions.
- Normal text pairs are tested at 4.5:1; focus indicators and interactive boundaries at 3:1.
- Subtle borders are decorative separators, not the sole boundary of a control.
- Tertiary text keeps a readable foreground. Disabled text and icons are reserved for unavailable controls.
- Custom seeds reduce chroma to fit sRGB and reject unsafe action pairs. These checks do not establish whole-page accessibility.
import "@dixy-ui/react/styles.css";
import { Theme, Button } from "@dixy-ui/react";
export function App() {
return (
<Theme appearance="light" accentColor="purple" neutralColor="neutral" radius="md" density="default" motion="system" dir="ltr">
<Button>Save changes</Button>
<Button color="danger">Delete</Button>
<Button color="success">Approve</Button>
</Theme>
);
}Plain CSS or Tailwind v4.
The token package works without React or Tailwind. The optional Tailwind entry maps utilities to the same semantic variables with @theme inline.
@import "tailwindcss";
@import "@dixy-ui/tokens/tailwind.css";
/* Plain CSS: import @dixy-ui/tokens/color.css instead. */
.workspace {
background: var(--dixy-color-background-canvas);
color: var(--dixy-color-text-primary);
}<div data-appearance="dark" data-accent="purple" data-neutral="stone">
<button class="bg-dixy-action-primary text-dixy-on-action-primary hover:bg-dixy-action-primary-hover active:bg-dixy-action-primary-pressed">
Save changes
</button>
</div>Make a custom brand.
import { createColorPalette, colorThemeVariables } from "@dixy-ui/tokens";
import { Theme } from "@dixy-ui/react";
const palette = createColorPalette([0.54, 0.18, 260]);
export function CustomTheme() {
return (
<Theme appearance="dark" style={colorThemeVariables(palette, "dark")}>
Your interface
</Theme>
);
}Blue is the default library accent. Purple is Dixy’s documentation identity. Choose the neutral base independently with neutralColor="stone", for example. Earlier --dixy-accent and surface variables remain read aliases; new customization should target semantic names.
Design references: Tailwind palette families, Radix scale roles, Atlassian semantics, Tailwind theme variables, and CSS Color 4.