light · bold · sans · commerce · fitness · monochrome · pill · athletic · e-commerce

DESIGN.md inspired by Gymshark

Pure white canvas, black ink, Montserrat bold display over Roboto body — every CTA a fully-rounded 56px pill.

By webdesignhot · www.gymshark.com
$ npx @webdesignhot/design-md add gymshark
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #ffffff
  • surface #ffffff
  • surface-soft #f4f4f4
  • surface-warm #fafafa
  • ink #000000
  • text AAA · 21.0 #000000
  • text-strong #000000
  • text-muted #53565a
  • text-soft #6b6e72
  • brand AAA · 21.0 #000000
  • brand-hover #1a1a1a
  • brand-active #000000
  • on-brand #ffffff
  • steel #53565a
  • steel-hover #42454a
  • steel-active #383b3f
  • on-steel #ffffff
  • border AAA · 21.0 #000000
  • border-soft #e2e2e2
  • border-muted #cfcfcf
  • link #000000
  • link-hover #53565a
  • selected #000000
  • disabled-bg #e2e2e2
  • disabled-text #9a9da1
  • sale #d12b2b
  • sale-deep #9e1f1f
  • success #1f8a4c
  • warning #b46a00
  • danger #d12b2b
  • info #1457d6
  • scrim rgba(0,0,0,0.55)
  • ring #000000
  • ring-on-dark #ffffff
Typography
Ship faster than ever.
display-hero Montserrat 80px w700 -0.03em
Ship faster than ever.
display-lg Montserrat 56px w700 -0.02em
Ship faster than ever.
h1 Montserrat 40px w700 -0.018em
Ship faster than ever.
h1-live Montserrat 32px w700 -0.012em
Built for teams that ship.
h2 Montserrat 32px w600 -0.012em
A complete kit
h3 Montserrat 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h4 Montserrat 20px w600 0
The quick brown fox jumps over the lazy dog.
body-lg Roboto 18px w400 0
The quick brown fox jumps over the lazy dog.
body Roboto 16px w400 0
The quick brown fox jumps over the lazy dog.
body-strong Roboto 16px w600 0
The quick brown fox jumps over the lazy dog.
price Roboto 16px w600 0
The quick brown fox jumps over the lazy dog.
body-sm Roboto 14px w400 0
The quick brown fox jumps over the lazy dog.
button Montserrat 14px w600 0.04em
OUR DESIGN SYSTEM
label Roboto 13px w500 0.02em
OUR DESIGN SYSTEM
caption Roboto 12px w500 0.02em
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 24px
  • step-6 32px
  • step-7 48px
  • step-8 64px
  • step-9 96px
Radius
  • micro 2px
  • sm 4px
  • md 8px
  • lg 12px
  • xl 16px
  • pill 56px
  • circle 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 6/8 mapped · webdesignhot/0.1

Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.

  • background bg
  • foreground text
  • primary brand
  • primary-foreground on-brand
  • accent steel
  • muted text-muted
  • border
  • ring
Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Gymshark
tagline: Pure white canvas, black ink, Montserrat bold display over Roboto body — every CTA a fully-rounded 56px pill.
updated_at: 2026-05-28T23:13:29.776Z
published_at: 2026-05-28T23:13:29.776Z
author: webdesignhot
source_url: https://www.gymshark.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [retail]
tags: [light, bold, sans, commerce, fitness, monochrome, pill, athletic, e-commerce]
preview_swatch: ['#ffffff', '#000000', '#53565a']
related: [nike, adidas, supreme]
description: 'Gymshark''s storefront is a high-contrast monochrome machine — pure white canvas (`#ffffff`), true-black ink (`#000000`), and a single steel grey (`#53565a`) doing all the work of an accent. Montserrat Bold towers over section heads at 32px / 700 while Roboto carries body copy at a calm 16px / 400, the classic display-over-utility pairing that reads athletic without shouting. Every call-to-action is a fully-rounded 56px pill — there are no square buttons in the system — and the brand toggles between two pill treatments: a crisp white pill with black ink for low-key actions and a steel-grey pill (`#53565a`) with white text for the structural ones. The result is a confident, gym-floor-direct commerce surface: black-and-white base, vivid product photography carrying the colour, and the shark-fin logo as the only ornament. It is built for a Gen-Z UK fitness audience that wants speed, clarity, and a community register — bold, athletic, no decorative furniture between the image and the buy button.'


# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  accent: steel
  muted: text-muted
colors:
  bg: '#ffffff'                    # canvas — primary page floor, full-bleed white
  surface: '#ffffff'               # default card / sheet surface
  surface-soft: '#f4f4f4'          # soft grey — product image stage, alt section band
  surface-warm: '#fafafa'          # subtle alt-row tint
  ink: '#000000'                   # true-black primary text + brand ink on every surface
  text: '#000000'                  # body
  text-strong: '#000000'           # display — same as body; weight carries hierarchy
  text-muted: '#53565a'            # steel — secondary metadata, product subtitle, footer link
  text-soft: '#6b6e72'             # lowest-emphasis utility (still AA on white)
  brand: '#000000'                 # Gymshark's brand "color" — the black/shark-fin aesthetic
  brand-hover: '#1a1a1a'           # black surface lifts slightly on hover
  brand-active: '#000000'          # press = bg unchanged, surface dims via opacity
  on-brand: '#ffffff'              # white text on black brand surfaces
  steel: '#53565a'                 # the system's structural grey — primary pill, accent
  steel-hover: '#42454a'           # steel pill deepens on hover
  steel-active: '#383b3f'          # steel pill pressed
  on-steel: '#ffffff'              # white text on steel pills
  border: '#000000'                # crisp 1px black outline on white pills / inputs
  border-soft: '#e2e2e2'           # 1px hairline divider — filter rows, footer columns
  border-muted: '#cfcfcf'          # mid-grey divider on grey surfaces
  link: '#000000'                  # default link = ink + underline
  link-hover: '#53565a'            # link hover softens to steel
  selected: '#000000'              # selected filter = inverted ink chip
  disabled-bg: '#e2e2e2'
  disabled-text: '#9a9da1'
  sale: '#d12b2b'                  # the only red — discounted price + "% off" copy
  sale-deep: '#9e1f1f'             # sale price hover / pressed
  success: '#1f8a4c'               # in-stock, eligibility tick
  warning: '#b46a00'
  danger: '#d12b2b'
  info: '#1457d6'                  # informational badge / link accent — rare
  scrim: 'rgba(0,0,0,0.55)'        # modal backdrop
  ring: '#000000'                  # focus ring on light surfaces
  ring-on-dark: '#ffffff'         # focus ring on ink / photographic surfaces

typography:
  display:
    family: 'Montserrat, system-ui, -apple-system, sans-serif'
    weights: [500, 600, 700]
  body:
    family: 'Roboto, system-ui, -apple-system, sans-serif'
    weights: [400, 500, 600]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 80, weight: 700, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h1:              { size: 40, weight: 700, lineHeight: 1.1,  tracking: '-0.018em', family: display }
    h1-live:         { size: 32, weight: 700, lineHeight: 1.15, tracking: '-0.012em', family: display }
    h2:              { size: 32, weight: 600, lineHeight: 1.2,  tracking: '-0.012em', family: display }
    h3:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
    h4:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '0',        family: display }
    body-lg:         { size: 18, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body:            { size: 16, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body-strong:     { size: 16, weight: 600, lineHeight: 1.55, tracking: '0',        family: body }
    body-sm:         { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    button:          { size: 14, weight: 600, lineHeight: 1.2,  tracking: '0.04em',   family: display, transform: uppercase }
    label:           { size: 13, weight: 500, lineHeight: 1.4,  tracking: '0.02em',   family: body }
    caption:         { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0.02em',   family: body }
    price:           { size: 16, weight: 600, lineHeight: 1.4,  tracking: '0',        family: body, opentype: ['tnum'] }

radius:
  micro: 2
  sm: 4
  md: 8
  lg: 12
  xl: 16
  pill: 56                         # every CTA — the universal Gymshark shape (very rounded)
  circle: 9999                     # icon buttons, swatch dots, avatars

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96]

layout:
  page-width: 1280
  prose-width: 720
  header-height: 64
  section-gap: 48

components:
  button-primary:
    bg: '#53565a'
    color: '#ffffff'
    radius: 56
    padding: '14px 28px'
    height: 48
    font: button
    use: 'The structural CTA — steel pill, white uppercase label. "Add to Bag", "Shop Now", "Continue".'
  button-primary-hover:
    bg: '#42454a'
    use: 'Steel pill deepens on hover; no lift, no scale.'
  button-light:
    bg: '#ffffff'
    color: '#000000'
    border: '1px solid #000000'
    radius: 56
    padding: '14px 28px'
    height: 48
    use: 'Crisp white pill, black ink + 1px black outline. Low-emphasis / on-light alternate.'
  button-on-image:
    bg: '#ffffff'
    color: '#000000'
    radius: 56
    padding: '12px 24px'
    use: 'White pill anchored over campaign / category photography — "Shop", "Explore".'
  button-icon-circular:
    bg: '#f4f4f4'
    color: '#000000'
    radius: 9999
    width: 44
    height: 44
    use: 'Wishlist heart, carousel paddle, search toggle, bag — circular chrome control.'
  card:
    bg: '#ffffff'
    border: 'none'
    radius: 0
    padding: 0
    use: 'Product tile — image full-bleed on soft grey, metadata stacked below at 8px gap.'
  card-image:
    bg: '#f4f4f4'
    radius: 0
    aspect: '3:4'
    use: 'Portrait product photograph backdrop — soft grey studio stage.'
  input:
    bg: '#ffffff'
    border: '1px solid #000000'
    color: '#000000'
    radius: 8
    padding: '12px 14px'
    use: 'Form field — black 1px outline on white, clean and high-contrast.'
  input-focused:
    bg: '#ffffff'
    border: '2px solid #000000'
    use: 'Focus thickens the outline to 2px black; no glow, no colour shift.'
  badge:
    bg: '#000000'
    color: '#ffffff'
    radius: 56
    padding: '4px 12px'
    font: caption
    use: '"New", "Best Seller", "Restock" — black pill, white uppercase text, on product imagery.'
  badge-sale:
    bg: 'transparent'
    color: '#d12b2b'
    use: 'Inline price-row sale signalling — red text, no container.'
  filter-chip:
    bg: '#ffffff'
    color: '#000000'
    border: '1px solid #000000'
    radius: 56
    padding: '8px 16px'
    use: 'PLP filter pill — black outline default, flips to filled black when active.'
  filter-chip-active:
    bg: '#000000'
    color: '#ffffff'
    radius: 56
    use: 'Selected filter — fully inverted ink, no middle state.'
  nav:
    bg: '#ffffff'
    color: '#000000'
    height: 64
    radius: 0
    use: 'Shark-fin logo left, centered category nav, search + account + bag right. Active link 2px black underline.'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  card-hover: 'image opacity 1 → 0.92 over 240ms; no lift, no scale'
  cta-hover: 'steel pill #53565a → #42454a over 150ms'
  reduced-motion: 'respects prefers-reduced-motion: reduce — opacity transitions degrade to instant; hover becomes a no-op.'

breakpoints:
  mobile: 640
  tablet: 1024
  desktop: 1280
  wide: 1536

shadows:
  ambient: 'none — Gymshark chrome is flat; depth comes from photography'
  hairline: '1px solid #e2e2e2'                  # divider rows, footer columns
  modal: 'rgba(0,0,0,0.18) 0 12px 32px'
  scrim: 'rgba(0,0,0,0.55)'
  ring: '0 0 0 2px #000000'

accessibility:
  contrast-text-on-bg: 21.0                       # #000000 on #ffffff — AAA
  contrast-on-steel: 7.38                         # #ffffff on #53565a — AAA
  contrast-muted-on-bg: 7.38                      # #53565a on #ffffff — AAA
  contrast-soft-on-bg: 5.12                       # #6b6e72 on #ffffff — AA
  contrast-sale-on-bg: 4.9                        # #d12b2b on #ffffff — AA
  focus-ring: '2px solid #000000 with 2px outline-offset on light surfaces; 2px solid #ffffff on ink / photographic surfaces'
  reduced-motion-honored: true
  touch-target-min: 44
  keyboard-nav: 'Tab: logo → primary nav → search → account → wishlist → bag → main grid → filter rail → footer. Filter chips arrow-key navigable inside chip group.'

dark-mode: null   # Light-only storefront. Campaign bands flip to ink (#000000) momentarily but the page proper resumes white. No system-driven dark variant.
---

## 1. Visual Theme & Atmosphere

Gymshark's storefront runs on one disciplined idea: **black and white carry the chrome, the photography carries the colour.** Every page is built on a pure white canvas (`#ffffff`) with true-black ink (`#000000`), and the only structural colour in the entire interface is a single steel grey (`#53565a`) reserved for the brand's most important pills. There is no decorative gradient, no soft drop-shadow nostalgia, no accent palette used for "tone" — the system saves every drop of chromatic energy for the product imagery and the athletes who wear it. The result reads like a gym-floor poster that learned how to sell: confident, high-contrast, no furniture between the image and the buy button.

The display voice is Montserrat Bold — a geometric sans cut for impact — set at the live 32px / 700 for section heads and scaling up to billboard sizes for campaign moments. Underneath it, Roboto handles every line of body copy at a calm 16px / 400, the classic display-over-utility pairing that signals "athletic" without shouting. The contrast between the two families is part of the brand's signature: Montserrat is the coach's voice; Roboto is the spec sheet. There is almost no middle ground — the jump from a bold 32px head to a quiet 16px body is intentional and creates the "headline above, detail below" rhythm across the product grid, the PDP, and the editorial bands.

The most physically distinctive element is the geometry: **every call-to-action is a fully-rounded 56px pill.** This is unusually round — far past the modest 8–12px corners of a typical SaaS button and rounder even than Nike's 30px CTA — and it gives the whole interface a soft, tactile, almost button-on-a-tracksuit feel. The system toggles between two pill treatments: a steel-grey pill (`#53565a`) with white text for structural actions ("Add to Bag", "Continue", region selectors), and a crisp white pill with black ink and a 1px black outline for the lower-emphasis alternate. There are no square buttons anywhere in the system — pill or circular-icon is the entire button vocabulary.

The atmosphere is athletic-direct, tuned for a Gen-Z UK fitness audience. A model mid-lift on a soft grey studio backdrop. A bold Montserrat headline. A row of portrait product tiles. A single steel pill that says "SHOP NOW". The community register — the "we train together" energy that built the brand on social — lives in the photography and the copy, not in the chrome. The chrome stays mathematical and monochrome so the people in the pictures own the page.

Where Nike reserves all colour for the photograph and keeps its CTA black, Gymshark does almost the same thing but swaps the structural pill to steel grey and rounds the corners harder — a softer, more approachable cousin of the same athletic-editorial discipline. The shark-fin logo is the only ornament the brand allows itself, and even that appears small, mono, and quiet at the top-left of the nav.

**Key Characteristics:**
- Pure monochrome base — `#ffffff` canvas, `#000000` ink, with a single steel grey (`#53565a`) as the only structural colour
- Montserrat Bold display (32px / 700 live) over Roboto body (16px / 400) — coach voice over spec sheet
- Every CTA is a fully-rounded **56px pill** — unusually round, the brand's most distinctive geometry
- Two-pill hierarchy: steel-grey pill (structural) versus white pill with black outline (alternate) — never both at once on the same surface
- Product photography on soft grey (`#f4f4f4`) studio backdrop carries 100% of the colour; chrome stays black/white
- No drop shadows — depth comes from photography and a single 1px hairline divider, never from CSS elevation
- Black pill badges ("New", "Best Seller") with white uppercase text sit on top of product imagery
- Shark-fin logo as the sole ornament — small, mono, quiet
- Community-athletic voice in copy and imagery; mechanical restraint everywhere else

## 2. Color Palette & Roles

### Primary
- **Canvas** (`#ffffff`) — paper-white default page floor; the white field behind every product grid, nav, and editorial band.
- **Ink** (`#000000`) — Gymshark's brand "colour" and the only ink the system commits to. Body text, headlines, product names, outlines, active filter chips, badge fills.

### Brand & Dark
- **Brand Black** (`#000000`) — the black/shark-fin aesthetic that defines Gymshark. Used for ink, badge pills, active filters, and campaign overlay bands. There is no separate brand hue — black *is* the brand.
- **Brand Hover** (`#1a1a1a`) — black surfaces lift very slightly on hover.

### Accent
- **Steel** (`#53565a`) [→ live CTA sample] — the system's single structural accent. The primary pill colour: steel-grey fill, white uppercase label. Also doubles as the muted-text colour. This is the only non-monochrome value used as chrome.
- **Steel Hover** (`#42454a`) — steel pill deepens on hover.
- **Steel Active** (`#383b3f`) — steel pill pressed.

### Interactive
- **Link** (`#000000`) — default link = ink + underline only.
- **Link Hover** (`#53565a`) — softens to steel on hover, never to a brand hue.
- **Selected** (`#000000`) — selected filter chip = inverted black fill, white text.
- **Disabled BG** (`#e2e2e2`)
- **Disabled Text** (`#9a9da1`)

### Neutral Scale
- **Ink** (`#000000`) — primary text, headlines, product names, prices, nav.
- **Steel** (`#53565a`) — product subtitles, footer links, secondary metadata (AAA on white at 7.38:1).
- **Text Soft** (`#6b6e72`) — lowest-emphasis utility text (AA on white at 5.12:1).
- **Disabled Text** (`#9a9da1`) — disabled labels only.

### Surface & Borders
- **Canvas** (`#ffffff`) — default page floor and card surface.
- **Surface Soft** (`#f4f4f4`) — product image stage, alt section band, icon-button fill.
- **Surface Warm** (`#fafafa`) — very subtle alt-row tint.
- **Border** (`#000000`) — crisp 1px black outline on white pills and inputs.
- **Border Soft** (`#e2e2e2`) — 1px hairline divider for filter rows and footer columns.
- **Border Muted** (`#cfcfcf`) — mid-grey divider on grey surfaces.

### Shadow Colors
- **None observed** for retail chrome — Gymshark does not use drop shadows on cards, buttons, or sections.
- **Modal** `rgba(0,0,0,0.18) 0 12px 32px` — the only real shadow, on overlays.
- **Scrim** `rgba(0,0,0,0.55)` — modal backdrop.

### Semantic
- **Sale / Danger** (`#d12b2b`) — discounted price colour and validation error. The only red in the system.
- **Sale Deep** (`#9e1f1f`) — pressed / hover sale state.
- **Success** (`#1f8a4c`) — in-stock indicator, eligibility tick.
- **Warning** (`#b46a00`) — low-stock / caution copy.
- **Info** (`#1457d6`) — informational badge / link accent. Rare.

## 3. Typography Rules

### Font Family

- **Display**: `Montserrat` (Bold 700, SemiBold 600, Medium 500) — the geometric sans that carries every headline, section title, and uppercase button label. Live h1 is Montserrat 32px / 700. Falls back to `system-ui` → `-apple-system` → `sans-serif`.
- **Body / UI**: `Roboto` (Regular 400, Medium 500, SemiBold 600) — the workhorse for body copy, product descriptions, prices, captions, and field labels. Live body is Roboto 16px / 400.
- **Mono**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo` — code / tabular contexts only; effectively unused in the storefront.
- **Open-source note**: both Montserrat and Roboto are Google Fonts, so the live system is already fully open-source — no substitution needed. If trimming weight, **Montserrat 700** is the non-negotiable display weight and **Roboto 400** the body baseline.

OpenType features: `tnum` enabled on prices so columns align in the product grid and PDP price stacks.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| display-hero | Montserrat | 80 | 700 | 1.0 | -0.03em | Campaign hero lockup burned over photography |
| display-lg | Montserrat | 56 | 700 | 1.05 | -0.02em | Large editorial headline / section opener |
| h1 | Montserrat | 40 | 700 | 1.1 | -0.018em | Page title (PDP, collection landing) |
| h1-live | Montserrat | 32 | 700 | 1.15 | -0.012em | **Live sampled h1** — primary section head on production |
| h2 | Montserrat | 32 | 600 | 1.2 | -0.012em | Subsection header |
| h3 | Montserrat | 24 | 600 | 1.25 | -0.005em | Card title, filter group header, PDP price |
| h4 | Montserrat | 20 | 600 | 1.3 | 0 | Minor heading, accordion label |
| body-lg | Roboto | 18 | 400 | 1.55 | 0 | Lead paragraph, hero subcopy |
| body | Roboto | 16 | 400 | 1.55 | 0 | **Live body** — default copy, product description |
| body-strong | Roboto | 16 | 600 | 1.55 | 0 | Product card name, nav link, emphasis |
| body-sm | Roboto | 14 | 400 | 1.5 | 0 | Secondary descriptions, fine copy |
| button | Montserrat | 14 | 600 | 1.2 | 0.04em | Uppercase pill CTA label — the brand's button voice |
| label | Roboto | 13 | 500 | 1.4 | 0.02em | Form field label, filter group label |
| caption | Roboto | 12 | 500 | 1.4 | 0.02em | Badge text, filter chip label, footer fine print |
| price | Roboto | 16 | 600 | 1.4 | 0 | Product price — tabular numerals (`tnum`) so columns align |

### Principles

The system runs on **two-family contrast**: Montserrat Bold for everything that announces, Roboto Regular for everything that informs. The split is strict — Montserrat never carries paragraph copy and Roboto never carries a headline.

- **Weight does the work in display.** Montserrat 700 (Bold) is the default for headlines and section heads; 600 (SemiBold) handles subsections and button labels; 500 (Medium) is reserved for the rare lighter display moment.
- **Body stays at 400.** Roboto Regular is the calm baseline; 600 (SemiBold) is the only emphasis weight in body contexts (product names, nav links).
- **Uppercase only on buttons.** Pill CTA labels are uppercase Montserrat 14/600 with `0.04em` tracking — the brand's most recognisable type treatment. Headlines stay mixed-case.
- **Negative tracking on large display.** Montserrat tightens to `-0.02em`/`-0.03em` at hero sizes so the geometric letters lock together; body tracking stays at 0.
- **Tabular numerals on prices.** `tnum` keeps the price column mathematically aligned across product cards.
- **No serif, no script, no decorative.** The system is purely geometric/grotesque sans — Montserrat + Roboto, no exceptions.

## 4. Component Stylings

### Buttons

**`button-primary`** — the structural CTA
- Background `#53565a` (steel), text `#ffffff`, type button (uppercase Montserrat 14/600), padding `14px 28px`, height 48px, radius **56px** (very pill). Used on every structural action: "Add to Bag", "Shop Now", "Continue", region/locale confirm.
- **Hover** lives in `button-primary-hover` — steel deepens to `#42454a` over 150ms. No lift, no scale.
- **Pressed** — steel deepens further to `#383b3f`; bg geometry unchanged.

**`button-light`** — low-emphasis alternate on light surfaces
- Background `#ffffff`, text `#000000`, 1px black outline `#000000`, type button, padding `14px 28px`, radius 56px. Used as the lower-emphasis option beside a steel primary ("Continue Shopping" next to "Checkout"; "Cancel" on dialogs).

**`button-on-image`** — overlay CTA on photography
- Background `#ffffff`, text `#000000`, type button, padding `12px 24px`, radius 56px. The crisp white pill anchored over full-bleed campaign and category photography ("SHOP", "EXPLORE").

**`button-icon-circular`** — chrome icon controls
- Background `#f4f4f4` or transparent, icon `#000000`, radius 9999, size 44px. Used for wishlist heart, carousel paddle, search toggle, bag, account.

### Cards & Containers

**`card`** (product card) — the brand's signature catalog unit
- Container: bg `#ffffff`, radius 0, padding 0, no shadow.
- Image area: full-bleed product photo on `#f4f4f4` soft-grey studio backdrop, portrait 3:4 crop.
- Below image (in this order with 8px between): badge if applicable (black pill, top-left over image), product name body-strong ink, category / fit subtitle caption steel, price row.
- Price row: regular price in `price` ink. If on sale: discounted price `#d12b2b`, then strike-through original in steel, then "% off" in `#d12b2b`.

**`card-image`** — the studio stage
- bg `#f4f4f4`, radius 0, aspect 3:4. Every product photograph sits on this soft grey so the garment is the only thing with form on the page.

**`campaign-tile`** — editorial unit
- Full-bleed photography with a Montserrat Bold headline (display-lg / display-hero) overlaid. Headline colour is whichever of `#ffffff` or `#000000` reads against the underlying image. A single `button-on-image` white pill anchored bottom-left carries the CTA.

### Badges, Tags, Pills

**`badge`** — product flag
- bg `#000000`, text `#ffffff`, type caption uppercase, radius 56, padding `4px 12px`. Sits on top of product imagery (top-left of card) with copy like "NEW", "BEST SELLER", "RESTOCK", "BACK IN STOCK".

**`badge-sale`** — inline price-row text in `#d12b2b` with no container — the only "badge" in the system with no surface.

**`filter-chip` + `filter-chip-active`**
- Default: bg `#ffffff`, text `#000000`, 1px black outline `#000000`, type button, radius 56, padding `8px 16px`.
- Active: bg `#000000`, text `#ffffff` — fully inverted. No middle state.

**`swatch-dot`** — colorway picker, 16px circle, radius 9999, filled with the colorway's actual product colour. 1px `#cfcfcf` ring on white/light colorways so they stay visible. Active state: 2px black outer ring with a white interior gap.

### Inputs & Forms

**`input` + `input-focused`**
- Default: bg `#ffffff`, text `#000000`, 1px black outline `#000000`, type body, radius 8, padding `12px 14px`.
- Focused: outline thickens to 2px black `#000000`. No glow, no colour shift — high-contrast clarity over decoration.
- Labels sit above the field in `label` (Roboto 13/500). Error state swaps the outline to `#d12b2b` with a red helper line below.

### Navigation

**`nav`** (primary) — bg `#ffffff`, text `#000000`, height 64px. Layout: shark-fin logo at left (mono, ~28px), centered category nav row ("Women · Men · Accessories · Collections · Sale"), right cluster (search toggle, account icon, wishlist heart, bag). Active section gets a 2px-bottom underline in `#000000` — no background fill.

**Utility row** (above nav, optional) — thin announcement strip on `#000000` with centered white caption copy ("Free shipping over £55") — the brand's only inverted chrome band.

**Mobile nav** — hamburger menu left, shark-fin logo center, search + bag icons right. Category nav collapses into a full-height drawer that slides in from the left. Search expands to a full-width overlay pill.

### Signature Components

**`filter-rail`** — PLP left rail, ~240px. Section headers in body-strong ink with 1px `#e2e2e2` hairline dividers between groups. Active filters get filled black chips; counts in parentheses use steel.

**`footer`** — bg `#000000`, text `#ffffff` (the brand's one inverted full band). Multi-column link list with column headers in body-strong white and link rows in caption with steel-on-black sublabels; below the columns, a fine-print row with caption copyright, locale switcher, and legal links. The shark-fin logo and social icons sit at the top-left.

## 5. Layout Principles

### Spacing System

- **Base unit**: 4px
- **Tokens**: 0 / 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96
- **Universal rhythm**: major content blocks stack at `48px` vertical gap (hero → trending row → featured collection → editorial band → footer). PLP card grids use 16px gutters. Card metadata stacks at 8px between name, subtitle, and price.
- **Card internal padding**: product cards use 0px internal padding — the image is full-bleed and metadata sits directly below.

### Grid & Container

- **Max width**: ~1280px content area with edge gutters that grow on very wide viewports rather than stretching the grid.
- **Column patterns**: PLP listing uses 4-up at desktop, collapsing to 3-up at 1024px, 2-up at 640px, and a peek-scroll on the narrowest mobile. The home page mixes a full-bleed campaign hero, a 3- or 4-up "Trending" row, a horizontal-scroll category rail, and a 4-up product grid.
- **Filter rail**: ~240px fixed-width left rail on PLP at desktop, collapsing into a "Filter" toggle / off-canvas drawer at narrow widths.

### Whitespace Philosophy

Whitespace separates rather than decorates. Sections butt against each other vertically with a 48px rhythm, and product photos tile edge-to-edge inside their grid with no padding wrapped around the image. The "air" comes from the soft grey studio backdrop of the photograph, not from layout margin. Headlines sit immediately under the section line with no decorative gap above.

### Section Cadence

Campaign band → product grid → category rail → editorial band → product grid → black footer. Light dominates throughout; the only inversions are the thin black announcement strip at the very top and the black footer at the bottom. Density and photography do the work colour does for other brands.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|------|-------|-----|
| Micro | 2px | Inset hairline corners, dense table corners |
| SM | 4px | Tight inner corners, small chips |
| MD | 8px | Inputs, form fields, small containers |
| LG | 12px | Cards-with-chrome, modal panels |
| XL | 16px | Large surface panels, image overlays |
| Pill | 56px | **Every CTA** — primary, light, on-image, filter chip, badge. The universal Gymshark shape |
| Circle | 9999px | Icon buttons, swatch dots, avatars |

The defining number is **56px**. Where most systems land CTAs at 8–12px and even Nike at 30px, Gymshark commits to a very rounded 56px pill across the entire button vocabulary. Containers stay sharp (0–16px); only buttons, chips, and badges round all the way. There are no compound radii — a surface is either rectangular (cards, sections, imagery) or fully pilled (CTAs, badges, chips) or circular (icon buttons, dots).

### Photography Geometry

- **Product cards**: portrait 3:4 crop, full-bleed within the card with no padding, sitting on `#f4f4f4`.
- **Campaign hero**: ~16:9 cinematic crop, full-bleed across the content max-width, Montserrat display headline overlaid lower-left.
- **Category rail**: 3:4 portrait full-bleed thumbnails with a white pill CTA anchored bottom-left.
- **PDP main image**: large portrait primary image with a thumbnail rail (stacked or horizontal) for rapid colour/angle browsing.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 — Flat | No shadow, no border | Default for cards, buttons, sections — the dominant treatment |
| 1 — Hairline divider | 1px solid `#e2e2e2` | Filter row separators, footer columns, PDP disclosure rows |
| 2 — Outline | 1px solid `#000000` | White pills, inputs, default filter chips |
| 3 — Modal | `rgba(0,0,0,0.18) 0 12px 32px` | Bag drawer, dialog, mini-cart overlay |
| 4 — Scrim | `rgba(0,0,0,0.55)` | Modal backdrop |

### Shadow Philosophy

The system has **no drop-shadow elevation in its retail chrome**. Cards do not lift on the page. The only depth cues are the 1px black outline on white pills/inputs, the 1px grey hairline on dividers, and the contrast between full-bleed photography and the `#f4f4f4` studio backdrop. Depth comes from photography, not from CSS effects:

- **Campaign tiles** create depth via cinematic perspective — an athlete mid-movement — with the Montserrat headline overlaid in white or ink directly on the image.
- **Product photography** is shot on flat `#f4f4f4` to remove background depth, so the garment is the only thing with form on the page.
- **Modals** are the single exception — a soft `rgba(0,0,0,0.18)` shadow lifts the bag drawer and dialogs above the scrim.

The deliberate absence of card shadow is what keeps the system feeling athletic and direct rather than skeuomorphic.

## 8. Interaction & Motion

### Easing
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover, focus, colour transitions
- **Emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — modal entry, drawer slide, mega-menu reveal

### Durations
| Bucket | Value | Use |
|--------|-------|-----|
| Fast | 150ms | CTA hover colour, focus ring, link hover |
| Standard | 240ms | Image opacity hover, card state changes, modal enter |
| Slow | 320ms | Hero carousel slide, drawer slide-in |

### Per-Component Recipes

- **Primary CTA hover**: steel pill `#53565a` → `#42454a` over 150ms. No lift, no scale — the colour shift is the whole feedback.
- **Light CTA hover**: white pill inverts to black fill / white text over 150ms (or the outline thickens, depending on context).
- **Product card hover**: image opacity 1 → 0.92 over 240ms; no lift, no shadow. A second product angle may cross-fade in on hover.
- **Filter chip toggle**: bg flip from `#ffffff` to `#000000` with `color: white` over 150ms — instant feel.
- **Input focus**: outline thickens from 1px to 2px black over 150ms.
- **Modal / bag drawer**: scrim fades in over 240ms, drawer translates from `translateX(100%)` to `0` over 320ms emphasized.

### Page Transitions

Page-to-page navigation fires a hard navigation — no transition. The brand prioritises perceived speed and the "next-page-feels-like-next-rack" catalog cadence.

### Reduced Motion

Respects `prefers-reduced-motion: reduce`. Image opacity hover and cross-fade suppress (only colour change remains). Drawer slide degrades to opacity-only. Carousel autoplay halts. All hover state becomes instant.

## 9. Accessibility & A11y

### Contrast Pairs

| Pair | Ratio | Level |
|------|-------|-------|
| #000000 ink on #ffffff canvas | 21.0 | AAA |
| #ffffff on #000000 (badge / footer) | 21.0 | AAA |
| #ffffff on #53565a steel pill | 7.38 | AAA |
| #53565a steel on #ffffff (muted text) | 7.38 | AAA |
| #6b6e72 soft on #ffffff | 5.12 | AA |
| #d12b2b sale on #ffffff | 4.9 | AA |
| #1f8a4c success on #ffffff | 4.0 | AA (large) / use at ≥14px bold |
| #000000 on #f4f4f4 (text on studio grey) | 19.3 | AAA |

The black/white brand pair sits at the maximum 21:1 across the entire chrome. The steel pill clears AAA for white text at 7.38:1, and the muted-text use of steel on white also clears AAA — a rare win for a grey that doubles as both pill and secondary text. The few off-system colours (sale red, success green) hold AA at body sizes.

### Focus Indicators

Focus ring is **2px solid `#000000`** with 2px outline-offset on light surfaces. On ink / photographic surfaces (campaign tiles, footer), focus flips to **2px solid `#ffffff`**. Buttons, inputs, links, filter chips, and swatch dots all gain the ring on `:focus-visible`.

### ARIA Patterns

- **Search toggle**: `role="search"`; input has `aria-label="Search products"`.
- **Filter chip**: `aria-pressed` to communicate selection state.
- **Product card**: entire tile wrapped in `<a>` with verbose `aria-label` — "Vital Seamless 2.0 Leggings, Women's, £45".
- **Swatch dot**: `aria-label="Black colorway, 1 of 5"` — names the colour and position.
- **Wishlist heart**: `aria-pressed` with label "Add to wishlist" / "Remove from wishlist".
- **Bag drawer**: `role="dialog"` with `aria-modal="true"` and focus trap; Esc closes.
- **Accordion rows**: `aria-expanded` + `aria-controls` for PDP product-detail disclosures.

### Keyboard Navigation

Tab order: announcement strip → logo → primary nav (left to right) → search → account → wishlist → bag → main grid (top to bottom, left to right) → filter rail (when expanded) → footer.

- **Inside filter chip group**: arrow keys navigate, Space toggles, Enter applies.
- **Inside PDP gallery**: arrow keys advance thumbnails.
- **Inside bag drawer / modal**: focus trapped; Esc closes.

### Screen Reader Hints

Verbose `aria-label` on icon-only buttons (heart, paddle, search, bag). Sale prices include `aria-label="Sale price £30, was £45, save 33%"` so the discount narrative reads. The bag-count badge uses `aria-live="polite"` so item additions announce.

### Reduced Motion

All transitions degrade gracefully. Image hover and cross-fade suppress. Drawer slide → opacity-only. Carousel autoplay halts. Hover state becomes instant.

## 10. Responsive Behavior

### Breakpoints

| Name | Width | Key Changes |
|------|-------|-------------|
| wide | 1536px+ | Content max-width holds ~1280px; outer gutters grow rather than stretching the grid |
| desktop | 1280px | Default desktop — 4-up product grid, full primary nav, 240px filter rail |
| tablet-large | 1024–1279px | 4-up grid persists or eases to 3-up; filter rail starts compressing |
| tablet | 768–1023px | 3-up grid; primary nav center cluster begins collapsing; "Filter" becomes a toggle |
| mobile-large | 640–767px | Nav collapses to hamburger drawer; search becomes a full-width overlay; grid → 2-up |
| mobile | <640px | 2-up grid; campaign tiles full-screen width; Montserrat headline scales down; filter off-canvas |

### Touch Targets

All interactive elements meet WCAG AA (44×44px minimum). Pills sit at 48px height with 28px horizontal padding. Icon-circular buttons sit at 44px. Filter-chip pills are ~40px height with hit-target padding extending the tappable area to 44px+.

### Collapsing Strategy

- **Primary nav**: desktop center cluster → mobile hamburger drawer that slides from the left.
- **PLP grid**: 4-up → 3-up → 2-up at 1024, 768, 640; gutters tighten from 16px toward 8px on mobile.
- **Filter rail**: 240px fixed → "Filter" toggle → off-canvas full-screen drawer at mobile.
- **Category rail**: desktop horizontal scroll with ~4–5 visible → mobile horizontal scroll with ~1.5 visible (peek-next-card pattern).
- **Section spacing**: 48px desktop → 32px tablet → 24px mobile to keep the catalog rhythm tight.
- **Campaign headline**: Montserrat scales down at each breakpoint; weight stays 700, tracking stays tight.

### Image Behavior

- Product imagery holds a consistent portrait 3:4 ratio across all breakpoints — the image scales, the ratio doesn't.
- Campaign tiles use art-direction crops: a 16:9 wide hero on desktop swaps to a 4:5 portrait on mobile so the athlete stays centered and the headline keeps burn-in space.
- Non-critical product imagery is lazy-loaded as the user scrolls into the next grid row.

### Container Queries

Used in the PLP filter rail — when the rail narrows below ~180px, multi-column filter groups collapse to single column with chevron disclosure.

## 11. Content & Voice

### Tone

Direct, athletic, community-driven. Gymshark's voice is the training partner who hypes you up without theatre — confident and inclusive, built for a Gen-Z UK audience that found the brand through social and the gym floor. Headlines lead with energy and identity ("We Do Gym", "Built to Move", "Lift the World"); body copy carries the spec ("seamless knit, squat-proof, four-way stretch").

The brand consistently positions itself as **the community's kit, not a luxury label** — every microcopy moment is more motivating than corporate. There is energy, but it never tips into gimmick; the chrome stays clean so the copy and people carry the warmth.

### Microcopy Patterns

- **Button verbs**: "ADD TO BAG", "SHOP NOW", "SHOP", "CONTINUE", "EXPLORE". Uppercase, short, outcome-named.
- **Error message recipe**: factual + remedial — "That size is sold out. Try another size or get a restock alert."
- **Success confirmations**: "Added to bag" — instant, no ceremony.
- **Field labels**: short and direct — "Email", "Postcode", "Card number", "Size".
- **Stock urgency**: "Almost gone" / "Low stock" — calm, no countdown pressure.
- **Restock**: "Out of stock — Notify me" — names state and action in one line.

### Empty States

- **Empty bag**: "Your bag is empty. Find your next fit." — points back to shopping.
- **Empty wishlist**: "Save your favourites here. Tap the heart on any item to start." — instructive.
- **Empty search results**: "Nothing found for [query]. Try different keywords or shop Women's, Men's, Accessories." — names cause + alternatives.

### CTA Verb Conventions

- **Primary (steel pill)**: "ADD TO BAG", "SHOP NOW", "CONTINUE", "CHECKOUT", "JOIN"
- **Light alternate**: "CONTINUE SHOPPING", "CANCEL", "BACK"
- **On-image**: "SHOP", "EXPLORE", "DISCOVER"
- **Tertiary text**: "View product details", "See all", "Size guide"

The verb library is deliberately small and athletic-imperative. Gymshark avoids SaaS qualifiers like "Get started free" or "Try it now" — the verbs name the gym-floor action.

## 12. Dark Mode & Theming

**Light-only across the storefront.** Gymshark's commerce surface ships only in the light theme on a pure white canvas. The thin announcement strip at the very top and the footer flip to ink (`#000000`) for contrast, and campaign bands may render dark for editorial moments, but these are content moments, not a theme — the page proper resumes white below them. There is no `prefers-color-scheme: dark` query and no `data-theme="dark"` token swap on the web store.

If implementing a Gymshark-flavoured dark variant for a derived system: swap canvas to `#000000`, studio grey to `#1a1a1a`, ink/text to `#ffffff`, muted text to `#9a9da1`, hairline to `#2a2a2a` — keep the 56px pill geometry and Montserrat/Roboto pairing unchanged, and consider lightening the structural pill to a brighter steel so it reads against the dark canvas.

## 13. Lineage & Influences

Gymshark's visual lineage is a fusion of athletic-editorial commerce and the social-native, community-first energy that built the brand from a bedroom screen-printing operation into a global fitness label. The chrome borrows the **monochrome athletic discipline** of the big sportswear houses — full-bleed photography, neutral studio backdrops, no decorative furniture between image and CTA — but rounds the corners harder and swaps the structural pill to a softer steel grey, giving the interface a warmer, more approachable feel than the harder black-on-white of its larger rivals. The strict Montserrat-over-Roboto pairing is straight out of the Google Fonts modern-commerce playbook: a geometric bold display family for impact and a humanist grotesque for legible body copy.

What it inherits and rejects: from Swiss/grotesque typography it takes the grid, the absence of ornament, and the discipline of letting weight (not colour) carry hierarchy. From sports-magazine editorial it takes the burn-in headline and the athlete-led full-bleed shot. From its larger sportswear contemporaries it inherits the photography-on-neutral-grey studio metaphor and the pill-CTA vocabulary — then it personalises the system with the unusually round 56px pill, the steel structural accent, and the shark-fin logo as the sole mark. What it rejects is drop-shadow skeuomorphism, gradient washes, multi-hue accent palettes, and SaaS qualifier copy — the page stays monochrome and direct so the community and the product own the colour.

**Influences:**
- Montserrat (Google Fonts) — https://fonts.google.com/specimen/Montserrat — the geometric bold display family that carries every Gymshark headline and button
- Roboto (Google Fonts) — https://fonts.google.com/specimen/Roboto — the humanist grotesque body workhorse for all copy and prices
- Nike — https://www.nike.com — the athletic-editorial commerce template: photography on neutral grey, pill CTAs, monochrome chrome
- Shopify — https://www.shopify.com — the commerce platform whose product-grid / PDP / cart-drawer conventions shape the storefront structure
- Apple Store — https://www.apple.com — product photography on flat neutral grey as the "studio" metaphor

## 14. Do's and Don'ts

### Do
- Keep the base pure monochrome — `#ffffff` canvas, `#000000` ink — and let product photography carry all the colour.
- Use the steel pill (`#53565a`, white uppercase label) as the single structural CTA per viewport; pair it at most with a white outline pill for the soft alternate.
- Round every CTA to the full **56px pill**. Never introduce a square or 8px button into the action vocabulary.
- Set headlines in Montserrat Bold (700) and body in Roboto Regular (400) — never cross the two families.
- Uppercase button labels in Montserrat 14/600 with `0.04em` tracking — the brand's signature button voice.
- Stage every product photograph on `#f4f4f4` soft grey — the system's "studio."
- Use sale red (`#d12b2b`) only on price rows — never on backgrounds, badges, or chrome.
- Stack content sections at 48px rhythm with no decorative dividers; the photography's bleed-edge is the divider.
- Anchor on-image CTAs with white pills at bottom-left — the universal "shop this image" position.
- Use `tnum` on every price so columns align across the product grid.
- Set focus rings to 2px black on light, 2px white on dark/photographic surfaces.
- Keep the shark-fin logo small, mono, and quiet at the top-left of the nav — it is the only ornament.

### Don't
- Don't introduce drop shadows or card elevation. Cards sit flat; depth comes from photography and the modal-only soft shadow.
- Don't add a second accent colour. Steel (`#53565a`) is the entire structural palette beyond black and white.
- Don't replace black (`#000000`) ink with a near-black grey for headlines or text — the brand commits to true black.
- Don't pad inside product cards. The image is full-bleed; metadata sits directly below with 8px between rows.
- Don't soften the CTA radius below 56px — the very-round pill is the brand's most recognisable geometry.
- Don't set body copy in Montserrat or headlines in Roboto — the two-family split is strict.
- Don't introduce a third button shape. Pill or icon-circular is the entire button vocabulary.
- Don't use serif, script, or display-rounded fonts. The system is Montserrat + Roboto, no exceptions.
- Don't add accent gradients or atmospheric blur. The chrome is solid colour-block throughout.
- Don't lowercase or mixed-case the button labels — pill CTAs are always uppercase.
- Don't let body copy fall below 14px (body-sm); the smallest UI text is 12px (caption) for badges and chips.
- Don't put two structural steel pills in the same fold — neutralise one to the white outline pill.

## 15. Agent Prompt Guide

### Quick Color Reference

- Canvas: `#ffffff`
- Ink (text + brand black): `#000000`
- Steel (structural pill + muted text): `#53565a`
- Steel hover: `#42454a`
- Studio grey (product image stage): `#f4f4f4`
- Hairline divider: `#e2e2e2`
- Text soft (low-emphasis): `#6b6e72`
- Sale red: `#d12b2b`
- Success: `#1f8a4c`
- Focus ring (light): `#000000`
- Focus ring (dark/photo): `#ffffff`

### Example Component Prompts

1. "Create a Gymshark campaign hero — full-bleed athletic photograph (16:9, an athlete mid-movement on a soft grey studio backdrop) with a bold Montserrat headline (700, ~56px, tight -0.02em tracking) overlaid lower-left in white. Anchor a single white pill (radius 56, padding 12×24, uppercase Montserrat 14/600 ink, label 'SHOP') at the bottom-left. No shadow, no border, no gradient overlay."

2. "Design a Gymshark product card — portrait 3:4 product photograph on a `#f4f4f4` soft-grey backdrop, zero radius, zero padding around the image. Optional black pill badge ('NEW', uppercase caption, radius 56) top-left over the image. Below: an 8px stack of swatch dots (16px circles), product name in Roboto 16/600 ink, fit subtitle in Roboto 12/500 steel (`#53565a`), price in Roboto 16/600 ink with `tnum`. If on sale, render discounted price in `#d12b2b`, then strike-through original in steel, then '% off' in `#d12b2b`."

3. "Build a Gymshark primary CTA — radius 56 pill (very rounded), bg steel `#53565a`, text `#ffffff` uppercase Montserrat 14/600 with 0.04em tracking, padding 14×28, height 48. Hover: bg deepens to `#42454a` over 150ms. No lift, no scale."

4. "Create a Gymshark white alternate CTA — radius 56 pill, bg `#ffffff`, 1px black outline `#000000`, text `#000000` uppercase Montserrat 14/600, padding 14×28. Used beside the steel primary as the soft option ('CONTINUE SHOPPING')."

5. "Design a Gymshark PLP filter row — 1px hairline `#e2e2e2` between groups. Each group: section header in Roboto 16/600 ink, filter chip group below. Filter chips at radius 56, default bg `#ffffff` with 1px black outline, active bg `#000000` text white. Counts in parentheses use steel `#53565a`."

6. "Build the Gymshark masthead — a thin black announcement strip (`#000000`, centered white caption 'Free shipping over £55') above a 64px white primary nav: shark-fin logo left (mono, ~28px), centered category nav 'Women · Men · Accessories · Collections · Sale' in Roboto 16/600 ink, right cluster (search + account + wishlist heart + bag icons). Active nav link gets a 2px black underline."

### Iteration Guide

1. Focus on ONE component at a time. Pull its tokens from the frontmatter and verify every property resolves to a concrete value.
2. Reference component names and tokens directly (`button-primary` steel `#53565a`, radius 56, studio grey `#f4f4f4`) — do not paraphrase color names or radii in prose.
3. Default body to Roboto 16/400; reach for Roboto 16/600 for product names and nav links; reserve Montserrat Bold strictly for headlines and uppercase button labels.
4. Keep the structural steel pill scarce per viewport — if more than one solid steel pill appears in the same fold, neutralise one to the white outline pill.
5. Hold the 56px pill radius constant across every CTA, chip, and badge — it is the brand's most distinctive geometry; do not soften it toward a generic 8–12px button.
6. Add new variants as separate component entries (`-hover`, `-active`, `-focused`) — do not bury them inside prose.
7. Run a contrast check on every text/bg pair — black/white sits at AAA (21:1), white-on-steel at AAA (7.38:1); keep off-system colours (sale red) at AA on body text.
8. Test every interactive surface at 640px / 768px / 1024px / 1280px. Gymshark's responsive cadence (4-up → 3-up → 2-up; nav → hamburger drawer; filter rail → off-canvas) is part of the system's identity.
Prose

1. Visual Theme & Atmosphere

Gymshark’s storefront runs on one disciplined idea: black and white carry the chrome, the photography carries the colour. Every page is built on a pure white canvas (#ffffff) with true-black ink (#000000), and the only structural colour in the entire interface is a single steel grey (#53565a) reserved for the brand’s most important pills. There is no decorative gradient, no soft drop-shadow nostalgia, no accent palette used for “tone” — the system saves every drop of chromatic energy for the product imagery and the athletes who wear it. The result reads like a gym-floor poster that learned how to sell: confident, high-contrast, no furniture between the image and the buy button.

The display voice is Montserrat Bold — a geometric sans cut for impact — set at the live 32px / 700 for section heads and scaling up to billboard sizes for campaign moments. Underneath it, Roboto handles every line of body copy at a calm 16px / 400, the classic display-over-utility pairing that signals “athletic” without shouting. The contrast between the two families is part of the brand’s signature: Montserrat is the coach’s voice; Roboto is the spec sheet. There is almost no middle ground — the jump from a bold 32px head to a quiet 16px body is intentional and creates the “headline above, detail below” rhythm across the product grid, the PDP, and the editorial bands.

The most physically distinctive element is the geometry: every call-to-action is a fully-rounded 56px pill. This is unusually round — far past the modest 8–12px corners of a typical SaaS button and rounder even than Nike’s 30px CTA — and it gives the whole interface a soft, tactile, almost button-on-a-tracksuit feel. The system toggles between two pill treatments: a steel-grey pill (#53565a) with white text for structural actions (“Add to Bag”, “Continue”, region selectors), and a crisp white pill with black ink and a 1px black outline for the lower-emphasis alternate. There are no square buttons anywhere in the system — pill or circular-icon is the entire button vocabulary.

The atmosphere is athletic-direct, tuned for a Gen-Z UK fitness audience. A model mid-lift on a soft grey studio backdrop. A bold Montserrat headline. A row of portrait product tiles. A single steel pill that says “SHOP NOW”. The community register — the “we train together” energy that built the brand on social — lives in the photography and the copy, not in the chrome. The chrome stays mathematical and monochrome so the people in the pictures own the page.

Where Nike reserves all colour for the photograph and keeps its CTA black, Gymshark does almost the same thing but swaps the structural pill to steel grey and rounds the corners harder — a softer, more approachable cousin of the same athletic-editorial discipline. The shark-fin logo is the only ornament the brand allows itself, and even that appears small, mono, and quiet at the top-left of the nav.

Key Characteristics:

  • Pure monochrome base — #ffffff canvas, #000000 ink, with a single steel grey (#53565a) as the only structural colour
  • Montserrat Bold display (32px / 700 live) over Roboto body (16px / 400) — coach voice over spec sheet
  • Every CTA is a fully-rounded 56px pill — unusually round, the brand’s most distinctive geometry
  • Two-pill hierarchy: steel-grey pill (structural) versus white pill with black outline (alternate) — never both at once on the same surface
  • Product photography on soft grey (#f4f4f4) studio backdrop carries 100% of the colour; chrome stays black/white
  • No drop shadows — depth comes from photography and a single 1px hairline divider, never from CSS elevation
  • Black pill badges (“New”, “Best Seller”) with white uppercase text sit on top of product imagery
  • Shark-fin logo as the sole ornament — small, mono, quiet
  • Community-athletic voice in copy and imagery; mechanical restraint everywhere else

2. Color Palette & Roles

Primary

  • Canvas (#ffffff) — paper-white default page floor; the white field behind every product grid, nav, and editorial band.
  • Ink (#000000) — Gymshark’s brand “colour” and the only ink the system commits to. Body text, headlines, product names, outlines, active filter chips, badge fills.

Brand & Dark

  • Brand Black (#000000) — the black/shark-fin aesthetic that defines Gymshark. Used for ink, badge pills, active filters, and campaign overlay bands. There is no separate brand hue — black is the brand.
  • Brand Hover (#1a1a1a) — black surfaces lift very slightly on hover.

Accent

  • Steel (#53565a) [→ live CTA sample] — the system’s single structural accent. The primary pill colour: steel-grey fill, white uppercase label. Also doubles as the muted-text colour. This is the only non-monochrome value used as chrome.
  • Steel Hover (#42454a) — steel pill deepens on hover.
  • Steel Active (#383b3f) — steel pill pressed.

Interactive

  • Link (#000000) — default link = ink + underline only.
  • Link Hover (#53565a) — softens to steel on hover, never to a brand hue.
  • Selected (#000000) — selected filter chip = inverted black fill, white text.
  • Disabled BG (#e2e2e2)
  • Disabled Text (#9a9da1)

Neutral Scale

  • Ink (#000000) — primary text, headlines, product names, prices, nav.
  • Steel (#53565a) — product subtitles, footer links, secondary metadata (AAA on white at 7.38:1).
  • Text Soft (#6b6e72) — lowest-emphasis utility text (AA on white at 5.12:1).
  • Disabled Text (#9a9da1) — disabled labels only.

Surface & Borders

  • Canvas (#ffffff) — default page floor and card surface.
  • Surface Soft (#f4f4f4) — product image stage, alt section band, icon-button fill.
  • Surface Warm (#fafafa) — very subtle alt-row tint.
  • Border (#000000) — crisp 1px black outline on white pills and inputs.
  • Border Soft (#e2e2e2) — 1px hairline divider for filter rows and footer columns.
  • Border Muted (#cfcfcf) — mid-grey divider on grey surfaces.

Shadow Colors

  • None observed for retail chrome — Gymshark does not use drop shadows on cards, buttons, or sections.
  • Modal rgba(0,0,0,0.18) 0 12px 32px — the only real shadow, on overlays.
  • Scrim rgba(0,0,0,0.55) — modal backdrop.

Semantic

  • Sale / Danger (#d12b2b) — discounted price colour and validation error. The only red in the system.
  • Sale Deep (#9e1f1f) — pressed / hover sale state.
  • Success (#1f8a4c) — in-stock indicator, eligibility tick.
  • Warning (#b46a00) — low-stock / caution copy.
  • Info (#1457d6) — informational badge / link accent. Rare.

3. Typography Rules

Font Family

  • Display: Montserrat (Bold 700, SemiBold 600, Medium 500) — the geometric sans that carries every headline, section title, and uppercase button label. Live h1 is Montserrat 32px / 700. Falls back to system-ui-apple-systemsans-serif.
  • Body / UI: Roboto (Regular 400, Medium 500, SemiBold 600) — the workhorse for body copy, product descriptions, prices, captions, and field labels. Live body is Roboto 16px / 400.
  • Mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo — code / tabular contexts only; effectively unused in the storefront.
  • Open-source note: both Montserrat and Roboto are Google Fonts, so the live system is already fully open-source — no substitution needed. If trimming weight, Montserrat 700 is the non-negotiable display weight and Roboto 400 the body baseline.

OpenType features: tnum enabled on prices so columns align in the product grid and PDP price stacks.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
display-heroMontserrat807001.0-0.03emCampaign hero lockup burned over photography
display-lgMontserrat567001.05-0.02emLarge editorial headline / section opener
h1Montserrat407001.1-0.018emPage title (PDP, collection landing)
h1-liveMontserrat327001.15-0.012emLive sampled h1 — primary section head on production
h2Montserrat326001.2-0.012emSubsection header
h3Montserrat246001.25-0.005emCard title, filter group header, PDP price
h4Montserrat206001.30Minor heading, accordion label
body-lgRoboto184001.550Lead paragraph, hero subcopy
bodyRoboto164001.550Live body — default copy, product description
body-strongRoboto166001.550Product card name, nav link, emphasis
body-smRoboto144001.50Secondary descriptions, fine copy
buttonMontserrat146001.20.04emUppercase pill CTA label — the brand’s button voice
labelRoboto135001.40.02emForm field label, filter group label
captionRoboto125001.40.02emBadge text, filter chip label, footer fine print
priceRoboto166001.40Product price — tabular numerals (tnum) so columns align

Principles

The system runs on two-family contrast: Montserrat Bold for everything that announces, Roboto Regular for everything that informs. The split is strict — Montserrat never carries paragraph copy and Roboto never carries a headline.

  • Weight does the work in display. Montserrat 700 (Bold) is the default for headlines and section heads; 600 (SemiBold) handles subsections and button labels; 500 (Medium) is reserved for the rare lighter display moment.
  • Body stays at 400. Roboto Regular is the calm baseline; 600 (SemiBold) is the only emphasis weight in body contexts (product names, nav links).
  • Uppercase only on buttons. Pill CTA labels are uppercase Montserrat 14/600 with 0.04em tracking — the brand’s most recognisable type treatment. Headlines stay mixed-case.
  • Negative tracking on large display. Montserrat tightens to -0.02em/-0.03em at hero sizes so the geometric letters lock together; body tracking stays at 0.
  • Tabular numerals on prices. tnum keeps the price column mathematically aligned across product cards.
  • No serif, no script, no decorative. The system is purely geometric/grotesque sans — Montserrat + Roboto, no exceptions.

4. Component Stylings

Buttons

button-primary — the structural CTA

  • Background #53565a (steel), text #ffffff, type button (uppercase Montserrat 14/600), padding 14px 28px, height 48px, radius 56px (very pill). Used on every structural action: “Add to Bag”, “Shop Now”, “Continue”, region/locale confirm.
  • Hover lives in button-primary-hover — steel deepens to #42454a over 150ms. No lift, no scale.
  • Pressed — steel deepens further to #383b3f; bg geometry unchanged.

button-light — low-emphasis alternate on light surfaces

  • Background #ffffff, text #000000, 1px black outline #000000, type button, padding 14px 28px, radius 56px. Used as the lower-emphasis option beside a steel primary (“Continue Shopping” next to “Checkout”; “Cancel” on dialogs).

button-on-image — overlay CTA on photography

  • Background #ffffff, text #000000, type button, padding 12px 24px, radius 56px. The crisp white pill anchored over full-bleed campaign and category photography (“SHOP”, “EXPLORE”).

button-icon-circular — chrome icon controls

  • Background #f4f4f4 or transparent, icon #000000, radius 9999, size 44px. Used for wishlist heart, carousel paddle, search toggle, bag, account.

Cards & Containers

card (product card) — the brand’s signature catalog unit

  • Container: bg #ffffff, radius 0, padding 0, no shadow.
  • Image area: full-bleed product photo on #f4f4f4 soft-grey studio backdrop, portrait 3:4 crop.
  • Below image (in this order with 8px between): badge if applicable (black pill, top-left over image), product name body-strong ink, category / fit subtitle caption steel, price row.
  • Price row: regular price in price ink. If on sale: discounted price #d12b2b, then strike-through original in steel, then ”% off” in #d12b2b.

card-image — the studio stage

  • bg #f4f4f4, radius 0, aspect 3:4. Every product photograph sits on this soft grey so the garment is the only thing with form on the page.

campaign-tile — editorial unit

  • Full-bleed photography with a Montserrat Bold headline (display-lg / display-hero) overlaid. Headline colour is whichever of #ffffff or #000000 reads against the underlying image. A single button-on-image white pill anchored bottom-left carries the CTA.

Badges, Tags, Pills

badge — product flag

  • bg #000000, text #ffffff, type caption uppercase, radius 56, padding 4px 12px. Sits on top of product imagery (top-left of card) with copy like “NEW”, “BEST SELLER”, “RESTOCK”, “BACK IN STOCK”.

badge-sale — inline price-row text in #d12b2b with no container — the only “badge” in the system with no surface.

filter-chip + filter-chip-active

  • Default: bg #ffffff, text #000000, 1px black outline #000000, type button, radius 56, padding 8px 16px.
  • Active: bg #000000, text #ffffff — fully inverted. No middle state.

swatch-dot — colorway picker, 16px circle, radius 9999, filled with the colorway’s actual product colour. 1px #cfcfcf ring on white/light colorways so they stay visible. Active state: 2px black outer ring with a white interior gap.

Inputs & Forms

input + input-focused

  • Default: bg #ffffff, text #000000, 1px black outline #000000, type body, radius 8, padding 12px 14px.
  • Focused: outline thickens to 2px black #000000. No glow, no colour shift — high-contrast clarity over decoration.
  • Labels sit above the field in label (Roboto 13/500). Error state swaps the outline to #d12b2b with a red helper line below.

nav (primary) — bg #ffffff, text #000000, height 64px. Layout: shark-fin logo at left (mono, ~28px), centered category nav row (“Women · Men · Accessories · Collections · Sale”), right cluster (search toggle, account icon, wishlist heart, bag). Active section gets a 2px-bottom underline in #000000 — no background fill.

Utility row (above nav, optional) — thin announcement strip on #000000 with centered white caption copy (“Free shipping over £55”) — the brand’s only inverted chrome band.

Mobile nav — hamburger menu left, shark-fin logo center, search + bag icons right. Category nav collapses into a full-height drawer that slides in from the left. Search expands to a full-width overlay pill.

Signature Components

filter-rail — PLP left rail, ~240px. Section headers in body-strong ink with 1px #e2e2e2 hairline dividers between groups. Active filters get filled black chips; counts in parentheses use steel.

footer — bg #000000, text #ffffff (the brand’s one inverted full band). Multi-column link list with column headers in body-strong white and link rows in caption with steel-on-black sublabels; below the columns, a fine-print row with caption copyright, locale switcher, and legal links. The shark-fin logo and social icons sit at the top-left.

5. Layout Principles

Spacing System

  • Base unit: 4px
  • Tokens: 0 / 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96
  • Universal rhythm: major content blocks stack at 48px vertical gap (hero → trending row → featured collection → editorial band → footer). PLP card grids use 16px gutters. Card metadata stacks at 8px between name, subtitle, and price.
  • Card internal padding: product cards use 0px internal padding — the image is full-bleed and metadata sits directly below.

Grid & Container

  • Max width: ~1280px content area with edge gutters that grow on very wide viewports rather than stretching the grid.
  • Column patterns: PLP listing uses 4-up at desktop, collapsing to 3-up at 1024px, 2-up at 640px, and a peek-scroll on the narrowest mobile. The home page mixes a full-bleed campaign hero, a 3- or 4-up “Trending” row, a horizontal-scroll category rail, and a 4-up product grid.
  • Filter rail: ~240px fixed-width left rail on PLP at desktop, collapsing into a “Filter” toggle / off-canvas drawer at narrow widths.

Whitespace Philosophy

Whitespace separates rather than decorates. Sections butt against each other vertically with a 48px rhythm, and product photos tile edge-to-edge inside their grid with no padding wrapped around the image. The “air” comes from the soft grey studio backdrop of the photograph, not from layout margin. Headlines sit immediately under the section line with no decorative gap above.

Section Cadence

Campaign band → product grid → category rail → editorial band → product grid → black footer. Light dominates throughout; the only inversions are the thin black announcement strip at the very top and the black footer at the bottom. Density and photography do the work colour does for other brands.

6. Shapes & Radius Scale

TierValueUse
Micro2pxInset hairline corners, dense table corners
SM4pxTight inner corners, small chips
MD8pxInputs, form fields, small containers
LG12pxCards-with-chrome, modal panels
XL16pxLarge surface panels, image overlays
Pill56pxEvery CTA — primary, light, on-image, filter chip, badge. The universal Gymshark shape
Circle9999pxIcon buttons, swatch dots, avatars

The defining number is 56px. Where most systems land CTAs at 8–12px and even Nike at 30px, Gymshark commits to a very rounded 56px pill across the entire button vocabulary. Containers stay sharp (0–16px); only buttons, chips, and badges round all the way. There are no compound radii — a surface is either rectangular (cards, sections, imagery) or fully pilled (CTAs, badges, chips) or circular (icon buttons, dots).

Photography Geometry

  • Product cards: portrait 3:4 crop, full-bleed within the card with no padding, sitting on #f4f4f4.
  • Campaign hero: ~16:9 cinematic crop, full-bleed across the content max-width, Montserrat display headline overlaid lower-left.
  • Category rail: 3:4 portrait full-bleed thumbnails with a white pill CTA anchored bottom-left.
  • PDP main image: large portrait primary image with a thumbnail rail (stacked or horizontal) for rapid colour/angle browsing.

7. Depth & Elevation

LevelTreatmentUse
0 — FlatNo shadow, no borderDefault for cards, buttons, sections — the dominant treatment
1 — Hairline divider1px solid #e2e2e2Filter row separators, footer columns, PDP disclosure rows
2 — Outline1px solid #000000White pills, inputs, default filter chips
3 — Modalrgba(0,0,0,0.18) 0 12px 32pxBag drawer, dialog, mini-cart overlay
4 — Scrimrgba(0,0,0,0.55)Modal backdrop

Shadow Philosophy

The system has no drop-shadow elevation in its retail chrome. Cards do not lift on the page. The only depth cues are the 1px black outline on white pills/inputs, the 1px grey hairline on dividers, and the contrast between full-bleed photography and the #f4f4f4 studio backdrop. Depth comes from photography, not from CSS effects:

  • Campaign tiles create depth via cinematic perspective — an athlete mid-movement — with the Montserrat headline overlaid in white or ink directly on the image.
  • Product photography is shot on flat #f4f4f4 to remove background depth, so the garment is the only thing with form on the page.
  • Modals are the single exception — a soft rgba(0,0,0,0.18) shadow lifts the bag drawer and dialogs above the scrim.

The deliberate absence of card shadow is what keeps the system feeling athletic and direct rather than skeuomorphic.

8. Interaction & Motion

Easing

  • Standard: cubic-bezier(0.4, 0, 0.2, 1) — default for hover, focus, colour transitions
  • Emphasized: cubic-bezier(0.2, 0, 0, 1) — modal entry, drawer slide, mega-menu reveal

Durations

BucketValueUse
Fast150msCTA hover colour, focus ring, link hover
Standard240msImage opacity hover, card state changes, modal enter
Slow320msHero carousel slide, drawer slide-in

Per-Component Recipes

  • Primary CTA hover: steel pill #53565a#42454a over 150ms. No lift, no scale — the colour shift is the whole feedback.
  • Light CTA hover: white pill inverts to black fill / white text over 150ms (or the outline thickens, depending on context).
  • Product card hover: image opacity 1 → 0.92 over 240ms; no lift, no shadow. A second product angle may cross-fade in on hover.
  • Filter chip toggle: bg flip from #ffffff to #000000 with color: white over 150ms — instant feel.
  • Input focus: outline thickens from 1px to 2px black over 150ms.
  • Modal / bag drawer: scrim fades in over 240ms, drawer translates from translateX(100%) to 0 over 320ms emphasized.

Page Transitions

Page-to-page navigation fires a hard navigation — no transition. The brand prioritises perceived speed and the “next-page-feels-like-next-rack” catalog cadence.

Reduced Motion

Respects prefers-reduced-motion: reduce. Image opacity hover and cross-fade suppress (only colour change remains). Drawer slide degrades to opacity-only. Carousel autoplay halts. All hover state becomes instant.

9. Accessibility & A11y

Contrast Pairs

PairRatioLevel
#000000 ink on #ffffff canvas21.0AAA
#ffffff on #000000 (badge / footer)21.0AAA
#ffffff on #53565a steel pill7.38AAA
#53565a steel on #ffffff (muted text)7.38AAA
#6b6e72 soft on #ffffff5.12AA
#d12b2b sale on #ffffff4.9AA
#1f8a4c success on #ffffff4.0AA (large) / use at ≥14px bold
#000000 on #f4f4f4 (text on studio grey)19.3AAA

The black/white brand pair sits at the maximum 21:1 across the entire chrome. The steel pill clears AAA for white text at 7.38:1, and the muted-text use of steel on white also clears AAA — a rare win for a grey that doubles as both pill and secondary text. The few off-system colours (sale red, success green) hold AA at body sizes.

Focus Indicators

Focus ring is 2px solid #000000 with 2px outline-offset on light surfaces. On ink / photographic surfaces (campaign tiles, footer), focus flips to 2px solid #ffffff. Buttons, inputs, links, filter chips, and swatch dots all gain the ring on :focus-visible.

ARIA Patterns

  • Search toggle: role="search"; input has aria-label="Search products".
  • Filter chip: aria-pressed to communicate selection state.
  • Product card: entire tile wrapped in <a> with verbose aria-label — “Vital Seamless 2.0 Leggings, Women’s, £45”.
  • Swatch dot: aria-label="Black colorway, 1 of 5" — names the colour and position.
  • Wishlist heart: aria-pressed with label “Add to wishlist” / “Remove from wishlist”.
  • Bag drawer: role="dialog" with aria-modal="true" and focus trap; Esc closes.
  • Accordion rows: aria-expanded + aria-controls for PDP product-detail disclosures.

Keyboard Navigation

Tab order: announcement strip → logo → primary nav (left to right) → search → account → wishlist → bag → main grid (top to bottom, left to right) → filter rail (when expanded) → footer.

  • Inside filter chip group: arrow keys navigate, Space toggles, Enter applies.
  • Inside PDP gallery: arrow keys advance thumbnails.
  • Inside bag drawer / modal: focus trapped; Esc closes.

Screen Reader Hints

Verbose aria-label on icon-only buttons (heart, paddle, search, bag). Sale prices include aria-label="Sale price £30, was £45, save 33%" so the discount narrative reads. The bag-count badge uses aria-live="polite" so item additions announce.

Reduced Motion

All transitions degrade gracefully. Image hover and cross-fade suppress. Drawer slide → opacity-only. Carousel autoplay halts. Hover state becomes instant.

10. Responsive Behavior

Breakpoints

NameWidthKey Changes
wide1536px+Content max-width holds ~1280px; outer gutters grow rather than stretching the grid
desktop1280pxDefault desktop — 4-up product grid, full primary nav, 240px filter rail
tablet-large1024–1279px4-up grid persists or eases to 3-up; filter rail starts compressing
tablet768–1023px3-up grid; primary nav center cluster begins collapsing; “Filter” becomes a toggle
mobile-large640–767pxNav collapses to hamburger drawer; search becomes a full-width overlay; grid → 2-up
mobile<640px2-up grid; campaign tiles full-screen width; Montserrat headline scales down; filter off-canvas

Touch Targets

All interactive elements meet WCAG AA (44×44px minimum). Pills sit at 48px height with 28px horizontal padding. Icon-circular buttons sit at 44px. Filter-chip pills are ~40px height with hit-target padding extending the tappable area to 44px+.

Collapsing Strategy

  • Primary nav: desktop center cluster → mobile hamburger drawer that slides from the left.
  • PLP grid: 4-up → 3-up → 2-up at 1024, 768, 640; gutters tighten from 16px toward 8px on mobile.
  • Filter rail: 240px fixed → “Filter” toggle → off-canvas full-screen drawer at mobile.
  • Category rail: desktop horizontal scroll with ~4–5 visible → mobile horizontal scroll with ~1.5 visible (peek-next-card pattern).
  • Section spacing: 48px desktop → 32px tablet → 24px mobile to keep the catalog rhythm tight.
  • Campaign headline: Montserrat scales down at each breakpoint; weight stays 700, tracking stays tight.

Image Behavior

  • Product imagery holds a consistent portrait 3:4 ratio across all breakpoints — the image scales, the ratio doesn’t.
  • Campaign tiles use art-direction crops: a 16:9 wide hero on desktop swaps to a 4:5 portrait on mobile so the athlete stays centered and the headline keeps burn-in space.
  • Non-critical product imagery is lazy-loaded as the user scrolls into the next grid row.

Container Queries

Used in the PLP filter rail — when the rail narrows below ~180px, multi-column filter groups collapse to single column with chevron disclosure.

11. Content & Voice

Tone

Direct, athletic, community-driven. Gymshark’s voice is the training partner who hypes you up without theatre — confident and inclusive, built for a Gen-Z UK audience that found the brand through social and the gym floor. Headlines lead with energy and identity (“We Do Gym”, “Built to Move”, “Lift the World”); body copy carries the spec (“seamless knit, squat-proof, four-way stretch”).

The brand consistently positions itself as the community’s kit, not a luxury label — every microcopy moment is more motivating than corporate. There is energy, but it never tips into gimmick; the chrome stays clean so the copy and people carry the warmth.

Microcopy Patterns

  • Button verbs: “ADD TO BAG”, “SHOP NOW”, “SHOP”, “CONTINUE”, “EXPLORE”. Uppercase, short, outcome-named.
  • Error message recipe: factual + remedial — “That size is sold out. Try another size or get a restock alert.”
  • Success confirmations: “Added to bag” — instant, no ceremony.
  • Field labels: short and direct — “Email”, “Postcode”, “Card number”, “Size”.
  • Stock urgency: “Almost gone” / “Low stock” — calm, no countdown pressure.
  • Restock: “Out of stock — Notify me” — names state and action in one line.

Empty States

  • Empty bag: “Your bag is empty. Find your next fit.” — points back to shopping.
  • Empty wishlist: “Save your favourites here. Tap the heart on any item to start.” — instructive.
  • Empty search results: “Nothing found for [query]. Try different keywords or shop Women’s, Men’s, Accessories.” — names cause + alternatives.

CTA Verb Conventions

  • Primary (steel pill): “ADD TO BAG”, “SHOP NOW”, “CONTINUE”, “CHECKOUT”, “JOIN”
  • Light alternate: “CONTINUE SHOPPING”, “CANCEL”, “BACK”
  • On-image: “SHOP”, “EXPLORE”, “DISCOVER”
  • Tertiary text: “View product details”, “See all”, “Size guide”

The verb library is deliberately small and athletic-imperative. Gymshark avoids SaaS qualifiers like “Get started free” or “Try it now” — the verbs name the gym-floor action.

12. Dark Mode & Theming

Light-only across the storefront. Gymshark’s commerce surface ships only in the light theme on a pure white canvas. The thin announcement strip at the very top and the footer flip to ink (#000000) for contrast, and campaign bands may render dark for editorial moments, but these are content moments, not a theme — the page proper resumes white below them. There is no prefers-color-scheme: dark query and no data-theme="dark" token swap on the web store.

If implementing a Gymshark-flavoured dark variant for a derived system: swap canvas to #000000, studio grey to #1a1a1a, ink/text to #ffffff, muted text to #9a9da1, hairline to #2a2a2a — keep the 56px pill geometry and Montserrat/Roboto pairing unchanged, and consider lightening the structural pill to a brighter steel so it reads against the dark canvas.

13. Lineage & Influences

Gymshark’s visual lineage is a fusion of athletic-editorial commerce and the social-native, community-first energy that built the brand from a bedroom screen-printing operation into a global fitness label. The chrome borrows the monochrome athletic discipline of the big sportswear houses — full-bleed photography, neutral studio backdrops, no decorative furniture between image and CTA — but rounds the corners harder and swaps the structural pill to a softer steel grey, giving the interface a warmer, more approachable feel than the harder black-on-white of its larger rivals. The strict Montserrat-over-Roboto pairing is straight out of the Google Fonts modern-commerce playbook: a geometric bold display family for impact and a humanist grotesque for legible body copy.

What it inherits and rejects: from Swiss/grotesque typography it takes the grid, the absence of ornament, and the discipline of letting weight (not colour) carry hierarchy. From sports-magazine editorial it takes the burn-in headline and the athlete-led full-bleed shot. From its larger sportswear contemporaries it inherits the photography-on-neutral-grey studio metaphor and the pill-CTA vocabulary — then it personalises the system with the unusually round 56px pill, the steel structural accent, and the shark-fin logo as the sole mark. What it rejects is drop-shadow skeuomorphism, gradient washes, multi-hue accent palettes, and SaaS qualifier copy — the page stays monochrome and direct so the community and the product own the colour.

Influences:

14. Do’s and Don’ts

Do

  • Keep the base pure monochrome — #ffffff canvas, #000000 ink — and let product photography carry all the colour.
  • Use the steel pill (#53565a, white uppercase label) as the single structural CTA per viewport; pair it at most with a white outline pill for the soft alternate.
  • Round every CTA to the full 56px pill. Never introduce a square or 8px button into the action vocabulary.
  • Set headlines in Montserrat Bold (700) and body in Roboto Regular (400) — never cross the two families.
  • Uppercase button labels in Montserrat 14/600 with 0.04em tracking — the brand’s signature button voice.
  • Stage every product photograph on #f4f4f4 soft grey — the system’s “studio.”
  • Use sale red (#d12b2b) only on price rows — never on backgrounds, badges, or chrome.
  • Stack content sections at 48px rhythm with no decorative dividers; the photography’s bleed-edge is the divider.
  • Anchor on-image CTAs with white pills at bottom-left — the universal “shop this image” position.
  • Use tnum on every price so columns align across the product grid.
  • Set focus rings to 2px black on light, 2px white on dark/photographic surfaces.
  • Keep the shark-fin logo small, mono, and quiet at the top-left of the nav — it is the only ornament.

Don’t

  • Don’t introduce drop shadows or card elevation. Cards sit flat; depth comes from photography and the modal-only soft shadow.
  • Don’t add a second accent colour. Steel (#53565a) is the entire structural palette beyond black and white.
  • Don’t replace black (#000000) ink with a near-black grey for headlines or text — the brand commits to true black.
  • Don’t pad inside product cards. The image is full-bleed; metadata sits directly below with 8px between rows.
  • Don’t soften the CTA radius below 56px — the very-round pill is the brand’s most recognisable geometry.
  • Don’t set body copy in Montserrat or headlines in Roboto — the two-family split is strict.
  • Don’t introduce a third button shape. Pill or icon-circular is the entire button vocabulary.
  • Don’t use serif, script, or display-rounded fonts. The system is Montserrat + Roboto, no exceptions.
  • Don’t add accent gradients or atmospheric blur. The chrome is solid colour-block throughout.
  • Don’t lowercase or mixed-case the button labels — pill CTAs are always uppercase.
  • Don’t let body copy fall below 14px (body-sm); the smallest UI text is 12px (caption) for badges and chips.
  • Don’t put two structural steel pills in the same fold — neutralise one to the white outline pill.

15. Agent Prompt Guide

Quick Color Reference

  • Canvas: #ffffff
  • Ink (text + brand black): #000000
  • Steel (structural pill + muted text): #53565a
  • Steel hover: #42454a
  • Studio grey (product image stage): #f4f4f4
  • Hairline divider: #e2e2e2
  • Text soft (low-emphasis): #6b6e72
  • Sale red: #d12b2b
  • Success: #1f8a4c
  • Focus ring (light): #000000
  • Focus ring (dark/photo): #ffffff

Example Component Prompts

  1. “Create a Gymshark campaign hero — full-bleed athletic photograph (16:9, an athlete mid-movement on a soft grey studio backdrop) with a bold Montserrat headline (700, ~56px, tight -0.02em tracking) overlaid lower-left in white. Anchor a single white pill (radius 56, padding 12×24, uppercase Montserrat 14/600 ink, label ‘SHOP’) at the bottom-left. No shadow, no border, no gradient overlay.”

  2. “Design a Gymshark product card — portrait 3:4 product photograph on a #f4f4f4 soft-grey backdrop, zero radius, zero padding around the image. Optional black pill badge (‘NEW’, uppercase caption, radius 56) top-left over the image. Below: an 8px stack of swatch dots (16px circles), product name in Roboto 16/600 ink, fit subtitle in Roboto 12/500 steel (#53565a), price in Roboto 16/600 ink with tnum. If on sale, render discounted price in #d12b2b, then strike-through original in steel, then ’% off’ in #d12b2b.”

  3. “Build a Gymshark primary CTA — radius 56 pill (very rounded), bg steel #53565a, text #ffffff uppercase Montserrat 14/600 with 0.04em tracking, padding 14×28, height 48. Hover: bg deepens to #42454a over 150ms. No lift, no scale.”

  4. “Create a Gymshark white alternate CTA — radius 56 pill, bg #ffffff, 1px black outline #000000, text #000000 uppercase Montserrat 14/600, padding 14×28. Used beside the steel primary as the soft option (‘CONTINUE SHOPPING’).”

  5. “Design a Gymshark PLP filter row — 1px hairline #e2e2e2 between groups. Each group: section header in Roboto 16/600 ink, filter chip group below. Filter chips at radius 56, default bg #ffffff with 1px black outline, active bg #000000 text white. Counts in parentheses use steel #53565a.”

  6. “Build the Gymshark masthead — a thin black announcement strip (#000000, centered white caption ‘Free shipping over £55’) above a 64px white primary nav: shark-fin logo left (mono, ~28px), centered category nav ‘Women · Men · Accessories · Collections · Sale’ in Roboto 16/600 ink, right cluster (search + account + wishlist heart + bag icons). Active nav link gets a 2px black underline.”

Iteration Guide

  1. Focus on ONE component at a time. Pull its tokens from the frontmatter and verify every property resolves to a concrete value.
  2. Reference component names and tokens directly (button-primary steel #53565a, radius 56, studio grey #f4f4f4) — do not paraphrase color names or radii in prose.
  3. Default body to Roboto 16/400; reach for Roboto 16/600 for product names and nav links; reserve Montserrat Bold strictly for headlines and uppercase button labels.
  4. Keep the structural steel pill scarce per viewport — if more than one solid steel pill appears in the same fold, neutralise one to the white outline pill.
  5. Hold the 56px pill radius constant across every CTA, chip, and badge — it is the brand’s most distinctive geometry; do not soften it toward a generic 8–12px button.
  6. Add new variants as separate component entries (-hover, -active, -focused) — do not bury them inside prose.
  7. Run a contrast check on every text/bg pair — black/white sits at AAA (21:1), white-on-steel at AAA (7.38:1); keep off-system colours (sale red) at AA on body text.
  8. Test every interactive surface at 640px / 768px / 1024px / 1280px. Gymshark’s responsive cadence (4-up → 3-up → 2-up; nav → hamburger drawer; filter rail → off-canvas) is part of the system’s identity.
Ship with this

Drop gymshark into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add gymshark
2 · ship landing page
npx agentkit init --design gymshark
How AgentKit reads DESIGN.md