All work

Design System

A white-label system for the entire product, designed with future-proofing in mind.

A Design System title card reading "Components, typography, colors and variables", over three overlapping sheets from the file: the icon set, the badges, and the checkbox states.
Role
Sole Product Designer, end to end
Scope
Design system, foundations to components
Timeline
2 to 3 months
Platform
Responsive web, built on Figma variables
01Problem

An outdated product, with nothing underneath holding it together

EC Affiliates is a name changed here for confidentiality. Its interface was outdated, and there was no system underneath holding it together.

Every screen was assembled by hand, so the same button, table row and input existed in slightly different versions. Engineers had to interpret each screen on its own, and every inconsistency became a question, and often rework. The goal was a consistent design language first, and a new interface built inside it.

02Approach

Stay neutral, build accessibility in, and make it easy to maintain

Deliberately neutral

The company wanted the option to white label the product later, so the system couldn’t depend on one brand’s personality. It had to be clean, direct and quiet enough for another brand to move in.

Without a brand to lean on, I built clarity from structure: consistent spacing, contrast that holds across palettes, and components that behave the same whatever colors they use.

Accessibility, built in

I checked the interface against WCAG as I designed it, rather than auditing it afterwards.

Every color family is a full tonal ramp, so contrast is settled once by which steps sit together. On a dashboard people read numbers off, legibility is the difference between the product working and not.

Made to be maintained

I organised the file to be added to rather than admired.

Tokens are named as scales (shadow-md to shadow-3xl, numbered color steps), so they survive a rebrand, and with color held as variables a new theme is a single edit.

03Solution

Foundations, two themes, components, and screens built from them

Foundations

I built color, type, icons, spacing, shadows, grids and radius, each as its own page in the file, and each a decision made once instead of on every screen.

The type page: Outfit set as a specimen with its four weights, Regular 400 to Bold 700, beside eleven sizes from Display 2xl at 72px over 90px down to Text xs at 12px over 18px.
Three scales side by side: spacing from 2px to 32px on a 4px base unit, radius from None at 0px through MD, LG and 2XL to Full at 999px, and two shadows with the focus ring.
The color page: the brand ramp from Brand 500 at #fd3363 to its tint beside Orange 400, eight cool neutrals from Gray 900 to Surface, and the four status colors, success, warning, error and info, each with its hex value.
Status color in use: a Ban Affiliate confirmation dialog with a brand-colored Confirm button, beside five selected date items marked with primary, success, warning, danger and info bars.

Typography

Outfit, in eleven sizes and four weights, from Display 2xl at 72px to Text xs at 12px, each with its own line height.

Space, shape and depth

A 4px base unit for every gap, corners from None to Full, and two soft shadows with a focus ring for depth.

Color

One brand color on a cool neutral base, and four status colors, each with a matching background tint.

Status colors

The same status palette runs through dialogs, date items and the metric trend badges.

One set of variables, two themes

I made every color a variable, so light and dark are two modes of the same set.

A screen is designed once, and the variables decide which theme it renders in. Each is named for its job rather than its color (Title Color, Border Secondary, Background Modal) and grouped by what uses it, so one edit reaches everywhere that family appears.

The Figma variables panel: 146 variables grouped by what uses them, each row mapping a semantic name such as Title Color or Border Secondary to one color token in the Light column and a different one in the Dark column.
146 variables, each naming a job rather than a color, and each resolved twice.
The requests screen shown in both themes at once: the light theme fills the left of the frame and the dark theme the right, split by a draggable handle. Light Dark
Drag the handle. One screen, both themes: nothing moves but the palette.

Components

I designed the components to support future use cases while also covering the screens and requirements that existed at the time.

Everything was fully responsive, and I specified interactions like drag and drop in the component rather than leaving them for engineering to interpret.

The checkbox and radio sheet: every control drawn in its default, hover, focused and disabled state, at two sizes.
The button sheet: filled and outlined buttons at three sizes, with a leading icon, a trailing icon and neither, each in default, hover, focused and disabled.
The badge sheet: one badge in every color family the palette carries, at three sizes, with a leading icon, a trailing icon and neither.
The alert sheet: success, warning, error and hint messages, each shown with and without a Learn more link.

States

Checkboxes and radios in default, hover, focused and disabled, at both sizes. Focus is part of the component, not a note for later.

Buttons

Filled and outlined, at three sizes, with or without an icon, each in every state.

Badges

One badge in every color family, at three sizes. The ramp does the work, so the badge itself never changes.

Alerts

Success, warning, error and hint. An icon and a word carry the state as well as color, so it reads without telling green from red.

The system in use

I assembled the product’s screens from the library rather than drawing them one by one on each screen.

Stat cards, toggles, selects, tags, approve and reject buttons: every piece is a library component. The green change indicators are the success badge, so they agree with every other badge in the product.

The affiliate dashboard: a sidebar, an Earnings and Performance toggle, a filter row, four stat cards showing total sales, earnings, clicks and earnings per click, and a twelve-month earnings chart with a hover tooltip.
The affiliate dashboard. Stat cards, toggles, selects and badges, all straight from the library.
The requests screen: incoming affiliate requests as cards, each with an avatar, a platform tag, commission and audience details, the applicant's message, and approve and reject buttons.
Requests. The same components again, carrying a completely different job.
04Results

It shipped, and outlived the product it was built for

It was approved, implemented, and ran live for several months. When the company pivoted, several of its ideas were carried directly into the new product’s design system. The engineers said the component library made the biggest difference: building a new screen became an exercise in assembly rather than reinvention. The client described the interface as clean enough that nothing competed with the data, calling the difference “night and day.”

Have a company worth skyrocketing?

I'm open to full-time roles and looking to join a team where I can bring a decade of product design and make a meaningful impact. If you're hiring, I'd love to hear about what you're building.