Skip to Content
ThemingComposing Palettes

Composing Palettes

A SolarUI palette is built from six roles:

RoleToken groupDefault color
Neutral surfaces, borders, textdefaultgray
Primary actionsbrandorange
Destructive / invaliderrorred
Confirmationsuccessgreen
Warningwarningamber
Informationalinfosky

The most impactful choice is the gray family — it sets the visual temperature of the entire interface. The second most impactful is the brand color — it defines the accent that drives attention.


Choosing the right gray

Radix provides six gray families, each with a subtle hue cast designed to complement specific brand colors:

GrayHue castBest paired with
GrayNeutralAny brand color
MauvePurple/pinkTomato, Red, Ruby, Crimson, Pink, Plum, Purple, Violet
SlateBlueIndigo, Blue, Sky, Cyan
SageGreen/tealMint, Teal
OliveYellow/greenGrass, Green
SandYellow/warmYellow, Amber, Orange ← SolarUI default
Gray
Mauve
Slate
Sage
Olive
Sand

When in doubt, Gray works universally. Use a tinted gray only when you want the neutral surfaces to feel warm or cool to match the brand color’s temperature.


Functional assignment of the 12 steps

Once you have chosen your gray and brand, apply the steps consistently:

default (gray) — neutral role

StepsPurpose
1Page / app background
2Subtle surface (card, panel, sidebar)
3–5Interactive component backgrounds (default / hover / active)
6–8Borders (subtle / component / strong)
9(rarely used for solid fills on neutral)
11Secondary / muted text
12Primary text, headings

brand (orange) — accent role

StepsPurpose
3Tinted background (field with brand checkbox, checked pill)
6Tinted border (has-checked border)
9Solid button / badge fill
10Hover on solid button
11Brand-colored text (links, active nav items)
1Text on solid brand background

error / success / warning / info — semantic roles

StepsPurpose
3Tinted alert / toast background
7–8Border around invalid field, focus ring
9Solid badge / tag fill
11Inline error / success text
1Text on solid semantic badge

SolarUI default palette

The palette shipped with SolarUI:

Gray
Orange
Red
Green
Amber
Sky
/* globals.css */ @import "@radix-ui/colors/gray.css"; @import "@radix-ui/colors/gray-dark.css"; @import "@radix-ui/colors/orange.css"; @import "@radix-ui/colors/orange-dark.css"; @import "@radix-ui/colors/red.css"; @import "@radix-ui/colors/red-dark.css"; @import "@radix-ui/colors/green.css"; @import "@radix-ui/colors/green-dark.css"; @import "@radix-ui/colors/amber.css"; @import "@radix-ui/colors/amber-dark.css"; @import "@radix-ui/colors/sky.css"; @import "@radix-ui/colors/sky-dark.css";

Swapping to a different brand

To change the brand to violet and the gray to mauve:

/* globals.css */ @import "@radix-ui/colors/mauve.css"; @import "@radix-ui/colors/mauve-dark.css"; @import "@radix-ui/colors/violet.css"; @import "@radix-ui/colors/violet-dark.css"; /* keep red, green, amber, sky for error/success/warning/info */ @theme { /* change default → mauve, brand → violet */ --color-default-1: var(--mauve-1); --color-default-2: var(--mauve-2); --color-default-3: var(--mauve-3); --color-default-4: var(--mauve-4); --color-default-5: var(--mauve-5); --color-default-6: var(--mauve-6); --color-default-7: var(--mauve-7); --color-default-8: var(--mauve-8); --color-default-9: var(--mauve-9); --color-default-10: var(--mauve-10); --color-default-11: var(--mauve-11); --color-default-12: var(--mauve-12); --color-brand-1: var(--violet-1); /* … through --color-brand-12: var(--violet-12) */ }

No component classes need to change — the tokens do the translation.


Overlays and alpha colors

Every Radix color family also ships an alpha variant (gray-alpha.css) where each step is a transparent version of the color. These are useful for overlays, glass effects, and layering UI elements without hard-coded opacity values:

@import "@radix-ui/colors/gray-alpha.css"; /* exposes --gray-a1 … --gray-a12 */

Alpha colors are not part of the SolarUI token system by default, but you can reference them directly as var(--gray-a6) in arbitrary Tailwind values or component styles when you need transparent surfaces.

Last updated on