* {
  box-sizing: border-box;
}

body.api-docs-shell {
  margin: 0;
  min-height: 100vh;
  background: #F5F6F8;
  color: #111418;
  font-family: "Manrope", "Segoe UI", system-ui, sans-serif;
  -webkit-font-smoothing: antialiased;
}

a {
  color: #0F9C7C;
  text-decoration: none;
}

table {
  border-collapse: collapse;
}

.api-docs {
  display: grid;
  grid-template-columns: 244px minmax(0, 1fr);
  gap: 0;
  align-items: start;
}

.api-docs__nav {
  position: sticky;
  top: 0;
  min-height: 100vh;
  padding: 18px 14px;
  background: #1B1D1F;
}

.cab-sidebar-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 8px 20px;
}

.cab-sidebar-brand-link {
  display: flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
}

.cab-sidebar-brand-link span {
  color: #fff;
  font-weight: 800;
  font-size: 14px;
  letter-spacing: 0.14em;
}

/* Возврат в кабинет. Стоит над списком глав и отделён от него рамкой: это
   не раздел документации, а выход из неё. */
.api-docs__back {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 14px;
  padding: 9px 10px;
  border-radius: 10px;
  border: 1px solid rgba(255, 255, 255, .12);
  color: rgba(255, 255, 255, .78);
  font-size: 13.5px;
  font-weight: 600;
  text-decoration: none;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}

.api-docs__back:hover {
  background: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .24);
  color: #fff;
}

.api-docs__back i {
  font-size: 12px;
}

.api-docs__nav-title {
  padding: 6px 10px 16px;
  color: #fff;
  font-size: 11px;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.1em;
}

.api-docs__nav-link {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 9px 10px;
  margin-bottom: 2px;
  border-radius: 10px;
  color: rgba(255, 255, 255, .66);
  font-size: 13.5px;
  font-weight: 600;
}

.api-docs__nav-link:hover {
  background: rgba(255, 255, 255, .06);
  color: #fff;
}

.api-docs__nav-link.active {
  color: #0FF0B6;
  background: rgba(32, 252, 193, .12);
}

/* Ссылки в меню длинные, а колонка узкая: без переноса подписи обрезались. */
.api-docs__nav-link span {
  line-height: 1.25;
}

/* Меню само прокручивается, если разделов больше, чем помещается в окно. */
.api-docs__nav {
  max-height: 100vh;
  overflow-y: auto;
}

.api-docs__content {
  min-width: 0;
  padding: 40px clamp(20px, 4vw, 48px) 60px;
  /* Ширина не ограничивается: справа оставалось пустое поле, а примеры кода
     и таблицы из-за этого прокручивались там, где место было. */
}

.api-docs__header {
  margin-bottom: 24px;
}

.api-docs__eyebrow {
  margin: 0 0 8px;
  color: #0F9C7C;
  font-size: 12.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
}

.api-docs__header h1 {
  margin: 0;
  color: #111418;
  font-size: clamp(28px, 4vw, 38px);
  font-weight: 800;
  letter-spacing: -.02em;
}

.api-docs__section {
  margin-bottom: 16px;
  padding: 22px;
  background: #fff;
  border: 1px solid rgba(17, 24, 39, .07);
  border-radius: 18px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04);
  scroll-margin-top: 24px;
}

.api-docs__section h2 {
  margin: 0 0 12px;
  color: #111418;
  font-size: 18px;
  font-weight: 800;
}

.api-docs__section ul {
  margin: 0;
  padding-left: 18px;
  color: #5A616A;
  font-size: 14.5px;
  line-height: 1.6;
}

.api-docs__section li + li {
  margin-top: 8px;
}

/* Кнопка копирования лежит на самом блоке кода, а не над ним: отдельной
   строкой она выглядела элементом текста, а не действием над примером. */
.api-docs__code-wrap {
  position: relative;
}

.api-docs__copy {
  position: absolute;
  /* 16px — верхний отступ самого блока кода, дальше поле внутри него. */
  top: 26px;
  right: 12px;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 10px;
  border: 1px solid rgba(255, 255, 255, .14);
  border-radius: 8px;
  background: rgba(255, 255, 255, .06);
  color: rgba(255, 255, 255, .7);
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}

.api-docs__copy:hover {
  background: rgba(255, 255, 255, .12);
  color: #fff;
}

/* Отдача на самой кнопке: всплывающее окно ради копирования строки —
   лишнее действие на каждый пример. */
.api-docs__copy.is-copied {
  border-color: rgba(32, 252, 193, .5);
  background: rgba(32, 252, 193, .16);
  color: #0FF0B6;
}

/* Подъём в начало. Спрятана, пока страница не пролистана: висеть над
   текстом, когда до верха и так один экран, ей незачем. Класс ставит
   скрипт; без него ссылка просто видна всегда и работает. */
.api-docs__totop {
  position: fixed;
  top: 16px;
  right: 16px;
  z-index: 20;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 12px;
  border: 1px solid rgba(255, 255, 255, .14);
  background: rgba(27, 29, 31, .92);
  backdrop-filter: blur(8px);
  color: #fff;
  font-size: 14px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .28);
  transition: opacity .18s ease, transform .18s ease, background .15s ease;
}

.api-docs__totop:hover {
  background: #1B1D1F;
}

.api-docs__totop.is-hidden {
  opacity: 0;
  transform: translateY(-8px);
  pointer-events: none;
}

.api-docs__code {
  margin: 16px 0 0;
  /* Поле справа под кнопку: без него длинная первая строка уезжала под неё. */
  padding: 14px 118px 14px 16px;
  overflow-x: auto;
  color: #E4E7EB;
  background: #1B1D1F;
  border-radius: 12px;
  font-family: ui-monospace, Menlo, monospace;
  font-size: 13px;
  line-height: 1.6;
}

.api-docs__table-wrap {
  overflow: hidden;
  background: #fff;
  border: 1px solid rgba(17, 24, 39, .07);
  border-radius: 18px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .04);
}

.api-docs__table {
  margin: 0;
  width: 100%;
  font-size: 13.5px;
}

.api-docs__table th {
  width: 30%;
  padding: 12px 16px;
  color: #8A9099;
  background: #FAFBFC;
  border-bottom: 1px solid rgba(17, 24, 39, .07);
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  text-align: left;
}

.api-docs__table td {
  padding: 14px 16px;
  color: #5A616A;
  vertical-align: top;
  border-top: 1px solid rgba(17, 24, 39, .055);
}

.api-docs__table td:first-child {
  color: #111418;
  font-weight: 700;
  white-space: nowrap;
}

@keyframes api-jump-in {
  from {
    opacity: 0;
    transform: translateY(-6px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

/* Переход по якорю доезжает, а не перепрыгивает: по списку разделов ходят
   подряд, и рывок между ними каждый раз сбивает, докуда долистали. */
html {
  scroll-behavior: smooth;
}

/* Уважает системную настройку: для тех, кому движение мешает, прокрутка и
   раскрытие остаются мгновенными. */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  .api-docs__jump[open] .api-docs__jump-list {
    animation: none;
  }
}

/* Переход по разделам для телефона. На широком экране его роль играет
   боковое меню, поэтому здесь он спрятан. */
.api-docs__jump {
  display: none;
}

@media (max-width: 900px) {
  .api-docs {
    grid-template-columns: 1fr;
  }

  /* От бокового меню на телефоне остаётся только шапка с логотипом и
     возвратом в кабинет: сами разделы переехали в липкую строку, а два
     списка одних и тех же ссылок на одной странице — это выбор без
     разницы. */
  .api-docs__nav {
    position: static;
    min-height: 0;
    max-height: none;
    overflow: visible;
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    gap: 12px;
    /* Те же поля по краям, что у строки разделов под шапкой и у текста:
       у бокового меню они были свои, и логотип на телефоне стоял левее
       всего остального на странице. */
    padding: 12px clamp(20px, 4vw, 48px);
  }

  .api-docs__nav-title,
  .api-docs__nav > .api-docs__nav-link {
    display: none;
  }

  .api-docs__nav .cab-sidebar-header {
    padding: 0;
    flex: 0 1 auto;
    min-width: 0;
  }

  /* В строку с логотипом: отступ снизу остался от вертикального меню и
     приподнимал ссылку над логотипом. Прижата к правому краю — это
     выход со страницы, а не сосед логотипа. */
  .api-docs__nav .api-docs__back {
    flex: 0 0 auto;
    margin: 0 0 0 auto;
    padding: 8px 12px;
    white-space: nowrap;
  }

  .api-docs__jump {
    display: block;
    /* Липкая: за ней и затевалось — уехав вверх, меню оставляло страницу
       без единого способа перейти дальше. */
    position: sticky;
    top: 0;
    z-index: 5;
    background: #1B1D1F;
    border-bottom: 1px solid rgba(255, 255, 255, .1);
  }

  .api-docs__jump summary {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 13px clamp(20px, 4vw, 48px);
    color: #fff;
    font-size: 13.5px;
    font-weight: 700;
    cursor: pointer;
    /* Свой треугольник у summary в Safari и Chrome разный, а строка тут
       выровнена вручную. */
    list-style: none;
  }

  .api-docs__jump summary::-webkit-details-marker {
    display: none;
  }

  /* Название текущего раздела занимает всю свободную ширину и обрезается:
     заголовки длинные, и без этого строка ломалась бы на две. */
  .api-docs__jump-current {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: #0FF0B6;
  }

  .api-docs__jump-caret {
    flex: 0 0 auto;
    font-size: 11px;
    color: rgba(255, 255, 255, .5);
    transition: transform .15s ease;
  }

  .api-docs__jump[open] .api-docs__jump-caret {
    transform: rotate(180deg);
  }

  /* Раскрытый список прокручивается сам и не длиннее экрана: разделов
     под двадцать, и без потолка он уводил бы страницу далеко вниз. */
  .api-docs__jump-list {
    display: flex;
    flex-direction: column;
    gap: 2px;
    /* С поправкой на поле внутри самих ссылок — их подписи встают по той
       же вертикали, что и строка над списком. */
    padding: 0 calc(clamp(20px, 4vw, 48px) - 10px) 12px;
    max-height: min(60vh, 420px);
    overflow-y: auto;
    overscroll-behavior: contain;
  }

  .api-docs__jump-list .api-docs__nav-link {
    padding: 11px 10px;
  }

  /* Раскрытие с анимацией: details показывает содержимое мгновенно, и
     список из восемнадцати пунктов выпрыгивал на пол-экрана рывком.
     Анимация только на открытие — закрытие браузер делает сразу, и
     доигрывать её было бы уже не на чем. */
  .api-docs__jump[open] .api-docs__jump-list {
    animation: api-jump-in .18s ease-out;
  }

  .api-docs__jump[open] summary {
    background: rgba(255, 255, 255, .04);
  }

  /* Переход по якорю останавливается под липкой строкой, а не под ней:
     иначе заголовок раздела оказывался ровно за ней, и казалось, что
     промахнулись мимо. */
  /* Ниже липкой строки разделов: она занимает верх экрана целиком, и
     кнопка иначе легла бы прямо на неё. */
  .api-docs__totop {
    top: 60px;
    width: 38px;
    height: 38px;
  }

  .api-docs__copy {
    top: 24px;
    right: 10px;
  }

  .api-docs__section,
  .api-docs__content {
    scroll-margin-top: 52px;
  }

  .api-docs__table-wrap {
    overflow-x: auto;
  }

  .api-docs__table {
    min-width: 560px;
  }
}
