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.
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.
* 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.
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.
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.
- Primitive tokens: Raw hexes and values for Color, Spacing and Border Radius
- Semantic: Role based tokens, for background colors, text colors, Icons, borders etc. linked back to the primitive tokens
- Component: Specific tokens for individual components linked to their semantic roles
colors/neutral
| Token | Value | |
|---|---|---|
| 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
| Token | Value | |
|---|---|---|
| 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
| Token | Value | |
|---|---|---|
| colors/neon/300 | #CDF545 | |
| colors/neon/400 | #C6F23D | |
| colors/neon/500 | #A2C42D | |
| colors/neon/600 | #7A9224 |
colors/green
| Token | Value | |
|---|---|---|
| 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
| Token | Value | |
|---|---|---|
| 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
| Token | Value | |
|---|---|---|
| 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
| Token | Value | |
|---|---|---|
| colors/orange/proposed: 050proposed | #FFF7F2 | |
| colors/orange/100 | #FFF0E8 | |
| colors/orange/200 | #FFDECB | |
| colors/orange/400 | #F6B591 | |
| colors/orange/700 | #F25700 |
colors/yellow
| Token | Value | |
|---|---|---|
| colors/yellow/proposed: 050proposed | #FFFDEE | |
| colors/yellow/100 | #FFFBE8 | |
| colors/yellow/200 | #FFF6CB | |
| colors/yellow/400 | #F6E591 | |
| colors/yellow/600 | #F2C900 |
border radius
| Token | Value | |
|---|---|---|
| border radius/0 | 0px | |
| border radius/2 | 2px | |
| border radius/4 | 4px | |
| border radius/8 | 8px | |
| border radius/16 | 16px | |
| border radius/24 | 24px | |
| border radius/32 | 32px | |
| border radius/40 | 40px | |
| border radius/48 | 48px | |
| border radius/full | 9999px |
spacing
| Token | Value | |
|---|---|---|
| spacing/size-0 | 0px | |
| spacing/size-4 | 4px | |
| spacing/size-8 | 8px | |
| spacing/size-12 | 12px | |
| spacing/size-16 | 16px | |
| spacing/size-20 | 20px | |
| spacing/size-24 | 24px | |
| spacing/size-32 | 32px | |
| spacing/size-40 | 40px | |
| spacing/size-48 | 48px | |
| spacing/size-56 | 56px | |
| spacing/size-64 | 64px | |
| spacing/size-72 | 72px | |
| spacing/size-80 | 80px | |
| spacing/size-88 | 88px | |
| spacing/size-96 | 96px | |
| spacing/size-104 | 104px | |
| spacing/size-112 | 112px | |
| spacing/size-120 | 120px |
Primitive, semantic, and component tokens, exactly as they resolve in Figma. Click an alias pill to jump to the token it points to.
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.




