TextPrimary
#ffffff
Primary text · Observed
Mailchimp builds a Large display typography and Control-dense composition visual language around a dark foundation and Graphik Web typography. Its marketing experience puts editorial rhythm and content narrative at the center of the composition.
/ 01 . Color
Visual system extracted from computed styles, CSS variables and repeated foreground/background usage across the analyzed page.
#ffffff
Primary text · Observed
#231e15
Page canvas · Observed
rgba(35, 30, 21, 0.3)
Borders and separators · Observed
#000000
Observed palette family
#f0f4f6
Observed palette family
rgba(35, 30, 21, 0.65)
Observed palette family
#ffe01b
Observed palette family
rgba(255, 224, 27, 0.65)
Observed palette family
rgba(255, 224, 27, 0.15)
Observed palette family
/ 02 . Typography
navigation
Aa Design language
button
Aa Design language
caption
Aa Design language
smallHeading
Aa Design language
body
Aa Design language
headingLarge
Aa Design language
/ 03 . System
controlGap1
30px
controlGap2
40px
contentGap1
30px
contentGap2
44px
sectionGap1
68px
sectionGap2
80px
space-xs
2.4px
space-sm
8px
smallRadius
3px
mediumRadius
10px
largeRadius
24px
fullRadius
9999px
defaultBorder
1px solid rgb(188, 186, 182)
/ 04 . Components
Reusable nav pattern.
Major page content boundary.
Major page content boundary.
Repeated grouped content surface.
Text navigation embedded in compact content flow.
Text navigation embedded in compact content flow.
# DESIGN.md
## 1. Overview
Interface guided by clear visual hierarchy, consistent surfaces, and a controlled semantic palette.
Use the tokens and contracts below as the normative source for accessible, responsive implementation.
> Normative implementation contract: preserve semantic token names, responsive rules, and interaction states when extending the interface.
## 2. Colors and accessibility
### Semantic color tokens
| Token | Hex value | Purpose |
|---|---|---|
| background | `#231e15` | Primary canvas |
| surface | `#231e15` | Raised surfaces |
| text-primary | `#ffffff` | Primary text |
| text-secondary | `#ffffff` | Secondary text |
| text-muted | `#ffffff` | Supporting text |
| text-on-brand | `#ffffff` | Text on brand |
| border | `#231e15` | Borders and dividers |
| brand | `#2563eb` | Primary brand action |
| success | `#166534` | Positive state |
| danger | `#b91c1c` | Destructive state |
| warning | `#92400e` | Warning state |
| info | `#075985` | Informational state |
| focus | `#1d4ed8` | Focus ring |
### WCAG AA rules
- Normal text must reach a minimum contrast ratio of 4.5:1.
- Large text and interface elements must reach a minimum contrast ratio of 3:1.
- Visible focus must maintain a minimum contrast ratio of 3:1 and must not rely on color alone.
- Use only semantic token combinations that meet these ratios.
## 3. Typography
### Family
| Token | Family | Usage |
|---|---|---|
| font-primaryfont | `'Graphik Web', sans-serif` | Body and interface text |
| font-displayfont | `'Means Web', sans-serif` | Display hierarchy |
### Type scale
| Token | Family | Size | Weight | Line height |
|---|---|---:|---:|---:|
| type-navigation | `'Graphik Web', sans-serif` | `16px` | `400` | `21.6px` |
| type-button | `'Graphik Web', sans-serif` | `13px` | `500` | `14.3px` |
| type-caption | `'Graphik Web', sans-serif` | `13px` | `400` | `17.55px` |
| type-smallheading | `'Graphik Web', sans-serif` | `16px` | `400` | `24px` |
| type-body | `'Graphik Web', sans-serif` | `16px` | `400` | `normal` |
| type-headinglarge | `'Means Web', sans-serif` | `40px` | `400` | `40px` |
| type-headingmedium | `'Graphik Web', sans-serif` | `23px` | `400` | `30px` |
| type-display | `'Means Web', sans-serif` | `64px` | `400` | `76.8px` |
## 4. Layout and spacing
### Breakpoints
- **Mobile:** `< 768px` — one-column grid, 16px/24px gutters, and stacked navigation.
- **Tablet:** `768px–1023px` — adaptive grid and 32px/48px gutters.
- **Desktop:** `>= 1024px` — 120px gutters and a container max-width defined by the layout.
### Responsive rules
- **Header:** stack navigation and actions on mobile; keep primary navigation inline from tablet upward.
- **Hero:** use one column on mobile, a balanced two-column composition on tablet, and the full container on desktop.
- **Cards:** stretch to the grid width on mobile, use two columns on tablet, and the defined card grid on desktop.
- **Navigation grid: use one column on mobile, adaptive columns on tablet, and the complete navigation grid on desktop.
### Spacing scale
| Token | Value | Usage |
|---|---:|---|
| space-xs | `2.4px` | Layout scale |
| space-sm | `8px` | Layout scale |
| space-md | `12px` | Layout scale |
| space-lg | `16px` | Layout scale |
| space-xl | `20px` | Layout scale |
## 5. Shapes, borders and depth
### Radii
| Token | Value | Usage |
|---|---:|---|
| radius-sm | `4px` | Compact controls |
| radius-md | `12px` | Cards and surfaces |
| radius-full | `9999px` | Pills and circular controls |
### Borders and depth
- Border width: `var(--ds-border-width)`.
- Border style: `solid`.
- Border color: `var(--ds-color-border)`.
- Use `var(--ds-shadow-sm)` for low elevation and `var(--ds-shadow-inner)` for inner separation.
## 6. Component specification
### Nav
- **Component:** Reusable nav pattern.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-text-primary)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Content Section — Variant A
- **Component:** Major page content boundary.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-text-primary)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Content Card
- **Component:** Repeated grouped content surface.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-text-primary)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Inline Text Link — Large
- **Component:** Text navigation embedded in compact content flow.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-brand)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-md)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
### Button — Variant A
- **Component:** Direct interface action.
- **Typography:** `var(--ds-type-body)`
- **Colors:** `var(--ds-color-brand)` and `var(--ds-color-text-on-brand)` on brand surfaces
- **Geometry:** `var(--ds-radius-full)` and `var(--ds-space-sm)` for internal spacing
- **Border:** `var(--ds-border-width) solid var(--ds-color-border)`
## 7. Interaction contract
### Universal state rules
| State | Visual behavior |
|---|---|
| Initial state | Use `var(--ds-color-surface)`, `var(--ds-color-text-primary)`, `var(--ds-color-border)`, `var(--ds-type-body)` and `var(--ds-radius-md)`. |
| `:hover` | Increase emphasis with `var(--ds-color-brand-hover)` or `var(--ds-color-surface-hover)`; preserve geometry and layout. |
| `:active` | Apply `var(--ds-color-brand-active)` or `var(--ds-color-surface-active)`; preserve dimensions. |
| `:focus-visible` | Show a ring of `var(--ds-focus-ring-width)` using `var(--ds-color-focus)`, with offset `var(--ds-focus-ring-offset)`. |
| `:disabled` | Use `var(--ds-state-disabled-opacity)`, `cursor: not-allowed` and `pointer-events: none`; remove pointer events. |
## 8. Design tokens
```css
:root {
--ds-color-background: #231e15;
--ds-color-surface: #231e15;
--ds-color-text-primary: #ffffff;
--ds-color-text-secondary: #ffffff;
--ds-color-text-muted: #ffffff;
--ds-color-text-on-brand: #ffffff;
--ds-color-border: #231e15;
--ds-color-brand: #2563eb;
--ds-color-brand-hover: color-mix(in srgb, var(--ds-color-brand) 86%, var(--ds-color-text-primary));
--ds-color-brand-active: color-mix(in srgb, var(--ds-color-brand) 72%, var(--ds-color-text-primary));
--ds-color-surface-hover: color-mix(in srgb, var(--ds-color-surface) 92%, var(--ds-color-text-primary));
--ds-color-surface-active: color-mix(in srgb, var(--ds-color-surface) 84%, var(--ds-color-text-primary));
--ds-color-success: #166534;
--ds-color-danger: #b91c1c;
--ds-color-warning: #92400e;
--ds-color-info: #075985;
--ds-color-focus: #1d4ed8;
--ds-font-body: 'Graphik Web', sans-serif;
--ds-type-body: 'Graphik Web', sans-serif 16px 400 / 24px;
--ds-type-heading-large: 'Means Web', sans-serif 48px 700 / 1.1;
--ds-type-heading-medium: 'Means Web', sans-serif 32px 600 / 1.2;
--ds-type-heading-small: 'Means Web', sans-serif 24px 600 / 1.25;
--ds-type-caption: 'Graphik Web', sans-serif 12px 500 / 16px;
--ds-space-xs: 4px;
--ds-space-sm: 8px;
--ds-space-md: 16px;
--ds-space-lg: 24px;
--ds-space-xl: 40px;
--ds-border-width: 1px;
--ds-radius-sm: 4px;
--ds-radius-md: 12px;
--ds-radius-full: 9999px;
--ds-shadow-sm: 0 2px 8px rgb(0 0 0 / 0.12);
--ds-shadow-inner: inset 0 1px 2px rgb(0 0 0 / 0.12);
--ds-breakpoint-tablet: 768px;
--ds-breakpoint-desktop: 1024px;
--ds-gutter-mobile: 16px;
--ds-gutter-mobile-large: 24px;
--ds-gutter-tablet: 32px;
--ds-gutter-tablet-large: 48px;
--ds-gutter-desktop: 120px;
--ds-focus-ring-width: 2px;
--ds-focus-ring-offset: 2px;
--ds-state-disabled-opacity: 0.5;
--ds-transition-fast: 150ms ease-out;
}
```