Remixes of www.hellofresh.com
Latest remixes
No public remixes yet. Be the first to make one.
Remix itLatest remixes
No public remixes yet. Be the first to make one.
Remix itSwitch between the rendered Visual preview and the Raw DESIGN.md.
version: alpha
name: Hellofresh
description: |
HelloFresh's design system embodies a modern, accessible approach to meal-kit
ordering with a focus on clarity and user trust. The visual identity blends
sophisticated typography—mixing geometric sans-serif headings with humanist
body text—to create a professional yet approachable feel. The system relies
heavily on color-blocking and surface contrast rather than elaborate shadows,
establishing depth through strategic use of warm neutrals, crisp blacks, and
bold accent greens. The overall mood is warm, contemporary, and food-forward,
reflecting the brand's commitment to bringing restaurant-quality meals to the
home. Ample whitespace and a measured spacing system give the interface a
breathing quality, while consistent border radii and interaction patterns
signal a refined, intentional design maturity.
source:
url: "https://www.hellofresh.com/"
pagesAnalyzed: 6
extractedAt: 2026-10-25
tokensMeasured: true
colors:
primary: "#232323"
link: "#0000EE"
canvas: "#FFFFFF"
surface-alt: "#FAF8F3"
on-primary: "#FFFFFF"
ink: "#232323"
body: "#343434"
muted: "#656565"
hairline: "#000000"
accent-1: "#7D7561"
accent-2: "#D2FA96"
accent-3: "#009645"
accent-4: "#96DC16"
neutral-1: "#EFE9DE"
neutral-2: "#ADADAD"
typography:
display-lg:
fontFamily: agrandir-tight-black
fontSize: 56px
fontWeight: 700
lineHeight: 0.89
letterSpacing: 0px
display-md:
fontFamily: agrandir-tight-bold
fontSize: 50px
fontWeight: 700
letterSpacing: 0px
display-sm:
fontFamily: agrandir-tight-bold
fontSize: 40px
fontWeight: 500
lineHeight: 1.2
letterSpacing: 0px
display-sm-strong:
fontFamily: roboto
fontSize: 40px
fontWeight: 700
lineHeight: 0.8
letterSpacing: 0px
heading-md:
fontFamily: agrandir-tight-bold
fontSize: 32px
fontWeight: 500
lineHeight: 1.25
letterSpacing: 0px
heading-sm:
fontFamily: agrandir-tight-bold
fontSize: 24px
fontWeight: 500
lineHeight: 1.33
letterSpacing: 0px
heading-xs:
fontFamily: agrandir-tight-bold
fontSize: 20px
fontWeight: 500
lineHeight: 1.2
letterSpacing: 0px
body-xl:
fontFamily: roboto
fontSize: 20px
fontWeight: 400
lineHeight: 1.6
letterSpacing: 0px
body-lg:
fontFamily: roboto
fontSize: 16px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0px
body-lg-strong:
fontFamily: roboto
fontSize: 16px
fontWeight: 700
lineHeight: 1.5
letterSpacing: 0px
body-md:
fontFamily: roboto
fontSize: 14px
fontWeight: 400
lineHeight: 1.43
letterSpacing: 0px
body-md-strong:
fontFamily: roboto
fontSize: 14px
fontWeight: 700
lineHeight: 1.43
letterSpacing: 0px
body-sm:
fontFamily: roboto
fontSize: 13.3333px
fontWeight: 400
lineHeight: 1.8
letterSpacing: 0px
button-lg:
fontFamily: Arial
fontSize: 16px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0px
button-md:
fontFamily: agrandir-tight-bold
fontSize: 14px
fontWeight: 700
lineHeight: 1.43
letterSpacing: 0px
button-sm:
fontFamily: Arial
fontSize: 13.3333px
fontWeight: 400
letterSpacing: 0px
button-xs:
fontFamily: roboto
fontSize: 12px
fontWeight: 700
lineHeight: 1.33
letterSpacing: 0px
label-md:
fontFamily: agrandir-tight-bold
fontSize: 16px
fontWeight: 400
lineHeight: 1
letterSpacing: 0px
label-md-times-new-roman:
fontFamily: "Times New Roman"
fontSize: 16px
fontWeight: 400
lineHeight: 1
letterSpacing: 0px
caption:
fontFamily: roboto
fontSize: 12px
fontWeight: 400
lineHeight: 1.33
letterSpacing: 0px
rounded:
none: 0px
xs: 4px
sm: 8px
full: 9999px
spacing:
xxs: 4px
xs: 8px
sm: 12px
md: 16px
lg: 24px
xl: 32px
xxl: 40px
xxxl: 48px
section: 56px
band: 96px
borderWidths:
thin: 1px
shadows:
sm: "rgb(35, 35, 35) 0px 0px 0px 1px inset"
elevationStrategy: single-tier
themes:
derived: dark # the other theme is the site's measured palette
light:
bg: "#FFFFFF"
surface: "#FAF8F3"
surfaceRaised: "#F1EFEB"
text: "#232323"
textMuted: "#343434"
border: "#000000"
accent: "#0000EE"
accentFg: "#FFFFFF"
focusRing: "#0000EE"
elevation: shadow
dark:
bg: "#090916"
surface: "#181824"
surfaceRaised: "#242430"
text: "#F5F5FE"
textMuted: "#9B9BA6"
border: "#30303B"
accent: "#6969FF"
accentFg: "#090916"
focusRing: "#4141FF"
elevation: "border+surface"
components:
button-primary:
typography: "{typography.button-lg}"
textColor: "{colors.on-primary}"
height: 48px
padding: "12px 24px 12px 24px"
rounded: "{rounded.sm}"
backgroundColor: "{colors.primary}"
button-filled:
typography: "{typography.button-lg}"
textColor: "{colors.on-primary}"
height: 48px
padding: "12px 24px 12px 24px"
rounded: "{rounded.sm}"
backgroundColor: "{colors.neutral-2}"
button-icon:
typography: "{typography.button-sm}"
textColor: "{colors.hairline}"
border: "1px solid {colors.primary}"
height: 16px
padding: "4px 4px 4px 4px"
rounded: 999px
backgroundColor: "{colors.primary}"
button-icon-2:
typography: "{typography.button-sm}"
textColor: "{colors.hairline}"
border: "1px solid {colors.primary}"
height: 16px
padding: "4px 4px 4px 4px"
rounded: 999px
backgroundColor: "{colors.surface-alt}"
button-outline:
textColor: "{colors.link}"
border: "1px solid {colors.hairline}"
height: 72px
padding: "24px 32px 24px 32px"
fontSize: 16px
fontFamily: agrandir-tight-bold
fontWeight: 400
backgroundColor: "{colors.canvas}"
navigation:
textColor: "rgb(36, 36, 36)"
height: 56px
fontSize: 16px
fontFamily: agrandir-tight-bold
fontWeight: 400
navigation-lg:
textColor: "{colors.hairline}"
height: 59px
padding: "8px 0px 0px 0px"
fontSize: 16px
fontFamily: "Times New Roman"
fontWeight: 400
lineHeight: 1.15
footer:
textColor: "rgb(36, 36, 36)"
fontSize: 16px
fontFamily: agrandir-tight-bold
fontWeight: 400
footer-lg:
textColor: "{colors.hairline}"
fontSize: 16px
fontFamily: "Times New Roman"
fontWeight: 400
lineHeight: 1.15
link:
textColor: "{colors.ink}"
fontSize: 16px
fontFamily: agrandir-tight-bold
fontWeight: 400
rounded: "{rounded.xs}"
link-2:
textColor: "{colors.ink}"
padding: "8px 24px 8px 24px"
fontSize: 16px
boxShadow: "{colors.primary} 0px 0px 0px 1px inset"
fontFamily: agrandir-tight-bold
fontWeight: 400
lineHeight: 1.5
rounded: "{rounded.sm}"
backgroundColor: "rgba(255, 255, 255, 0)"
states:
other-hover:
target: other
state: hover
textColor: "rgb(53, 53, 53)"
other-active:
target: other
state: active
textColor: "rgb(75, 75, 75)"
other-focus-visible:
target: other
state: focus-visible
outline: "{colors.primary} solid 0.125rem"
outlineColor: "{colors.ink}"
outlineWidth: 0.125rem
other-disabled:
target: other
state: disabled
textColor: "{colors.neutral-2}"
backgroundColor: "rgba(255, 255, 255, 0)"
input-focus:
target: input
state: focus
textColor: "{colors.muted}"
other-focus:
target: other
state: focus
borderColor: "rgb(74, 70, 61)"
borderWidth: 0.125rem
link-hover:
target: link
state: hover
textColor: "rgb(36, 36, 36)"
textDecoration: none
breakpoints:
- width: 375
containerWidth: 343
gridColumns: 1
navLinksVisible: 1
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 16
- width: 768
containerWidth: 675
gridColumns: 4
navLinksVisible: 3
menuToggleVisible: true
headingPx: 40
bodyPx: 16
sectionPaddingX: 56
- width: 1024
containerWidth: 964
gridColumns: 6
navLinksVisible: 3
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 56
- width: 1280
containerWidth: 1200
gridColumns: 8
navLinksVisible: 3
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 56
- width: 1440
containerWidth: 1200
gridColumns: 8
navLinksVisible: 3
menuToggleVisible: true
headingPx: 56
bodyPx: 16
sectionPaddingX: 56
coverage:
statesFound: 33
gradientsFound: 0
rolesUnassigned: 6
archetypesUnnamed: 0
archetypesDetected: 0
responsiveMeasured: true
stylesheetsBlocked: true
semanticRampDeclared: false
HelloFresh's design system embodies a modern, accessible approach to meal-kit ordering with a focus on clarity and user trust. The visual identity blends sophisticated typography—mixing geometric sans-serif headings with humanist body text—to create a professional yet approachable feel. The system relies heavily on color-blocking and surface contrast rather than elaborate shadows, establishing depth through strategic use of warm neutrals, crisp blacks, and bold accent greens. The overall mood is warm, contemporary, and food-forward, reflecting the brand's commitment to bringing restaurant-quality meals to the home. Ample whitespace and a measured spacing system give the interface a breathing quality, while consistent border radii and interaction patterns signal a refined, intentional design maturity.
Key Characteristics
{colors.primary} (#232323) for primary interactions{rounded.sm} — 8px){colors.primary} — #232323): Primary call-to-action buttons, brand accent, headings, and active states. Conveys trust and authority.{colors.link} — #0000EE): Inline hyperlinks and linked text throughout the site.{colors.canvas} — #FFFFFF): Default page background and primary surface for content; label text color on branded backgrounds.{colors.surface-alt} — #FAF8F3): Alternating section bands and secondary surfaces for visual rhythm.{colors.body} — #343434): Primary body copy and standard text content.{colors.muted} — #656565): Captions, secondary text, and de-emphasized content.{colors.hairline} — #000000): 1px borders, dividers, and fine-line accents.{colors.accent-1} — #7D7561): Decorative warm brown tone; no assigned functional role.{colors.accent-2} — #D2FA96): Bright lime accent; no assigned functional role; used for visual interest.{colors.accent-3} — #009645): Deep green accent; no assigned functional role.{colors.accent-4} — #96DC16): Bright yellow-green; no assigned functional role.{colors.neutral-1} — #EFE9DE): Subtle warm neutral for secondary surfaces and subtle contrast.{colors.neutral-2} — #ADADAD): Mid-gray for disabled states and secondary interactions.Primary: Agrandir Tight
Geometric sans-serif with condensed proportions. Used for headings, display, and high-impact text. Fallback: Helvetica, Arial, sans-serif
Secondary: Roboto
Humanist sans-serif with warm proportions. Used for body copy, form labels, and standard interface text. Fallback: 'Helvetica Neue', Helvetica, Arial, sans-serif
Tertiary: Times New Roman (Label contexts only)
Classical serif for specific label roles. Fallback: Georgia, serif
Quaternary: Arial (Button contexts)
Neutral sans-serif for button text. Fallback: Helvetica, sans-serif
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Large | Agrandir Tight Black | 56px | 700 | 0.89 | 0px | Hero-scale headings; extreme compaction for impact |
| Display Medium | Agrandir Tight Bold | 50px | 700 | Not measured | 0px | Major section headings |
| Display Small | Agrandir Tight Bold | 40px | 500 | 1.2 | 0px | High-level page sections |
| Display Small Strong | Roboto | 40px | 700 | 0.8 | 0px | Alternate display weight |
| Heading Medium | Agrandir Tight Bold | 32px | 500 | 1.25 | 0px | Primary heading tier |
| Heading Small | Agrandir Tight Bold | 24px | 500 | 1.33 | 0px | Subsection headings |
| Heading Extra Small | Agrandir Tight Bold | 20px | 500 | 1.2 | 0px | Minor headings and card titles |
| Body Large | Roboto | 16px | 400 | 1.5 | 0px | Primary body text |
| Body Large Strong | Roboto | 16px | 700 | 1.5 | 0px | Emphasized body text |
| Body Extra Large | Roboto | 20px | 400 | 1.6 | 0px | Callouts and highlighted body copy |
| Body Medium | Roboto | 14px | 400 | 1.43 | 0px | Secondary body; descriptions |
| Body Medium Strong | Roboto | 14px | 700 | 1.43 | 0px | Emphasized secondary text |
| Body Small | Roboto | 13.3333px | 400 | 1.8 | 0px | Fine text; disclaimers |
| Label Medium | Agrandir Tight Bold | 16px | 400 | 1 | 0px | Form labels |
| Label Medium (Times New Roman) | Times New Roman | 16px | 400 | 1 | 0px | Semantic label variant |
| Button Medium | Agrandir Tight Bold | 14px | 700 | 1.43 | 0px | Primary button text |
| Button Large | Arial | 16px | 400 | 1.5 | 0px | Large button text |
| Button Small | Arial | 13.3333px | 400 | Not measured | 0px | Small button text |
| Button Extra Small | Roboto | 12px | 700 | 1.33 | 0px | Compact button text |
| Caption | Roboto | 12px | 400 | 1.33 | 0px | Image captions; fine print |
0.89–1.2) on display and headings; looser heights (1.5–1.8) on body for comfort.0px for consistency.{colors.primary} (#232323){colors.canvas} (#FFFFFF){spacing.sm} (12px) vertical × {spacing.md} (24px) horizontal{typography.button-lg} (16px, weight 400, line-height 24px){rounded.sm} (8px)#353535; text color becomes #353535#4B4B4B; text color becomes #4B4B4B{colors.primary} solid 0.125rem (2px){colors.neutral-2} (#ADADAD); background transparent{colors.neutral-2} (#ADADAD){colors.canvas} (#FFFFFF){spacing.sm} (12px) vertical × {spacing.md} (24px) horizontal{typography.button-lg} (16px, weight 400, line-height 24px){rounded.sm} (8px)0px with rgba(118, 118, 118, 0.3)#E3E3E3#D2D2D2{colors.primary} solid 0.125rem{colors.neutral-2} (#ADADAD); background transparent{colors.canvas} (#FFFFFF){colors.link} (#0000EE){spacing.lg} (24px) vertical × {spacing.xl} (32px) horizontal{typography.button-md} (14px, weight 700, line-height 1.43){rounded.none} (0px)1px solid {colors.hairline} (#000000){colors.primary} (#232323); background #E0D9CB{colors.primary}; background #D8C9B7{colors.primary} solid 0.125rem{colors.neutral-2}; background {colors.canvas}{colors.primary} (#232323){colors.hairline} (#000000){spacing.xxs} (4px){rounded.full} (9999px)1px solid {colors.primary}{typography.button-sm} (13.3333px, weight 400)#353535#4B4B4Btransparent; background transparent; text color {colors.neutral-2}{colors.surface-alt} (#FAF8F3){colors.hairline} (#000000){spacing.xxs} (4px){rounded.full} (9999px)1px solid {colors.primary}{typography.button-sm} (13.3333px, weight 400)#E0D9CB#D8C9B7{colors.canvas} (#FFFFFF){rounded.sm} (8px){spacing.lg} (24px) to {spacing.xl} (32px)1px solid {colors.hairline} for definition{colors.surface-alt}; subtle interaction cues{colors.canvas} (#FFFFFF){colors.body} (#343434){colors.muted} (#656565)1px solid soft neutral (measured as #615C50 in hover; base: hairline light){rounded.sm} (8px){spacing.md} (16px){typography.body-lg} (16px, weight 400){colors.primary} (#232323); border width tightens to 0.125rem#615C50{colors.neutral-2} (#ADADAD); background transparent; border transparent{colors.body} (#343434){typography.label-md} (16px, weight 400, line-height 1){spacing.sm} (12px)#242424 (dark near-black)#242424#353535; text-decoration removed{colors.hairline} (#000000)8px 0px top/bottom{colors.primary} (#232323){rounded.xs} (4px)#353535; text-decoration none{colors.primary} solid 0.125rem{colors.primary} (#232323){spacing.xs} (8px) vertical × {spacing.md} (24px) horizontal{rounded.sm} (8px)1px inset {colors.primary} (rgb(35, 35, 35)){colors.primary} 0px 0px 0px 1px inset{colors.primary}; background #E0D9CB{colors.primary}; background #D8C9B7{colors.neutral-2}; background {colors.surface-alt}; text color {colors.neutral-2}HelloFresh employs a modular spacing scale in increments of {spacing.xxs} (4px), establishing rhythm and consistency across all whitespace decisions.
Spacing Scale:
{spacing.xxs} — 4px (micro-spacing; icon padding){spacing.xs} — 8px (tight spacing; small gaps){spacing.sm} — 12px (compact spacing; button padding vertical){spacing.md} — 16px (standard spacing; button padding horizontal; body line-height){spacing.lg} — 24px (comfortable spacing; section content padding){spacing.xl} — 32px (generous spacing; large button padding; container padding){spacing.xxl} — 40px (large section padding){spacing.xxxl} — 48px (major section spacing){spacing.section} — 56px (large vertical rhythm between sections){spacing.band} — 96px (full-width band padding; hero sections)Usage Context:
{spacing.sm} to {spacing.md} for button/input padding{spacing.lg} to {spacing.xl} for internal padding{spacing.section} for gap between major content blocks{spacing.band} for large vertical sections with full-width background1280px, 1440px breakpoints; content constrained){spacing.md} gutters on each side){spacing.md} (16px) horizontal padding per side on mobile; {spacing.lg} (24px) to {spacing.xl} (32px) on tablet/desktop{spacing.md} (16px) on mobile; {spacing.lg} (24px) to {spacing.xl} (32px) on tablet/desktopGenerous whitespace creates breathing room and visual clarity. The design prioritizes legibility and focus by wrapping content in ample margins and internal padding. Large headings sit atop generous top margins; body paragraphs are separated by vertical spacing at least {spacing.lg} (24px). Empty space is not treated as wasted real estate but as a design tool that elevates content hierarchy and reduces cognitive load.
{rounded.none} — 0px (outline buttons; sharp modernism){rounded.xs} — 4px (links; minor interactive elements){rounded.sm} — 8px (buttons; cards; inputs; primary interactive role){rounded.full} — 9999px (icon buttons; pill-shaped toggles)Component Mapping:
{rounded.sm} (8px){rounded.full} (9999px){rounded.sm} (8px){rounded.sm} (8px){rounded.none} (0px)1px (standard border weight for inputs, outlines, dividers)0.125rem (approximately 2px at 16px base font; strong focus indication)Applied Roles:
1px (thin)1px inset (thin)1px solid (thin)0.125rem (thin ring; clear but not intrusive)HelloFresh employs a color-blocking approach to depth. Rather than relying on layered shadows, the system uses surface color changes and strategic contrast to establish visual hierarchy. There is one measured shadow type: a subtle 1px inset border shadow on linked buttons.
| Level | Treatment | Use |
|---|---|---|
| Flat | No shadow; solid {colors.canvas} background | Default cards, buttons, inputs |
| Single Inset | {colors.primary} 0px 0px 0px 1px inset (rgb(35, 35, 35)) | Linked buttons; badge-like elements |
| Hover Lift | Background color shift to {colors.neutral-1} (#EFE9DE) or {colors.surface-alt} | Interactive element affordance without shadow |
Shadow Philosophy: The system forgoes drop shadows and prefers flat design with high contrast. Elevation is communicated through color hierarchy, border definition, and hover state changes. This approach keeps the interface clean and modern while maintaining clear visual separation between interactive and static elements.
90%) (secondary emphasis; slightly reduced visual weight)Applied Roles:
90% opacity for subtle de-emphasis{colors.neutral-2}, not opacity flag)| Layer | Z-index | Use |
|---|---|---|
| Base Content | 1 | Standard page content; default stacking context |
| Standard Elements | 2 | Cards, containers in normal flow |
| Floating Elements | 4 | Fixed buttons, temporary floating UI |
| Sticky Elements (Low) | 5 | Sticky navigation bars; below modals |
| Sticky Elements (High) | 9 | Primary sticky headers; persistent navigation |
| Dropdown Menus | 99 | Navigation dropdowns; contextual menus |
| Sticky Navigation (Floating) | 101 | Sticky header that floats above most content |
| Modal / Overlay (High) | 115 | Modal dialogs, full-screen overlays, topmost layer |
Stacking Context Notes:
The system reserves high z-index values (99+) for modals and overlays. Sticky navigation sits between standard content and dropdowns. Dropdowns (z-index: 99) rise above most interactive elements but sit beneath modal layers (z-index: 115).
{spacing.xxs} through {spacing.band}). Never introduce arbitrary pixel values.{colors.body} (#343434) on {colors.canvas} (#FFFFFF); maintain at least WCAG AA contrast ratios.{rounded.sm} to interactive elements: Buttons, inputs, and cards should use 8px border radius for consistency.{colors.surface-alt} or {colors.neutral-1} to create visual separation; avoid drop shadows.15px, 30px, or other one-off measurements. Stick to the scale.{colors.neutral-2} text color and transparent background.{rounded.sm} on general components: Icon buttons are {rounded.full} (pills); everything else defaults to 8px.1px consistently; focus rings use 0.125rem only where explicitly needed.{colors.primary} outline on keyboard focus.{colors.accent-*} colors to interactive states: Accent colors are decorative only; CTAs use {colors.primary}.| Breakpoint | Viewport Width | Grid Columns | Nav Links Visible | Menu Toggle | Largest Heading | Body Font Size | Content Padding |
|---|---|---|---|---|---|---|---|
| Mobile | 375px | 1 | 1 | Yes | 56px | 16px | 16px |
| Tablet | 768px | 4 | 3 | Yes | 40px | 16px | 56px |
| Desktop | 1024px | 6 | 3 | Yes | 56px | 16px | 56px |
| Desktop Large | 1280px | 8 | 3 | Yes | 56px | 16px | 56px |
| Desktop XL | 1440px | 8 | 3 | Yes | 56px | 16px | 56px |
Key Changes:
16px); hamburger menu active; {typography.display-lg} shrinks to 56px (no reduction from desktop).56px; display heading remains 40px.1200px) content; display heading returns to 56px.Specific Adaptations:
56px at mobile; 40px at 768px; 56px at 1024px+{spacing.lg} vertical on mobile; {spacing.section} on tablet+{spacing.sm} padding per side = 28px; but measured buttons are 16px wide; recommend 40px+ for real-world compliance){spacing.sm} (12px) internal padding on buttons; {spacing.md} (16px) internal padding on inputs{spacing.md} apart to avoid accidental tapsMobile (Single Column):
width: 100%){spacing.md} guttersTablet (4 Columns):
Desktop (6–8 Columns):
1200px) containerSpecific Component Behavior:
{typography.display-lg} (56px) to {typography.display-sm} (40px) at 768px breakpoint; restore to 56px at 1024px+{spacing.md} margin on mobile; constrained width on desktop){spacing.md} horizontal padding on mobile; constrained width on desktop{colors.primary} — #232323){colors.canvas} — #FFFFFF){colors.body} — #343434){colors.surface-alt} — #FAF8F3){colors.muted} — #656565){colors.link} — #0000EE){colors.hairline} — #000000)#7D7561), Accent 2 (#D2FA96), Accent 3 (#009645), Accent 4 (#96DC16){colors.neutral-2} — #ADADAD)All interactive elements default to {rounded.sm} (8px)—buttons, inputs, cards—unless explicitly an icon button ({rounded.full}) or special variant ({rounded.none}).
Primary buttons are always {colors.primary} (#232323) background with {colors.canvas} text; secondary/filled buttons use {colors.neutral-2} (#ADADAD).
Hover states change background color, not opacity: Primary button hover → #353535; secondary → #E3E3E3. Never use opacity for affordance.
Typography hierarchy is strict: Display/headings use Agrandir Tight; body/labels use Roboto. Don't mix.
Spacing only comes from the scale: 4px, 8px, 12px, 16px, 24px, 32px, 40px, 48px, 56px, 96px. No other values.
Focus states are {colors.primary} outline at 0.125rem (2px equivalent): Every interactive element must respond to :focus-visible.
Color-blocking creates depth, not shadows: Use {colors.surface-alt} (#FAF8F3) or {colors.neutral-1} (#EFE9DE) to layer surfaces.
Border radius is never inverted: 0px is reserved for sharp outline buttons; standard interactive radius is 8px.
Touch targets are minimum 48px tall; width varies (buttons can be flexible, but ensure comfortable tapping).
Disabled states use {colors.neutral-2} text on transparent background; never gray-out an entire component with opacity.
:visited link colors, form validation feedback) are not included.{colors.accent-1} through {colors.accent-4} have no assigned functional role. They appear in the palette but are treated as decorative; their exact use-cases may vary by page or context.