257 lines
7.1 KiB
CSS
257 lines
7.1 KiB
CSS
@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 <span class="material-symbols-outlined"> */
|
|
/* ------------------------------------------------------------------ */
|
|
.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;
|
|
}
|
|
}
|