Sainsbury's DESIGN.md
DESIGN.md
Design System Inspiration of Sainsbury's
Overview
Visual Theme & Atmosphere
Sainsbury's is a British supermarket that began, in its own words, when "John James and Mary Ann
Sainsbury welcomed their first customer" in 1869, with the aim "to provide good quality food at
affordable prices". J Sainsbury plc now also runs Argos and other retail brands; this reference is
the supermarket's own site, sainsburys.co.uk.
The site is built on Luna, Sainsbury's design system — its documentation is published as "Luna
Codebase" — and the homepage carries 364 of its tokens. The look is familiar from the stores: a
warm orange #f06c00 for the actions that matter, a charcoal #404040 for text and the
footer, white and pale grey surfaces, corners of just 2px, and headings in MaryAnn, the
brand's own display face.
What makes it worth reading:
- The focus ring is a token.
--ln-modifier-focus-ring-colorisrgba(25,118,210,0.7)and--ln-modifier-focus-ring-focus-width3px — and that exact ring is what renders on focus. - Two named brand colours.
--ln-color-palette-brand-1is the orange,brand-2a plum#7f0442, each with a highlight and a lowlight. - A dark mode is specified in
--ln-mode-dark-*, though the homepage renders light.
Primary tasks
- Book a delivery slot; register or log in.
- Go to groceries, offers and recipes.
Brand Narrative
Sainsbury's has sold food under the same founding promise since 1869 — good quality at affordable prices — and the site keeps the store's orange and its plain charcoal. Luna turns that into a system: two named brand colours, a set of semantic modifiers for every recurring part, and an accessibility decision made once — a single blue focus ring — and applied everywhere.
Principles
- Orange for doing. One brand colour carries every primary action.
- Plain and square. Charcoal text, 2px corners.
- Focus is designed. One ring, one token, every control.
Personas
Not researched. No persona claim is made from a UI capture.
Colors
Measured with getComputedStyle on www.sainsburys.co.uk: 369 root custom properties — 364
--ln-* (Luna) and 5 --ot-* (OneTrust's consent banner, excluded).
Orange — brand 1
- Primary (
#f06c00) —--ln-color-palette-brand-1,--ln-modifier-button-color-baseand--ln-modifier-link-color-brand. The call-to-action fill. - Primary Highlight (
#e55000) —brand-1-highlight,--ln-modifier-button-color-highlight,--ln-modifier-link-color-brand-highlight. The navigation's hover and focus colour. - Primary Light (
#ff9900) —--ln-color-palette-orange-light· Primary Surface (#fef5f0) —orange-lighter. The lowlight is written asrgba(229,80,0,0.06).
Plum — brand 2
Brand 2 (#7f0442) · Brand 2 Dark (#57002b, its highlight) · Brand 2 Light
(#a50052).
Charcoal and grey
The monochrome set names its steps plainly — dark #404040, darker #262626, medium
#737373, light #d8d8d8, lighter #f2f2f2:
- Foreground (
#404040) — body copy (1,265 text elements, most<p>), and also--ln-modifier-footer-backgroundand the dark-mode border. One charcoal for text and footer. - Text Darker (
#262626) · Text Medium (#737373) · Grey (#8c8c8c, 15 backgrounds). - Line (
#d8d8d8) · Surface (#f2f2f2) · Canvas (#ffffff,--ln-modifier-header-background).
Palettes and status
Ten-step palettes for blue (#1976d2 at 60, #e8f1fb at 10), green (#2e7d32), grey, red
(#d50000) and yellow (#ffd600). The focus colour is the palette blue #1976d2 at
70% opacity.
Typography
Font family
MaryAnn is the rendered brand face: 400 and 800 load (document.fonts), self-hosted as
/assets/static/mary_ann-*.woff2. It sets headings, navigation and the calls to action
(--ln-font-stack-button-font-family: MaryAnn, Trebuchet MS, Arial, …). Body copy is Arial
(--ln-font-stack-body-1-font-family: Arial, Helvetica Neue, Helvetica, sans-serif) — a system
face, not recorded as a brand font.
The stylesheet also declares Barlow and ItalianPlateNo1Expanded with @font-face rules;
neither loaded on the homepage.
Scale and a quirk
--ln-font-stack-body-1 1rem, -body-2 1.125rem, -button 1.125rem. The rendered call to action
is 16px at 800, the navigation 20px at 700.
The weight tokens are written with a stray hash — --ln-font-stack-body-1-font-weight: #400,
--ln-font-stack-button-font-weight: #800, --ln-modifier-link-font-weight-brand: #800 — which is
not a valid weight; recorded as found.
Layout
--ln-space-*provides a spacing scale in 0.5rem steps (--ln-space-spacing-x52.5rem) plus fixed widths and breakpoints.--ln-modifier-global-bar-height36px; button padding--ln-modifier-button-padding-vertical0.5rem and-horizontal1.5rem.- Borders:
--ln-modifier-border-width1px,-large2px,-extra-large6px.
Responsive Behavior
Not measured. Desktop 1440×1000 only.
Elevation & Depth
Mostly flat. A soft rgba(0,0,0,0.15) 0 0 15px appears on 12 elements (menus and overlays). The
most common "shadow" is the invisible resting focus ring.
Motion & Easing
--ln-modifier-transition-duration 0.2s and -long 0.4s, --ln-modifier-transition-timing-function-default
ease-out; the call to action transitions over 0.2s.
Tier 1 sources: https://www.sainsburys.co.uk/ (live homepage, collected in a headed Chrome because headless requests are refused — 364 --ln-* custom properties read via getComputedStyle; two components measured after rejecting the consent banner; MaryAnn loaded, captured 2026-09-26); https://www.sainsburys.co.uk/zz-this-does-not-exist (nonsense-path control — a real HTTP 404, "Error 404 - File Not Found", captured 2026-09-26); https://jsainsburyplc.github.io/luna/ (Luna Codebase, Sainsbury's design-system documentation; its nonsense-path control returns GitHub Pages' 404, read 2026-09-26); https://www.about.sainsburys.co.uk/about-us (J Sainsbury plc — John James and Mary Ann Sainsbury, 1869, read 2026-09-26)
Regional sources: https://www.thegrocer.co.uk/sainsburys/156.subject (The Grocer — Sainsbury's news and analysis)
Components
Two components, every state on its own page load. The consent banner was rejected before measuring — with it open, the pointer and the Tab key both land on the banner, and every hover and focus read comes back unchanged.
- Call to action — Book a slot, Register:
#f06c00, white MaryAnn 16px/800, 2px radius, 47px,12px 16px 13px. Hover changes nothing, with:hoverconfirmed matched. - Navigation — Groceries and siblings:
#404040MaryAnn 20px/700, 52px,11px 16px. Hover turns the label#e55000.
Focus is authored
| control | focus |
|---|---|
| Call to action | box-shadow: 0 0 0 3px rgba(25,118,210,0.7), fill deepens to rgba(229,80,0,0.8), outline-offset: 1px |
| Navigation | the same blue ring, label #e55000 |
The resting state carries the ring already, at zero opacity (rgba(0,0,0,0) 0 0 0 3px) — 114
elements wear it — so focus only has to change its colour. Both values come straight from
--ln-modifier-focus-ring-*.
Radius
--ln-modifier-border-radius 2px and -large 4px; --ln-modifier-button-border-radius 2px.
Rendered: 2px ×119, 1px ×28, 20px ×15 (pills), 4px ×14, 50% ×5.
States
Two components. Hover: none on the call to action, #e55000 on navigation. Focus: the 3px Luna ring
on both. No disabled state was observed.
Do's and Don'ts
Do
- Use
#f06c00for the primary action and#e55000for its highlight. - Keep corners at 2px.
- Put the 3px
rgba(25,118,210,0.7)ring on every focusable element, invisible at rest. - Set headings and actions in MaryAnn, body copy in the system sans.
Don't
- Don't use the plum as a second action colour beside the orange.
- Don't copy the
#400/#800weight values. - Don't measure or style states with a consent banner in front of the page.
Voice & Tone
Not assessed as authored voice. 3,903 characters on the measured page.
Agent Prompt Guide
Quick Color Reference
#f06c00 orange · #e55000 highlight · #7f0442 plum · #404040 text and footer · #262626 /
#737373 greys · #d8d8d8 lines · #f2f2f2 / #ffffff surfaces · focus
rgba(25,118,210,0.7)
Example Component Prompts
- "A 47px button:
#f06c00, white 16px/800 MaryAnn, 2px radius; focus0 0 0 3px rgba(25,118,210,0.7)." - "A navigation link:
#40404020px/700; hover and focus#e55000."
Governance
Known Gaps
- Contrast,
button-primary. Text#ffffffon#f06c00measures 3.07:1, below the WCAG AA 4.5:1 minimum for normal-size text. Recorded as measured, not adjusted. - Contrast,
link-nav. Text#404040on#00000000measures 2.03:1, below the WCAG AA 4.5:1 minimum for normal-size text. Recorded as measured, not adjusted.
Colors
Brand
Surface & text
Other colors
Typography
- MaryAnnDisplay
Type scale
- navtop navigation, MaryAnn 70020px
- body-2--ln-font-stack-body-2 (Arial stack), 40018px
- body-1--ln-font-stack-body-1 (Arial stack), 40016px
- buttonthe rendered call to action, MaryAnn 800 (--ln-font-stack-button declares 1.125rem)16px
Spacing & shape
Corner radius
- sm2px
- md4px
- pill20px
Components
- button-primarybutton-primaryFill #f06c00 · Text #ffffff · Radius 2px · Height 47px · Padding 12px 16px 13px · Type 16px / 800
- Hover #f06c00
- Pressed #f06c00
- Focus ring 0 0 0 3px rgba(25,118,210,0.7), bg rgba(229,80,0,0.8)
Related design systems
Commerceidus (Backpackr)idus (아이디어스) is the handmade marketplace run by Backpackr (백패커), a Seoul company founded in 2012 that describes its mission as "창작과 정성의 가치가 인정받는 세상을 만듭니다" and today operates three platforms as one creator ecosystem: 아이디어스 ("핸드메이드로 일상을 특별하게"), the crowdfunding service 텀블벅 and the design-goods shop 텐바이텐.
CommerceTaobaoTaobao is Alibaba's consumer marketplace, launched in 2003 — the name means "search for treasures" — and Alibaba describes it as China's leading retail e-commerce platform, a place where individual sellers, brand flagship stores and specialist channels all sit on one surface.CommerceZalandoZalando is Europe's large online fashion and lifestyle platform.
CommerceHyundai HmallHyundai Hmall (현대Hmall) is the online shop of ㈜현대홈쇼핑 (Hyundai Home Shopping).
CommerceBOOTHBOOTH is pixiv's marketplace where creators sell illustrations, doujinshi, goods and digital items; its footer reads "© pixiv". pixiv Inc. (ピクシブ株式会社), founded on 25 July 2005, is based in Sendagaya, Shibuya, Tokyo, with an office in Fukuoka.
CommerceSSG.COMSSG.COM (쓱닷컴) is Shinsegae Group's integrated online shopping platform.