Design Systems

Two design systems, each built inside the product it served.

Fittra’s runs a live app on iOS and Android. COCA’s runs a list of therapists that works on any screen. In both, parts were built from real screens when the product needed them. Both were checked against WCAG 2.1 AA.

Featured Case Study

Fittra Wellness · 2025 - Present

Fittra: a shipped design system on iOS and Android

Zero-to-one component library for a live wellness app, built alongside the product in Figma and carried through to shipped code. Designed and built solo with AI-assisted tooling, shipped to iOS and Android via Capacitor, on a tokenized foundation covering color, typography, spacing, dark mode, and WCAG 2.1 AA accessibility patterns.

  • Angular
  • Capacitor
  • Tokens
  • Dark Mode
  • WCAG 2.1 AA
  • iOS
  • Android
Fittra onboarding screen built on the design system

Brief

Fittra needed a design system that could support a full wellness product shipping to iOS and Android on day one, without the team ever stopping to refactor color or spacing later. Visual consistency and dark-mode support were table stakes; handoff speed and accessibility were the real goals.

Approach

Built a three-tier token architecture; primitives, semantic, component that were consolidated into a single source of truth fittra-design-system.css, with a thin theme-refined.css layer that re-maps the semantic set to shift the product's entire surface without touching a component. Components were designed in Figma and implemented in Angular alongside the product, so every component earned its place by solving a real screen need first.

What shipped

27 reusable components powering 23 screens across iOS and Android, backed by 833 design tokens and a dedicated WCAG 2.1 AA accessibility layer (focus-visible indicators, reduced-motion support). Dark mode is its own mapped token set.

27 Reusable components
833 Design tokens
23 Screens built on the system

The token count reflects a tiered structure rather than a flat list: primitive tokens define the raw values, semantic tokens map them to intent, and component tokens bind intent to specific components. That layering is what makes dark mode and cross-platform theming a change in one place instead of twenty-four.

Direction

Why the system looks this way

Early versions of Fittra were loud: hot pink on soft blue, illustrated widgets, a big greeting. In testing, most people wanted to see why the AI was recommending something. So the visual language stepped back to let the reasoning lead, and the system added three things:

  • Neutral ink for actions, with rose as the one brand color
  • The triggering signal and a priority label on every recommendation
  • A second typeface, used only for the coach’s voice

Themes

One system, two themes

The same Coach screen in light and dark. Dark mode uses a warm near-black (#0e0f10) instead of pure black, with raised cards in charcoal. Both themes come from the same semantic tokens, remapped in theme-refined.css, and ship on iOS and Android.

Fittra Coach screen in light mode: a Recovery, high priority recommendation titled Swap Intervals for an Easy Zone 2 Session, the reason naming a resting heart rate up 5 bpm, an explanation with a From 1 source link, and Not for me today, Make it a goal and Done actions
Light
The same Coach screen in dark mode, on a near-black background with a charcoal card and a light Done button
Dark

Demo data.

Typography

Two voices

The app’s labels, chips, controls and numbers use the system sans, with rounded headings for warmth. The coach’s own sentences switch to Newsreader, a serif built for reading on screens. The split mirrors the product: the numbers, and the voice that interprets them.

The app · SF Pro Rounded headings on iOS, Nunito on Android

Today’s Focus

Sleep 7h 20m · Steps 8,542 · Resting HR 69

The coach · Newsreader

Swap intervals for an easy Zone 2 session

Your resting heart rate is up 5 bpm on your 14-day average. Move today’s intervals to Thursday.

Accessibility

WCAG 2.1 AA, checked on the shipped build

Fittra ships with a dedicated wcag-focus.css layer for enhanced focus indicators, and animation across the app respects prefers-reduced-motion. 20 of its 27 shared components carry explicit ARIA attributes and 13 use semantic role= values. An axe audit of the shipped build across 15 production routes, in both light and dark mode, returns zero WCAG 2.1 A/AA violations; the same build was walked by keyboard and with VoiceOver.

/* Global focus styles for all interactive elements - WCAG 2.1 AA */
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible,
a:focus-visible {
  outline: 3px solid var(--focus-brand) !important;
  outline-offset: 2px !important;
  box-shadow: 0 0 0 1px var(--surface-primary),
              0 0 0 5px var(--focus-brand) !important;
}

/* Enhanced focus for buttons - WCAG 2.1 AA */
.create-goal-btn:focus-visible,
.action-btn:focus-visible,
.submit-button:focus-visible {
  outline: 3px solid var(--focus-brand) !important;
  outline-offset: 2px !important;
  transform: translateY(-1px) !important;
  box-shadow: 0 0 0 1px var(--surface-primary),
              0 0 0 5px var(--focus-brand),
              var(--shadow-focus) !important;
}
From wcag-focus.css · enhanced focus indicators & a11y utilities

Prior Systems

  • Central Ohio Counseling Association · 2021

    COCA Component Library

    Role · Lead designer

    Accessible, warm component library for a responsive healthcare web directory. WCAG 2.1 AA throughout, with an approachable non-clinical visual language.

Token Architecture

Real tokens from fittra-design-system.css

Tier 1 · Primitive

Raw values consolidated into a single source of truth. Never used directly in components.

  • --blue-500 = #3b82f6
  • --green-500 = #14b8a6
  • --amber-500 = #f59e0b
  • --neutral-900 = #171717

Tier 2 · Semantic

Named by purpose, not value. Components consume these. This is what makes Fittra's dark mode a mapped token set rather than overrides.

  • --text-primary → neutral-900
  • --bg-subtle → neutral-50
  • --brand-primary → blue-500
  • --success → green-500

Tier 3 · Component

Scoped to specific components. Built from semantic tokens so component-level theming stays surgical.

  • --bg-brand → brand-primary
  • --surface-primary → bg-subtle
  • --focus-ring → brand-primary
  • --bg-warning → amber-500

The systems are easier to judge in the products they built.

Every system on this page exists because a product needed it. The Fittra and COCA case studies show what the tokens and components made possible: two platforms from one person, and an accessible directory that replaced a Word document.

See the products