NT
🖥️

Built for a bigger screen

This case study has detailed visuals, interactions, and layouts that are best experienced on a desktop or laptop.

← Back to portfolio

or rotate to landscape for a peek

Design System · AirIQ

One system.
Four products.

A token-first design system built from scratch alongside shipping product. No dedicated systems team — just ruthless prioritisation, a shared Figma library, and the discipline to treat consistency as a feature.

Lead DesignerNov 2025 – Jan 2026Tokens · Components0 → 1
View in Figma ↗Read case study ↓
Design System overview
01

Why the system had to exist

Every product team was solving the same visual problem from scratch. Buttons with five different border radii. Three interpretations of the same status badge. Design inconsistency was slowing shipping velocity and eroding user trust.

0

Products sharing one Figma library

0

Core components, all states documented

0 wks

From zero to v1, while shipping product

Three challenges that forced the system

Consistency

Products started looking inconsistent — five different button radii, three interpretations of the same status badge.

Collaboration

Constant back-and-forth between designers and developers. No single source of truth meant every handoff needed renegotiating.

Ease of Use

Teams built custom solutions for patterns that should have been reusable. Effort spent reinventing, not building.

The constraint was the brief: no dedicated systems team, no runway to pause product work. The system had to be designed in the gaps, documented enough to survive handoff, opinionated enough to actually reduce decisions.

Approach

Token-first

Every colour, spacing step and shadow is a named token. Swap the token, update every instance.

Component contracts

Each component ships with defined props, states and usage rules. No ambiguity in handoff.

Built while shipping

Tokens and components introduced incrementally alongside real features — not in a silo.

Documentation as design

The Figma file is the doc. Annotations live inside frames, not in a Notion page nobody reads.

Design systems start with strong foundations.
They define how components look, behave, and scale across the entire product.

What’s inside

A unified system of reusable foundations and components that brings clarity, consistency, and structure to every interface.

Color System

Semantic tokens and palettes for scalable themes and clear visual hierarchy.

Lato

Bold · Semi Bold · Regular

Typography

A flexible type system with predefined roles and scales for readable interfaces.

Spacing & Radius

Structured spacing and corner rules that keep layouts balanced and predictable.

Icon set preview

Icons

A unified icon set at a single stroke weight. Every icon at 20×20 dp.

Grid System

Responsive grids for consistent layouts across screen sizes and breakpoints.

sm

md

lg

Shadows & Blurs

Depth and elevation styles that add clarity, focus, and visual rhythm.

Atomic Design

Atomic Design Principles

A modular approach that breaks interfaces into reusable pieces, making their structure clear and connected.

Design Tokens

Core variables that define colours, typography, spacing.

Atoms

The smallest UI parts: icons, buttons, and input fields.

Molecules

Groups of atoms forming simple components.

Organisms

Larger components made of molecules and atoms.

Templates

Layouts showing how components connect within a structure.

Screens

Final screens assembled from components with real content.

Foundations

Color System

A flexible palette of semantic and functional colours that keeps interfaces consistent, clear, and expressive across the entire product.

Neutral

Backgrounds, text, surfaces, separators.

50

#F9FAFB

100

#F3F4F6

200

#E5E7EB

400

#9CA3AF

500

#6B7280

700

#374151

800

#1F2937

900

#111827

Brand

Primary interactive elements: CTAs, links, active states.

50

#EFF8FF

100

#BFDFFF

200

#7EC6FF

300

#3DA8FF

600

#1076BC

700

#0A5A8F

800

#064272

900

#022847

Error

Negative states, destructive actions, validation errors.

50

#FEF2F2

100

#FEE2E2

200

#FECACA

300

#FCA5A5

500

#EF4444

600

#DC2626

800

#991B1B

900

#7F1D1D

Success

Positive confirmation, completed states, available status.

50

#F0FDF4

100

#DCFCE7

200

#BBF7D0

300

#86EFAC

500

#22C55E

600

#16A34A

800

#166534

900

#14532D

Warning

Cautionary states, pending actions, time-sensitive alerts.

50

#FFFBEB

100

#FEF3C7

200

#FDE68A

300

#FCD34D

500

#F59E0B

600

#D97706

800

#92400E

900

#78350F

Token flow — tap a layer to trace the chain

Raw hex values live in the primitive layer. They are never used directly in components.

What I built

Split colour tokens into three tiers: primitive, semantic, component

Named every intent explicitly — color.action.primary, not #1076BC

Built a single-source palette supporting all four products

Impact created

Full brand theme can be swapped by updating one primitive token

Eliminated colour inconsistency across 4 products

Developers write zero manual colour overrides in components

Foundations

Lato

Typography

The typographic system defines text styles as design tokens and explains how titles and body text should be applied.

Ag

Bold

Ag

Semi Bold

Ag

Regular

H1 Desktop

47px · Bold

The quick brown fox jumps over the lazy dog

H2 Desktop

37px · Bold

The quick brown fox jumps over the lazy dog

H3

29px · SemiBold

The quick brown fox jumps over the lazy dog

H4

21px · SemiBold

The quick brown fox jumps over the lazy dog

Body Large

17px · Regular

The quick brown fox jumps over the lazy dog

Body

15px · Regular

The quick brown fox jumps over the lazy dog

Caption

13px · Regular

The quick brown fox jumps over the lazy dog

Label

11px · Medium

The quick brown fox jumps over the lazy dog

Foundations

Spacing & Radius

A consistent spacing and radius scale creates visual rhythm and predictable layouts. Each value exists as a reusable token.

2px

4px

6px

8px

12px

16px

20px

24px

32px

40px

48px

64px

#4#spacing-44 px

Border Radius Scale

sm

4px

md

8px

lg

12px

xl

16px

2xl

24px

full

999px

Iconography

Icon library

A unified icon library at a single stroke weight. Every icon exports at 20×20 dp. Mixing icon styles is the fastest way to make a UI feel cheap.

Smart Components

Components

Smart components adapt automatically to states, themes, and content — reducing manual work and maintaining consistency across every screen.

Handoff gaps live in the unstated. If hover is not designed, engineering invents it. If loading is not specified, it gets cut. Documenting every state per component upfront costs hours. Fixing state inconsistencies in production costs weeks.

Buttons

Loading Figma…

Four variants: primary, secondary, tertiary, ghost. Every state documented. No one-off styles.

Input Fields

Loading Figma…

Seven states, three sizes. Error and helper text are baked in — not detached text layers.

Checkbox, Radio & Toggle

Loading Figma…

Indeterminate state explicitly handled — a gap most teams discover in production.

Dropdown & Select

Loading Figma…

Multi-select, single-select, searchable. Inherits input anatomy: same tokens, same spacing.

Tabs & Navigation

Loading Figma…

Line and pill variants. Active state uses the accent token — swap the theme and every tab updates.

Date & Time Picker

Loading Figma…

Travel-critical. Range selection, blocked-date states, time picker — the most-requested in v1.

What I built

7 components with all states: default, hover, active, loading, disabled, error

Date picker built for travel — range selection, blocked dates, time picker

Token-bound variants: every component updates from a single theme change

Impact created

40% increase in overall component coverage

Zero one-off component builds across all 4 products in the first quarter

Engineers stopped asking "what does the hover look like?"

In the Wild

System in Production

The system only matters if it shows up in production. Here’s how foundations and components assemble into the AirIQ booking flow.

Search

Search

DatePickerAutocompletePassengerSelector

Date picker, passenger selector, airport autocomplete — all system components. The booking entry point assembles in half the time it used to.

Results

Results

BadgeDropdownPagination

Status badges (Direct / Economy / Delayed) are tokens. Grid rhythm is the layout system. Sorting controls use Dropdown. Zero custom overrides.

Booking

Booking

InputDropdownCheckbox

The traveller detail form is Input, Dropdown and Checkbox in sequence. One component library, one form, consistent across every device width.

Confirmation

Confirmation

TypographyBadgeColor tokens

Typography scale and colour tokens carry the hierarchy. The success state reuses the Badge component — semantic colour, different meaning.

The question I asked for every AirIQ screen: “Is this a component or a custom?” If it needed to be custom, that was a signal the system had a gap. I plugged it.

Results

Impact

A design system is not a deliverable — it’s a multiplier. These are the results after three months in production.

Before

5+ button styles across product screens

Ad hoc spacing — every designer eyeballed it

Icon library split across three Figma files

No documented component states

Onboarding new designers took 2+ weeks

After

4 button variants, every state documented

8pt grid enforced via auto-layout

Unified icon library, one stroke weight

States and usage rules live inside components

New designers contribute by day 3

0%

Faster screen assembly

for screens built entirely from library components

0 wks

From 0 to v1

while simultaneously shipping product

Adoption beats perfection

A system no one uses is a system that does not exist. Ship an imperfect v1 fast, iterate based on real usage — not theoretical completeness.

Tokens are the real leverage

Components can be rebuilt. Tokens are load-bearing. Getting naming conventions right early saved weeks of migration work later.

NT

Thanks for sticking around ✌️

Building a design system is mostly invisible work — until it isn’t. Hope this gave you a glimpse of what goes into making consistency feel effortless.

Say hi ↗