:root { /* === TYPOGRAPHY SCALE (Augmented Fourth 1.414) === */ --font-size: 16px; --text-xs: 0.707rem; --text-sm: 0.84rem; --text-base: 1rem; --text-lg: 1.414rem; --text-xl: 2rem; --text-2xl: 2.828rem; --text-3xl: 4rem; --text-4xl: 5.657rem; --text-5xl: 8rem; /* === FONT FAMILIES (set by next/font CSS vars in layout.tsx) === */ --font-heading: var(--font-fraunces), serif; --font-body: var(--font-public-sans), sans-serif; /* === FONT WEIGHTS === */ --font-weight-heading: 900; --font-weight-body: 600; --font-weight-normal: 400; /* === LINE HEIGHT === */ --line-height-tight: 1.2; --line-height-normal: 1.5; /* === FRAUNCES VARIABLE AXES === */ --fraunces-wonk: 1; --fraunces-soft: 0; /* === COLOR PALETTE: 2-color system === */ --cream: #f4f0e8; --blue: #041cf3; /* === SEMANTIC COLORS === */ --background: var(--cream); --foreground: var(--blue); --card: var(--cream); --card-foreground: var(--blue); --primary: var(--blue); --primary-foreground: var(--cream); --secondary: var(--cream); --secondary-foreground: var(--blue); --muted: var(--cream); --muted-foreground: rgba(4, 28, 243, 0.5); --accent: var(--blue); --accent-foreground: var(--cream); --destructive: var(--blue); --border: var(--blue); --ring: var(--blue); /* === SPACING (8pt Linear Scale) === */ --space-0: 0; --space-1: 0.5rem; --space-2: 1rem; --space-3: 1.5rem; --space-4: 2rem; --space-5: 2.5rem; --space-6: 3rem; --space-7: 3.5rem; --space-8: 4rem; --space-10: 5rem; --space-12: 6rem; --space-16: 8rem; --space-20: 10rem; /* === BORDERS === */ --border-width: 3px; --radius: 0px; /* === BRUTALIST SHADOWS === */ --shadow-brutal-xs: 1px 1px 0 var(--blue); --shadow-brutal-sm: 3px 3px 0 var(--blue); --shadow-brutal: 5px 5px 0 var(--blue); --shadow-brutal-md: 7px 7px 0 var(--blue); --shadow-brutal-lg: 8px 8px 0 var(--blue); --shadow-brutal-xl: 10px 10px 0 var(--blue); --shadow-brutal-2xl: 12px 12px 0 var(--blue); /* === GRID === */ --grid-gap: var(--space-3); --section-content-width: 56rem; /* === ANIMATION === */ --ease-default: ease; --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); --ease-decelerate: cubic-bezier(0.25, 0, 0, 1); --ease-micro: cubic-bezier(0.22, 1, 0.36, 1); --duration-fast: 100ms; --duration-normal: 150ms; --duration-slow: 350ms; --duration-spring: 220ms; } @theme inline { --font-heading: var(--font-fraunces); --font-body: var(--font-public-sans); --color-cream: var(--cream); --color-blue: var(--blue); --color-background: var(--background); --color-foreground: var(--foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-ring: var(--ring); --color-border: var(--border); --radius-sm: var(--radius); --radius-md: var(--radius); --radius-lg: var(--radius); --container-section: var(--section-content-width); --shadow-brutal-xs: var(--shadow-brutal-xs); --shadow-brutal-sm: var(--shadow-brutal-sm); --shadow-brutal: var(--shadow-brutal); --shadow-brutal-md: var(--shadow-brutal-md); --shadow-brutal-lg: var(--shadow-brutal-lg); --shadow-brutal-xl: var(--shadow-brutal-xl); --shadow-brutal-2xl: var(--shadow-brutal-2xl); } @layer base { * { @apply border-border; } html { font-size: var(--font-size); } body { @apply bg-background text-foreground; font-family: var(--font-body); font-weight: var(--font-weight-body); line-height: var(--line-height-tight); overflow-x: hidden; } /* Subtle blue-tinted grain on parchment */ body::before { content: ""; position: fixed; inset: 0; background-image: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(4, 28, 243, 0.015) 2px, rgba(4, 28, 243, 0.015) 4px ), repeating-linear-gradient( 90deg, transparent, transparent 2px, rgba(4, 28, 243, 0.015) 2px, rgba(4, 28, 243, 0.015) 4px ); opacity: 0.6; display: block; pointer-events: none; z-index: 1; } h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading); font-weight: var(--font-weight-heading); line-height: var(--line-height-tight); font-variation-settings: "WONK" var(--fraunces-wonk), "SOFT" var(--fraunces-soft); color: var(--blue); } h1 { font-size: var(--text-4xl); } h2 { font-size: var(--text-3xl); } h3 { font-size: var(--text-2xl); } h4 { font-size: var(--text-xl); } h5 { font-size: var(--text-lg); } p { font-family: var(--font-body); font-size: var(--text-base); font-weight: var(--font-weight-body); color: var(--blue); } a { color: var(--blue); text-decoration: none; border-bottom: 2px solid var(--blue); transition: all 0.2s; } a:hover { border-bottom-width: 4px; } blockquote { font-family: var(--font-heading); font-size: var(--text-xl); border-left: var(--border-width) solid var(--blue); padding-left: var(--space-4); margin: var(--space-6) 0; } } /* Button elevation transition — only transform animates; shadow snaps instantly */ .btn-transition { transition: transform 0.13s var(--ease-micro); } /* Brutalist utility classes */ .brutal-shadow { box-shadow: var(--shadow-brutal); } .brutal-shadow-sm { box-shadow: var(--shadow-brutal-sm); } .brutal-shadow-lg { box-shadow: var(--shadow-brutal-lg); } .brutal-border { border: var(--border-width) solid var(--blue); } .brutal-border-top { border-top: var(--border-width) solid var(--blue); } .brutal-border-bottom { border-bottom: var(--border-width) solid var(--blue); } .brutal-border-left { border-left: var(--border-width) solid var(--blue); } .brutal-border-right { border-right: var(--border-width) solid var(--blue); } /* Editorial rich-text typography */ .rich-text { max-width: 65ch; line-height: 1.65; font-feature-settings: "onum"; hanging-punctuation: first last; text-wrap: pretty; hyphens: auto; } .rich-text p + p { margin-top: 1.2em; } /* Cross-section view transition (navigation between sections) */ ::view-transition-old(section-content) { animation-name: section-fade-out; animation-duration: var(--duration-normal); animation-timing-function: var(--ease-default); animation-fill-mode: both; } ::view-transition-new(section-content) { animation-name: section-fade-in; animation-duration: var(--duration-spring); animation-timing-function: var(--ease-spring); animation-fill-mode: both; } @keyframes section-fade-out { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-8px); } } @keyframes section-fade-in { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }