@charset "UTF-8";
/* Stumble/jiggle animation used by both .project-title (home) and
   .page-title / .varied-letters (note pages). Lives in custom.scss
   because that's loaded on every page; keeps the keyframes definition
   available wherever the animation is referenced. */
@keyframes stumble {
  0%, 100% {
    transform: translate(0, var(--scroll-baseline, 0)) rotate(0deg); }
  25% {
    transform: translate(var(--stumble-x1, 2px), calc(var(--scroll-baseline, 0) + var(--stumble-y1, -3px))) rotate(var(--stumble-r1, 2deg)); }
  50% {
    transform: translate(var(--stumble-x2, -3px), calc(var(--scroll-baseline, 0) + var(--stumble-y2, 2px))) rotate(var(--stumble-r2, -3deg)); }
  75% {
    transform: translate(var(--stumble-x3, 1px), calc(var(--scroll-baseline, 0) + var(--stumble-y3, -2px))) rotate(var(--stumble-r3, 1deg)); } }

/* Self-hosted fonts — replaces the Google Fonts CSS link to eliminate
   render-blocking round-trips and the Poiret One swap-induced CLS. */
@font-face {
  font-family: 'Inconsolata';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url("/fonts/inconsolata-latin.woff2") format("woff2"); }

@font-face {
  font-family: 'Poiret One';
  font-style: normal;
  font-weight: 400;
  /* Was "optional" to suppress CLS, but self-hosted + preloaded fonts
       arrive fast enough that "swap" renders the real font on every load
       without a perceptible layout shift. "optional" was locking the
       fallback on complex pages (home) whose first-paint happened before
       the woff2 arrived. */
  font-display: swap;
  src: url("/fonts/poiret-one-latin.woff2") format("woff2"); }

:root {
  --core: #29cbfd;
  --background: #f9feff;
  --background-tint: #f0fafc;
  /* Darkened from #1f8fb1 to #186f89 so link text hits WCAG 4.5:1 on the
       white --background (#f9feff) and the light --container (#e9f4f6). */
  --primary: #186f89;
  --primary-dark: #164e5f;
  --primary-soft: #5adbff;
  --container: #e9f4f6;
  --backlink-container: #e9f4f6;
  --container-dark: #dcf3f7;
  --soft: #e1e1e1;
  --text: #004c67da;
  --text-heavy: #003d53da;
  --accent: #ff4f00;
  --accent-soft: #ffcab2;
  --background-faded: #f9fefff1;
  --background-tint-faded: #f0fafcf4;
  --font-body: 'Inconsolata', monospace;
  --font-heading: 'Poiret One', sans-serif;
  --base-font-size: var(--step--1);
  --border-radius: var(--space-3xs);
  --big-border-radius: var(--space-s);
  --line-height: 1.6;
  --max-width: 1000px;
  --background-video-blur: 0px;
  --base-font-weight: 300;
  --background-video-opacity: 1; }

[saved-theme="dark"] {
  --core: #29cbfd;
  --background: #002c3a;
  --background-tint: #003645;
  --primary: #29cbfd;
  --primary-dark: #c5f1ff;
  --primary-soft: #5adbff;
  --container: #00495f;
  --backlink-container: #00495f;
  --container-dark: #005e7b;
  --soft: #116d88;
  /* Solid (no alpha) for WCAG 4.5:1 contrast on .backlink / .container backgrounds. */
  --text: #74dfff;
  --text-heavy: #b8edfd;
  --background-faded: #002c3ae7;
  --background-tint-faded: #003645ed;
  --accent: #ff4f00;
  --accent-soft: #8c2c00;
  --base-font-weight: 300;
  --line-height: 1.6;
  --background-video-opacity: 1; }
