Building a Custom Design System with Tailwind & CSS Variables
Exploring the architecture behind merging a fixed-fluid hybrid grid with deeply customizable tonal elevation layers using modern CSS features.
When building high-fidelity products, managing design systems becomes a communication puzzle. Design variables like paddings, colors, and border-radiis often live fragmented between Figma styles and codebase variables.
Our goal was to merge a fixed-fluid hybrid grid with deeply customizable tonal elevation layers inside a React-Tailwind boundary.
Leveraging the Power of CSS Custom Properties
Tailwind CSS provides awesome compile-time utility classes. However, hardcoding hex colors inside utility arrays severely limits dynamic layout modification (like seamless dark mode toggle or run-time custom skinning).
By mapping tailwind’s configuration directly to CSS Custom Properties (CSS variables), we gain runtime full flexibility:
:root {
--color-surface-subtle: #F9FAFB;
--color-border-low-contrast: #E5E7EB;
--color-primary: #0019d7;
}
.dark {
--color-surface-subtle: #1c1b1b;
--color-border-low-contrast: #474646;
--color-primary: #e0e0ff;
}
With Tailwind config configured to inject these custom variables:
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: "var(--color-primary)",
"surface-subtle": "var(--color-surface-subtle)",
}
}
}
}
Now, classes like bg-surface-subtle and text-primary immediately adapt to theme modifications dynamically without a single JavaScript re-render. Combining this with fluid typography parameters ensures visual crispness across view constraints.