Colors
Semantic color roles, and when to use each.
Appica UI's palette is organized by role, not by hue. Instead of blue-500,
you use primary or info-emphasis. This keeps components meaningful and lets a
single token override retheme the whole system. Every color is defined in
oklch and is overridable - see Theming.
Each color is exposed as a Tailwind utility (bg-*, text-*, border-*) and as
a raw CSS variable named after the role - var(--primary), var(--foreground),
and so on. See Theming.
Base colors
The grayscale foundation of every layout: backgrounds, text, and borders. Each family is a scale from subtle to intense.
Foreground (text & icons)
Background (surfaces)
Border
Accent palettes
Six semantic accents share an identical scale, so they're interchangeable by
intent. primary and secondary carry your brand; error, success,
warning, and info carry status. primary is the one exception: it has no
-emphasis or -intense step, and its default values are achromatic. See
The primary scale.
For example, an info alert pairs bg-info-subtle (surface), bg-info-soft (border), with text-info-foreground;
a solid primary button pairs bg-primary with text-primary-foreground.
The primary scale
Out of the box the primary family is achromatic: every token is a shade of the neutral base rather than a color, which is why the default primary inverts with the theme, near-black on white in light and white on near-black in dark.
Give primary a color and it switches to a different recipe, not just different
values. Both are shade picks out of an 11-stop palette (50 through 950), written
below as light / dark:
The row that matters is subtle and soft. In the achromatic recipe they are
solid neutral stops, and they need a separate dark value. In the chromatic
recipe they are alpha tints of the 500, identical in both themes, because a
translucent fill composites over whatever surface it lands on.
That difference is why no formula turns the default primary into a branded one: the two recipes don't hold the same kind of value in the same slot. The palette is the unit of customization, not the individual token. Supply a color, get eleven stops, and the recipe picks out of those. See Custom brand colors.
Focus rings
Focus styling has its own token set so the ring can differ from borders. Each maps
to a matching role, and components apply them automatically on :focus-visible -
see Accessibility.
Overriding the palette
Any token can be redefined after the stylesheet import, separately per theme:
These are plain custom properties, so any CSS color format works: hex, rgb(),
hsl(), a named color. The library writes oklch because its
lightness is perceptually even across hues, which is what keeps a palette's steps
evenly spaced and its tints predictable. Nothing reads the format back, so you can
paste whatever your brand guide gives you:
The one thing to carry over is opacity. The *-subtle and *-soft steps are
translucent by design, so they composite over whatever surface they sit on. Replace
one with an opaque color and it stops adapting: keep the alpha, in whichever format
you're writing (#c084fc1a, rgb(168 85 247 / 10%)).
To retheme a whole accent family from a single brand color rather than token by token, see Custom brand colors.
Head to Theming for the raw-vs-theme token model and the non-color tokens (radius, shadows, typography).