Colors
Note: These docs describe the colors system in the Pro edition (1.8.0+). The Community edition uses an older setup — scroll down to the “Legacy docs” accordions for details on earlier versions.
The theming variables are based on the shadcn/ui theming docs.
We offer both light and dark themes.
shadcn colors
The shadcn colors collection is the main thing you’ll want to customize. It contains the 27 semantic tokens that shadcn/ui components reference — background, foreground, primary, primary foreground, secondary, accent, muted, destructive, border, input, ring, and so on.
It’s configured with two modes: shadcn (light) and shadcn-dark (dark), so every component automatically picks up the right value for the active mode.
If you open the collection, you’ll see that each token points at a value from one of the other collections — it’s a mix of:
theme-neutrals/*(from theneutralscollection) — used for backgrounds, foregrounds, secondary, muted, borders, and similar.shadcn/*(from theshadcn theme colorscollection) — used forprimaryandaccent. We use the 5-step shadcn scale here specifically for the primary button, so the kit stays compliant with how theming works in shadcn/ui create — picking a primary color there generates a 5-step scale, and our Figma variables map one-to-one to that. The same 5-step scale is also used for the chart colors.tw-raw/*(from theraw tailwind colorscollection) — used directly for a few tokens, notablydestructive(tw-raw/red/600in light,tw-raw/red/400in dark) andbackground(tw-raw/white/tw-raw/neutral/950).
If you want to reskin the kit, this is where to start:
- Change
primaryto retint buttons, checkboxes, focus rings, and other accented elements in one step. - Change
accentto brand your menus, links, and subtle highlights. - Change
destructiveto match your brand’s error/danger color.
To flip the neutral tone of the whole kit (e.g. switch from neutral to stone, slate, zinc, etc.), you don’t touch shadcn colors at all — instead, remap the values inside the neutrals collection. Everything in shadcn colors that references theme-neutrals/* will update automatically.
Raw colors (source palettes)
Two collections act as the source palette for everything above:
raw tailwind colors— the full Tailwind 4.2 palette on the standard 11-step scale (50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950). Published by default — we keep this one published because many people use the kit for wireframing and want direct access to the full Tailwind palette without extra setup. Also handy when you’re building custom brand palettes.On the flip side, if you’re using the kit as the foundation for a tightly-scoped design system, it often makes sense to do the opposite: unpublish
raw tailwind colorsso designers can’t pull arbitrary Tailwind shades into their work. That restricts the usable palette toshadcn colors+neutrals+chart colors, which keeps the system disciplined.shadcn theme colors (unpublished)— the tighter 5-step scale that shadcn/ui uses for its own theme tokens. As the name suggests, this one is unpublished by default: it’s meant as reference material that feeds intoshadcn colors, not something you apply directly to layers. If you want to reference it from your own variables, you can publish it manually.
Note: Figma does not support OKLCH, so we are using hex-based variables.
Default usage
When you download the kit, here’s how it’s set up out of the box:
neutralsis mapped totw-raw/neutral.shadcn colorsreferencesneutralsfor foreground/secondary/muted/border tokens, usesshadcn/*values forprimaryandaccent, and points directly attw-rawforbackgroundanddestructive.- Both light (
shadcn) and dark (shadcn-dark) modes are fully configured. - All components consume only the
shadcn colorstokens, so they pick up any changes you make to that collection automatically.
This default setup is a good starting point — you can use it as-is, or follow the steps in “How we use the colors” below to swap in your own brand palette.
How we use the colors
Raw colors are never applied directly to components. Instead, they flow through a chain of collections so you can reskin the entire kit without touching individual layers:
- Raw palettes (
raw tailwind colors+shadcn theme colors) — the source values, unpublished. - Supporting collections (
neutrals,chart colors,alpha) — pull specific values from the raw palettes to form the kit’s working palette. shadcn colors— the 27 semantic tokens reference values from the supporting collections (and occasionally directly from raw colors). This is the layer components actually consume.- Components — every component uses only the shadcn colors tokens, so they automatically pick up theme changes.
How to change the primary button color
The primary button uses the primary token in the shadcn colors collection, which points at a 5-step scale from shadcn theme colors.
- Open the
shadcn colorscollection and find theprimarytoken (andprimary foreground). - For both
shadcn(light) andshadcn-dark(dark) modes, pointprimaryat a different scale — for example,shadcn/blue/4in light andshadcn/blue/5in dark. - If
primary foregroundneeds to contrast the new color, update it too (commonlytw-raw/whiteor a light neutral).
All primary buttons, checkboxes, radios, and focus rings update at once. If none of the built-in shadcn/* scales match your brand, add a new 5-step scale to the shadcn theme colors collection and point primary at it.
How to change the kit’s neutrals
The kit’s neutral tone (background, foreground, muted, borders, etc.) is driven by the neutrals collection, which contains the 11 theme-neutrals/* values that shadcn colors references.
- Open the
neutralscollection. - Remap each
theme-neutrals/*value to a different Tailwind neutral scale — for example, point them attw-raw/stone/*,tw-raw/slate/*,tw-raw/zinc/*, ortw-raw/gray/*. - Do this for both
shadcnandshadcn-darkmodes if you want both themes retinted.
You don’t need to touch shadcn colors at all — every token that references theme-neutrals/* updates automatically.
How to change the chart colors
The chart colors collection holds 5 values used by chart components. Like primary, they reference the 5-step shadcn theme colors scale so charts stay consistent with shadcn/ui’s charting conventions.
- Open the
chart colorscollection. - For each chart slot (
chart-1throughchart-5), point the value at a different 5-step scale inshadcn theme colors— for example mixshadcn/blue,shadcn/green,shadcn/orange,shadcn/purple,shadcn/redto get a multi-hue chart palette. - Update both
shadcnandshadcn-darkmodes so charts stay readable in both themes.
Every chart component pulls from this collection, so updating it here is enough — no component-level edits needed.
Colors and the Design to Code plugin
The Design to Code plugin generates Tailwind v4 / shadcn-compatible CSS directly from the kit’s variable collections. It’s what lets you round-trip a Figma theme into a working globals.css.
Here’s what the plugin actually does with each collection:
shadcn colors— this is the collection the plugin exports as your theme. It reads the collection (matched by name containing “shadcn” and “color”), walks each variable, resolves aliases all the way down to a concrete color value, and outputs standard shadcn CSS variable names:--background,--foreground,--primary,--primary-foreground,--card,--popover,--secondary,--muted,--accent,--destructive,--border,--input,--ring, and the full--sidebar-*set.chart colors— exported as--chart-1through--chart-5, following shadcn/ui’s flat chart naming convention.neutralsandalpha— these collections are excluded from direct export. The plugin skips them because they’re meant to feed intoshadcn colorsthrough variable aliases. As long as ashadcn colorstoken ultimately resolves to a neutral or alpha value, the plugin picks it up automatically when it resolves the alias chain.raw tailwind colorsandshadcn theme colors— the plugin doesn’t export these directly either. They’re source palettes; their values only end up in the output if ashadcn colorstoken references them.
Dark mode is handled via Figma variable modes. Any mode whose name ends in -dark (e.g. shadcn-dark) is emitted as a .dark { … } block. The plugin does this automatically — you don’t need to run it twice.
Alpha colors work through the kit’s two-fill pattern (see the Alpha colors section below). The plugin resolves alpha values through the alias chain, so as long as your layer uses the alpha variables the kit provides, the exported CSS matches shadcn’s conventions.
What this means for how you build
- Bind layers to
shadcn colorstokens wherever possible. If every component in your design references the semantic tokens (via aliases down the chain), the plugin produces output that drops straight into a shadcn/ui codebase with zero manual edits. - Avoid bypassing the chain. If you paint a component directly with a
tw-raw/*value, it’ll still work visually, but it won’t show up in the exported theme — the plugin only exports what’s inshadcn colorsandchart colors. - Customize inside
shadcn colorsandneutrals, then export. A typical workflow: remapneutrals(to switch the kit’s neutral tone), updateshadcn colorstokens for brand/primary/accent, run the plugin, and paste the resulting CSS into your shadcn project. Both light and dark modes come through in one export.
How to switch between light and dark mode in Figma
Because the kit uses Figma variable modes for theming, you switch between light (shadcn) and dark (shadcn-dark) by changing the mode — not by editing any colors. You can do this at multiple levels:
- Page level — change the variable mode of the current page to flip the whole page between modes.
- Frame level — override the mode on an individual frame. This is useful for showing the same design in both themes side by side.
Use the Apply variable mode control in Figma’s right-hand sidebar to do this.
Variable tips
Backgrounds
- Use background (standard color: white) for backgrounds
- Use muted for muted backgrounds
- The secondary background is used for secondary buttons, if you want secondary buttons to look good on muted backgrounds they will likely need to be a bit darker
Foreground
In general, use foreground for text and icons.
Use Foreground Muted for muted text.
Accent
Accent is muted by default in shadcn, but in our kit is a bright color, to be able to support accented variants.
Border and input variables
Both “border” and “input” refer to borders.
Styling/component tips
This kit is based on the Vega style of shadcn. You can see the different shadcn/ui styles via shadcn/ui create.
You can simulate the other shadcn/ui component styles or make your own by changing the variables in our kit.
If you change the variables, you can simulate the other styles: Nova, Maia, Lyra, Mira and Luma.
Here’s some examples:
- Lyra has square corners: can be simulated by setting all border radii to 0 (excluding infinite),
- Mira and Lyra are very condensed styles. You can change the overall spacing in the spacing collection to make it tighter. All components are built with auto layout and will scale along.
- If you go for this path, your elements will change size. You might have to refresh the Autodocs based documentation.
Do note that some aspects are handled on the component level:
- Changing inputs to rounded: we offer both rounded and non-rounded inputs as Figma component variants
- Changing accent color to a bright or muted color: we offer both accented and non-accented menu options as Figma component variants
If you don’t desire these variants to be used, you can delete them in the process of creating your own design system.
Alpha colors
Use alpha colors to simulate opacity or blend modes. Figma does not provide a way to set opacity on a variable. As a workaround, we sometimes use 2 fills, generally on fills and strokes. A layer would then, for example, have a fill at 85% white and a general destructive color.
There are 2 variants: switch and non-switch.
- Switch automatically flips white to black and black to white in dark mode. Use it for overlays and highlights that should always read against the current background.
- Non-switch keeps the color you define, regardless of mode. This is useful for UI situations where you don’t actually want the colors to reverse — like shadows on dialogs.
In earlier versions (1.0 through 1.7.0), the kit included all Tailwind 4 colors as Figma variables inside a single “Raw colors” collection.
We tagged the colors in use visually on the colors page.
If you don’t need them, you can safely delete the colors not in use.
We added several variables on top of shadcn/ui’s theming to allow designers to have more control in Figma.
- Within shadcn’s code, the color mix CSS function is often used to mix a variable (or rather CSS custom property) with a color, often white or black with a specific opacity percentage. To replicate this, use the alpha variables.
- Within other parts of the code, color variables are hardcoded instead of using a theming layer. This forced us to come up with new variables for these cases. You will see many more border and background variants than exist in the official CSS, because of combinations made in shadcn docs code that need to be translated to Figma’s variable modes.
The variables that are unofficial are marked as “unofficial”.
If you inspect the kit’s variable system with a kit version from 1.5.0 on, you will see that we introduced a “brand colors” collection that includes “brand-neutrals” and “brand-shades”.
- The “brand-neutrals” collection is tied to the “semantic colors” collection automatically. You can use this to quickly change the kit to use a default Tailwind shade like slate or stone; or use it to tint your UI to your own brand’s “shades”.
- The variables in the “brand-shades” collection are unused by default on purpose, in order to make a conscious choice on which elements you would like to appear branded
We recommend, when creating custom color palettes, to first add your custom palette to “raw colors” as a group with a name (e.g. “brand-turquoise”).
You can decide to keep the Tailwind colors around in that group or remove the ones you don’t need.
Now reference the custom color palette in the brand colors collection in the “brand-neutrals” or “brand-shades” collection.
Tip: You can use a tool like Supa Pallete to generate a color palette based on your brand.
If you go into the kit and customize the “primary” shadcn/ui variable, you’ll see that your color choice propagates across a number of components. If you make your primary button red, you will also see that primary badges, checkboxes and radio buttons become red.
Depending on your brand’s color and design aesthetic, you might want to customize the colors on the component level. For example, you’d maybe prefer to have a dark primary button with the 800 shade of your bramd while having a slightly lighter badge with the 700 shade.
Maybe you have a red or orange main brand color and you’d like to not propagate that choice to form controls.
In all of these cases, it’s a good idea to start a component layer where you customize the components’ colors on a case-by-case basis.
In this section, we’d like to document the “blessed” way to customize component colors.
Add a collection called “components”. Then create a group for each component. You can use subgroups for the component states.
Generally the structure would look like something like this:
- components
- alert
- success
- background
- foreground
- error
- background
- foreground
- success
- alert
Not every brand color has a palette. Sometimes a brand color is distinct, and it doesn’t necessarily have a full palette with 11 Tailwind-like shades.
In this case, use the “brand-combinations” group of variables inside of the “brand colors” collection.
In this collection, you can find 3 default combinations of foreground and background colors.
Use this place to store specific color combinations.
For Starbucks as a brand, you’d add Starbucks green in “1/brand” and the common white foreground color in “1/ brand foreground”.
But maybe you’d also like to document other color combinations: use slot 2, 3, or extend to more combinations.
As a convention, shadcn/ui omits the word background from variable names.
The reason we don’t use specifically named variables (e.g. name the variable “Starbucks green”) is to be able to programatically access the variants, specifically in a multi-brand context. What we recommend when working with named colors is to first add these to a collection that sits “below the line” (below the --- separator). The collections below the line are not meant to be published or used programatically.
Foreground
In general, use foreground for text and icons.
We prefer to use foreground alt (Unofficial) for body text. This is not part of the shadcn/ui official variables but highly recommended design-wise (shadcn does the same in their docs, just not with an “official” variable)
Use foreground muted for muted text.
Backgrounds
A shadcn convention is to not mention that something is a background. So for example “Primary” is actually “Primary background”. We follow this convention.
Accents map to darkness levels where 1 = 100, 2 = 200 etc, with the exception of Accent 0 which maps to neutral-50 in light mode by default.
- Accent 0 - Unofficial - Maps to neutral-50
- Accent (1): maps to 100
- Accent 2: maps to 200
- Accent 3: maps to 300
You might encounter some backgrounds set to very light colors such as 0.01%. What’s up with that? The underlying reason is that without a fill, the shadow (usually used for focus styles) doesn’t render.
Borders
Borders maps to darkness levels: 1 maps to 100, 2 maps 200 etc.
- Border 1: maps to 100 (unofficial)
- Border (2): maps to 200
- Border 3: maps to 300 (unofficial)
- Border 4: maps to 400 (unofficial)
- Border 5: maps to 500 (unofficial)
This mapping is useful when checking against the official docs: https://ui.shadcn.com/docs
| Hex | OKLCH value | Color name |
|---|---|---|
| #0a0a0a | oklch(.145 0 0) | Neutral 950 |
| #171717 | oklch(.205 0 0) | Neutral 900 |
| #262626 | oklch(0.269 0 0) | Neutral 800 |
| #FFFFFF | oklch(1 0 0) | White |
| #fafafa | oklch(.985 0 0) | Neutral 50 |
| #f5f5f5 | oklch(.97 0 0) | Neutral 100 |
| #e5e5e5 | oklch(0.922 0 0) | Neutral 200 |
| #d4d4d4 | oklch(0.708 0 0) | Neutral 300 |
To help convert OKLCH colors, you can use oklch.com.