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."
Colors
Brand
Surface & text
Status
Other colors
Typography
- Source Sans ProSans
Type scale
- 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
Spacing & shape
Spacing
- s052px
- s14px
- s28px
- s416px
- s832px
- s1664px
- s32128px
Corner radius
- default8px
- lg12px
- pill20px
Components
- button-secondarybutton-secondaryFill #e9e4ed · Text #2e004d · Radius 8px · Height 40px · Padding 0 8px · Type 14px / 600
- Hover #c9bcd3
- Pressed #c9bcd3
- button-actionbutton-actionFill #f1c500 · Text #2d333a · Radius 8px · Height 40px · Padding 0 8px · Type 14px / 600
- Hover #e6a300, border #e6a300
- Pressed #e6a300, border #e6a300
- button-primarybutton-primaryFill #4d216d · Text #ffffff · Radius 7px · Height 42px
- Hover #240b3d
- Pressed #240b3d
- card-linkFill #ffffff · Text #2d333a · Radius 8px · Height 92px · Padding 16px · Type 14px / 400
- Hover shadow rgba(0,0,0,0.08) 0 2px 12px
- Pressed shadow rgba(0,0,0,0.08) 0 2px 12px
Related design systems
CommerceOnestore원스토어 is a Korean mobile-content marketplace spanning games, apps, and story content.CommerceKurlyKurly is a Korean commerce company whose retail service began in 2015 around curated food and controlled-temperature delivery; its official introduction says that selection, delivery quality, fair pricing, customer care, and sustainable distribution are central to the service.
CommerceCJ ONSTYLECJ ONSTYLE (CJ온스타일) is the commerce division of CJ ENM, legally (주)씨제이이엔엠 커머스부문 and headquartered in Seoul.
CommerceASOSASOS is one of the world's largest online fashion retailers, and its visual identity is built on a deliberate philosophy of stark editorial restraint.CommerceZOZOTOWNZOZOTOWN is a Japanese fashion marketplace operated by ZOZO, Inc., formerly Start Today.
CommerceBloom & WildBloom & Wild is a British flower and gifting company, founded in 2013 by Aron Gelbard and Ben Stanway in London, known for flowers that fit through the letterbox.