/* Editorial base — opinionated typography + reset. We hand-set type rather than relying on Tailwind defaults so every text element is intentional. Fraunces opsz is wired to scale optically. */ @import './tokens.css'; *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 100%; text-size-adjust: 100%; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: var(--font-sans); font-size: var(--t-base); line-height: var(--lh-normal); color: var(--ink); background: var(--bg-paper); font-feature-settings: 'ss01', 'ss02', 'cv11'; letter-spacing: -0.005em; min-height: 100vh; } /* Subtle paper grain — barely visible, lifts the canvas */ body::before { content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 1; background-image: radial-gradient(circle at 20% 30%, rgba(27,24,19,0.012) 0, transparent 60%), radial-gradient(circle at 80% 70%, rgba(27,24,19,0.018) 0, transparent 60%); mix-blend-mode: multiply; } #app { position: relative; z-index: 2; min-height: 100vh; } /* Display headings — Fraunces with editorial spacing */ h1, h2, h3, h4 { font-family: var(--font-display); font-weight: 400; line-height: var(--lh-tight); letter-spacing: -0.02em; color: var(--ink); text-wrap: balance; font-variation-settings: 'opsz' 96, 'SOFT' 30, 'WONK' 0; } h1 { font-size: var(--t-5xl); font-variation-settings: 'opsz' 144, 'SOFT' 50, 'WONK' 0; letter-spacing: -0.035em; } h2 { font-size: var(--t-3xl); font-variation-settings: 'opsz' 96, 'SOFT' 30; letter-spacing: -0.025em; } h3 { font-size: var(--t-2xl); font-variation-settings: 'opsz' 60, 'SOFT' 20; letter-spacing: -0.018em; } h4 { font-size: var(--t-xl); font-variation-settings: 'opsz' 30; letter-spacing: -0.012em; } p { line-height: var(--lh-relaxed); text-wrap: pretty; } p + p { margin-top: var(--s-3); } a { color: var(--ink); text-decoration-color: var(--rule); text-decoration-thickness: 1px; text-underline-offset: 3px; transition: text-decoration-color var(--dur) var(--ease); } a:hover { text-decoration-color: var(--accent-sage); } /* Eyebrow / label — Fraunces small italic for editorial flavour */ .eyebrow { font-family: var(--font-display); font-style: italic; font-variation-settings: 'opsz' 30, 'WONK' 1; font-size: var(--t-sm); font-weight: 400; color: var(--ink-soft); letter-spacing: 0.01em; } /* Caption / meta — General Sans tight */ .meta { font-family: var(--font-sans); font-size: var(--t-xs); letter-spacing: 0.06em; text-transform: uppercase; font-weight: 500; color: var(--ink-muted); } /* Source citation chip */ .cite { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: -0.01em; color: var(--ink-muted); background: var(--bg-cream-alt); padding: 2px 6px; border-radius: var(--r-sm); word-break: break-all; } /* Hairline rule */ hr { border: 0; height: 1px; background: var(--rule); margin: 0; } hr.thick { background: var(--rule-strong); height: 1px; } /* Buttons */ button { font-family: inherit; font-size: inherit; cursor: pointer; border: none; background: none; color: inherit; } .btn { display: inline-flex; align-items: center; gap: var(--s-2); padding: 10px 18px; font-family: var(--font-sans); font-size: var(--t-sm); font-weight: 500; letter-spacing: 0.02em; color: var(--ink); background: transparent; border: 1px solid var(--rule-strong); border-radius: 999px; transition: all var(--dur) var(--ease); white-space: nowrap; } .btn:hover { background: var(--ink); color: var(--bg-paper); border-color: var(--ink); } .btn.is-primary { background: var(--ink); color: var(--bg-paper); border-color: var(--ink); } .btn.is-primary:hover { background: var(--accent-sage); border-color: var(--accent-sage); } .btn.is-quiet { border: 1px solid var(--rule); color: var(--ink-soft); } .btn.is-quiet:hover { background: var(--bg-cream-alt); color: var(--ink); border-color: var(--rule-strong); } /* Status pip */ .pip { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--ink-muted); } .pip.sage { background: var(--accent-sage); } .pip.ochre { background: var(--accent-ochre); } .pip.rust { background: var(--accent-rust); } .pip.faint { background: var(--rule-strong); } /* Page layout helpers */ .page { max-width: var(--col-full); margin: 0 auto; padding: 0 var(--s-7); } .page-narrow { max-width: var(--col-narrow); margin: 0 auto; padding: 0 var(--s-5); } .page-mid { max-width: var(--col-mid); margin: 0 auto; padding: 0 var(--s-5); } .page-wide { max-width: var(--col-wide); margin: 0 auto; padding: 0 var(--s-5); } /* Top-level fade for route changes */ .fade-enter-active, .fade-leave-active { transition: opacity var(--dur) var(--ease); } .fade-enter-from, .fade-leave-to { opacity: 0; } @media (max-width: 900px) { h1 { font-size: var(--t-3xl); } h2 { font-size: var(--t-2xl); } .page { padding: 0 var(--s-5); } } @media print { body { background: white; color: black; } body::before { display: none; } }