Button
Primary and ghost. Primary text is white on --accent-solid (5.2:1).
HTML
<a class="btn" href="/work/">View work</a>
<a class="btn ghost" href="mailto:…">Get in touch</a>Design system
Every value below is read from tokens.css when the site is built, and every component is the real one used on the other pages — so this page cannot fall out of date.
One theme, tuned properly, rather than two themes tuned half-way.
Blue is the only colour that means "interactive". Everything else is neutral.
Movement explains change (a page wiping in, a screen swapping). It is switched off when the visitor asks for reduced motion.
Every text colour is measured against its background. Faint text still clears AA.
Type and spacing scale with the viewport through clamp(), so there are few breakpoints.
A visible focus ring on everything, and a skip link at the top of every page.
Contrast is measured with the WCAG formula against the page background unless stated.
#07090fPage background#0d121cCards and panels#141b29Raised or hovered surface#eef2f9Primary text17.73:1 · AAA on bg#8f9bb0Secondary text7.09:1 · AAA on bg#7a869bCaptions and metadata5.41:1 · AA on bg#3b82ffInteractive text and glow5.52:1 · AA on bg#5eb8ffHighlights and focus9.27:1 · AAA on bg#2563ebFills that carry white text5.17:1 · AA white text on it#04122eText on bright fills8.64:1 · AAA on accent-brightrgb(255 255 255 / 0.09)Hairline bordersrgb(255 255 255 / 0.18)Emphasised bordersrgb(59 130 255 / 0.35)Soft accent shadowDisplay
Space Grotesk
'Space Grotesk Variable'Body
DM Sans
'DM Sans Variable'EYEBROW LABEL
Secondary text and labels
Body copy sits at this size and a 1.6 line height.
A clear, calm interface for complex tasks
Products people use
Ship.
0.25rem · 4px0.5rem · 8px0.75rem · 12px1rem · 16px1.5rem · 24px2rem · 32px3rem · 48px4rem · 64px6rem · 96px14pxclamp(1.25rem, 4vw, 4rem)Side padding that grows with the screen.
76pxWidth of the left navigation rail. It becomes a bottom bar under 800px.
Press play to compare the two easings at the same distance.
cubic-bezier(0.2, 0.7, 0.2, 1)cubic-bezier(0.76, 0, 0.18, 1)0.2sHover and colour changes.
0.5sReveals and swaps.
0.7sPage-to-page transition, using ease-wipe.
Primary and ghost. Primary text is white on --accent-solid (5.2:1).
<a class="btn" href="/work/">View work</a>
<a class="btn ghost" href="mailto:…">Get in touch</a>Short context labels, such as discipline, client and dates.
<span class="pill solid">UX Rescue · Mobile App</span>
<span class="pill">2020 – 2023</span>Technology tags. Add hover when it sits in a skills grid.
<span class="chip solid">OutSystems</span>
<span class="chip hover">Figma</span>A single big number with its label.
<dl>
<div class="stat"><dt>Industry awards</dt><dd>5</dd></div>
</dl>The standard container for grouped content.
Consumed by inbound calls for routine policy modifications.
<div class="card">…</div>A pulled quote with an accent rule, for the brief or a key moment.
The brief
"Fix the UX so the app can actually be used — rather than being scrapped in full."
<blockquote class="callout">
<p class="cl">The brief</p>
<p>"Fix the UX so the app can be used."</p>
</blockquote>Year, title and source in a ruled list. Used for awards.
<ul class="ledger">
<li><span class="yr">2021</span><span class="nm">Best Digital Bank</span><span class="by">Digital Banker Awards</span></li>
</ul>Larger patterns — the side rail, the device scroller, the scroll-scrubbed video and the gallery — live in src/components and are used on the home and case-study pages.