/*fern-site-stylesheet*/:root {
  --header-height: 64px;
  --header-height-real: 64px;
  --mobile-header-height-real: 64px;
  --content-width: 640px;
  --sidebar-width: 288px;
  --page-width: 100vw;
  --logo-height: 36px;
  --font-body: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
  --font-heading: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
  --font-code: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
}

:root {
  --typography-body-font-family: var(--font-body);
  --typography-heading-font-family: var(--font-heading);
  --typography-code-font-family: var(--font-code);
}


.light, :root {
  --accent-1: #fcfcfc;
  --accent-2: #f9f9f9;
  --accent-3: #f0f0f0;
  --accent-4: #e8e8e8;
  --accent-5: #e1e1e1;
  --accent-6: #d9d9d9;
  --accent-7: #cecece;
  --accent-8: #bbb;
  --accent-9: #171717;
  --accent-10: #2e2e2e;
  --accent-11: #636363;
  --accent-12: #1f1f1f;

  --accent-a1: #00000003;
  --accent-a2: #00000006;
  --accent-a3: #0000000f;
  --accent-a4: #00000017;
  --accent-a5: #0000001e;
  --accent-a6: #00000026;
  --accent-a7: #00000031;
  --accent-a8: #00000044;
  --accent-a9: #000000e8;
  --accent-a10: #000000d1;
  --accent-a11: #0000009c;
  --accent-a12: #000000e0;

  --accent-contrast: #fff;
  --accent-surface: #f8f8f8cc;
  --accent-indicator: #171717;
  --accent-track: #171717;
}

@supports (color: color(display-p3 1 1 1)) {
  @media (color-gamut: p3) {
    .light, :root {
      --accent-1: oklch(99.2% 0 none);
      --accent-2: oklch(98.1% 0 none);
      --accent-3: oklch(95.5% 0 none);
      --accent-4: oklch(93.1% 0 none);
      --accent-5: oklch(90.9% 0 none);
      --accent-6: oklch(88.5% 0 none);
      --accent-7: oklch(85.1% 0 none);
      --accent-8: oklch(79.2% 0 none);
      --accent-9: oklch(20.5% 0 none);
      --accent-10: oklch(30.3% 0 none);
      --accent-11: oklch(50.1% 0 none);
      --accent-12: oklch(24% 0 none);

      --accent-a1: color(display-p3 0 0 0 / 0.0118);
      --accent-a2: color(display-p3 0 0 0 / 0.0235);
      --accent-a3: color(display-p3 0 0 0 / 0.0588);
      --accent-a4: color(display-p3 0 0 0 / 0.0902);
      --accent-a5: color(display-p3 0 0 0 / 0.1176);
      --accent-a6: color(display-p3 0 0 0 / 0.149);
      --accent-a7: color(display-p3 0 0 0 / 0.1922);
      --accent-a8: color(display-p3 0 0 0 / 0.2667);
      --accent-a9: color(display-p3 0 0 0 / 0.9098);
      --accent-a10: color(display-p3 0 0 0 / 0.8196);
      --accent-a11: color(display-p3 0 0 0 / 0.6118);
      --accent-a12: color(display-p3 0 0 0 / 0.8784);

      --accent-contrast: #fff;
      --accent-surface: color(display-p3 0.9725 0.9725 0.9725 / 0.8);
      --accent-indicator: oklch(20.5% 0 none);
      --accent-track: oklch(20.5% 0 none);
    }
  }
}


.light, :root {
  --grayscale-1: #fcfcfc;
  --grayscale-2: #f9f9f9;
  --grayscale-3: #f0f0f0;
  --grayscale-4: #e8e8e8;
  --grayscale-5: #e0e0e0;
  --grayscale-6: #d9d9d9;
  --grayscale-7: #cecece;
  --grayscale-8: #bbbbbb;
  --grayscale-9: #8d8d8d;
  --grayscale-10: #838383;
  --grayscale-11: #646464;
  --grayscale-12: #202020;

  --grayscale-a1: #00000003;
  --grayscale-a2: #00000006;
  --grayscale-a3: #0000000f;
  --grayscale-a4: #00000017;
  --grayscale-a5: #0000001f;
  --grayscale-a6: #00000026;
  --grayscale-a7: #00000031;
  --grayscale-a8: #00000044;
  --grayscale-a9: #00000072;
  --grayscale-a10: #0000007c;
  --grayscale-a11: #0000009b;
  --grayscale-a12: #000000df;

  --grayscale-contrast: #000;
  --grayscale-surface: #ffffffcc;
  --grayscale-indicator: #8d8d8d;
  --grayscale-track: #8d8d8d;
}

@supports (color: color(display-p3 1 1 1)) {
  @media (color-gamut: p3) {
    .light, :root {
      --grayscale-1: color(display-p3 0.988 0.988 0.988);
      --grayscale-2: color(display-p3 0.975 0.975 0.975);
      --grayscale-3: color(display-p3 0.939 0.939 0.939);
      --grayscale-4: color(display-p3 0.908 0.908 0.908);
      --grayscale-5: color(display-p3 0.88 0.88 0.88);
      --grayscale-6: color(display-p3 0.849 0.849 0.849);
      --grayscale-7: color(display-p3 0.807 0.807 0.807);
      --grayscale-8: color(display-p3 0.732 0.732 0.732);
      --grayscale-9: color(display-p3 0.553 0.553 0.553);
      --grayscale-10: color(display-p3 0.512 0.512 0.512);
      --grayscale-11: color(display-p3 0.392 0.392 0.392);
      --grayscale-12: color(display-p3 0.125 0.125 0.125);

      --grayscale-a1: #00000003;
      --grayscale-a2: #00000006;
      --grayscale-a3: #0000000f;
      --grayscale-a4: #00000017;
      --grayscale-a5: #0000001f;
      --grayscale-a6: #00000026;
      --grayscale-a7: #00000031;
      --grayscale-a8: #00000044;
      --grayscale-a9: #00000072;
      --grayscale-a10: #0000007c;
      --grayscale-a11: #0000009b;
      --grayscale-a12: #000000df;

      --grayscale-contrast: #000;
      --grayscale-surface: color(display-p3 1 1 1 / 80%);
      --grayscale-indicator: color(display-p3 0.553 0.553 0.553);
      --grayscale-track: color(display-p3 0.553 0.553 0.553);
    }
  }
}


.dark {
  --accent-1: #000;
  --accent-2: #121212;
  --accent-3: #1e1e1e;
  --accent-4: #272727;
  --accent-5: #2f2f2f;
  --accent-6: #393939;
  --accent-7: #474747;
  --accent-8: #606060;
  --accent-9: #ededed;
  --accent-10: #e4e4e4;
  --accent-11: #b3b3b3;
  --accent-12: #ededed;

  --accent-a1: #00000000;
  --accent-a2: #ffffff12;
  --accent-a3: #ffffff1e;
  --accent-a4: #ffffff27;
  --accent-a5: #ffffff2f;
  --accent-a6: #ffffff39;
  --accent-a7: #ffffff47;
  --accent-a8: #ffffff60;
  --accent-a9: #ffffffed;
  --accent-a10: #ffffffe4;
  --accent-a11: #ffffffb3;
  --accent-a12: #ffffffed;

  --accent-contrast: #311921;
  --accent-surface: #24242480;
  --accent-indicator: #ededed;
  --accent-track: #ededed;
}

@supports (color: color(display-p3 1 1 1)) {
  @media (color-gamut: p3) {
    .dark {
      --accent-1: oklch(0% 0 none);
      --accent-2: oklch(18.1% 0 none);
      --accent-3: oklch(23.7% 0 none);
      --accent-4: oklch(27.3% 0 none);
      --accent-5: oklch(30.7% 0 none);
      --accent-6: oklch(34.5% 0 none);
      --accent-7: oklch(39.8% 0 none);
      --accent-8: oklch(48.8% 0 none);
      --accent-9: oklch(94.6% 0 none);
      --accent-10: oklch(91.7% 0 none);
      --accent-11: oklch(76.6% 0 none);
      --accent-12: oklch(94.7% 0 none);

      --accent-a1: color(display-p3 0 0 0 / 0);
      --accent-a2: color(display-p3 1 1 1 / 0.0706);
      --accent-a3: color(display-p3 1 1 1 / 0.1176);
      --accent-a4: color(display-p3 1 1 1 / 0.1529);
      --accent-a5: color(display-p3 1 1 1 / 0.1843);
      --accent-a6: color(display-p3 1 1 1 / 0.2235);
      --accent-a7: color(display-p3 1 1 1 / 0.2784);
      --accent-a8: color(display-p3 1 1 1 / 0.3765);
      --accent-a9: color(display-p3 1 1 1 / 0.9294);
      --accent-a10: color(display-p3 1 1 1 / 0.8941);
      --accent-a11: color(display-p3 1 1 1 / 0.702);
      --accent-a12: color(display-p3 1 1 1 / 0.9294);

      --accent-contrast: #311921;
      --accent-surface: color(display-p3 0.1412 0.1412 0.1412 / 0.5);
      --accent-indicator: oklch(94.6% 0 none);
      --accent-track: oklch(94.6% 0 none);
    }
  }
}


.dark {
  --grayscale-1: #111111;
  --grayscale-2: #191919;
  --grayscale-3: #222222;
  --grayscale-4: #2a2a2a;
  --grayscale-5: #313131;
  --grayscale-6: #3a3a3a;
  --grayscale-7: #484848;
  --grayscale-8: #606060;
  --grayscale-9: #6e6e6e;
  --grayscale-10: #7b7b7b;
  --grayscale-11: #b4b4b4;
  --grayscale-12: #eeeeee;

  --grayscale-a1: #00000000;
  --grayscale-a2: #ffffff09;
  --grayscale-a3: #ffffff12;
  --grayscale-a4: #ffffff1b;
  --grayscale-a5: #ffffff22;
  --grayscale-a6: #ffffff2c;
  --grayscale-a7: #ffffff3b;
  --grayscale-a8: #ffffff55;
  --grayscale-a9: #ffffff64;
  --grayscale-a10: #ffffff72;
  --grayscale-a11: #ffffffaf;
  --grayscale-a12: #ffffffed;

  --grayscale-contrast: #fff;
  --grayscale-surface: rgba(0, 0, 0, 0.05);
  --grayscale-indicator: #6e6e6e;
  --grayscale-track: #6e6e6e;
}

@supports (color: color(display-p3 1 1 1)) {
  @media (color-gamut: p3) {
    .dark {
      --grayscale-1: color(display-p3 0.067 0.067 0.067);
      --grayscale-2: color(display-p3 0.098 0.098 0.098);
      --grayscale-3: color(display-p3 0.135 0.135 0.135);
      --grayscale-4: color(display-p3 0.163 0.163 0.163);
      --grayscale-5: color(display-p3 0.192 0.192 0.192);
      --grayscale-6: color(display-p3 0.228 0.228 0.228);
      --grayscale-7: color(display-p3 0.283 0.283 0.283);
      --grayscale-8: color(display-p3 0.375 0.375 0.375);
      --grayscale-9: color(display-p3 0.431 0.431 0.431);
      --grayscale-10: color(display-p3 0.484 0.484 0.484);
      --grayscale-11: color(display-p3 0.706 0.706 0.706);
      --grayscale-12: color(display-p3 0.933 0.933 0.933);

      --grayscale-a1: #00000000;
      --grayscale-a2: #ffffff09;
      --grayscale-a3: #ffffff12;
      --grayscale-a4: #ffffff1b;
      --grayscale-a5: #ffffff22;
      --grayscale-a6: #ffffff2c;
      --grayscale-a7: #ffffff3b;
      --grayscale-a8: #ffffff55;
      --grayscale-a9: #ffffff64;
      --grayscale-a10: #ffffff72;
      --grayscale-a11: #ffffffaf;
      --grayscale-a12: #ffffffed;

      --grayscale-contrast: #fff;
      --grayscale-surface: color(display-p3 0 0 0 / 5%);
      --grayscale-indicator: color(display-p3 0.431 0.431 0.431);
      --grayscale-track: color(display-p3 0.431 0.431 0.431);
    }
  }
}

.light, :root {
  color-scheme: light;
  --accent: rgba(23, 23, 23, 1);
  --background: rgba(255, 255, 255, 1);
  --border: initial;
  --sidebar-background: initial;
  --header-background: color-mix(in srgb, var(--background), transparent 30%);
  --card-background: initial;
  --theme-color: #fff;
}

.dark {
  color-scheme: dark;
  --accent: rgba(237, 237, 237, 1);
  --background: rgba(0, 0, 0, 1);
  --border: initial;
  --sidebar-background: initial;
  --header-background: color-mix(in srgb, var(--background), transparent 30%);
  --card-background: initial;
  --theme-color: #000;
}

/* Custom styles — restrained monochrome chrome; Aether icons are first-class. */

/* ── Cards: soft hover — border brightens, no lift/shadow ──────── */
.fern-card {
  transition: border-color 150ms ease, background-color 150ms ease;
}

.fern-card:hover {
  border-color: rgba(0, 0, 0, 0.14);
  background-color: rgba(0, 0, 0, 0.02);
  box-shadow: none !important;
}
.fern-card:focus-visible {
  border-color: rgba(0, 0, 0, 0.14);
  background-color: rgba(0, 0, 0, 0.02);
  box-shadow: none !important;
}

html.dark .fern-card:hover {
  border-color: rgba(255, 255, 255, 0.16);
  background-color: rgba(255, 255, 255, 0.03);
  box-shadow: none !important;
}
html.dark .fern-card:focus-visible {
  border-color: rgba(255, 255, 255, 0.16);
  background-color: rgba(255, 255, 255, 0.03);
  box-shadow: none !important;
}

/* Flat background — no top gradient wash. The wash only painted
   the transparent content area, not the opaque white sidebar, so it made the
   two surfaces diverge at the top. Flat = sidebar and content read as one
   seamless surface. */
.fern-background-image,
html.dark .fern-background-image {
  background-image: none;
}

.fern-header-tabs {
  justify-content: center;
}

/*
 * Aether icons are vendored under docs/assets/aether-icons/ (see that folder’s
 * README). Card icons pass a path string to <Card icon>, so Fern inlines the
 * SVG and currentColor inherits — no dark-mode tint needed. This rule remains
 * only for header-tab <img> icons, which are still raster-embedded.
 */
html.dark #fern-header .fern-header-tabs img[src*="/aether-icons/"] {
  filter: invert(1);
}

/* Overview card row — reserves a common icon row.
 *
 * Aether owns the glyph; Fern owns rendering; this rule owns optical rhythm.
 * The four glyphs come off different Aether artboards (16 and 56 viewBox,
 * stroke-widths 0.97–3.862), so each <Card> carries its own iconSize to
 * equalise optical glyph size — measured ink height 28.5–30.1px, was
 * 23.9–34.0px. Fern writes iconSize out as INLINE width/height on .card-icon,
 * so those boxes then differ in height (40/28/28/32px) and the card titles
 * fall out of alignment. Reserving one 40px-tall slot re-aligns them.
 * !important is required to beat Fern's inline height; width is deliberately
 * left alone so each SVG keeps preserveAspectRatio and is never stretched.
 * Scoped to .pp-card-row so no other card group on the site is affected. */
.pp-card-row .fern-card .card-icon {
  height: 40px !important;
  display: flex;
  align-items: center;
}

/* Add 10px of breathing room above the header content */
#fern-header .width-before-scroll-bar {
  padding-top: 10px;
}

/* Single-line header (desktop): logo + tabs on the left, search/theme in the right corner.
   By default the header stacks two rows inside `.width-before-scroll-bar`:
   `.fern-header-content` (logo + search + theme, nested a few levels deep) and
   `.fern-header-tabs`. We make that wrapper a single flex row and unwrap the nested
   content wrappers with `display: contents` so the logo/search/theme promote up onto the
   same line as the tabs, then order them left-to-right. */
@media (min-width: 1024px) {

  #fern-header .width-before-scroll-bar {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 16px;
    padding-left: 32px;
    padding-right: 32px;
    position: relative; /* anchor for the absolutely-centered tabs */
  }

  /* Unwrap the three nested wrappers between the row and the logo/search/theme */
  #fern-header .fern-header-content,
  #fern-header .fern-header-content > div,
  #fern-header .fern-header-content > div > div:first-child {
    display: contents;
  }

  /* Fern makes these grow to fill the default row; pin them to content width so the
     tabs sit snug next to the logo and the auto margin can push the rest right. */
  #fern-header .fern-header-logo-container,
  #fern-header .fern-header-navbar-links {
    flex: 0 0 auto;
  }

  #fern-header .fern-header-logo-container {
    order: 1;
  }

  /* Left-align the tab row directly next to the logo (matches the Figma
     reference), and let the auto right margin push the search/theme group into
     the right corner. */
  #fern-header .fern-header-tabs {
    order: 2;
    position: static;
    transform: none;
    display: flex;
    align-items: center;
    width: auto;
    margin: 0 auto 0 24px;
    padding: 0;
    justify-content: flex-start;
  }

  #fern-header div:has(> div > #fern-search-button) {
    order: 3;
    width: auto;
    max-width: 320px;
    flex: 0 0 auto;
  }

  #fern-header .fern-header-navbar-links {
    order: 4;
  }

  #fern-header .fern-header-mobile-menu-button {
    order: 5;
  }

}

/* Remove the teal underline bar beneath the active nav tab; the active tab
   text already turns teal, which serves as the selection indicator. */
#fern-header [data-radix-collection-item]::after {
  display: none !important;
}

.passport-footer {
  width: 100%;
  border-top: 1px solid #e4e4e7;
  color: #989fb3;
  font-size: 12px;
  line-height: 18px;
}

/* Dark mode: soft light-grey divider above the footer. */
html.dark .passport-footer__link:hover,
html.dark .passport-footer__button:hover {
  color: #f5f5f5;
  text-decoration: underline;
}
html.dark .passport-footer__link:focus-visible,
html.dark .passport-footer__button:focus-visible {
  color: #f5f5f5;
  text-decoration: underline;
}

.passport-footer__inner {
  display: grid;
  grid-template-columns: 1fr;
  align-items: center;
  gap: 8px;
  padding: 24px 32px;
  text-align: center;
}

.passport-footer__left {
  display: flex;
  justify-content: center;
}

.passport-footer__center {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
}

.passport-footer__legal-links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 4px 16px;
}

.passport-footer__link,
.passport-footer__button {
  margin: 0;
  border: 0;
  background: transparent;
  padding: 0;
  color: #989fb3;
  font: inherit;
  text-decoration: none;
}

.passport-footer__button {
  cursor: pointer;
}

.passport-footer__link:hover,
.passport-footer__button:hover {
  color: #17181b;
  text-decoration: underline;
}
.passport-footer__link:focus-visible,
.passport-footer__button:focus-visible {
  color: #17181b;
  text-decoration: underline;
}

.passport-footer__privacy-notice {
  color: #989fb3;
}

.passport-footer__privacy-button {
  white-space: nowrap;
}

.passport-footer__copyright {
  margin: 0;
}

@media (min-width: 768px) {

  .passport-footer__inner {
    grid-template-columns: 1fr 2fr 1fr;
    text-align: left;
  }

  .passport-footer__left {
    justify-content: flex-start;
  }

  .passport-footer__copyright {
    text-align: right;
  }

}

/* ── Brighten sidebar to pure white (light mode only) ──────────────────────
   Sidebar defaulted to #FBFBFB; pin it to --background (opaque white).
   Header is intentionally left translucent (Fern default = --background @70%)
   so its backdrop-filter blur fade stays visible as content scrolls under it.
   Dark mode (html.dark) keeps Fern's frosted defaults. */
html:not(.dark) {
  --sidebar-background: var(--background);
}

/* ── Bottom page-nav ("Next") card: soften hover to match .fern-card ────────
   Fern's default snaps the border to --accent-a9 (near-black) with
   transition-property:none (instant). Mirror the card hover: subtle gray edge,
   gentle 150ms fade. Higher-specificity selectors override the bundle. */
.fern-footer-nav .fern-footer-next {
  transition: border-color 150ms ease, background-color 150ms ease;
}
html:not(.dark) .fern-footer-nav .fern-footer-next:hover {
  border-color: rgba(0, 0, 0, 0.20);
  background-color: rgba(0, 0, 0, 0.015);
  transition-property: border-color, background-color;
}
html:not(.dark) .fern-footer-nav .fern-footer-next:focus-visible {
  border-color: rgba(0, 0, 0, 0.20);
  background-color: rgba(0, 0, 0, 0.015);
  transition-property: border-color, background-color;
}
html.dark .fern-footer-nav .fern-footer-next:hover {
  border-color: rgba(255, 255, 255, 0.22);
  background-color: rgba(255, 255, 255, 0.02);
  transition-property: border-color, background-color;
}
html.dark .fern-footer-nav .fern-footer-next:focus-visible {
  border-color: rgba(255, 255, 255, 0.22);
  background-color: rgba(255, 255, 255, 0.02);
  transition-property: border-color, background-color;
}

/* ── Taller top nav ────────────────────────────────────────────────────────
   With tabs-placement:header the header is a single flex row sized by
   .width-before-scroll-bar (padding-top + tallest child ≈ 54px). Its inner
   .fern-header-content is display:contents, so --header-height-real can't size
   it. Add balanced vertical padding to the flex sizer instead (~54 → ~80px);
   Fern's JS re-measures --header-height, so all sticky offsets self-correct. */
#fern-header .width-before-scroll-bar {
  padding-top: 18px;
  padding-bottom: 18px;
  align-items: center;
}

/* ── Sidebar: keep Fern's gray active pill + hover, just add easing ─────────
   The gray pill is intentional. Fern only snaps hover/active in instantly
   (transition-property:none); re-enable a 150ms ease so it matches the eased
   feel of the cards and nav. Fills are left as Fern's defaults. */
.fern-sidebar-link {
  transition-property: color, background-color;
  transition-duration: 150ms;
}
.fern-sidebar-link:hover {
  transition-property: color, background-color;
}
.fern-sidebar-link:focus-visible {
  transition-property: color, background-color;
}

/* ── Active top-nav tab: add a text underline (complements the faux-bold) ───
   Fern marks the active tab (Docs/Changelog) with color + a faux-bold text
   stroke; its :after indicator bar isn't reading. Add an explicit underline
   with offset so the active tab is unmistakable. */
#fern-header [data-radix-collection-item][data-state="active"],
#fern-header [data-radix-collection-item][data-state="active"] > span {
  text-decoration: underline;
  text-decoration-thickness: 2px;
  text-underline-offset: 4px;
}
/* The label span is .truncate (overflow:hidden), which clips the offset
   underline. Tab labels are short, so let the active one overflow visibly. */
#fern-header [data-radix-collection-item][data-state="active"] > span {
  overflow: visible;
}
