/* ASNET base — reset, typography, global element defaults. No Bootstrap
   dependency: this theme's own markup uses only asnet-* classes, so there
   is nothing here to fight with a vendor stylesheet's specificity. */

*, *::before, *::after { box-sizing: border-box; }

/* scrollbar-gutter:stable (item 8, cross-system scrollbar parity): reserves
   the scrollbar's own width at all times, so a page transition between a
   scrollable and a non-scrollable page - or between the two ASNET sites -
   can't shift the rail's effective horizontal position by a scrollbar's
   width. Ignored harmlessly by browsers that don't support the property. */
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scrollbar-gutter: stable; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

body {
  margin: 0;
  font-family: var(--asnet-font-sans);
  font-size: var(--asnet-fs-base);
  line-height: 1.55;
  color: var(--asnet-text);
  background: var(--asnet-surface-muted);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

body.has-open-menu,
body.has-open-modal { overflow: hidden; }

h1, h2, h3, h4, h5, h6 {
  margin: 0 0 var(--asnet-space-sm);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.015em;
  color: var(--asnet-ink);
}
h1 { font-size: var(--asnet-fs-3xl); }
h2 { font-size: var(--asnet-fs-2xl); }
h3 { font-size: var(--asnet-fs-xl); }
h4 { font-size: var(--asnet-fs-lg); }
h5 { font-size: var(--asnet-fs-md); }

p { margin: 0 0 var(--asnet-space-sm); }
p:last-child { margin-bottom: 0; }

a { color: var(--asnet-primary); text-decoration: none; }
a:hover { color: var(--asnet-primary-strong); }

small, .asnet-text-sm { font-size: var(--asnet-fs-sm); }
.asnet-text-xs { font-size: var(--asnet-fs-xs); }
.asnet-text-muted { color: var(--asnet-text-muted); }

hr {
  border: none;
  border-top: 1px solid var(--asnet-border);
  margin: var(--asnet-space-md) 0;
}

img, svg { max-width: 100%; }

:focus-visible {
  outline: 2px solid var(--asnet-primary);
  outline-offset: 2px;
  border-radius: 4px;
}

button { font-family: inherit; }

.asnet-icon {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
}
.asnet-icon--sm { width: 14px; height: 14px; }
.asnet-icon--lg { width: 24px; height: 24px; }

.asnet-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* Same clip-based hide as .asnet-visually-hidden above, not a fixed
   `top: -N px` offset: that technique has to guess the link's rendered
   height ahead of time, and whenever the guess is a little off (larger
   root font-size, browser zoom, different font metrics) part of the badge
   stays permanently visible. Clipping to 1x1px hides it completely no
   matter what its content measures, and :focus just removes the clip. */
.asnet-skip-link {
  position: absolute;
  z-index: 200;
  top: var(--asnet-space-sm);
  left: var(--asnet-space-sm);
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  background: var(--asnet-primary);
  color: #fff;
  padding: var(--asnet-space-2xs) var(--asnet-space-sm);
  border-radius: var(--asnet-radius-sm);
  font-size: var(--asnet-fs-sm);
  font-weight: 600;
}
.asnet-skip-link:focus {
  width: auto;
  height: auto;
  overflow: visible;
  clip: auto;
  color: #fff;
}
