/* Route announcer */
	.astro-route-announcer {
		position: absolute;
		left: 0;
		top: 0;
		clip: rect(0 0 0 0);
		clip-path: inset(50%);
		overflow: hidden;
		white-space: nowrap;
		width: 1px;
		height: 1px;
	}.site-nav[data-astro-cid-wpvy4v7s] {
  padding: .75rem 0;
  position: sticky;
  top: 0;
  z-index: 100;
  background: #0b1120f2;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--color-border);
}

.nav-container[data-astro-cid-wpvy4v7s] {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 1.5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
}

.nav-brand[data-astro-cid-wpvy4v7s] {
  font-family: var(--font-mono);
  font-size: 1.1rem;
  color: var(--color-text);
  font-weight: 700;
  text-decoration: none;
  display: flex;
  align-items: center;
  gap: .5rem;
}

.nav-brand[data-astro-cid-wpvy4v7s]:hover {
  color: var(--color-accent);
}

.nav-brand[data-astro-cid-wpvy4v7s]:hover .nav-logo[data-astro-cid-wpvy4v7s] rect[data-astro-cid-wpvy4v7s] {
  opacity: 1;
}

.nav-logo[data-astro-cid-wpvy4v7s] {
  width: 1.25rem;
  height: 1.25rem;
  flex-shrink: 0;
  transition: filter .3s;
}

.nav-logo[data-astro-cid-wpvy4v7s] rect[data-astro-cid-wpvy4v7s] {
  transition: opacity .3s;
}

.nav-brand[data-astro-cid-wpvy4v7s]:hover .nav-logo[data-astro-cid-wpvy4v7s] {
  filter: drop-shadow(0 0 4px #38bdf880);
}

.nav-dot[data-astro-cid-wpvy4v7s] {
  color: var(--color-accent);
}

.nav-right[data-astro-cid-wpvy4v7s] {
  display: flex;
  align-items: center;
  gap: .75rem;
}

.nav-links[data-astro-cid-wpvy4v7s] {
  display: flex;
  gap: 1.5rem;
  align-items: center;
}

.nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s] {
  font-family: var(--font-sans);
  font-size: .95rem;
  font-weight: 500;
  color: var(--color-text-muted);
  text-decoration: none;
  padding: .25rem 0;
  border-bottom: 1px solid #0000;
  transition: color .2s, border-color .2s;
  letter-spacing: .01em;
}

.nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s]:hover {
  color: var(--color-accent);
}

.nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s].active {
  color: var(--color-accent);
  border-bottom-color: var(--color-accent);
}

.nav-blog-link[data-astro-cid-wpvy4v7s] {
  font-family: var(--font-mono) !important;
  font-size: .8rem !important;
  padding: .2rem .6rem !important;
  border: 1px solid var(--color-border) !important;
  border-radius: 4px !important;
  color: var(--color-accent) !important;
  transition: all .2s !important;
}

.nav-blog-link[data-astro-cid-wpvy4v7s]:hover {
  background: #38bdf814;
  border-color: var(--color-accent) !important;
}

.nav-arrow[data-astro-cid-wpvy4v7s] {
  font-size: .65rem;
}

.nav-toggle[data-astro-cid-wpvy4v7s] {
  display: none;
  background: none;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  padding: .4rem;
  cursor: pointer;
  width: 2rem;
  height: 2rem;
  align-items: center;
  justify-content: center;
}

.hamburger[data-astro-cid-wpvy4v7s], .hamburger[data-astro-cid-wpvy4v7s]:before, .hamburger[data-astro-cid-wpvy4v7s]:after {
  display: block;
  width: 1rem;
  height: 2px;
  background: var(--color-text);
  border-radius: 1px;
  transition: transform .2s, opacity .2s;
  position: relative;
}

.hamburger[data-astro-cid-wpvy4v7s]:before, .hamburger[data-astro-cid-wpvy4v7s]:after {
  content: "";
  position: absolute;
  left: 0;
  width: 100%;
}

.hamburger[data-astro-cid-wpvy4v7s]:before {
  top: -5px;
}

.hamburger[data-astro-cid-wpvy4v7s]:after {
  top: 5px;
}

.nav-toggle[data-astro-cid-wpvy4v7s][aria-expanded="true"] .hamburger[data-astro-cid-wpvy4v7s] {
  background: none;
}

.nav-toggle[data-astro-cid-wpvy4v7s][aria-expanded="true"] .hamburger[data-astro-cid-wpvy4v7s]:before {
  top: 0;
  transform: rotate(45deg);
}

.nav-toggle[data-astro-cid-wpvy4v7s][aria-expanded="true"] .hamburger[data-astro-cid-wpvy4v7s]:after {
  top: 0;
  transform: rotate(-45deg);
}

.lang-switch[data-astro-cid-wpvy4v7s] {
  display: flex;
  align-items: center;
  gap: .3rem;
}

.lang-globe[data-astro-cid-wpvy4v7s] {
  width: .9rem;
  height: .9rem;
  color: var(--color-accent);
  opacity: .6;
  flex-shrink: 0;
  margin-right: .15rem;
}

.lang-link[data-astro-cid-wpvy4v7s] {
  text-decoration: none;
  color: var(--color-text-muted);
  font-family: var(--font-mono) !important;
  font-size: .75rem !important;
  padding: .2rem .4rem !important;
  border-radius: 3px !important;
  border-bottom: none !important;
  letter-spacing: .05em !important;
}

.lang-link[data-astro-cid-wpvy4v7s].lang-active {
  background: #38bdf81a;
  color: var(--color-accent) !important;
}

.lang-link[data-astro-cid-wpvy4v7s]:not(.lang-active) {
  opacity: .5;
}

.lang-link[data-astro-cid-wpvy4v7s]:not(.lang-active):hover {
  opacity: 1;
  color: var(--color-accent) !important;
}

@media (width >= 769px) {
  .lang-switch[data-astro-cid-wpvy4v7s] {
    margin-left: .5rem;
    padding-left: 1rem;
    border-left: 1px solid var(--color-border);
  }
}

@media (width <= 768px) {
  .nav-container[data-astro-cid-wpvy4v7s] {
    padding: .5rem 1rem;
  }

  .nav-toggle[data-astro-cid-wpvy4v7s] {
    display: flex;
  }

  .nav-links[data-astro-cid-wpvy4v7s] {
    display: none;
    width: 100%;
    flex-direction: column;
    gap: 0;
    padding-top: .5rem;
    border-top: 1px solid var(--color-border);
    margin-top: .5rem;
  }

  .nav-links[data-astro-cid-wpvy4v7s].open {
    display: flex;
  }

  .nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s] {
    font-size: .9rem;
    padding: .6rem .5rem;
    border-bottom: 1px solid #3341554d;
    border-radius: 4px;
  }

  .nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s].active {
    background: #38bdf814;
    border-left: 2px solid var(--color-accent);
  }

  .nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s]:last-child {
    border-bottom: none;
  }

  .nav-links[data-astro-cid-wpvy4v7s] a[data-astro-cid-wpvy4v7s].active {
    color: var(--color-accent);
  }
}
.footer-ascii[data-astro-cid-jo6i4kqk] {
  display: block;
  text-align: center;
  font-family: var(--font-mono);
  font-size: .45rem;
  line-height: 1.1;
  color: var(--color-accent);
  opacity: .12;
  margin: 0 auto 1.5rem;
  user-select: none;
  overflow: hidden;
}

.site-footer[data-astro-cid-jo6i4kqk] {
  padding: 2rem 0;
  border-top: 1px solid var(--color-border);
}

.footer-container[data-astro-cid-jo6i4kqk] {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 1.5rem;
}

.footer-links[data-astro-cid-jo6i4kqk] {
  display: flex;
  justify-content: center;
  gap: 1.25rem;
  margin-bottom: 1rem;
}

.footer-links[data-astro-cid-jo6i4kqk] a[data-astro-cid-jo6i4kqk] {
  display: flex;
  align-items: center;
  opacity: .6;
  transition: opacity .2s;
}

.footer-links[data-astro-cid-jo6i4kqk] a[data-astro-cid-jo6i4kqk]:hover {
  opacity: 1;
}

.footer-nav[data-astro-cid-jo6i4kqk] {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: .6rem;
  margin-bottom: .85rem;
  font-family: var(--font-mono);
  font-size: .8rem;
}

.footer-nav[data-astro-cid-jo6i4kqk] a[data-astro-cid-jo6i4kqk] {
  color: var(--color-text-muted);
  text-decoration: none;
  transition: color .2s;
}

.footer-nav[data-astro-cid-jo6i4kqk] a[data-astro-cid-jo6i4kqk]:hover {
  color: var(--color-accent);
}

.site-footer[data-astro-cid-jo6i4kqk] p[data-astro-cid-jo6i4kqk] {
  color: var(--color-text-muted);
  font-size: .85rem;
  text-align: center;
}

.footer-meta[data-astro-cid-jo6i4kqk] {
  margin-top: .5rem;
  font-family: var(--font-mono);
  font-size: .75rem !important;
  color: var(--color-border) !important;
}

.footer-deploy[data-astro-cid-jo6i4kqk] {
  font-family: var(--font-mono);
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: .4rem;
  line-height: 1.4;
  margin-top: .8rem !important;
  font-size: .72rem !important;
  color: var(--color-text-muted) !important;
}

.footer-deploy[data-astro-cid-jo6i4kqk] .fd-key[data-astro-cid-jo6i4kqk] {
  opacity: .85;
}

.footer-deploy[data-astro-cid-jo6i4kqk] .fd-commit[data-astro-cid-jo6i4kqk] {
  color: var(--color-accent);
  text-decoration: none;
  border-bottom: 1px dotted #38bdf866;
}

.footer-deploy[data-astro-cid-jo6i4kqk] .fd-commit[data-astro-cid-jo6i4kqk]:hover {
  color: var(--color-accent-hover);
}

.footer-deploy[data-astro-cid-jo6i4kqk] .fd-sep[data-astro-cid-jo6i4kqk] {
  color: var(--color-border);
}

.footer-deploy[data-astro-cid-jo6i4kqk] .fd-colo[data-astro-cid-jo6i4kqk] {
  color: var(--color-text);
}

.scroll-top[data-astro-cid-jo6i4kqk] {
  position: fixed;
  bottom: 1.5rem;
  right: 1.5rem;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: #38bdf826;
  border: 1px solid #38bdf84d;
  color: var(--color-accent);
  font-size: 1.1rem;
  cursor: pointer;
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s, background .2s;
  z-index: 50;
  display: flex;
  align-items: center;
  justify-content: center;
}

.scroll-top[data-astro-cid-jo6i4kqk].visible {
  opacity: 1;
  pointer-events: auto;
}

.scroll-top[data-astro-cid-jo6i4kqk]:hover {
  background: #38bdf84d;
}
.cmdk {
    position: fixed; inset: 0; z-index: 100;
    background: rgba(2, 6, 23, 0.72);
    -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
    display: none; align-items: flex-start; justify-content: center; padding-top: 12vh;
  }
  .cmdk.open { display: flex; }
  .cmdk-box {
    width: min(90vw, 32rem);
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: 10px; overflow: hidden;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
  }
  .cmdk-input {
    width: 100%; padding: 1rem 1.1rem;
    background: transparent; border: none;
    border-bottom: 1px solid var(--color-border);
    color: var(--color-text); font-family: var(--font-mono); font-size: 1rem; outline: none;
  }
  .cmdk-list { list-style: none; margin: 0; padding: 0.4rem; max-height: 50vh; overflow-y: auto; }
  .cmdk-item {
    display: block; padding: 0.55rem 0.7rem; border-radius: 6px;
    color: var(--color-text-muted); font-family: var(--font-mono); font-size: 0.9rem;
  }
  .cmdk-item.active, .cmdk-item:hover { background: rgba(56, 189, 248, 0.12); color: var(--color-accent); }
  .cmdk-hint {
    padding: 0.5rem 0.9rem; border-top: 1px solid var(--color-border);
    font-family: var(--font-mono); font-size: 0.7rem; color: var(--color-text-muted); opacity: 0.7;
  }*,
  *::before,
  *::after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
  }

  /* JetBrains Mono is provided by the Astro Fonts API (<Font> in head) — same-origin,
     auto preload + optimized fallback metrics (no CLS). See astro.config fonts. */

  :root {
    /* Breach infusion (2026-07-21): background one notch deeper than the old
       slate-900 (#0f172a), deep terminal panels (--color-deep), and the h1/h2
       trailing dot switched to phosphor green — /breach's grammar, site-wide,
       while cyan stays the brand accent. */
    --color-bg: #0b1120;
    --color-deep: #020617;
    --color-surface: #1e293b;
    --color-border: #334155;
    --color-text: #e2e8f0;
    --color-text-muted: #94a3b8;
    --color-accent: #38bdf8;
    --color-accent-hover: #7dd3fc;
    --font-mono: var(--font-jetbrains-mono, 'JetBrains Mono', 'Fira Code', ui-monospace, monospace);
    --font-sans: system-ui, -apple-system, sans-serif;
    --max-width: 64rem;
    --color-ok: #22c55e;
    --color-warn: #eab308;
    --color-down: #ef4444;
    --color-dot: var(--color-ok);
  }

  /* Title dot as a SQUARE pixel — pixelium: a pixel is square, not the round
     "." glyph. The glyph goes transparent (keeps its advance width and stays
     in copy/paste) and a square is drawn over it, em-sized so it scales with
     every h1/h2. */
  h1 .dot, h2 .dot, .hc-title .hc-dot {
    position: relative;
    color: transparent;
  }
  /* Anchored to the LEFT edge of the span (where the "." ink sits) — the
     cursor ::after lives inside the same inline box, so centering would pull
     the square toward it and away from the last letter. */
  h1 .dot::before, h2 .dot::before, .hc-title .hc-dot::before {
    content: '';
    position: absolute;
    left: 0.04em;
    bottom: 0.09em;
    width: 0.15em;
    height: 0.15em;
    background: var(--color-dot);
  }

  /* Hero identity glitch: the square + cursor belong to “Claude” only — hidden
     while the name cycles through the other models (.flux / .hc-critic). */
  .hc-model.flux + .hc-dot::before, .hc-model.flux + .hc-dot::after,
  .hc-model.hc-critic + .hc-dot::before, .hc-model.hc-critic + .hc-dot::after {
    opacity: 0;
  }

  /* Terminal cursor after the page-title dot — the /breach "BREACH_" signature.
     h1 only: one blinking cursor per page (h2 dots stay green, no cursor). */
  h1 .dot::after, .hc-title .hc-dot::after {
    content: '_';
    color: var(--color-dot);
    margin-left: 0.24em;
    animation: dot-blink 1.1s steps(2) infinite;
  }
  @keyframes dot-blink { 50% { opacity: 0; } }
  @media (prefers-reduced-motion: reduce) {
    h1 .dot::after, .hc-title .hc-dot::after { animation: none; }
  }

  /* View transitions: the chrome (nav, footer) gets its own named
     transition group so it reads as stationary while the page content
     cross-fades. ClientRouter disables all animation under reduced motion. */
  .site-nav { view-transition-name: site-nav; }
  .site-footer { view-transition-name: site-footer; }

  html {
    font-family: var(--font-sans);
    background-color: var(--color-bg);
    color: var(--color-text);
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
  }

  body {
    min-height: 100vh;
  }

  a {
    color: var(--color-accent);
    text-decoration: none;
  }

  a:hover {
    color: var(--color-accent-hover);
  }

  code {
    font-family: var(--font-mono);
    font-size: 0.9em;
    background: var(--color-surface);
    padding: 0.15em 0.4em;
    border-radius: 4px;
  }

  /* Scroll reveal — pure CSS, zero JS.
     Baseline is VISIBLE so that no-JS, unsupported browsers and reduced-motion
     users always see content (never hidden). The scroll-driven fade-up is layered
     on only where `animation-timeline` is supported and motion is welcome. */
  @media (prefers-reduced-motion: no-preference) {
    @supports (animation-timeline: view()) {
      .reveal {
        opacity: 0;
        transform: translateY(1.5rem);
        animation: reveal-in linear both;
        animation-timeline: view();
        animation-range: entry 5% entry 45%;
      }

      @keyframes reveal-in {
        to {
          opacity: 1;
          transform: translateY(0);
        }
      }
    }
  }

  /* Shared container */
  .container {
    max-width: var(--max-width);
    margin: 0 auto;
    padding: 0 1.5rem;
  }