From research and planning to creating and implementing.
Results

Company
PeachPay
Time frame
2 months
Role
Lead product designer, UI Design, Design systems, UX Engineering
Overview
As PeachPay grows, maintaining a consistent design across its products is crucial. Upon joining, I noticed the absence of a design system, prompting me to establish one with design tokens and smaller components like buttons. This marks the initial step in achieving a unified look, bridging the gap between design and development. Beyond enhancing user experience, it greatly improves efficiency for both designers and developers, fostering a common language between the two.
The situation
Design side

Dev side

Dev side

Dev side

The situation
Design side

Dev side

Dev side

Dev side

Current workflow
As being the only and first designer at PeachPay, the PM often gave me bigger feature tasks. Whereas for smaller UI changes (eg adding a new button), he handed them to the developer directly skipping me - the designer. I noticed that this caused developers to often create new buttons adding to the problem.

The problem

The Goal
Create consistency
With the new system, we should be able to create consistency within all the designs and code. It needs to help developers create consistent UI, even if the PM gives them a task without design.
Scalable, reusable, & flexible
Make a system that can be easy to update & change later on (eg. primary color change), and can also accomondate slightly different design elements without much effort.
Reduce design & dev time
The solution should help reducing the time needed to design and develop features, as creating new stylings and components should be limmited.
Easy to adapt
It should be easy to integrate into our current workflow and implement it into our current designs & codebase.
Project scoping
Why?
What is not included
Research & Learning
I looked at design systems of companies like Adobe, Microsoft, and Atlassian to see what guides do they have for colors.



I looked at design systems of companies like Adobe, Microsoft, and Atlassian to see what guides do they have for colors.



Lots of the articles were by Nathan Curtis, and through one of his articles, I stumbled across the following guide:
Planning
Initially, I planned to add in like a system name and account for light and dark themes, however after talking to developers, I realized that they would make the color variable names way too long and inconvenient that developers might end up refusing to use it.

Starting design system
Base colors to start with

Some of the alias colors


Buttons relying on our color system


Note: After some deliberation, I decided NOT to create component level color variables, because it would overcomplicated our system in which it is not yet needed
UI Engineering
One challenge I met was that the frameworks and languages used on the engineering side for the main product were not component based.
1. Color variables (SCSS)
$colorPeach100: #ffefe1;
$colorPeach200: #ffdbc4;
$colorPeach300: #ffc3a6;
/* ... */
$colorBgPrimaryExtralight: $colorObsidian50;
$colorTextDefault: $colorGray900;
$colorTextHint: $colorGray700;
$colorTextContrast: $colorGray0;
/* etc. */ 2. Font variables (SCSS)
.lead1Default {
font-weight: 400;
font-size: 1.125em;
line-height: 27px;
letter-spacing: 0;
text-indent: 0;
}
.body1Default {
font-weight: 400;
font-size: 1em;
line-height: 24px;
letter-spacing: 0;
text-indent: 0;
}
.body2Default {
font-weight: 400;
font-size: 0.875em;
line-height: 21px;
letter-spacing: 0;
text-indent: 0;
}
.labelDefaultLarge {
font-weight: 400;
font-size: 1em;
line-height: 24px;
letter-spacing: 0;
text-indent: 0;
}
/*etc..*/ 3. No-component languages button styles (SCSS)
$button-sizes:
"large" 12px 24px 8px,
"medium" 8px 16px 6px,
"small" 6px 12px 4px;
.button {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
border-radius: 8px;
cursor: pointer;
text-decoration: none;
transition: all .3s;
}
$variants:
'primary'
$colorTextPrimaryDefault
$colorTextContrast
$colorBgPrimaryDefault
$colorBorderPrimaryDefault
$colorTextPrimaryInteractive
$colorBgPrimaryInteractive
$colorBorderPrimaryInteractive
$colorBgPrimaryExtralight,
'error'
$colorTextErrorDefault
$colorTextContrast
/* etc... */
@each $name,
$textDefault,
$textDefaultOnSurface,
$bgDefault,
$borderDefault,
$textInteractive,
$bgInteractive,
$borderInteractive,
$bgLight in $variants {
.button-#{$name} {
&-filled {
@each $size,
$v-padding,
$h-padding,
$gap in $button-sizes {
&-#{$size} {
@extend .button;
background-color: $bgDefault;
color: $textDefaultOnSurface;
border: 1px solid $borderDefault;
&:hover,
&:active,
&:focus {
background-color: $bgInteractive;
color: $textDefaultOnSurface;
}
svg {
fill: $textDefaultOnSurface;
}
@if $size ==large {
@include orchLabelDefaultLarge;
}
@else if $size ==medium {
@include orchLabelDefaultMedium;
}
@else if $size ==small {
@include orchLabelDefaultSmall;
}
padding: $v-padding $h-padding;
gap: $gap;
}
}
}
&-outlined {
@each $size,
$v-padding,
/*etc...*/
}
}
}
}
.fill {
width: 100%;
} UI Engineering
One challenge I met was that the frameworks and languages used on the engineering side for the main product were not component based.
1. Color variables (SCSS)
$colorPeach100: #ffefe1;
$colorPeach200: #ffdbc4;
$colorPeach300: #ffc3a6;
/* ... */
$colorBgPrimaryExtralight: $colorObsidian50;
$colorTextDefault: $colorGray900;
$colorTextHint: $colorGray700;
$colorTextContrast: $colorGray0;
/* etc. */ 2. Font variables (SCSS)
.lead1Default {
font-weight: 400;
font-size: 1.125em;
line-height: 27px;
letter-spacing: 0;
text-indent: 0;
}
.body1Default {
font-weight: 400;
font-size: 1em;
line-height: 24px;
letter-spacing: 0;
text-indent: 0;
}
.body2Default {
font-weight: 400;
font-size: 0.875em;
line-height: 21px;
letter-spacing: 0;
text-indent: 0;
}
.labelDefaultLarge {
font-weight: 400;
font-size: 1em;
line-height: 24px;
letter-spacing: 0;
text-indent: 0;
}
/*etc..*/ 3. No-component languages button styles (SCSS)
$button-sizes:
"large" 12px 24px 8px,
"medium" 8px 16px 6px,
"small" 6px 12px 4px;
.button {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
border-radius: 8px;
cursor: pointer;
text-decoration: none;
transition: all .3s;
}
$variants:
'primary'
$colorTextPrimaryDefault
$colorTextContrast
$colorBgPrimaryDefault
$colorBorderPrimaryDefault
$colorTextPrimaryInteractive
$colorBgPrimaryInteractive
$colorBorderPrimaryInteractive
$colorBgPrimaryExtralight,
'error'
$colorTextErrorDefault
$colorTextContrast
/* etc... */
@each $name,
$textDefault,
$textDefaultOnSurface,
$bgDefault,
$borderDefault,
$textInteractive,
$bgInteractive,
$borderInteractive,
$bgLight in $variants {
.button-#{$name} {
&-filled {
@each $size,
$v-padding,
$h-padding,
$gap in $button-sizes {
&-#{$size} {
@extend .button;
background-color: $bgDefault;
color: $textDefaultOnSurface;
border: 1px solid $borderDefault;
&:hover,
&:active,
&:focus {
background-color: $bgInteractive;
color: $textDefaultOnSurface;
}
svg {
fill: $textDefaultOnSurface;
}
@if $size ==large {
@include orchLabelDefaultLarge;
}
@else if $size ==medium {
@include orchLabelDefaultMedium;
}
@else if $size ==small {
@include orchLabelDefaultSmall;
}
padding: $v-padding $h-padding;
gap: $gap;
}
}
}
&-outlined {
@each $size,
$v-padding,
/*etc...*/
}
}
}
}
.fill {
width: 100%;
} Getting it to the developers
One challenge I met was that the frameworks and languages used on the engineering side for the main product were no component based.
Gave a presentation to engineers as an introduction
Social mobile app helping people discover nearby places and connect with others

Button API
Social mobile app helping people discover nearby places and connect with others

Code example
Social mobile app helping people discover nearby places and connect with others

Guidelines
Social mobile app helping people discover nearby places and connect with others

Getting it to the developers
One challenge I met was that the frameworks and languages used on the engineering side for the main product were no component based.
Gave a presentation to engineers as an introduction
Social mobile app helping people discover nearby places and connect with others

Button API
Social mobile app helping people discover nearby places and connect with others

Code example
Social mobile app helping people discover nearby places and connect with others

Guidelines
Social mobile app helping people discover nearby places and connect with others

Impact
Defining our most used elements, colors and buttons, have improved production time drastically. Later in the year, we also ended up changing our colors around, and updating that was really easy, both on the design and development sides.

Improved consistency even if developers needed a button without design
Scalable & flexible as later on we found it easy to change primary colors
Reduced time for both frontend development and prototyping by 30%
Easy to adapt as the first push of the design system was kept small to help adjusting to it
Next steps
