Case Study · WS Audiology · 2023 to 2026

Multi-brand design system

Design System Lead · iOS & Android · Supported 5 teams, 14 brands & white label app

Design Systems Design Tokens Multi-brand Theming Component Architecture Cross-Platform Light & Dark Mode RTL Support Accessibility Figma
Button
Button
Toggle
Toggle
Input Field
Input field
Dialog
Dialog
Bottom Sheet
Bottom sheet
Equalizer
Equalizer
Core components shipped to production

When WS Audiology set out to build a new hearing care app, engineering proposed reusing the skinning engine from the previous product, a code-only theming layer with no design counterpart. I pushed back and made the case for a proper token-based design system.

25+
Components shipped
5
Engineering teams
14+
Brand expressions

System designer

Sole system designer. Collaborated with feature designers, engineering, product, and brand teams across the full lifecycle.

What I owned

  • Token architecture
  • Theming system
  • Component specs
  • RTL layout rules
  • Accessibility annotation system
  • Engineering handoff
  • QA

Who I worked with

  • 5 engineering teams (iOS & Android native)
  • Product and brand teams
  • Token Studio to JSON to AzureDevOps pipeline (co-designed with engineering)
  • Feature designers (component and token requests, scoping new additions to the system)

The accessibility annotation system I established was adopted by all 10 designers on the WSA design team.

A skinning engine with no design counterpart

The previous app had significant structural limitations. When the team decided to build a new app from scratch, engineering proposed reusing the skinning engine from the old product. The problem: the skinning engine only ran in code. There was no design counterpart.

That meant as designers, we had no way to see or address brand changes, or to understand how elements would interact with each other in different brand contexts. Engineering wanted to keep the skinning engine because it was already built. We said no.

The new app needed to support

Multiple brands Dark mode RTL markets WCAG

The system had to be designed and built while features were already in flight. Architecture decisions couldn't wait for a clean start.

Three layers, one source of truth

Built in Token Studio. Each layer has a specific job, and the separation is what makes the whole thing composable across brands without touching components.

Layer What it holds Example
01 Core
Brand-namespaced. Maps literal values (e.g. #7000FF) to brand identity.
brand.blue.500
02 Semantic
Intent-based names. Decoupled from any specific brand.
semantic.bg.accent.default
03 Component
Component-scoped decisions. Final consumption layer.
button.filled.primary.bg.enabled

Three layers of abstraction · Literal values, semantic intent, component usage · Brand changes never touch component code

Token Studio to code

Token Studio exported tokens as structured JSON, synced via AzureDevOps and consumed directly by iOS and Android native codebases. Design and engineering agreed on naming conventions, file structure, and the sync pipeline from the start.

One component set supporting many brands

The system supports three tiers of brand specificity: main brands with full visual identities, private labels with brand colors and partial customisation, and a white label with no brand specificity at all. The same 25+ components render differently per brand, without duplicating component files.

Token Vanilla Brand 1 Brand 2 Brand 3
Primary color
Blue
Red
Yellow
Teal
Corner radius
radius.2x · 8px
radius.999x · pill
radius.1x · 4px
radius.0x · 0px
Typography Noto Sans Noto Sans Noto Sans Montserrat + Noto Sans
Mode Light / Dark Light / Dark Dark only* Light / Dark

Same component set, four brand expressions · Primary color, corner radius and typography from token files alone

*Light mode was fully built in the system but not shipped, a brand decision, not a technical one. The token structure fully supports it; switching is a token file swap, not a redesign.

Vanilla: blue primary, Noto Sans, 8px radius, light mode
Vanilla
Brand 1: red primary, Noto Sans, pill radius, light mode
Brand 1
Brand 2: yellow primary, Noto Sans, 4px radius, dark mode
Brand 2
Brand 3: teal primary, Montserrat, 0px radius, light mode
Brand 3

25+ components shipped to production

Every component connects directly to the component layer in the token system, specced with all states, properties, token annotations, iOS and Android variant notes, and VoiceOver and TalkBack read-order annotations.

Components include: buttons, dialogs, bottom sheets, modal drawers, switch and toggle, volume sliders, equalizer controls, input fields, selection lists, country and language pickers, notifications, progress bars, loading states, tab bar with multi-brand icon variants, navigation bar, progress stepper, cards, chat bubbles, list items, and hearing aid status cards.

To name a few of the important ones:

Component library
Default Balanced for everyday listening
The Equalizer
Hearing science as component variants

The design challenge was making audio tuning legible to someone who isn't an audiologist, while staying accurate enough that hearing care professionals would trust it.

The component needed to hold both the interactive EQ controls and the preset selector in a single unit, and remain composable enough to be slotted into the bottom sheet without breaking its internal layout across LTR and RTL.

Directional Focus Wheel
Spatial audio with animation states

The component also had animation states: the wheel needed to transition between focus directions in a way that communicated spatial movement. Building animation into the component set meant defining every transition state as a discrete variant, so engineering had a clear spec for every keyframe rather than an implied interpolation. The range of positions, from concrete directions like Front and Back to abstract adaptive modes like None (Adapting), meant the visual design had to hold across very different semantic meanings without the icons losing meaning.

Adapting Adapting to environment
Bottom sheet shell component showing the header, description, and two content slot areas
The Bottom Sheet
A shell component with a content slot

The bottom sheet is a shell: Sheet header, Content container, and Additional actions. The content container is a slot that accepts different content types as swappable component instances rather than duplicating the sheet for each use case.

Volume Program change Equalizer Directional focus

This kept the bottom sheet as one maintained component instead of four diverging versions, and each slot became cleaner, more portable, and reusable in other contexts outside the sheet.

RTL support built in from day one

Arabic and Hebrew markets were in scope from day one, so:

  • LTR and RTL states specced side-by-side as a single Figma component property
  • Directional icons and language switcher positions flagged for mirroring
  • String translation handled separately via the Phrase plugin, keeping layout logic and localisation decoupled
  • Engineering received a single handoff artifact covering both directions, eliminating a separate design pass per feature
Component in left-to-right layout
LTR
Component in right-to-left layout
RTL
Figma component properties panel showing RTL toggle
RTL built as a component property in Figma

Accessibility built in

Our primary users are elderly people, often experiencing age-related hearing and vision loss, so accessibility was the baseline.

What was built in

  • Color contrast verified at WCAG 2.1 across every component state
  • Touch targets enforced at minimum 44×44pt
  • No state relies on color alone: every state includes a secondary signal (icon, label, or pattern)
  • Figma annotation layer for VoiceOver and TalkBack read-order, later adopted as the standard by all 10 designers on the WSA design team
  • Haptic feedback documented for iOS and Android in specified components
Table showing VoiceOver and TalkBack screen reader strings per component state
Screen reader annotations · Per component state
Accessibility annotation layer · Applied to a feature screen, showing focus order and screen reader labels
Accessibility annotations · Per feature screen
Haptic feedback documentation for iOS and Android components
Haptic feedback · Documented per platform

Delivered

  • Token architecture delivered: Three-layer hierarchy built in Token Studio, consumed by 5 engineering teams on iOS and Android.
  • 25+ components shipped: Buttons, dialogs, sliders, equalizers, chat elements, notifications, cards, all token-connected.
  • Multi-brand support: Single token structure for 3 main brands, 10+ private labels, and a white label app.
  • RTL and multilanguage support. Implemented directly inside component properties.
  • Reduced handoff overhead: Engineering teams could understand component behaviour and intent without dedicated handoff sessions.
  • Consistency across features: Components had a single look and feel across the entire product.
  • Annotation system adopted team-wide: VoiceOver and TalkBack read-order approach adopted by all 10 designers on the WSA design team.
  • WCAG compliance by default. Accessibility built into components and inherited by features automatically.

What I'd do differently

Earlier engineering alignment on token naming

The naming structure I defined was logical from a design perspective, but engineering teams had their own conventions for variable naming in iOS and Android codebases. Agreeing on naming conventions earlier would have cut the rework when engineering mapped them to iOS and Android variable names.

A living documentation layer from the start

As the system grew, new contributors needed onboarding material. A Figma page or external site surfacing token values, usage examples, and do/don't guidelines per component should have been built from the start.

A design system is a communication tool. The token architecture mattered because it gave designers, engineers, and product teams a shared language for decisions that would otherwise vary by feature.