| --page-max | 1440 | 1440 | 1440 | widest a page's content (and a bleed figure) gets |
| --pad | 18 | 32 | 64 | |
| --scroll-edge | 48 | 48 | 48 | |
| --nav-pad-y | 18 | 24 | 24 | |
| --nav-h | calc(40px + 2 * var(--nav-pad-y) + var(--safe-t)) | calc(40px + 2 * var(--nav-pad-y) + var(--safe-t)) | calc(40px + 2 * var(--nav-pad-y) + var(--safe-t)) | |
| --radius | 4 | 4 | 4 | |
| --band-y | 40 | 56 | 80 | block padding of a page band |
| --band-gap | 40 | 56 | 80 | rhythm between items inside a band |
| --rule-space | 32 | 56 | 80 | divider line → its label |
| --hero-foot-gap | calc(var(--band-gap) * 1.5) | calc(var(--band-gap) * 1.5) | calc(var(--band-gap) * 1.5) | |
| --arcade-end | 64 | 64 | 104 | 404 hero → footer, Figma 390 and 768 |
| --grid-gap | 32 | 32 | 48 | |
| --grid-row-gap | 56 | 56 | 80 | |
| --card-text-pr | 18 | 32 | 2 | Figma project details: 18 on phones, 32 at 768, 2 from 1200 |
| --footer-pad-y | 32 | 56 | 56 | |
| --footer-pad-b | 32 | 56 | 56 | |
| --footer-gap | 32 | 56 | 80 | |
| --footer-cta-gap | 24 | 48 | 48 | |
| --cta-h | 48 | 48 | 56 | medium button on phones and tablets |
| --cta-pad-x | 20 | 20 | 20 | every button, Space/500 |
| --cta-icon | 22 | 22 | 24 | |
| --label-gap | 40 | 56 | 48 | section label → its content (Figma: 40 / 56 / 48) |
| --step-gap | 24 | 32 | 48 | step number → step text |
| --contact-btn-px | 18 | 32 | 24 | |
| --split-gap | 24 | 32 | 48 | |
| --aside-gap | 40 | 56 | 64 | |
| --meta-gap | 8 | 24 | 48 | phones: space-between does the spacing, so the three facts Figma sets on one row still fit |
| --panel-gap | 16 | 28 | 32 | |
| --panel-row-gap | 4 | 16 | 24 | icon sits above the text at 390 |
| --panel-icon-pad | 8 | 8 | 16 | |
| --panel-icon | 16 | 24 | 24 | |
| --process-gap | 40 | 56 | 48 | heading over a card row (DSW "Process") |
| --cards-gap | 40 | 56 | 24 | the same, where the 1200 frame tightens to 24 |
| --skill-gap | 24 | 32 | 40 | |
| --card-pad | 24 | 32 | 48 | |
| --marquee-tile | 95 | 152 | 200 | |
| --marquee-duration | 32s | 52s | 68s | |
| --ease | cubic-bezier(0.22, 0.61, 0.36, 1) | cubic-bezier(0.22, 0.61, 0.36, 1) | cubic-bezier(0.22, 0.61, 0.36, 1) | |
| --dur | 220ms | 220ms | 220ms | |
| --dur-fast | 150ms | 150ms | 150ms | glyph swaps and the quickest fades |
| --dur-short | 200ms | 200ms | 200ms | exits, and small things arriving |
| --dur-slow | 300ms | 300ms | 300ms | what the reader opens: scrim, notice, picture |
| --dur-long | 400ms | 400ms | 400ms | explanatory motion: the process map, the edge blur |
| --dur-light | 500ms | 500ms | 500ms | statement words sharpening, the process map's nodes |
| --dur-enter | 550ms | 550ms | 550ms | the load-in, block by block and word by word |
| --dur-reveal | 600ms | 600ms | 600ms | blocks rising in as they scroll into view |
| --dur-settle | 900ms | 900ms | 900ms | the slowest arrivals: the About photo, the hatch |
| --dur-menu-in | 240ms | 240ms | 240ms | |
| --dur-menu-out | 180ms | 180ms | 180ms | |
| --press-dur | 160ms | 160ms | 160ms | |
| --press-ease | ease-out | ease-out | ease-out | |
| --arrow-rotate | 45deg | 45deg | 45deg | |
| --arrow-dur | 260ms | 260ms | 260ms | |
| --arrow-ease | cubic-bezier(0.22, 1, 0.36, 1) | cubic-bezier(0.22, 1, 0.36, 1) | cubic-bezier(0.22, 1, 0.36, 1) | |
| --ease-out-expo | cubic-bezier(0.16, 1, 0.3, 1) | cubic-bezier(0.16, 1, 0.3, 1) | cubic-bezier(0.16, 1, 0.3, 1) | |
| --ease-enter | cubic-bezier(0.33, 1, 0.68, 1) | cubic-bezier(0.33, 1, 0.68, 1) | cubic-bezier(0.33, 1, 0.68, 1) | |
| --ease-overshoot | cubic-bezier(0.34, 1.56, 0.64, 1) | cubic-bezier(0.34, 1.56, 0.64, 1) | cubic-bezier(0.34, 1.56, 0.64, 1) | the sun's rays and the menu X |