utopia-fluid-scales
Utopia Fluid Scales
This project's fluid typography and spacing system
Configuration
Generated from: https://utopia.fyi/space/calculator?c=360,18,1.2,1240,20,1.25,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12
| Parameter | Value |
|---|---|
| Min viewport | 360px |
| Max viewport | 1240px |
| Min base size | 18px |
| Max base size | 20px |
| Min scale ratio | 1.2 (Minor Third) |
| Max scale ratio | 1.25 (Major Third) |
Unit: cqi (container query inline) - requires a container context to function.
Type Scale
Location: css/styles/typography.css
:root {
--step--2: clamp(0.7813rem, 0.7736rem + 0.0341cqi, 0.8rem);
--step--1: clamp(0.9375rem, 0.9119rem + 0.1136cqi, 1rem);
--step-0: clamp(1.125rem, 1.0739rem + 0.2273cqi, 1.25rem);
--step-1: clamp(1.35rem, 1.2631rem + 0.3864cqi, 1.5625rem);
--step-2: clamp(1.62rem, 1.4837rem + 0.6057cqi, 1.9531rem);
--step-3: clamp(1.944rem, 1.7405rem + 0.9044cqi, 2.4414rem);
--step-4: clamp(2.3328rem, 2.0387rem + 1.3072cqi, 3.0518rem);
--step-5: clamp(2.7994rem, 2.384rem + 1.8461cqi, 3.8147rem);
}
Type Step Reference
| Token | Min (360px) | Max (1240px) | Use Case |
|---|---|---|---|
--step--2 |
12.5px | 12.8px | Captions, fine print |
--step--1 |
15px | 16px | Small text, metadata |
--step-0 |
18px | 20px | Body text (base) |
--step-1 |
21.6px | 25px | Large body, lead text |
--step-2 |
25.9px | 31.3px | H4 equivalent |
--step-3 |
31.1px | 39.1px | H3 equivalent |
--step-4 |
37.3px | 48.8px | H2 equivalent |
--step-5 |
44.8px | 61px | H1 equivalent |
Applied Styles
body {
font-family: var(--font-base);
font-size: var(--step-0);
line-height: 1.5;
}
Note: No heading styles (h1-h6) are currently applied. Add as needed:
h1 { font-size: var(--step-5); }
h2 { font-size: var(--step-4); }
h3 { font-size: var(--step-3); }
h4 { font-size: var(--step-2); }
h5 { font-size: var(--step-1); }
h6 { font-size: var(--step-0); }
Space Scale
Location: css/styles/space.css
Individual Space Tokens
:root {
--space-3xs: clamp(0.3125rem, 0.3125rem + 0cqi, 0.3125rem);
--space-2xs: clamp(0.5625rem, 0.5369rem + 0.1136cqi, 0.625rem);
--space-xs: clamp(0.875rem, 0.8494rem + 0.1136cqi, 0.9375rem);
--space-s: clamp(1.125rem, 1.0739rem + 0.2273cqi, 1.25rem);
--space-m: clamp(1.6875rem, 1.6108rem + 0.3409cqi, 1.875rem);
--space-l: clamp(2.25rem, 2.1477rem + 0.4545cqi, 2.5rem);
--space-xl: clamp(3.375rem, 3.2216rem + 0.6818cqi, 3.75rem);
--space-2xl: clamp(4.5rem, 4.2955rem + 0.9091cqi, 5rem);
--space-3xl: clamp(6.75rem, 6.4432rem + 1.3636cqi, 7.5rem);
}
Space Token Reference
| Token | Min (360px) | Max (1240px) |
|---|---|---|
--space-3xs |
5px | 5px |
--space-2xs |
9px | 10px |
--space-xs |
14px | 15px |
--space-s |
18px | 20px |
--space-m |
27px | 30px |
--space-l |
36px | 40px |
--space-xl |
54px | 60px |
--space-2xl |
72px | 80px |
--space-3xl |
108px | 120px |
One-Up Space Pairs
Fluid transitions between adjacent sizes:
:root {
--space-3xs-2xs: clamp(0.3125rem, 0.1847rem + 0.5682cqi, 0.625rem);
--space-2xs-xs: clamp(0.5625rem, 0.4091rem + 0.6818cqi, 0.9375rem);
--space-xs-s: clamp(0.875rem, 0.7216rem + 0.6818cqi, 1.25rem);
--space-s-m: clamp(1.125rem, 0.8182rem + 1.3636cqi, 1.875rem);
--space-m-l: clamp(1.6875rem, 1.3551rem + 1.4773cqi, 2.5rem);
--space-l-xl: clamp(2.25rem, 1.6364rem + 2.7273cqi, 3.75rem);
--space-xl-2xl: clamp(3.375rem, 2.7102rem + 2.9545cqi, 5rem);
--space-2xl-3xl: clamp(4.5rem, 3.2727rem + 5.4545cqi, 7.5rem);
}
Custom Space Pair
:root {
--space-s-l: clamp(1.125rem, 0.5625rem + 2.5cqi, 2.5rem);
}
| Token | Min | Max | Scaling |
|---|---|---|---|
--space-s-l |
18px | 40px | Dramatic (2.2x) |
Usage Examples
/* Padding with space tokens */
.card {
padding: var(--space-m);
}
/* Fluid gap */
.stack {
display: flex;
flex-direction: column;
gap: var(--space-s-m);
}
/* Typography */
.title {
font-size: var(--step-3);
}
/* Section spacing */
.section {
padding-block: var(--space-l-xl);
}
Container Requirement
These scales use cqi units which require a container context. Without a parent with container-type: inline-size, the fluid calculation may not work as expected.
/* Required for cqi units to function */
.parent {
container-type: inline-size;
}
Files
css/styles/typography.css- Type scale and body stylescss/styles/space.css- Space tokens and pairs
More from matthewharwood/fantasy-phonics
animejs-v4
Anime.js 4.0 animations for Web Components — drag-drop, click feedback, swaps, cancelable motion. Use when adding animations, drag interactions, visual feedback, or motion to custom elements. Combines with web-components-architecture for lifecycle cleanup.
37ux-spacing-layout
Utopia fluid spacing tokens and layout patterns. Use when applying margins, padding, gaps, or creating layouts. Covers space scale, container widths, and responsive spacing. (project)
15html-semantic-engineering
30 pragmatic rules for production HTML covering semantic markup, accessibility (WCAG 2.1 AA), performance optimization, forms, and security. Use when writing HTML, building page structures, creating forms, implementing accessibility, or optimizing for SEO and Core Web Vitals.
14web-components-architecture
Build web components using Custom Elements v1 API with Declarative Shadow DOM, attribute-driven state, handleEvent pattern, and zero DOM selection. Use when creating custom elements, extending built-in HTML elements, or implementing component-based architecture. NO querySelector, NO innerHTML, NO external libraries - pure web platform APIs only.
12ux-iconography
Icon usage patterns using Material Symbols v3. Use when adding icons to buttons, navigation, or status indicators. Covers sizing, accessibility, animations, and color integration with project tokens.
10webgpu-canvas
WebGPU fundamentals for high-performance canvas rendering. Covers device initialization, buffer management, WGSL shaders, render pipelines, compute shaders, and web component integration. Use when building GPU-accelerated graphics, particle systems, or compute-intensive visualizations.
10