@import "tailwindcss"; @import "./tokens.css"; /* ---- Base ---------------------------------------------------------------- */ * { box-sizing: border-box; } html { scroll-behavior: smooth; /* Offset for the sticky nav when jumping to #sections */ scroll-padding-top: 5rem; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } body { margin: 0; background: var(--bg); color: var(--text); font-family: var(--font-sans); font-size: var(--step-0); line-height: 1.65; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } h1, h2, h3, h4 { line-height: 1.1; font-weight: 700; letter-spacing: -0.02em; margin: 0; } a { color: var(--accent); text-decoration: none; } a:hover { text-decoration: underline; text-underline-offset: 3px; } :focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 3px; border-radius: 4px; } ::selection { background: var(--accent); color: var(--accent-ink); } img, svg { max-width: 100%; height: auto; display: block; } /* ---- Layout helpers ------------------------------------------------------ */ .container { width: 100%; max-width: var(--measure); margin-inline: auto; padding-inline: var(--space-5); } .section { padding-block: var(--space-9); position: relative; } .eyebrow { font-family: var(--font-mono); font-size: var(--step--1); letter-spacing: 0.22em; text-transform: uppercase; color: var(--accent); } .lead { font-size: var(--step-1); color: var(--text-dim); line-height: 1.6; } .mono { font-family: var(--font-mono); } /* ---- Buttons ------------------------------------------------------------- */ .btn { display: inline-flex; align-items: center; gap: 0.5rem; font-family: var(--font-mono); font-size: var(--step--1); letter-spacing: 0.02em; padding: 0.7rem 1.15rem; border-radius: var(--radius-sm); border: 1px solid var(--border-strong); color: var(--text); background: var(--surface); transition: border-color 0.2s var(--ease), transform 0.2s var(--ease), background 0.2s var(--ease), color 0.2s var(--ease); text-decoration: none; } .btn:hover { text-decoration: none; border-color: var(--accent-line); transform: translateY(-1px); } .btn--primary { background: var(--accent); color: var(--accent-ink); border-color: transparent; font-weight: 600; } .btn--primary:hover { background: var(--accent-strong); } /* ---- Cards / tags -------------------------------------------------------- */ .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); transition: border-color 0.25s var(--ease), transform 0.25s var(--ease); } .card:hover { border-color: var(--accent-line); } .tag { display: inline-block; font-family: var(--font-mono); font-size: 0.72rem; letter-spacing: 0.02em; color: var(--text-dim); background: var(--surface-2); border: 1px solid var(--border); border-radius: 999px; padding: 0.2rem 0.6rem; } .skip-link { position: absolute; left: -9999px; top: 0; z-index: 100; background: var(--accent); color: var(--accent-ink); padding: 0.6rem 1rem; border-radius: 0 0 var(--radius-sm) 0; } .skip-link:focus { left: 0; } /* ---- Prose (rendered markdown) ------------------------------------------ */ .prose { color: var(--text-dim); font-size: var(--step-0); line-height: 1.75; max-width: 70ch; } .prose > * + * { margin-top: var(--space-4); } .prose h2 { color: var(--text); font-size: var(--step-2); margin-top: var(--space-7); padding-top: var(--space-4); border-top: 1px solid var(--border); } .prose h2::before { content: "# "; color: var(--accent); font-family: var(--font-mono); font-weight: 400; } .prose h3 { color: var(--text); font-size: var(--step-1); margin-top: var(--space-6); } .prose strong { color: var(--text); font-weight: 600; } .prose a { text-decoration: underline; text-underline-offset: 3px; } .prose ul, .prose ol { padding-left: 1.3rem; display: grid; gap: 0.4rem; } .prose li::marker { color: var(--accent); } .prose blockquote { border-left: 2px solid var(--accent); padding-left: var(--space-4); color: var(--text); font-style: italic; } .prose code:not(pre code) { font-family: var(--font-mono); font-size: 0.85em; background: var(--surface-2); border: 1px solid var(--border); border-radius: 5px; padding: 0.1rem 0.4rem; } .prose pre { background: var(--surface) !important; border: 1px solid var(--border); border-radius: var(--radius-sm); padding: var(--space-4); overflow-x: auto; font-size: 0.85rem; line-height: 1.6; } .prose pre code { font-family: var(--font-mono); } /* Shiki dual-theme: dark is the default (dark-first / JS-off safe); light overrides when the theme is light. We keep our own
 background. */
.astro-code,
.astro-code span {
  color: var(--shiki-dark);
}
[data-theme="light"] .astro-code,
[data-theme="light"] .astro-code span {
  color: var(--shiki-light);
}

/* ---- Reveal-on-scroll (progressive enhancement) -------------------------- */
/* Default = visible (JS-off safe). The .reveal class is only added by JS when
   IntersectionObserver is supported AND motion is allowed. */
.reveal {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
}
.reveal.is-visible {
  opacity: 1;
  transform: none;
}
@media (prefers-reduced-motion: reduce) {
  .reveal {
    opacity: 1;
    transform: none;
    transition: none;
  }
}