/* beavr.css — beavr brand skin.
 *
 * The single stylesheet for the beavr brand. Defines the
 * colour palette (warm tan #A67B5B on near-black #26211D), the
 * design tokens (--space-*, --text-*, --radius, --font-*,
 * --max-w-page), the sidebar + topbar + command-palette layout,
 * the tool-page chrome (.site-main.tool-page, .tool-h1, .tool-lede),
 * and the global element styles.
 *
 * All values are defined as CSS custom properties under
 * [data-brand="beavr"] so the project can host other brands
 * in the future by swapping the data attribute and the
 * token block.
 *
 * No JS dependency: the palette + theme toggle scripts are
 * inlined by the Astro components (Sidebar, Topbar, CommandPalette)
 * and they all read data-* attributes from <html>.
 */

/* ============================================================
   Beavr tokens
   ============================================================ */

:root {
  /* Typography — system stack first, fall back to webfonts later */
  --beavr-font-sans: -apple-system, BlinkMacSystemFont, "Inter",
    "SF Pro Text", "Segoe UI", Roboto, system-ui, sans-serif;
  --beavr-font-mono: "JetBrains Mono", "SF Mono", "Menlo",
    "Consolas", "Liberation Mono", monospace;

  /* Motion */
  --beavr-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
  --beavr-t-fast: 120ms;
  --beavr-t: 200ms;
  --beavr-t-slow: 360ms;

  /* Radii */
  --beavr-r-sm: 6px;
  --beavr-r: 10px;
  --beavr-r-lg: 14px;
  --beavr-r-xl: 20px;
}

[data-brand="beavr"] {
  /* Light mode — warm off-white surface, tan accent */
  --color-bg: #f7f4f0;            /* warm cream */
  --color-bg-elevated: #ffffff;   /* cards, inputs */
  --color-bg-sunken: #efe9e1;     /* subtle sunken */
  --color-fg: #26211d;            /* ink, near-black */
  --color-fg-muted: #6b5f54;
  --color-fg-faint: #a89c8e;
  --color-border: #e2d9cc;
  --color-border-strong: #c9bca9;
  --color-accent: #a67b5b;        /* warm tan — beavr */
  --color-accent-fg: #ffffff;
  --color-accent-2: #8a6246;      /* deeper tan, gradients */
  --color-terminal: #6b8e3d;      /* olive / sage — terminal vibe */
  --color-danger: #b3261e;
  --color-code-bg: #efe9e1;

  /* Shared design tokens (referenced as `var(--space-N)`, `var(--text-…)`,
     `var(--radius)` etc. throughout the per-tool inline styles). Keeping
     them here means the spacing scale, type scale, and corner radius are
     one consistent system rather than 26 different copies. */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --text-sm: 13px;
  --text-base: 15px;
  --text-lg: 18px;
  --text-xl: 22px;
  --text-2xl: 28px;
  --radius: var(--beavr-r);
  --font-sans: var(--beavr-font-sans);
  --font-mono: var(--beavr-font-mono);
  --leading: 1.55;
  --max-w-page: 1100px;
  --color-warning: #b87a1a;
  --color-success: #1b7f3a;

  /* Shadows tinted with the brand */
  --beavr-shadow-sm: 0 1px 2px rgba(38, 33, 29, 0.06);
  --beavr-shadow: 0 4px 14px rgba(38, 33, 29, 0.08),
                  0 1px 2px rgba(38, 33, 29, 0.05);
  --beavr-shadow-lg: 0 24px 60px rgba(38, 33, 29, 0.16),
                     0 2px 6px rgba(38, 33, 29, 0.08);
}

[data-brand="beavr"][data-theme="dark"] {
  --color-bg: #1a1612;            /* warm near-black */
  --color-bg-elevated: #26211d;   /* brand near-black */
  --color-bg-sunken: #14110e;
  --color-fg: #f4ede4;            /* warm off-white */
  --color-fg-muted: #a89c8e;
  --color-fg-faint: #6b5f54;
  --color-border: #3a322a;
  --color-border-strong: #4a4138;
  --color-accent: #c89976;        /* tan lightens in dark mode */
  --color-accent-fg: #1a1612;
  --color-accent-2: #a67b5b;
  --color-terminal: #9bbc5b;
  --color-danger: #f28b82;
  --color-code-bg: #14110e;

  --beavr-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
  --beavr-shadow: 0 4px 14px rgba(0, 0, 0, 0.4),
                  0 1px 2px rgba(0, 0, 0, 0.3);
  --beavr-shadow-lg: 0 24px 60px rgba(0, 0, 0, 0.55),
                     0 2px 6px rgba(0, 0, 0, 0.4);

  --color-warning: #d99e30;
  --color-success: #2ea84a;
}

@media (prefers-color-scheme: dark) {
  [data-brand="beavr"]:not([data-theme]) {
    --color-bg: #1a1612;
    --color-bg-elevated: #26211d;
    --color-bg-sunken: #14110e;
    --color-fg: #f4ede4;
    --color-fg-muted: #a89c8e;
    --color-fg-faint: #6b5f54;
    --color-border: #3a322a;
    --color-border-strong: #4a4138;
    --color-accent: #c89976;
    --color-accent-fg: #1a1612;
    --color-accent-2: #a67b5b;
    --color-terminal: #9bbc5b;
    --color-danger: #f28b82;
    --color-code-bg: #14110e;

    --beavr-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
    --beavr-shadow: 0 4px 14px rgba(0, 0, 0, 0.4),
                    0 1px 2px rgba(0, 0, 0, 0.3);
    --beavr-shadow-lg: 0 24px 60px rgba(0, 0, 0, 0.55),
                       0 2px 6px rgba(0, 0, 0, 0.4);
  }
}

/* ============================================================
   App shell (sidebar + topbar + main)
   ============================================================ */

[data-brand="beavr"] body {
  font-family: var(--beavr-font-sans);
  background: var(--color-bg);
  color: var(--color-fg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* Safety net for any wide content (long URLs, code blocks,
     large SVGs) that might otherwise push a horizontal scrollbar
     on narrow viewports. Content is still scrollable inside its
     own container; the body itself never scrolls horizontally. */
  overflow-x: hidden;
}

[data-brand="beavr"] .app {
  display: grid;
  grid-template-columns: 260px 1fr;
  grid-template-rows: 56px 1fr;
  grid-template-areas:
    "sidebar topbar"
    "sidebar main";
  min-height: 100vh;
}

/* Marketing pages: no sidebar, full-width main column, wider. */
[data-brand="beavr"] .app--no-sidebar {
  grid-template-columns: 1fr;
  grid-template-areas:
    "topbar"
    "main";
}
[data-brand="beavr"] .main--prose {
  max-width: 720px;
}

/* Tablet landscape / small desktop: 881–1023px.
   Sidebar shrinks to 220px, the breadcrumb can ellipsize,
   the search label collapses to a magnifier-only icon to
   make room. This sits BETWEEN the full desktop layout
   (>=1024px) and the off-canvas drawer (<=880px), so the
   page is usable in landscape on a phone, on small laptops,
   and on portrait tablets without ever needing the drawer. */
@media (max-width: 1023px) and (min-width: 881px) {
  [data-brand="beavr"] .app {
    grid-template-columns: 220px 1fr;
  }
  [data-brand="beavr"] .sidebar {
    padding: 12px 8px 20px;
  }
  [data-brand="beavr"] .sidebar .brand {
    padding: 4px 6px 14px;
  }
  [data-brand="beavr"] .sidebar .brand .name { font-size: 13px; }
  [data-brand="beavr"] .sidebar .brand .tag { display: none; }
  [data-brand="beavr"] .nav-group-label {
    font-size: 10px;
    padding: 0 6px;
  }
  [data-brand="beavr"] .nav-item a {
    padding: 5px 6px;
    font-size: 12px;
    gap: 8px;
  }
  [data-brand="beavr"] .nav-item .new { font-size: 8px; }
  [data-brand="beavr"] .topbar { padding: 0 14px; }
  [data-brand="beavr"] .topbar .crumbs { min-width: 0; flex: 1; }
  [data-brand="beavr"] .topbar .crumbs .mono {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
  }
  [data-brand="beavr"] .search-trigger {
    min-width: 0;
    width: 36px;
    height: 36px;
    padding: 0;
    justify-content: center;
  }
  [data-brand="beavr"] .search-trigger .label,
  [data-brand="beavr"] .search-trigger .kbd { display: none; }
  [data-brand="beavr"] .search-trigger .icon svg { width: 18px; height: 18px; }
  [data-brand="beavr"] .icon-btn { width: 36px; height: 36px; }
  [data-brand="beavr"] .main { padding: 28px 28px 64px; }
}
@media (max-width: 880px) {
  [data-brand="beavr"] .app {
    grid-template-columns: 1fr;
    grid-template-areas:
      "topbar"
      "main";
  }

  /* Sidebar becomes an off-canvas drawer.
     Default state: parked off-screen on the left, full-height,
     scrollable inside, with a slide-in transform triggered by
     a `data-mobile-open="true"` attribute set by the toggle. */
  [data-brand="beavr"] .sidebar {
    display: block;
    position: fixed;
    top: 0; left: 0; bottom: 0;
    width: min(86vw, 320px);
    z-index: 50;
    transform: translateX(-100%);
    transition: transform var(--beavr-t) var(--beavr-ease),
                box-shadow var(--beavr-t) var(--beavr-ease);
    box-shadow: none;
    border-right: 1px solid var(--color-border);
  }
  [data-brand="beavr"] .sidebar[data-mobile-open="true"] {
    transform: translateX(0);
    box-shadow: var(--beavr-shadow-lg);
  }

  /* Backdrop rendered as a sibling of the sidebar so it can
     fade in/out without affecting layout. */
  [data-brand="beavr"] .sidebar-backdrop {
    position: fixed; inset: 0;
    background: rgba(0, 0, 0, 0.32);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    z-index: 49;
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--beavr-t) var(--beavr-ease);
  }
  [data-brand="beavr"] .sidebar-backdrop[data-mobile-open="true"] {
    opacity: 1;
    pointer-events: auto;
  }

  /* Topbar gets tighter on mobile. */
  [data-brand="beavr"] .topbar {
    padding: 0 12px;
    gap: 8px;
  }
  [data-brand="beavr"] .topbar .crumbs {
    flex: 1;
    min-width: 0;
    overflow: hidden;
  }
  [data-brand="beavr"] .topbar .crumbs .mono {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* Hide search label and kbd on phone, keep just the icon button. */
  [data-brand="beavr"] .search-trigger {
    min-width: 0;
    width: 36px;
    height: 36px;
    padding: 0;
    justify-content: center;
  }
  [data-brand="beavr"] .search-trigger .label,
  [data-brand="beavr"] .search-trigger .kbd { display: none; }
  [data-brand="beavr"] .search-trigger .icon svg { width: 18px; height: 18px; }
  /* Bring back icon-btn size we shrank: keep the .icon-btn at 36. */
  [data-brand="beavr"] .icon-btn,
  [data-brand="beavr"] .search-trigger { width: 36px; height: 36px; }
}
/* === Footer === */
[data-brand="beavr"] .site-footer {
  max-width: none;
  margin: 0;
  text-align: center;
  padding: 24px;
  border-top: 1px solid var(--color-border);
  color: var(--color-fg-muted);
  font-size: 13px;
  background: var(--color-bg-elevated);
}
[data-brand="beavr"] .site-footer a { color: inherit; }
@media (max-width: 720px) {
  [data-brand="beavr"] .topbar { padding: 0 10px; gap: 6px; }
  [data-brand="beavr"] .topbar .top-actions { gap: 6px; }
  [data-brand="beavr"] .main { padding: 20px 16px 60px; }
  [data-brand="beavr"] .hero h1 { font-size: 28px; letter-spacing: -0.02em; }
  [data-brand="beavr"] .hero p.lede { font-size: 15px; }
  [data-brand="beavr"] .hero .prompt-line { font-size: 11px; }
  [data-brand="beavr"] .search-card { padding: 14px; }
  [data-brand="beavr"] .search-input { height: 48px; }
  [data-brand="beavr"] .search-input input { font-size: 15px; }
  /* Hide the "↵ to open" chip — at 375px it pushes the input
     too narrow. The Enter hint is redundant on touch devices. */
  [data-brand="beavr"] .search-input .kbd { display: none; }
  [data-brand="beavr"] .cat-block { margin-top: 32px; }
  [data-brand="beavr"] .cat-head h2 { font-size: 13px; }
  [data-brand="beavr"] .principles {
    margin-top: 36px !important;
    padding: 18px !important;
  }
  /* Footer: stack the legal line and the link row vertically
     on small screens. The padding-bottom uses max() so:
       - iOS Safari (viewport-fit=cover): respects safe-area-inset-bottom
         which can be 20-34px on notched devices.
       - Android Chrome + older WebKit: env() resolves to 0px,
         so max() falls back to 56px to clear the gesture-bar
         + system bar height.
     Without this fallback Android covers the footer with its
     gesture pill (verified on Chrome 120+). */
  [data-brand="beavr"] .site-footer {
    padding: 20px 16px calc(20px + max(env(safe-area-inset-bottom), 36px));
  }
  [data-brand="beavr"] .site-footer small { display: block; line-height: 1.6; }
  [data-brand="beavr"] .site-footer br + a { margin-left: 0; }
  [data-brand="beavr"] .cat-section { margin-top: 20px; }
}
@media (max-width: 600px) {
  [data-brand="beavr"] .tool-grid { grid-template-columns: 1fr; gap: 6px; }
  [data-brand="beavr"] .tool { padding: 10px 12px; gap: 10px; }
  [data-brand="beavr"] .tool .glyph { width: 28px; height: 28px; font-size: 12px; }
  [data-brand="beavr"] .tool .name { font-size: 13px; }
  [data-brand="beavr"] .tool .desc { font-size: 11px; }
  [data-brand="beavr"] .palette-card { width: 96vw; }
  [data-brand="beavr"] .palette { padding-top: 6vh; }
}

/* ===== Topbar ===== */
[data-brand="beavr"] .topbar {
  grid-area: topbar;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 20px;
  background: color-mix(in srgb, var(--color-bg) 88%, transparent);
  backdrop-filter: saturate(180%) blur(20px);
  -webkit-backdrop-filter: saturate(180%) blur(20px);
  border-bottom: 1px solid var(--color-border);
  position: sticky; top: 0; z-index: 10;
  /* Don't let wide breadcrumbs or action clusters push the
     bar wider than the viewport. The crumbs <nav> flexes and
     can ellipsize. The actions cluster is fixed-width. */
  min-width: 0;
  gap: 12px;
}
[data-brand="beavr"] .topbar .crumbs {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; color: var(--color-fg-muted);
  min-width: 0;
}
[data-brand="beavr"] .topbar .crumbs .sep { color: var(--color-fg-faint); }
[data-brand="beavr"] .topbar .crumbs .here { color: var(--color-fg); font-weight: 500; }
[data-brand="beavr"] .topbar .crumbs .mono {
  font-family: var(--beavr-font-mono); font-size: 12px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
[data-brand="beavr"] .topbar .top-actions {
  display: flex; align-items: center; gap: 8px;
  flex-shrink: 0;
}

/* ===== Sidebar ===== */
[data-brand="beavr"] .sidebar {
  grid-area: sidebar;
  background: var(--color-bg-elevated);
  border-right: 1px solid var(--color-border);
  overflow-y: auto;
  padding: 14px 10px 24px;
}
[data-brand="beavr"] .brand {
  display: flex; align-items: center; gap: 10px;
  padding: 4px 8px 16px;
  user-select: none;
  text-decoration: none;
}
[data-brand="beavr"] .brand .mark {
  width: 28px; height: 28px;
  border-radius: 8px;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-2));
  color: white;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--beavr-font-mono); font-weight: 700; font-size: 14px;
  box-shadow: 0 2px 6px rgba(166, 123, 91, 0.30);
  flex-shrink: 0;
}
/* When the brand uses an <img> instead of the CSS B, drop the
   gradient background — the real logo is the background. */
[data-brand="beavr"] .brand--img .mark { background: transparent; box-shadow: none; padding: 0; }
[data-brand="beavr"] .brand--img .mark-img { width: 32px; height: 32px; object-fit: contain; }
[data-brand="beavr"] .brand .name {
  font-weight: 600; font-size: 14px; letter-spacing: -0.01em;
  color: var(--color-fg);
}
[data-brand="beavr"] .brand .tag {
  margin-left: auto;
  font-family: var(--beavr-font-mono); font-size: 10px;
  color: var(--color-terminal);
  background: color-mix(in srgb, var(--color-terminal) 12%, transparent);
  padding: 2px 6px; border-radius: 999px;
}

[data-brand="beavr"] .nav-group { margin-top: 14px; }
[data-brand="beavr"] .nav-group-label {
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 8px;
  margin: 0 0 6px;
  font-size: 11px;
  text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--color-fg-faint);
  font-weight: 600;
}
[data-brand="beavr"] .nav-group-label .count {
  font-family: var(--beavr-font-mono);
  font-size: 10px;
  color: var(--color-fg-faint);
}
[data-brand="beavr"] .nav-list { list-style: none; padding: 0; margin: 0; }
[data-brand="beavr"] .nav-item a {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 8px;
  border-radius: var(--beavr-r);
  color: var(--color-fg);
  font-size: 13px;
  line-height: 1.2;
  text-decoration: none;
  transition: background-color .12s ease, color .12s ease;
}
[data-brand="beavr"] .nav-item a::before {
  content: ""; width: 6px; height: 6px; border-radius: 999px;
  background: var(--color-fg-faint); flex-shrink: 0;
  transition: background-color .12s ease, box-shadow .12s ease;
}
[data-brand="beavr"] .nav-item a:hover { background: var(--color-bg-sunken); }
[data-brand="beavr"] .nav-item.active a { color: var(--color-accent); font-weight: 500; }
[data-brand="beavr"] .nav-item.active a::before {
  background: var(--color-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-accent) 22%, transparent);
}
[data-brand="beavr"] .nav-item .new {
  margin-left: auto;
  font-family: var(--beavr-font-mono);
  font-size: 9px;
  color: var(--color-terminal);
  background: color-mix(in srgb, var(--color-terminal) 12%, transparent);
  padding: 1px 5px; border-radius: 999px;
}
[data-brand="beavr"] .nav-item .key {
  margin-left: auto;
  font-family: var(--beavr-font-mono);
  font-size: 10px;
  color: var(--color-fg-faint);
}

[data-brand="beavr"] .sidebar-foot {
  margin-top: 24px;
  padding: 10px 12px;
  border: 1px dashed var(--color-border-strong);
  border-radius: var(--beavr-r);
  font-size: 12px;
  color: var(--color-fg-muted);
  line-height: 1.4;
}
[data-brand="beavr"] .sidebar-foot .cmd {
  font-family: var(--beavr-font-mono);
  color: var(--color-terminal);
  font-size: 11px;
}

/* ===== Main ===== */
[data-brand="beavr"] .main {
  grid-area: main;
  padding: 32px 40px 80px;
  max-width: 960px;
}
/* On marketing pages (no sidebar) the main column should fill
   the full viewport and let inner sections handle their own
   centering. Otherwise the whole page is anchored to the left
   half of the screen with dead space on the right. */
[data-brand="beavr"] .app--no-sidebar .main {
  max-width: none;
  margin-inline: auto;
}
@media (max-width: 720px) {
  [data-brand="beavr"] .main { padding: 24px 20px 60px; }
}

/* ===== Hero ===== */
[data-brand="beavr"] .hero { margin-bottom: 36px; }
[data-brand="beavr"] .hero .prompt-line {
  display: flex; align-items: center; gap: 8px;
  font-family: var(--beavr-font-mono);
  font-size: 12px;
  color: var(--color-fg-muted);
  margin-bottom: 12px;
}
[data-brand="beavr"] .hero .prompt-line .arrow { color: var(--color-terminal); }
[data-brand="beavr"] .hero .prompt-line .blink {
  width: 8px; height: 14px; background: var(--color-terminal);
  display: inline-block; animation: beavr-blink 1.1s steps(2) infinite;
  border-radius: 1px;
}
@keyframes beavr-blink { 50% { opacity: 0; } }

[data-brand="beavr"] .hero h1 {
  font-size: 40px; line-height: 1.05; letter-spacing: -0.03em;
  margin: 0 0 12px;
  font-weight: 700;
  color: var(--color-fg);
}
[data-brand="beavr"] .hero h1 .accent {
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-2));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
}
[data-brand="beavr"] .hero p.lede {
  font-size: 17px; color: var(--color-fg-muted);
  max-width: 56ch; margin: 0;
}
@media (max-width: 720px) {
  [data-brand="beavr"] .hero h1 { font-size: 30px; }
}

/* ===== Big search card on home ===== */
[data-brand="beavr"] .search-card {
  margin: 24px 0 36px;
  background: var(--color-bg-elevated);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r-xl);
  padding: 18px;
  box-shadow: var(--beavr-shadow);
}
[data-brand="beavr"] .search-input {
  width: 100%;
  display: flex; align-items: center; gap: 12px;
  background: var(--color-bg-sunken);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r);
  padding: 0 14px;
  height: 52px;
  transition: border-color var(--beavr-t) var(--beavr-ease),
              box-shadow var(--beavr-t) var(--beavr-ease);
}
[data-brand="beavr"] .search-input:focus-within {
  border-color: var(--color-accent);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--color-accent) 18%, transparent);
}
[data-brand="beavr"] .search-input .icon { color: var(--color-fg-muted); display: flex; }
[data-brand="beavr"] .search-input input {
  flex: 1; border: 0; outline: 0; background: transparent;
  color: var(--color-fg); font-size: 16px; font-family: inherit;
}
[data-brand="beavr"] .search-input input::placeholder { color: var(--color-fg-faint); }
[data-brand="beavr"] .search-input .kbd {
  font-family: var(--beavr-font-mono); font-size: 11px;
  color: var(--color-fg-muted);
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r-sm);
  padding: 3px 7px;
}

[data-brand="beavr"] .search-suggestions {
  display: flex; flex-wrap: wrap; gap: 6px;
  margin-top: 12px;
}
[data-brand="beavr"] .chip {
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--color-bg-sunken);
  border: 1px solid var(--color-border);
  color: var(--color-fg-muted);
  cursor: pointer;
  transition: all var(--beavr-t-fast) var(--beavr-ease);
  font-family: var(--beavr-font-mono);
}
[data-brand="beavr"] .chip:hover {
  color: var(--color-fg);
  border-color: var(--color-border-strong);
  transform: translateY(-1px);
}

/* ===== Tools list =====
   /tools/ and /tools/<category>/. Flat list of links grouped
   by an h2. No JS, no accordion. */
[data-brand="beavr"] .cat-section {
  margin-top: 28px;
}
[data-brand="beavr"] .cat-title {
  font-size: 12px; font-weight: 600;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--color-fg-muted);
  margin: 0 0 12px 0;
}
[data-brand="beavr"] .cat-title .count {
  font-family: var(--beavr-font-mono);
  font-weight: 500;
  color: var(--color-fg-faint);
  letter-spacing: 0;
  text-transform: none;
}
[data-brand="beavr"] .back-link {
  font-size: 13px;
  color: var(--color-fg-muted);
  margin-top: 8px;
}
[data-brand="beavr"] .back-link a {
  color: var(--color-accent);
  text-decoration: none;
}
[data-brand="beavr"] .back-link a:hover { text-decoration: underline; }

[data-brand="beavr"] .tool-list {
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r);
  overflow: hidden;
}
[data-brand="beavr"] .tool-list li + li {
  border-top: 1px solid var(--color-border);
}
[data-brand="beavr"] .tool-row {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 16px;
  background: var(--color-bg-elevated);
  text-decoration: none;
  color: inherit;
  transition: background-color .12s ease;
  -webkit-tap-highlight-color: transparent;
}
[data-brand="beavr"] .tool-row:hover {
  background: var(--color-bg-sunken);
}
[data-brand="beavr"] .tool-row .name {
  font-size: 14px; font-weight: 500;
  color: var(--color-fg);
  flex-shrink: 0;
}
[data-brand="beavr"] .tool-row .desc {
  flex: 1; min-width: 0;
  font-size: 13px;
  color: var(--color-fg-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
[data-brand="beavr"] .tool-row .arrow {
  color: var(--color-fg-faint);
  flex-shrink: 0;
  /* Push the arrow to the right edge of the row, regardless
     of how wide .name is. Without this, .name + info-btn +
     arrow all pack left on mobile. */
  margin-left: auto;
  transition: transform var(--beavr-t) var(--beavr-ease),
              color var(--beavr-t) var(--beavr-ease);
}
[data-brand="beavr"] .tool-row:hover .arrow {
  color: var(--color-accent);
  transform: translateX(3px);
}

/* Info button: hidden on desktop, shown on narrow viewports.
   Tapping it expands the description inline without leaving
   the page (preventDefault + stopPropagation so the parent
   <a> doesn't navigate). */
[data-brand="beavr"] .info-btn {
  display: none;
  width: 28px; height: 28px;
  align-items: center; justify-content: center;
  border-radius: 50%;
  color: var(--color-fg-faint);
  cursor: pointer;
  flex-shrink: 0;
  -webkit-tap-highlight-color: transparent;
  transition: background-color .12s ease, color .12s ease;
}
[data-brand="beavr"] .info-btn:hover,
[data-brand="beavr"] .info-btn:focus-visible {
  background: var(--color-bg-sunken);
  color: var(--color-fg-muted);
  outline: none;
}
[data-brand="beavr"] .tool-list li.show-desc .desc {
  display: block !important;
  white-space: normal;
  margin-top: 6px;
  flex-basis: 100%;
}
@media (max-width: 600px) {
  [data-brand="beavr"] .tool-row { padding: 14px 14px; gap: 10px; }
  [data-brand="beavr"] .tool-row .name { font-size: 14px; }
  /* Hide the description by default on mobile — the name is
     enough to pick from. The info button reveals it on tap. */
  [data-brand="beavr"] .tool-row .desc { display: none; }
  [data-brand="beavr"] .tool-row .info-btn { display: inline-flex; }
}

/* ===== Top-bar search trigger ===== */
[data-brand="beavr"] .search-trigger {
  display: inline-flex; align-items: center; gap: 10px;
  height: 32px;
  padding: 0 10px 0 12px;
  min-width: 240px;
  background: var(--color-bg-elevated);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r);
  color: var(--color-fg-muted);
  cursor: pointer;
  transition: all var(--beavr-t) var(--beavr-ease);
  font-family: inherit;
}
[data-brand="beavr"] .search-trigger:hover {
  border-color: var(--color-border-strong);
  background: var(--color-bg-sunken);
  transform: translateY(-1px);
  box-shadow: var(--beavr-shadow-sm);
}
[data-brand="beavr"] .search-trigger .icon {
  color: var(--color-fg-muted); display: flex;
}
[data-brand="beavr"] .search-trigger .label {
  font-size: 13px; flex: 1; text-align: left;
}
[data-brand="beavr"] .search-trigger .kbd {
  display: inline-flex; align-items: center; gap: 2px;
  font-family: var(--beavr-font-mono);
  font-size: 11px;
  color: var(--color-fg-muted);
  background: var(--color-bg-sunken);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r-sm);
  padding: 2px 6px;
}

[data-brand="beavr"] .icon-btn {
  width: 32px; height: 32px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--color-border);
  background: var(--color-bg-elevated);
  color: var(--color-fg);
  border-radius: var(--beavr-r);
  cursor: pointer;
  transition: transform var(--beavr-t-fast) var(--beavr-ease),
              background var(--beavr-t-fast) var(--beavr-ease),
              border-color var(--beavr-t-fast) var(--beavr-ease);
}
[data-brand="beavr"] .icon-btn:hover {
  background: var(--color-bg-sunken);
  border-color: var(--color-border-strong);
}
[data-brand="beavr"] .icon-btn:active { transform: scale(0.96); }
[data-brand="beavr"] .icon-btn svg { width: 16px; height: 16px; }

[data-brand="beavr"] .mobile-menu-btn {
  display: none;
}
@media (max-width: 880px) {
  [data-brand="beavr"] .mobile-menu-btn { display: inline-flex; }
}

/* The top-left "profile square" — the burger button is the
   brand mark itself. When the actual beaver PNG is available
   we render that (transparent, sharp at any size); otherwise we
   fall back to the gradient square + initial glyph. */
[data-brand="beavr"] .brand-profile-square {
  padding: 0;
  overflow: hidden;
}
[data-brand="beavr"] .brand-profile-square .brand-mark {
  width: 28px;
  height: 28px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  background: linear-gradient(135deg, var(--color-accent), var(--color-accent-2));
  color: var(--color-accent-fg);
  font-family: var(--beavr-font-mono);
  font-weight: 700;
  font-size: 14px;
  line-height: 1;
  letter-spacing: -0.02em;
  box-shadow: var(--beavr-shadow);
  transition: transform var(--beavr-t-fast) var(--beavr-ease);
}
[data-brand="beavr"] .brand-profile-square:hover .brand-mark {
  transform: scale(1.04);
}
/* When the topbar burger uses the actual beaver PNG instead
   of the gradient + letter glyph. Same footprint as the
   gradient square so the topbar height doesn't change. */
[data-brand="beavr"] .topbar-brand {
  padding: 0;
  overflow: hidden;
  background: transparent;
  /* Override .icon-btn's border + bg so the button is just the
     PNG, not a bordered square. Without this the brand mark
     sits inside a dark/light pill in the navbar. */
  border-color: transparent;
}
[data-brand="beavr"] .topbar-brand:hover {
  background: transparent;
  border-color: transparent;
}
[data-brand="beavr"] .topbar-brand .brand-mark {
  width: 28px;
  height: 28px;
  border-radius: 8px;
  background: transparent;
  box-shadow: none;
  padding: 0;
  transition: transform var(--beavr-t-fast) var(--beavr-ease);
}
[data-brand="beavr"] .topbar-brand .brand-mark-img {
  width: 28px;
  height: 28px;
  object-fit: contain;
  display: block;
}
[data-brand="beavr"] .topbar-brand:hover .brand-mark {
  transform: scale(1.04);
}

/* ===== Command palette ===== */
[data-brand="beavr"] .palette {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, 0.32);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  display: flex; align-items: flex-start; justify-content: center;
  padding-top: 12vh;
  z-index: 100;
  opacity: 0; pointer-events: none;
  transition: opacity var(--beavr-t) var(--beavr-ease);
}
[data-brand="beavr"] .palette.open { opacity: 1; pointer-events: auto; }
[data-brand="beavr"] .palette-card {
  width: min(640px, 92vw);
  background: var(--color-bg-elevated);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r-lg);
  box-shadow: var(--beavr-shadow-lg);
  overflow: hidden;
  transform: translateY(-8px) scale(0.98);
  transition: transform var(--beavr-t) var(--beavr-ease);
}
[data-brand="beavr"] .palette.open .palette-card {
  transform: translateY(0) scale(1);
}
[data-brand="beavr"] .palette-head {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--color-border);
}
[data-brand="beavr"] .palette-head .icon {
  color: var(--color-fg-muted); display: flex;
}
[data-brand="beavr"] .palette-head input {
  flex: 1; border: 0; outline: 0; background: transparent;
  color: var(--color-fg); font-size: 16px; font-family: inherit;
}
[data-brand="beavr"] .palette-head .esc {
  font-family: var(--beavr-font-mono); font-size: 10px;
  color: var(--color-fg-muted);
  border: 1px solid var(--color-border);
  border-radius: var(--beavr-r-sm);
  padding: 2px 6px;
}
[data-brand="beavr"] .palette-list {
  list-style: none; padding: 6px; margin: 0;
  max-height: 50vh; overflow-y: auto;
}
[data-brand="beavr"] .palette-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px;
  border-radius: var(--beavr-r);
  cursor: pointer;
  transition: background var(--beavr-t-fast) var(--beavr-ease);
}
[data-brand="beavr"] .palette-item:hover,
[data-brand="beavr"] .palette-item.kbd-active {
  background: var(--color-bg-sunken);
}
[data-brand="beavr"] .palette-item .glyph {
  width: 28px; height: 28px;
  border-radius: 6px;
  background: var(--color-bg-sunken);
  border: 1px solid var(--color-border);
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--beavr-font-mono); font-size: 12px;
  color: var(--color-fg-muted);
  flex-shrink: 0;
}
[data-brand="beavr"] .palette-item .name { font-size: 14px; }
[data-brand="beavr"] .palette-item .cat {
  margin-left: auto;
  font-size: 11px; color: var(--color-fg-faint);
  font-family: var(--beavr-font-mono);
  text-transform: uppercase; letter-spacing: 0.06em;
}
[data-brand="beavr"] .palette-empty {
  padding: 24px; text-align: center;
  color: var(--color-fg-muted); font-size: 13px;
}

[data-brand="beavr"] .pulse {
  display: inline-block;
  width: 6px; height: 6px; border-radius: 999px;
  background: var(--color-terminal);
  margin-left: 6px;
  box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-terminal) 60%, transparent);
  animation: beavr-pulse 1.8s var(--beavr-ease) infinite;
}
@keyframes beavr-pulse {
  0%   { box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-terminal) 50%, transparent); }
  70%  { box-shadow: 0 0 0 8px color-mix(in srgb, var(--color-terminal) 0%, transparent); }
  100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--color-terminal) 0%, transparent); }
}

@media (prefers-reduced-motion: reduce) {
  [data-brand="beavr"] *,
  [data-brand="beavr"] *::before,
  [data-brand="beavr"] *::after {
    animation-duration: 0.001ms !important;
    transition-duration: 0.001ms !important;
  }
}

/* ============================================================
   Global element styles
   ============================================================ */

[data-brand="beavr"] code,
[data-brand="beavr"] pre {
  font-family: var(--beavr-font-mono);
  font-size: 0.9em;
  background: var(--color-code-bg);
  border-radius: 0.25rem;
  padding: 0.1em 0.35em;
}

[data-brand="beavr"] code { padding: 0.1em 0.35em; }
[data-brand="beavr"] pre {
  padding: 0.75rem 1rem;
  white-space: pre-wrap;
  overflow-x: auto;
  line-height: 1.45;
}

[data-brand="beavr"] a {
  color: var(--color-accent);
  text-underline-offset: 2px;
}
[data-brand="beavr"] a:hover { text-decoration-thickness: 2px; }

/* Global focus ring on all interactive elements. */
[data-brand="beavr"] :focus-visible {
  outline: 2px solid var(--color-accent);
  outline-offset: 2px;
}

/* === Tool page chrome ===
   The shared heading + lede + page wrapper for every tool
   page. Lives in the central stylesheet (was previously
   duplicated in every page, and missing from 22 of 26). */
[data-brand="beavr"] .site-main.tool-page {
  max-width: var(--max-w-page);
  margin: 0 auto;
}
[data-brand="beavr"] .tool-h1 {
  font-size: var(--text-2xl);
  margin: 0 0 var(--space-2);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--color-fg);
}
[data-brand="beavr"] .tool-lede {
  color: var(--color-fg-muted);
  margin: 0 0 var(--space-6);
  max-width: 42rem;
  line-height: 1.55;
}

