Skip to main content

Case Study — Email Design System

The Blueprint

Skipton Building Society — A complete email design system built for accessibility, consistency and scale.

Role Lead Designer & Developer
Organisation Skipton Building Society
Brands served Retail + Intermediaries
Status Live & iterative

What I was looking at

When I started, Skipton's email process ran on a collection of one-off HTML templates and repurposed previous sends. Rendering issues were frequent, fixes ate days, and the safest response to a growing workload was to avoid complex designs altogether. The system wasn't broken. It was capping what the team could ship.

What made it hard

Designing for email isn't designing for the web. The rendering environment is hostile, the tooling is thin, and at the time the European Accessibility Act was incoming with no platform support to meet it. I built the contrast architecture, dark mode token logic, and the multi-brand Liquid system serving two businesses from a single template from first principles — there was nothing to copy.

What changed

The system turned a reactive process into a proactive one. CRM programmes can be mapped before a single line of code is written. Freelance designers can be onboarded against the system without risk to brand or accessibility compliance. The team stopped designing around what email could render and started designing for what the audience needed. It solved a design problem and an operational one in the same move.

2 Brands served from a single template — Retail and Intermediaries
Pre-EAA Accessibility framework built ahead of the European mandate, before platform tooling existed
WCAG AA Validated across every surface, text token and gradient stop

How the system is built

Every design decision in this system traces back to a single source of truth. Tokens are organised into three tiers — primitives define raw values, semantic tokens assign intent, component tokens govern specific usage. No component ever references a raw value directly.

Primitive

Raw Value

color-marine-500: #0062A8

The actual hex value. Named by colour family and scale position.

Semantic

Intent

color-surface-marine-onLight

What the colour means. References a primitive. Never a raw value.

Component

Usage

button-primary-color-background-default-onLight-default

Where and how the colour is used. References a semantic token.

Naming Convention

Hyphens denote segment boundaries within the token architecture. Multi-word descriptors within a segment use camelCase to distinguish them from structural separators.1

component-variant-category-property-context-state
button-primary-color-background-onLight-default

Token names use American English spelling throughout. All documentation uses British English spelling.2

The colour system

Colour in this system runs across two layers. Primitives define raw values; semantic tokens assign intent — surfaces, text, headlines, buttons. Each layer is documented here as both a visual palette and a token reference.

Primitive Palette

The palette is organised into named families, each representing a distinct colour range within the Skipton brand. Every primitive is named by family and scale position. No primitive is ever referenced directly in a component.

Marine

Cyan

Arctic

Pale Rider

Midnight

Meridian

Stone

White

Fjord

Primitive Tokens

Primitives are the raw colour values. They are named by colour family and scale position. No primitive is ever used directly in a component — they exist only to be referenced by semantic tokens.

Token Name Hex Value Swatch Family
--color-marine-300#1971B1
Marine
--color-marine-500#0062A8
Marine
--color-marine-700#004E86
Marine
--color-cyan-500#069de5
Cyan
--color-cyan-700#058ECF
Cyan
--color-arctic-300#D0F6FF
Arctic
--color-arctic-400#90E9FF
Arctic
--color-arctic-500#8AE8FF
Arctic
--color-paleRider-300#EFF5FA
Pale Rider
--color-paleRider-500#E5EFF6
Pale Rider
--color-paleRider-700#CFE2EF
Pale Rider
--color-midnight-300#2C2D38
Midnight
--color-midnight-500#1E1F29
Midnight
--color-meridian-500#002770
Meridian
--color-stone-100#FAF6F3
Stone
--color-white-100#FFFFFE
White
--color-white-200#FAFAFA
White
--color-fjord-100#001D2E
Fjord
--color-fjord-200#112C3C
Fjord
--color-fjord-300#213A49
Fjord
--color-fjord-400#324957
Fjord
--color-fjord-500#425864
Fjord
--color-fjord-600#536672
Fjord
--color-fjord-700#637580
Fjord

Semantic Palette

Every content block in an email sits on a surface. The surface choice is the root design decision — it determines which text, headline and button tokens are valid in that context. Each surface has a light mode and dark mode value.39

White
Light
surface-white-onLight → white-100 #FFFFFE
Dark
surface-white-onDark → fjord-100 #001D2E
Stone
Light
surface-stone-onLight → stone-100 #FAF6F3
Dark
surface-stone-onDark → fjord-200 #112C3C
Pale Rider
Light
surface-paleRider-onLight → paleRider-500 #E5EFF6
Dark
surface-paleRider-onDark → fjord-300 #213A49
Arctic
Light
surface-arctic-onLight → arctic-500 #8AE8FF
Dark
surface-arctic-onDark → fjord-400 #324957
Cyan
Light
surface-cyan-onLight → cyan-500 #069DE5
Dark
surface-cyan-onDark → fjord-500 #425864
Marine
Light
surface-marine-onLight → marine-500 #0062A8
Dark
surface-marine-onDark → fjord-600 #536672
Midnight
Light
surface-midnight-onLight → midnight-500 #1E1F29
Dark
surface-midnight-onDark → fjord-700 #637580
Meridian
Light
surface-meridian-onLight → meridian-500 #002770
Dark
surface-meridian-onDark → fjord-700 #637580

color-surface-meridian-onDark intentionally shares the same value as color-surface-midnight-onDark. Due to their tonal similarity, Meridian and Midnight should never be used as adjacent surface colours within the same layout.7

Semantic Tokens

Semantic tokens assign intent to primitive values. They describe what a colour does, not what it is. Every semantic token has a light mode and dark mode value, following the onLight/onDark pattern.4

Token Light Mode Value Dark Mode Value Usage Notes
Surface Tokens
color-email-bodycolor-white-100color-fjord-100
color-email-wrappercolor-white-100color-fjord-100
color-email-footercolor-midnight-500color-fjord-700
color-surface-whitecolor-white-100color-fjord-100
color-surface-stonecolor-stone-100color-fjord-200
color-surface-paleRidercolor-paleRider-500color-fjord-300
color-surface-arcticcolor-arctic-500color-fjord-400
color-surface-cyancolor-cyan-500color-fjord-500
color-surface-marinecolor-marine-500color-fjord-600
color-surface-midnightcolor-midnight-500color-fjord-700
color-surface-meridiancolor-meridian-500color-fjord-700
Text Tokens
color-text-onLight-strongcolor-midnight-500color-text-onDark-strongcolor-fjord-100Use on light backgrounds / Use on dark backgrounds
color-text-onLight-subtlecolor-white-100color-text-onDark-subtlecolor-white-200Use on dark or colour backgrounds / Slightly reduced contrast
Headline Tokens
color-headline-onLight-1color-marine-500color-headline-onDarkcolor-arctic-400Marine hero headlines / Headline on dark
color-headline-onLight-2color-cyan-500color-headline-onDarkcolor-arctic-400Cyan hero headlines / Headline on dark
color-headline-onLight-3color-arctic-500color-headline-onDarkcolor-arctic-400Arctic hero headlines / Headline on dark
color-headline-onLight-4color-paleRider-500color-headline-onDarkcolor-arctic-400Pale Rider hero headlines / Headline on dark
color-headline-onLight-5color-midnight-500color-headline-onDarkcolor-arctic-400Dark headline on light / Headline on dark
color-headline-onLight-6color-white-100color-headline-onDarkcolor-arctic-400White headline on colour / Headline on dark

Colour Contrast

Every surface / text combination in this system has been validated against WCAG AA standards. Pick a surface to see which text and headline tokens pair with it. Some combinations are intentionally context-locked — tokens are designed for specific surface contexts, so a fail is sometimes the correct outcome by design.

AAA ≥ 7:1 (body) AA ≥ 4.5:1 (body) AA Large ≥ 3:1 (headings only) Fail < 3:1
Show full matrix — all 80 combinations

Dark Mode

Dark mode is handled through three CSS mechanisms to ensure maximum client coverage across all major email clients.32

prefers-color-scheme

Handles iOS Mail, Apple Mail and other standards-compliant clients. The web standard for dark mode detection.

[data-ogsb]

Handles Outlook on iOS and Android. Uses a data attribute selector rather than a media query due to Outlook's non-standard implementation.

Yahoo Mail selector

Handled through a separate selector due to Yahoo's own non-standard dark mode implementation.

Each mechanism applies the same semantic token values, ensuring a consistent dark mode experience regardless of which client triggers the switch. The Fjord colour family provides the dark mode surface palette — each stop maps to a corresponding light mode surface.6

The type system

Typography in this system carries the structural hierarchy of every email. Getting it right reduces cognitive load, guides the reader through the content, and ensures accessibility compliance across a diverse audience.

Typefaces

Three typefaces make up the system. Each has a defined role — they are not interchangeable.

Aa
Turret 1853 Bold
H1 only

The brand display face. Distinctive and ownable. Anchors the hero section and establishes visual identity.

Rendered here with Georgia fallback. Full typeface requires Turret 1853 font package.

Aa
Roboto Condensed Black
H1 Alt only

Alternative display style for layouts where Turret 1853 would be too decorative. Same scale as H1.

Aa
Roboto Regular / Black
H2–H5 and body copy

Roboto Black for H2–H5. Roboto Regular for body copy. System fallbacks defined for clients that cannot load web fonts.

All headline weights are defined as bold in CSS despite being visually black weight. Email rendering compatibility.14

Type Scale

The scale is built on three size options — Large, Medium, Small — giving layout flexibility while maintaining hierarchy. Not all heading levels use all three sizes.

H1 Headlines Line-height: 1.1em
40px
36px
32px
H1 Alt Headline Line-height: 1.1em
40px
36px
32px
H2 Headlines Line-height: 1.15em
28px
24px
H3 Headlines Line-height: 1.3em
28px
24px
20px
H4 Headlines Line-height: 1.4em
24px
20px
16px
H5 Headlines Line-height: 1.5em
20px
16px
Body Copy Line-height: 1.5em *Used for Leading Paragraphs
20px*
16px
H1 — Turret 1853 Bold
Preview Token Weight Size Line Height
Aa typography-h1-size-large Black 2.5rem / 40px 1.1em / 44px
Aa typography-h1-size-medium Black 2.25rem / 36px 1.1em / 39.6px
Aa typography-h1-size-small Black 2rem / 32px 1.1em / 35.2px
Aa typography-h1-size-responsive Mobile Black 2.0625rem / 33px 1.1em / 36.3px
H1 Alt — Roboto Condensed Black
Preview Token Weight Size Line Height
Aa typography-h1Alt-size-large Black 2.5rem / 40px 1.1em / 44px
Aa typography-h1Alt-size-medium Black 2.25rem / 36px 1.1em / 39.6px
Aa typography-h1Alt-size-small Black 2rem / 32px 1.1em / 35.2px
H2 — Roboto Black
Preview Token Weight Size Line Height
Aa typography-h2-size-medium Black 1.75rem / 28px 1.15em / 32.2px
Aa typography-h2-size-small Black 1.5rem / 24px 1.15em / 27.6px
H3 — Roboto Black
Preview Token Weight Size Line Height
Aa typography-h3-size-large Black 1.75rem / 28px 1.3em / 36.4px
Aa typography-h3-size-medium Black 1.5rem / 24px 1.3em / 31.2px
Aa typography-h3-size-small Black 1.25rem / 20px 1.3em / 26px
H4 — Roboto Black
Preview Token Weight Size Line Height
Aa typography-h4-size-large Black 1.5rem / 24px 1.4em / 33.6px
Aa typography-h4-size-medium Black 1.25rem / 20px 1.4em / 28px
Aa typography-h4-size-small Black 1rem / 16px 1.4em / 22.4px
H5 — Roboto Black
Preview Token Weight Size Line Height
Aa typography-h5-size-large Black 1.25rem / 20px 1.5em / 30px
Aa typography-h5-size-small Black 1rem / 16px 1.5em / 24px
Body — Roboto Regular
Preview Token Weight Size Line Height
Aa typography-body-size-default Regular 1rem / 16px 1.5em / 24px
Aa typography-body-size-leading Leading Regular 1.25rem / 20px 1.5em / 30px

typography-h2-size-large is intentionally omitted. H2 large scale would create visual conflict with H1, which owns the large display size within the type hierarchy.15

typography-h5-size-medium is intentionally omitted. H5 at medium scale has no defined use case within the current email design system.16

Usage Rules

One H1 per email

The display typeface is a strong visual statement. Using it more than once dilutes its impact and creates hierarchy confusion.

Follow heading order

Do not skip heading levels for visual effect — use the size scale within each level instead. This preserves semantic structure for screen readers.

Never below 16px

Body copy must never go below 16px. This is an accessibility requirement, not a stylistic preference. Skipton's member base skews older.18

Leading paragraphs intentionally

The 20px leading paragraph size should be used to introduce a section or balance a layout. It is not a default body size.

Fixed line heights

Line heights are fixed per heading level. They have been set to ensure readability at each scale and should not be overridden.

Default headline colour

H2–H5 headlines default to color-headline-onLight-5 (midnight-500). Alternatives are available for intentional creative emphasis only.11

Visual rhythm and structure

Spacing in this system is not decorative — it is structural. Consistent spacing creates the rhythm that makes an email feel considered rather than assembled. Every spacing decision references the scale rather than introducing arbitrary values.

Spacing Scale

The entire spacing system derives from a single base unit: 1em = 16px. This ties spacing directly to the minimum body copy size, creating an intrinsic relationship between text and layout.

The underlying grid structure uses multiples of 4px throughout. Every spacing value in the scale satisfies this constraint. 22

--spacing-025
0.25em / 4px
--spacing-050
0.5em / 8px
--spacing-075
0.75em / 12px
--spacing-100
1em / 16px (base unit)
--spacing-125
1.25em / 20px
--spacing-150
1.5em / 24px
--spacing-200
2em / 32px
--spacing-250
2.5em / 40px
--spacing-300
3em / 48px
--spacing-400
4em / 64px
Component Token Reference Value Usage
Panel padding default spacing-150 24px Default content padding
Panel padding nested spacing-100 16px Nested panel padding
Panel padding hero spacing-150 24px Hero section padding
Panel margin horizontal spacing-100 16px Horizontal margins
Panel gap vertical spacing-200 32px Primary driver of layout rhythm
Footer padding desktop spacing-200 32px Desktop footer padding
Footer padding mobile spacing-200 spacing-150 32px 24px Mobile footer padding
Button padding standard 0.3em 1.2em Outside scale 19 Optically tuned for balance
Button padding large 0.4em 0.9em Outside scale 19 Optically tuned for balance
Button border width 0.15em Button border thickness

Button padding values are intentionally outside the spacing scale. They have been fine-tuned for optical balance and should not be adjusted without visual regression testing across email clients. 19

Rolling Hill Radius System

The Rolling Hill radius system gives the layout its distinctive soft geometric quality. Radius values are applied consistently by context — not interchangeably. The exaggerated bottom-right curve is a direct expression of the Skipton Rolling Hill brand code. 20

This is not a decorative choice — it is a brand requirement. Maintain this radius exactly as defined.

--radius-025
0.15em / 2.4px
--radius-050
0.5em / 8px
--radius-075
0.75em / 12px
--radius-200
2em / 32px
--radius-300
3em / 48px
--radius-button
2em / 32px (references radius-200)
--radius-hero
4em / 64px
Composite Radius Patterns

--radius-image-single-desktop

0 0 64px 8px

--radius-image-single-mobile

0 0 32px 0

--radius-image-2col-left

8px 0 32px 0

--radius-image-2col-right

0 8px 0 32px

--radius-image-2col-left-full

8px 8px 48px 8px

--radius-image-hero-2col-right

8px 8px 48px 8px

--radius-image-panel-topleft 21

8px 0 0 0

--radius-hero-wrapper 20

0 0 64px 8px

Left corner intentionally omitted from panel-topleft images. This creates a harder visual divide between the image edge and container boundary. 21

Layout Principles

One base unit governs everything

If a spacing value cannot be expressed as a token from the scale, question whether it should exist. The system is built on multiples of 4px — maintain that constraint.

Vertical rhythm from consistent gaps

The panel-gap-vertical token (spacing-200 / 32px) is the primary driver of layout breathing room. Resist ad-hoc spacing between components.

Minimal responsive behaviour by design

Only H1 typography and image border radius have defined responsive overrides. The system is designed to be robust without media queries. Additional breakpoints create risk when email clients strip them.34

Grid built on multiples of 4

Every spacing decision in the system satisfies the 4px grid constraint. When introducing new spacing values, apply the same rule.22

Visual marks

This section documents two related sets of visual primitives. Logos — brand marks, propositions, event lockups, third-party assets — are documented at the implementation layer: how they behave inside email, which variants exist, how the multi-brand swap is wired. Clearspace, prohibited uses, and brand-identity rules live in the SBS brand guidelines.

Icons in this system are decorative. Headlines and CTA labels carry the clarity of purpose — icons assist visual scanning and signal category at a glance, but never carry semantic weight on their own. Every icon ships with alt="": screen readers correctly skip them, and the readable copy alongside is what the user actually needs.

All icons and logo assets are exported as PNG at 400 px (2× retina). Designers choose the display size based on component context, with a maximum render width of 250 px. PNG over SVG is a deliberate choice for email — SVG support across Outlook and several Apple Mail variants remains inconsistent enough that pre-baked raster assets are the more resilient delivery format.

Logo — Brand mark

A single brand mark serves both SBS Retail (B2C) and Intermediaries (B2B). The mark itself doesn’t change between the two business contexts — what changes is the proposition pairing alongside it. Documented further down.

Two colour treatments cover every surface in the system. White is the primary across both light and dark modes — the mark sits on a coloured surface (marine, cyan, midnight, fjord) where white delivers full contrast. Cyan is the alternate, used only when the surface is white or pale enough that white loses contrast against it.

White · desktop

Primary, on coloured surfaces

White · mobile

Primary, mobile width

Cyan · desktop

Alternate, for white surfaces

Cyan · mobile

Alternate, mobile width

Logo — Proposition

Each business carries a different proposition lockup alongside the brand mark. SBS Retail uses “Founded on Fairness” — the consumer-facing brand promise. Intermediaries (the B2B broker channel) uses “Let’s find a way” — the partnership-led claim that addresses the broker audience specifically.

Each proposition ships in surface-appropriate colour variants. The variant chosen at render time depends on the hero gradient or surface the logo sits on. Same mechanic for both businesses, different proposition asset.

Skipton Building Society Logo

Marine

For marine + meridian surfaces

Arctic

For arctic frost surfaces

White

For dark surfaces

Intermediaries — Let’s find a way

Marine + Meridian

For light surfaces

White + Arctic

For dark surfaces

Logo — Event

For specific campaigns — AGM, annual reviews, themed product pushes — an event lockup can replace the standard proposition pairing. Mechanically identical: same brand mark, different lockup beside it, surface-appropriate colour treatment. The proposition swap and the event swap use the same template logic, just different asset paths.

AGM 2026

Example event lockup · replaces proposition

Logo — Third-party

Social channel marks (Instagram, LinkedIn, X, Facebook) and app-store badges (App Store, Google Play) sit on Skipton emails frequently — in footers, app-promo modules, and contact CTAs. These are externally-owned assets, so the system documents which approved variants to use and where to source them, rather than redrawing them.

Each third-party logo needs a contrast-appropriate variant for the surface it sits on. Most providers publish light + dark variants in their press kits; the system records the canonical hosted asset path per surface.

Social channels

Facebook

Primary · white variant available

Instagram

Primary · white variant available

LinkedIn

Blue · white variant available

X

White on dark · black variant available

YouTube

Primary · white variant available

App stores

App Store

Primary · white variant available

Google Play

Primary · dark-mode-friendly variant available

Icon — Contacting us

Used in contact-routing content — branch finder modules, support sections, response-channel CTAs. Consistency across these icons reinforces visual recognition of the “contact” category without requiring the reader to parse each instance individually.

App

Branch

Call

Callback

Instagram

Online

Skipton Link

Webchat

Icon — Savings & Investments

Used in product content — ISA campaigns, savings rate pullouts, investment article modules. The visual family signals “money product” before the reader has parsed the headline, reducing the cognitive lift required to navigate longer-form member emails.

Cash ISA

Easy access bond

Financial advice

Fixed rate bond

General savings

Lifetime ISA

Regular saver

Stocks and shares

Full library lives in production documentation. The two sample sets above show how the system organises icons by content category — consistency within a category, not across the whole system, is what carries the visual scanning benefit. Contact and product icons exist for visual continuity across the brand, not as a functional language.

Button-attached icons follow a different model — paired contrast variants (default + alt) tied to button surface treatment, not standalone usage. See Buttons → Anatomy for the in-context documentation.

Email layout components

Beyond buttons and typography, the system defines three layout components used to structure content within emails. Each has defined spacing, radius and surface token usage. Used together, they cover almost every content arrangement Skipton sends.

Header

The header is the brand’s first impression in the inbox. It lives inside the hero wrapper, carrying the primary Skipton mark, an optional proposition or event logo, and a nav row of up to three links chosen for the email’s objective. Logo block sits on the gradient; nav bar carries its own white surface.

Structure

Module
Header
Elements
Primary logo — Skipton wordmark (desktop) / castle monogram (mobile). Proposition logo — secondary mark for a campaign, event or proposition (optional). Nav bar — up to three links chosen per email (optional).
Surface
Logo row sits on the hero wrapper’s gradient — no own surface. Nav bar carries a white surface as a contrast strip inside the gradient wrapper.
Logo dimensions
Primary — 180px wordmark (desktop) / 52px castle monogram (mobile). Proposition — up to 168px wide. Proposition asset carries its own arctic background and bottom-left Rolling Hill radius baked into the PNG.21
Logo swap
Desktop renders the full Skipton wordmark. Mobile swaps to the compact castle monogram. Mandatory, not optional — the wordmark at mobile width either crowds the layout or shrinks below readable scale.
Nav bar
Full-width white surface inside the wrapper. Inner nav element constrained to max-width: 36em and centered. Three equal columns at 33.2% each, thin marine dividers between items. Max three links.
Nav link style
Midnight text colour, bold weight, custom underline via border-bottom: 1px solid marine-500 with padding-bottom: 2px. text-decoration: none — the border-bottom is the underline (this differs from the standard hyperlink default treatment, which uses text-decoration: underline with text-underline-offset).
Alignment
Primary logo floats left with padding: 0 1.5em. Proposition logo floats right, flush to the edge. Nav columns center-align their link labels.
Intermediaries variant
Two differences from the Retail variant: primary logo links to skipton-intermediaries.co.uk (same wordmark/monogram assets, different target); and the proposition logo on the right swaps to the Intermediaries-channel proposition mark.

Live example · full header inside a marine hero wrapper. Toggle between SBS Retail and Intermediaries to see the brand-specific proposition logo, then toggle viewport for the mobile logo swap.

Usage

  1. Three nav items maximumBeyond three, the header crowds the brand and competes with the hero for attention. If you need more than three links, the content belongs in the body, not the header.
  2. Nav serves the email’s objectiveChoose nav links by what supports the journey this email is starting — utility for transactional, category for marketing, contextual for campaigns. Generic site navigation here is wasted space.
  3. Proposition logo is optional, never decorativeInclude the proposition or event logo only when the email is specifically about that proposition or event. Otherwise lead with the primary mark alone.
  4. Logo swap is mandatory on mobileThe wordmark at mobile width either crowds the nav or shrinks below readable scale. The monogram is the correct mark at narrow viewports — it’s a system rule, not a per-email decision.
  5. Surface follows the hero treatmentIf the hero has a gradient and the header overlays it, use a transparent surface. If the email starts with content rather than a hero, give the header its own defined surface for separation.

Hero

The hero is the first thing a reader sees. Its job is to establish context, reinforce brand, and create enough visual interest to pull the reader into the email. A hero is composed of three layers — background, optional image, content — all sitting inside the hero wrapper. The bottom-right Rolling Hill radius is the brand signature, not decorative.20

Structure

Module
Hero
Layouts
Layout A — two-column — image alongside content, all left-aligned on desktop, stacked image-top on mobile. Layout B — single column — full-width image above centered content.
Background
Gradient or solid colour surface establishing the visual tone. Six gradients available — see Gradient options below. Always define a fallback colour so the hero resolves cleanly in clients that strip gradient support.13
Image (optional)
Layout A — 500×500px desktop / 500×430px mobile. Layout B — 1152×500px desktop / 500×430px mobile. Rolling Hill composite radius applied to imagery — never symmetric.20 Max 1mb file size. Descriptive alt text required.
Content
Headline (H1 or H1 Alt only), supporting body copy, primary CTA. One display heading per email.
Inner width
36em · 576px content container inside the full-width gradient wrapper.
Border radius
Bottom-right Rolling Hill via composite token — the brand signature, not decorative.20
CTA
Always primary, large scale — matches the hero's prominence in the email.

Live example · two hero layouts with desktop / mobile image source swap

Layout A · two-column — image alongside content

Headline

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in ornare ipsum. Pellentesque non erat dolor. Phasellus lobortis consequat iaculis.

CTA

Image source: 500 × 500 px · 1:1 aspect (2x of 250×250 rendered) 500 × 430 px · 7:6 aspect (2x of 250×215 rendered)

Layout B · single column — full-width image above centered content

Headline

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in ornare ipsum. Pellentesque non erat dolor. Phasellus lobortis consequat iaculis. Maecenas quis diam sed ipsum eleifend rhoncus at at enim.

CTA

Image source: 1152 × 500 px · 2:1 aspect (2x of 576×250 rendered) 500 × 430 px · 7:6 aspect (2x of 250×215 rendered)

Usage

  1. One hero per emailThe hero wrapper radius and gradient treatment are designed as a single opening statement, not a repeating pattern. Subsequent emphasis lives in pullout panels and two-column components.
  2. Gradient choice is brand-drivenEach gradient maps to a specific channel or content type — Marine for the Skipton Building Society retail brand, Pale Rider for research, Cyan for operational communications, Deep Meridian for the Intermediaries broker channel. The colour signals who the email is from and what kind of message it carries before the reader has read a word.
  3. Never put text in imagesEmail clients scale and crop images unpredictably. Text in imagery cannot be resized, translated, or read by screen readers. The Skipton logo is the only exception.
  4. Hero CTA is always primary, large scaleThe hero is the highest-prominence location in the email. Button size and visual weight should match that prominence — never secondary or hyperlink.
Gradient options

Six gradients are available as hero backgrounds. Each has been validated for accessible text and headline contrast at every stop, not just at the fallback colour — placing text anywhere across the gradient maintains WCAG AA compliance.13

Marine

Stops
#1971B1#0062A8#004E86
Fallback
color-marine-700 · #004E86
Dark mode
color-fjord-600
Used for
Skipton Building Society — retail brand communications.

Arctic Frost

Stops
#D0F6FF#8AE8FF#8AE8FF
Fallback
color-arctic-500 · #8AE8FF
Dark mode
color-fjord-400
Used for
Open use — available for one-off campaigns. No fixed channel mapping yet.

Skipton Cyan

Stops
#069DE5#069DE5#058ECF
Fallback
color-cyan-500 · #069DE5
Dark mode
color-fjord-500
Used for
Operational communications — service notices, account activity, system updates.

Pale Rider

Stops
#EFF5FA#E5EFF6#CFE2EF
Fallback
color-paleRider-500 · #E5EFF6
Dark mode
color-fjord-300
Used for
Research — surveys, member research initiatives.

Midnight Black

Stops
#2C2D38#2C2D38#1E1F29
Fallback
color-midnight-500 · #1E1F29
Dark mode
color-fjord-700
Used for
Financial advice and planning — investment communications, advisory updates.

Deep Meridian

Stops
#002770#002770#004E86
Fallback
color-meridian-500 · #002770
Dark mode
color-fjord-700 · shared with Midnight by design7
Used for
Intermediaries — broker-channel communications.

Pullout Panel

Pullout panels are content blocks used to emphasise a secondary message or call-out within the content flow. They sit inside the content wrapper (white) and come in two variants: Standard fills the panel with a contrasting surface colour; Border draws a 0.15em border in the chosen colour with the parent surface showing through. Same module, same content options, different visual weight.

Structure

Module
Pullout panel
Variants
Standard — filled surface, no border. Border — transparent fill, 0.15em border in the chosen colour. The parent surface (white content wrapper) shows through.
Panel surface
White, Primary Blue, Skipton Cyan, Arctic Frost, Stone, Pale Rider or Midnight. Stone is the module default.
Content
Image, headline (H1–H4), body copy, bullets and CTA (primary button or hyperlink) — each independently toggleable per panel. See the component documentation for the complete option set.
Max width
34em · 544px at 16px base (31em content + 1.5em padding each side)
Outer margin
0 1em · 16px horizontal against the content wrapper edges
Inner padding
1.5em · 24px on all sides via spacer divs (Outlook-safe)
Border radius
0.75em · 12px at 16px base
Headline
H1–H4 selectable per panel with size variants. H4 default renders at 19px / 1.35em.

Live example · Standard and Border variants on the white content wrapper

Your fixed-rate mortgage deal is one of the most important commitments you’ll make. Reviewing it ahead of the end date gives you the time to weigh up the market without pressure.

Standard variant · Pale Rider surface

Your rate review is due

If your deal is ending in the next six months, book a no-obligation review with a Skipton mortgage adviser to talk through your options.

Book a review

Border variant · dark border on parent surface

Your rate review is due

If your deal is ending in the next six months, book a no-obligation review with a Skipton mortgage adviser to talk through your options.

Book a review

An adviser will walk you through what’s available across the Skipton range and what’s available through our intermediaries panel.

Usage

  1. Use sparinglyMultiple pullout panels in sequence compete with each other and dilute the impact of the primary CTA.12
  2. Match variant to emphasisChoose Standard for stronger emphasis where surface contrast is helpful. Choose Border when the panel needs to feel subordinate to a primary call-out, or when surface contrast against the content wrapper would be too heavy.
  3. Surface contrast without overwhelmSurface choice should create contrast against the white content wrapper without overwhelming the primary content flow. Stone is the module default and the most restrained.
  4. Body text never drops below 16pxThe 16px minimum is an accessibility requirement, not a stylistic preference.18
  5. Brand inherits, never hard-codesHeadline, copy and border colours are configurable per-instance via brand tokens — the panel inherits the brand context (SBS or INT) rather than hard-coding values.

Two-column panel

Two-column panels structure content side by side within a single panel. Two variants share the same module: Image fills the left column with a visual; Icon places a small mark at the top of a narrow left column. Both are structurally two-column layouts — in the Icon variant the body copy appears to flow past the icon’s footprint because the right column is taller than the icon and its column is much wider.

Structure

Module
Two-column panel
Variants
Image — full-height visual in left column. Icon — narrow left column carries a small mark; right column carries the content. Image position is left by default; can be flipped to right per panel.
Column ratios
Image: 9 ratios from 50/50 (default) to 10/90. Icon: 11 ratios from 49/51 (default) to 3/97. Narrower left columns let the icon become a small visual cue rather than a structural half.
Panel surface
White, Primary Blue, Skipton Cyan, Arctic Frost, Stone, Pale Rider or Midnight. White is the module default.
Content
Member badge, headline (H1–H4), body copy, bullets and CTA (primary button or hyperlink) — each independently toggleable per panel. See the component documentation for the complete option set.
Image source
576px recommended source width. Rolling Hill radius applied via composite tokens — image radius is asymmetric, never symmetric.21
Body type
Roboto, 16px, line-height 1.5em.
Headline
H1–H4 selectable with size variants. H4 default renders at 19px / 1.35em.
Responsive
Columns stack to single column at 36em viewport width. Stack order is left column then right column by default; reversible per panel.

Live example · Image and Icon variants on the white content wrapper

Whether you’re buying your first home or remortgaging an existing deal, the right product is the one matched to your circumstances.

Image variant · 50/50 columns, Pale Rider surface

Find a deal that fits

Compare our latest mortgage products and book a chat with a Skipton adviser.

Find out more

Icon variant · 25/75 columns, Pale Rider surface

Find a deal that fits

Compare our latest mortgage products and book a chat with a Skipton adviser.

Find out more

An adviser will guide you through the options across the Skipton range and tell you what’s available through our intermediaries panel.

Usage

  1. Image vs Icon — visual anchor vs glyph cueImage variant for content that benefits from a visual anchor — products, member benefits, lifestyle scenes. Icon variant for content where a small glyph carries the meaning — themes, categories, status communications.
  2. Column ratio reflects content weightThe default 50/50 works for matched content; narrower left columns work for shorter visual elements.
  3. Body text never drops below 16pxReduce column width before reducing text.18
  4. Asymmetric image radius onlyImages use the Rolling Hill composite radius tokens — never symmetric radius on a two-column image.21

Two-column cards

Two-column cards are two independent panels rendered side by side within a parent container. Each card has its own surface, headline colour and content — used for paired comparisons, parallel options, or feature highlights where two pieces of content need equal visual weight.

Structure

Module
Two-column cards
Layout types
Two configurations available — 2 Column A and 2 Column B — for image placement and content arrangement.
Surfaces
Three independent surface choices: parent panel, left card, right card. Any of the seven brand surfaces available for each.
Independent headlines
Each card has its own headline colour from the five brand-validated options.
Column alignment
Heights of the content above CTA, CTA itself, and content below CTA can be locked to em values (6em–36em) so cards align visually even when their content lengths differ.
Content
Image, headline (H1–H4), body copy, bullets and CTA — per card, independently. See the component documentation for the complete option set.
Image radius
Card images use Rolling Hill composite radius tokens — asymmetric, never symmetric.21
Body type
Roboto, 16px, line-height 1.5em.
Responsive
Cards stack to single column at 36em viewport width.

Live example · two cards on a Pale Rider parent surface

Two routes to the same outcome — choose the one that suits how you want to start.

Skipton Group

A combined approach across Skipton’s mortgage, savings and estate agency businesses.

Find out more

Skipton Group

A combined approach across Skipton’s mortgage, savings and estate agency businesses.

Find out more

Usage

  1. For paired content with equal weightComparisons, paired routes, dual feature highlights. The layout doesn’t scale to three columns by design — for three or more options reach for a different pattern.
  2. Lock heights when content differsWhen card content lengths differ, lock column heights to keep CTAs aligned. Misaligned CTAs across paired cards break the visual rhythm.
  3. Card surfaces must contrast the parentIf both card surfaces match the parent, the cards lose their edge definition.
  4. Body text never drops below 16pxThe 16px minimum applies inside cards regardless of column width.18

Icons and Logos

Content coming in a subsequent prompt.

Anatomy of a Skipton email

Every Skipton email is built on three structural zones — Body, Wrapper, Footer. The Wrapper is email-specific terminology: it’s the container that lets a hero break full-width edge-to-edge while body content stays inside a fixed inner column. In a web context this would just be the body, but emails need the explicit wrapper because the default rendering environment forces centred, fixed-width layouts. Surface colours (marine, arctic, stone…) live inside the Wrapper and carry their own fallback chain — documented in Colour & Surfaces.

Body

The outermost container — the email client’s viewport. Sets the base surface that surrounds the email.

Wrapper

The email-specific full-width container. Lets the hero break edge-to-edge while body content stays bounded inside a fixed inner column.

Hero full-width

Spans the Wrapper edge-to-edge. Carries the gradient surface, the Rolling Hill bottom radius and the brand opening statement.

Body content 36em · 576px centred

Everything after the hero sits inside this fixed inner column — copy blocks, pullout panels, two-column components.

Decision log

Every design and architectural decision behind the Skipton email design system. Each note is referenced inline throughout the documentation with a superscript number that matches its entry here — what was decided, and why. Grouped by category for readability; numbers stay sequential so existing references resolve unambiguously.

Naming Convention

Hyphens as segment boundaries

Decision: Hyphens denote segment boundaries within the token architecture. Multi-word descriptors within a segment use camelCase.

button-primary-color-background-onLight-default

Rationale: A hyphen between every word (pure kebab-case) makes long token names difficult to parse — the eye cannot distinguish structural boundaries from word joins. CamelCase within segments preserves readability at the segment level while keeping hyphens meaningful as structural dividers.

American English for tokens, British English for documentation

Decision: Token names use American English spelling throughout (‘color’). All documentation and guidelines use British English spelling (‘colour’).

Rationale: CSS custom properties follow American English conventions universally — ‘color’, not ‘colour’. Using British English in token names would create inconsistency with every CSS reference and tool. Documentation uses British English to maintain Skipton’s brand voice in written materials.

Strong and subtle refer to colour darkness

Decision: Strong and subtle describe colour darkness, not contrast level. Darker colours are strong, lighter colours are subtle — consistently across both light and dark modes.

Rationale: Using strong/subtle as a contrast descriptor would create confusion in dark mode where the relationship between darkness and contrast inverts. Anchoring the terms to absolute colour darkness means the rule is always the same regardless of mode — darker = strong, lighter = subtle. This reduces cognitive load for anyone applying the system.

OnLight/OnDark pattern

Decision: Every token that responds to surface context uses the onLight/onDark pattern. Identify the surface — apply the corresponding tokens.

Rationale: A single rule that governs the entire system. Light surfaces use onLight tokens. Dark and brand surfaces use onDark tokens. This applies to text, headlines, buttons and hyperlinks without exception. Learning one rule unlocks the entire system rather than requiring per-component memorisation.

Default/Alt split is a light mode concern only

Decision: In dark mode, the distinction between default and alt button and hyperlink treatments is intentionally removed. The default/alt split is a light mode concern only.

Rationale: Dark mode surfaces reduce the need for prominence differentiation. The fjord scale provides a unified dark palette where the visual distinction between default and alt treatments would be minimal and potentially confusing. A unified treatment maintains visual consistency across the reduced colour palette without requiring additional dark mode variants.

Colour

Fjord family — dark mode backbone

Decision: Fjord is a seven-stop dark teal-blue scale. Each stop maps to a corresponding light mode surface.

Rationale: The dark mode colour swaps in this system are not simply darkened versions of the light mode colours — they are a distinct palette chosen for accessible contrast on dark backgrounds. The fjord family provides a stepped scale where each stop has been validated against its corresponding light mode surface text and headline options. The teal-blue undertone maintains visual warmth in dark mode rather than rendering as flat grey.

Meridian onDark shares value with midnight onDark

Decision: color-surface-meridian-onDark intentionally shares the same value as color-surface-midnight-onDark (color-fjord-700).

Rationale: Meridian was added to the design system later as a bolt-on. Due to their tonal similarity, Meridian and Midnight produce visually indistinct results in dark mode. Rather than introduce a separate fjord stop for Meridian’s dark mode, the shared value maintains visual consistency. Meridian and Midnight should never be used as adjacent surface colours within the same layout — their similarity in dark mode is a known constraint, not an oversight.

color-text-onDark-strong is a dark value

Decision: color-text-onDark-strong resolves to color-fjord-100 (#001D2E) — a very dark value. Its use is limited to the primary button fill in dark mode where the arctic background provides sufficient colour contrast.

Rationale: Strong and subtle are anchored to colour darkness throughout the system. In dark mode, strong = darker, subtle = lighter. color-text-onDark-strong is therefore the darkest text value. This creates a specific use case: dark text on the arctic-400 button background in dark mode. It will fail contrast on most dark surfaces and should not be used outside this context. The constraint is documented rather than removed because the naming convention consistency is more valuable than the edge case confusion.

color-text-onLight-subtle and color-headline-onLight-6 are white

Decision: Both tokens resolve to color-white-100. They are intended for use on dark or brand surfaces only.

Rationale: White text on a light surface fails WCAG AA contrast on almost every light background in the system. These tokens exist specifically for situations where white copy or headlines are placed on marine, midnight, meridian or other dark surfaces within a light mode email. Cross-referencing the contrast grid before use is mandatory — the token name alone does not prevent misuse.

Accent is context-independent

Decision: color-yellow-500 (#ffed00) has no onLight/onDark variant. It is used identically in both modes.

Rationale: #ffed00 maintains sufficient contrast and visual presence on both white (#ffffff) and black (#1d1d1b) backgrounds. Introducing an onLight/onDark split would add complexity without functional benefit. The accent is the single brand colour that works universally — keeping it context-independent is an intentional simplification that reinforces the single-colour brand identity.

Headline colour is a constrained design decision

Decision: Six headline colour options are available on light surfaces. color-headline-onLight-5 (midnight-500) is the default for H2–H5. Alternatives are available for intentional creative emphasis only.

Rationale: Prescribing a single headline colour for all situations would limit the expressive range of the system. However, completely free colour choice would undermine consistency and accessibility. A constrained palette of validated options — each checked against the contrast grid — gives designers creative flexibility within a safe range. The default exists to ensure consistency when no creative emphasis is needed.

Surface usage guidance — avoid bright pullout panels

Decision: Marine is the default surface for panels containing a primary contact CTA. Saturated surfaces should be used sparingly. When multiple panels appear in the same email, lighter surfaces should be used to create a subtle, layered layout.

Rationale: Multiple saturated panels in sequence compete with each other, dilute the impact of the primary CTA, and create visual noise that works against the reader’s journey. Surface colour should function like typographic scale — used sparingly, with intention, to guide attention rather than demand it. Marine carries brand authority and is the appropriate container for the most important action in the email.

Gradient stops validated for contrast

Decision: Every gradient stop has been deliberately chosen to maintain the same accessible text and headline colour options as the fallback colour. Colour contrast has been validated at every stop.

Rationale: A gradient background changes the effective contrast ratio across its range. If contrast is only validated at the start and end points, text placed over the middle of the gradient may fail WCAG AA. By validating every stop against the same text options as the fallback solid colour, the system ensures that any text placement across the gradient maintains accessibility compliance.

Typography

typography-weight-black = bold

Decision: All headline weights are defined as bold in CSS despite being visually black weight.

Rationale: Some email clients — particularly older versions of Outlook — fail to render font weights above bold (700) correctly. Setting weight to bold rather than 900 or ‘black’ ensures the headline renders as intended across the broadest range of clients. The visual intention is black weight; the CSS implementation uses bold as the most reliable cross-client equivalent.

typography-h2-size-large omitted

Decision: H2 large scale is intentionally omitted from the type scale.

Rationale: H2 at large scale (28px+) creates visual conflict with H1, which owns the large display size within the type hierarchy. Including a large H2 would undermine the clarity of the heading hierarchy and invite misuse — designers reaching for large H2 when a smaller H1 would be more appropriate.

typography-h5-size-medium omitted

Decision: H5 medium scale is intentionally omitted from the type scale.

Rationale: H5 at medium scale has no defined use case within the current email design system and has not been implemented. Adding a token that has never been used and has no use case is noise rather than completeness. If a use case emerges, the token can be added at that point with proper documentation.

H1 responsive override only

Decision: H1 is the only heading level with a defined responsive breakpoint. It scales to 33px on mobile unless overridden.

Rationale: Additional responsive breakpoints create risk when email clients strip media queries — the layout may break entirely if it relies on responsive type scaling. The system is designed to be robust without media queries. H1 is the only exception because the display typeface at large sizes (40px+) can create layout issues on narrow mobile viewports. All other heading levels are sized to work across desktop and mobile without a breakpoint.

Minimum body copy size 16px

Decision: Body copy must never go below 16px. This is an accessibility requirement, not a stylistic preference.

Rationale: Skipton’s member base skews older. Smaller text sizes create legibility barriers for readers with visual impairments or age-related vision changes. 16px is the established accessibility baseline for body copy and is non-negotiable regardless of layout constraints. If a design requires smaller text to fit, the layout should be reconsidered rather than the text size reduced.

Spacing & Layout

Button padding outside the spacing scale

Decision: Button padding values are intentionally outside the spacing scale: standard 0.3em 1.2em, large 0.4em 0.9em.

Rationale: Button padding requires optical balancing that does not align cleanly with a 4px grid. The vertical and horizontal padding relationship needs to create a visually balanced pill shape — this requires fine-tuning that grid-aligned values do not provide. These values have been tested across email clients and should not be adjusted to align with the scale without visual regression testing.

Rolling Hill radius is a brand requirement

Decision: The exaggerated bottom-right curve on the hero wrapper (radius-hero: 4em) is a direct expression of the Skipton Rolling Hill brand code.

Rationale: The Rolling Hill motif appears consistently across Skipton’s visual identity. In email, the hero section is the primary expression of this brand code. The asymmetric radius — large curve bottom-right, subtle curve bottom-left — is not a decorative choice. It is a brand requirement. Reducing or removing it breaks brand consistency. The radius is applied to both the wrapper and the hero image to ensure consistent rendering across email clients that handle overflow differently.

Left corner omitted on panel-topleft images

Decision: radius-image-panel-topleft uses radius-050 0 0 0 — the left corners are intentionally not rounded.

Rationale: When an image sits in the top-left corner of a panel, applying a radius to the left corners creates a visual gap between the image edge and the panel boundary. Removing the left corner radius creates a harder visual divide between the image and the container, reinforcing the structural boundary. This is a deliberate decision to reduce the density of rounded corners in the layout.

Grid built on multiples of 4

Decision: Every spacing value in the system is a multiple of 4px.

Rationale: A 4px base grid creates visual harmony across all spacing decisions. When spacing values are multiples of a common unit, layouts feel balanced and intentional rather than arbitrary. The em-based scale ensures spacing scales proportionally with the base font size, maintaining the relationship between text and space across different contexts.

Buttons & Hyperlinks

Button icons required

Decision: Every button must include an icon. This is a requirement, not an option.

Rationale: Some email clients do not render border-radius on buttons, making it difficult for readers to distinguish a CTA from plain text. Icons provide a second signifier of interactivity that works regardless of border-radius rendering. Four icon types are defined — Link, Download, Call/Callback, Document — each communicating the nature of the action as well as the fact that it is interactive.

Secondary button hover — border only

Decision: Secondary button hover state is communicated through border colour change only. Text colour remains consistent across default and hover states by design.

Rationale: Secondary buttons use a transparent background. Changing the text colour on hover in addition to the border colour would create a more disruptive visual state change that draws attention away from the primary CTA. The border change alone is sufficient to communicate interactivity on supported clients while keeping the visual weight of the secondary action appropriately subordinate.

Disabled states omitted

Decision: Disabled button states are intentionally omitted from this design system.

Rationale: Email serves an engagement function. Every CTA in an email should be actionable — if an action requires a prerequisite, the email should not be sent until that prerequisite is met, or the CTA should direct the reader to a web journey where the prerequisite can be completed. A disabled button in email communicates a dead end with no path forward. There is no valid use case for a disabled state in this context.

Focus state on backlog

Decision: A unified focus state is defined but not yet implemented.

Rationale: Focus state is a WCAG 2.1 requirement. The absence of a visible focus indicator is an accessibility failure. The focus state has not been implemented in the current version due to technical complexity around cross-client rendering. It is on the backlog and will be added in a future iteration. This is a known gap, not a deliberate omission.

Hyperlink hover states omitted

Decision: Hyperlink hover states are intentionally omitted from this design system.

Rationale: Email client support for CSS hover states is inconsistent. Outlook desktop — which represents a significant portion of the Skipton member audience given the financial services context — ignores hover states entirely. Designing a hover state that a significant portion of the audience never sees creates an inconsistency between the intended and actual experience. The underline provides the primary affordance signifier. This decision may be revisited in a future iteration as client support improves.

Primary button background onDark hover unchanged

Decision: Primary button background does not change on hover in dark mode.

Rationale: In dark mode the primary button uses arctic-400 as its background. The hover state behaviour of deepening the background colour — which works in light mode by shifting from marine-500 to marine-700 — does not have a clear equivalent in the arctic scale at the current time. Rather than introduce an untested hover value, the background remains unchanged in dark mode. This is a known limitation to be revisited in a future iteration.

Email Structure

Three-wrapper architecture

Decision: Every email uses three full-width wrappers: hero wrapper, content wrapper, footer wrapper. Each contains an inner container constrained to 36em (576px).

Rationale: Full-width wrappers create the edge-to-edge colour bands that give the email its visual structure. Without them, background colours would be constrained to the content width and the layout would feel narrow and box-like. The inner container ensures content remains readable at the correct width while the wrapper creates the visual environment.

Unsubscribe link required in marketing emails only

Decision: The unsubscribe link is required in all marketing emails. It is not required for service or transactional communications.

Rationale: Under PECR and GDPR, marketing emails must provide a clear and easy mechanism to opt out of future communications. Service and transactional emails — account notifications, payment confirmations, security alerts — are exempt from this requirement as they are not marketing communications. Applying the unsubscribe requirement universally would be incorrect and potentially confusing for recipients of service communications.

Dark mode implemented via three CSS mechanisms

Decision: Dark mode uses prefers-color-scheme media query, [data-ogsb] attribute selector for Outlook mobile, and a separate Yahoo Mail selector.

Rationale: No single CSS mechanism covers all email clients that support dark mode. prefers-color-scheme is the web standard but Outlook on iOS and Android uses a data attribute approach. Yahoo Mail has its own non-standard implementation. All three mechanisms reference the same semantic token values, ensuring a consistent experience regardless of which client triggers the switch.

Footer navigation always present

Decision: Footer navigation is always present regardless of email objective, unlike header navigation which requires deliberate consideration.

Rationale: By the time a reader reaches the footer, they have consumed the email’s content. The primary CTA opportunity has passed. Providing navigation links in the footer gives engaged readers a path to explore further without creating the premature journey abandonment risk that header navigation introduces. The footer is a natural place for wayfinding — the header is not.

Header navigation requires deliberate consideration

Decision: The navigation bar in the header should be a considered inclusion, not a default. Suppress it when the email has a single-minded CTA.

Rationale: The navigation bar gives the reader an immediate exit route from the email journey. For emails designed to drive one specific action — a product application, a rate change response — every navigation link is a competing destination that risks the reader abandoning the intended journey before completing it. The default should be to omit the navigation for CTA-focused emails and include it only when the email benefits from giving the reader broader website access.

Responsive behaviour minimal by design

Decision: Only H1 typography and image border radius have defined responsive overrides. All other elements are designed to work across desktop and mobile without media queries.

Rationale: Some email clients strip media queries entirely, which can cause layouts that rely on responsive behaviour to break in unexpected ways. The system is designed to be robust without media queries — spacing, type scale and layout all work at both desktop and mobile widths without intervention. Responsive overrides are limited to cases where the visual difference between desktop and mobile genuinely requires adjustment: H1 display size and image border radius curves.

Multi-Brand Architecture

Single template serving two brands via Liquid

Decision: The system serves SBS and Intermediaries from a single HTML template, with brand assets, colours and typography controlled dynamically through Liquid conditionals in Taxi for Email.

Rationale: Maintaining separate templates for each brand multiplies the maintenance overhead — every system update requires changes in multiple places, creating risk of inconsistency and error. A single template with brand logic handled at the variable level means system updates happen once and propagate to all brands automatically. The Liquid conditional approach was not available natively in Taxi at the time — it required custom implementation.

Legacy brand versions maintained in system

Decision: Two legacy brand versions (Vi24) are maintained alongside the current brand (Vi25) within the design system.

Rationale: Financial services organisations face a specific operational challenge: regulatory communications must go out quickly, but rebranded assets require review and sign-off that takes time. The design system deliberately maintained legacy brand versions to enable regulatory communications to be built and sent against an approved brand without waiting for re-approval against the new brand. This is agility within compliance constraints — not technical debt.

Accessibility solutions built from scratch

Decision: The European Accessibility Act was incoming at the time of development but tooling had not caught up. Contrast systems, semantic markup patterns and dark mode token logic were built without native platform support.

Rationale: Taxi for Email and most comparable platforms had no native accessibility framework at the time of development. Rather than wait for tooling to catch up or accept an inaccessible system, solutions were built from first principles — a full contrast matrix validating every surface/text combination, semantic markup patterns that work within the table-based email layout model, and a three-mechanism dark mode implementation covering the major clients. These solutions predate what is now becoming industry standard practice.

Token Architecture

Three-tier architecture

Decision: The token system uses three tiers: Primitive (raw values), Semantic (intent), Component (specific usage). Component tokens reference semantic tokens. Semantic tokens reference primitives. Raw values are never used directly in component tokens.

Rationale: A flat token system — where component tokens reference hex values directly — breaks when the system evolves. Changing a brand colour requires finding and updating every component that uses it. A three-tier architecture means changing a primitive propagates through every semantic and component token that references it automatically. The semantic layer also means the intent of a colour is documented in its name, not just its value.

Surface tokens as the root design decision

Decision: Surface tokens govern how every component responds to its background context. The surface choice is the root design decision in every content block.

Rationale: Every other colour decision in a content block — text, headlines, buttons, hyperlinks — follows from the surface choice. By making the surface the root token and deriving everything else from it via the onLight/onDark pattern, the system encodes the design rules into the architecture. A developer applying the correct surface token automatically gets the correct text, headline and button tokens without needing to consult documentation for every combination.

Gradient stops as tokens

Decision: Hero gradient stops are tokenised individually (start, mid, end, fallback, angle) rather than as a single composite value.

Rationale: A single gradient token would be opaque — it would not communicate the colour values involved or allow individual stops to be updated independently. Tokenising each stop makes the gradient construction transparent, allows individual colours to be traced back to their primitives, and makes the relationship between the gradient and its fallback explicit. The fallback token pointing to the same mid-point primitive as the main gradient ensures visual consistency when gradients are not supported.