Design Specification — Food Illustrations with Colored Pencil —
Sarah Locher – Freelance Illustrator from Hamburg
| Field | Value |
| Site / Project | https://www.sarahlocher.com/en/projects/food-illustrations |
| Analyzed on | 2026-10-17 |
| Analysis mode | Automated code extraction (no AI) |
Overview
This design system was extracted programmatically from the source page. It is built on a light canvas (#FFFFFF), ink text (#000000), a vivid accent (#007AFF). All type is set in HK Grotesk. Detected font weights: 300, 400, 600, 700.
Logo asset(s): https://www.sarahlocher.com/favicon/D03438
Color System
Detected palette (by frequency)
| Hex | RGB | HSL | Count |
#000000 | 0, 0, 0 | 0° 0% 0% | 11 |
#D03438 | 208, 52, 56 | 358° 62% 51% | 1 |
#007AFF | 0, 122, 255 | 211° 100% 50% | 1 |
#FFFFFF | 255, 255, 255 | 0° 0% 100% | 1 |
#F7F7F7 | 247, 247, 247 | 0° 0% 97% | 1 |
#F0F0F0 | 240, 240, 240 | 0° 0% 94% | 1 |
#E3E3E3 | 227, 227, 227 | 0° 0% 89% | 1 |
#D0D0D0 | 208, 208, 208 | 0° 0% 82% | 1 |
#AFAFAF | 175, 175, 175 | 0° 0% 69% | 1 |
#868686 | 134, 134, 134 | 0° 0% 53% | 1 |
#696969 | 105, 105, 105 | 0° 0% 41% | 1 |
#434343 | 67, 67, 67 | 0° 0% 26% | 1 |
#1A1A1A | 26, 26, 26 | 0° 0% 10% | 1 |
#294C72 | 41, 76, 114 | 211° 47% 30% | 1 |
#182B42 | 24, 43, 66 | 213° 47% 18% | 1 |
#09101D | 9, 16, 29 | 219° 53% 7% | 1 |
Assigned roles
Roles are taken from the page's own semantic CSS custom properties when present, otherwise inferred from usage frequency + luminance/saturation.
| Token | Hex | RGB | HSL |
--color-primary | #D03438 | 208, 52, 56 | 358° 62% 51% |
--color-accent | #007AFF | 0, 122, 255 | 211° 100% 50% |
--color-background | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
--color-surface | #F7F7F7 | 247, 247, 247 | 0° 0% 97% |
--color-text-primary | #000000 | 0, 0, 0 | 0° 0% 0% |
--color-secondary | #000000 | 0, 0, 0 | 0° 0% 0% |
--color-text-secondary | #E3E3E3 | 227, 227, 227 | 0° 0% 89% |
--color-border | #D0D0D0 | 208, 208, 208 | 0° 0% 82% |
--color-on-primary | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
--color-on-secondary | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
--color-on-accent | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
Surface ramp (derived from detected light neutrals)
| Token | Hex |
--color-surface-container-lowest | #FFFFFF |
--color-surface-container-low | #F7F7F7 |
--color-surface-container | #F0F0F0 |
--color-surface-container-high | #E3E3E3 |
--color-surface-container-highest | #D0D0D0 |
Typography
Primary typeface: HK Grotesk — stack: HK Grotesk
Font stacks (most used first)
HK Grotesk
var(--font-family-default)
Derived type scale
| Token | Size |
| display | 110px |
| headline-lg | 42px |
| title-lg | 23px |
| body-lg | 18px |
| body-md | 16px |
| label-sm | 12px |
Font sizes (by frequency)
| Size | Count |
| 18px | 12 |
| 36px | 8 |
| 23px | 7 |
| 22px | 7 |
| 21px | 7 |
| 12px | 3 |
| 72px | 2 |
| 60px | 2 |
| 42px | 2 |
| 46px | 1 |
| 16px | 1 |
| 110px | 1 |
| 86px | 1 |
| 54px | 1 |
Weights in use: 300, 400, 600, 700
Line heights (by frequency)
| Value | Count |
| 30px | 14 |
| 25px | 12 |
| 45px | 7 |
| 29px | 7 |
| 45.5px | 3 |
| 80px | 2 |
| 67px | 2 |
| 54px | 2 |
| 18px | 2 |
| 56px | 1 |
Letter spacing (by frequency)
| Value | Count |
| 0 | 8 |
| -.004em | 6 |
| .007em | 6 |
| .01em | 6 |
| -.031em | 2 |
| .03em | 2 |
| .08em | 2 |
| .04em | 1 |
Spacing
Derived spacing scale
Raw values (by frequency)
Borders & Radius
Derived radius tokens
| Token | Value |
| lg | 27.2px |
| pill | 50% |
Raw values (resolved, by frequency)
Shadows
Derived elevation
| Token | Value |
| sm | 0 10px 40px -10px rgba(0,0,0,.7) |
| md | 0 10px 40px -10px rgba(0,0,0,.2) |
| lg | 0 10px 40px -10px transparent |
All detected shadows
0 10px 40px -10px rgba(0,0,0,.7)
0 10px 40px -10px rgba(0,0,0,.2)
0 10px 40px -10px transparent
Layout
Container max-width: 900px
Grid columns (largest detected grid): 12
Breakpoints
- 599px
- 680px
- 900px
- 1160px
- 1200px
- 1400px
- 1440px
Animation & Motion
Transitions
opacity .3s
all .3s
transform 5s,filter 1s
transform 5s,filter 3s
color .3s
none
all .5s ease-in
all .6s ease-out
opacity .6s 0s
all .5s
Easing curves
var(--swiper-wrapper-transition-timing-function,initial)
Keyframes
@keyframes swiper-preloader-spin { 0%{transform:rotate(0deg)}to{transform:rotate(1turn)} }
@keyframes moveLeft { 0%{transform:translateX(0)}to{transform:translateX(-50%)} }
@keyframes scroll { 0%{transform:translateY(0);opacity:0}2%{opacity:1}95%{opacity:1}to{transform:translateY(calc(-100% + var(--spacing-unit)*70));opacity:0} }
@keyframes horizontalScroll { 0%{transform:translateX(0) scale(.75);opacity:0}.3%{opacity:1}99%{opacity:1}to{transform:translateX(-60%) scale(.75);opacity:0} }
@keyframes pulsate { 0%{opacity:.5}50%{opacity:1}to{opacity:.5} }
CTA labels found on page
Source Design Tokens (CSS custom properties)
:root {
--primary-color: #D03438;
--secondary-color: #000000;
--swiper-theme-color: #007aff;
--swiper-navigation-size: 44px;
--font-family-default: "HK Grotesk",Helvetica,Arial,-apple-system,sans-serif;
--font-weight-regular: 400;
--font-weight-semibold: 600;
--font-weight-bold: 700;
--spacing-unit: 6px;
--white: #fff;
--gray-100: #f7f7f7;
--gray-200: #f0f0f0;
--gray-300: #e3e3e3;
--gray-400: #d0d0d0;
--gray-500: #afafaf;
--gray-600: #868686;
--gray-700: #696969;
--gray-800: #434343;
--gray-900: #1a1a1a;
--black: #000;
--deepdive-blue-light: #294c72;
--deepdive-blue: #182b42;
--deepdive-blue-dark: #09101d;
--large: hover;
--shadow-color: transparent;
--column-gap: calc(var(--spacing-unit)*4);
--columnWidth: calc((100% - (var(--width) - 1)*var(--column-gap))/var(--width));
}
Do's and Don'ts
Do
- Do reserve the accent
#007AFF for interactive highlights and key moments — it is used sparingly on the source page.
- Do keep the canvas at
#FFFFFF; surfaces should stay within the detected neutral ramp.
- Do stick to the detected font weight(s): 300, 400, 600, 700.
Don't
- Don't introduce colors outside the detected palette — every hue above was found in the source.
- Don't add gradients — the source page uses flat fills exclusively.
Design Tokens (copy-paste)
:root {
--color-primary: #D03438;
--color-accent: #007AFF;
--color-background: #FFFFFF;
--color-surface: #F7F7F7;
--color-text-primary: #000000;
--color-secondary: #000000;
--color-text-secondary: #E3E3E3;
--color-border: #D0D0D0;
--color-on-primary: #FFFFFF;
--color-on-secondary: #FFFFFF;
--color-on-accent: #FFFFFF;
--color-surface-container-lowest: #FFFFFF;
--color-surface-container-low: #F7F7F7;
--color-surface-container: #F0F0F0;
--color-surface-container-high: #E3E3E3;
--color-surface-container-highest: #D0D0D0;
--font-sans: HK Grotesk;
--font-size-display: 110px;
--font-size-headline-lg: 42px;
--font-size-title-lg: 23px;
--font-size-body-lg: 18px;
--font-size-body-md: 16px;
--font-size-label-sm: 12px;
--radius-lg: 27.2px;
--radius-pill: 50%;
--shadow-sm: 0 10px 40px -10px rgba(0,0,0,.7);
--shadow-md: 0 10px 40px -10px rgba(0,0,0,.2);
--shadow-lg: 0 10px 40px -10px transparent;
--space-xs: 3px;
--tracking-display: -.004em;
--tracking-label: .007em;
--container-max: 900px;
}