This document outlines the systematic design principles for this Eleventy site, inspired by Swiss design methodology (Otl Aicher, Josef Müller-Brockmann), web-native design (Frank Chimero), and typographic clarity (Erik Spiekermann).
Uses a Minor Second (1.067) ratio - subtle, readable progression.
--type-size-9: 1.793rem (~28.7px) - Large headlines
--type-size-7: 1.476rem (~23.6px) - Section headings
--type-size-3: 1.138rem (~18.2px) - Subheadings
--type-size-1: 1rem (16px) - Body text
--type-size-small: 0.878rem (~14px) - Captions, metadata
Key rule: Use unitless line-heights (e.g., 1.5 not 1.5rem) so they scale with font size changes.
Base font size scales fluidly with viewport:
font-size: clamp(100%, 2vw, 137.5%);
All spacing uses multiples of a base unit system for visual consistency.
--space-3xs: 0.25rem (4px) - Micro adjustments
--space-2xs: 0.5rem (8px) - Tight coupling
--space-xs: 0.75rem (12px) - Close relationships
--space-s: 1rem (16px) - Related content
--space-m: 1.5rem (24px) - Default rhythm (baseline)
--space-l: 2rem (32px) - Section spacing
--space-xl: 2.5rem (40px) - Larger sections
--space-2xl: 3rem (48px) - Major breaks
--space-3xl: 4rem (64px) - Page sections
--space-6xl: 8rem (128px) - Page regions
<div class="flow"> <!-- Default 1.5rem spacing -->
<div class="flow-tight"> <!-- 0.5rem - tight coupling -->
<div class="flow-s"> <!-- 1rem - related content -->
<div class="flow-l"> <!-- 2rem - section spacing -->
<div class="stack-xs"> <!-- 0.5rem / 8px -->
<div class="stack-s"> <!-- 1rem / 16px -->
<div class="stack-m"> <!-- 1.5rem / 24px -->
<div class="stack-l"> <!-- 2rem / 32px -->
Tight coupling (0.5–1rem) - Elements that belong together:
Medium spacing (1.5–2rem) - Related but distinct:
Large spacing (3–4rem) - Section breaks:
Visual example:
Heading ← Title
↕ 0.5rem (tight) ← Belongs to heading
Content starts here... ← Content
↕ 1.5rem (medium) ← Paragraph separation
Next paragraph here... ← Related content
↕ 4rem (large) ← Section break
## New Section ← Distinct topic
12-column grid for complex layouts:
.grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
column-gap: 1.5rem;
row-gap: 2.5rem;
}
article > * + * → 3rem (48px) - Default article spacing
article > p + p → 1.5rem (24px) - Paragraph flow
article > h2 + * → 1rem (16px) - Heading to content (tight)
article > p + h3 → 2rem (32px) - Content to heading (space)
Why this matters:
.main > section + section → 5rem mobile, 8rem desktop
Clear visual breaks between major page regions.
--color-text: #141f0a - Primary text
--color-text-secondary: #374d21 - Links, accents
--color-text-muted: #000000 - Secondary text
--color-border: #d5d5d5 - Borders, separators
--color-surface: #FAF9F7 - Cards, backgrounds
--color-canvas: #FFFEFC - Page background
--color-100 → --color-text
--color-70 → --color-text-muted
--color-30 → --color-border
--color-10 → --color-surface
Design note: Semantic names (text, border, surface) are clearer than numeric scales (100, 70, 30).
Three systematic breakpoints cover most responsive needs:
--bp-sm: 40rem (640px) - Tablet
--bp-md: 60rem (960px) - Small desktop
--bp-lg: 80rem (1280px) - Large desktop
Why only three?
Avoid:
<div class="card">
<!-- Consistent padding: 2.5rem/1rem mobile, 3.5rem/2.5rem desktop -->
</div>
<button class="button">Primary</button>
<button class="button secondary">Secondary</button>
<button class="button button-small">Compact</button>
<form class="form-horizontal">
<!-- Stack vertically on mobile, horizontal on tablet+ -->
</form>
:focus-visible {
outline: 2px solid var(--focus-color);
outline-offset: 0.25em; /* Visible gap */
}
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Applied here: Spacing scale based on mathematical progression, not arbitrary values.
Applied here: 50ch max width, unitless line-heights, minor second scale.
Applied here: Fluid font sizing with clamp(), flexible grids, rem-based spacing.
Applied here: Minimal color palette, clear spacing hierarchy, purposeful components.
<section class="stack-xs">
<h3>Section Title</h3>
<p>Tight coupling (0.5rem) shows relationship</p>
</section>
<article>
<p>First paragraph</p>
<!-- 1.5rem spacing (automatic in article) -->
<p>Second paragraph flows naturally</p>
</article>
<main>
<section>First major section</section>
<!-- 5rem mobile / 8rem desktop spacing -->
<section>Second major section</section>
</main>
What changed:
.stack-* with .flow-* (but kept .stack-* for compatibility)What stayed the same:
clamp()Backward compatible: All existing classes still work. New classes are additions, not replacements.
Last updated: 2025-10-08