Palette structure
Large hue set: slate, gray, zinc, red, blue, emerald and many more. Steps 50–900 (sometimes 950), roughly 9–10 per hue.
- blue-50 – very light tint
- blue-500 – mid accent, good for primary buttons
- blue-900 – deep shade, works for text on light backgrounds
Similar but slightly smaller hue set: gray, red, orange, yellow, green, teal, blue, cyan, purple, pink. Steps 50–900, ten steps per hue.
Structurally mirrors Tailwind. The big differences are in defaults, semantics and component integration.
Naming and usage patterns
Tailwind
Consumed mostly via class names: bg-blue-500, text-gray-700, border-emerald-400. Semantics are created by local conventions or theme extensions that alias Tailwind values.
// tailwind.config.js
theme: {
extend: {
colors: {
brand: {
50: '#eff6ff',
500: '#3b82f6',
600: '#2563eb',
},
},
},
}Chakra UI
Consumed via theme tokens (theme.colors.blue[500]) and JSX style props (colorScheme="blue", bg="blue.500"). Semantics are more built-in — especially via colorScheme:
<Button colorScheme="blue">Primary</Button> <Alert status="error">Something went wrong</Alert>
Chakra components interpret schemes and states into actual palette values automatically. This means its palette is tightly integrated with the component library, whereas Tailwind's palette is framework-agnostic.
Dark mode strategies
Tailwind — one scale, manual remapping
Provides a dark: variant for any class. You decide which shades to use in dark mode. There is no separate dark palette; you reuse the same scales with different indices.
<div class="bg-white text-gray-900 dark:bg-gray-900 dark:text-gray-100">
Extremely flexible, but requires design decisions for every theme.
Chakra — theme-aware, batteries included
Chakra tracks color mode internally via ChakraProvider. Many components automatically adjust. colorScheme="blue" uses different underlying blue shades in light vs dark. You can override via the theme config, but sensible defaults come out of the box.
Semantics and design tokens
Tailwind
Colors are pure utility values. To build a design-token layer, define semantic tokens in your app and map them to Tailwind classes or CSS variables:
:root {
--color-bg: theme('colors.gray.50');
--color-text: theme('colors.gray.900');
--color-primary: theme('colors.blue.600');
}
.btn-primary {
@apply bg-blue-600 text-white hover:bg-blue-700;
}Chakra
Chakra starts with a global theme (extendTheme) that includes semantic tokens you can use directly as style props:
const theme = extendTheme({
semanticTokens: {
colors: {
bg: {
default: 'gray.50',
_dark: 'gray.900',
},
primary: {
default: 'blue.600',
_dark: 'blue.300',
},
},
},
})You can then use bg="bg" or color="primary" directly in JSX. Chakra is closer to a batteries-included design system; Tailwind is a raw palette + utility engine.
Ecosystem and integration
- Framework-agnostic (popular in React, Vue, etc.)
- Palettes often reused outside Tailwind (Figma, non-Tailwind apps)
- Best when you want fine-grained control over every component
- React-first component library plus theme system
- Strong defaults for buttons, alerts, forms, navigation, etc.
- Best when you want to move quickly with prebuilt components
When to choose which
Choose Tailwind if…
- You're already all-in on Tailwind CSS utilities
- You want a flexible palette for both marketing sites and apps
- You want tight control over semantics and component styling
- You're comfortable designing your own token layer
Choose Chakra UI if…
- You're building a React app and want prebuilt components
- You like the
colorSchememodel — pick a hue, Chakra handles states - You want strong defaults for light/dark behavior
- You're okay with Chakra's component API and theming conventions
Mix-and-match
- Use Tailwind's palette as a design reference in Figma while implementing the actual app in Chakra
- Use Chakra's tokens as a source of truth and generate Tailwind config from them
- Use ColorR to explore both palettes side by side and migrate gradually if your stack changes