Building a design system from the ground up at Edda

Why we needed a design system

When I joined Edda as a designer, I quickly noticed we had a very loose system that was leading to a lot of inconsistencies in our apps. Designers were creating similar components from scratch for every project, engineers were writing duplicate CSS, and our product was starting to feel disjointed across different features. I saw the opportunity to build something better. We needed a design system that would:

Reduce inconsistency across our web apps
Speed up design and development by reusing components
Improve collaboration between designers and engineers
Create a better experience for our users through consistency

I pitched the idea to leadership, got buy-in, and started working on it.

1. Audit

I started by doing a full audit of our web apps to understand what we had. I went through colours, lots of screens, cataloging components, patterns, and styles. I captured atoms and molecules—buttons, inputs, typography, spacing, colors—and identified which components were actually being used and which ones could be deprecated.

(Image of video of the audits here)

2. Base styles definition and primitive layer tokenization

Once I had observed and documented the foundations of our web apps design, I made a comparison with our branding elements to decide which ones to keep and which ones to remove.

At the end of the day, design systems are just branding, right?!

I then proceeded to create a tokenization system for our most foundational elements: colors, spacing and fonts. At this stage only our Primitive tokens were created in Figma, as seen below.

I also ran accessibility tests to work out what colour combinations between background colours and font colours would work in order for our web apps to be accessible. For added complexity, I needed to consider the different states that UI elements can have: disabled, rest, errors and more. To do this, I made use of the Contrast Figma plugin where I measured each of the different samples.

This first layer of tokenization was essential groundwork to then lay down the second and most important layer: the semantic layer.

Base colors

color-white-100 #FFFFFF
emerald-100 #17403E
malachite-80 #5CDD98
yellow-40 #F7E96C
earth-50 #D1DED3
ultramarine-100 #5647F8
sienna-100 #E1C7B2
gray-100 #0E2524

Extended colors

white-100 #FFFFFF
white-20 #FFFFFF 20%
emerald-100 #17403E
emerald-80 #246662
emerald-50 #4A8C89
emerald-20 #A8C9C8
emerald-10 #E2EEED
malachite-100 #28BE6E
malachite-80 #5CDD98
malachite-50 #8DE8B8
malachite-20 #C6F4DB
malachite-10 #E4FFF0
yellow-100 #E8C103
yellow-80 #F0D234
yellow-50 #F7E96C
yellow-20 #FBF3A8
yellow-10 #FFFBD9
earth-100 #7A9E7F
earth-80 #A0BDA4
earth-50 #D1DED3
earth-20 #E3EBE4
earth-10 #EBF1EC
ultramarine-100 #5647F8
ultramarine-80 #7B6FF9
ultramarine-50 #A9A0FB
ultramarine-20 #CDC3EF
ultramarine-10 #E2E7FF
sienna-100 #C4A68E
sienna-80 #E1C7B2
sienna-50 #EBD9CA
sienna-20 #F3E8DE
sienna-10 #F9F3EE
lightblue-100 #7BA3CC
lightblue-80 #B1C5E1
lightblue-50 #CFDAEB
lightblue-20 #E3ECF5
lightblue-10 #F3F6FF
red-100 #E53935
red-80 #FF6161
red-50 #FF8A8A
red-20 #FFE9EA
red-10 #FFF5F6
gray-100 #0E2524
gray-70 #617B7A
gray-50 #799594
gray-40 #A5B4B3
gray-20 #D3DBDA
gray-10 #E8ECEC
gray-8 #F0F2F2
gray-5 #F8F9F9

Accessibility tests using the Contrast plugin

3. Semantic layer tokenization

With the primitive tokens and accessibility tests in place, I moved on to creating the semantic layer — the layer that gives meaning to our tokens.

Instead of using emerald-100 directly, designers and engineers would now use tokens like color-background-primary or color-text-error. This abstraction meant that:

  • Tokens communicate intent, not just values
  • We could swap out entire colour themes without touching component code
  • New team members could understand the system faster

This was the most complex part of the process, but also the most valuable. The semantic layer is what turns a collection of styles into an actual system.

Semantic layer tokenization within the Figma variables window

4. Rebuilding components in Figma

I re-created Figma components using tokens I just created and common patterns. Every component was built with variants, proper auto-layout using spacing tokens, and clear naming conventions. I made sure components were flexible enough to handle different use cases but opinionated enough to maintain consistency.

Component in our design system with properties and tokens applied

5. Documenting our tokens, design decisions and components

I then proceeded to document the token hierarchy and categorization I had created for the whole team to read and reference.

The components documentation took slightly longer, since I had to go through each variation in the webapp to document the correct usage of it.

Token hierarchy showing raw values flowing to primitive tokens, semantic tokens, and component-specific layers
Surface tokens showing primary and dark background variations with text hierarchy

6. Training and governance

I pushed the system live, trained the designers on how to use it, and created a governance process for it. We established:

  • Design system sessions where designers could ask questions or propose changes to our components
  • A contribution process for proposing new components

The goal was to make sure everyone knew how to use the system and felt ownership over it.

7. Implementation with engineering

I worked closely with the dev team to implement the tokenization system in code. We aligned on CSS variables and design system tokens, making sure that what designers saw in Figma matched what engineers built in React.

I also supervised the creation of new components, reviewing both design and code to make sure everything met our standards. It was a lot of back-and-forth at first, but once we got into a rhythm it became much smoother.

8. Optimized handoff

Finally, I optimized our design handoff processes. Before, designers were either creating long documentation explaining their designs to engineers, or sometimes nothing at all! Now, with the design system in place, handoff became much simpler:

  • Designers link to components in the design system
  • Engineers know exactly which React component to use
  • Fewer questions, fewer meetings, faster shipping

This also meant that if we ever needed to change our primary color, we could update one token instead of hunting through dozens of files.

9. Next steps

The next phase for GAÏA is documenting everything in Storybook. This will give engineers a living, interactive reference for all our components — with code examples, props documentation, and visual states all in one place.

We're also building a website to have components documentation available for the team to look at, including do's and don'ts for each component to ensure consistent usage across the product.

Results

The design system has been a huge success:

  • Design time reduced, since Designers can now build screens in hours instead of days
  • Development time reduced - Engineers spend less time styling and more time on logic
  • Consistency across the product - Our web apps now feel cohesive and professional

Thanks for reading!

Back to top