Design System

Latest projects All projects →

Brand Centre All brands →

planning and tools · shipping log

Shipping log

Everything that merged, shipped or opened — newest first. Every row links to the project page with its options and decision.

Design system folded into the siteTokens + foundations + fascia modes absorbed from designsystem-debenhamsgroup
merged
PLP Redesign openedTarget w/c 08 Sep · Scott's brief
open
CTA Colour Alignment mergedKM review complete
merged
New Checkout shippedFigma WChEtDPH… · 3990:58406
shipped
VTO first-use journey shippedAsset-embed pattern introduced
shipped
system / foundations · rendering Debenhams

Colour

Two layers: primitives named by what they are, semantic tokens named by role. Components consume only semantic tokens; the brand mode swaps what they resolve to. Brand values are the Colour Alignment set (post-KM review, Aug 26).

Brand-resolved roles live — switch brand in the sidebar

TokenValueRole
surface/actionPrimary action fill
surface/action-hoverAction hover
surface/action-pressedTouch-down state
text/on-actionLabel on action fill
surface/accentAccent fills — badges, highlights
brand/light-1Tinted surfaces, badges
brand/light-3 · surface/accent-subtleWash backgrounds
surface/pagePage background
text/link · border/focusLinks, focus rings — follow the action colour

Semantic — text mode-invariant unless marked

Body text floor is Grey 5. Grey 4 and below never carry body text — they fail AA contrast.

text/primary#0F0F0F
text/secondary#6B6B6B · floor
text/disabled#B5B5B5
text/inverse#FFFFFF
text/error#D33F3F
text/success#1F7A25
text/warning#7A5800
text/link

Semantic — surface

surface/sunken#FAFAFA
surface/raised#FFF + border
surface/inverse#0F0F0F
surface/overlay#000 @ 60%
surface/action-disabled#E7E7E7
surface/error#FFF2F2
surface/success#EAF6EA
surface/warning#FFFBE6

Semantic — border & icon

border/subtle#E7E7E7 · dividers
border/default#D6D6D6
border/strong#767676
border/action · focus
icon/primary#0F0F0F
icon/secondary#767676 · grey 4 ok

Neutrals shared by every fascia

White#FFFFFF
Grey 05#FAFAFA
Grey 1#F2F2F2
Grey 2#E7E7E7
Grey 25#D6D6D6
Grey 3#B5B5B5
Grey 4#767676
Grey 5#6B6B6B · text floor
Grey 6#323232
Soft Black#0F0F0F
Black#000000

Status never colour alone — always paired with icon or text

Red#D33F3F
Red Light#FFF2F2
Yellow#FFD600
Yellow Light#FFFBE6
Green#70C474
Green Light#EAF6EA

Primitives — Debenhams Aqua family locked · names preserved from the DS file

Aqua Light 4#E6FFFC
Aqua Light 3#D6FFF9
Aqua Neutral#E8F4F2
Aqua Light 2#B8FDF4
Aqua Light 1#9DEDE2
Primary Aqua#7BE7D8
Aqua Dark 1#76DECF
Aqua Dark 2#70BEB3
Aqua Dark 3#529C92
CTA Aqua#00787D
CTA Touch Down#00565A
Primary Dark#1E6F63

Primitives — boohoo Pink family 12 slots · same structure every fascia

Pink Light 4#FFE9F0
Pink Light 3#FEE0EA
Pink Neutral#F1DCE3
Pink Light 2#FCD3E1
Pink Light 1#FBC7D8
Primary Pink#F8B5CC
Pink Dark 1#EEA5BE
Pink Dark 2#EA92B0
Pink Dark 3#DD789B
CTA Pink#BB305F
CTA Touch Down#A82A55
Primary Dark#CB4870

boohooMAN, PLT and Karen Millen carry their colour-alignment CTA set (rendered above when switched); their remaining primitive slots land as each fascia is audited. Removed from the primitive layer: KM mode overrides (re-mapped fresh via semantic layer) and Rewards colours (project dead).

system / foundations · rendering Debenhams

Typography

One role set, every fascia. Sizes are identical across brands — only font family and weight change with the mode. Fixed per-breakpoint sizes (no fluid clamp for v1), line-height mirrors Figma AUTO, letter-spacing defaults to 0.

canvas — type specimenDebenhams
display-lg · 48Wardrobe icons
heading-xl · 28New season edit
heading-sm · 16Delivery & returns
body-md · 14Free returns within 28 days. Star buys are final sale — check the label before you commit.
caption · 12Selected lines only. T&Cs apply.

Roles mobile / desktop px · same for every fascia

RoleMobile / DesktopUse
display-lg32 / 48 · strongHero, marketing pages
display-md28 / 40 · strongSection openers
display-sm24 / 32 · strongEditorial leads
heading-xl20 / 28 · strongPage titles
heading-lg18 / 24 · strongSection titles
heading-md16 / 20 · strongSubsection titles
heading-sm16 / 16 · strongCard titles — matches existing "Header 1"
heading-xs14 / 14 · strongInline section labels — matches "Header 2"
body-lg16 / 16 · regularLong-form body
body-md14 / 14 · regularDefault body — matches "Body M"
body-md-strong14 / 14 · strongEmphasis
body-sm12 / 12 · regularCompact body
caption12 / 12 · regularCaptions, T&Cs, legal
micro10 / 10 · regularSmallest legal labels

Size primitives

10 · 12 · 14 · 16 · 20 · 24 · 28 · 32 · 36 · 40 · 48

Per-fascia resolution colour alignment, Aug 26

FasciaFontRegularStrongCTA case
debenhamsGeologica300 Light600 SemiBoldsentence
boohooMontserrat500 Medium700 Boldsentence
boohoomanMontserrat500 Medium700 Boldsentence
pltRoboto400 Regular700 BoldUPPERCASE
karenmillenJost400 Regular600 SemiBoldsentence

Every brand font is a Google Font with the full weight range available. Fonts for the other 11 fascias are captured as each is audited. If a fascia's font ever demands a size shift, it becomes a brand-mode override at the role layer — the default is consistency.

system / foundations

Spacing

We measure spacing in gaps. 1 gap = 4px, so gap N = N × 4px. It is the same unit as Tailwind's spacing scale (1 = 0.25rem = 4px at a 16px root), so gap N is Tailwind N: gap 4 = 16px = p-4 / gap-4 / m-4. Every spacing value is quoted in both: gap 4 (16px).

gap 0.5 · 2px
gap 1 · 4px
gap 1.5 · 6px
gap 2 · 8px
gap 3 · 12px
gap 4 · 16px
gap 5 · 20px
gap 6 · 24px
gap 8 · 32px
gap 10 · 40px
gap 12 · 48px
gap 16 · 64px
gap 20 · 80px
gap 24 · 96px
gap 32 · 128px

The scale gap · px · Tailwind · token

GappxTailwindTokenUse
gap 0.52pxp-0.5 · gap-0.5 · m-0.5--gap-0_5Hairline nudges — rating stars, countdown under its text
gap 14pxp-1 · gap-1 · m-1--gap-1Tight inline gaps — icon + label · USP bar top/bottom
gap 1.56pxp-1.5 · gap-1.5 · m-1.5--gap-1_5Desktop USP bar top/bottom
gap 28pxp-2 · gap-2 · m-2--gap-2Tight component padding · card actions inset · promo field gap
gap 312pxp-3 · gap-3 · m-3--gap-3Standard inline gap
gap 416pxp-4 · gap-4 · m-4--gap-4Default component padding · mobile page margin
gap 520pxp-5 · gap-5 · m-5--gap-5Modal padding · medium padding
gap 624pxp-6 · gap-6 · m-6--gap-6Default desktop margin (small) · section separation
gap 832pxp-8 · gap-8 · m-8--gap-8Section breaks
gap 1040pxp-10 · gap-10 · m-10--gap-10Large section spacing
gap 1248pxp-12 · gap-12 · m-12--gap-12Layout-level spacing
gap 1664pxp-16 · gap-16 · m-16--gap-16Hero / page-level spacing
gap 2080pxp-20 · gap-20 · m-20--gap-20Page-level spacing
gap 2496pxp-24 · gap-24 · m-24--gap-24Desktop side gutter at 1440+ — content scales inside
gap 32128pxp-32 · gap-32 · m-32--gap-32Largest layout spacing

In Tailwind assets/ds/tailwind.preset.js

Add the preset to the front end's config — presets:[require('./assets/ds/tailwind.preset.js')] — and load tokens.css. It maps every DS step to its --gap-* token, so p-4 resolves to var(--gap-4) (16px). It extends Tailwind rather than replacing it, so existing classes keep compiling.

Off the DS scale in today's front-end build (from the dev Storybook's compiled CSS): 2.5 (10px) · 3.5 (14px) · 7 (28px) · 9 (36px) · 11 (44px) · 14 (56px). They still work; each should move to the nearest DS step when that component is next touched.

Writing it down: designs, specs, the catalogue and Storybook quote spacing as gap N (Npx). Sizes (a 50px field, a 24px icon) and type (12/15) stay in px — they aren't spacing.

Icon sizes

12
16
20
24
32
48

All icons draw at a 1pt stroke. Buttons use 16 / 20 / 24; 32 and 48 are for hero and decorative use.

Z-index layer scale

TokenValueLayer
z-base / z-raised0 / 10Page flow, raised cards
z-dropdown / z-sticky100 / 200Menus, sticky headers
z-banner / z-overlay300 / 400Banners, scrims
z-modal / z-popover500 / 600Dialogs, popovers
z-toast / z-tooltip700 / 800Toasts, tooltips — always on top

Breakpoints deferred — deliberate

The live estate applies breakpoints inconsistently per component; the new system exists partly to fix that. Designers work at 390 and 1440. Components are specced fluid-first; the named breakpoint set gets locked once the component audit reveals real reflow needs.

system / foundations · rendering Debenhams

Radius

4pt corners by default. Square is a brand-mode option, not a fork — PLT and The Brand Room opt in today; any fascia can, by swapping one token mapping.

radius-0
radius-2
radius-4
radius-8
radius-16
radius-full

Semantic mapping

RoleDefaultSquare mode (PLT · Brand Room)
radius/defaultradius-4radius-0
radius/lgradius-8radius-0
radius/pillradius-fullradius-0

current brand resolves radius/default →

system / foundations

Borders

Everything draws at 1pt — borders, dividers, line icons. 2pt is reserved for focus rings and selected states. No shadow scale: the system is flat, hierarchy comes from borders and surface tones.

TokenValueUse
border-width/default1ptBorders, dividers, icons
border-width/emphasis2ptSelected states
border-width/focus2ptFocus rings

Colour conventions

TokenValueUse
border/subtle#E7E7E7Default divider · PDP box borders
border/default#D6D6D6Inputs, cards
border/strong#767676Emphasised borders
border/action · border/focusSecondary buttons, focused inputs, focus rings
border/error#D33F3FError input borders

Borders aren't subject to text contrast rules, so every grey is available — the Grey 5 floor applies to text only.

system / foundations

Motion

Conservative by default. Three durations, two curves, and a global collapse to instant under prefers-reduced-motion — built into the token layer, no per-component work.

TokenValueUse
motion-duration-fast100msMicro — button press
motion-duration-base200msDefault — hover, fade, modal open
motion-duration-slow300msLarger transitions — drawer slide
motion-easing-standardcubic-bezier(.2, 0, 0, 1)Default
motion-easing-emphasisedcubic-bezier(.3, 0, .8, .15)Attention-pulling

No shadows

Deliberately flat. If a future component genuinely needs elevation (a floating popover, say), an elevation token gets proposed then — not pre-emptively.

system / foundations · wcag 2.1 aa — the floor, not the ceiling

Accessibility

Every component targets WCAG 2.1 AA. Non-negotiable: anything that doesn't meet the bar doesn't ship, and a component spec without an Accessibility section isn't finished.

RuleBarDetail
contrast · body4.5 : 1Floor is Grey 5 #6B6B6B — Grey 4 and below never carry body text
contrast · large/UI3 : 118pt+ text and UI components
focusalways visible2pt ring in the brand action colour · full keyboard operation
touch targets44 × 44Minimum on mobile — inline body links exempt where natural
motionreduced-motionAll animation collapses to instant · nothing auto-plays without opt-out
meaningnever colour aloneStatus pairs colour with icon and text · icon-only buttons carry aria-label

Exemptions

The Grey 5 floor applies to text only. Borders, dividers, icons and decorative elements may use any grey — Grey 2 is the typical divider, Grey 4 the standard secondary icon.

system · npm distribution — planned production shape

Using the system

Brand sites install two packages: the tokens and the components. Set one attribute on the root element and every semantic token resolves to that fascia.

npm install @designsystem-debenhamsgroup/react @designsystem-debenhamsgroup/tokens

Wire in the tokens

/* global css */ @import '@designsystem-debenhamsgroup/tokens/css'; /* tailwind.config.js */ presets: [require('@designsystem-debenhamsgroup/tokens/tailwind-preset')]

Set the brand mode

<html data-brand="debenhams"> <!-- or boohoo · boohooman · plt · karenmillen -->

Use a component

import { Button } from '@designsystem-debenhamsgroup/react'; <Button variant="primary" size="md">Save & continue</Button>

The rules that keep it working

RuleWhy
semantic tokens onlycomponents never touch primitivesBrand colours appear only in the token layer — this is what keeps multi-brand working
one mechanismdata-brand attributeNo per-brand CSS files, no component forks
docs page = specthey ship togetherA component without a docs page doesn't exist

Escape hatch

Components are intentionally constrained. If one genuinely doesn't fit, the source is visible on its page — copy and modify, or raise a request to extend the official component.

system · packages/components

Components

The library index. Brand chips show themed coverage; status is live in production or in build.

NameDescriptionBrandsStatus
C-01ButtonPrimary · secondary · disabled · spinner — golden-truth state matrixlive
C-02Product cardThe hero asset — Figma-exact, variable layers as config, used on every PLP + carousellive
C-03Smart promo fieldPromo code or gift card — detects which it's givenlive
C-04PLP templateOne core template · seven fascia configs · building on branch plp-alignmentwip
C-05HeaderMain header + checkout header · mobile + desktop · every fasciaOct 12live
C-06Sort & filterCombined pattern — desktop dropdown row, mobile sheet with drill-inslive
C-07BadgesImage-overlay tags + AI-generated banner — stack rules, per-brand theminglive
C-08FooterNewsletter band · link columns · social + app rail · payments · sister brands (Deb)live
C-09Button systemprimary · secondary · tertiary · tertiary XS · text · pay · sizes · icon slot · spinner state — golden matrix, every state tokenisedlive
C-10Payment buttonsPayPal · Pay Later · Apple Pay · Google Pay · Klarna · Clearpay · mini · glass — scheme colours fixed, artwork exactlive
C-11Form controlsFloating-label field · select · checkbox · radio · toggle · quantity · promo + apply · PSP static field · inline errorlive
C-12MessagingBanner (success / neutral / error) · toast (snackbar + top actionable) · stock alert · empty statelive
C-13PDP kitPrice block · size selector · colour swatches · accordion · section rail · USP box · BNPL · free-delivery bar · Deliver+ · at-a-glancelive
C-14Overlays & bagModal (desktop Small · Medium · Large · Full screen, mobile alert · slide up · full screen) · bag line item · order summarylive
C-15Chips & pillsChip · filter pill w/ toggle · tag pill · save chip · PDP entry chiplive
C-16AccountBalance card · account rows · icon puck — per-fascia fillslive
C-17AI Generated strip rulesFull-width live-text strip owns the image foot; badges shift up by its height; hidden post-ATB (EU AI Act 50(4))live
C-18Square tile railBrand / category square tiles, 1px gutters (Brand Room pattern)live
F-ICOIcon library136 core icons + PLT set + social — 1pt stroke rule, aspect lockedlive
system / components / C-01 · rendering Debenhams

Button

Four states, one component, every fascia. Switch the demo brand in the top bar — colour, type, radius and case all follow the tokens.

canvas — button / all statesDebenhams
FIG 01 — STATES H 44 · R

Props ButtonProps

PropTypeNotes
variantprimary · secondary · tertiaryOne primary per view · default primary
sizesm · md · lgDefault md · sm needs touch-target review
disabledbooleanPrevents interaction
loadingbooleanPrevents interaction · sets aria-busy · spinner
brandinherited from modeNever set per-instance

Usage

Secondary carries the CTA colour as a keyline, never a second fill. PLT renders square with uppercase labels; every other fascia 4px radius, sentence case — that difference is brand config, not a component fork.

Accessibility

CheckStateDetail
keyboardnativeRenders a native button element — focusable and operable by default
focus ring2ptborder/focus — brand action colour, 2px offset
loadingaria-busyBoth disabled and loading prevent interaction
touch target44 × 44Met at md and above · sm under review for mobile

Still to specify after the Figma node audit

Full variant set (Pill, Icon Only, Roundel, Navigation, Payment, Dropdown, Quantity Selector, App Store badges) · icon slot handling (boolean + size, not encoded as states) · loading visuals · pressed-vs-hover naming unification · disabled colour reconciliation (golden truth label #767676 vs token text/disabled Grey 3) · focus ring exact width and offset per size.

Source

packages/react/src/components/button · Figma: DS file → BUTTONS (new) · 9144-1807

system / components / C-02 · rendering Debenhams

Product card

The hero asset — built exactly from the Figma component, used across every PLP and carousel. Every optional element is a variable layer: turn it on per fascia, never fork the card.

canvas — product card · all layers on / minimalDebenhams
Plus
AI Generated
Selling Fast!79 Sold
Sponsored
Brand Name
Product name product name product name
£0.00£2.99-30%
+5
(9)
Brand Name
Product name product name
£45.00£60.00

Formats: standard, and .pc--compact — the shorter PLT / Brand Room format (caps brand 11px, 12px name, tighter gaps) that the alignment rolls out to every fascia. Wishlist variants: heart-in-circle (Debenhams, boohoo, Warehouse today) · bookmark-in-square (boohooMAN, KM, Brand Room) · plain heart (PLT). Image corners are square — matching live and Figma.

Variable layers booleans on one component — the Figma model, kept verbatim

LayerElementNotes
wishlistButton32px circle · heartIcon swaps per fascia: heart or bookmark (KM, boohooMAN, Brand Room, Warehouse) — nested atomic icon
quickAddicon · button · noneCircle icon (Debenhams) or full-width Add button (boohooMAN)
productTagbadge, bottom-leftPlus / Petite / Tall — see C-07 Badges for stacking
taggstarsocial-proof barGrey 1 chip, no icon · PLP "Selling Fast! 79 Sold" · PDP two-line card with close · bag line
sponsoredtext rowFigma uses Grey 4 — lifted to Grey 5 here for the AA text floor
colourSwatches20px swatch rowSwatch shape is a nested atomic component — restyle per brand without touching the card
showReviewStarsstars + count12px stars, 2px gap
showBrandbrand lineHidden on PLT + Warehouse per the Sep brief

Anatomy values

Image 2:3 on surface/media · card gap 12 · info gap 8 · title gap 4 · text 14px — brand w-strong, name w-regular 2-line clamp, was-price w-mid strikethrough · sale price + percent in status red · actions 32px circles, top 8 right 8, gap 8.

Source

assets/ds/components.css → .pc · Figma: DS file → Product Card · 5992-10841 · variable layers on · 12999-146812

system / components / C-06 · rendering Debenhams

Sort & filter

The combined pattern from the A/B/C tests: desktop gets a dropdown row with sort on the right; mobile gets Next Day Delivery + a single Sort & Filter entry opening a full sheet with drill-in panels and a pinned CTA.

canvas — desktop row / mobile barDebenhams
Next Day Delivery
Next Day Delivery
Women's: 12, 14, XS, M, L Men's: XS, M, L

Desktop is a strip under the category links: optional NDD toggle, dropdown boxes, "Show more filters", sort right. Mobile (live platform) is the split Filters | Relevance bar; mobile (new format) is the floating pill row — white radius-42 chips with soft shadow, NDD toggle inline, chips open the combined sheet (Brand Room Figma 739-92223).

canvas — mobile filter modal (slide up)Debenhams
Filters

Source

assets/ds/components.css → .sf · Figma: Sort & Filter combined · 1783-11572 — A/B/C variants live in the same file for the test readout.

system / components / C-07 · rendering Debenhams

Badges

Image-overlay tags (Plus, Petite, Sale, Sponsored) and the AI-generated banner. Badges stack bottom-left, newest on top; the AI banner is a full-width strip pinned to the image foot and is mandatory whenever the imagery is AI-generated.

canvas — stacking on the card imageDebenhams
PetiteSale
AI Generated
PlusPetiteTallSale

Rules

RuleDetail
ai bannermandatoryFull-width black strip at image foot whenever product imagery is AI-generated — uppercase, 10px, white
stackingbottom-left columnBadges lift 32px when the AI banner is present (.has-ai) · gap 4
themingtokens onlyRadius, font, case follow the brand mode — square on PLT/Brand Room automatically

Source

assets/ds/components.css → .badge · Figma: AI watermark + stacking · 25-11775 · live demo: ai-generated-badge

system · assets/ds/icons/lib — exported from the Figma icon library

Icons

The canonical icon set, pulled from the DS Figma Iconography page. Rules: 1pt stroke everywhere regardless of scale, aspect ratio always locked (render in a fixed square box, object-fit contain — never stretch), default colour icon/primary. PLT runs its own lighter 16px set for header and card chrome.

Core set 136 icons

360
apple
authenticity
duplicate
geolocate
ar
arrow-increase
boohooman-premier
bookmark
plane
48hr-refund
account
account-balance
account-overview
acorn
add
add-photo
addresses
ai
alert
app
assembly
bag
birthday
calendar
camera
card
cash-back
celebrate
checkout
clear
close
collapse
compensation
completion-time
contact-prefs
copy
country-settings
cover
cross-circle
cruelty-free
delete
delivery
delivery-fast
delivery-insurance
down
down-arrow
dress
edit
email
expand
expand-filled
filter
flame
foundation-finder
gift
gift-card
grid
hairadvisor
hamburger-menu
hanger
hide
image
info
leaf
left
light-bulb
link
linked-account
location
lock
lock-fill
makeup-advisor
measure
android-menu
minus
mirror
more
notification
offers
order
paraben
pause
placeholder
play-control
play-thumb
plt-royalty
price-promise
promo-code
question
quick-add
replay
resale
return
return-to-payment
right
right-arrow
room
save
search
settings
share
share-android
show
sign-out
size
skinadvisor
spinner
staff-area
star-fill
star-half
star-outline
subscribe-and-save
suggested-search
support
tick
tick-circle-fill
tick-circle-outline
tile
time
trophy
university
unlimited
unlimited-infinity
unlimited-plus
up
upload
vegan
visually-similar
wishlist
xmas
xmas-tree
palette
quantity
shop
zoom

Social

facebook
instagram
pintrest
tik-tok
x
you-tube

Payment badges

Figma aIHmkCaTy9c5EWOxAGw0So · node 669-2707 (Payment Icons). Raster exports at 3x in assets/ds/icons/pay/, shown at 30px tall in the footer band (C-08) in live order. iDEAL-Wero and Tink exist in Figma but aren't used on boohooMAN.

Visavisa
Mastercardmastercard
American Expressamex
Maestromaestro
Visa Electronvisa-electron
Apple Payapple-pay
Pay+payplus
PayPalpaypal
Klarnaklarna
Clearpayclearpay
Google Paygoogle-pay

Country flags 202 · 24 × 17

Figma aIHmkCaTy9c5EWOxAGw0So · node 5353-2781 (Country Flags, component set Flags). Flat SVGs in assets/ds/icons/flags/, one per country, named by slug (united-kingdom.svg). Globe and EU first, then A–Z. Square, country-selector and PLT header variants in the same frame are built from these.

GlobeGlobe
European UnionEuropean Union
AfghanistanAfghanistan
AlbaniaAlbania
AlgeriaAlgeria
AndorraAndorra
AngolaAngola
Antigua and BarbudaAntigua and Barbuda
ArgentinaArgentina
ArmeniaArmenia
ArubaAruba
AustraliaAustralia
AustriaAustria
AzerbaijanAzerbaijan
BahamasBahamas
BahrainBahrain
BangladeshBangladesh
BarbadosBarbados
BelarusBelarus
BelgiumBelgium
BelizeBelize
BeninBenin
BhutanBhutan
BoliviaBolivia
Bosnia and HerzegovinaBosnia and Herzegovina
BotswanaBotswana
Bouvet IslandBouvet Island
BrazilBrazil
BruneiBrunei
BulgariaBulgaria
Burkina FasoBurkina Faso
BurundiBurundi
CambodiaCambodia
CameroonCameroon
CanadaCanada
Cape VerdeCape Verde
Central African RepublicCentral African Republic
ChadChad
ChileChile
ChinaChina
ColombiaColombia
ComorosComoros
CongoCongo
Costa RicaCosta Rica
CroatiaCroatia
CubaCuba
CuracaoCuracao
CyprusCyprus
CzechiaCzechia
DR CongoDR Congo
DenmarkDenmark
DjiboutiDjibouti
DominicaDominica
Dominican RepublicDominican Republic
EcuadorEcuador
EgyptEgypt
El SalvadorEl Salvador
Equatorial GuineaEquatorial Guinea
EritreaEritrea
EstoniaEstonia
EswatiniEswatini
EthiopiaEthiopia
FijiFiji
FinlandFinland
FranceFrance
GabonGabon
GambiaGambia
GeorgiaGeorgia
GermanyGermany
GhanaGhana
GreeceGreece
GrenadaGrenada
GuatemalaGuatemala
GuineaGuinea
Guinea-BissauGuinea-Bissau
GuyanaGuyana
HaitiHaiti
Holy SeeHoly See
HondurasHonduras
Hong KongHong Kong
HungaryHungary
IcelandIceland
IndiaIndia
IndonesiaIndonesia
IranIran
IraqIraq
IrelandIreland
IsraelIsrael
ItalyItaly
Ivory CoastIvory Coast
JamaicaJamaica
JapanJapan
JordanJordan
KazakhstanKazakhstan
KenyaKenya
KiribatiKiribati
KuwaitKuwait
KyrgyzstanKyrgyzstan
LaosLaos
LatviaLatvia
LebanonLebanon
LesothoLesotho
LiberiaLiberia
LibyaLibya
LiechtensteinLiechtenstein
LithuaniaLithuania
LuxembourgLuxembourg
MadagascarMadagascar
MalawiMalawi
MalaysiaMalaysia
MaldivesMaldives
MaliMali
MaltaMalta
Marshall IslandsMarshall Islands
MauritaniaMauritania
MauritiusMauritius
MexicoMexico
MicronesiaMicronesia
MoldovaMoldova
MonacoMonaco
MongoliaMongolia
MontenegroMontenegro
MoroccoMorocco
MozambiqueMozambique
MyanmarMyanmar
NamibiaNamibia
NauruNauru
NepalNepal
NetherlandsNetherlands
New ZealandNew Zealand
NicaraguaNicaragua
NigerNiger
NigeriaNigeria
North KoreaNorth Korea
North MacedoniaNorth Macedonia
NorwayNorway
OmanOman
PakistanPakistan
PalauPalau
PalestinePalestine
PanamaPanama
Papua New GuineaPapua New Guinea
ParaguayParaguay
PeruPeru
PhilippinesPhilippines
PolandPoland
PortugalPortugal
QatarQatar
RomaniaRomania
RussiaRussia
RwandaRwanda
Saint LuciaSaint Lucia
Saint Vincent and the GrenadinesSaint Vincent and the Grenadines
SamoaSamoa
San MarinoSan Marino
Sao Tome and PrincipeSao Tome and Principe
Saudi ArabiaSaudi Arabia
SenegalSenegal
SerbiaSerbia
SeychellesSeychelles
Sierra LeoneSierra Leone
SingaporeSingapore
Sint MaartenSint Maarten
SlovakiaSlovakia
SloveniaSlovenia
Solomon IslandsSolomon Islands
SomaliaSomalia
South AfricaSouth Africa
South KoreaSouth Korea
South SudanSouth Sudan
SpainSpain
Sri LankaSri Lanka
SudanSudan
SurinameSuriname
SwedenSweden
SwitzerlandSwitzerland
SyriaSyria
TajikistanTajikistan
TanzaniaTanzania
ThailandThailand
Timor-LesteTimor-Leste
TogoTogo
TongaTonga
Trinidad and TobagoTrinidad and Tobago
TunisiaTunisia
TurkeyTurkey
TurkmenistanTurkmenistan
TuvaluTuvalu
UgandaUganda
UkraineUkraine
United Arab EmiratesUnited Arab Emirates
United KingdomUnited Kingdom
United StatesUnited States
UruguayUruguay
UzbekistanUzbekistan
VanuatuVanuatu
VenezuelaVenezuela
VietnamVietnam
Virgin IslandsVirgin Islands
YemenYemen
ZambiaZambia
ZimbabweZimbabwe

Usage

RuleDetail
aspect lockedalwaysFixed square box + object-fit contain — a squished icon is a bug
1pt strokeall scalesDrawn at 1pt on the 24 grid; don't scale below 16px (stroke thins) — flagged: source stroke-based SVGs for true non-scaling 1pt
sizes16 · 20 · 24UI chrome 24 · card chrome 16 · PLT set 16 with 12px glyphs
multi-part10 flaggedzoom, cross-circle, support, resale + 6 more export as layered vectors — re-export flat when needed

Source

assets/ds/icons/lib/ · Figma: Iconography · 470-887

system / components / C-09 → C-18 · rendering Debenhams

Extended library

Every component harvested from the estate on 08 Sep 2026 — ten repos read end to end (.context/18-component-inventory.md). Colour truth is the colour-alignment set; slot architecture follows Group-Design-System. Switch fascia with the brand button to see each skin. Nothing below carries a hardcoded brand colour.

C-09 · Button system .bd

Five types from the golden matrix (Buy It Now is off on every fascia for now): primary, secondary (white + brand outline), tertiary (Neutral fill, 40px), tertiary XS, text only. States: pressed, disabled (grey on every brand for tertiary), spinner — per Figma 12533:14818 the label gives way to a 24px arc and the fill drops to Neutral. Sizes .sm 6/12 · .md 8/16. Icon slot 20px (.ic24 / .ic16). .pay is the fixed-navy checkout Pay CTA, 8px radius.

canvas — types · statesDebenhams

C-10 · Payment buttons .pay

Scheme colours are fixed and never brand tokens (DS 9144-1931): PayPal #FFC439 (KM runs PayPal on #EEEEEE via --paypal), Apple Pay black, Google Pay white with #3C4043 border, Klarna #0B051D, Clearpay #B2FCE4. .pay--mini 114px, .pay--glass 25px radius + blur for floating chrome. Artwork is the frame's own exports in assets/ds/icons/payments/.

canvas — wallets · payment-option chipsDebenhams
or
VisaMastercardAmexApple PayGoogle PayPayPalKlarna

C-11 · Form controls

Floating-label field (default / focus / filled / error — label shrinks 14→12 and the input grows in), select driven by a real native <select>, 24px checkbox filled with --icon-action, 26px radio, toggle, 28px quantity stepper (minus becomes remove at 1), promo field + 95px Apply, and the PSP static field set — fixed navy / #EFEFF1 / 8px radius on every fascia, because the payment provider renders it.

canvas — inputs · choicesDebenhams
Sorry, we don't recognise that code
Relevance
Add Worry-Free Purchase® for £3.18
Use my delivery address for billing
Recommended
Lowest price
Next Day Delivery
2
Card number
•••• •••• •••• 4242
MM / YY

C-12 · Messaging

Banner: 4px status bar + 20px icon + text, optional inline action and dismiss; success / neutral (never dismissible — it's a readout) / error. Toast: bottom black snackbar (1.8s) or top light actionable (6s, "View"). Stock alert and empty state round it out.

canvas — banners · alertsDebenhams
Promo code SUMMER applied — £6.00 off
Gift card balance: £25.00
We couldn't find that gift card. Check the number and PIN.
Only 2 left — order soon

Your bag is empty

C-13 · PDP kit

Price block (now / was / save badge — PLT's is transparent with #C90000 / promo line / OOS label), size selector 60×50 with three OOS treatments (greyed, strike, notify bell), 60×89 colour image swatches with the black-plus-white-keyline selection, accordion, section header + rail, USP box (DS 3619-10541), BNPL (DS 2969-10048), free-delivery threshold (BBz64OeCbe5TBmYKbCxvCp), Deliver+ banner and bag module skinned per fascia (SEEL 2026), at-a-glance list.

canvas — price · sizes · swatches · accordionDebenhams
£70.00£139.00Save 50%
£63.00 with code FASHION
Size: MSize guide
Long sleeve lace and pleated midi shirt dress in pink. Regular fit, concealed zip.
Free returns within 28 days.
Next day delivery
Order by midnight
Free returns
28 days, in store or by post
Spend £12.01 more for free delivery
Congratulations, you're eligible for free delivery
Pay+KlarnaClearpayPayPal
Pay in 3 interest-free payments of £23.33
18+, T&C apply. Credit subject to status. See more
Deliver+
Elevate your experience
  • +14-day return extension
  • £5/day late delivery compensation
  • Full order coverage with instant payout
Learn more
  • ✓Regular fit
  • ✓Machine washable
  • ✓Recycled polyester

C-14 · Overlays & bag

One sheet shell: scrim 40%, white panel with 4px top radius to 100% − 56px on mobile, a centred 480px card from 768px; .sheet--auto hugs content (Added to bag), .sheet--dark is the VTO gradient variant with a 12px radius and safe-area padding. .modal is the centred card that scales in from 0.96. Bag line item is the 99×148 grid; order summary sits on Grey 05.

canvas — bag line · summary (sheet shown inline)Debenhams
Added to bag ×
Coast
Long Sleeve Lace and Pleated Midi Shirt Dress
Size 12 · Pink
£70.00£139.00
Subtotal£70.00
DeliveryFREE
Discounts −£6.00
Order total£64.00

C-15 · Chips & pills

canvasDebenhams
Active3Save 5%

C-16 · Account

Balance card fills per fascia (--card-bg: Debenhams aqua gradient, boohoo/MAN black, PLT garnet, KM orange), 62.5px numeral with tight tracking, loyalty label in caps (Royalty / Unlimited / Premier). Rows are white panels on --page-bg with a 24px icon, status text and an 8px status dot.

canvasDebenhams
£12.00
Unlimited balance

C-17 · AI Generated strip — the rules

From the AI-generated-badge proposal (EU AI Act Article 50(4), live 02.08.26; ASA covers the UK). The strip is live text, never a rasterised layer (screen readers, the 10px legal floor, localisation, badge shifting); it owns the bottom edge of the image at every size; every other badge shifts up by exactly --ai-h; wishlist and quick add stay top-right; Sponsored stays below the image except in PLP grid view where it becomes a badge and no other badge shows. Placement is driven by an image-level AI flag everywhere before add-to-bag; hidden in bag / mini bag / checkout — legal sign-off required. Alt text appends "AI generated image". See C-07 for the strip itself.

C-18 · Square tile rail .tile-rail

canvas — Brand Room brand / category railDebenhams

Source

assets/ds/components.css → EXTENDED LIBRARY · assets/ds/tokens.css → EXTENDED COMPONENT TOKENS · Inventory: .context/18-component-inventory.md (+ four full repo reads in .context/inventory/) · Backlog not yet ported: PDP gallery, Shop The Look + bundle family, notify-me form, VTO flow, Brand Room nav/drawer/hero family, checkout saved-card rows, glass nav chrome (app), request-form kit.

system · web-storybook.jamesb.play.dbztech.net · read 09 Sep 2026

Dev alignment

The front-end team's Storybook has 79 components across 178 stories, themed for 21 fascias. This is how it overlays with ours — component by component, token by token — and what the shared build should become.

How the devs build React · Tailwind · per-fascia CSS variables

Components are React with Tailwind utility classes. A variant prop selects a class string (Button has 19). Theming is a flat list of ~25–67 CSS variables per fascia — RGB triplets like --color-primary: 123 231 216 — read by utilities such as bg-primary, font-cta and rounded (which resolves --default-rounding: 0 on PLT and Brand Room — exactly our square modes). Greys are fixed utilities on the same Grey 1–6 ramp we use. Fonts per fascia match ours except Karen Millen (dev runs Work Sans for CTA and headings) and Warehouse (Roboto). A fascia toolbar global switches the theme; our Storybook exposes the same global mapped onto data-brand.

The plan: our catalogue is the visual target. Where a dev component matches, the dev build adopts our tokens and states; where it is partial, the Docs note says what to add on which side; where we have no counterpart it is a new component for us to spec; where they have no counterpart it is a new component for them to build from our story.

Component overlay dev → ours

Token map dev theme variables → our semantic tokens

Source

.context/inventory/05-dev-storybook.md — the full ingest: every component with its props, per-fascia theme variables, 1440 + 390 renders of all 178 stories. DG Group Design System Storybook ↗ — generated from the same catalogue (storybook/).

system · assets/ds/changelog.js

Changelog

What was added, changed and fixed in the design system in each iteration, newest first, and which project drove it. Projects build only from these components: a wrong one is fixed here and pushed back, a missing one is added here first.

design system · foundations

Foundations

The general rules every component is built from — colour, typography, spacing, radius, borders, motion, accessibility, and how to use the system. One page; jump with the chips.

projects · options + chosen route, always

Projects

Every project in the estate, one click away. Prototypes open in a new tab; the repo link is the record (brief, options, decisions).

The record briefs · options · chosen routes

Every brief as a record: what was explored, what won, and where it lives now. Delivered work merges to the master prototype.

ProjectScopeWhen
P-05PLP Redesign5 fascias → 1 core template · fonts, cards, grid as configSep 26
P-04CTA Colour AlignmentFinal styling · 5 brands × 5 screens · golden-truth matrixAug 26
P-03New CheckoutSmart promo / gift-card fieldAug 26
P-02VTOFirst-use journey · asset-embed patternAug 26
P-01AI Generated BadgeEstate-wide labelling policy deckAug 26
projects / P-05

PLP Redesign

Open prototype ↗

status openbrief Scott · 01 Septarget w/c 08 Sepfascias 5branch plp-alignment

Align boohoo, boohooMAN, PLT, Warehouse and The Brand Room onto one core PLP template. Differences become configuration, not forks. PLT is the reference implementation.

Options

A — Strict PLT clone

All five run PLT's exact card and grid; only tokens differ.

B — PLT + toggles

PLT base; brand label, was-price, badges and grid density per fascia.

C — Density variants

B plus a compact / comfortable density switch per market.

Requirements from the brief

ChangeFasciasDetail
imageFullWidthBHW · WarehouseMatch PLT full-width imagery
fontScale → pltBHW · WarehouseSite-wide reduction to PLT sizes
columnsDesktop 5→4WarehouseMatch other brands
showBrand → falseWarehouseLike PLT
favouriteIcon → kmWarehouseAdopt KM heart
projects / P-04

CTA Colour Alignment

Open prototype ↗

status mergedreview KM · Aug 26screens PDP · Added · Bag · Checkout · Account

Final styling per fascia across five core screens, plus the golden-truth button state matrix. The Colour page renders this project's output.

Routes explored

Before / After

Side-by-side with live colour picker for review sessions.

chosenFinal set

Picker and Before states removed post-review; deep-linkable per brand.

Per-screen overrides

Rejected — breaks the token model.

projects / P-03

New Checkout

Open prototype ↗

status shippedfigma WChEtDPH… · 3990:58406

One smart field between donation and payment that accepts a promo code or a gift card number and works out which it's been given. Single self-contained prototype.

brand centre · 17 fascias · 17 modes

All brands

Every fascia in the group. Pick one for its own page: logo downloads in black or white as SVG or PNG, brand guidelines, colour and type. Opening a brand also previews it across the system.

Modes data-brand — the only theming mechanism

One attribute on the root element themes everything: colours, font, weights, radius, case. No per-brand CSS files, no component forks. All 17 fascias are modes today.

FasciaFontMode state
debenhamsGeologicaColour set from the colour-alignment prototype (Aug 26)
boohooMontserratColour set from the colour-alignment prototype (Aug 26)
boohoomanMontserratColour set from the colour-alignment prototype (Aug 26)
pltRobotoColour set from the colour-alignment prototype (Aug 26)
karenmillenJostColour set from the colour-alignment prototype (Aug 26)
warehouseHelvetica NeueColour set from the colour-alignment prototype (Aug 26)
brandroomArchivoColour set from the colour-alignment prototype (Aug 26)
debenhamsoutletGeologicaNo aqua: black buttons + outlines like boohoo (12 Oct)
wallisUrbanistColour set mapped from the front-end theme (primary / CTA / nav / footer band)
burtonMontserratType + buttons = boohoo / MAN (Jake, 12 Oct)
principlesLatoColour set mapped from the front-end theme (primary / CTA / nav / footer band)
coastRobotoColour set mapped from the front-end theme (primary / CTA / nav / footer band)
oasisGeologicaColour set mapped from the front-end theme (primary / CTA / nav / footer band)
dorothyperkinsPublicSansColour set mapped from the front-end theme (primary / CTA / nav / footer band)
misspapMontserratboohoo / MAN in #101820, grey secondary outline, inverted header (12 Oct)
dsgnstudioHanken GroteskColour set mapped from the front-end theme (primary / CTA / nav / footer band)
trainingdeptHanken GroteskBlack like boohoo, DSGN Studio font, black logo bar (12 Oct)
↑↓ navigate↵ openesc close