Managing and maintaining StyleSeat’s design systems

Creating and owning StyleSeat's design system and library of screens in a centralized, easy-to-find place to promote consistency and efficiency.

Background

Elevating StyleSeat’s design system

At StyleSeat, I recognized an opportunity to elevate the design team's workflow. The inherited pattern library was missing shared patterns and templates, and components were regularly un-linked to adjust content and size.

I created Layer and text styles and architected each component to support multiple states, size and responsive variants, ensuring they can scale, show and hide elements, adjust content, and resize without breaking. This ensured that updates to base level components cascaded automatically through Figma, eliminating manual rework.

The system became a single source of truth, promoting consistency across the product and significantly streamlining the team's design process.

StyleSeat · Base Components

Color

Eight families, each running 050 to 900. The step is what carries the meaning: 700 is where anything interactive lives, 900 and 600 are text, 200 draws the lines, and the 100s are the fills sitting behind them. Components reference the step, never the hex.

PrimaryPurple 700#3313B3
AccentNeon 300#CDF545
NeutralText, surfaces, and lines. Runs from white at 000 to ink at 900.
000#FFFFFF
050#F9F9F9
100#F2F1F0
200#E8E8E8
300#C2C2C2
400#9B9B9B
500#757575
600#494948
700#323231
800#1F1E1E
900#121111
PurpleThe brand primary. 700 is the step everything else is measured against.
050#FBF9FF
100#F7F4FF
200#E0DBFF
300#CEC2FF
400#A896F0
500#836AE9
600#5A3DCE
700#3313B3
800#25108A
900#1C0D55
NeonThe accent. Highlights and brand moments, never a button fill.
300#CDF545
400#C6F23D
500#A2C42D
600#7A9224
GreenSuccess, incentives, and discounts.
050#FBFFF3
100#F2FFD9
200#D5F1AA
300#B9E57B
400#7DB954
500#4C8D36
600#1F5829
700#00331D
800#002E1B
900#002918
BlueInformational states and secondary actions.
050#F9FBFF
100#ECF2FF
200#D8E4FF
300#C2D5FF
400#7D9FF4
500#4A75E9
600#2F5ACE
700#143FB2
800#002A8D
900#001F73
RedErrors and actions that cannot be undone.
050#FFF8F8
100#FFF1F1
200#FFC4C4
300#FF9494
400#FF7B7B
500#FF6363
600#F54747
700#F02C2C
800#A11E1E
900#730000
OrangeTime-sensitive states, like a booking about to expire.
050#FFF7F2
100#FFF0E8
200#FFDECB
400#F6B591
700#F25700
YellowWarnings and things that need a second look.
050#FFFDEE
100#FFFBE8
200#FFF6CB
400#F6E591
600#F2C900

* proposed token, not yet adopted in the system.

A live slice of the real system — click through the sections on the left. Every value is the actual StyleSeat token.

Components

Crafting components for design and engineering

Pinning and resizing

For each component in the Figma library, pinning and auto-layout are set up correctly to allow for easy re-sizing, content updates, and swapping between instances.

Variants and properties

Variants and properties are set up to handle responsive versions of components, as well as the ability to hide or manipulate content. These are set up to be 1:1 with the variables developers use in React.

Documentation

Each component has a brief description, rules for usage if applicable, and a link to its corresponding component in Storybook for easy development.

Tokens

Designing and implementing a token system

Building stakeholder alignment

One of the main things StyleSeat lacked when I started is a token system for managing color usage and consistency across the app. There was no formal usage for background colors, type etc.

Building the design token system in Figma is one thing, but getting development resources for something without direct tie to revenue is always a struggle. I pitched the build as a means to save development time, and easily update colors for any future rebrands, and ensuring developers use correct tokens in order to reduce color adjustments during design reviews.

A small tiger team was formed to implement and update the existing codebase, with the goal to remove all raw hex values from the app.

Defining the tokens

The tokens were defined in three stages, and then presented to the engineers for review.

  1. Primitive tokens: Raw hexes and values for Color, Spacing and Border Radius
  2. Semantic: Role based tokens, for background colors, text colors, Icons, borders etc. linked back to the primitive tokens
  3. Component: Specific tokens for individual components linked to their semantic roles
Tokens · styleseat

colors/neutral

TokenValue
colors/neutral/000#FFFFFF
colors/neutral/050#F9F9F9
colors/neutral/proposed: 100proposed#F2F1F0
colors/neutral/200#E8E8E8
colors/neutral/300#C2C2C2
colors/neutral/proposed: 400proposed#9B9B9B
colors/neutral/500#757575
colors/neutral/600#494948
colors/neutral/proposed 700proposed#323231
colors/neutral/800#1F1E1E
colors/neutral/900#121111
colors/neutral/white opacity/10#FFFFFF1A
colors/neutral/white opacity/20#FFFFFF33
colors/neutral/white opacity/30#FFFFFF4D
colors/neutral/white opacity/40#FFFFFF66
colors/neutral/white opacity/50#FFFFFF80
colors/neutral/white opacity/60#FFFFFF99
colors/neutral/white opacity/70#FFFFFFB2
colors/neutral/white opacity/80#FFFFFFCC
colors/neutral/white opacity/90#FFFFFFE5
colors/neutral/black opacity/10#1211111A
colors/neutral/black opacity/20#12111133
colors/neutral/black opacity/30#1211114D
colors/neutral/black opacity/40#12111166
colors/neutral/black opacity/50#12111180
colors/neutral/black opacity/60#12111199
colors/neutral/black opacity/70#121111B2
colors/neutral/black opacity/80#121111CC
colors/neutral/black opacity/90#121111E5

colors/purple

TokenValue
colors/purple/proposed: 050proposed#FBF9FF
colors/purple/100#F7F4FF
colors/purple/proposed: 200proposed#E0DBFF
colors/purple/300#CEC2FF
colors/purple/proposed: 400proposed#A896F0
colors/purple/500#836AE9
colors/purple/proposed: 600proposed#5A3DCE
colors/purple/700#3313B3
colors/purple/proposed: 800proposed#25108A
colors/purple/900#1C0D55
colors/purple/purple 700 opacity/10#3313B31A
colors/purple/purple 700 opacity/20#3313B333
colors/purple/purple 700 opacity/30#3313B34D
colors/purple/purple 700 opacity/40#3313B366
colors/purple/purple 700 opacity/50#3313B380
colors/purple/purple 700 opacity/60#3313B399
colors/purple/purple 700 opacity/70#3313B3B2
colors/purple/purple 700 opacity/80#3313B3CC
colors/purple/purple 700 opacity/90#3313B3E5

colors/neon

TokenValue
colors/neon/300#CDF545
colors/neon/400#C6F23D
colors/neon/500#A2C42D
colors/neon/600#7A9224

colors/green

TokenValue
colors/green/050#FBFFF3
colors/green/100#F2FFD9
colors/green/proposed: 200proposed#D5F1AA
colors/green/300#B9E57B
colors/green/proposed: 400proposed#7DB954
colors/green/500#4C8D36
colors/green/proposed: 600proposed#1F5829
colors/green/proposed: 700proposed#00331D
colors/green/800#002E1B
colors/green/900#002918
colors/green/dark green opacity/10#0029181A
colors/green/dark green opacity/20#00291833
colors/green/dark green opacity/30#0029184D
colors/green/dark green opacity/40#00291866
colors/green/dark green opacity/50#00291880
colors/green/dark green opacity/60#00291899
colors/green/dark green opacity/70#002918B2
colors/green/dark green opacity/80#002918CC
colors/green/dark green opacity/90#002918E5

colors/blue

TokenValue
colors/blue/proposed: 050proposed#F9FBFF
colors/blue/100#ECF2FF
colors/blue/proposed: 200proposed#D8E4FF
colors/blue/300#C2D5FF
colors/blue/proposed: 400proposed#7D9FF4
colors/blue/500#4A75E9
colors/blue/proposed: 600proposed#2F5ACE
colors/blue/700#143FB2
colors/blue/proposed: 800proposed#002A8D
colors/blue/900#001F73

colors/red

TokenValue
colors/red/proposed: 050proposed#FFF8F8
colors/red/100#FFF1F1
colors/red/200#FFC4C4
colors/red/proposed: 300proposed#FF9494
colors/red/proposed: 400proposed#FF7B7B
colors/red/500#FF6363
colors/red/proposed: 600proposed#F54747
colors/red/700#F02C2C
colors/red/proposed: 800proposed#A11E1E
colors/red/900#730000

colors/orange

TokenValue
colors/orange/proposed: 050proposed#FFF7F2
colors/orange/100#FFF0E8
colors/orange/200#FFDECB
colors/orange/400#F6B591
colors/orange/700#F25700

colors/yellow

TokenValue
colors/yellow/proposed: 050proposed#FFFDEE
colors/yellow/100#FFFBE8
colors/yellow/200#FFF6CB
colors/yellow/400#F6E591
colors/yellow/600#F2C900

border radius

TokenValue
border radius/00px
border radius/22px
border radius/44px
border radius/88px
border radius/1616px
border radius/2424px
border radius/3232px
border radius/4040px
border radius/4848px
border radius/full9999px

spacing

TokenValue
spacing/size-00px
spacing/size-44px
spacing/size-88px
spacing/size-1212px
spacing/size-1616px
spacing/size-2020px
spacing/size-2424px
spacing/size-3232px
spacing/size-4040px
spacing/size-4848px
spacing/size-5656px
spacing/size-6464px
spacing/size-7272px
spacing/size-8080px
spacing/size-8888px
spacing/size-9696px
spacing/size-104104px
spacing/size-112112px
spacing/size-120120px

Primitive, semantic, and component tokens, exactly as they resolve in Figma. Click an alias pill to jump to the token it points to.

Maintenance

Maintaining the library

What gets promoted

Contribution is open and encouraged. New patterns start in the feature file where they're needed, then get promoted to the base library once they prove useful beyond that feature — a button with a dropdown, a chart type, or anything with a clear second use. Review happens at promotion, not creation, so experimentation stays lightweight and governance kicks in only when a shared dependency is actually being introduced. Most of the promotion work is normalization: aligning the contribution with the conventions the rest of the library already follows.

Updating a component in use

Updating shared components is the harder case — a single change can ripple across every screen that uses it, and nothing in the component file alone tells you who's affected. Chromatic makes that blast radius visible by snapshotting every render across the product. I review the visual diffs, flag what needs attention, and fix any regressions before publishing the update.

The Figma side

Figma has no equivalent check, and its update model makes one harder to build: publishing offers a change rather than applying it, so a design library never has one coordinated migration, it has as many as it has consuming files. The leverage is at the entry requirement instead. Pinned, auto layout, scalable, or it does not go in, which is what makes an update behave the same way in every file that eventually takes it.

Deprecation

Deprecated components stay in place, labelled, beside their replacement, so anyone still on one can move on their own schedule rather than finding it gone.

Keep reading

  • Process

    Pioneering design to development with AI

    Read more
  • Case studyPassword protected

    Optimizing stylist profiles to increase new client booking rates

    View project
  • Case study

    Increasing rebooking rates with client loyalty programs

    View project
  • Case studyPassword protected

    Increasing appointment completion rates with intake forms

    View project