WCAG 2.1 AA compliant Automatic theme switching

WCAG 2.1 AA compliant Automatic theme switching

WCAG 2.1 AA compliant Automatic theme switching

Contrast

Contrast

Light

Light

SIGN SYSTEM

SIGN SYSTEM

SIGN SYSTEM

SIGN SYSTEM

4-LAYER D

4-LAYER D

4-LAYER D

4-LAYER D

E

E

E

E

Company

Company

FreeDi

FreeDi

Timeline

Timeline

June 2024

June 2024

My Role

My Role

UX/UI Designer

UX/UI Designer

Duration

Duration

2 week foundation sprint → 6 months iterative refinement

2 week foundation sprint → 6 months iterative refinement

Platform

Platform

Web Application (Responsive)

Web Application (Responsive)

The Challenge: Can Three People Build Like Thirty?

The Challenge: Can Three People Build Like Thirty?

The Challenge: Can Three People Build Like Thirty?

The Challenge: Can Three People Build Like Thirty?

Small teams hit a wall: you can move fast OR maintain quality, but rarely both.

As Delib.org's solo designer with 2 developers, I was becoming the bottleneck.

I was answering 20+ questions daily while trying to design features.

I had two choices: Become a full-time spec machine, or build infrastructure that made the team self-sufficient.

I chose infrastructure - and had one week to prove it would work.


The requirements:

Accessibility: WCAG AA compliance - Light and Contrast themes mandatory

Responsive: 4 breakpoints (1920px to 390px) systematically

Efficiency: Developers must build independently

Scalability: Foundation that grows with the product

Small teams hit a wall: you can move fast OR maintain quality, but rarely both.

As Delib.org's solo designer with 2 developers, I was becoming the bottleneck.

I was answering 20+ questions daily while trying to design features.

I had two choices: Become a full-time spec machine, or build infrastructure that made the team self-sufficient.

I chose infrastructure - and had one week to prove it would work.


The requirements:

Accessibility: WCAG AA compliance - Light and Contrast themes mandatory

Responsive: 4 breakpoints (1920px to 390px) systematically

Efficiency: Developers must build independently

Scalability: Foundation that grows with the product

Systematic Responsive Adaptation

Systematic Responsive Adaptation

Systematic Responsive Adaptation

4 breakpoints • Automatic token scaling

4 breakpoints • Automatic token scaling

Desktop XL

1920px+

Desktop

1440px

Tablet

1024px

Mobile

390px

4 breakpoints • Automatic token scaling

239

Design Tokens

100%

WCAG AA Compliant

2

Themes

Solution: Build the Foundation First

Solution: Build the Foundation First

Solution: Build the Foundation First

I proposed spending one week building a design system before designing features.

This was a risk—features would be delayed—but the math was clear: upfront investment would save hours per feature long-term.


The business case:

• Eliminate repetitive decisions

• Automate accessibility compliance

• Enable developer self-service

• Prevent design debt before it accumulates


The solution:

A 239-token system organized in four levels, change one value at the top → everything below updates automatically.


Here's the structure:

Level 1 - Brand: Raw values (#4276BB, 16px) - the basic building blocks

Level 2 - Alias: Named references (color-primary-500) - semantic colors

Level 3 - Mapped: Semantic meaning (action-default, text-primary) - this is where themes switch

Level 4 - Components: UI elements (button-primary-bg) - the actual interface parts


The key insight:

Theme switching happens at Level 3 (Mapped). Everything below stays the same.

This means developers can't accidentally break accessibility - the architecture won't let them.

I proposed spending one week building a design system before designing features.

This was a risk—features would be delayed—but the math was clear: upfront investment would save hours per feature long-term.


The business case:

• Eliminate repetitive decisions

• Automate accessibility compliance

• Enable developer self-service

• Prevent design debt before it accumulates


The solution:

A 239-token system organized in four levels, change one value at the top → everything below updates automatically.


Here's the structure:

Level 1 - Brand: Raw values (#4276BB, 16px) - the basic building blocks

Level 2 - Alias: Named references (color-primary-500) - semantic colors

Level 3 - Mapped: Semantic meaning (action-default, text-primary) - this is where themes switch

Level 4 - Components: UI elements (button-primary-bg) - the actual interface parts


The key insight:

Theme switching happens at Level 3 (Mapped). Everything below stays the same.

This means developers can't accidentally break accessibility - the architecture won't let them.

Level 1: Brand

Raw values — the basic building blocks

4276BB

426742

D63C3C

1A1A2C

Level 2: Alias

Named references — semantic blocks

color-primary-500

color-success-600

color-error-500

color-neutral-900

Level 3: Mapped

Semantic meaning — where theme switching happens

action-default

success-text

error-default

text-primary

Level 4: Components

UI elements — the actual interface parts

button-primary-bg

alert-success-text

snackbar-urgent

card-heading-text

Level 1: Brand

Raw values — the basic building blocks

4276BB

426742

D63C3C

1A1A2C

Level 2: Alias

Named references — semantic blocks

color-primary-500

color-success-600

color-error-500

color-neutral-900

Level 3: Mapped

Semantic meaning — where theme switching happens

action-default

success-text

error-default

text-primary

Level 4: Components

UI elements — the actual interface parts

button-primary-bg

alert-success-text

snackbar-urgent

card-heading-text

Level 1: Brand

Raw values — the basic building blocks

4276BB

426742

D63C3C

1A1A2C

Level 2: Alias

Named references — semantic blocks

color-primary-500

color-success-600

color-error-500

color-neutral-900

Level 3: Mapped

Semantic meaning — where theme switching happens

action-default

success-text

error-default

text-primary

Level 4: Components

UI elements — the actual interface parts

button-primary-bg

alert-success-text

snackbar-urgent

card-heading-text

Token Architecture: Four Levels

Token Architecture: Four Levels

Token Architecture: Four Levels

Four-level token architecture where theme switching happens at the Mapped layer.

The Design System

The Design System

The Design System

Color System: Accessibility by Design

I built the color system with accessibility as a foundational requirement, not an afterthought.

Every text color was validated against WCAG AA standards (4.5:1 minimum contrast) before it became a token.


The structure:

9 color families: Red, Orange, Yellow, Green, Blue, Blue-dark, Purple, Pink, Grey

11 shades per family: 50 (lightest) to 950 (darkest)

2 themes: Light + Contrast (enhanced for visual impairments)

Systematic validation: Text tokens use 600+ shades, lighter shades reserved for backgrounds


Validated contrast ratios on white backgrounds:

Primary text (Neutral/900): 15.2:1 WCAG AAA

Secondary text (Neutral/800): 11.62:1 WCAG AAA

Interactive elements (Primary/700): 8.32:1 WCAG AA

Success states (Success/700): 6.46:1 WCAG AA

Error states (Error/500): 4.59:1 WCAG AA

Warning states (Warning/700): 6.55:1 WCAG AA


How it works: The Mapped token layer (text-primary, text-secondary, action, success, error) references pre-validated shades from the Alias layer.

Developers select semantic tokens like "action" or "error" - accessibility is guaranteed.

They can't accidentally create inaccessible combinations because the architecture prevents it.

I built the color system with accessibility as a foundational requirement, not an afterthought.

Every text color was validated against WCAG AA standards (4.5:1 minimum contrast) before it became a token.


The structure:

9 color families: Red, Orange, Yellow, Green, Blue, Blue-dark, Purple, Pink, Grey

11 shades per family: 50 (lightest) to 950 (darkest)

2 themes: Light + Contrast (enhanced for visual impairments)

Systematic validation: Text tokens use 600+ shades, lighter shades reserved for backgrounds


Validated contrast ratios on white backgrounds:

Primary text (Neutral/900): 15.2:1 WCAG AAA

Secondary text (Neutral/800): 11.62:1 WCAG AAA

Interactive elements (Primary/700): 8.32:1 WCAG AA

Success states (Success/700): 6.46:1 WCAG AA

Error states (Error/500): 4.59:1 WCAG AA

Warning states (Warning/700): 6.55:1 WCAG AA


How it works: The Mapped token layer (text-primary, text-secondary, action, success, error) references pre-validated shades from the Alias layer.

Developers select semantic tokens like "action" or "error" - accessibility is guaranteed.

They can't accidentally create inaccessible combinations because the architecture prevents it.

Light theme

Text/primary

Neutral/900 • #1A1A2C

Body text, headlines

15.2:1 WCAG AAA ✓

Contrast theme

Text/primary

Neutral/900 • #1B1B1F

Body text, headlines

17.16:1 WCAG AAA ✓

Light theme

Secondary Text

Neutral/800 • #2E2E4A

Supporting text, labels

11.62:1 WCAG AAA ✓

Contrast theme

Secondary Text

Neutral/900 • #303036

Supporting text, labels

18.27:1 WCAG AAA ✓

Light theme

Action / Links

Primary/600 • #365F97

Interactive elements

5.76:1 WCAG AAA ✓

Contrast theme

Action / Links

Primary/600 • #012FB6

Interactive elements

10.07:1 WCAG AAA ✓

Light theme

Success States

Success/700 • #426742

Success messages, confirmations

6.46:1 WCAG AAA ✓

Contrast theme

Success States

Success/700 • #1D6D1D

Success messages, confirmations

6.44:1 WCAG AAA ✓

Light theme

Error States

Error/500 • #D63C3C

Error messages, destructive actions

4.59:1 WCAG AA ✓

Contrast theme

Error States

Error/700 • #990000

Error messages, destructive actions

8.91:1 WCAG AA ✓

Light theme

Warning States

Warning/700 • #994500

Warnings, caution messages

6.55:1 WCAG AA ✓

Contrast theme

Warning States

Warning/700 • #993A00

Warnings, caution messages

7.09:1 WCAG AA ✓

Type Style

Desktop XL

Desktop

Tablet

Mobile

1920px+

1440px

1024px

390px

H1

Aa

76px

Aa

76px

Aa

56px

Aa

36px

H2

Aa

60px

Aa

60px

Aa

48px

Aa

32px

H3

Aa

48px

Aa

48px

Aa

40px

Aa

28px

H4

Aa

36px

Aa

36px

Aa

32px

Aa

26px

Body Large

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

Body Medium

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

Body Small

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

Type Style

Desktop XL

Desktop

Tablet

Mobile

1920px+

1440px

1024px

390px

H1

Aa

76px

Aa

76px

Aa

56px

Aa

36px

H2

Aa

60px

Aa

60px

Aa

48px

Aa

32px

H3

Aa

48px

Aa

48px

Aa

40px

Aa

28px

H4

Aa

36px

Aa

36px

Aa

32px

Aa

26px

Body Large

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

Body Medium

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

Body Small

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

Type Style

Desktop XL

Desktop

Tablet

Mobile

1920px+

1440px

1024px

390px

H1

Aa

76px

Aa

76px

Aa

56px

Aa

36px

H2

Aa

60px

Aa

60px

Aa

48px

Aa

32px

H3

Aa

48px

Aa

48px

Aa

40px

Aa

28px

H4

Aa

36px

Aa

36px

Aa

32px

Aa

26px

Body Large

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

The quick brown fox

20px

Body Medium

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

The quick brown fox

16px

Body Small

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

The quick brown fox

14px

Typography Scale: Systematic Responsive Adaptation

Developers reference typography tokens → responsive behavior automatic

Developers reference typography tokens → responsive behavior automatic

Radius scale

2

4

8

12

16

20

24

96

Spacing scale

2

2

4

+2

8

+4

12

+4

16

+4

20

+4

24

+4

28

+4

32

+4

36

+4

99

Full

Radius scale

2

4

8

12

16

20

24

96

Spacing scale

2

2

4

+2

8

+4

12

+4

16

+4

20

+4

24

+4

28

+4

32

+4

36

+4

99

Full

Radius scale

2

4

8

12

16

20

24

96

Spacing scale

2

2

4

+2

8

+4

12

+4

16

+4

20

+4

24

+4

28

+4

32

+4

36

+4

99

Full

Spacing: Consistent Rhythm

Every spacing decision comes from the scale - no arbitrary values.

Used consistently for padding, margins, gaps, and border radius.

This creates visual rhythm automatically.

Click here

Button • Default State background

Click here

Button • Action-hovered background

Click here

Button • Action-focused border

Click here

Button • Action-selected background

Click here

Button • Action-disable background

Small

40px

Medium

48px

Large

56px

Default State

Primary/400 • #4276BB

4.62:1 WCAG AA ✓

Action-hover

Primary/400 • #518FE2

4.11:1 WCAG AA ✓

Action-focused

Primary/900 • #0C1C31

15.22:1 WCAG AA ✓

Action-selected

Primary/600 • #365F97

6.48:1 WCAG AA ✓

Action-disabled

Neutral/200 • #C1C1D7

7.55:1 WCAG AA ✓

Text-on-action

Neutral/white • #FFFFFF

4.62:1 WCAG AA ✓

Click here

Default State background

Click here

Default State background

Click here

Action-hover background

Click here

Action-selected background

Click here

Action-disable background

Small

40px

Medium

48px

Large

56px

Default State

Primary/400 • #4276BB

4.62:1 WCAG AA ✓

Action-hover

Primary/400 • #518FE2

4.11:1 WCAG AA ✓

Action-focused

Primary/900 • #0C1C31

15.22:1 WCAG AA ✓

Action-selected

Primary/600 • #365F97

6.48:1 WCAG AA ✓

Action-disabled

Neutral/200 • #C1C1D7

7.55:1 WCAG AA ✓

Text-on-action

Neutral/white • #FFFFFF

4.62:1 WCAG AA ✓

Click here

Button • Default State background

Click here

Button • Action-hovered background

Click here

Button • Action-focused border

Click here

Button • Action-selected background

Click here

Button • Action-disable background

Small

40px

Medium

48px

Large

56px

Default State

Primary/400 • #4276BB

4.62:1 WCAG AA ✓

Action-hover

Primary/400 • #518FE2

4.11:1 WCAG AA ✓

Action-focused

Primary/900 • #0C1C31

15.22:1 WCAG AA ✓

Action-selected

Primary/600 • #365F97

6.48:1 WCAG AA ✓

Action-disabled

Neutral/200 • #C1C1D7

7.55:1 WCAG AA ✓

Text-on-action

Neutral/white • #FFFFFF

4.62:1 WCAG AA ✓

Components: Accessible by Default

Components defined with mapped tokens → accessibility automatic


Quality Achieved:

All text meets WCAG AA contrast standards (4.5:1 minimum)

Keyboard users can navigate all interactive elements with visible focus indicators

• Design consistency maintained across typography, spacing, and colors

Both themes stay accessible automatically—no manual compliance checks needed

Components defined with mapped tokens → accessibility automatic


Quality Achieved:

All text meets WCAG AA contrast standards (4.5:1 minimum)

Keyboard users can navigate all interactive elements with visible focus indicators

• Design consistency maintained across typography, spacing, and colors

Both themes stay accessible automatically—no manual compliance checks needed

Responsive: Systematic Adaptation

Tokens auto-adapt. Developers select tokens, responsive behavior is handled systematically.

Tokens auto-adapt. Developers select tokens, responsive behavior is handled systematically.

Implementation

Implementation

Implementation

Theme switching Zero manual work

Light theme

text-primary: Neutral/900 (#1A1A2C)



text-primary: Neutral/900 (#1A1A2C)



text-secondary: Neutral/800 (#2E2E4A)

text-secondary: Neutral/800 (#2E2E4A)

header-question: Blue/500 (#037CC1)

header-question: Blue/500 (#037CC1)

suggestion-added: Yellow/500 (#FED62F)

suggestion-added: Yellow/500 (#FED62F)

All ratios: WCAG AA compliant

Contrast theme

text-primary: Neutral/900 (#1B1B1F)



text-primary: Neutral/900 (#1B1B1F)



text-secondary: Neutral/800 (#303036)

text-secondary: Neutral/800 (#303036)

header-question: Blue/500 (#005E85)

header-question: Blue/500 (#005E85)

suggestion-added: Yellow/500 (#FCC00D)

suggestion-added: Yellow/500 (#FCC00D)

All ratios: WCAG AA compliant

Clusters

Clusters

Node cards and UI elements use design system tokens for consistency.

Node cards and UI elements use design system tokens for consistency.

Consensus maps with multiple view modes

Color-coded zones maintain token consistency.

Color-coded zones maintain token consistency.

Voting results with bar charts

Interactive voting with bar charts use semantic tokens for automatic accessibility

Interactive voting with bar charts use semantic tokens for automatic accessibility

Real-time polarization tracking

Real-time polarization tracking

Scatter plots and tooltips using mapped tokens for data visualization.

Scatter plots and tooltips using mapped tokens for data visualization.

Features Built with the System Contrast theme

Features Built with the System Contrast theme

Features Built with the System Contrast theme

Features Built with the System Contrast theme

Results & Impact

Results & Impact

Results & Impact

Results & Impact

The token architecture transformed how our 3-person team builds—enabling systematic quality and developer independence.

The token architecture transformed how our 3-person team builds—enabling systematic quality and developer independence.

System Built:

239 tokens across 4 architectural levels

2 accessible themes (Light + Contrast)

4 responsive breakpoints handled systematically

20+ features using the system

Quality Achieved:

100% WCAG AA compliance—all text meets 4.5:1 minimum contrast

Consistent spacing, typography, and colors across all interfaces

Theme switching maintains compliance automatically

Developer Experience:

• Developers select semantic tokens—accessibility guaranteed by architecture

• Theme switching requires zero manual accessibility checks

• Responsive behavior handled systematically through tokens

• System prevents violations rather than catching them

• Developers select semantic tokens—accessibility guaranteed by architecture

• Theme switching requires zero manual accessibility checks

• Responsive behavior handled systematically through tokens

• System prevents violations rather than catching them

Outcome:

Small teams need smart systems.

By building accessibility and consistency into the token architecture, we achieved enterprise-level quality with 3 people—proving you don't need more headcount, you need better infrastructure.

Key Learning

Key Learning

Key Learning

Small teams need smart systems

Small teams need smart systems

Design systems are force multipliers when you're lean. We achieved enterprise-level quality with 3 people.

Design systems are force multipliers when you're lean. We achieved enterprise-level quality with 3 people.

Automation beats documentation

Automation beats documentation

Pre-validated tokens eliminate manual checking and human error. Good systems make correct implementation easier than incorrect.

Pre-validated tokens eliminate manual checking and human error. Good systems make correct implementation easier than incorrect.

Prevention beats correction

Prevention beats correction

Building accessibility into the foundation is 10x easier than retrofitting. We saved 80+ hours by making violations architecturally impossible.

Building accessibility into the foundation is 10x easier than retrofitting. We saved 80+ hours by making violations architecturally impossible.

Technical Specifications

Technical Specifications

Technical Specifications

Technical Specifications

Token Count: 239
Architecture: Brand → Alias → Mapped → Components
Color Tokens: 90+ across Light + Contrast themes
Spacing Scale: 19 tokens (0-88px)
Typography Tokens: 30+ with responsive scaling
Radius Tokens: 14 options (0-96px)

Token Count: 239
Architecture: Brand → Alias → Mapped → Components
Color Tokens: 90+ across Light + Contrast themes
Spacing Scale: 19 tokens (0-88px)
Typography Tokens: 30+ with responsive scaling
Radius Tokens: 14 options (0-96px)

Full detailed view available on desktop