Senior Product Designer, Pickleball.com, Jan 2025 to present

A three-tier design system for a multi-app platform

A three-tier native-first design system for Pickleball.com: tokens-first foundations, a re-themed iOS HIG and Material 3 primitive library, and shared screens that scale to new native apps in weeks. Powers six web sub-products and the platform's native apps from one source of truth.

The Pickleball.com web product beside the iOS app, both composed from one shared design system
One system, the platform and the app it powers. The Pickleball.com web product and the native app, every screen built from the same tokens, primitives, and shared components.
Role
Senior Product Designer
Timeline
Jan 2025 to present
Outcome
Six web products + native apps on one system

One primitive library, two native languages

iOS · Human Interface Guidelines Material 3
  • Buttons
    Buttons, iOS
    Buttons, Material 3
  • Navigation
    Navigation, iOS
    Navigation, Material 3
  • Segmented
    Segmented, iOS
    Segmented, Material 3
  • Search
    Search, iOS
    Search, Material 3
The same component identity, themed once and rendered in each platform's own grammar. This is tier one of the system.

Context

Pickleball.com launched in October 2022 as the central digital hub for the sport. The platform unifies six sub-products under one front door: tournaments, leagues, team leagues, clubs, brackets, and world rankings. Each sub-product carries its own brand identity and color signature. Each was built on its own timeline. Players, league organizers, and tournament directors all move between them, often the same person in the same week.

  • Pickleball.com logo
  • Pickleball Tournaments logo
  • Pickleball Leagues logo
  • Pickleball Team Leagues logo
  • Pickleball Clubs logo
  • World Pickleball Rankings logo
Six sub-products, six brand signatures, one platform.

Problem

Six sub-products, no shared design language. Each surface (tournaments, team leagues, ladder leagues, admin manage flows) had its own conventions, its own components, its own logic. Users moving between them had to relearn the product each time. There was no source of truth, and nothing engineering could build against without rebuilding patterns from scratch. The roadmap made it worse: the platform was committing to multiple native apps over time, and a system that could not scale past one app would collapse the moment the second one started.

I pitched native-first as the way out. Build the system once, ship it on web as a unification layer, and structure it so new native apps inherit it instead of reinventing it. The constraint was strict: the system had to absorb the existing surfaces without halting feature work, hold up across web and two new native platforms, and theme cleanly per sub-product without forking the foundation.

Approach

Build the system atomically, tokens first

I built atomically, tokens first. Color, type, spacing, motion as the foundation. Atoms (buttons, inputs, badges) above them. Molecules (form rows, stat strips, table cells, achievement progress) above those. Organisms (toolbars, league cards, score cards, ranking cards, match-detail sheets) on top. Every component carried its full state set from the start: default, hover, active, focused, disabled, loading, error.

The foundation starts with color. Every value is a step on a contrast-checked ramp, not a one-off hex, and the brand layer themes those tokens per sub-product without forking them.

The Pickleball color token system: primary ramps for base, gray (light and dark), error, warning, success, blue, and orange, each step labeled with its value and WCAG contrast ratio
Color primitives. Contrast-checked ramps, themed per sub-product, the layer everything else is built on.

Type is part of that foundation, not a later decision. The scale is fixed once, and every surface composes from it rather than re-deciding it.

The Pickleball type system: a documented scale of display, heading, title, body, label, and caption styles with their sizes, weights, line heights, and usage notes
The type foundation. One documented scale, fixed once and composed everywhere, the same tokens-first discipline as color, spacing, and motion.

The system absorbed real product complexity in one component family. The ranking card carries brand-themed treatments per ranking organization (WPR green, DUPR navy, PPA Pro Tour navy with a different mark), ships with mobile and tablet responsive variants in the same component, and conditionally renders by user type (the Pro World Ranking card only appears for verified Pro players). Three layers of variability inside one card, manageable because the underlying tokens, layout grid, and stat-row pattern are shared.

The same approach handled cross-product theming. The native navigation bar supports six brand color signatures, one per sub-product, with the home icon swapping based on which product the user is in. One component, six themed variants, zero forks. Engineering ships once, every sub-product looks like itself.

Most design systems start at the component level and retrofit tokens later. That always breaks at the first theme change or accessibility audit. Starting with tokens meant the system could absorb new surfaces, new ranking integrations, and new conditional rules without re-deciding what “primary” meant. It also gave engineering a single place to apply contrast and spacing rules at scale.

  • WPR ranking card, green branded header, ranks for World, USA, and MN
  • DUPR ranking card, navy branded header, ID and Doubles, Singles, Skinny ratings
  • PPA Pro World ranking card, navy header with PPA Pickleball Tour mark, Doubles, Mixed, Singles
Mobile screenshot of the Getting Hot bottom sheet open, showing Jason Santerre Sr's profile and his WPR ranking card
One ranking card component, three brand-themed variants. Right: the WPR variant surfaced in product, inside the Getting Hot bottom sheet.

Harmonize one primitive library across iOS and Material 3

The foundational native decision was to not invent a cross-platform UI language. iOS uses Apple’s Human Interface Guidelines as its structural grammar; Android uses Google’s Material 3. The system imports both source kits and re-themes them once: iOS 26 Liquid Glass buttons, the native tab bar, bottom sheets, system type and gestures on one side; M3’s filled / tonal / outline / text hierarchy, M3 navigation, native search on the other. Brand lives in color, motion, and component personality. Structure stays native.

This is what makes the primitive library a system asset rather than a per-app cost. The same component identity, a button, a tab bar, a segmented control, a search field, exists in both native languages, themed from the same tokens. A native iOS button that looks like a Pickleball button still behaves like an iOS button. An M3 tonal button that uses the accent still scales focus and ripple the way Android expects. The system inherits a decade of platform-learned behavior instead of paying to reinvent it, and it inherits it once, centrally, for every downstream app.

  • Buttons

    iOS button library, Bordered Prominent / Bordered / Bordered Secondary / Borderless variants
    Material 3 button library, Filled / Tonal / Outline / Text variants
  • Bottom navigation

    iOS Liquid Glass bottom navigation, Home tab selected with a glass pill highlight
    Material 3 navigation, flat icons with a tonal pill on the active Home item
  • Segmented control

    iOS segmented control, three segments with the first selected as a lifted white card
    Material 3 segmented button, three segments with the first filled tonal-orange
  • Search

    iOS search field, magnifier left and mic right
    Material 3 search bar with leading magnifier
Toggle between iOS and Material 3. Same component identity, different native interaction language. The brand stays consistent in color and motion across both.

Structure the system in three tiers so it scales to new apps

The platform’s roadmap is to ship multiple native apps over time, not one. A single monolithic Figma file would collapse under that weight. So I structured the system in three tiers, each with its own file.

Tier one is the native primitive library. Apple’s iOS Human Interface Guidelines source kit and Google’s Material 3 source kit, imported from each company’s libraries and re-themed for Pickleball. Buttons (including iOS 26 Liquid Glass), tags, contextual menus, navigation, segmented controls, pagination, search and toolbar, app bar, bottom sheet, alerts, lists and tables, action sheets, date pickers, sliders, text fields, toggles, tabs, chips, snack bars. Every native primitive a downstream app could need, themed once.

Tier two is shared screens and global components. A global bottom navigation system, a global top bar, score cards, ranking cards, achievement cards, Getting Hot cards, news cards, invitation cards, notifications, onboarding and login flow, player search, settings, error and empty states. These live in their own file and are referenced by every native app. New app stands up, new app inherits these for free.

Tier three is the app-specific file. Each native app (Ladder Leagues, the Pickleball.com mobile app, the upcoming Tournaments app) gets its own file that composes shared screens with its own homescreen, detail flows, schedule, and admin or manager pages.

The payoff: new apps stand up in weeks, not quarters. The native primitive layer updates once per OS revision (when Apple ships iOS 27, when Google ships M4 patterns) and propagates downstream automatically. App teams stop arguing about button shape and focus on what’s actually different about their product.

  1. Tier 1

    Native primitives

    Apple's iOS Human Interface Guidelines and Google's Material 3 source kits, imported and re-themed once for the entire system.

    • Buttons (Liquid Glass + M3)
    • Bottom sheets
    • Tabs
    • Lists & tables
    • Search bars
    • Toggles
    • Chips
    • Date pickers
    • Action sheets
    • Alerts
    • Text fields
    • Snack bars
  2. Tier 2

    Shared screens and global components

    Referenced by every native app, themed by the brand layer below. New apps inherit these for free.

    • Global bottom nav
    • Global top bar
    • Score cards
    • Ranking cards
    • Achievement cards
    • Getting Hot cards
    • Onboarding
    • Player search
    • Notifications
    • Settings
  3. Tier 3

    App-specific compositions

    Each native app composes shared screens with its own homescreen, detail flows, and admin or manager pages.

    • Ladder Leagues app
    • Pickleball.com app
    • Tournaments app (in dev)
    • Future apps
Foundation first. New apps drop into tier two and three without re-deciding tier one.

One front door, six sub-products

A system is only real once it composes into the product. On web, the six sub-products sit behind one navigation, one type and color foundation, and one component set, themed per sub-product rather than forked. The unification the platform was built to deliver is the thing a visitor actually lands on.

pickleball.com
The Pickleball.com public web home: one global navigation (News, Schedule, Players, Watch, Rankings, Results, Shop), a live PPA Tour scores ticker, featured coverage, and the sub-product rail, all composed from the shared system
The system, composed into the live public product. Six sub-products, one front door.
pickleball.com
The global navigation mega-menu open, the six sub-product brand marks in the rail and one unified menu structure across all of them
One global navigation across all six sub-products. One component, six themed contexts, zero forks, the same discipline that holds the native primitive layer together.

Outcome

By the end of the year the system was powering six web sub-products and the platform’s native apps (Ladder Leagues and the Pickleball.com app, on iOS and Android), with the next ones scaffolded in development. It composes one platform at real scale.

0+

Monthly active users on the platform the system powers

40%
Faster design-to-development handoff
6
Sub-products unified on one system
0
Forks of the token foundation

System adoption across product teams was high, and engineering ship velocity improved measurably once teams started composing from the shared component library instead of rebuilding patterns per surface. Qualitative feedback from league organizers and tournament directors flagged the consistency of flows across surfaces as a noticeable improvement, often surfaced in onboarding sessions before being asked.

How that system became two shipped native apps, and where mobile pulled the roadmap forward, is its own story: Shipping native on iOS and Material 3.

Reflection

What surprised me: cross-platform parity turned out to be an accessibility problem in disguise. Web and native share the same logic and intent, but accessibility forces different paths to the same action. The same task that takes one keyboard combo on web might require a different gesture, timing, or focus order on iOS to be reachable for assistive tech. Designing accessibility into the token and component layer, as the bridge between platforms rather than a polish pass at the end, is what kept the surfaces feeling like one product instead of three coincidentally similar ones.

A real tension I navigated: the constant pull to fork the foundation per sub-product. Six brand signatures and three ranking integrations each made a reasonable case for “just this once.” Holding the line, one token foundation, themed variants instead of forks, was the single decision the system’s longevity depended on, and the one that needed defending most often.