The Birth of a Design System

Leading the creation of a scalable design system for a well-known brand—driving consistency, speed, and team-wide buy-in.

THE CHALLENGE

Laithwaites faced a fragmented digital ecosystem with 17 inconsistent, disconnected websites that lacked visual cohesion, unified branding, and scalable design infrastructure across regions.

The Starting Point

When I joined Laithwaites, the company was running 17 transactional websites across the UK, US, and APAC. On paper, they were all part of the same business — but visually and structurally, they looked like they came from different planets.​

The digital product team was newly formed in response to a major technical shift — moving away from a legacy ATG monolith toward a modular microservices architecture. This transition created a need for a modernised design function: one that could support scale, elevate user experience, and build the right foundations for a platform future.​

Each site had its own disconnected design, its own way of handling components, and in many cases, even inconsistent branding within the same brand. Users wouldn’t have known they were shopping with the same company

THE CONTEXT

The digital product teamwas newly formed in response to a major technical shift - moving away from a legacy ATG monolith toward a modular microservices architecture. This transition created a need for a modernised design function: one that could support scale, elevate user experience and build the right foundations for a future platform

What “Design Systems” looked Like

When I joined, there were multiple assets floating around under the name “design system.” In reality, none of them were systems — they were visual style guides at best, and incomplete moodboards at worst.

The Creative Team, responsible for campaign and landing pages, worked in InDesign and Creative Cloud, creating layouts that weren’t responsive and couldn’t be reused.

An external brand agency, had delivered a series of static components and hex values in Figma, but with no tokens, logic, or interaction states.

The digital creative team internally had compiled UI files with inconsistent naming, duplicated components, and unclear usage rules.

A US agency was brought in to help build a new “design system,” particularly to support US markets — but their output resembled a branded style library, not a product-ready design infrastructure.

Enter LDX to Start Cleaning the Foundations

When I joined, the Product Listing Page (PLP) and Product Detail Page (PDP) journeys were already underway — but they were being designed without any system in place.

There were no components, no responsive logic, no structure around colour, type, or layout. It was a well-meaning but junior team, working in isolation, without process, ownership, or direction.

To avoid derailing those high-priority projects, I moved quickly. I created a tactical, internal framework called LDX, based on Atomic Design principles. It wasn’t polished — and it wasn’t meant to be. It was a functional scaffold to support immediate delivery while beginning to expose the mess beneath: duplicated styles, inconsistent naming, orphaned components, and clashing design decisions.

LDX wasn’t just a tidier file — it made the design landscape visible. And that visibility was the first real step toward alignment.

Read PLP case study

Moving to VINE

We started with LDX, a lightweight stopgap system I created out of necessity. At the time, there was no design systems team — no dedicated resource at all, just a small design crew trying to deliver PLP, PDP, and Basket journeys across three major markets.

LDX let us move fast. It wasn't perfect, but it gave us just enough structure to stay consistent and efficient while shipping critical work.

Once those core experiences were live, I brought on a Senior UI Designer, and together we took everything we’d learned from LDX — what worked, what didn't — and evolved it into VINE, our fully scalable, brand-flexible design system.

Our goals

Design Once, Adapt Everywhere

Create a unified system that could flex across 17 transactional sites by using variables to swap branding — enabling shared logic across the UK, US, and APAC while still respecting individual brand nuance.

Build for Scale and Reuse

Establish a modular design system rooted in consistent behaviors and robust components — simplifying complexity, eliminating duplicate styles, and making the system easier to maintain across teams.

Simplify, Standardise, and Support

Reduce component sprawl, add clear usage guidelines, and ensure best practices around accessibility, responsiveness, and UX consistency — so teams could move faster with confidence, regardless of market.

Colour: From Chaos to Clarity

When we inherited the existing visual styles, we quickly uncovered a recurring issue: color had no system.

Every market had multiple primaries, undefined secondaries, arbitrary accents, and even duplicated styles — all without clear usage rules.

There was no semantic color structure, no system for interaction states, and no scalable way to apply consistent tints or themes across brands.

  • ❌  No semantic color system — just raw hex values used inconsistently.
  • ❌  States like error, success, warning were either missing or hardcoded visually.
  • ❌  Hue/tint logic was inconsistent; no mathematical basis for how light/dark variants were generated.
  • ❌  Brands (UK, APAC, US) were all using different palettes, with arbitrary names and styling.
  • ❌  Sweden’s original palette was visually attractive but not scalable or semantic — it wasn't built for product UI.

Principal Improvements

Semantic Roles, Not Visual Names
We replaced hardcoded hexes and abstract labels with semantic tokens like primary, on-surface, hover, background/brand, and text/muted.

Primitives + Themes + Variables
We introduced brand-specific primitives (e.g. AUS/colour/neutral/100), layered with semantic variables that mapped to the right primitive per market. Designers now style components using logic, while brands can easily switch visuals via Figma variable modes.

Mathematical Shade Structure
Each core color had 10 shades generated programmatically (light to dark). This ensured hue consistency, reduced design debt, and created predictability in how colors behaved in UI elements (e.g. hover, disabled, active).

Shared State Layer
We built a neutral and accessible set of state colors — for info (blue), error (red), warning (orange), success (green) — applied consistently across brands, including future scenarios like memberships or promotions.

Example: Semantic Token Mapping

Typography

Before Vine, our typography lacked cohesion. Each brand had developed its own set of styles independently, without shared logic, structure, or design standards.

What emerged was a fragmented system with inconsistent patterns and no clear guidance — leading to a range of critical issues:

  • ❌  There was no system or reasoning behind the type hierarchy — H1s and H2s varied wildly in scale and placement.

    ❌  Brands used different font weights, making theme-swapping impossible. A component that looked balanced in one brand broke in another.

    ❌  We had body text set to 14px, but heading sizes jumped irrationally. Line-heights were inconsistent and didn't follow a vertical rhythm.

    ❌  Styles had no semantic purpose. Designers didn't know when to use which style, and developers couldn’t rely on meaningful tokens.

    ❌  There were no usage notes or rules — everything was based on guesswork or tribal knowledge.

Principal Improvements

Semantic Roles, Not Visual Names
We replaced hardcoded hexes and abstract labels with semantic tokens like primary, on-surface, hover, background/brand, and text/muted.

Primitives + Themes + Variables
We introduced brand-specific primitives (e.g. AUS/colour/neutral/100), layered with semantic variables that mapped to the right primitive per market. Designers now style components using logic, while brands can easily switch visuals via Figma variable modes.

Mathematical Shade Structure
Each core color had 10 shades generated programmatically (light to dark). This ensured hue consistency, reduced design debt, and created predictability in how colors behaved in UI elements (e.g. hover, disabled, active).

Shared State Layer
We built a neutral and accessible set of state colors — for info (blue), error (red), warning (orange), success (green) — applied consistently across brands, including future scenarios like memberships or promotions.