Design System / v1.0

Design built
for impact.

The complete visual system behind UXcellerate. Every color, type style, spacing rule, component, and setup instruction. Built to work identically in Canva and Figma.

4 core colors 3 typefaces Buddy spacing 6 components
01 / Brand

The three rules.

Three guardrails that keep every UXcellerate deliverable on-brand, whether it's a landing page mockup, a CRO report, or a vinyl sign.

1

Confident, never cute.

Type is heavy, layouts are decisive, edges are hard. Color and motion provide the playfulness. Copy and forms do not.

2

Contrast over decoration.

Hierarchy comes from size, weight, and color. Never from gradients, glows, or blurs. If something needs to pop, make it bigger and put a hard shadow on it.

3

Show the system.

Borders, grids, mono labels, hex codes. Letting the construction show is the brand. We are the design people, we should look like it.

02 / Color

Color tokens.

Four core colors do 95% of the work. Three accents handle labels and callouts. A small vault exists for links, errors, and edge cases. That's it.

Working set

Ink#000D14
All borders, body text, ink shadows on light surfaces.
Marine#012438
Dark page background. The canvas this system was built for.
Paper#F3FAFF
Light page background. Subtle blue tint keeps it in the family.
White#FFFFFF
Card surfaces, content blocks that need to sit on marine.
Lime#BDF752
Signature accent. Primary CTAs, lime shadows on dark, highlights.
Sky#C2E8FF
Category labels (UX, CRO), soft callouts, info backgrounds.
Mint#F2FDDC
Context labels (Case study, Blog), tip callouts, alt to sky.

Vault (used rarely)

Link#009FFD
Inline hyperlinks only.
Link Hover#00619B
Hyperlink hover state.
Red#F54343
Form errors and destructive actions only. Never decoration.

Color discipline rule.

Case study metrics stay ink-colored. Size and weight do the work, not color. Coloring +817% green signals "this needs help to read." Leaving it ink signals "the number speaks for itself."

03 / Typography

Type system.

Three typefaces, ten styles. Work Sans 900 for everything heavy, Red Hat Text for paragraphs, IBM Plex Mono for labels and code. All three live in Canva's native library.

Complete scale

metric +817% 104px
lh 0.95 / -3px
Work Sans 900
display Design. 96px / 6rem
lh 1.0 / -2.5px
Work Sans 900
h1 Page title 64px / 4rem
lh 1.05 / -1.5px
Work Sans 900
h2 Section title 48px / 3rem
lh 1.1 / -1px
Work Sans 900
h3 Sub-section 32px / 2rem
lh 1.15 / -0.5px
Work Sans 900
h4 Card or callout title 20px / 1.25rem
lh 1.3 / 0
Work Sans 900
body-lg Intro paragraphs and leads use this slightly larger size. 20px
lh 1.5
Red Hat Text 400
body Default paragraph size. 400 regular, 600 emphasis, 700 strong. 16px
lh 1.5
Red Hat Text 400/600/700
body-sm Captions, footnotes, supporting text. 14px
lh 1.5
Red Hat Text 400
label UX / CRO / Web Design 12px
lh 1.4 / +1.5px
IBM Plex Mono 500

Five type rules

Always 900

Headings use Work Sans weight 900. Never "bold" in CSS. Always the explicit number.

Sentence case

ALL CAPS is reserved for display and label only. Body content stays sentence case.

One display

Display (96px) is the page's loudest voice. Use it once at the top. Never twice.

Numbers stay ink

Metrics in case studies are ink-colored. Size does the work, never color.

Italics for quotes

Red Hat Text italic is reserved for client testimonials and pull quotes. Never for emphasis (use bold).

04 / Spacing

The buddy system.

Built on an 8px base with one 4px exception. Each space token is named after a relationship distance. You're not picking a number, you're asking: how close ARE these two things?

Bestiesinseparable
4px
Siblingssame household
8px
Friendshang out often
16px
Colleaguessee you at work
24px
Acquaintancesfriendly nod
32px
Neighborswave from driveway
48px
Strangersnever met
64px
Total strangersnever will
80px

Pairing rules

Layout rules

The buddy system meets the real world. These are the specific values used to lay out pages on uxcellerate.nl, mapped back to buddy tokens where possible.

Layout ruleDesktopMobileToken mapping
Container max width1440px1440pxfixed
Container side padding16px10pxfriends / exception
Section top & bottom padding80px40pxtotal-strangers / half
Section title → content64px32pxstrangers / acquaintances
Between card elements (X & Y)16px16pxfriends
Text content → images32px32pxacquaintances

The 10px mobile exception.

Mobile container padding is the only value that breaks the 8px grid. 16px feels cramped at small viewports, 8px feels too tight to the screen edge. 10px is the sweet spot. Document the exception, then forget about it.

05 / Effects

Borders, radius, shadows.

Borders are always 2px solid ink. Radius has four values. Shadows are asymmetric (1:1.5 ratio, heavier on the bottom), come in three sizes, and swap color based on the surface they're on.

Radius

None
0 / r-none
Input
16px / r-input
Card
24px / r-card
Pill
9999px / r-pill

Shadows on light

SM ink
2px 3px 0 ink
MD ink
4px 6px 0 ink
LG ink
8px 12px 0 ink

Shadows on dark

SM lime
2px 3px 0 lime
MD lime
4px 6px 0 lime
LG lime
8px 12px 0 lime

Shadow rule.

Card on a light surface gets an ink shadow. Card on a dark surface gets a lime shadow. Button shadow is always ink, regardless of surface, because a lime button on dark with a lime shadow would lose its edge.

Grid pattern (marine surface treatment)

The signature treatment for any marine background. 64px windowpane grid in a slightly lighter navy. Aligns with the strangers spacing token, so cards and content snap visually to the grid without any extra effort.

// 64px × 64px windowpane on marine
Implementation

Drop-in grid background.

Two crossed linear gradients painted on top of the marine base color. No images, no extra HTTP requests, scales infinitely.

/* Apply to any marine surface */
.uxc-grid {
  background-color: #012438;            /* marine */
  background-image:
    linear-gradient(to right, #0D5164 1px, transparent 1px),
    linear-gradient(to bottom, #0D5164 1px, transparent 1px);
  background-size: 64px 64px;
}
How it works: Two linear gradients (one vertical, one horizontal) draw a single 1px line at the edge of each 64px tile, with transparent everywhere else. When tiled with background-size: 64px 64px, the lines form a perfect windowpane.
Token mapping: The 64px tile size = strangers spacing token. The grid line color is a vault token: grid-line / #0D5164. Both intentional, so the grid integrates with the buddy system rather than fighting it.
Where to use: Apply to body, hero sections, dark cards/case studies, anywhere marine background sits behind content. Skip it on small surfaces (under ~200px) where the grid won't repeat enough to read as a pattern.
07 / Icons

Icon system: Lucide outline, 2px.

No custom icon set needed. Lucide icons at 2px stroke weight match the system's border token exactly, so icons visually belong with everything else. Outline style only.

Sample icons (all Lucide, 2px stroke)

target
search
chevrons
lightbulb
check
arrow-up-right
info
star

Icon sizes

SizeUse
16pxInline with body text, inside labels
20pxInside buttons (next to text), inline with H4
24pxDefault standalone size, list items, feature cards
32pxSection headers, callout icons
48pxHero icons, feature illustrations
08 / Components

Live components.

Six components, each shown on light and dark surfaces. Every shadow, radius, padding, and border value is locked. Build once, use forever.

Buttons

Labels and tags

// on paper
UX / Product Design Case study Featured Draft
// on marine, shadows auto-swap to lime
UX / Product Design Case study Featured Draft
Implementation

Drop-in label class.

A defensive label class that stays sized to its content at every viewport. Solves the "label stretches to 100% width on mobile" problem caused by applying it to block elements like paragraphs.

/* Sky default. Works inline or standalone. */
.uxc-label {
  display: inline-block;
  max-width: fit-content;          /* prevents mobile stretch */

  font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  line-height: 1.2;

  background: #C2E8FF;
  color: #000D14;
  border: 2px solid #000D14;
  border-radius: 9999px;
  padding: 8px 16px;
  box-shadow: 2px 3px 0 #000D14;

  text-decoration: none;
  vertical-align: middle;
  margin: 0;
}

/* Color variants */
.uxc-label--mint  { background: #F2FDDC; }
.uxc-label--lime  { background: #BDF752; }
.uxc-label--white { background: #FFFFFF; }
Why inline-block: Works for both standalone labels (in a Paragraph block) and inline labels (inside other text via a span). max-width: fit-content defends against mobile stretching when the class lands on a block element.
Gutenberg method A (easy): Add a Paragraph block, type your label text, open Advanced → "Additional CSS class(es)" and paste uxc-label (or uxc-label uxc-label--mint for a variant).
Gutenberg method B (inline): Edit any block as HTML and wrap text in <span class="uxc-label">...</span>. Use this when the label sits within other text.
If the label looks centered: it's the parent container, not the label. Check the block's alignment toolbar in Gutenberg and any wrapping Group/Columns block for centered alignment. Fix at the container level, not in this CSS.

Highlight pattern

// one per headline, max two per page. Try a multi-line headline to see the depth effect on the line above.

Pages get tested.
Designs get shipped. Numbers get moved.

Test, fail, iterate, win.

Implementation

The depth trick.

The highlight sits behind the heading text so descenders from the line above (g, y, p, j) appear on top of the lime block instead of getting covered by it. Editorial design detail. The pseudo-element + z-index: -1 is what makes it work.

/* The element holds layout, the ::before holds the lime block */
.highlight {
  position: relative;
  color: #000D14;
  padding: 0 0.15em;
  display: inline-block;
  line-height: 1;
}
.highlight::before {
  content: '';
  position: absolute;
  inset: 0;
  background: #BDF752;
  border: 2px solid #000D14;
  border-radius: 12px;
  z-index: -1;
}

/* Critical: heading owns the stacking context.
   Without this, z-index: -1 pushes the lime behind the page entirely. */
h1, h2, h3, h4 { isolation: isolate; }
HTML usage: <span class="highlight">impact.</span> Punctuation goes inside the span so the lime block looks finished.
WordPress / Gutenberg: Paste the CSS above into Appearance → Customize → Additional CSS. In any Heading block, open the three-dot menu → Edit as HTML and wrap your highlighted word in <span class="highlight">...</span>. Switch back to Edit visually and you're done.

Cards (white default, lime feature, metric variant)

// three variants on marine
Principle

Research first, ego last.

Design without research is just decoration. No fluff. No guesswork. Every decision has a purpose.

Featured

+817% demo CTR uplift.

Cierpa Kaizen redesign. Four weeks, one product page, four times the demo requests.

+817%
Demo CTR uplift

Form fields

// click an input to see the focus state
Send brief

Callouts (with Lucide icons)

// three intent variants

Heads up.

Sky callouts: neutral information and process notes.

Pro tip.

Mint callouts: best practices, recommendations, "do this instead" notes.

Worth highlighting.

Lime callouts: the most important takeaways. One per page, max.

Everything together: a case study block

UX / CRO Case study

Cierpa Kaizen went from invisible to irresistible.

A product page rewrite and redesign that turned a wall of jargon into a clear value proposition. Four weeks of work, four times the demo requests.

+817%
Demo CTR uplift
+45%
Time on page
4x
Demo requests / month
09 / Token reference

Copy-paste tokens.

Every value, ready to drop into Canva's Brand Kit or Figma's Variables panel.

Colors

TokenHexNotes
ink#000D14Borders, type
marine#012438Dark page background
paper#F3FAFFLight page background
white#FFFFFFCard surfaces
lime#BDF752Signature accent
sky#C2E8FFSoft callouts, labels
mint#F2FDDCTip callouts, labels
link#009FFDHyperlinks (vault)
link-hover#00619BHyperlink hover (vault)
red#F54343Errors only (vault)

Typography

RoleFontSize / line-height / tracking
metricWork Sans 900104px / 0.95 / -3px
displayWork Sans 90096px / 1.0 / -2.5px
h1Work Sans 90064px / 1.05 / -1.5px
h2Work Sans 90048px / 1.1 / -1px
h3Work Sans 90032px / 1.15 / -0.5px
h4Work Sans 90020px / 1.3 / 0
body-lgRed Hat Text 40020px / 1.5 / 0
bodyRed Hat Text 400/600/70016px / 1.5 / 0
body-smRed Hat Text 40014px / 1.5 / 0
labelIBM Plex Mono 50012px / 1.4 / +1.5px / UPPERCASE

Spacing, radius, border, shadow

GroupTokenValue
Spacingbesties4px
Spacingsiblings8px
Spacingfriends16px
Spacingcolleagues24px
Spacingacquaintances32px
Spacingneighbors48px
Spacingstrangers64px
Spacingtotal-strangers80px
Radiusr-input16px
Radiusr-card24px
Radiusr-pill9999px
Borderborder2px solid ink
Shadowsh-sm-ink2px 3px 0 #000D14
Shadowsh-sm-lime2px 3px 0 #BDF752
Shadowsh-md-ink4px 6px 0 #000D14
Shadowsh-md-lime4px 6px 0 #BDF752
Shadowsh-lg-ink8px 12px 0 #000D14
Shadowsh-lg-lime8px 12px 0 #BDF752
10 / Installation

Drop it in your tools.

Step-by-step for Canva Brand Kit and Figma Variables. Both tools stay in sync as long as you only edit token values inside these two locations.

Canva / Brand Kit

Set up in Canva.

Requires Canva Pro or Teams.

  1. Open Brand Hub at canva.com/brand. Create a Brand Kit called UXcellerate v1.
  2. Add color palettes in three groups: Core (ink, marine, paper, white), Accents (lime, sky, mint), Vault (link, link-hover, red). Paste each hex from section 09.
  3. Add brand fonts: Work Sans 900 as Heading, Red Hat Text 400/600/700 as Body, IBM Plex Mono 500 as a custom style. All three are in Canva's native library.
  4. Upload logos: all three lockups (horizontal wordmark, vertical lockup, mark only), each in on-dark and on-light variants.
  5. Build template starters: one Instagram post, one A4 doc, one presentation cover, one LinkedIn post. Save as Brand Templates.
  6. Discipline: only pull colors from the Brand Kit panel, never the picker. This is the rule that keeps everything consistent.
Limitation: Canva can't store shadow, radius, or border tokens. Save one "Component Reference" design with examples of buttons, cards, callouts, and the highlight pattern. Duplicate from it for new pieces.
Figma / Variables + Styles

Set up in Figma.

Use a single source-of-truth library file.

  1. New file: UXcellerate / Design System.
  2. Color variables: Variables panel → new collection UXcellerate Tokens → add a Color group. Paste each hex from section 09 as a variable.
  3. Number variables: same collection. Groups for spacing (besties through total-strangers), radius (input, card, pill), border (always 2).
  4. Effect styles: six Drop Shadow styles. Blur = 0 on all. X/Y offsets and color per section 09.
  5. Text styles: ten styles (metric, display, h1-h4, body-lg, body, body-sm, label) using the specs from section 03.
  6. Component starter set: build Button, Label, Card, Input, Callout, Highlight as components using only variables and styles. No hardcoded values.
  7. Publish: Publish library so all other Figma files can use it.
Pro tip: Add a Light/Dark mode to your Variables collection later. The token names stay the same, the hex values swap per mode. Use this when building case studies that need both versions.

Source of truth.

This document is the single source of truth. When a token value changes, change it here first, then update Canva and Figma to match. Never edit a token in only one tool.