@import 'tailwindcss'; /* ------------------------------------------------------------------ */ /* Fonts — Geist Sans + Geist Mono (self-hosted, .woff2) */ /* ------------------------------------------------------------------ */ @font-face { font-family: 'Geist'; font-style: normal; font-weight: 100 900; font-display: swap; src: url('/fonts/Geist-Variable.woff2') format('woff2-variations'); } @font-face { font-family: 'Geist Mono'; font-style: normal; font-weight: 100 900; font-display: swap; src: url('/fonts/GeistMono-Variable.woff2') format('woff2-variations'); } /* ------------------------------------------------------------------ */ /* Material Symbols (variable) — used for the icon set */ /* Add new icons in markup as */ /* ------------------------------------------------------------------ */ .material-symbols-outlined { font-family: 'Material Symbols Outlined'; font-weight: normal; font-style: normal; font-size: 24px; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; word-wrap: normal; direction: ltr; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24; } .material-symbols-outlined.fill-1 { font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; } /* ------------------------------------------------------------------ */ /* Design tokens — lifted from .opencode/stitch/DESIGN.md */ /* ------------------------------------------------------------------ */ @theme { /* surfaces */ --color-background: #ffffff; --color-surface: #ffffff; --color-surface-dim: #f9fafb; --color-surface-raised: #f9fafb; --color-surface-container-low: #ffffff; --color-surface-container: #f9fafb; --color-surface-container-high: #f3f4f6; --color-surface-container-highest: #f3f4f6; --color-surface-variant: #f3f4f6; --color-border-subtle: #e5e7eb; --color-outline: #d1d5db; --color-outline-variant: #e5e7eb; /* text */ --color-on-surface: #111827; --color-on-surface-variant: #4b5563; --color-on-background: #111827; --color-text-secondary: #4b5563; --color-text-tertiary: #6b7280; --color-inverse-surface: #111827; --color-inverse-on-surface: #ffffff; /* brand */ --color-primary: #318db8; --color-primary-container: #dcf0fa; --color-on-primary: #ffffff; --color-on-primary-container: #001e2c; --color-accent-blue: #318db8; --color-accent-gold: #eab308; /* secondary */ --color-secondary: #4b5563; --color-on-secondary: #ffffff; --color-secondary-container: #f3f4f6; --color-on-secondary-container: #4b5563; /* tertiary */ --color-tertiary: #ffb95f; --color-on-tertiary: #ffffff; /* status */ --color-error: #ef4444; --color-on-error: #ffffff; --color-success: #10b981; /* radius */ --radius-sm: 0.25rem; --radius-md: 0.5rem; --radius-lg: 0.75rem; --radius-xl: 0.75rem; --radius-2xl: 1rem; --radius-full: 9999px; /* type */ --font-sans: 'Geist', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; --font-display: 'Geist', ui-sans-serif, system-ui, sans-serif; --font-mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace; --text-display-lg: 48px; --text-display-lg--line-height: 1.1; --text-display-lg--letter-spacing: -0.04em; --text-display-lg--font-weight: 700; --text-headline-lg: 32px; --text-headline-lg--line-height: 1.2; --text-headline-lg--letter-spacing: -0.02em; --text-headline-lg--font-weight: 600; --text-headline-md: 24px; --text-headline-md--line-height: 1.3; --text-headline-md--letter-spacing: -0.01em; --text-headline-md--font-weight: 600; --text-body-lg: 18px; --text-body-lg--line-height: 1.6; --text-body-md: 16px; --text-body-md--line-height: 1.5; --text-label-md: 14px; --text-label-md--line-height: 1; --text-label-md--letter-spacing: 0.02em; --text-label-md--font-weight: 500; --text-code: 14px; --text-code--line-height: 1.6; /* spacing (4px baseline) */ --spacing-gutter: 24px; --spacing-margin-mobile: 16px; --spacing-margin-desktop: 40px; --spacing-section: 80px; --spacing-xxl: 80px; /* containers */ --container-site: 1440px; --container-article: 720px; --container-reading-lane: 800px; } /* ------------------------------------------------------------------ */ /* Base layer */ /* ------------------------------------------------------------------ */ @layer base { html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; background-color: var(--color-background); color: var(--color-on-surface); font-family: var(--font-sans); scroll-behavior: smooth; } body { background-color: var(--color-background); color: var(--color-on-surface); font-size: var(--text-body-md); line-height: var(--text-body-md--line-height); min-height: 100dvh; overflow-x: hidden; } ::selection { background-color: color-mix(in oklab, var(--color-primary) 20%, transparent); } :focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; border-radius: 2px; } a { color: inherit; } img, video, svg { max-width: 100%; height: auto; } } /* ------------------------------------------------------------------ */ /* Utilities (component classes referenced across pages) */ /* ------------------------------------------------------------------ */ @layer components { .hairline { border: 1px solid var(--color-border-subtle); } .hairline-hover { border: 1px solid var(--color-border-subtle); transition: border-color 0.2s ease; } .hairline-hover:hover { border-color: var(--color-primary); } .mask-fade-b { mask-image: linear-gradient(to bottom, black 80%, transparent 100%); -webkit-mask-image: linear-gradient(to bottom, black 80%, transparent 100%); } .glass-nav { background-color: color-mix(in oklab, var(--color-background) 80%, transparent); backdrop-filter: saturate(180%) blur(12px); -webkit-backdrop-filter: saturate(180%) blur(12px); } .grid-noise { background-image: linear-gradient(var(--color-border-subtle) 1px, transparent 1px), linear-gradient(90deg, var(--color-border-subtle) 1px, transparent 1px); background-size: 40px 40px; } .text-balance { text-wrap: balance; } .scrollbar-none { scrollbar-width: none; -ms-overflow-style: none; } .scrollbar-none::-webkit-scrollbar { display: none; } } /* ------------------------------------------------------------------ */ /* Reduced motion */ /* ------------------------------------------------------------------ */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }