Ocado DESIGN.md
DESIGN.md
Design System Inspiration of Ocado
Overview
Visual Theme & Atmosphere
Ocado is the UK's online-only grocer. Its own history begins with the words "We were founded in 2000, and just one year later, pilot deliveries had begun" — a supermarket with no shops, built on automated warehouses. For most of its life it sold Waitrose products; in 2019 Marks & Spencer paid up to £750m for half of Ocado's retail business, forming Ocado Retail, and in 2020 ocado.com switched from Waitrose to M&S products. The technology side, Ocado Group, now licenses its warehouse platform to grocers abroad. This reference is the storefront, ocado.com.
The storefront is calm and practical. Most of the page is a pale blue-grey #e6ecf0 — 157
elements, the fill of panels and product placeholders — around white cards, with a slate ink
#2d333a. The brand purple #4d216d is used sparingly; lavender #e9e4ed buttons with
deep-purple text #2e004d carry the everyday actions, and a warm yellow #f1c500 means
one thing: add to basket. Promotions are red. Everything is set in Source Sans Pro and rounded at
8px.
What makes it worth reading:
- Colour steps name their own text colour. The base, 100, 200, 700 and 900 steps of each
--intent-*ramp carry a-contrasttwin —--intent-action-700-contrast#2d333a,--intent-primary-700-contrast#ffffff— so the system decides legibility, not the designer. - Colour is assigned by intent. Primary, action, promotion, secondary, success, warning, error — each a ten-step ramp.
- A namesake, not a borrowing. The component tokens are
--salt-*, the same prefix as J.P. Morgan's Salt design system, and share none of its names.
Primary tasks
- Search for a product; add it to the basket.
- Log in or register; browse categories and recipes.
Brand Narrative
Ocado sells groceries without a single shop, and the storefront behaves like a well-run warehouse: grey-blue shelving, white product cards, a single colour for the one action that matters most — yellow for the basket — and the brand purple held in reserve. Its partners have changed, from Waitrose to M&S, and the company has split into a retailer and a technology licensor; the storefront's system has stayed quietly consistent.
The token system is an engineer's: every colour organised by the job it does, its key background steps naming their own legible text colour, spacing counted in 4px units that double. Its components carry a name that happens to match a well-known open-source design system and nothing else of it.
Principles
- One colour, one action. Yellow adds to the basket.
- Legibility is a token. The key steps carry their contrast colour.
- Lift, don't paint. Cards rise on hover.
Personas
Not researched. No persona claim is made from a UI capture.
Colors
Measured with getComputedStyle on www.ocado.com. Every custom property traces to first-party
stylesheets on ocado.com; no third-party script injects any. 316 in all: --salt-* 156 · --intent-*
105 · --z-* 24 · --typography-* 7 · --surface-* 4 · --interaction-* 4 · a few singletons. The root font size is 14px, so
Ocado's rem values convert at 14.
Purple — the brand
- Primary (
#4d216d) —--intent-primaryand--salt-button-primary-background-color. - Primary Hover (
#240b3d) —--salt-button-primary-hover-background-color, also--interaction-primaryand--intent-primary-900. - Primary Ink (
#2e004d) —--typography-primary, the text on lavender (38 elements). - Primary Surface (
#e9e4ed) —--intent-primary-50and the secondary button's fill (18 elements). - Primary Surface Hover (
#c9bcd3) —--intent-primary-100, the secondary button's hover. - Primary Muted (
#a690b6) —--intent-primary-200, the links bar's hover underline.
Yellow — action
- Action (
#f1c500) —--intent-action, the Add button. - Action Hover (
#e6a300) —--interaction-action/--intent-action-900.
Red — promotion
- Promotion (
#c51d25) —--intent-promotion. - Promotion Text (
#a90016) —--typography-promotion,--salt-text-promotion-colorand--salt-link-promotion-color.
Ink and surface
- Foreground (
#2d333a) —--typography-defaultand--salt-text-color. 997 elements; the page sets body copy indivs andspans rather than<p>. - Placeholder (
#4c5157) —--typography-placeholder· Disabled (#96999c) —--typography-disabled. - Decoration (
#e6ecf0) —--decoration,--intent-secondaryand--surface-sunken; the most-painted background · Decoration Contrast (#6c7075). - Background (
#f3f5f8) —--surface-background· Canvas (#ffffff) —--surface-baseand--surface-raised.
Status
Success #116623 · Warning #bd5407 · Error #9e171c (--intent-error), with
#a31800 for error text (--typography-error). Each is a ten-step ramp with contrast twins.
Typography
Font family
Source Sans Pro — one family for everything, 400 and 600 loaded (document.fonts), served from
Google Fonts. --salt-text-font-family, --salt-display-font-family and
--salt-links-bar-font-family all name it. It is an open Adobe typeface, recorded as what is served.
Scale
At the 14px root: --salt-text-s 12px (line height 1.33) · --salt-text-m 14px (1.29) ·
--salt-text-l 16px (1.25) · --salt-display 20px (1.2). Buttons set 14px at 600.
Layout
- Spacing doubles:
--salt-spacing-052 ·-14 ·-28 ·-416 ·-832 ·-1664 ·-32128px. The token name is the number of 4px units. - Borders are tokenised by width —
--salt-border-11px,--salt-border-22px — and many controls carry a border in their own fill colour, so hover can recolour it.
Responsive Behavior
Not measured. Desktop 1440×1000 only.
Elevation & Depth
Three elevation tokens, all soft and mostly centred: --salt-elevation-shadow-1
0 2px 12px rgb(0 0 0 / 8%) · -2 0 0 14px rgb(0 0 0 / 12%) · -3 0 0 16px rgb(0 0 0 / 12%).
Level 1 is the card hover. A couple of one-off shadows outside the scale appear once each.
Motion & Easing
Not measured. No motion token among the custom properties.
Tier 1 sources: https://www.ocado.com/ (live storefront — 316 custom properties read via getComputedStyle, all traced to first-party stylesheets; controls measured at rest, hover, pressed and focus; Source Sans Pro loaded, captured 2026-09-23); https://www.ocado.com/search?entry=bread (product results — the Add button, logged out, captured 2026-09-23); https://www.ocado.com/zz-this-does-not-exist (nonsense-path control — renders the same client-side "Page not found." as other unknown paths such as /design-system and /brand, so none of them is a page, captured 2026-09-23); https://www.ocadogroup.com/about-us/our-history (Ocado Group history — founded 2000, pilot deliveries a year later, ocado.com switching from Waitrose to M&S products in 2020, read 2026-09-23)
Regional sources: https://www.foodmanufacture.co.uk/Article/2019/02/27/M-S-and-Ocado-announce-joint-venture-in-750m-deal/ (Food Manufacture, 2019-02-27 — M&S and Ocado announce a joint venture in a £750m deal); https://www.thegrocer.co.uk/news/ocado-group-drops-battle-for-190m-from-mands/721794.article (The Grocer — Ocado Group drops its claim for £190m from M&S tied to the joint venture)
Components
Four components, every state on its own page load, focus read before the mouse moved.
- Secondary — Log in and the search submit:
#e9e4ed,#2e004d14px/600, 8px, 40px. Hover#c9bcd3. - Action — Add, on a product tile:
#f1c500,#2d333alabel, 8px, 40px. Hover#e6a300, border following. - Primary —
#4d216d, white, 7px, 42px. Hover#240b3d. Logged out on the home page, the only purple button is the Live Chat launcher; the purple is not a shopping call to action here. - Card — Register:
#ffffff,#2d333a, 8px, 92px, 16px padding. Hover addsrgba(0,0,0,0.08) 0 2px 12px—--salt-elevation-shadow-1— without changing colour.
So: lavender for everyday actions, yellow for the basket, purple for the brand, and elevation — not colour — for cards.
Focus is the browser's
Every control shows outline: rgb(0, 95, 204) auto 1px under :focus-visible. Each component sets
its own ink as a resting outline colour with outline-style: none, but none turns it on; the ring
that renders is Chrome's. No focus colour is recorded.
Radius
--salt-radius-default 8px (0.571rem) — 8px ×264, the standard for cards, buttons and fields;
--salt-radius-1 12px; 0 0 8px 8px ×27 (bottom-rounded cards); 7px ×15; 20px ×3 (pills).
States
Four components, every state measured. Hover: secondary to #c9bcd3, action to #e6a300,
primary to #240b3d, cards gain a soft shadow. Focus is the browser's auto ring throughout.
Disabled tokens exist — --salt-button-primary-disabled-background-color #e9e4ed with
#96999c text — but no disabled control was observed.
Do's and Don'ts
Do
- Use
#f1c500only for adding to the basket. - Use lavender
#e9e4edwith#2e004dtext for everyday secondary actions. - Take text colours from the
-contrasttwin of the--intent-*step used as the background. - Lift cards with
--salt-elevation-shadow-1on hover instead of recolouring them.
Don't
- Don't treat
--salt-*as J.P. Morgan Salt — none of its names are Salt's. - Don't spread the brand purple across surfaces; it is an accent.
- Don't rely on the browser ring as a brand focus style.
Voice & Tone
Not assessed as authored voice. 5,667 characters on the measured surface.
Agent Prompt Guide
Quick Color Reference
#4d216d purple · #240b3d purple hover · #2e004d purple ink · #e9e4ed lavender ·
#c9bcd3 lavender hover · #f1c500 basket yellow · #e6a300 yellow hover · #c51d25 /
#a90016 promotion · #2d333a ink · #e6ecf0 decoration · #f3f5f8 background · #ffffff
cards
Example Component Prompts
- "An Add button:
#f1c500,#2d333a14px/600 Source Sans Pro, 8px radius, 40px; hover#e6a300." - "A secondary button:
#e9e4ed,#2e004d14px/600, 8px radius; hover#c9bcd3."
색상
브랜드
면과 글자
상태
그 밖의 색
타이포그래피
- Source Sans Pro산세리프
타입 스케일
- display--salt-display-font-size (1.43rem)20px
- l--salt-text-l-font-size16px
- m--salt-text-m-font-size, the 14px root size; buttons at 60014px
- s--salt-text-s-font-size (.857rem at the 14px root)12px
여백과 모양
여백
- s052px
- s14px
- s28px
- s416px
- s832px
- s1664px
- s32128px
모서리 반경
- default8px
- lg12px
- pill20px
컴포넌트
- button-secondarybutton-secondary채움 #e9e4ed · 글자 #2e004d · 반경 8px · 높이 40px · 안쪽 여백 0 8px · 글자 크기·굵기 14px / 600
- 호버 #c9bcd3
- 누름 #c9bcd3
- button-actionbutton-action채움 #f1c500 · 글자 #2d333a · 반경 8px · 높이 40px · 안쪽 여백 0 8px · 글자 크기·굵기 14px / 600
- 호버 #e6a300, border #e6a300
- 누름 #e6a300, border #e6a300
- button-primarybutton-primary채움 #4d216d · 글자 #ffffff · 반경 7px · 높이 42px
- 호버 #240b3d
- 누름 #240b3d
- card-link채움 #ffffff · 글자 #2d333a · 반경 8px · 높이 92px · 안쪽 여백 16px · 글자 크기·굵기 14px / 400
- 호버 shadow rgba(0,0,0,0.08) 0 2px 12px
- 누름 shadow rgba(0,0,0,0.08) 0 2px 12px
