/*
 * omnitam.css, styles for the Omnitam trial + support modals and the
 * support bubble. Self-contained (own --om-* tokens) so it looks
 * consistent on every page regardless of that page's own theme.
 * Paired with assets/omnitam.js.
 */
:root {
  --om-acc: #7cf6c4;
  --om-acc-hover: #9affd4;
  --om-acc-ink: #04140e;
  --om-bg: #0f141b;
  --om-bg-2: #0b0f14;
  --om-field: #07090c;
  --om-line: #26323f;
  /* >=3:1 against --om-bg/--om-bg-2/--om-field (was #344452, ~1.8:1). [F-15] */
  --om-line-2: #56687a;
  /* dedicated boundary colour for the modal's interactive controls (field inputs, the
     ghost consent buttons): >=3:1 against --om-field/--om-bg here and in every page skin
     that redefines --om-*; --om-line stays decorative. [A11Y-019] */
  --om-line-ui: #4a6899;
  --om-ink: #e8eef2;
  --om-ink-dim: #9fb0bd;
  --om-ink-faint: #7c8b9a;
  --om-bad: #ff7a8a;
  --om-radius: 14px;
  /* Was "Space Grotesk": every page overrides --om-sans to "Inter" (via assets/site.css
     or its own inline skin), so Space Grotesk's 8 @font-face rules + woff2 files were
     dead weight, downloaded on some visits despite never actually rendering; removed
     along with the files. The default here now matches what every page in fact uses,
     so it would still be correct if a future page skinned the modal without an
     override. [PERF-033] */
  --om-sans: "Inter", "Inter Fallback", system-ui, -apple-system, "Segoe UI", sans-serif;
  --om-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
}

/* ---------- light theme (WEB-9b), the default look ----------
   Pale theme ported from the customer app's `light-blue` theme
   (itam-frontend-react-web src/ui/theme/themes/lightBlue.ts): canvas gray-950, surfaces
   gray-900/800, text gray-100/300, accent indigo-300/400, status palettes at their
   AA-dark values. Light is the default look (owner decision 2026-10-21); the original dark
   look applies only when the visitor picks it with the header toggle (assets/early-js-class.js
   sets html[data-theme=light] before first paint unless a stored 'dark' choice in
   localStorage opts out). Defined ONCE here: omnitam.css loads
   on every page, and html[data-theme] (0,1,1) out-ranks the :root skins in
   site.css/page-base.css (0,1,0) whatever the load order. Every text token clears 4.5:1
   and every --*line-2/--*line-ui boundary 3:1 on every light surface (tests). */
html[data-theme="light"] {
  color-scheme: light;
  --bg: #eef2f7;
  --bg-2: #f3f6fb;
  --panel: #ffffff;
  --panel-2: #f3f6fb;
  --line: #d5deea;
  --line-2: #74859c;
  --line-ui: #74859c;
  --ink: #0f172a;
  --ink-dim: #334155;
  --ink-faint: #556377;
  --ink-faint-on-tint: #556377;
  --acc: #1d4ed8;
  --acc-2: #1e40af;
  --acc-ink: #ffffff;
  --s-blue: #2563eb;
  --s-blue-2: #60a5fa;
  --s-blue-3: #1e40af;
  --s-dim: #b3c1d4;
  --good: #166534;
  --warn: #92400e;
  --crit: #b91c1c;
  --crit-ink: #991b1b;
  --good-ink: #166534;
  --violet-ink: #6b21a8;
  --om-acc: #1d4ed8;
  --om-acc-hover: #1e40af;
  --om-acc-ink: #ffffff;
  --om-bg: #ffffff;
  --om-bg-2: #f3f6fb;
  --om-field: #ffffff;
  --om-line: #d5deea;
  --om-line-2: #74859c;
  --om-line-ui: #74859c;
  --om-ink: #0f172a;
  --om-ink-dim: #334155;
  --om-ink-faint: #556377;
  --om-bad: #991b1b;
}

/* The header theme toggle (injected by assets/early-js-class.js, so a no-JS visitor never
   sees a dead control). A real <button> with aria-pressed; >=3:1 boundary, visible focus. */
.theme-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 36px;
  height: 36px;
  padding: 0;
  margin-left: auto;
  border: 1px solid var(--line-ui, var(--om-line-ui));
  border-radius: 999px;
  background: transparent;
  color: var(--ink-dim, var(--om-ink-dim));
  cursor: pointer;
}
.nav-cta .theme-toggle {
  margin-left: 0;
}
.nav-in > .theme-toggle {
  margin-right: 14px;
}
.theme-toggle:hover {
  color: var(--ink, var(--om-ink));
}
.theme-toggle svg {
  width: 18px;
  height: 18px;
}
.theme-toggle .ic-moon,
html[data-theme="light"] .theme-toggle .ic-sun {
  display: none;
}
html[data-theme="light"] .theme-toggle .ic-moon {
  display: block;
}

/* ---------- the [hidden] reset ----------
   The UA sheet's [hidden]{display:none} is an author-beatable declaration: any author
   rule that sets `display` (e.g. .om-consent-cats{display:flex} below) wins on cascade
   origin regardless of specificity, so the element stays visible and in the tab order
   while its controller says aria-expanded="false". Restore the attribute as an author
   declaration once, here, rather than per component. [A11Y-030]
   NB: this is one half of the A11Y-030 fix, togglePrefs() in assets/omnitam.js must
   un-hide the panel BEFORE moving focus into it, or focus() lands on a display:none
   node and silently no-ops (that is A11Y-004 all over again). */
[hidden] {
  display: none !important;
}

/* ---------- skip link + screen-reader utility (shared by every page) ----------
   A11Y-003 (Bypass Blocks): a visually-hidden-until-focused link that must be the
   first tab stop and live in each page's own markup (not injected), legal.html
   does not even load omnitam.js. Defined here so every page that loads omnitam.css gets
   the same control; legal.html carries an equivalent inline rule as a backstop. */
.skip-link {
  position: absolute;
  left: 8px;
  top: -48px;
  z-index: 200;
  padding: 10px 16px;
  border-radius: 8px;
  font: 600 14px/1 var(--om-sans);
  color: var(--om-acc-ink);
  background: var(--om-acc);
  text-decoration: none;
  transition: top 0.15s ease;
}
.skip-link:focus {
  top: 8px;
  outline: 2px solid var(--om-acc-ink);
  outline-offset: 2px;
}
.om-sr-only {
  position: absolute !important;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ---------- modal shell (native <dialog>) ---------- */
dialog.om-modal {
  border: none;
  padding: 0;
  margin: auto;
  background: transparent;
  color: var(--om-ink);
  width: min(480px, calc(100vw - 32px));
  max-height: calc(100vh - 48px);
  overflow: visible;
}
dialog.om-modal::backdrop {
  background: rgba(4, 7, 10, 0.66);
  backdrop-filter: blur(5px);
}
/* fade/scale in */
dialog.om-modal[open] {
  animation: om-pop 0.18s ease-out;
}
@keyframes om-pop {
  from {
    opacity: 0;
    transform: translateY(8px) scale(0.98);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  dialog.om-modal[open] {
    animation: none;
  }
}

/* ---------- the form panel ---------- */
.om-form {
  position: relative;
  box-sizing: border-box;
  max-height: calc(100vh - 48px);
  overflow-y: auto;
  background: linear-gradient(180deg, var(--om-bg), var(--om-bg-2));
  border: 1px solid var(--om-line);
  border-radius: var(--om-radius);
  box-shadow: 0 40px 120px -30px rgba(0, 0, 0, 0.85);
  padding: 30px 28px 26px;
  font-family: var(--om-sans);
  line-height: 1.5;
}
.om-form *,
.om-bubble * {
  box-sizing: border-box;
}

.om-close {
  position: absolute;
  top: 13px;
  right: 13px;
  width: 34px;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
  line-height: 1;
  color: var(--om-ink-dim);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 9px;
  cursor: pointer;
  transition: 0.15s;
}
.om-close:hover {
  color: var(--om-ink);
  border-color: var(--om-line-ui);
}

.om-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--om-mono);
  font-size: 11.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--om-acc);
}
.om-eyebrow::before {
  content: "";
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--om-acc);
  box-shadow: 0 0 12px var(--om-acc);
}
.om-head h2 {
  margin: 12px 0 0;
  font-size: 24px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.1;
}
.om-head p {
  margin: 8px 0 0;
  color: var(--om-ink-dim);
  font-size: 14px;
}
.om-plan-label {
  display: none;
  margin-top: 12px;
  font-family: var(--om-mono);
  font-size: 12px;
  color: var(--om-acc);
  border: 1px solid var(--om-line-2);
  border-radius: 8px;
  padding: 7px 11px;
}
.om-plan-label:not(:empty) {
  display: inline-block;
}

/* ---------- fields ---------- */
.om-fields {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-top: 22px;
}
.om-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
@media (max-width: 460px) {
  .om-row {
    grid-template-columns: 1fr;
  }
}
.om-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.om-field > span {
  font-family: var(--om-mono);
  font-size: 12px;
  color: var(--om-ink-dim);
}
.om-field input,
.om-field select,
.om-field textarea {
  width: 100%;
  font-family: var(--om-sans);
  font-size: 15px;
  color: var(--om-ink);
  background: var(--om-field);
  border: 1px solid var(--om-line-ui);
  border-radius: 10px;
  padding: 11px 13px;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.om-field textarea {
  resize: vertical;
  min-height: 96px;
}
/* D101 demo dialog: optional interest checkboxes */
fieldset.om-interests {
  border: 0;
  margin: 0;
  padding: 0;
  min-width: 0;
}
.om-interests > legend {
  font-family: var(--om-mono);
  font-size: 12px;
  color: var(--om-ink-dim);
  padding: 0;
  margin-bottom: 6px;
}
.om-interest {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  color: var(--om-ink);
  cursor: pointer;
}
.om-field .om-interest input {
  width: auto;
  padding: 0;
  margin: 0;
}
.om-field input::placeholder,
.om-field textarea::placeholder {
  color: var(--om-ink-faint);
}
.om-field input:focus,
.om-field select:focus,
.om-field textarea:focus {
  outline: none;
  border-color: var(--om-acc);
  box-shadow: 0 0 0 3px rgba(124, 246, 196, 0.16);
}
.om-field select {
  appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--om-ink-dim) 50%),
    linear-gradient(135deg, var(--om-ink-dim) 50%, transparent 50%);
  background-position: calc(100% - 18px) 19px, calc(100% - 13px) 19px;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  padding-right: 34px;
}
/* Per-field validation error text (A11Y-028). Empty until submitForm renders a message. */
.om-field-err {
  margin: 4px 0 0;
  font-size: 12px;
  color: var(--om-bad);
  min-height: 1px;
}
.om-field input[aria-invalid="true"],
.om-field select[aria-invalid="true"],
.om-field textarea[aria-invalid="true"] {
  border-color: var(--om-bad);
}
/* honeypot, visually hidden, off-screen, ignored by users */
.om-hp {
  position: absolute !important;
  left: -9999px !important;
  width: 1px;
  height: 1px;
  opacity: 0;
}

/* ---------- submit ---------- */
.om-submit {
  margin-top: 20px;
  width: 100%;
  min-height: 46px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  font-family: var(--om-sans);
  font-weight: 600;
  font-size: 15px;
  color: var(--om-acc-ink);
  background: var(--om-acc);
  border: none;
  border-radius: 10px;
  cursor: pointer;
  transition: 0.18s;
}
.om-submit:hover {
  background: var(--om-acc-hover);
  transform: translateY(-1px);
  box-shadow: 0 8px 30px rgba(124, 246, 196, 0.25);
}
.om-submit:disabled,
.om-submit[aria-disabled="true"] {
  opacity: 0.6;
  cursor: progress;
  transform: none;
  box-shadow: none;
}
/* aria-disabled keeps the button focusable in flight (A11Y-013), suppress the
   hover lift so it still reads as "busy, not interactive". */
.om-submit[aria-disabled="true"]:hover {
  background: var(--om-acc);
  transform: none;
  box-shadow: none;
}
.om-spinner {
  width: 15px;
  height: 15px;
  border: 2px solid rgba(4, 20, 14, 0.35);
  border-top-color: var(--om-acc-ink);
  border-radius: 50%;
  animation: om-spin 0.7s linear infinite;
  display: none;
}
.om-form.is-busy .om-spinner {
  display: inline-block;
}
@keyframes om-spin {
  to {
    transform: rotate(360deg);
  }
}

.om-fineprint {
  margin: 14px 0 0;
  font-size: 11.5px;
  color: var(--om-ink-faint);
  text-align: center;
}
.om-fineprint a {
  color: var(--om-ink-dim);
  text-decoration: underline;
}

/* ---------- status + success ---------- */
.om-status {
  margin: 14px 0 0;
  font-size: 13px;
  text-align: center;
  min-height: 1px;
}
.om-status.is-error {
  color: var(--om-bad);
}
.om-success {
  display: none;
  text-align: center;
  padding: 14px 0 6px;
}
.om-form.is-done .om-fields,
.om-form.is-done .om-submit,
.om-form.is-done .om-fineprint,
.om-form.is-done .om-plan-label {
  display: none;
}
.om-form.is-done .om-success {
  display: block;
}
.om-success .om-check {
  width: 52px;
  height: 52px;
  margin: 0 auto 14px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--om-acc);
  background: rgba(124, 246, 196, 0.1);
  border: 1px solid rgba(124, 246, 196, 0.4);
  font-size: 26px;
}
.om-success h3 {
  margin: 0;
  font-size: 20px;
  font-weight: 600;
}
.om-success p {
  margin: 8px 0 0;
  color: var(--om-ink-dim);
  font-size: 14px;
}

/* ---------- fixed support bubble ---------- */
/* While the consent banner is up it overlaps the bubble in the same corner; hide the bubble
   (including from the tab order) so a keyboard user cannot focus an occluded control. [A11Y-037] */
.om-consent-open .om-bubble {
  display: none;
}
.om-bubble {
  position: fixed;
  right: 20px;
  bottom: 20px;
  z-index: 2147483000;
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-family: var(--om-sans);
  font-weight: 600;
  font-size: 14px;
  color: var(--om-acc-ink);
  background: var(--om-acc);
  border: none;
  border-radius: 999px;
  padding: 12px 18px;
  cursor: pointer;
  box-shadow: 0 12px 34px -8px rgba(124, 246, 196, 0.5),
    0 4px 12px rgba(0, 0, 0, 0.3);
  transition: 0.18s;
}
.om-bubble:hover {
  background: var(--om-acc-hover);
  transform: translateY(-2px);
}
.om-bubble svg {
  width: 18px;
  height: 18px;
  flex: none;
}
@media (max-width: 560px) {
  .om-bubble span {
    display: none;
  }
  .om-bubble {
    padding: 14px;
  }
}

/* ---------- cookie-consent banner (injected by omnitam.js) ---------- */
.om-consent {
  position: fixed;
  left: 20px;
  bottom: 20px;
  z-index: 2147483001;
  width: min(380px, calc(100vw - 40px));
  font-family: var(--om-sans);
  animation: om-pop 0.2s ease-out;
}
@media (prefers-reduced-motion: reduce) {
  .om-consent {
    animation: none;
  }
}
.om-consent-card {
  background: linear-gradient(180deg, var(--om-bg), var(--om-bg-2));
  border: 1px solid var(--om-line);
  border-radius: var(--om-radius);
  box-shadow: 0 30px 90px -25px rgba(0, 0, 0, 0.85);
  padding: 20px 20px 18px;
}
.om-consent-lead h2 {
  margin: 0 0 8px;
  font-size: 17px;
  font-weight: 600;
  color: var(--om-ink);
}
.om-consent-lead p {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--om-ink-dim);
}
.om-consent-lead a {
  color: var(--om-acc);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.om-consent-cats {
  margin: 16px 0 4px;
  display: flex;
  flex-direction: column;
}
.om-consent-cat {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: 12px 0;
  border-top: 1px solid var(--om-line);
}
.om-consent-cat-txt strong {
  display: block;
  font-size: 13.5px;
  color: var(--om-ink);
}
.om-consent-cat-txt small {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  line-height: 1.5;
  color: var(--om-ink-faint);
}
.om-consent-cat input {
  flex: none;
  width: 18px;
  height: 18px;
  margin-top: 2px;
  accent-color: var(--om-acc);
  cursor: pointer;
}
.om-consent-cat input:disabled {
  cursor: not-allowed;
  opacity: 0.7;
}
/* D103 (owner 2026-10-26): Reject all and Accept all side by side, equal width, identical
   filled style at every width; Preferences (or Save choices) is a text-style control under them. */
.om-consent-actions {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  margin-top: 16px;
}
.om-consent-btn[data-om-consent="reject"] {
  order: 1;
}
.om-consent-btn[data-om-consent="accept"] {
  order: 2;
}
.om-consent-btn[data-om-consent="prefs"],
.om-consent-btn[data-om-consent="save"] {
  order: 3;
  grid-column: 1 / -1;
}
.om-consent-btn {
  min-width: 0;
  min-height: 40px;
  padding: 9px 14px;
  font-family: var(--om-sans);
  font-size: 13.5px;
  font-weight: 600;
  border-radius: 9px;
  cursor: pointer;
  transition: 0.15s;
}
/* Accept + Reject share one filled style = equal prominence; Preferences is quieter. */
.om-consent-btn.ghost {
  background: transparent;
  color: var(--om-ink);
  border: 1.5px solid var(--om-line-ui);
}
.om-consent-btn.ghost:hover {
  border-color: var(--om-ink-faint);
}
.om-consent-btn[data-om-consent="prefs"] {
  justify-self: center;
  min-height: 32px;
  padding: 6px 10px;
  border-color: transparent;
  font-weight: 500;
  color: var(--om-ink-dim);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.om-consent-btn[data-om-consent="prefs"]:hover {
  border-color: transparent;
  color: var(--om-ink);
}
.om-consent-btn.solid {
  background: var(--om-acc);
  color: var(--om-acc-ink);
  border: 1.5px solid var(--om-acc);
}
.om-consent-btn.solid:hover {
  background: var(--om-acc-hover);
  border-color: var(--om-acc-hover);
}
/* D103 compact phone card: ~25% of an 844px screen instead of ~48%. */
@media (max-width: 600px) {
  .om-consent {
    left: 8px;
    bottom: 8px;
    width: calc(100vw - 16px);
  }
  .om-consent-card {
    padding: 14px;
  }
  .om-consent-lead h2 {
    margin-bottom: 6px;
    font-size: 15px;
  }
  .om-consent-lead p {
    font-size: 12.5px;
    line-height: 1.5;
  }
  .om-consent-actions {
    margin-top: 12px;
  }
}
/* D103: while the banner is up, the open mobile nav panel (site.css, D102) reserves room
   under its last item so Contact can scroll clear of the fixed banner. */
.om-consent-open .nav-links.is-open {
  padding-bottom: calc(var(--om-consent-h, 0px) + 26px);
}

/* ============================================================================
 * Self-hosted web fonts (D16 / SEC-006 / PERF-001)
 * Replaces the cross-origin Google Fonts <link> that loaded on every page
 * BEFORE any consent decision, closing the ePrivacy exposure (makes the
 * "nothing loads before consent" claim true) and removing the render-blocking
 * cross-origin request. Files in assets/fonts/ are the open-licensed originals
 * (SIL OFL 1.1). Fraunces is a static wght=530 instance (opsz axis kept) of the
 * variable font: every serif heading uses 530. [PERF-029] omnitam.css is already loaded by all four
 * pages, so this adds no new request.
 * ============================================================================ */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/inter-latin-400.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/inter-latin-ext-400.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('fonts/inter-latin-500.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('fonts/inter-latin-ext-500.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/inter-latin-600.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/inter-latin-ext-600.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/inter-latin-700.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/inter-latin-ext-700.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* Metric-matched fallback: sizes/positions the local Arial fallback so its line boxes
   match Inter's, shrinking the reflow/CLS at the swap when Inter finishes loading. Every
   --sans / --om-sans stack now names this face between "Inter" and the generic system
   fallbacks. Values are the widely-published Inter-fallback-to-Arial metric-override
   set; regenerate with a proper metrics tool (fontaine/capsize) if Inter is ever
   swapped for a different family. Fraunces/IBM Plex Mono don't have an equally
   well-established public metric set and neither tool is installed on this box to
   derive one, so they're deliberately left without a fallback face here. [PERF-028] */
@font-face {
  font-family: 'Inter Fallback';
  src: local('Arial');
  ascent-override: 90%;
  descent-override: 22.43%;
  line-gap-override: 0%;
  size-adjust: 107.64%;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-400.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-ext-400.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-500.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-ext-500.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-600.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url('fonts/ibm-plex-mono-latin-ext-600.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 530;
  font-display: swap;
  src: url('fonts/fraunces-latin-530.woff2') format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 530;
  font-display: swap;
  src: url('fonts/fraunces-latin-ext-530.woff2') format('woff2');
  unicode-range: U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
