Design System Guide
A practical guide for building clean, consistent, client-ready Divi 5 websites. Use it to choose colors, type, spacing, layout rhythm, and UI details with confidence.
Design Philosophy
The core principles behind every design decision in this system.
--primary: #0179cb. Update the primary color and the connected tints, shades, secondary color, and semantic tokens follow. Avoid hardcoded values in real projects — use the system instead.clamp() values, so layouts respond smoothly between mobile and desktop without extra breakpoints.color-bg-subtle instead of color-neutral-50 even when both currently resolve to the same color. Semantic names describe purpose, so future theme changes are safer and faster.Brand Colors
The core brand colors and supporting variants used across the system.
Primary
#0179cb
Secondary
180° hue
Heading
−60 lightness
+7L
+20L
+34L
+47L
| Token | Δ Lightness | Best Use |
|---|---|---|
| primary-color-tint-1 | +7 | Hover states for primary buttons and links |
| primary-color-tint-2 | +20 | Focus rings, active states, and selected UI elements |
| primary-color-tint-3 | +34 | Soft accents, illustrations, and icon backgrounds |
| primary-color-tint-4 | +47 | Light backgrounds, disabled states, and subtle panels |
−10L
−27L
−43L
−60L
| Token | Δ Lightness | When to Use |
|---|---|---|
| primary-color-shade-1 | −10 | Pressed states and active controls |
| primary-color-shade-2 | −27 | Dark-section accents and footer highlights |
| primary-color-shade-3 | −43 | Deep background sections and overlays |
| primary-color-shade-4 | −60 | Heading color — same visual role as Heading |
Primary · 50%
Shadow · 50%
Secondary · 50%
Neutral Scale
The neutral scale controls backgrounds, text, dividers, borders, and interface depth.
| Token | Hex | Primary Use |
|---|---|---|
color-neutral-50 | #fafafa | Page background, card backgrounds on white |
color-neutral-100 | #f4f5f5 | Alternate row background, input fill |
color-neutral-200 | #e5e6e7 | Default border, dividers, rule lines |
color-neutral-300 | #d5d6d7 | Strong border, focused form field borders |
color-neutral-400 | #a3a5a8 | Subtle text, icons, placeholder text |
color-neutral-500 | #737679 | Muted body text, captions |
color-neutral-600 | #54575a | Secondary body text |
color-neutral-700 | #404245 | Supporting headings on light backgrounds |
color-neutral-800 | #282929 | Dark section backgrounds (inverse-subtle) |
color-neutral-900 | #181a1b | Dark section backgrounds, footers |
color-neutral-950 | #0e0f10 | Near-black, deep dark sections |
Semantic Color Tokens
Purpose-based color names that make design decisions clearer and safer.
color-bg-default for a page background instead of choosing color-neutral-50 directly. The result may look the same today, but the semantic token protects the design when the theme changes later.| Token | Resolved From | Use Case |
|---|---|---|
| color-text-primary | Primary color | CTAs, links, highlighted text |
| Heading Text Color | Primary −60L | All H1–H6 headings |
| Body Text Color | = Heading color | All body paragraphs |
| color-text-muted | Neutral 500 | Captions, secondary labels, meta text |
| color-text-subtle | Neutral 400 | Placeholder text, disabled labels |
| color-text-inverse | Neutral 50 | Text on dark / colour backgrounds |
| Token | Resolved From | Use Case |
|---|---|---|
| color-bg-default | Neutral 50 | Main page background |
| color-bg-subtle | Neutral 50 | Card backgrounds, alternate sections |
| color-bg-muted | Neutral 100 | Input backgrounds, tag chips |
| color-bg-inverse | Neutral 900 | Dark hero sections, footers |
| color-bg-inverse-subtle | Neutral 800 | Secondary dark sections, dark cards |
| Token | Resolved From | Use Case |
|---|---|---|
| color-border-subtle | Neutral 100 | Dividers, ghost card outlines |
| color-border-default | Neutral 200 | Form fields, default UI borders |
| color-border-strong | Neutral 300 | Focused inputs, table borders |
| color-border-inverse | Neutral 700 | Borders on dark backgrounds |
Status Colors
Use these colors only for alerts, validation, confirmations, and feedback states.
#dcfce7
#16a34a
#14532d
#fee2e2
#dc2626
#7f1d1d
#fef3c7
#d97706
#78350f
#dbeafe
#2563eb
#1e3a8a
Color Usage Rules
Rules that keep the interface clean, readable, and easy to use.
color-text-inverse, color-border-inverse, and color-hover-dark. Do not reuse light-section text and border tokens inside dark sections.Typefaces
Two typefaces with clear roles: one for personality, one for readability.
--font-heading--font-bodyType Scale
All sizes use fluid clamp() values that scale smoothly from mobile to desktop.
| Token | CSS Variable | Min → Max | Clamp Value | Use |
|---|---|---|---|---|
| Display LG | --display-lg | 64 → 128px | clamp(4rem, calc(8vw + 2rem), 8rem) | Main hero statement. Use once per page. |
| Display MD | --display-md | 56 → 96px | clamp(3.5rem, calc(6vw + 2rem), 6rem) | Large hero support lines and major feature sections. |
| Display SM | --display-sm | 48 → 72px | clamp(3rem, 2.44vw + 2.42rem, 4.5rem) | Large section headlines and editorial callouts. |
| Tag | CSS Variable | Min → Max | Clamp Value | Preview |
|---|---|---|---|---|
H1 | --h1 | 36 → 48px | clamp(2.25rem, 2rem + 1vw, 3rem) |
Page Title |
H2 | --h2 | 30 → 36px | clamp(1.875rem, 1.6rem + 0.7vw, 2.25rem) |
Section Heading |
H3 | --h3 | 24 → 30px | clamp(1.5rem, 1.3rem + 0.6vw, 1.875rem) |
Subsection Heading |
H4 | --h4 | 20 → 24px | clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem) |
Card Heading |
H5 | --h5 | 17 → 20px | clamp(1.0625rem, 0.95rem + 0.4vw, 1.25rem) |
Minor Heading |
H6 | --h6 | 14 → 17px | clamp(0.875rem, 0.8rem + 0.3vw, 1.0625rem) |
Label / Eyebrow |
| Token | CSS Variable | Clamp Value | Use |
|---|---|---|---|
| body-text-lg | --body-text-lg | clamp(1.25rem, 1.1rem + 0.5vw, 1.5rem) | Hero intro text and important lead paragraphs |
| body-text | --body-text | clamp(1rem, 0.90rem + 0.40vw, 1.25rem) | Standard paragraphs and long-form content |
| text-s | --text-s | clamp(0.875rem, 0.82rem + 0.28vw, 0.9375rem) | Labels, captions, navigation, compact UI text |
| text-xs | --text-xs | clamp(0.75rem, 0.70rem + 0.20vw, 0.875rem) | Fine print, legal text, timestamps, small meta text |
Line Height
Line-height presets that control rhythm, density, and readability.
| Token | CSS Variable | Value | Use |
|---|---|---|---|
leading-none | --leading-none | 1em | Single-line display text, logos, eyebrows — no space for descenders |
leading-tight | --leading-tight | 1.1em | Display headings, hero type, H1. Creates visual mass in large type. |
leading-snug | --leading-snug | 1.2em | H2–H4 headings, card titles, subheadings |
leading-normal | --leading-normal | 1.3em | All body copy, paragraph text, UI text — default for Inter |
leading-tight. H2–H4 → leading-snug. Body → leading-normal. Never use leading-normal on display headings — it creates ungainly gaps.Letter Spacing
Letter-spacing presets for hierarchy, polish, and optical correction.
| Token | CSS Variable | Value | Use |
|---|---|---|---|
tracking-tight | --tracking-tight | −0.02em | Display type and H1. Corrects optical gaps in large type. |
tracking-normal | --tracking-normal | 0em | Default — all body text and most headings. Do not override without intent. |
tracking-wide | --tracking-wide | +0.05em | Small caps, button labels, H6 eyebrow headings. |
tracking-wider | --tracking-wider | +0.1em | Section labels, all-caps decorative text, navigation eyebrows. |
Typography Usage Rules
The rules that separate professional from amateur typography.
--tracking-tight applied. At large sizes, normal tracking creates optical gaps that make type feel loose.Spacing Scale
8-step scale for padding and margins. All values are fluid clamp() from the JSON.
space-* tokens → padding and section breathing room. gap-* tokens → grid/flex gaps between elements. They have different scales because padding and gap serve different visual functions.| Token | CSS Variable | Min | Max | Visual | Use For |
|---|---|---|---|---|---|
space-0 | --space-0 | 0 | 0 | Removing spacing intentionally | |
space-xs | --space-xs | 8px | 12px | Badge padding, icon margins, tight internal spacing | |
space-s | --space-s | 12px | 16px | Button padding, list item spacing, label margins | |
space-m | --space-m | 16px | 24px | Card padding, paragraph bottom margin, nav items | |
space-l | --space-l | 24px | 40px | Section internal padding, heading bottom margin | |
space-xl | --space-xl | 32px | 64px | Section top/bottom padding, content blocks | |
space-2xl | --space-2xl | 48px | 96px | Hero section padding, major section separators | |
space-3xl | --space-3xl | 64px | 128px | Full-screen sections, dramatic vertical breathing room |
Gap Scale
8-step scale for grid and flex gaps. All values are fluid clamp() from the JSON.
| Token | CSS Variable | Min | Max | Visual | Use For |
|---|---|---|---|---|---|
gap-0 | --gap-0 | 0 | 0 | Flush grids, borderless button groups | |
gap-xs | --gap-xs | 8px | 12px | Icon + label, tag chips, inline button groups | |
gap-s | --gap-s | 12px | 20px | Horizontal nav links, compact card grids | |
gap-m | --gap-m | 16px | 28px | Standard card grids (3-col), feature lists | |
gap-l | --gap-l | 24px | 40px | 2-col content layouts, team grids | |
gap-xl | --gap-xl | 32px | 56px | Hero two-col layouts, large feature blocks | |
gap-2xl | --gap-2xl | 40px | 80px | Split-screen layouts, alternating content rows | |
gap-3xl | --gap-3xl | 56px | 112px | Full-width feature sections, dramatic two-col layouts |
Spacing Usage Rules
The discipline that makes layouts feel designed, not assembled.
space-m to space-l. Section padding uses space-xl to space-3xl. Never use space-s as section padding — it suffocates the layout.space-xs directly to space-3xl within the same component creates jarring proportion jumps. Step progressively — each step is approximately 1.5× the previous.space-xl padding, use gap-l or gap-m for the inner grid. Gaps should never compete with the breathing room around the section container.space-s between a heading and its body copy. Oversize margins disconnect headings from their context.Border Radius
The system uses one consistent radius: 4px. This keeps every card, button, input, pill, and panel visually aligned.
4px across the interface. Do not mix 8px, 16px, 24px, and full-pill rounding in the same guide. Multiple radius sizes make the system look accidental instead of designed.Border Width
Six border thickness presets for structure, state, and emphasis.
Animation Timing
Three speed presets for a consistent, polished motion feel.
ease-out for elements entering. ease-in for elements leaving. ease-in-out for state toggles like accordions. Never use linear for UI transitions — it feels mechanical.Approved Design Combinations
Pre-approved token pairings for the most common UI patterns.
| Pattern | Background | Text | Border | Radius | Padding |
|---|---|---|---|---|---|
| Standard Card | color-bg-subtle | Heading + body | color-border-default / border-xs | radius-m | space-l |
| Feature Card | color-bg-default | Heading + body | Primary / border-l | radius-m | space-l |
| CTA Button | Primary | color-text-inverse | none | radius-full | space-s × space-m |
| Ghost Button | transparent | Primary | Primary / border-s | radius-full | space-s × space-m |
| Hero Section | color-bg-default | Heading + body-text-lg | none | — | space-3xl (Y) space-xl (X) |
| Dark Section | color-bg-inverse | color-text-inverse | color-border-inverse | — | space-2xl (Y) space-xl (X) |
| Form Input | color-bg-muted | Body color | color-border-default / border-xs | radius-s | space-s × space-m |
| Alert / Notice | Status subtle bg | Status text | Status default / border-xs | radius-m | space-m |
| Navigation Bar | color-bg-default | Body + primary (active) | color-border-subtle (bottom) | — | space-m (Y) space-xl (X) |
| Footer | color-bg-inverse | color-text-inverse + muted | color-border-inverse (top) | — | space-2xl (Y) |
| Testimonial Block | color-bg-subtle | Heading + body | primary-tint-3 / border-xl (left) | radius-m | space-l |
| Pricing Card (Featured) | Primary | color-text-inverse | none | radius-l | space-xl |
Anti-Patterns to Avoid
The most common mistakes that break design consistency and professionalism.
#0179cb anywhere other than the Primary token definition, you have broken the system. Client rebrands become multi-file nightmares. Always reference token names.radius-m for cards and panels, radius-s for compact controls, and radius-full only for pills or circles. Random radius changes make the system feel unfinished.--tracking-tight (−0.02em) applied.color-text-inverse and color-hover-dark.Designer Delivery Checklist
Use this before handing a website to a client or publishing a template.