CSS Custom Properties
Define reusable theme variables with CSS custom properties
Overview
Custom properties (CSS variables) store values you can reuse and override. They cascade and inherit—define design tokens on :root and override per component or theme (e.g. dark mode).
Syntax / Usage
:root {
--color-primary: #2563eb;
--color-text: #1f2937;
--space-md: 1rem;
--radius: 0.5rem;
--font-sans: system-ui, sans-serif;
}
.button {
background: var(--color-primary);
padding: var(--space-md);
border-radius: var(--radius);
font-family: var(--font-sans);
}
/* Fallback value */
color: var(--color-muted, #6b7280);
/* Dark theme override */
[data-theme="dark"] {
--color-text: #f9fafb;
--color-primary: #60a5fa;
}
Examples
Component-scoped tokens:
.alert {
--alert-bg: #fef3c7;
--alert-border: #f59e0b;
background: var(--alert-bg);
border: 1px solid var(--alert-border);
}
.alert-error {
--alert-bg: #fee2e2;
--alert-border: #ef4444;
}
Animate with variables:
.progress {
--value: 0;
width: calc(var(--value) * 1%);
transition: width 0.3s ease;
}
Common Mistakes
- Expecting variables to work in media query conditions—they do not (yet)
- Defining variables only on components without
:roottokens - Typos in
var(--name)failing silently to fallback or invalid - Over-nesting overrides making theme switching hard to trace
See Also
selectors responsive-design box-model flexbox