Design Language With Atomic Design: Atoms to Components
Part 2 of the series. A design language is the foundation everything else inherits from. Here's how we build it with atomic design - turning grid, type, color, and icons into tokens and components engineers can ship without guessing.

A design language is the set of shared rules that decide how every screen looks and behaves before anyone draws a single button. It is the layer your whole product inherits from: spacing, type, color, and the smallest reusable parts. Get the design language right and the rest of the system snaps into place; get it wrong and you spend the next year patching inconsistencies one Figma file at a time. This is Part 2 of our build-a-design-system series, and it covers the foundation: the atoms.
If you missed the setup, Part 1 of this series on building a design system from scratch covers why we needed one, the difference between a UI kit and a real system, and where atomic design fits. Here we go one level deeper and actually build the bottom of the pyramid.
Why a design language comes before components
Most teams start a design system by drawing buttons. That's backwards. A button is a decision that depends on dozens of earlier decisions: how tall is one unit of vertical rhythm, what counts as "primary," which gray sits behind disabled text. If those decisions live in a designer's head instead of the system, every button drifts.
The fix is to define the design language first as a small set of constraints, then build components on top of it. When the language is explicit, a new component is mostly assembly. When it isn't, every component reopens the same arguments.
We treat this the way we treat any system problem. Define the rules once, encode them so they're hard to break, and let everything downstream inherit. That mindset is the same one we describe in our piece on treating design as an engineering discipline: start from the ideal structure, then add the practical constraints.
A design system is not a folder of components. It is a set of rules, and the components are what falls out of the rules.
Atomic design, in one pass
Atomic design gives the language a vocabulary. Brad Frost's model borrows from chemistry, and the analogy holds up because it maps cleanly to how interfaces actually compose.
- Atoms are the smallest pieces that still mean something: a color, a type style, a spacing unit, an icon, an input label.
- Molecules are small groups of atoms working together: a labeled input, a search field, a single list row.
- Organisms are larger, self-contained sections: a navigation bar, a card grid, a checkout summary.
- Templates and pages sit above those, arranging organisms into real layouts.
The phrase atoms, molecules, organisms gets quoted a lot, but the value isn't the naming. It's the direction of dependency. Atoms never reference molecules. Molecules never reference organisms. That one-way flow is what keeps a large system from turning into a web of circular edits, and it's the same property good component architecture relies on in code.
Part 2 stays at the atom layer, because atoms are where the design language actually lives. Molecules and organisms are coming in later parts.
From atoms to design tokens
Here's the connection most articles skip. Atoms in Figma are the same thing as design tokens in code. A token is just a named value, decoupled from where it's used: space-2 instead of 8px, color-text-primary instead of #1A1A1A.
Naming the value once and referencing it everywhere is what makes a design language survive contact with a real codebase. Change the token, every component updates. Hard-code the raw value, and you've created a thousand tiny things to find and replace later.
When we hand off, every atom maps to a token, and every token has one job. Designers think in atoms; engineers consume tokens. Same source of truth, two views of it.
Grid and spacing: the rhythm everything snaps to
Spacing is the first atom because everything else aligns to it. We use a 4-pixel base unit. Every margin, padding, and gap is a multiple of 4, which gives enough granularity for tight UI without letting spacing become a free-for-all.
A few rules we hold to:
- Font sizes and line heights are also multiples of the base, so text aligns to the same rhythm (14, 16, 20, 24).
- Line height runs roughly 1.25 to 1.5 of the font size for body readability.
- Layout uses a 12-column grid on desktop, fewer on tablet, 2 on phones, with consistent gutters.
- Breakpoints are fixed and documented, so "where does tablet start" is never a debate.
The payoff is for the engineer. When spacing comes from a token scale, the developer never measures a gap by eye or asks whether that's 14 or 16 pixels. They reach for space-4 and move on. Standardized spacing is the cheapest reliability win a design system offers.
Typography as a system, not a font choice
Typography is more than picking a typeface. In the design language it's a documented set of text styles, each with a name, a size, a weight, a line height, and a stated use.
We document type in three parts: why this typeface, the full set of styles with where each one belongs, and how those styles read on different backgrounds. Two practical checks earn their place:
- The 1Il test. Type a digit "1," a capital "I," and a lowercase "l" next to each other. If you can't tell them apart, the font will hurt legibility in data-dense UI.
- Contrast against WCAG. Run every text-on-background pairing through a contrast checker and meet the relevant level before it becomes a token. Accessibility built into the atoms is accessibility you never have to retrofit.
Prefer fonts that load fast and render predictably across platforms. A beautiful typeface that adds a render delay is a performance bug wearing a nice outfit.
Color: build it to scale across products
We define color in HSL rather than hex, because hue, saturation, and lightness map to how people actually reason about color. The structure we use:
- A small set of brand colors: a primary action color, a secondary, and a neutral gray ramp.
- Lightness steps in fixed increments, so each color becomes a predictable scale instead of a pile of one-off shades.
- System colors for state: error, success, warning, info.
- Link colors handled explicitly, since they carry meaning beyond decoration.
Defining color as ramps does something subtle. When a new product needs a different brand color, a designer adjusts hue and saturation and keeps the lightness steps, and the whole palette regenerates in proportion. The structure travels; only the inputs change. Meanwhile the engineer gets tokens with intent baked in, color-action-primary rather than a raw value they have to guess the purpose of.
Icons: atoms with behavior
Icons are atoms too, and they carry more logic than people expect. We split them into colored, monochrome, and interactive cursor variants, and build each as a master component so the set stays searchable and consistent.
The detail that matters for handoff: build icons with both fill and stroke as controllable properties. An inactive item shows an outline; the active state fills the same icon. Because state is a property, the engineer toggles it in code instead of loading a second asset. One component, two states, no extra files to ship or keep in sync.
What makes atoms engineer-ready
A design language only earns its keep if it survives handoff. An atom that looks finished in Figma but leaves the engineer guessing isn't done. We hold every atom to a short standard before it counts as shipped.
- It has a name, and the name is the token. No nameless values. The Figma style and the code token share one vocabulary.
- It documents its reasoning. Each atom carries a short note on what it's for and why, so the next person doesn't reverse-engineer the intent.
- It encodes its own rules. Spacing comes from the scale, color from the ramp, state from a property. Correct usage is the path of least resistance.
- It's accessible by construction. Contrast and legibility checks happen at the atom, not in QA three sprints later.
When atoms meet that bar, building components stops being negotiation and becomes assembly. That's the entire point of clean component architecture: small, well-defined parts that compose without surprises, and a handoff where the developer reads tokens instead of interpreting pixels.
If your engineer has to measure a gap or guess a hex value, the atom wasn't finished. Tokens, not screenshots, are the deliverable.
Where the design language sits in the bigger picture
The atom layer is foundational but small on its own. Its value compounds as you build upward: molecules inherit spacing and type, organisms inherit color and state, pages inherit all of it. Every level above the language gets cheaper because the level below was defined once and defined well.
This is also where research-driven design and engineering meet. A design language is a product decision encoded as a system, which is exactly how our UI/UX and product design team approaches every engagement: define the rules, encode them so they hold, and hand off something engineers can build without translation loss.
If you're starting your own system, the order matters. Read Part 1 for the why and the setup, build your atoms and tokens before your components, and resist the urge to draw buttons first. The next part in the series moves up a level to molecules, where these atoms start combining into the things users actually click.
A solid design language is unglamorous work. It's grids, ramps, and naming conventions, not hero screens. But it's the difference between a system that scales and a folder of components that slowly rots. Build the foundation, and everything above it gets easier.
Frequently asked questions
A design language is the shared set of foundational rules a product inherits from: spacing, typography, color, and the smallest reusable parts. It sits below components, so buttons, forms, and pages all follow the same constraints. Defining it first keeps a system consistent instead of drifting as the product grows.
Atoms in atomic design and design tokens are two views of the same thing. An atom like a color or spacing value becomes a named token in code, such as color-text-primary or space-4. Designers think in atoms, engineers consume tokens, and both reference one source of truth, so a single change updates everything downstream.
Atoms are the smallest meaningful pieces: a color, a type style, a spacing unit, an icon. Molecules combine atoms into small groups like a labeled input or a search field. Organisms are larger self-contained sections such as a navigation bar or card grid. Dependencies flow one way, atoms up to organisms, never back.
A button depends on dozens of earlier decisions: spacing units, what counts as primary, which gray sits behind disabled text. If those live only in a designer's head, every component reopens the same arguments and drifts. Defining the design language first turns component work into assembly instead of repeated negotiation.
An atom is engineer-ready when it has a name that doubles as a code token, documents its reasoning, encodes its own rules so correct usage is the default, and passes accessibility checks like contrast and legibility at the source. The deliverable is tokens, not screenshots, so engineers read values instead of measuring pixels.
A 4-pixel base unit gives enough granularity for tight UI while keeping spacing on a predictable scale engineers can consume as tokens. HSL color lets designers reason in hue, saturation, and lightness, building each color as a fixed-step ramp. Both choices make the system scale across products by changing inputs, not rebuilding from scratch.
