Skip to content

Keeping Design Consistent in Large Projects

Maintaining design consistency in a large project isn't really a CSS skill issue—it’s a management issue.

3 min read
Design Tokens
CSS Variables
Custom Properties
Theming
Frontend

Maintaining design consistency in a large project isn't really a CSS skill issue—it’s a management issue. It's about how we handle values like colors and spacing.

A classic problem is the project that starts off clean but slowly becomes cluttered with "magic numbers." You’ll see the same blue used across ten different components, but it's written manually as a hex code every single time. When a designer inevitably asks for a color change, you’re stuck doing a massive search-and-replace across the whole codebase. That’s not architecture; that’s just hoping you didn't miss anything.

The fix is using design tokens.

A design token is basically just a name for a decision. Instead of writing #3b82f6, you write --color-accent. Now, you aren't talking about a specific color code; you're talking about its function.

I usually structure this in three layers. First is the primitive layer, which holds raw values like blue-500 or space-2. This is just a warehouse of values with no business logic attached. Second is the semantic layer, which is the most important part. This is where you assign roles, like --color-danger or --text-sm. If you want to implement dark mode, you just swap the values in the primitive layer, and the semantic layer updates automatically. Third is the component layer, used only for very specific components.

A lot of teams mess up by jumping straight to semantic tokens without a primitive layer. When the theme changes, they end up refactoring half their CSS files. Having a clear primitive layer makes creating new themes much cheaper and easier.

When you're managing CSS Custom Properties, treat them like a public API. Once a name is agreed upon, it needs to be stable. You can change the value behind a token, but changing the token's name itself will break things. One thing to watch out for: don't overdo it. Don't create a token for something used only once. If you just need a specific padding for a single modal, just use the value directly. Not everything needs to be a token.

Even if you're using a utility-first approach like Tailwind, the principle is the same. It’s not about the syntax; it’s about naming consistency. Whether through a theme configuration or CSS variables, the goal is to turn design into a manageable system rather than a collection of random styles.

Focus on building a system that can breathe. Good architecture is the kind that doesn't give you a headache when the design changes.