Emma Bennet

What is a CSS design system?

Modern CSS has everything needed for real design systems. Variables, nesting, layers, and scope create visual languages that scale across product lines. When design lives in one place, both designers and developers work at full speed.

The problem we created

For 15 years we've been writing CSS to survive in chaos. We use BEM because we gave up on the cascade. We use CSS-in-JS because we're scared of namespace collisions. We write utility classes because we stopped trusting our ability to name things. We compile, process, and transform CSS because we think native CSS isn't enough.

These practices assume CSS is broken and needs fixing. They're defensive strategies. They're about working around the language rather than harnessing its potential.

CSS design system defined

A design system isn't a component library or a utility framework. It's a visual language expressed through CSS. Modern CSS gives us everything we need: variables, nesting, container queries, layers, and scope. Here's what makes a real design system:

Central

A design system lives in one place. Not scattered across components, not mixed with JavaScript, not generated at build time. When you can see the whole system at once, you understand it. When it's fragmented across a thousand files, you have no system—just a collection of accidents waiting to happen.

Semantic

HTML already contains a rich design vocabulary. Lists, tables, forms, buttons, navigation—they all have meaning. A design system extends this vocabulary rather than replacing it. A <button> is already interactive. A <nav> already means navigation. The system styles what exists instead of recreating it with divs and classes.

Minimal

Constraints create consistency. A design system with 20 well-chosen classes beats one with 2000 utilities. HTML can't express spatial relationships, so classes handle layout: .stack, .grid, .columns. A few modifiers capture variations: .primary, .compact, .inverted. Everything else? Already in HTML.

Small projects

Start with global styles plus area-specific CSS. This follows the classic web development pattern that pre-dated the component revolution - global stylesheets with area-specific additions. It's perfect for personal projects, prototypes, or small teams where you need the flexibility to add styles ad-hoc without teaching a formal system to others:

 global.css       # Site-wide design system
 index.md
 blog/
     blog.css     # Blog-specific styles
     css-is-awesome.md
     design-systems.md
     ...

Files are loaded automatically based on location. The global.css applies everywhere. The blog.css only applies to pages in the blog directory. No imports, no bundling - just files where you need them.

Larger projects

Scale up with a centralized design system for larger teams, client work, or any project where consistency and maintainability matter more than development speed. This approach enforces constraints that prevent the CSS sprawl that kills long-term projects:

nue create full

This creates a complete design system in @shared/design/:

/design/
 base.css         # Typography, colors, spacing
 button.css       # All button variants
 content.css      # Blog posts, documentation
 dialog.css       # Modals, popovers
 document.css     # Page structure
 form.css         # All form elements
 layout.css       # Grid, stack, columns
 syntax.css       # Code highlighting
 table.css        # Data tables
 apps.css         # SPA-specific components

All files load automatically across your entire site. Marketing pages, documentation, blogs, login screens, and single-page apps all use the same visual language. Change a variable in base.css and see it everywhere.

The compound effect

A real design system compounds its value over time. Each project strengthens the system. Each use case refines the patterns. Each team member contributes to a shared language.

When design is scattered in components, every project starts from scratch. You rebuild the same button in every framework migration. You rewrite the same styles for every new component library. Nothing compounds. Everything churns.

When design is central and semantic, it goes beyond frameworks. Your CSS design system works with any HTML. It worked with jQuery. It works with React. It will work with whatever comes next. The investment compounds across technologies and time.

This is why CSS matters. Not because it's powerful—though it is. Not because it's fast—though it is. But because CSS is the only layer that survives every paradigm shift. Your React components from 2016 are obsolete. Your CSS from 2016 still works.