/* tokens.css inlined by .design-sync/make-ds-styles.mjs */ /* Design tokens. The only place where colours, sizes and durations are defined. Components consume these; a hard-coded hex or px value in a component is a defect. */ :root { /* Colour: paper, night, image. Nothing else. */ --paper: #E9E5DF; --paper-deep: #DFDAD1; --ink: #1A1A18; --ink-muted: #57564F; --night: #0E100F; --line: rgb(26 26 24 / 0.14); /* Immutable copies for resetting inside a .night or overlay context */ --ink-base: #1A1A18; --ink-muted-base: #57564F; --line-base: rgb(26 26 24 / 0.14); /* Counterparts on night surfaces */ --ink-on-night: var(--paper); --ink-muted-on-night: rgb(233 229 223 / 0.62); --line-on-night: rgb(233 229 223 / 0.18); /* Image overlay */ --overlay: linear-gradient(to top, rgb(14 16 15 / 0.75), rgb(14 16 15 / 0.2)); /* Type */ --font-sans: 'Inter Tight', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; --step-display: clamp(2.75rem, 1.2rem + 6.2vw, 7rem); --step-h2: clamp(1.9rem, 1.1rem + 2.6vw, 3.25rem); --step-h3: clamp(1.25rem, 1.05rem + 0.7vw, 1.6rem); /* Card and footer titles: between h2 and h3, for headings that name rather than claim. */ --step-title: clamp(1.6rem, 1.2rem + 1.5vw, 2.5rem); --step-body: clamp(1rem, 0.96rem + 0.2vw, 1.125rem); --step-small: 0.875rem; --weight-regular: 400; --weight-medium: 500; --track-display: -0.03em; --track-h2: -0.02em; --track-h3: -0.01em; --leading-display: 1.02; --leading-h2: 1.08; --leading-h3: 1.2; --leading-title: 1.1; --leading-body: 1.55; --leading-small: 1.4; --measure: 34em; /* Space */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.5rem; --space-6: 2rem; --space-7: 3rem; --space-8: 4rem; --space-9: 6rem; --section: clamp(6rem, 12vw, 11rem); --gutter: clamp(1.25rem, 5vw, 5rem); --gap: clamp(1rem, 2vw, 2rem); --container: 90rem; /* 1440px */ /* Shape */ --hairline: 1px; --radius: 0; --radius-sm: 2px; /* Motion */ --ease: cubic-bezier(0.2, 0, 0, 1); --dur-fast: 180ms; --dur: 240ms; --dur-slow: 320ms; --dur-hero: 1400ms; /* Chrome */ --header-height: 4.5rem; /* Focus */ --focus-width: 2px; --focus-offset: 3px; } /* Self-hosted Inter Tight, variable, latin + latin-ext. */ @font-face { font-family: 'Inter Tight'; font-style: normal; font-weight: 100 900; font-display: swap; src: url('../public/fonts/inter-tight-latin-wght-normal.woff2') format('woff2-variations'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @font-face { font-family: 'Inter Tight'; font-style: normal; font-weight: 100 900; font-display: swap; src: url('../public/fonts/inter-tight-latin-ext-wght-normal.woff2') format('woff2-variations'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* Reset */ *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } [id] { scroll-margin-top: var(--header-height); } body { min-height: 100dvh; background: var(--paper); color: var(--ink); font-family: var(--font-sans); font-size: var(--step-body); line-height: var(--leading-body); font-weight: var(--weight-regular); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; font-feature-settings: 'ss01' off, 'cv11' on; } img, picture, svg, video { display: block; max-width: 100%; } img { height: auto; } input, button, textarea, select { font: inherit; color: inherit; } button { background: none; border: 0; padding: 0; cursor: pointer; } ul[role='list'], ol[role='list'] { list-style: none; padding: 0; } a { color: inherit; text-decoration-color: currentColor; text-underline-offset: 0.14em; text-decoration-thickness: from-font; } h1, h2, h3, h4 { font-weight: var(--weight-medium); overflow-wrap: break-word; } p { overflow-wrap: break-word; } /* Focus: one ring, everywhere. */ :focus-visible { outline: var(--focus-width) solid currentColor; outline-offset: var(--focus-offset); border-radius: var(--radius-sm); } :focus:not(:focus-visible) { outline: none; } /* Type scale */ .display { font-size: var(--step-display); font-weight: var(--weight-medium); letter-spacing: var(--track-display); line-height: var(--leading-display); text-wrap: balance; } .h2 { font-size: var(--step-h2); font-weight: var(--weight-medium); letter-spacing: var(--track-h2); line-height: var(--leading-h2); text-wrap: balance; } .h3 { font-size: var(--step-h3); font-weight: var(--weight-medium); letter-spacing: var(--track-h3); line-height: var(--leading-h3); text-wrap: balance; } .body { font-size: var(--step-body); line-height: var(--leading-body); } .small { font-size: var(--step-small); line-height: var(--leading-small); } .muted { color: var(--ink-muted); } /* An eyebrow is sentence case, muted, small. Never all caps. */ .eyebrow { font-size: var(--step-small); line-height: var(--leading-small); color: var(--ink-muted); font-weight: var(--weight-regular); } /* Primitives */ .container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); } .grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--gap); row-gap: var(--space-7); } .section { padding-block: var(--section); } .section--tight { padding-block: calc(var(--section) * 0.6); } /* A page head: full air above, less below, so the content follows the title. */ .section--intro { padding-block: var(--section) calc(var(--section) * 0.4); } .measure { max-width: var(--measure); } /* Night surface */ .night { background: var(--night); color: var(--ink-on-night); --ink: var(--ink-on-night); --ink-muted: var(--ink-muted-on-night); --line: var(--line-on-night); } /* Hairline rules carry information: they separate, they don't decorate. */ .rule { border: 0; border-top: var(--hairline) solid var(--line); } /* Links and buttons work through underline, weight and surface. */ .link { display: inline-block; font-weight: var(--weight-medium); text-decoration: underline; text-decoration-thickness: var(--hairline); text-underline-offset: 0.2em; transition: text-underline-offset var(--dur-fast) var(--ease); } .link:hover { text-underline-offset: 0.3em; } .button { display: inline-block; padding: var(--space-3) var(--space-5); background: var(--ink); color: var(--paper); font-weight: var(--weight-medium); text-decoration: none; line-height: var(--leading-small); border-radius: var(--radius); transition: background var(--dur-fast) var(--ease); } .button:hover { background: var(--ink-muted); } .button--small { padding: var(--space-2) var(--space-4); font-size: var(--step-small); } .night .button { background: var(--paper); color: var(--night); } .night .button:hover { background: var(--paper-deep); } /* Prose: long-form text */ .prose { max-width: var(--measure); } .prose > * + * { margin-top: var(--space-5); } .prose h2 { font-size: var(--step-h3); letter-spacing: var(--track-h3); line-height: var(--leading-h3); margin-top: var(--space-8); } .prose h3 { font-size: var(--step-body); margin-top: var(--space-7); } .prose ul, .prose ol { padding-left: 1.2em; } .prose li + li { margin-top: var(--space-3); } .prose a { text-decoration: underline; text-decoration-thickness: var(--hairline); text-underline-offset: 0.2em; } .prose strong { font-weight: var(--weight-medium); } .prose blockquote { padding-left: var(--space-5); border-left: var(--hairline) solid var(--line); color: var(--ink-muted); } .prose img { width: 100%; } .prose figcaption { margin-top: var(--space-3); font-size: var(--step-small); color: var(--ink-muted); } /* Images */ .img-cover { width: 100%; height: 100%; object-fit: cover; } .img-doc { filter: saturate(0.55) contrast(1.02); } .img-mono { filter: grayscale(1) contrast(1.04); } /* Portraits were shot on light grey; multiply lets the paper carry them like a print. */ .img-print { mix-blend-mode: multiply; } /* Skip link */ .skip-link { position: absolute; left: var(--gutter); top: var(--space-3); transform: translateY(-200%); padding: var(--space-2) var(--space-3); background: var(--ink); color: var(--paper); z-index: 100; } .skip-link:focus { transform: none; } .visually-hidden { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } /* Motion off. No exceptions. */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }