jm
Contact

The Unison Design System

Project Overview

Platform

Figma, Web + Native Apps

The Team

Me

My Role

UX/UI Designer, Frontend Developer

Things I Did

Created a design token library + implemented it across platforms with Sass-created utility classes.

Background

Our UX and visual design language were dated. An old monolithic website with almost three decades of tangled stylesheets made updates cumbersome.

Goals

Bring our visual design language and a11y standards into the current decade.

Make it easy for my fellow developers and myself to implement these new design standards in the course of other work.

The Approach

The Big Challenge

A full horizontally sliced 'redesign' project was not practical, given the age and complexity of the monolithic website and our lean teams' other high-ROI priorities. In other words, there was no chance I was carving out sprint time for the team to tackle tasks like 'Update All Modal Styles Everywhere.' Stylesheets were too scattered and tangled, with no single source of truth to update in a scalable way.

A Lighter Touch

I did have a mandate from leadership to improve our visual design language in a way that felt more like a 'facelift' or 'refresh'. This meant targeting low-hanging design debt with a lighter touch, and doing it without disrupting other important development work. I needed a system to define the fundamentals of this new design language, and a tool to apply it easily like a coat of paint in the old codebase.

Color

Legacy

Our color palette was dated and overly semantic. Modifiers like 'on-light' and 'on-dark' appended to class names like 'marketplace-red' were too prescriptive.

$mn-blue

0272B3

$mn-blue-on-dark

00A1FF

$mn-sky

CCE3F0

$mn-sky-on-light

327DA6

$mn-green

A2BC35

$mn-green-on-light

6D7E23

$mn-red

C31E18

$mn-red-on-black

E3231C

$mn-red-on-midnight

ED706B

$mn-marketplace-red

C74C48

$mn-orange

F47D25

$mn-orange-on-light

C2570A

$mn-yellow

FFB918

$mn-yellow-on-light

9F6D00

$mn-midnight

22313F

random blue

354350

random gray

EFEFEF

random gray

252525

The Refresh

First, without straying too far from legacy brand blue, I landed on a new, more saturated version. From there, I adjusted the lightness and saturation to create a Bootstrap/Tailwind style 100-900 palette.

Next, I adjusted the hue to arrive at new green and orange accent palettes.

Finally, that same approach yielded a new set of grayscale values that contain a hint of blue, which helps background and text feel cohesive and provides a more modern and subtle palette for containers and negative space.

Why It Works

Color variable names are no longer semantic. Instead they reflect their place in the palette. This separation of concerns keeps our color variables from balooning with neach new use case.

Typography

Legacy

Too many sizes, too many weights, too much reliance on text-transforms and italics... Accessibility issues caused by text color contrast, text size, line-length, inconsistent kerning and leading... It seemed like the answer to typographic hierarchy had always been more variation, rather than better contrast.

second sketch

The Refresh

Once again relying on common UI libraries as a guide, I created a relatively simply font-stack for both the web (Proxima Nova) and the Mobile Apps (Helvetica Neue).

d4

d3

d2

d1

4xl

3xl

2xl

xl

lg

base

sm

xs

d4

d3

d2

d1

4xl

3xl

2xl

xl

lg

base

sm

xs

Why It Works

Now, we rely on visual weight created by contrasts in size, space, font-weight and opacity to create clearer typographic hierarchy. (In retrospect, I think I should have made these font-size options even more limited to ensure sufficient contrast at all times.)

Shadows

Legacy

Our shadows were heavy and often extended in all directions, undermining the illusion of a single light source.

Old shadows looked like this.

The Refresh

I created a few shadow variants in a setup that would be familiar to Tailwind/Bootstrap users.

shadow-sm

shadow

shadow-lg

shadow-xl

shadow-inset

Why It Works

They're more subtle and flexible enough to be used for hover and active state styles as well as graphic design displays.

Spacing

Legacy

Spacing values were inconsistent. This, along with the absence of CSS Grid and Flexbox often led to odd alignment of elements. Here's an example from the homepage. It's often subtle enough that most users couldn't point it out, but as designers we know that they sense the imbalance - the 'gestalt' is out of wack and it feels less trustworthy.

third sketch

The Refresh

I implemented a simple loose 8pt spacing system to make padding, margin and vertical rhythm more consistent.

third sketch

Why It Works

This is not revolutionary stuff, but just giving ourselves a few standardized spacing variables to reach for has brought more consistency to layouts - like grids with even gaps.

Corners

Legacy

Lack of border-radius on elements gave the interface a more technical and less welcoming feel.

third sketch

The Refresh

Some simple values for rounded corners were useful in tidying this up.

third sketch

Why It Works

Designers still have some discretion over when to use rounded-sm, rounded-md, rounded-lg, etc. But we're never haphazardly setting border-radius to weird values like 7 or 23 anymore.

Buttons

Legacy

Like the legacy color variables, Button classes were too opinionated and prescriptive. Styles and naming conventions placed undue emphasis on semantic usage rather than contextual hierarchy and caused the set of button styles on our platforms to balloon.

third sketch

The Refresh

I implemented some simplified, less opinionated button specs.

third sketch

Why It Works

Our buttons are more consistent and more flexible. Button text should convey information. Button styles should convey hierarchy through visual weight and placement.

Translating To Code

A Utility Class Library

I needed a relatively lightweight approach to implement these new design standards without impeding other development priorities. So I built something like a mini Tailwind with just the utility classes we'd need to apply the paint job.


/unisondesign
    /core
        _functions.scss
        _mixincs.scss
        _variables.scss
        _core.scss
    /properties
        _background.scss
        _borders.scss
        _cssgrid.scss
        _flexbox.scss
        _layout.scss
        _shadows.scss
        _spacing.scss
        _typography.scss
    main.scss

Working It In

During refinements, sprint planning and other product sessions, I kept my eye out for opportunities to implement these new visual design standards. I made an agreement with the backend devs as they worked on new features and bug fixes: 'You make it work, I'll make it pretty'.

This created space for collaboration, allowing me to checkout their branches and apply layout and styling in alignment with this new standard using these simple utility classes.

These new paint-by-numbers utility classes helped us axe hundreds of lines of old tangled CSS files and inline style tags!

Results

Legacy

Stale colors, sloppy shadows, unbalanaced layouts, poor typographic hierarchy:

third sketch

The Refresh

A more accessible, simple, consistent experience:

third sketch

Keeping Others Aligned

The codebase isn't the only place these styles are applied. Marketing, graphic design, and other vendors all need guidance too. So I put together a practical, no frills brand style guide.

Slide 1
Slide 2
Slide 3
Slide 4
Slide 5
Slide 6
Slide 7
Slide 8
Slide 9
Slide 10
Slide 11
Slide 12
Slide 13
Slide 14
Slide 15
Slide 16
Slide 17
Slide 18
Slide 19
Slide 20
Slide 21

Brand Style Guide

A practical guide to brand alignment.

Final Thoughts

In the near future, I think we'll have an opportunity to expand upon this simple design token library and begin to think more atomically about components and how they fit together. I'd love to build out the component library in Figma and in code - possibly using tools like Storybook, Knapsack, etc. For now, this was a great exercise in working within the constraints of existing design and tech debt to creating impactful change.