/* ═══════════════════════════════════════════════════════════════════════════
   КОМПОНЕНТЫ ЯСНЫ — библиотека на ролях из core/tokeny.css.

   ЗАЧЕМ. Четырёх вещей в приложении не было вовсе: подтверждения (Dialog),
   короткого сообщения о сделанном (Snackbar), полосы-сообщения на экране
   (Banner) и оправы для пустого списка (EmptyState). Каждый экран решал это
   по-своему или не решал: тост существовал ровно один и только в Книге,
   «Скопировано» в Профиле было строкой внутри карточки, а на вопрос «выйти
   из партии?» отвечал системный confirm с английскими «OK / Cancel».
   Полоса-сообщение на Играх на ширине 360 обрезала свой же текст.

   ПРАВИЛА ФАЙЛА (из ds.md — самого файла в репозитории нет, см. шапку
   core/tokeny.css; ниже они выписаны целиком, искать больше негде):
     · ни одного #hex — только роли из tokeny.css;
     · ни одного !important — файл подключается после tokeny.css и до
       файла экрана, и ничего чужого не перекрашивает: он объявляет только
       свои классы с префиксом .ya-;
     · нажимаемое — не меньше 48×48, видимая высота может быть меньше;
     · высота передаётся подложкой из лестницы surface-container, тень
       только у диалога и тоста (уровни 5 и 5);
     · длительности и кривые — токенами; при «убрать анимации» их гасит
       утилита в tokeny.css.

   ПОДКЛЮЧЕНИЕ. Файл нужен всюду, где встречаются .ya-* классы. Пока строка
   подключения не проставлена на страницах, JS-помощник window.YasnaOkna
   (core/dialogs.js) дописывает <link> сам — по адресу уже подключённого
   core/tokeny.css, чтобы путь сходился и на вложенных страницах.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══ ИКОНКИ · один набор на всё ══════════════════════════════════════════
   Раньше значков было три языка сразу: SVG-линии, эмодзи и юникод-глифы
   («✕», «›», «·», «✓», «★», «🔍»). Юникод рисуется системным шрифтом: своя
   толщина, своя базовая линия, и цветом роли он не красится.

   Здесь один набор: сетка 24, обводка 2, скруглённые концы, цвет —
   currentColor. Сделан масками, а не спрайтом <use href="файл.svg#имя">:
   ссылка в чужой файл в WebView без сети срабатывает не всегда, а маска —
   часть таблицы стилей и живёт там же, где цвет. Значок ставится одним
   пустым узлом: <span class="ya-ik ya-ik--zakryt"></span>.
   Эмодзи остаётся ровно один — зверь-аватар: это осознанно. */

.ya-ik{
  display:inline-block; flex:none; width:24px; height:24px;
  background-color:currentColor; vertical-align:-.25em;
  -webkit-mask:var(--ya-ik) center/contain no-repeat;
          mask:var(--ya-ik) center/contain no-repeat;
}
.ya-ik--18{ width:18px; height:18px; }   /* значок в подписи кнопки */
.ya-ik--48{ width:48px; height:48px; }   /* значок пустого состояния */

/* ═══ КНОПКА ══════════════════════════════════════════════════════════════
   Четыре вида одной кнопки вместо одиннадцати спецификаций залитой.
   Высота 48 (в карточке 40, во всю ширину 56), радиус 12, подпись Label L
   в одну строку. Нажатие — слой из собственного цвета текста, а не второй
   hex: «вторых синих» в системе больше нет. */

.ya-btn{
  position:relative; box-sizing:border-box;
  display:inline-flex; align-items:center; justify-content:center;
  gap:var(--sp-2);
  min-height:var(--h-btn); padding:0 var(--sp-6);
  border:none; border-radius:var(--shape-m);
  font:var(--type-label-l);
  white-space:nowrap; text-decoration:none; cursor:pointer;
  /* Подпись без заливки — это ТЕКСТ, и мера у него текстовая: сам --primary
     на подложке диалога давал 3.86, а «Оставить» и «Удалить» — это ответ на
     вопрос, и читаться он обязан лучше всего. Заливка ниже остаётся на
     --primary: белому на ней хватает 4.70. */
  background:transparent; color:var(--ya-primary-ink);
  transition:
    background-color var(--dur-short) var(--ease-standard),
    background var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    transform var(--dur-short) var(--ease-standard),
    filter var(--dur-short) var(--ease-standard);
}
.ya-btn--filled  { background:var(--ya-cta,var(--primary)); color:var(--ya-cta-on,var(--on-primary)); }
.ya-btn--filled:not(:disabled){
  background:linear-gradient(180deg,
    color-mix(in srgb, var(--ya-cta, var(--primary)) 86%, var(--ya-cta-on, var(--on-primary))) 0%,
    var(--ya-cta, var(--primary)) 100%);
  color:var(--ya-cta-on, var(--on-primary));
  box-shadow:var(--ya-selected-glow),
    0 8px 22px color-mix(in srgb, var(--ya-cta, var(--primary)) 22%, transparent);
}
.ya-btn--tonal   { background:var(--secondary-container); color:var(--on-secondary-container); }
.ya-btn--outlined{ box-shadow:inset 0 0 0 1px var(--outline); color:var(--ya-primary-ink); }
.ya-btn--text    { padding:0 var(--sp-3); }
.ya-btn--compact { min-height:var(--h-btn-compact); }
.ya-btn--hero    { min-height:var(--h-btn-hero); width:100%; }

/* Слой нажатия одинаков для всех четырёх видов: доля берётся из токена,
   цвет — из собственной подписи кнопки. */
.ya-btn::after{
  content:''; position:absolute; inset:0; border-radius:inherit;
  background:currentColor; opacity:0; pointer-events:none;
  transition:opacity var(--dur-short) var(--ease-standard);
}
.ya-btn:active::after     { opacity:var(--state-pressed); }
.ya-btn:active:not(:disabled){ transform:scale(.98); }
.ya-btn:focus-visible     { outline:2px solid var(--primary); outline-offset:2px; }
@media (hover:hover) and (pointer:fine){
  .ya-btn:hover:not(:disabled)::after{ opacity:var(--state-hover); }
  .ya-btn--filled:hover:not(:disabled){
    filter:brightness(1.05);
    box-shadow:var(--ya-selected-glow),
      0 12px 28px color-mix(in srgb, var(--ya-cta, var(--primary)) 30%, transparent);
  }
  .ya-btn--outlined:hover:not(:disabled){
    background:color-mix(in srgb, var(--ya-primary-ink) calc(var(--state-hover) * 100%), transparent);
  }
  .ya-btn--tonal:hover:not(:disabled){ filter:brightness(1.04); }
}
.ya-btn:disabled{
  cursor:default; transform:none; filter:none;
  color:color-mix(in srgb, var(--on-surface) calc(var(--state-disabled-content) * 100%), transparent);
}
.ya-btn:disabled::after{ opacity:0; }
.ya-btn--filled:disabled, .ya-btn--tonal:disabled{
  background:color-mix(in srgb, var(--on-surface) calc(var(--state-disabled-fon) * 100%), transparent);
}

/* Кнопка только со значком: видимые 40, нажимаемые 48 добираются паддингом. */
.ya-ib{
  box-sizing:content-box;
  display:inline-flex; align-items:center; justify-content:center;
  width:var(--h-ib); height:var(--h-ib);
  padding:calc((var(--cel-min) - var(--h-ib)) / 2);
  margin:calc((var(--h-ib) - var(--cel-min)) / 2);
  border:none; border-radius:var(--shape-full);
  background:transparent; color:var(--on-surface-variant); cursor:pointer;
}
.ya-ib:active{ background:color-mix(in srgb, currentColor calc(var(--state-pressed) * 100%), transparent); }
.ya-ib:focus-visible{ outline:2px solid var(--primary); outline-offset:-2px; }

/* ═══ ДИАЛОГ ══════════════════════════════════════════════════════════════
   Вопрос с глаголами на кнопках вместо системного confirm. Отказ стоит
   слева и держит фокус; закрытие без ответа — это отказ.
   Разметка: .ya-dialog > .ya-dialog__karta > (h2 + p + .ya-dialog__ryad). */

.ya-dialog{
  position:fixed; inset:0; z-index:9600;
  display:flex; align-items:center; justify-content:center;
  padding:var(--sp-6);
  background:var(--scrim);
  animation:ya-proyavit var(--dur-long) var(--ease-emphasized-decel);
}
/* СВОЯ ПРОКРУТКА У КАРТОЧКИ. Вопрос стоит в неподвижном слое: что вылезло за
   край экрана, страница не принесёт (проба 10.09.2026: scrollTop=200 карточку
   не сдвинул). При экране 390×420 и системном кегле ×2 длинный вопрос давал
   карточку 950 — обе кнопки-ответа оказывались за нижним краем, и ответить на
   вопрос было нечем. Процент считается от содержимого .ya-dialog, у которого
   уже вычтено поле sp-6; пока текст помещается — свойства молчат. */
.ya-dialog__karta{
  box-sizing:border-box; width:100%; max-width:340px;
  max-height:100%; overflow:auto; overscroll-behavior:contain;
  padding:var(--sp-6) var(--sp-6) var(--sp-2);
  border-radius:var(--shape-xl);
  background:var(--surface-container-high); color:var(--on-surface);
  box-shadow:var(--elev-5);
  animation:ya-vsplyt var(--dur-long) var(--ease-emphasized-decel);
}
.ya-dialog__znak{ display:block; margin:0 auto var(--sp-3); color:var(--secondary); }
.ya-dialog__zag{ margin:0 0 var(--sp-2); font:var(--type-headline-s); }
.ya-dialog__txt{ margin:0; font:var(--type-body-m); color:var(--on-surface-variant); }
/* Кнопки прижаты вправо и переносятся на вторую строку, если подписи-глаголы
   длинные: обрезать глагол нельзя — он и есть ответ на вопрос. */
.ya-dialog__ryad{
  display:flex; flex-wrap:wrap; justify-content:flex-end;
  gap:var(--sp-1); margin-top:var(--sp-4);
}
.ya-dialog__karta .ya-btn--opasno{ color:var(--error); }

/* ШИРОКИЙ ДИАЛОГ · .ya-dialog--shiroko
   Форма на несколько полей (правка вопроса, публикация в админке), а не
   вопрос с двумя глаголами. 340 — ширина вопроса: форме из пяти полей там
   тесно, и админка держала свой остров .ad-modal на 640. Модификатор стоит
   на корне .ya-dialog, по образцу .ya-kolco--lg: та же часть, другой размер.
   Поле снизу sp-6, а не sp-2: под рядом кнопок формы ничего нет, текстовых
   глаголов вопроса тут нет. Ряд отделён волоском — при длинной форме кнопки
   уходят вниз, и граница говорит, где кончились поля. Действие, которое
   стоит особняком («Удалить»), прижимается влево через __sleva.
   Разметка: .ya-dialog.ya-dialog--shiroko > .ya-dialog__karta[role=dialog] >
     (h2.ya-dialog__zag + …поля… + .ya-dialog__ryad). */
.ya-dialog--shiroko .ya-dialog__karta{ max-width:640px; padding:var(--sp-6); }
.ya-dialog--shiroko .ya-dialog__zag{ margin-bottom:var(--sp-4); }
.ya-dialog--shiroko .ya-dialog__ryad{
  margin-top:var(--sp-6); padding-top:var(--sp-4);
  border-top:1px solid var(--outline-variant);
}
.ya-dialog__sleva{ margin-right:auto; }
/* На узком экране поле вокруг карточки ужимается: форме нужна ширина. */
@media (max-width:480px){ .ya-dialog--shiroko{ padding:var(--sp-3); } }

@keyframes ya-proyavit{ from{ opacity:0 } to{ opacity:1 } }
@keyframes ya-vsplyt{ from{ opacity:0; transform:translateY(12px) scale(.96) } to{ opacity:1; transform:none } }

/* ═══ ТОСТ ════════════════════════════════════════════════════════════════
   Короткое сообщение о том, что уже сделано. Встаёт над наббаром: его
   высоту оболочка держит в --yk-nav, на сайте наббара нет — там 16.
   Инверсная подложка, 11.4:1 к подписи. */

.ya-snack{
  position:fixed; z-index:9500;
  left:var(--sp-4); right:var(--sp-4);
  bottom:calc(var(--yk-nav, 16px) + var(--sp-2));
  box-sizing:border-box;
  display:flex; align-items:center; gap:var(--sp-2);
  min-height:var(--cel-min);
  max-width:560px; margin:0 auto;
  padding:var(--sp-2) var(--sp-2) var(--sp-2) var(--sp-4);
  border-radius:var(--shape-s);
  background:var(--inverse-surface); color:var(--inverse-on-surface);
  box-shadow:var(--elev-5);
  animation:ya-vsplyt var(--dur-medium) var(--ease-emphasized-decel);
}
.ya-snack__txt{ flex:1; min-width:0; font:var(--type-body-m); }
/* Действие тоста красится инверсной подписью, а не primary: на тёмной
   подложке светлой темы синий даёт меньше трёх. */
.ya-snack .ya-btn{ color:inherit; min-height:var(--h-btn-compact); }
.ya-snack--uhodit{ animation:ya-uyti var(--dur-medium) var(--ease-emphasized-accel) forwards; }

@keyframes ya-uyti{ to{ opacity:0; transform:translateY(8px) } }

/* ═══ ПОЛОСА-СООБЩЕНИЕ ════════════════════════════════════════════════════
   То, что раньше рисовал каждый экран сам: обновление на Главной, «уроки на
   сервере» на Играх, бежевая заметка Рейтинга, пунктирная строка Уроков.
   На Играх такая полоса на ширине 360 обрезала собственный текст, поэтому
   здесь: текстовая колонка min-width:0, заголовок без nowrap, ряд действий
   без flex-shrink:0 и с переносом. */

.ya-banner{
  box-sizing:border-box;
  display:flex; align-items:flex-start; gap:var(--sp-3);
  padding:var(--sp-4);
  border-radius:var(--shape-l);
  background:var(--surface-container); color:var(--on-surface);
}
.ya-banner__znak{ color:var(--secondary); margin-top:2px; }
.ya-banner__telo{ flex:1 1 auto; min-width:0; }
.ya-banner__zag{ margin:0 0 var(--sp-1); font:var(--type-title-s); overflow-wrap:anywhere; }
.ya-banner__txt{ margin:0; font:var(--type-body-m); color:var(--on-surface-variant); overflow-wrap:anywhere; }
.ya-banner__ryad{
  display:flex; flex-wrap:wrap; justify-content:flex-end;
  gap:var(--sp-1); margin-top:var(--sp-2);
}
.ya-banner--vnimanie{ background:var(--tertiary-container); color:var(--on-tertiary-container); }
.ya-banner--vnimanie .ya-banner__znak,
.ya-banner--vnimanie .ya-banner__txt{ color:inherit; }

/* ═══ ПУСТОЕ СОСТОЯНИЕ ════════════════════════════════════════════════════
   Раньше это был просто абзац посреди экрана. Слова остаются те же —
   меняется только оправа: значок, заголовок, объяснение и, если есть что
   предложить, одна кнопка. */

.ya-empty{
  display:flex; flex-direction:column; align-items:center; text-align:center;
  gap:var(--sp-2); padding:var(--sp-8) var(--sp-4);
}
.ya-empty__znak{ color:var(--on-surface-variant); margin-bottom:var(--sp-1); }
.ya-empty__zag{ margin:0; font:var(--type-title-m); color:var(--on-surface); }
.ya-empty__txt{ margin:0; max-width:34ch; font:var(--type-body-m); color:var(--on-surface-variant); }
.ya-empty .ya-btn{ margin-top:var(--sp-2); }

/* ═══ ПОДСКАЗКА · .ya-podskazka ════════════════════════════════════════
   ЗАЧЕМ. Пояснение к полю жило абзацем под полем и съедало экран: в форме
   правки профиля такие абзацы занимали пятую часть высоты. Пояснение нужно
   не всем и не всегда — тем, кому непонятно, и в тот миг, когда непонятно.
   Значит его место — за знаком «?» у метки, а внутри поля серым стоит
   пример того, что вписывать.

   РАЗМЕТКА. Кнопка, а не иконка: до неё доходит клавиатура, и тултип
   открывается и по наведению, и по фокусу. Текст лежит в самой разметке, а
   не в title (title на телефоне не показывается вовсе). Тот же текст
   связывают с полем через aria-describedby — диктор слышит его как
   описание поля, тултип ему не нужен.

     <label class="ya-pole__metka" for="tel">Телефон
       <button class="ya-podskazka" type="button" aria-label="Пояснение"
               aria-describedby="tel-pod">
         <span class="ya-podskazka__tekst" id="tel-pod" role="tooltip">
           Видишь только ты. Пригодится, когда попросишь посчитать имя.
         </span>
       </button>
     </label>
     <input class="ya-pole__vvod" id="tel" aria-describedby="tel-pod">

   Нажимаемая цель у знака — --h-btn-compact (40): он стоит внутри строки
   метки, и 48 раздвинули бы строку; 40 — минимум, который система допускает
   для вспомогательного. На телефоне тултип открывает/закрывает касание
   (класс .ya-podskazka--otkryta + core/podskazka.js): второй тап по тому же
   «?» снимает класс и blur — иначе :focus оставлял бы пузырь открытым
   навсегда. На столе — :hover; с клавиатуры — :focus-visible.

   ЯКОРЬ. По умолчанию тултип прижат к ПРАВОМУ краю кнопки (right:0) и растёт
   влево: «?» у правого края полной строки (шаги «Свои люди») иначе уезжал
   за экран и раздувал документ вбок. У меток поля (.ya-pole__metka) «?»
   стоит у левого края после короткого слова — там оставляем рост вправо,
   как раньше. max-width + overflow-wrap + box-sizing не дают пузырю стать
   шире экрана; html:not(.yk-shire){overflow-x:clip} ниже — страховка, чтобы
   даже ошибочный абсолют не паннул страницу (карусели со своим
   overflow-x:auto не страдают). */
.ya-podskazka{
  box-sizing:border-box;position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:var(--h-btn-compact);height:var(--h-btn-compact);margin:calc(var(--sp-2)*-1) 0;
  padding:0;border:0;background:transparent;cursor:help;vertical-align:middle;
  color:var(--on-surface-variant)}
.ya-podskazka::before{
  content:'?';display:inline-grid;place-content:center;width:18px;height:18px;
  border:1.5px solid currentColor;border-radius:var(--shape-full);
  font:var(--type-label-s);font-weight:700;line-height:1}
.ya-podskazka:hover,.ya-podskazka:focus-visible,.ya-podskazka--otkryta{color:var(--primary);outline:none}
.ya-podskazka:focus-visible::before{outline:2px solid var(--primary);outline-offset:2px}
.ya-podskazka__tekst{
  position:absolute;right:0;left:auto;bottom:calc(100% + 4px);
  box-sizing:border-box;width:max-content;max-width:min(280px,calc(100vw - 24px));
  padding:var(--sp-2) var(--sp-3);overflow-wrap:anywhere;
  font:var(--type-body-s);line-height:1.45;text-align:left;text-transform:none;letter-spacing:0;
  color:var(--on-surface);background:var(--surface-container-highest);
  border:1px solid var(--outline-variant);border-radius:var(--shape-s);box-shadow:var(--elev-2);
  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s;z-index:5}
/* Метка поля: «?» у левого края — расти вправо, иначе обрежется слева. */
.ya-pole__metka .ya-podskazka__tekst,
.metka .ya-podskazka__tekst{
  left:calc(var(--sp-2)*-1);right:auto}
/* Открытие: класс (тап/клик, core/podskazka.js), :hover на мыши, :focus-visible
   с клавиатуры. Голый :focus не держим — на телефоне второй тап по уже
   сфокусированной кнопке не снимает фокус, и пузырь оставался бы открытым. */
.ya-podskazka:hover .ya-podskazka__tekst,
.ya-podskazka--otkryta .ya-podskazka__tekst,
.ya-podskazka:focus-visible .ya-podskazka__tekst{opacity:1;visibility:visible}
html[data-dvizhenie="off"]{ .ya-podskazka__tekst{transition-duration:.001s} }

/* Страховка ширины документа (сайт и страницы с komponenty.css). clip, не
   hidden: не создаёт скроллпорт и не ломает sticky; намеренные ленты со
   своим overflow-x:auto остаются. Opt-out: html.yk-shire / data-yk-shire
   на body (см. app/navigatsiya.js). */
@supports (overflow-x:clip){
  html:not(.yk-shire){overflow-x:clip}
}

/* ═══ ПОЛЕ ВВОДА ══════════════════════════════════════════════════════════
   ЗАЧЕМ. Поля в продукте нарисованы шестью разными высотами и пятью кеглями:
   24 при кегле 10 и 30 при 12 в Разборе (core/dialogs.js:410,417), 29 при
   12.5 в подписи места (app.js:2064 — полупиксельных кеглей шкала не знает),
   38 при 14 в админке, 39 при 17 в имени ясны, 56 при 17 во входе и ключе.
   Три из шести вдвое ниже порога нажатия 48, который система объявляет
   обязательным. Здесь одно поле на всё: высота --h-pole, кегль Body L.

   КЕГЛЬ НЕ НИЖЕ 16 — не про красоту. Телефон приближает страницу при фокусе
   в поле мельче 16, а отдалить её человек уже не может: приложение открыто
   без адресной строки. Body L это 17.

   РАЗМЕТКА. Оборачивать всё в <label> нельзя: имя поля собирается из ВСЕГО
   текста метки, и диктор читает «Имя Одно дело, а не тема целиком 15 из 80».
   Метка отдельным узлом и связана через for/id; подсказка, счётчик и ошибка
   приходят описанием:

     <div class="ya-pole">
       <label class="ya-pole__metka" for="imya">Имя</label>
       <input class="ya-pole__vvod" id="imya" aria-describedby="imya-pod imya-schet">
       <div class="ya-pole__niz">
         <p class="ya-pole__pod" id="imya-pod">
           <span class="ya-ik ya-ik--18 ya-pole__znak ya-ik--vnimanie"></span>
           Одно дело, а не тема целиком
         </p>
         <span class="ya-pole__schet" id="imya-schet">15 из 80</span>
       </div>
     </div>

   ОШИБКА — класс .ya-pole--beda на обёртку И aria-invalid="true" на поле.
   Цвет не единственный признак: в беде проступает значок, а слово подсказки
   меняется на слово ошибки. Место под строку подсказки держится всегда
   (min-height 18 — высота строки Body S), иначе появление ошибки раздвигает
   экран и уводит кнопку из-под уже занесённого пальца: эту грабельку вход
   уже проходил (app/vhod.js:238-241).

   МНОГОСТРОЧНОЕ растёт за текстом скриптом экрана: на каждый ввод
   style.height='auto'; style.height=(scrollHeight+2)+'px' (двойка — рамка:
   scrollHeight её не считает, а высота при border-box считает, и без неё поле
   каждый раз ниже нужного на два пикселя и заводит себе прокрутку). Тот же
   счёт надо повторить по document.fonts.ready и по resize: до прихода
   гарнитуры строки меряются запасным шрифтом, выходят короче, и на первом же
   показе последняя строка уходит за нижнюю кромку (замерено: поле в 180
   встало 104), а крупный системный шрифт и поворот телефона перекладывают
   строки уже после разметки (замерено при ×1.3: нужно 398, стоит 208).
   field-sizing:content сделало бы это без скрипта, но для WebView оболочки оно
   слишком новое.
   maxlength не ставим: обрезать написанное молча нельзя — счётчик считает и
   за пределом, а поле уходит в .ya-pole--beda.

   ЗАМЕРЕНО при 375 (в каталоге, внутри оправы опыта): поле 309×56; на экране
   с полем 16 то же поле даёт 343×56. При 320 и системном шрифте ×1.3 поле
   растёт до 60 и вбок не выходит. Контраст (свет/тьма): метка
   16.79/14.74, подсказка и счётчик 6.07/6.90, слово ошибки 5.93/10.35,
   кайма поля 4.48/6.17 (норма графики 3), обводка фокуса 4.26/10.38. */

 /* РАСКЛАДКА — СЕТКА, И СЧЁТЧИК СТОИТ НАВЕРХУ, У МЕТКИ. Стоял он внизу, в одной
   строке с подсказкой, и они дрались за одну ширину: подсказка на два-три слова
   длиннее строки разворачивалась на две-три строки, а счётчик висел справа на
   первой — и читался как число про эту первую строку, а не про поле. Развели:
   счётчик к метке (число о поле — рядом с именем поля), подсказка под поле во
   всю ширину. Замерено при 375: подсказка получила 311 px вместо 254.
   Разметка при этом прежняя — __schet остаётся внутри __niz, а сам __niz отдаёт
   своих детей сетке поля (display:contents). Иначе пришлось бы переписывать
   разметку всюду, где поле уже стоит, и старая разметка сломалась бы молча. */
.ya-pole{
  display:grid; grid-template-columns:minmax(0,1fr) auto;
  column-gap:var(--sp-3);
}
.ya-pole + .ya-pole{ margin-top:var(--sp-4); }

.ya-pole__metka{
  grid-column:1; align-self:baseline; margin:0 0 var(--sp-2);
  font:var(--type-title-s); color:var(--on-surface);
}
.ya-pole__vvod{
  grid-column:1 / -1;
  box-sizing:border-box; display:block; width:100%;
  min-height:var(--h-pole); padding:var(--sp-3) var(--sp-4);
  border:1px solid var(--outline); border-radius:var(--shape-s);
  background:var(--surface-container-lowest); color:var(--on-surface);
  font:var(--type-body-l);
  appearance:none; -webkit-appearance:none;
  transition:border-color var(--dur-short) var(--ease-standard);
}
/* Своя прокрутка, а не обрезка: пока скрипт экрана не вырастил поле, человек
   всё равно доберётся до написанного. resize оставлен вертикальный — на
   мониторе он даёт управу руками, на телефоне не мешает. */
textarea.ya-pole__vvod{ resize:vertical; overflow-y:auto; }
.ya-pole__vvod::placeholder{ color:var(--on-surface-variant); opacity:1; }
/* Выпадающий список в поле. appearance:none у поля снимает и родную стрелку,
   а без неё список не отличить от поля ввода. Стрелка нарисована двумя
   градиентами цветом подписи — без картинки и без своего hex, и в тёмной
   теме перекрашивается вместе с токеном. */
select.ya-pole__vvod{
  padding-right:calc(var(--sp-4) + var(--sp-6)); cursor:pointer;
  background-image:
    linear-gradient(45deg, transparent 50%, var(--on-surface-variant) 50%),
    linear-gradient(135deg, var(--on-surface-variant) 50%, transparent 50%);
  background-position:calc(100% - 22px) 50%, calc(100% - 17px) 50%;
  background-size:5px 5px; background-repeat:no-repeat;
}
/* У поля — :focus, а не :focus-visible, как у кнопки. Кнопке кольцо под мышью
   не нужно, полю нужно всегда: в него пишут, и человек обязан видеть, куда
   попадёт буква. К тому же :focus-visible на поле срабатывает не при всяком
   способе входа (проверено: фокус скриптом его не даёт), и вместо нашего
   кольца проступало системное — 3px чёрным без отступа. */
.ya-pole__vvod:focus{
  outline:2px solid var(--primary); outline-offset:2px;
  border-color:var(--primary);
}
.ya-pole__vvod:disabled{
  cursor:default;
  color:color-mix(in srgb, var(--on-surface) calc(var(--state-disabled-content) * 100%), transparent);
  border-color:color-mix(in srgb, var(--on-surface) calc(var(--state-disabled-fon) * 100%), transparent);
  background:transparent;
}

/* Обёртка низа сама по себе больше ничего не занимает: она отдаёт подсказку и
   счётчик сетке поля, а те встают каждый на своё место. */
.ya-pole__niz{ display:contents; }
/* Место под строку подсказки занято всегда — даже когда сказать нечего: иначе
   появление ошибки раздвигает экран и уводит кнопку из-под пальца. */
.ya-pole__pod{
  grid-column:1 / -1; min-width:0; min-height:18px; margin:var(--sp-2) 0 0;
  display:flex; align-items:flex-start; gap:var(--sp-1);
  font:var(--type-body-s); color:var(--on-surface-variant);
  overflow-wrap:anywhere;
}
.ya-pole__schet{
  grid-column:2; grid-row:1; align-self:baseline; justify-self:end;
  font:var(--type-label-s); line-height:18px; color:var(--on-surface-variant);
  font-variant-numeric:tabular-nums;
}
/* Значок ошибки лежит в разметке всегда и молчит, пока беды нет: так экран
   переключает состояние одним классом, а не перестройкой узлов. */
.ya-pole__znak{ display:none; }

.ya-pole--beda .ya-pole__vvod{ border-color:var(--error); }
.ya-pole--beda .ya-pole__vvod:focus{ border-color:var(--error); }
.ya-pole--beda .ya-pole__pod{ color:var(--error); }
.ya-pole--beda .ya-pole__schet{ color:var(--error); }
.ya-pole--beda .ya-pole__znak{ display:inline-block; }

/* ═══ ПАРА ПОЛЕЙ ══════════════════════════════════════════════════════════
   Два поля под одной мыслью: «Одна сторона / Другая сторона», «Что прибывает
   / Что убывает». На телефоне столбиком, от 600 — рядом. Порог 600, а не 360:
   при 375 два поля дают по 139 внутренних пикселей, и «Первый признак
   перемены» кеглем 17 ложится в четыре строки.

   Общая мысль — не заголовок, а имя группы. Обёртке ставят role="group" и
   aria-labelledby на эту мысль, иначе диктор прочитает два поля подряд,
   ничем не связанные:

     <div class="ya-para" role="group" aria-labelledby="storony-mysl">
       <span class="ya-para__mysl" id="storony-mysl">Две стороны</span>
       <div class="ya-para__ryad"> …два .ya-pole… </div>
     </div> */

.ya-para{ display:block; }
.ya-para__mysl{
  display:block; margin:0 0 var(--sp-3);
  font:var(--type-title-s); color:var(--on-surface);
}
.ya-para__ryad{ display:grid; grid-template-columns:1fr; gap:var(--sp-4); }
/* Зазор даёт сетка — соседский отступ поля здесь только сложился бы с ним. */
.ya-para__ryad > .ya-pole + .ya-pole{ margin-top:0; }
@media (min-width:600px){
  .ya-para__ryad{ grid-template-columns:1fr 1fr; gap:var(--sp-3); align-items:start; }
}
/* РАМКИ ДВУХ ПОЛЕЙ ВСТАЮТ НА ОДНОЙ ВЫСОТЕ. Когда поля стоят рядом, подпись
   левого может занять две строки, а правого одну — и рамка левого уезжает
   вниз на строку (замерено при 720: 20 px разницы, «Что прибывает по дороге к
   стороне «Разговор»» против «Что убывает по дороге назад»). Два поля — две
   отдельные сетки, и сами по себе их строки не сходятся.
   Ровняет подписи скрипт экрана: он берёт высоту самой высокой подписи в ряду
   и ставит её остальным (min-height), а при переходе на телефон снимает.
   Подсказка ниже не в счёт — она стоит уже под рамкой.
   Почему не subgrid: у поля бывает и четвёртый ряд (у мастера «Своя ясна» под
   полем стоит своя тихая строка), а subgrid жёстко считает ряды и лишний
   ребёнок ложится поверх последнего. К тому же subgrid слишком нов для
   WebView оболочки — по той же причине здесь скриптом растят и многострочное
   поле. */

/* ═══ ШАГОМЕР ═════════════════════════════════════════════════════════════
   Где человек в маршруте. Сперва слова, потом полоса — и слова главные:
   «шаг 4 из 10» читается и глазами, и вслух, а полоса добавляет к ним меру.

   ПОЧЕМУ НЕ ТОЧКИ. Шаги уроков нарисованы точками 6×6 и спрятаны от диктора
   (aria-hidden) — то есть человеку с диктором о шагах не говорят вовсе, а
   человеку с глазами предлагают считать точки. Десять точек на 320 не
   считаются. Здесь наоборот: строка словами — единственное, что слышит
   диктор, а жёлобу ставят aria-hidden="true", потому что он повторяет её.
   Второй раз то же число вслух — это не доступность, а помеха.

   Долю ставит экран: style.setProperty('--ya-dolya', '40%').
   ЗАМЕРЕНО: заливка на жёлобе 3.86/8.95, заливка на фоне экрана 4.42/11.05 и
   на карточке 4.26/10.38 (норма графики 3); номер шага 17.41/15.69, имя шага
   6.29/7.34. Сам жёлоб на фоне тихий (1.10) — он и должен быть тихим: меру
   несёт заливка, а правду несут слова. Высота 6 — единственное число здесь,
   под которое в шкале формы роли нет; взято с полосы урока, где оно уже
   проверено (docs/learn.html:244-251). */

.ya-shagi{ display:block; }
.ya-shagi__stroka{
  display:flex; flex-wrap:wrap; align-items:baseline;
  gap:var(--sp-1) var(--sp-3); margin:0 0 var(--sp-2);
}
/* Число шага не обрезаем никогда: ради него строку и читают. */
.ya-shagi__nomer{
  flex:0 0 auto;
  font:var(--type-label-l); color:var(--on-surface);
  font-variant-numeric:tabular-nums;
}
.ya-shagi__imya{
  flex:1 1 10em; min-width:0; text-align:right;
  font:var(--type-body-s); color:var(--on-surface-variant);
  overflow-wrap:anywhere;
}
.ya-shagi__zhelob{
  height:6px; border-radius:var(--shape-full);
  background:var(--surface-container-high); overflow:hidden;
}
.ya-shagi__zaliv{
  display:block; height:100%; width:var(--ya-dolya, 0%);
  border-radius:inherit; background:var(--ya-cta, var(--primary));
  box-shadow:0 0 10px color-mix(in srgb, var(--ya-cta, var(--primary)) 32%, transparent);
  transition:
    width var(--dur-medium) var(--ease-standard),
    box-shadow var(--dur-medium) var(--ease-standard);
}

/* Короткий путь из трёх шагов (комната, ссылка, готовность). Десять точек
   урока по-прежнему не рисуем: их не счесть на 320. Три подписанных узла
   на коротком маршруте читаются, а диктору ряд прячем — строка «шаг N из 3»
   уже сказала то же самое. Узел не кнопка: маршрут ведёт экран, не шагомер.

     <div class="ya-shagi ya-shagi--trio">
       <p class="ya-shagi__stroka">…шаг 2 из 3…</p>
       <div class="ya-shagi__put" aria-hidden="true">
         <div class="ya-shagi__zhelob"><span class="ya-shagi__zaliv" style="--ya-dolya:50%"></span></div>
         <ol class="ya-shagi__ryad">
           <li class="ya-shagi__uzel ya-shagi__uzel--done">…</li>
           <li class="ya-shagi__uzel ya-shagi__uzel--now">…</li>
           <li class="ya-shagi__uzel">…</li>
         </ol>
       </div>
     </div> */
.ya-shagi--trio .ya-shagi__put{ position:relative; margin-top:var(--sp-1); }
.ya-shagi--trio .ya-shagi__zhelob{
  position:absolute; left:16.666%; right:16.666%;
  top:14px; height:3px; transform:translateY(-50%);
  overflow:visible; background:var(--surface-container-high);
}
.ya-shagi--trio .ya-shagi__zaliv{ min-width:0; }
.ya-shagi--trio .ya-shagi__ryad{
  position:relative; z-index:1;
  display:flex; margin:0; padding:0; list-style:none;
}
.ya-shagi__uzel{
  flex:1 1 0; min-width:0;
  display:flex; flex-direction:column; align-items:center; gap:var(--sp-1);
}
.ya-shagi__tochka{
  box-sizing:border-box;
  width:28px; height:28px;
  display:flex; align-items:center; justify-content:center;
  border-radius:var(--shape-full);
  font:var(--type-label-s); font-variant-numeric:tabular-nums;
  background:var(--surface-container-high); color:var(--on-surface-variant);
  box-shadow:0 0 0 3px var(--surface);
  transition:
    background var(--dur-medium) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-medium) var(--ease-standard),
    transform var(--dur-medium) var(--ease-emphasized-decel);
}
.ya-shagi__tochka .ya-ik{ width:14px; height:14px; }
.ya-shagi__podpis{
  max-width:100%;
  font:var(--type-label-s); color:var(--on-surface-variant);
  text-align:center; overflow-wrap:anywhere;
  transition:color var(--dur-short) var(--ease-standard);
}
.ya-shagi__uzel--done .ya-shagi__tochka,
.ya-shagi__uzel--now .ya-shagi__tochka{
  background:var(--ya-cta, var(--primary));
  color:var(--ya-cta-on, var(--on-primary));
}
.ya-shagi__uzel--now .ya-shagi__tochka{
  transform:scale(1.08);
  box-shadow:0 0 0 3px var(--surface), var(--ya-selected-glow);
}
.ya-shagi__uzel--done .ya-shagi__podpis,
.ya-shagi__uzel--now .ya-shagi__podpis{ color:var(--on-surface); }
.ya-shagi__uzel--now .ya-shagi__podpis{ font-weight:650; }
html[data-dvizhenie="off"]{
  .ya-shagi__uzel--now .ya-shagi__tochka{ transform:none; }
}

/* ═══ СКЛАДКА ═════════════════════════════════════════════════════════════
   Справка, которая не мешает: закрыта, пока её не спросили. Собрана на
   родном <details> — он сам даёт клавиатуру, aria-expanded и связь заголовка
   с телом; своих кнопок с aria-expanded в наборе не заводим.

   Разметка: <details class="ya-skladka"><summary>…</summary>
             <div class="ya-skladka__telo">…</div></details>

   Стрелка своя: системный треугольник рисуется шрифтом, у него своя толщина
   и своя базовая линия, и цветом роли он не красится. Разворот стрелки гасит
   утилита «убрать анимации» из tokeny.css. Строка нажатия — 48 сама по себе,
   добирать паддингом ничего не нужно; длинная справка переносится и строка
   растёт. ЗАМЕРЕНО: подпись складки 5.62/10.38. */

.ya-skladka{ display:block; }
.ya-skladka > summary{
  display:flex; align-items:center; gap:var(--sp-2);
  min-height:var(--cel-min); padding:var(--sp-2) 0;
  border-radius:var(--shape-s);
  font:var(--type-label-l); color:var(--ya-primary-ink);
  cursor:pointer; list-style:none;
}
.ya-skladka > summary::-webkit-details-marker{ display:none; }
.ya-skladka > summary::marker{ content:''; }
.ya-skladka > summary:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }
.ya-skladka__strelka{
  flex:none;
  transition:transform var(--dur-short) var(--ease-standard);
}
.ya-skladka[open] > summary .ya-skladka__strelka{ transform:rotate(180deg); }
.ya-skladka__telo{
  margin:0 0 var(--sp-2) var(--sp-1);
  padding-left:var(--sp-3); border-left:2px solid var(--outline-variant);
  font:var(--type-body-m); color:var(--on-surface-variant);
  overflow-wrap:anywhere;
}
.ya-skladka__telo > :first-child{ margin-top:0; }
.ya-skladka__telo > :last-child{ margin-bottom:0; }

/* На карточке игры складка держит тихие параметры (таймер, длина, темы),
   а не справку. Ясну раскладки выбирает карусель афиш, не складка.
   Тело на всю ширину: сетка чипов в цитатную каёмку не влезает. */
.ya-skladka--param > summary{
  color:var(--on-surface-variant);
  font:var(--type-body-s);
}
.ya-skladka--param > .ya-skladka__telo{
  margin:0;
  padding:0 0 var(--sp-2);
  border-left:0;
  color:var(--on-surface);
}

/* ═══ СТРОКА СПИСКА ═══════════════════════════════════════════════════════
   Имя, тихая приписка справа, стрелка. Вся строка — одна цель нажатия: не
   имя, не стрелка, а весь ряд. Ставится и ссылкой <a>, и кнопкой <button>.

   БЕЗ СВОЕЙ ПОДЛОЖКИ, НАРОЧНО. Карточка --surface-container-low на фоне
   экрана --surface даёт 1.04 — край такой карточки не виден вовсе, и список
   из трёх строк читался бы одной плитой. Поэтому строка прозрачная, а между
   строками идёт волосок --outline-variant (роль так и объявлена: только
   декоративные разделители). Строку опознаёт не край, а имя и стрелка —
   6.07/6.90. Хвостового волоска нет: линия стоит только МЕЖДУ строками, и
   список не заканчивается висящей чертой.

   Разметка:
     <button class="ya-stroka" type="button">
       <span class="ya-stroka__telo">
         <span class="ya-stroka__imya">Утро понедельника</span>
         <span class="ya-stroka__pripiska">12 из 12 мест · 8 сентября</span>
       </span>
       <span class="ya-ik ya-stroka__strelka ya-ik--vpered"></span>
     </button>

   ИМЯ И ПРИПИСКА — ОДИН ПЕРЕНОСЯЩИЙСЯ РЯД, а не две колонки сетки. Сетку
   «имя | приписка | стрелка» я сперва и поставил, и вот что она дала при 375:
   обычная строка «Утро понедельника · 12 из 12 мест · 8 сентября» выросла до
   84 вместо 48, а нарочно длинная — до 1084, потому что колонка приписки
   ужалась до одной буквы в строке. Здесь имя и приписка стоят в одном ряду с
   переносом: пока они помещаются рядом, приписка прижата вправо; не помещаются
   — она уходит строкой ниже и остаётся прижатой вправо. Стрелка вне ряда и
   потому не двигается никогда.
   ЗАМЕРЕНО при 375 и ширине строки 343: «Дорога · 1 из 12 мест» встаёт в одну
   строку и даёт 49; «Утро понедельника · 12 из 12 мест · 8 сентября» — 66,
   приписка ушла под имя и осталась справа; нарочно длинная — 104. Ни в одном
   случае вбок не выходит, цель нажатия ниже 48 не падает. При 320 и системном
   шрифте ×1.3 самая длинная даёт 201, и это по-прежнему одна строка списка, а
   не сломанная вёрстка. Контраст: имя 16.79/14.74, приписка и стрелка
   6.07/6.90, волосок 1.55/1.90 (он декоративный, строку опознают слова). */

.ya-stroka{
  position:relative; box-sizing:border-box;
  display:flex; align-items:center; gap:var(--sp-3);
  width:100%; min-height:var(--cel-min);
  padding:var(--sp-3) var(--sp-4);
  border:none; border-radius:var(--shape-m);
  background:transparent; color:var(--on-surface);
  font:inherit; text-align:left; text-decoration:none; cursor:pointer;
}
.ya-stroka + .ya-stroka{ border-top:1px solid var(--outline-variant); }
.ya-stroka__telo{
  flex:1 1 auto; min-width:0;
  display:flex; flex-wrap:wrap; align-items:baseline;
  column-gap:var(--sp-3); row-gap:var(--sp-1);
}
.ya-stroka__imya{
  flex:0 1 auto; min-width:0;
  font:var(--type-title-s); color:var(--on-surface);
  overflow-wrap:anywhere;
}
/* margin-left:auto держит приписку справа на любой строке ряда — и когда она
   стоит рядом с именем, и когда съехала под него. */
.ya-stroka__pripiska{
  flex:0 1 auto; min-width:0; margin-left:auto; text-align:right;
  font:var(--type-body-s); color:var(--on-surface-variant);
  overflow-wrap:anywhere;
}
.ya-stroka__strelka{ flex:none; color:var(--on-surface-variant); }
/* Слой нажатия из собственного цвета текста — тот же приём, что у кнопки. */
.ya-stroka::after{
  content:''; position:absolute; inset:0; border-radius:inherit;
  background:currentColor; opacity:0; pointer-events:none;
  transition:opacity var(--dur-short) var(--ease-standard);
}
.ya-stroka:active::after{ opacity:var(--state-pressed); }
/* Обводка внутрь: строка идёт во всю ширину, и наружное кольцо вылезло бы
   за край экрана и налезло на соседнюю строку. */
.ya-stroka:focus-visible{ outline:2px solid var(--primary); outline-offset:-2px; }

/* СТРОКА СО СВОИМИ КНОПКАМИ · .ya-stroka--tiho + __dela
   Строка списка, у которой свои действия (вопрос в админке: «Править»,
   «Отменить»; явление: ↑ ↓ «Править»). Сама строка тогда не кнопка: без
   руки-курсора и без слоя нажатия — иначе нажатие на «Править» подсвечивало
   бы всю строку, и было бы не понять, что нажато. Действия — в __dela справа,
   на узком экране уходят под текст. Ярлык (.ya-yarlyk) перед телом говорит
   вид строки. Приписка здесь — под именем и слева: справа стоят кнопки, и
   прижатая вправо приписка читалась бы подписью к ним.
     <div class="ya-stroka ya-stroka--tiho">
       <span class="ya-yarlyk">один ответ</span>
       <div class="ya-stroka__telo"><span class="ya-stroka__imya">…</span>
         <span class="ya-stroka__pripiska">…</span></div>
       <div class="ya-stroka__dela"><button class="ya-btn ya-btn--compact">Править</button></div>
     </div> */
.ya-stroka--tiho{ cursor:default; align-items:flex-start; flex-wrap:wrap; }
.ya-stroka--tiho::after{ content:none; }
.ya-stroka--tiho > .ya-yarlyk{ flex:none; margin-top:2px; }
.ya-stroka--tiho .ya-stroka__telo{ flex:1 1 240px; }
.ya-stroka--tiho .ya-stroka__pripiska{ flex-basis:100%; margin-left:0; text-align:left; }
.ya-stroka__dela{ flex:none; display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-left:auto; }

/* ВЫБРАННАЯ СТРОКА · .ya-stroka[aria-current="true"]
   Строка списка, чьё содержимое открыто рядом (тема викторины в админке —
   вопросы справа). Состояние — атрибутом aria-current, а не своим классом:
   его же читает диктор. Цвет — выбранное вторичной роли, не главной:
   главная занята кнопкой действия, и залитая ею строка спорила бы с ней. */
.ya-stroka[aria-current="true"]{
  background:var(--secondary-container); color:var(--on-secondary-container);
}
.ya-stroka[aria-current="true"] .ya-stroka__imya,
.ya-stroka[aria-current="true"] .ya-stroka__pripiska{ color:inherit; }

/* ═══ НАБОР ЗНАЧКОВ ═══════════════════════════════════════════════════════
   Сгенерирован из одних и тех же путей: сетка 24, обводка 2, концы круглые.
   Добавлять значок — только сюда. */
.ya-ik--nazad{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 5 8 12 15 19'/%3E%3C/svg%3E")}
.ya-ik--vpered{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5 16 12 9 19'/%3E%3C/svg%3E")}
.ya-ik--vverh{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 15 12 8 19 15'/%3E%3C/svg%3E")}
.ya-ik--vniz{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 9 12 16 19 9'/%3E%3C/svg%3E")}
.ya-ik--zakryt{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6 18 18M18 6 6 18'/%3E%3C/svg%3E")}
.ya-ik--galochka{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 13 10 18 19 7'/%3E%3C/svg%3E")}
.ya-ik--plus{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E")}
.ya-ik--poisk{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6'/%3E%3Cpath d='M15.6 15.6 20 20'/%3E%3C/svg%3E")}
.ya-ik--karandash{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 20h4L20 8l-4-4L4 16Z'/%3E%3Cpath d='M14 6l4 4'/%3E%3C/svg%3E")}
.ya-ik--tochki{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='5' cy='12' r='1.6' fill='black' stroke='none'/%3E%3Ccircle cx='12' cy='12' r='1.6' fill='black' stroke='none'/%3E%3Ccircle cx='19' cy='12' r='1.6' fill='black' stroke='none'/%3E%3C/svg%3E")}
.ya-ik--korzina{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v6M14 11v6'/%3E%3C/svg%3E")}
.ya-ik--bulavka{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21v-7M8 4h8l-2 5 4 3H6l4-3Z'/%3E%3C/svg%3E")}
.ya-ik--zvezda{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l2.6 6.2 6.4.6-5 4.2 1.6 6.5L12 17l-5.6 3.5L8 14 3 9.8l6.4-.6Z'/%3E%3C/svg%3E")}
.ya-ik--info{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v6'/%3E%3Ccircle cx='12' cy='7.5' r='1.2' fill='black' stroke='none'/%3E%3C/svg%3E")}
.ya-ik--vnimanie{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3 22 20H2Z'/%3E%3Cpath d='M12 9v5'/%3E%3Ccircle cx='12' cy='17.2' r='1.2' fill='black' stroke='none'/%3E%3C/svg%3E")}
.ya-ik--pusto{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 8 12 4l8 4v9l-8 4-8-4Z'/%3E%3Cpath d='M4 8l8 4 8-4M12 12v9'/%3E%3C/svg%3E")}
.ya-ik--lyudi{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3'/%3E%3Cpath d='M3.6 19v-1.2A4.4 4.4 0 0 1 8 13.4h2a4.4 4.4 0 0 1 4.4 4.4V19'/%3E%3Ccircle cx='17' cy='8.4' r='2.4'/%3E%3Cpath d='M16.2 13.6h.6A3.6 3.6 0 0 1 20.4 17.2V19'/%3E%3C/svg%3E")}
.ya-ik--ssylka{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 13a3.5 3.5 0 0 0 5 0l2.2-2.2a3.5 3.5 0 0 0-5-5L11 7'/%3E%3Cpath d='M14 11a3.5 3.5 0 0 0-5 0L6.8 13.2a3.5 3.5 0 0 0 5 5L13 17'/%3E%3C/svg%3E")}
.ya-ik--zamok{--ya-ik:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='11' width='14' height='10' rx='2'/%3E%3Cpath d='M8 11V8a4 4 0 0 1 8 0v3'/%3E%3C/svg%3E")}


/* ═══ ПЕРЕКЛЮЧАТЕЛЬ · .ya-perekl ═══════════════════════════════════════
   ЗАЧЕМ. Выбор одного из нескольких видов одной и той же вещи — не кнопки
   и не вкладки. Кнопки обещают действие («сохранить»), вкладки уводят на
   другой экран; здесь же экран остаётся тот же, меняется только ракурс.
   До 11.09.2026 такой ряд рисовали врукопашную прямо в движке уроков,
   инлайновыми стилями, и он не умел ничего, кроме как выглядеть.

   РАЗМЕТКА. Обёртка объявляет группу, кнопки держат своё состояние сами —
   aria-pressed, а не класс: чтец обязан услышать, какой вид выбран.

     <div class="ya-perekl" role="group" aria-label="Вид модели">
       <button class="ya-perekl__knop" type="button" aria-pressed="true">Схема</button>
       <button class="ya-perekl__knop" type="button" aria-pressed="false">Сбоку</button>
     </div>

   ВЫБРАННОЕ ОТЛИЧАЕТСЯ НЕ ТОЛЬКО ЦВЕТОМ: у выбранной кнопки другая
   жирность и сплошная рамка. Человеку, который не различает эти два цвета,
   ряд должен читаться так же однозначно.
   Высота --h-btn: ряд стоит рядом с обычными кнопками, и разнобой высот в
   одном столбце виден сразу. */
.ya-perekl{display:flex;gap:var(--sp-2)}
/* Четыре значения (сколько друзей) — сетка 2×2, иначе на узком ряд схлопывается. */
.ya-perekl--setka{display:grid;grid-template-columns:1fr 1fr}
.ya-perekl__knop{
  box-sizing:border-box;flex:1;min-height:var(--h-btn);padding:var(--sp-3) var(--sp-2);
  font:var(--type-label-l);
  color:var(--on-surface);background:var(--surface-container);
  /* Кайма из --outline, а не --outline-variant: вариант объявлен для
     декоративных границ и даёт к подложке 1,7:1 — контур нажимаемого
     органа так не рисуют. */
  border:1.5px solid var(--outline);border-radius:var(--shape-s);cursor:pointer;
  transition:
    background var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    border-color var(--dur-short) var(--ease-standard),
    transform var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard)}
.ya-perekl__knop:active:not(:disabled){transform:scale(.98)}
/* Наведение обязано знать про выбранное: без :not() оно перебивало его по
   весу и гасило слово на выбранной кнопке. */
.ya-perekl__knop:hover:not([aria-pressed="true"]){background:var(--surface-container-high)}
.ya-perekl__knop[aria-pressed="true"]{
  color:var(--on-primary);background:var(--primary);border-color:var(--primary);font-weight:700}
.ya-perekl__knop[aria-pressed="true"]:hover{background:var(--primary)}
.ya-perekl__knop:focus-visible{outline:2px solid var(--primary);outline-offset:2px}

/* ═══ ВЫБОР РЕЖИМА · .ya-vybor ═════════════════════════════════════════
   Два смысла одной карточки: один человек или с друзьями. Не три чипа
   в ряд — «вдвоём» рядом с «компанией» читалось как два разных продукта.
   Список как у викторины: имя, подпись, точка выбранного. Состояние —
   aria-pressed, не класс.

     <div class="ya-vybor" role="radiogroup" aria-label="Режим">
       <button class="ya-vybor__knop" type="button" aria-pressed="true">…</button>
     </div>
   Когда выбрано «с друзьями», рядом стоит .ya-perekl--setka «сколько друзей». */
.ya-vybor{display:flex;flex-direction:column;gap:var(--sp-2)}
.ya-vybor__knop{
  display:grid;grid-template-columns:1fr auto;align-items:center;gap:var(--sp-3);
  box-sizing:border-box;width:100%;min-height:56px;padding:var(--sp-2) var(--sp-3);
  border-radius:var(--shape-m);border:1px solid transparent;
  background:var(--surface-container-low);color:var(--on-surface);
  text-align:left;cursor:pointer;
  transition:
    background var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    border-color var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard);
}
.ya-vybor__knop:hover:not([aria-pressed="true"]){background:var(--surface-container)}
.ya-vybor__knop:active:not(:disabled){transform:scale(.98)}
.ya-vybor__knop[aria-pressed="true"]{
  background:var(--ya-selected-fill);color:var(--ya-selected-on);
  border-color:var(--ya-selected-stroke);box-shadow:var(--ya-selected-glow);
}
.ya-vybor__knop:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
.ya-vybor__telo{display:flex;flex-direction:column;min-width:0;gap:2px}
.ya-vybor__imya{font:var(--type-title-m)}
.ya-vybor__o{font:var(--type-body-s);color:var(--on-surface-variant)}
.ya-vybor__knop[aria-pressed="true"] .ya-vybor__o{color:var(--ya-selected-meta)}
.ya-vybor__knop[aria-pressed="true"] .ya-vybor__imya{color:var(--ya-selected-on)}
.ya-vybor__radio{
  width:18px;height:18px;border-radius:var(--shape-full);flex:none;
  border:2px solid var(--outline);background:transparent;box-sizing:border-box;
  position:relative;
}
.ya-vybor__knop[aria-pressed="true"] .ya-vybor__radio{
  border-color:var(--primary);box-shadow:var(--ya-selected-glow);
}
.ya-vybor__knop[aria-pressed="true"] .ya-vybor__radio::after{
  content:'';position:absolute;inset:3px;border-radius:inherit;background:var(--primary);
}

/* Ряд «код комнаты + Войти» под выбором друзей. Поле из .ya-pole,
   кнопка из .ya-btn: отдельных цветов нет. */
.ya-kod-ryad{
  display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;
  margin-top:var(--sp-2);
}
.ya-kod-ryad .ya-pole__vvod{
  flex:1 1 12em;width:auto;min-width:12em;grid-column:auto;
}
.ya-kod-ryad .ya-btn{flex:none}

/* ═══ ФИШКА · .ya-fishka ═══════════════════════════════════════════════
   ЗАЧЕМ. Выбор нескольких из многих: части модели, признаки, метки. От
   кнопки отличается тем, что остаётся нажатой, от галочки — тем, что
   стоит в ряду и переносится по строкам.

     <button class="ya-fishka" type="button" aria-pressed="false">
       Вера<span class="ya-fishka__rod">· отрезок</span>
     </button>

   ЗАПЕРТАЯ ФИШКА — aria-disabled БЕЗ disabled: после проверки ответ менять
   нельзя, но прочесть выбранное надо, а настоящий disabled выкидывает кнопку
   из обхода клавишей. Нажатие гасит сам движок. Запертая выбранная остаётся
   в полную силу, запертая невыбранная гаснет, и наведение на запертую ничего
   не обещает: видно, что выбрали, и видно, что выбор закончен.
   Высота --h-btn, а не --h-chip: по фишке ЦЕЛЯТСЯ пальцем в ряду других,
   и сорок восемь тут не роскошь. */
.ya-fishka{
  box-sizing:border-box;display:inline-flex;align-items:center;gap:var(--sp-1);
  min-height:var(--h-btn);padding:var(--sp-2) var(--sp-4);
  font:var(--type-body-s);
  color:var(--on-surface);background:var(--surface-container);
  /* Та же причина, что у переключателя: контур нажимаемого — --outline. */
  border:1.5px solid var(--outline);border-radius:var(--shape-full);cursor:pointer;
  transition:
    background var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    border-color var(--dur-short) var(--ease-standard),
    transform var(--dur-short) var(--ease-standard)}
.ya-fishka:active:not(:disabled):not([aria-disabled="true"]){transform:scale(.98)}
/* То же про вес: наведение не должно перебивать выбранное. */
.ya-fishka:hover:not(:disabled):not([aria-disabled="true"]):not([aria-pressed="true"]){background:var(--surface-container-high)}
.ya-fishka[aria-pressed="true"]{
  color:var(--on-primary);background:var(--primary);border-color:var(--primary);font-weight:700}
.ya-fishka[aria-pressed="true"]:hover{background:var(--primary)}
.ya-fishka:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
/* Запертая фишка остаётся в обходе клавишей (в разметке — aria-disabled без
   disabled): ответ менять нельзя, а перечесть выбранное надо. */
.ya-fishka[aria-disabled="true"]{cursor:default}
.ya-fishka[aria-disabled="true"]:not([aria-pressed="true"]){opacity:.72}
.ya-fishka:disabled{cursor:default}
.ya-fishka:disabled:not([aria-pressed="true"]){opacity:.72}
.ya-fishka__rod{opacity:.7;font-weight:400}

/* ═══ ВЕРДИКТ · .ya-verdikt ════════════════════════════════════════════
   ЗАЧЕМ. Ответ на проверку в уроках печатался шестью разными способами.
   Здесь один: цветная плашка, у которой ПЕРВОЕ СЛОВО — приговор. Правило
   базового курса: «Так.» или «Не так.» стоит первым, до объяснения, иначе
   человек читает разбор, ещё не зная, угадал он или нет.

     <p class="ya-verdikt ya-verdikt--tak" role="status">
       <b class="ya-verdikt__slovo">Так.</b> Воля — отрезок от Кона до Предела.
     </p>

   ЦВЕТ НЕ ЕДИНСТВЕННЫЙ ПРИЗНАК: приговор стоит словом и жирным. Плашка
   живёт в области role="status" — чтец объявляет её сам, без перевода
   фокуса, потому что фокус в этот миг на кнопке «Проверить». */
.ya-verdikt{
  margin:12px 0 0;padding:12px 14px;border-radius:12px;
  font:var(--type-body-s);line-height:1.55}
.ya-verdikt__slovo{font-weight:700}
.ya-verdikt--tak{background:var(--ok-container);color:var(--on-ok-container)}
.ya-verdikt--ne-tak{background:var(--error-container);color:var(--on-error-container)}

/* ═══ ЗАГРУЗКА · .ya-loader ═══════════════════════════════════════════
   ЗАЧЕМ. Ожидание урока, главы книги и прочих полных экранов ждало
   голым текстом «Открываю…» / «Загружаю…». Дуэль уже имела кольцо
   (.dp-loader), но на своих переменных. Здесь одно кольцо на продукт:
   дорожка --outline-variant, акцент --primary, подпись — роли текста.

   РАЗМЕРЫ. Базовый 40 (полноэкранное ожидание), --sm 24 (в строке),
   --lg 56 (крупный сплэш). Блок .ya-loader-block — колонка спиннер +
   подпись с role="status" aria-live="polite" aria-busy.

   ДВИЖЕНИЕ. Вращение + лёгкий brand-pulse тенью primary. Системное
   «убрать анимации» гасит всё утилитой в tokeny.css (1ms / 1 раз) —
   кольцо остаётся статичным маркером ожидания. */

.ya-loader{
  box-sizing:border-box;
  display:inline-block; flex:none;
  width:40px; height:40px;
  border-radius:50%;
  border:3px solid var(--outline-variant);
  border-top-color:var(--primary);
  animation:
    ya-loader-spin .85s linear infinite,
    ya-loader-pulse 1.6s var(--ease-standard) infinite;
  will-change:transform, box-shadow;
}
.ya-loader--sm{ width:24px; height:24px; border-width:2px; }
.ya-loader--lg{ width:56px; height:56px; border-width:3.5px; }

@keyframes ya-loader-spin{ to{ transform:rotate(360deg); } }
@keyframes ya-loader-pulse{
  0%, 100%{ box-shadow:0 0 0 0 color-mix(in srgb, var(--primary) 0%, transparent); }
  50%{ box-shadow:0 0 0 6px color-mix(in srgb, var(--primary) 14%, transparent); }
}

/* Локальная страховка, если утилита tokeny.css ещё не подключилась. */
html[data-dvizhenie="off"]{
  .ya-loader{
    animation:none;
    border-color:var(--outline-variant);
    border-top-color:var(--primary);
  }
}

.ya-loader-block{
  display:flex; flex-direction:column;
  align-items:center; justify-content:center;
  gap:var(--sp-4);
  max-width:420px; text-align:center;
  color:var(--on-surface);
  font:var(--type-body-m);
  font-family:var(--ya-font-text, system-ui, sans-serif);
}
.ya-loader-block__caption{
  margin:0;
  color:var(--on-surface-variant);
  font:var(--type-body-s);
  line-height:1.55;
}

/* ═══ ОЖИДАНИЕ ДРУГА · .ya-ozhidanie ══════════════════════════════════
   ЗАЧЕМ. Шаг «дождись подключения» не должен выглядеть пустым экраном с
   голым кольцом. Здесь кольцо живёт внутри орбиты: спутник бежит по кругу,
   пока друга нет, и сменяется галочкой, когда он вошёл. Слова — заголовок
   и тихая подпись, как у .ya-loader-block, чтобы диктор слышал состояние,
   а не «графика».

   РАЗМЕТКА.
     <div class="ya-ozhidanie" role="status" aria-live="polite" aria-busy="true">
       <div class="ya-ozhidanie__kolco" aria-hidden="true">
         <span class="ya-ozhidanie__orbita"><i class="ya-ozhidanie__sputnik"></i></span>
         <span class="ya-loader ya-loader--lg"></span>
         <span class="ya-ozhidanie__galochka"><span class="ya-ik ya-ik--galochka"></span></span>
       </div>
       <p class="ya-ozhidanie__zag">Ждём друга в комнате</p>
       <p class="ya-ozhidanie__txt">Отправь ссылку и останься на этом экране.</p>
     </div>

   Готово: класс .ya-ozhidanie--gotovo, aria-busy="false". Цвет не единственный
   признак — появляется галочка и меняется заголовок. */

.ya-ozhidanie{
  display:flex; flex-direction:column;
  align-items:center; justify-content:center;
  gap:var(--sp-3);
  max-width:36ch; margin:0 auto;
  text-align:center;
}
.ya-ozhidanie__kolco{
  position:relative;
  width:96px; height:96px;
  display:flex; align-items:center; justify-content:center;
}
.ya-ozhidanie__orbita{
  position:absolute; inset:0;
  border-radius:var(--shape-full);
  border:1.5px dashed var(--outline-variant);
  animation:ya-ozhidanie-spin 7.5s linear infinite;
}
.ya-ozhidanie__sputnik{
  position:absolute; top:-5px; left:50%;
  width:10px; height:10px;
  margin-left:-5px;
  border-radius:var(--shape-full);
  background:var(--primary);
  box-shadow:0 0 0 6px color-mix(in srgb, var(--primary) 18%, transparent),
             0 0 16px color-mix(in srgb, var(--ya-cta, var(--primary)) 45%, transparent);
}
.ya-ozhidanie__kolco > .ya-loader{
  position:relative; z-index:1;
}
.ya-ozhidanie__galochka{
  display:none;
  position:relative; z-index:1;
  width:56px; height:56px;
  border-radius:var(--shape-full);
  align-items:center; justify-content:center;
  background:var(--ok-container); color:var(--on-ok-container);
}
.ya-ozhidanie__zag{
  margin:var(--sp-2) 0 0;
  font:var(--type-title-m); color:var(--on-surface);
  transition:color var(--dur-medium) var(--ease-standard);
}
.ya-ozhidanie__txt{
  margin:0;
  font:var(--type-body-s); color:var(--on-surface-variant);
  line-height:1.55;
  transition:color var(--dur-medium) var(--ease-standard);
}
.ya-ozhidanie--gotovo .ya-ozhidanie__orbita,
.ya-ozhidanie--gotovo .ya-ozhidanie__kolco > .ya-loader{ display:none; }
.ya-ozhidanie--gotovo .ya-ozhidanie__galochka{
  display:flex;
  animation:ya-ozhidanie-pop var(--dur-medium, .35s) var(--ease-standard, ease);
}
.ya-ozhidanie--gotovo .ya-ozhidanie__zag{ color:var(--ok); }

@keyframes ya-ozhidanie-spin{ to{ transform:rotate(360deg); } }
@keyframes ya-ozhidanie-pop{
  from{ transform:scale(.72); opacity:0; }
  to{ transform:scale(1); opacity:1; }
}

html[data-dvizhenie="off"]{
  .ya-ozhidanie__orbita{ animation:none; }
  .ya-ozhidanie__sputnik{ top:4px; }
  .ya-ozhidanie--gotovo .ya-ozhidanie__galochka{ animation:none; }
}

/* ═══ МИНИ-КРУГ · .ya-krug-mini ═══════════════════════════════════════
   ЗАЧЕМ. В компании человеку нужно видеть, сколько мест уже стоит у друга,
   не подглядывая в большой круг. Двенадцать мест — те же, что у раскладки:
   пусто, с первого раза, после промаха. Цвет не единственный признак:
   пустое — только дорожка, верное — сплошная заливка, промах — заливка ошибки.

   РАЗМЕРЫ. Базовый 40 (полоса игроков), --sm 28 (в чипе), --lg 56 (итог),
   --scena 120 (лицо игры, внутри значок ясны).
   Место ставит экран: двенадцать <i style="--ya-i:0…11" data-sost="…">.
   --ya-i — номер места, 0 внизу, дальше по часовой — как большой круг.

     <span class="ya-krug-mini" role="img" aria-label="4 из 12, 3 сразу">
       <span class="ya-krug-mini__dorozhka" aria-hidden="true"></span>
       <i style="--ya-i:0" data-sost="srazu"></i>
       …ещё одиннадцать…
     </span>
*/

.ya-krug-mini{
  --ya-krug-size:40px;
  box-sizing:border-box;
  position:relative;
  display:inline-block; flex:none;
  width:var(--ya-krug-size); height:var(--ya-krug-size);
  border-radius:var(--shape-full);
}
.ya-krug-mini--sm{ --ya-krug-size:28px; }
.ya-krug-mini--lg{ --ya-krug-size:56px; }
.ya-krug-mini--scena{ --ya-krug-size:120px; }
.ya-krug-mini--afisha{ --ya-krug-size:64px; }
.ya-krug-mini__dorozhka{
  position:absolute; inset:14%;
  border-radius:var(--shape-full);
  border:2px solid var(--outline-variant);
  pointer-events:none;
}
.ya-krug-mini i{
  position:absolute; inset:0;
  display:block; margin:0; padding:0;
  border:0;
  transform:rotate(calc(var(--ya-i, 0) * 30deg));
  background:conic-gradient(
    from 165deg,
    var(--ya-krug-fill, var(--outline-variant)) 0 26deg,
    transparent 26deg
  );
  -webkit-mask:radial-gradient(farthest-side, transparent 46%, black 47%, black 72%, transparent 73%);
          mask:radial-gradient(farthest-side, transparent 46%, black 47%, black 72%, transparent 73%);
  opacity:0;
  pointer-events:none;
  transition:opacity var(--dur-medium) var(--ease-standard);
}
.ya-krug-mini i[data-sost="srazu"]{
  --ya-krug-fill:var(--ok);
  opacity:1;
}
.ya-krug-mini i[data-sost="posle"]{
  --ya-krug-fill:var(--error);
  opacity:1;
}
.ya-krug-mini i[data-sost="pusto"]{ opacity:0; }

/* ═══ ДРУГ В КОМНАТЕ · .ya-drug ═══════════════════════════════════════
   ЗАЧЕМ. Присутствие человека рядом с кругом рисовали кто чипом, кто
   строкой. Здесь одна карточка: лицо или мини-круг, имя, тихий статус.
   Пустой слот (друг ещё не вошёл) отличается пунктирным лицом и словом
   «ещё не в комнате», а не одной серостью.

     <div class="ya-drug ya-drug--on">
       <span class="ya-drug__lico" aria-hidden="true">А</span>
       <span class="ya-drug__telo">
         <span class="ya-drug__imya">Анна</span>
         <span class="ya-drug__status">в комнате</span>
       </span>
       <!-- мини-круг, если уже играют -->
     </div>

   .ya-drug--ty     — это ты
   .ya-drug--on     — друг подключился
   .ya-drug--gotov  — нажал «Готов»
   .ya-drug--zhdyot — слот пуст
   .ya-drug--ten    — соперник-Тень, не человек
   .ya-drug--kompakt — столбик на игровом поле: круг сверху, имя снизу */

.ya-drug{
  box-sizing:border-box;
  display:flex; align-items:center; gap:var(--sp-3);
  min-height:var(--cel-min);
  padding:var(--sp-2) var(--sp-3);
  border-radius:var(--shape-m);
  background:var(--surface-container-low); color:var(--on-surface);
  transition:
    background-color var(--dur-medium) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard);
}
.ya-drug__lico{
  box-sizing:border-box;
  flex:none;
  width:40px; height:40px;
  display:flex; align-items:center; justify-content:center;
  border-radius:var(--shape-full);
  background:var(--secondary-container); color:var(--on-secondary-container);
  font:var(--type-title-s);
  transition:
    background-color var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard);
}
.ya-drug__telo{
  flex:1 1 auto; min-width:0;
  display:flex; flex-direction:column; gap:2px;
}
.ya-drug__imya{
  font:var(--type-title-s); color:var(--on-surface);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.ya-drug__status{
  font:var(--type-body-s); color:var(--on-surface-variant);
}
.ya-drug--ty .ya-drug__lico{
  background:var(--primary); color:var(--on-primary);
}
.ya-drug--on .ya-drug__status{ color:var(--ok); }
.ya-drug--gotov .ya-drug__status{ color:var(--ok); }
.ya-drug--gotov{
  box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--ok) 35%, transparent);
}
.ya-drug--gotov .ya-drug__lico{
  background:var(--ok-container); color:var(--on-ok-container);
}
.ya-drug--zhdyot{
  background:transparent;
  box-shadow:inset 0 0 0 1.5px var(--outline-variant);
}
.ya-drug--zhdyot .ya-drug__lico{
  background:transparent;
  color:var(--on-surface-variant);
  box-shadow:inset 0 0 0 1.5px var(--outline);
  border-style:dashed;
}
/* Тень — не человек: пунктирное лицо и знак ◐, без заливки «ты». */
.ya-drug--ten{
  background:transparent;
  box-shadow:inset 0 0 0 1.5px var(--outline-variant);
}
.ya-drug--ten .ya-drug__lico{
  background:transparent;
  color:var(--on-surface-variant);
  box-shadow:inset 0 0 0 1.5px var(--outline);
  border-style:dashed;
}
.ya-drug--ten .ya-drug__status{ color:var(--on-surface-variant); }
.ya-drug--kompakt{
  flex-direction:column;
  justify-content:flex-start;
  gap:var(--sp-1);
  min-width:72px; max-width:88px;
  min-height:0;
  padding:var(--sp-2);
  background:transparent;
}
.ya-drug--kompakt .ya-krug-mini{ --ya-krug-size:48px; }
.ya-drug--kompakt .ya-drug__lico{ display:none; }
.ya-drug--kompakt .ya-drug__telo{ align-items:center; text-align:center; }
.ya-drug--kompakt .ya-drug__imya{
  font:var(--type-label-s);
  white-space:nowrap;
  max-width:100%;
}
.ya-drug--kompakt .ya-drug__status{ display:none; }

.ya-druzya{
  display:flex; flex-direction:column; gap:var(--sp-2);
}
.ya-druzya--lenta{
  flex-direction:row;
  flex-wrap:nowrap;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  gap:var(--sp-2);
  padding:2px 0 6px;
}

/* ═══ СЦЕНА · .ya-scena ═══════════════════════════════════════════════
   ЗАЧЕМ. Лицо раскладки и викторины было панелью настроек: заглавные
   ярлыки и десятки равногромких кнопок. Сцена — не кнопка. Она показывает
   то, во что сейчас играют: пустой круг из двенадцати мест или кто против
   кого. Громкое действие остаётся у CTA, режим — у .ya-vybor, таймер /
   длина / темы живут в .ya-skladka--param. Ясну раскладки выбирает
   карусель афиш .ya-karusel, не сцена: сцена сама не нажимается.

   РАЗМЕТКА.
     <div class="ya-scena">
       <div class="ya-scena__pole">
         <span class="ya-scena__krug">…ya-krug-mini--scena…<span class="ya-scena__znak">…</span></span>
       </div>
       <div class="ya-scena__imya">Случайная ясна</div>
       <div class="ya-scena__o">12 мест · без времени</div>
     </div>
   Викторина: .ya-scena--match — как шапка матча у букмекера: круглые
   лица команд по вертикали посередине поля, не карточки-строки
   у верхнего края. Один соперник — одно лицо справа; двое и больше —
   стопка .ya-komanda__sbor (своя «команда»). .ya-scena--versus и
   --komnata оставлены как прежние имена того же матча. */

.ya-scena{
  box-sizing:border-box;
  display:flex; flex-direction:column; align-items:center; gap:var(--sp-2);
  /* --sp-5 в шкале нет (4·8·12·16·24·32). Без запасного значения вся
     padding-строка становилась недействительной — лица липли к верху. */
  padding:var(--sp-6) var(--sp-4);
  text-align:center;
  background:
    radial-gradient(ellipse at 50% 30%,
      color-mix(in srgb, var(--primary) 16%, transparent) 0%,
      transparent 64%),
    var(--surface-container);
}
.ya-scena__pole{
  display:flex; align-items:center; justify-content:center;
  width:100%;
}
.ya-scena__krug{
  position:relative;
  display:inline-flex; align-items:center; justify-content:center;
}
.ya-scena__znak{
  position:absolute; inset:22%;
  display:flex; align-items:center; justify-content:center;
  pointer-events:none;
  color:var(--on-surface);
}
.ya-scena__znak svg{
  width:36px; height:36px; display:block;
}
.ya-scena .ya-krug-mini__dorozhka{
  border-color:color-mix(in srgb, var(--primary) 42%, var(--outline-variant));
  animation:ya-scena-dyhanie 3.6s var(--ease-standard) infinite;
}
/* Пустые места на лице видны: иначе круг читается как иконка, а не как
   двенадцать мест, которые ещё предстоит поставить. */
.ya-scena .ya-krug-mini i[data-sost="pusto"]{
  --ya-krug-fill:color-mix(in srgb, var(--outline) 75%, transparent);
  opacity:1;
}
@keyframes ya-scena-dyhanie{
  0%,100%{ opacity:.62; }
  50%{ opacity:1; }
}
.ya-scena__imya{
  font:var(--type-title-l);
  color:var(--on-surface);
  max-width:100%;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.ya-scena__o{
  font:var(--type-body-s);
  color:var(--on-surface-variant);
  max-width:100%;
}
.ya-scena__ryad{
  display:flex; align-items:center; justify-content:center;
  gap:var(--sp-2);
  width:100%;
}
.ya-scena__komandy{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  align-items:center;
  justify-items:center;
  gap:var(--sp-3);
  width:100%;
}
.ya-scena--match{
  padding-top:var(--sp-8);
  padding-bottom:var(--sp-6);
  gap:var(--sp-3);
}
.ya-scena--match .ya-scena__pole{
  min-height:112px;
}
.ya-scena--versus,
.ya-scena--komnata{
  padding-top:var(--sp-8);
  padding-bottom:var(--sp-6);
}
.ya-scena__protiv{
  font:var(--type-label-s);
  letter-spacing:var(--track-label, .04em);
  text-transform:uppercase;
  color:var(--on-surface-variant);
  padding:0 var(--sp-1);
  align-self:center;
}

/* Команда матча: круг в центре колонки, имя под ним — не строка списка. */
.ya-komanda{
  box-sizing:border-box;
  display:flex; flex-direction:column; align-items:center; gap:var(--sp-2);
  min-width:0; max-width:100%;
}
.ya-komanda__lico{
  box-sizing:border-box;
  flex:none;
  width:64px; height:64px;
  display:flex; align-items:center; justify-content:center;
  border-radius:var(--shape-full);
  background:var(--secondary-container); color:var(--on-secondary-container);
  font:var(--type-headline-s);
  line-height:1;
  overflow:hidden;
}
.ya-komanda__lico img{
  width:100%; height:100%; object-fit:cover; display:block;
}
.ya-komanda--ty .ya-komanda__lico{
  background:var(--primary); color:var(--on-primary);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--primary) 24%, transparent);
}
.ya-komanda--ten .ya-komanda__lico,
.ya-komanda--zhdyot .ya-komanda__lico,
.ya-komanda__lico--zhdyot{
  background:transparent;
  color:var(--on-surface-variant);
  border:1.5px dashed var(--outline);
}
.ya-komanda__lico--eshche{
  background:var(--surface-container-high);
  color:var(--on-surface-variant);
  border:0;
  font:var(--type-label-l);
}
.ya-komanda__imya{
  font:var(--type-title-s); color:var(--on-surface);
  max-width:100%;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  text-align:center;
}
.ya-komanda__rol{
  font:var(--type-label-s); color:var(--on-surface-variant);
  text-align:center;
}
.ya-komanda__sbor{
  display:flex; align-items:center; justify-content:center;
}
.ya-komanda__sbor .ya-komanda__lico{
  width:52px; height:52px;
  margin-left:-14px;
  box-shadow:0 0 0 2px var(--surface-container);
  position:relative;
}
.ya-komanda__sbor .ya-komanda__lico:first-child{ margin-left:0; }
.ya-komanda__sbor .ya-komanda__lico:nth-child(1){ z-index:1; }
.ya-komanda__sbor .ya-komanda__lico:nth-child(2){ z-index:2; }
.ya-komanda__sbor .ya-komanda__lico:nth-child(3){ z-index:3; }
.ya-komanda__sbor .ya-komanda__lico:nth-child(4){ z-index:4; }
.ya-komanda__sbor[data-n="4"] .ya-komanda__lico{
  width:44px; height:44px;
  margin-left:-12px;
  font:var(--type-title-l); line-height:1;
}

html[data-dvizhenie="off"]{
  .ya-scena .ya-krug-mini__dorozhka{ animation:none; }
}

/* ═══ КАРУСЕЛЬ АФИШ · .ya-karusel + .ya-afisha ══════════════════════════
   ЗАЧЕМ. На лице раскладки нужно выбрать, ПО КАКОЙ ясне играть. Сцена
   это не умела: она показывала уже выбранное и сама не нажималась, а ясна
   пряталась сеткой плиток в складке. Карусель — это выбор: лента афиш,
   свайп вправо листает, нажатие выбирает. Соседняя афиша выглядывает —
   видно, что справа есть ещё. Подпись «Играем · …» держит выбранное,
   пока листаешь чужое: скролл сам ясну не меняет (иначе закрытая афиша
   открывала бы замок на каждом свайпе).

   НЕ .ya-banner: та полоса-сообщение («уроки на сервере»), не постер.

     <div class="ya-karusel">
       <div class="ya-karusel__verh">
         <div class="ya-karusel__metka" id="…">По какой ясне</div>
         <div class="ya-karusel__hod">
           <button type="button" class="ya-ib ya-karusel__strelka" data-karusel="nazad" aria-label="Предыдущая ясна">…</button>
           <button type="button" class="ya-ib ya-karusel__strelka" data-karusel="vpered" aria-label="Следующая ясна">…</button>
         </div>
       </div>
       <div class="ya-karusel__lenta" role="radiogroup" aria-labelledby="…">
         <button class="ya-afisha" type="button" aria-pressed="true">…</button>
       </div>
       <div class="ya-karusel__niz">
         <div class="ya-karusel__vybor">Играем ясну Суток</div>
         <div class="ya-karusel__o">листни вправо · нажми, чтобы выбрать</div>
       </div>
     </div>
   Свайп ясну не меняет (закрытая иначе открывала бы замок на каждом жесте).
   Стрелка — настоящая кнопка: листает на соседнюю и выбирает её.
   Закрытая: .ya-afisha--zamok, нажимается — карточка замка, не старт. */

.ya-karusel{
  display:flex; flex-direction:column; gap:var(--sp-2);
  padding:var(--sp-4) 0 var(--sp-3);
  background:
    radial-gradient(ellipse at 12% 30%,
      color-mix(in srgb, var(--primary) 16%, transparent) 0%,
      transparent 58%),
    var(--surface-container);
}
.ya-karusel__verh{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--sp-2);
  padding:0 var(--sp-4);
}
.ya-karusel__metka{
  font:var(--type-label-m);
  letter-spacing:var(--track-label);
  text-transform:uppercase;
  color:var(--on-surface-variant);
}
.ya-karusel__hod{ display:flex; align-items:center; }
.ya-karusel__strelka{ color:var(--on-surface-variant); }
.ya-karusel__strelka:disabled{
  opacity:.38; cursor:default;
}
.ya-karusel__lenta{
  display:grid;
  grid-auto-flow:column;
  /* Соседка видна не узкой кромкой: по ней и жмут, когда листают вправо. */
  grid-auto-columns:calc(100% - 4.5rem);
  gap:var(--sp-3);
  overflow-x:auto;
  overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;
  scroll-padding-inline:var(--sp-4);
  padding:4px var(--sp-4) 12px;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  touch-action:pan-x;
}
.ya-karusel__lenta::-webkit-scrollbar{ display:none; }
.ya-karusel__niz{
  display:flex; flex-direction:column; gap:2px;
  padding:0 var(--sp-4);
}
.ya-karusel__vybor{
  font:var(--type-title-s);
  color:var(--on-surface);
}
.ya-karusel__o{
  font:var(--type-body-s);
  color:var(--on-surface-variant);
}

.ya-afisha{
  box-sizing:border-box;
  position:relative;
  isolation:isolate;
  z-index:0;
  display:grid;
  grid-template-columns:auto minmax(0,1fr) auto;
  align-items:center;
  gap:var(--sp-3);
  min-height:88px;
  margin:0; padding:var(--sp-3) var(--sp-4);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l);
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  font:inherit; text-align:left; cursor:pointer;
  scroll-snap-align:start;
  scroll-snap-stop:always;
  touch-action:pan-x;
  transition:
    background-color var(--dur-short) var(--ease-standard),
    border-color var(--dur-short) var(--ease-standard),
    box-shadow var(--dur-short) var(--ease-standard),
    color var(--dur-short) var(--ease-standard);
}
.ya-afisha:hover:not([aria-pressed="true"]){ background:var(--surface-container-low); }
.ya-afisha:active:not(:disabled){ transform:scale(.985); }
.ya-afisha:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }
.ya-afisha[aria-pressed="true"]{
  background:var(--ya-selected-fill);
  color:var(--ya-selected-on);
  border-color:var(--ya-selected-stroke);
  box-shadow:var(--ya-selected-glow);
}
/* Выбор — один мягкий шаг, не вечная качалка. Класс ставит krug.js,
   когда афиша только что стала выбранной. */
html[data-dvizhenie="on"] .ya-afisha--mig{
  animation:ya-afisha-vybor .46s var(--ease-emphasized-decel) both;
}
html[data-dvizhenie="on"] .ya-afisha--mig .ya-afisha__krug{
  animation:ya-afisha-krug-vybor .46s var(--ease-emphasized-decel) both;
}
html[data-dvizhenie="on"] .ya-afisha--mig .ya-afisha__radio{
  animation:ya-afisha-radio-vybor .4s var(--ease-emphasized-decel) both;
}
.ya-afisha__krug{
  position:relative;
  display:inline-flex; align-items:center; justify-content:center;
  flex:none;
}
.ya-afisha__zhiv{
  position:absolute; inset:0;
  pointer-events:none;
  border-radius:var(--shape-full);
  overflow:hidden;
  color:var(--primary);
}
.ya-afisha__zhiv::before,
.ya-afisha__zhiv::after{ pointer-events:none; }
.ya-afisha[aria-pressed="true"] .ya-afisha__zhiv{ color:var(--ya-selected-meta); }
.ya-afisha:not([aria-pressed="true"]) .ya-afisha__zhiv{ opacity:.62; }
.ya-afisha:not([aria-pressed="true"]) .ya-afisha__znak{ opacity:.72; }
.ya-afisha--zamok .ya-afisha__zhiv{ opacity:.38; }
.ya-afisha--zamok .ya-afisha__znak{ opacity:.48; }
.ya-afisha__znak{
  position:absolute; inset:22%;
  display:flex; align-items:center; justify-content:center;
  pointer-events:none;
  color:var(--on-surface);
  transform-origin:50% 50%;
}
.ya-afisha__znak svg,
.ya-afisha__znak .ya-ik{
  width:20px; height:20px; display:block;
}
.ya-afisha[aria-pressed="true"] .ya-afisha__znak{ color:var(--ya-selected-meta); }
.ya-afisha .ya-krug-mini i[data-sost="pusto"]{
  --ya-krug-fill:color-mix(in srgb, var(--outline) 75%, transparent);
  opacity:1;
}
.ya-afisha[aria-pressed="true"] .ya-krug-mini__dorozhka{
  border-color:color-mix(in srgb, var(--primary) 42%, var(--outline-variant));
}

/* Каждая ясна дышит по-своему (знак / клинья / живой слой):
   суток — солнце и погоня по местам; двора — шаг по двору;
   двора_животных — покачивание; дома — окна; кухни — пар;
   круговорота_воды — капля; года — колесо года; дерева — лист;
   печи — пламя; kostra — дыхание знака без клиньев и прыгающего жара; завода — поршень и дым;
   колокольни — маятник; театра — занавес; фаз_жизни — рост;
   emotsiy — сердце; удочки — заброс и круги; случайная — перемешка.
   Не выбранная стоит, выбранная дышит. Скролл не режет. */
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-krug-mini,
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-krug-mini i,
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-afisha__znak,
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-afisha__zhiv,
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-afisha__zhiv::before,
html[data-dvizhenie="on"] .ya-afisha:not([aria-pressed="true"]) .ya-afisha__zhiv::after{
  animation-play-state:paused;
}
.ya-afisha[data-yasna="суток"] .ya-krug-mini i{
  --ya-krug-fill:color-mix(in srgb, var(--primary) 70%, var(--outline));
  animation:ya-afisha-klin 4.8s ease-in-out infinite;
  animation-delay:calc(var(--ya-i, 0) * -.4s);
}
.ya-afisha[data-yasna="суток"] .ya-afisha__znak{
  animation:ya-afisha-hod 12s linear infinite;
}
.ya-afisha[data-yasna="суток"] .ya-afisha__zhiv{
  background:radial-gradient(circle at 50% 18%,
    color-mix(in srgb, var(--primary) 34%, transparent),
    transparent 58%);
  animation:ya-afisha-svet 5.5s ease-in-out infinite;
}

.ya-afisha[data-yasna="двора"] .ya-afisha__zhiv{
  box-shadow:inset 0 0 0 2px color-mix(in srgb, var(--secondary) 40%, transparent);
  animation:ya-afisha-dvor 2.8s var(--ease-standard) infinite;
}
.ya-afisha[data-yasna="двора"] .ya-afisha__znak{
  animation:ya-afisha-shag 2.4s ease-in-out infinite;
}
.ya-afisha[data-yasna="двора"] .ya-afisha__zhiv::before{
  content:''; position:absolute; bottom:20%; left:16%;
  width:5px; height:9px; border-radius:40% 40% 22% 22%;
  background:currentColor;
  animation:ya-afisha-prohod 3.4s ease-in-out infinite;
}

.ya-afisha[data-yasna="двора_животных"] .ya-afisha__znak{
  animation:ya-afisha-wiggle 1.6s ease-in-out infinite;
}
.ya-afisha[data-yasna="двора_животных"] .ya-afisha__zhiv{
  box-shadow:inset 0 0 0 2px color-mix(in srgb, var(--secondary) 36%, transparent);
  animation:ya-afisha-dvor 3.4s var(--ease-standard) infinite;
}

.ya-afisha[data-yasna="дома"] .ya-afisha__zhiv::before{
  content:''; position:absolute; inset:36%;
  border-radius:2px; background:currentColor;
  animation:ya-afisha-okon 2.6s ease-in-out infinite;
}
.ya-afisha[data-yasna="дома"] .ya-afisha__znak{
  animation:ya-afisha-dyhanie 3.4s ease-in-out infinite;
}

.ya-afisha[data-yasna="кухни"] .ya-afisha__znak{
  animation:ya-afisha-shag 3.2s ease-in-out infinite;
}
.ya-afisha[data-yasna="кухни"] .ya-afisha__zhiv::before,
.ya-afisha[data-yasna="кухни"] .ya-afisha__zhiv::after{
  content:''; position:absolute; left:50%;
  width:10px; height:14px; border-radius:var(--shape-full);
  background:color-mix(in srgb, var(--on-surface-variant) 40%, transparent);
  animation:ya-afisha-par 2.4s ease-out infinite;
}
.ya-afisha[data-yasna="кухни"] .ya-afisha__zhiv::before{ margin-left:-8px; }
.ya-afisha[data-yasna="кухни"] .ya-afisha__zhiv::after{
  margin-left:2px; width:8px; animation-delay:-1.1s;
}

.ya-afisha[data-yasna="круговорота_воды"] .ya-afisha__znak{
  animation:ya-afisha-hod 7s linear infinite;
}
.ya-afisha[data-yasna="круговорота_воды"] .ya-afisha__zhiv::before{
  content:''; position:absolute; left:50%; top:10%;
  width:7px; height:9px; margin-left:-3px;
  border-radius:50% 50% 50% 50% / 38% 38% 62% 62%;
  background:currentColor;
  animation:ya-afisha-kaplya 2s ease-in infinite;
}

.ya-afisha[data-yasna="года"] .ya-krug-mini{
  animation:ya-afisha-hod 18s linear infinite;
}
.ya-afisha[data-yasna="года"] .ya-afisha__znak{
  animation:ya-afisha-dyhanie 4.2s ease-in-out infinite;
}
.ya-afisha[data-yasna="года"] .ya-krug-mini i{
  --ya-krug-fill:color-mix(in srgb, var(--secondary) 55%, var(--outline));
  animation:ya-afisha-klin 9.6s ease-in-out infinite;
  animation-delay:calc(var(--ya-i, 0) * -.8s);
}

.ya-afisha[data-yasna="дерева"] .ya-afisha__znak{
  transform-origin:50% 92%;
  animation:ya-afisha-kachel 2.8s ease-in-out infinite;
}
.ya-afisha[data-yasna="дерева"] .ya-afisha__zhiv::before{
  content:''; position:absolute; left:28%; top:12%;
  width:7px; height:10px; border-radius:60% 40% 50% 50%;
  background:color-mix(in srgb, var(--ok, var(--secondary)) 70%, transparent);
  animation:ya-afisha-list 3.6s ease-in infinite;
}

.ya-afisha[data-yasna="печи"] .ya-afisha__zhiv::before{
  content:''; position:absolute; left:50%; bottom:26%;
  width:14px; height:16px; margin-left:-7px;
  border-radius:50% 50% 40% 40%;
  background:color-mix(in srgb, var(--tertiary) 75%, var(--error));
  animation:ya-afisha-plamya 1.1s ease-in-out infinite;
}
.ya-afisha[data-yasna="печи"] .ya-afisha__znak{
  animation:ya-afisha-mig 1.4s ease-in-out infinite;
}

.ya-afisha[data-yasna="завода_предприятия"] .ya-afisha__znak{
  animation:ya-afisha-porsh 1.15s ease-in-out infinite;
}
.ya-afisha[data-yasna="завода_предприятия"] .ya-afisha__zhiv::before,
.ya-afisha[data-yasna="завода_предприятия"] .ya-afisha__zhiv::after{
  content:''; position:absolute; top:6%;
  width:9px; height:11px; border-radius:var(--shape-full);
  background:color-mix(in srgb, var(--on-surface-variant) 48%, transparent);
  animation:ya-afisha-par 2.8s ease-out infinite;
}
.ya-afisha[data-yasna="завода_предприятия"] .ya-afisha__zhiv::before{ left:56%; }
.ya-afisha[data-yasna="завода_предприятия"] .ya-afisha__zhiv::after{
  left:72%; width:7px; animation-delay:-1.3s;
}

.ya-afisha[data-yasna="колокольни"] .ya-afisha__znak{
  transform-origin:50% 8%;
  animation:ya-afisha-mayatnik 2.2s ease-in-out infinite;
}

.ya-afisha[data-yasna="театра"] .ya-afisha__zhiv{
  background:radial-gradient(circle at 50% 28%,
    color-mix(in srgb, var(--primary) 42%, transparent),
    transparent 64%);
  animation:ya-afisha-prozh 3.2s ease-in-out infinite;
}
.ya-afisha[data-yasna="театра"] .ya-afisha__zhiv::before,
.ya-afisha[data-yasna="театра"] .ya-afisha__zhiv::after{
  content:''; position:absolute; top:0; bottom:0; width:46%;
  background:color-mix(in srgb, var(--tertiary) 32%, transparent);
  animation:ya-afisha-zanaves 3.8s ease-in-out infinite;
}
.ya-afisha[data-yasna="театра"] .ya-afisha__zhiv::before{
  left:0; transform-origin:0 50%;
}
.ya-afisha[data-yasna="театра"] .ya-afisha__zhiv::after{
  right:0; transform-origin:100% 50%;
}
.ya-afisha[data-yasna="театра"] .ya-afisha__znak{
  animation:ya-afisha-dyhanie 2.6s ease-in-out infinite;
}

.ya-afisha[data-yasna="фаз_жизни"] .ya-afisha__znak{
  animation:ya-afisha-rost 3.8s ease-in-out infinite;
}
.ya-afisha[data-yasna="фаз_жизни"] .ya-krug-mini i{
  animation:ya-afisha-klin 6s ease-in-out infinite;
  animation-delay:calc(var(--ya-i, 0) * -.5s);
}

.ya-afisha[data-yasna="kostra"] .ya-afisha__znak{
  animation:ya-afisha-dyhanie 2.6s ease-in-out infinite;
}
/* Костёр: только спокойное дыхание знака и тёплое свечение.
   Двенадцать клиньев кольца (.ya-krug-mini i) и прыгающий оранжевый
   слой (translate/scale ya-afisha-svet, прежние ::before/::after)
   читались скачущими точками. */
.ya-afisha[data-yasna="kostra"] .ya-krug-mini i,
.ya-afisha[data-yasna="kostra"] .ya-krug-mini i[data-sost="pusto"]{
  opacity:0;
  animation:none;
}
.ya-afisha[data-yasna="kostra"] .ya-afisha__zhiv{
  background:radial-gradient(circle at 50% 62%,
    color-mix(in srgb, var(--tertiary) 22%, transparent),
    transparent 72%);
  animation:ya-afisha-teplo 5.2s ease-in-out infinite;
}
.ya-afisha[data-yasna="kostra"] .ya-afisha__zhiv::before,
.ya-afisha[data-yasna="kostra"] .ya-afisha__zhiv::after{
  content:none;
  display:none;
  animation:none;
}

.ya-afisha[data-yasna="emotsiy"] .ya-afisha__znak{
  animation:ya-afisha-serdce 1.5s ease-in-out infinite;
}
.ya-afisha[data-yasna="emotsiy"] .ya-afisha__zhiv{
  background:radial-gradient(circle,
    color-mix(in srgb, var(--error) 28%, transparent),
    transparent 68%);
  animation:ya-afisha-prozh 1.5s ease-in-out infinite;
}

.ya-afisha[data-yasna="удочки"] .ya-afisha__znak{
  transform-origin:20% 10%;
  animation:ya-afisha-zakid 2.5s ease-in-out infinite;
}
.ya-afisha[data-yasna="удочки"] .ya-afisha__zhiv::before{
  content:''; position:absolute; left:58%; bottom:16%;
  width:12px; height:12px; margin-left:-6px;
  border:2px solid currentColor; border-radius:var(--shape-full);
  animation:ya-afisha-krugi 2.5s ease-out infinite;
}

.ya-afisha[data-yasna="__slucha"] .ya-afisha__znak{
  animation:ya-afisha-smesh 2.8s ease-in-out infinite;
}
.ya-afisha[data-yasna="__slucha"] .ya-afisha__zhiv{
  background:radial-gradient(circle at 50% 40%,
    color-mix(in srgb, var(--primary) 28%, transparent),
    transparent 66%);
  animation:ya-afisha-svet 3.8s ease-in-out infinite;
}

@keyframes ya-afisha-klin{
  0%,100%{ opacity:.22; }
  42%,58%{ opacity:1; }
}
@keyframes ya-afisha-hod{ to{ transform:rotate(360deg); } }
@keyframes ya-afisha-svet{
  0%,100%{ opacity:.45; transform:translateY(6px) scale(.92); }
  50%{ opacity:1; transform:translateY(-4px) scale(1.06); }
}
/* Только прозрачность — без сдвига и масштаба, иначе свечение читается точкой. */
@keyframes ya-afisha-teplo{
  0%,100%{ opacity:.4; }
  50%{ opacity:.72; }
}
@keyframes ya-afisha-dvor{
  0%,100%{ box-shadow:inset 0 0 0 2px color-mix(in srgb, var(--secondary) 28%, transparent); }
  50%{ box-shadow:inset 0 0 0 6px color-mix(in srgb, var(--secondary) 18%, transparent); }
}
@keyframes ya-afisha-shag{
  0%,100%{ transform:translateY(0); }
  50%{ transform:translateY(-3px); }
}
@keyframes ya-afisha-wiggle{
  0%,100%{ transform:rotate(-8deg); }
  50%{ transform:rotate(8deg); }
}
@keyframes ya-afisha-okon{
  0%,100%{ opacity:.18; }
  38%{ opacity:.8; }
  52%{ opacity:.22; }
  68%{ opacity:.9; }
}
@keyframes ya-afisha-dyhanie{
  0%,100%{ transform:scale(.94); }
  50%{ transform:scale(1.08); }
}
@keyframes ya-afisha-par{
  0%{ transform:translate(-50%, 10px) scale(.55); opacity:0; }
  22%{ opacity:.55; }
  100%{ transform:translate(-50%, -26px) scale(1.2); opacity:0; }
}
@keyframes ya-afisha-kaplya{
  0%{ transform:translateY(0) scale(1); opacity:0; }
  12%{ opacity:.85; }
  100%{ transform:translateY(38px) scale(.45); opacity:0; }
}
@keyframes ya-afisha-kachel{
  0%,100%{ transform:rotate(-9deg); }
  50%{ transform:rotate(9deg); }
}
@keyframes ya-afisha-list{
  0%{ transform:translate(0,0) rotate(0deg); opacity:0; }
  18%{ opacity:.7; }
  100%{ transform:translate(10px, 28px) rotate(40deg); opacity:0; }
}
@keyframes ya-afisha-plamya{
  0%,100%{ transform:translate(-50%,0) scaleY(1) scaleX(1); opacity:.55; }
  40%{ transform:translate(-50%,-5px) scaleY(1.22) scaleX(.82); opacity:.95; }
  72%{ transform:translate(-50%,-2px) scaleY(.9) scaleX(1.12); opacity:.7; }
}
@keyframes ya-afisha-mig{
  0%,100%{ opacity:.7; }
  40%{ opacity:1; }
  55%{ opacity:.55; }
}
@keyframes ya-afisha-porsh{
  0%,100%{ transform:translateY(0); }
  50%{ transform:translateY(4px); }
}
@keyframes ya-afisha-prohod{
  0%,100%{ transform:translateX(0); }
  50%{ transform:translateX(22px); }
}
@keyframes ya-afisha-zanaves{
  0%,100%{ transform:scaleX(1); }
  46%,54%{ transform:scaleX(.18); }
}
@keyframes ya-afisha-krugi{
  0%{ transform:scale(.35); opacity:.7; }
  100%{ transform:scale(2.15); opacity:0; }
}
@keyframes ya-afisha-mayatnik{
  0%,100%{ transform:rotate(-14deg); }
  50%{ transform:rotate(14deg); }
}
@keyframes ya-afisha-prozh{
  0%,100%{ opacity:.32; transform:scale(.9); }
  50%{ opacity:.9; transform:scale(1.08); }
}
@keyframes ya-afisha-rost{
  0%{ transform:scale(.86); }
  55%{ transform:scale(1.1); }
  100%{ transform:scale(.86); }
}
@keyframes ya-afisha-serdce{
  0%,100%{ transform:scale(1); }
  18%{ transform:scale(1.18); }
  32%{ transform:scale(.96); }
  48%{ transform:scale(1.12); }
  64%{ transform:scale(1); }
}
@keyframes ya-afisha-zakid{
  0%,100%{ transform:rotate(-22deg); }
  45%{ transform:rotate(16deg); }
  60%{ transform:rotate(8deg); }
}
@keyframes ya-afisha-smesh{
  0%,100%{ transform:rotate(0deg) scale(1); }
  25%{ transform:rotate(-18deg) scale(1.08); }
  50%{ transform:rotate(12deg) scale(.94); }
  75%{ transform:rotate(-8deg) scale(1.06); }
}
@keyframes ya-afisha-vybor{
  0%{ transform:scale(.985); }
  48%{ transform:scale(1.015); }
  100%{ transform:none; }
}
@keyframes ya-afisha-krug-vybor{
  0%{ transform:scale(.88); }
  58%{ transform:scale(1.08); }
  100%{ transform:none; }
}
@keyframes ya-afisha-radio-vybor{
  0%{ transform:scale(.7); opacity:.45; }
  62%{ transform:scale(1.16); opacity:1; }
  100%{ transform:none; opacity:1; }
}
@keyframes ya-afisha-blesk{
  0%,100%{ opacity:0; transform:scale(.35); }
  40%{ opacity:1; transform:scale(1); }
  72%{ opacity:0; }
}
.ya-afisha__telo{
  display:flex; flex-direction:column; min-width:0; gap:2px;
}
/* Две строки, не обрезка в одну: «Двора (Постройки)» и «Круговорота воды»
   должны читаться целиком, пока афиша не выросла третьей строкой. */
.ya-afisha__imya{
  font:var(--type-title-m);
  overflow:hidden;
  display:-webkit-box; -webkit-box-orient:vertical;
  -webkit-line-clamp:2; line-clamp:2;
}
.ya-afisha__o{
  font:var(--type-body-s);
  color:var(--on-surface-variant);
}
.ya-afisha[aria-pressed="true"] .ya-afisha__imya{ color:var(--ya-selected-on); }
.ya-afisha[aria-pressed="true"] .ya-afisha__o{ color:var(--ya-selected-meta); }
.ya-afisha__radio{
  width:18px; height:18px; border-radius:var(--shape-full); flex:none;
  border:2px solid var(--outline); background:transparent; box-sizing:border-box;
  position:relative;
}
.ya-afisha[aria-pressed="true"] .ya-afisha__radio{
  border-color:var(--primary); box-shadow:var(--ya-selected-glow);
}
.ya-afisha[aria-pressed="true"] .ya-afisha__radio::after{
  content:''; position:absolute; inset:3px; border-radius:inherit; background:var(--primary);
}
.ya-afisha__zamok{
  position:absolute; right:-4px; bottom:-4px;
  width:18px; height:18px;
  color:var(--on-surface-variant);
  background:var(--surface-container-lowest);
  border-radius:var(--shape-full);
}
.ya-afisha[aria-pressed="true"] .ya-afisha__zamok{
  background:var(--ya-selected-fill);
}
.ya-afisha--zamok .ya-afisha__imya{ color:var(--on-surface-variant); }
/* Десктоп: 100% − 4.5rem на полосе 1120 даёт плашку ~1000 и кромку соседки.
   Соседка должна читаться карточкой — по ней и жмут вправо. */
@media (min-width:900px){
  .ya-karusel__lenta{ grid-auto-columns:calc(100% - 8.5rem); }
}
html[data-dvizhenie="off"]{
  .ya-afisha .ya-krug-mini,
  .ya-afisha .ya-krug-mini i,
  .ya-afisha__znak,
  .ya-afisha__zhiv,
  .ya-afisha__zhiv::before,
  .ya-afisha__zhiv::after,
  .ya-afisha--mig,
  .ya-afisha--mig .ya-afisha__krug,
  .ya-afisha--mig .ya-afisha__radio{ animation:none; }
  .ya-afisha:active:not(:disabled){ transform:none; }
}

/* ═══ ЛОГОТИП ЯСНЫ В АВАТАРЕ (наставник в уроках) ════════════════════════
   PNG тёмно-сланцевый на прозрачном (lum ≈ 25): на --surface-container-lowest
   (в тёмной теме — тёмная ступень) пропадает. Светлая пластина --inverse-surface;
   светлая тема без фильтра — логотип и так читается на белом круге. */
.ya-logo-plate{
  box-sizing:border-box;
  flex-shrink:0;
  border-radius:var(--shape-full);
  overflow:hidden;
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  display:flex;
  align-items:center;
  justify-content:center;
  box-shadow:var(--ya-card-elev, none);
}
.ya-logo-yasna{
  display:block;
  object-fit:contain;
}
html[data-theme="dark"] .ya-logo-plate{
  background:var(--inverse-surface);
  border-color:color-mix(in srgb, var(--outline-variant) 65%, transparent);
  box-shadow:0 1px 3px rgba(0,0,0,.28);
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .ya-logo-plate{
    background:var(--inverse-surface);
    border-color:color-mix(in srgb, var(--outline-variant) 65%, transparent);
    box-shadow:0 1px 3px rgba(0,0,0,.28);
  }
}

/* ═══ PREMIUM FILLED CTA НА ТЁМНОМ ═══════════════════════════════════════
   Как hero на Главной / Play: градиент #1A8CFF→#0071E3, белый текст,
   мягкое синее свечение. Чипы (.ya-fishka / .ya-perekl) остаются на
   бледном M3 --primary — их это правило не трогает. */
html[data-theme="dark"] .ya-btn--filled:not(:disabled){
  background:linear-gradient(135deg,#1A8CFF 0%,#0071E3 100%);
  color:#fff;
  box-shadow:var(--ya-selected-glow),
    0 10px 28px color-mix(in srgb,#0071E3 40%,transparent);
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .ya-btn--filled:not(:disabled){
    background:linear-gradient(135deg,#1A8CFF 0%,#0071E3 100%);
    color:#fff;
    box-shadow:var(--ya-selected-glow),
      0 10px 28px color-mix(in srgb,#0071E3 40%,transparent);
  }
}


/* ═══ YS1 · крем-карточки тетради и дневника ═══════════════════════════ */
.ur-cream-card{
  box-shadow:var(--ya-card-elev, none);
}
.ur-workbook-examples .ur-download-btn:hover,
.ur-dnevnik-week .ur-download-btn:hover{
  border-color:var(--book-sutki);
  color:var(--book-sutki);
}
.ur-dnevnik-moments{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:10px;
}
.ur-dnevnik-extra-row{
  display:grid;
  grid-template-columns:minmax(120px,0.9fr) 1.4fr;
  gap:10px;
  align-items:start;
}
@media (max-width:520px){
  .ur-dnevnik-moments,
  .ur-dnevnik-extra-row{
    grid-template-columns:1fr;
  }
}

/* ═══ ПИЛЮЛЯ-ЦЕНА · .dr-cena ═════════════════════════════════════════════
   Одна кнопка с ценой на «Уроках» и на странице курса. На экране — только
   сумма; слово «купить» слышит чтец через .dr-vsluh. Класс свой, поверх
   .ya-btn и без --filled: тёмное правило системы красит --filled градиентом
   со свечением, а пилюле положен ровный --ya-cta. Цель касания 48 —
   через ::before (::after у .ya-btn занят слоем нажатия). Имя класса
   переехало сюда из learn.html как есть: его считают пробы. */
.dr-cena{
  position:relative; min-height:var(--h-btn-compact); height:var(--h-btn-compact); padding:0 var(--sp-4);
  border-radius:var(--shape-m); background:var(--ya-cta,var(--primary)); color:var(--ya-cta-on,var(--on-primary));
  font:var(--type-label-l); font-variant-numeric:tabular-nums; white-space:nowrap;
  box-shadow:none; width:auto; flex:0 0 auto;
}
/* Подушка до 50 по высоте. Было -4px: 48 ровно по расчёту и 47 по замеру —
   на границе нормы, а цель касания на границе промахивается. */
.dr-cena::before{ content:''; position:absolute; inset:-5px 0; }
.dr-cena:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }

/* Слово только для чтеца: вне потока, чтобы в flex-ряду не занимать ни
   пикселя и не добавлять промежутка. */
.dr-vsluh{
  position:absolute; width:1px; height:1px; margin:-1px; padding:0;
  overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap; border:0;
}

/* ═══ ЛИСТ ПОКУПКИ · .dr-pokupka ═══════════════════════════════════════════
   Разметку собирает core/pokupka.js из текстов core/kursy-dannye.js.
   Стили здесь, а не на странице: окно одно на «Уроки» и страницу курса. */
.dr-pokupka{
  border:0; padding:0; max-width:420px; width:calc(100% - var(--sp-8));
  border-radius:var(--shape-l); background:var(--surface-container-lowest);
  color:var(--on-surface); box-shadow:var(--elev-3);
}
.dr-pokupka::backdrop{ background:var(--scrim); }
.dr-pokupka-telo{ padding:var(--sp-6); }
.dr-pokupka h3{ margin:0 0 var(--sp-1); font:var(--type-title-l); }
.dr-pokupka-kurs{ margin:0 0 var(--sp-4); font:var(--type-body-m); color:var(--on-surface-variant); }
.dr-pokupka-summa{ margin:0 0 var(--sp-4); font:var(--type-headline-s); font-variant-numeric:tabular-nums; }
.dr-pokupka-tel{
  display:flex; align-items:center; justify-content:center;
  min-height:var(--h-btn); border-radius:var(--shape-m);
  background:var(--ya-cta,var(--primary)); color:var(--ya-cta-on,var(--on-primary));
  text-decoration:none; font:var(--type-title-m);
}
.dr-pokupka-kto{ margin:var(--sp-2) 0 0; text-align:center; font:var(--type-body-s); color:var(--on-surface-variant); }
.dr-pokupka-kak{
  margin:var(--sp-4) 0 0; padding-top:var(--sp-3); border-top:1px solid var(--outline-variant);
  font:var(--type-body-s); color:var(--on-surface-variant);
}
.dr-pokupka-zakryt{ margin-top:var(--sp-3); width:100%; }

/* ═══ КОЛЬЦО ДОЛИ · .ya-kolco ══════════════════════════════════════════════
   Сколько пройдено из скольких — одним кольцом 28×28. Разметку даёт
   YasnaKursy.кольцоHTML (core/kursy-dannye.js); ролями, чтобы жить в обеих
   темах. Длина окружности при r=11 — 69.12, смещение штриха — непройденное. */
.ya-kolco{ display:inline-block; flex:0 0 auto; width:28px; height:28px; }
.ya-kolco svg{ width:100%; height:100%; display:block; transform:rotate(-90deg); }
.ya-kolco__fon{ fill:var(--surface-container-lowest); stroke:var(--outline-variant); stroke-width:2.2; }
.ya-kolco__dol{ fill:none; stroke:var(--primary); stroke-width:2.2; stroke-linecap:round; stroke-dasharray:69.12; }
.ya-kolco--vsyo .ya-kolco__fon{ fill:var(--primary); stroke:var(--primary); }
.ya-kolco--vsyo .ya-kolco__dol{ display:none; }
.ya-kolco__galka{ fill:none; stroke:var(--on-primary); stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round; }
.ya-kolco--net .ya-kolco__fon{ stroke-dasharray:2.5 3; opacity:.6; }


/* ═══ ДВЕРЬ ХАБА · .ya-dver ════════════════════════════════════════════════
   Общая карточка-вход на хабах (Сегодня, Практика). Раньше один и тот же
   смысл рисовали четыре раза: .gl-dver / .pk-dver / .bk-dver / .dr-kurs.
   Здесь — оболочка + имя + подпись + след; раскладку и сцену окна задают
   модификаторы. Без #hex и без !important.

   Разметка (Практика · сцена слева):
     <a class="ya-dver ya-dver--scena" href="…">
       <span class="ya-dver__okno">…svg…</span>
       <span class="ya-dver__slova">
         <span class="ya-dver__imya">…</span>
         <span class="ya-dver__o">…</span>
         <span class="ya-dver__sled">…</span>
       </span>
     </a>

   Разметка (Сегодня · панель справа):
     <a class="ya-dver ya-dver--panel" href="…">
       <span class="ya-dver__imya">…</span>
       <span class="ya-dver__o">…</span>
       <span class="ya-dver__hod">Открыть ›</span>
       <span class="ya-dver__panel" aria-hidden="true">
         <span class="ya-dver__znak">…svg…</span>
       </span>
     </a>
   ════════════════════════════════════════════════════════════════════════ */

.ya-dver{
  box-sizing:border-box;
  display:grid;
  align-items:stretch;
  height:100%;
  padding:var(--sp-4);
  border-radius:var(--shape-l);
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  color:inherit;
  text-decoration:none;
  position:relative;
  overflow:hidden;
  box-shadow:none;
  transition:
    background var(--dur-short,150ms) var(--ease-standard,ease),
    border-color var(--dur-short,150ms) var(--ease-standard,ease),
    box-shadow var(--dur-short,150ms) var(--ease-standard,ease),
    transform var(--dur-short,150ms) var(--ease-standard,ease);
}
.ya-dver:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}
.ya-dver:active{
  background:var(--surface-container-high);
  transform:none;
}

.ya-dver__imya{
  font:var(--type-title-l);
  color:var(--on-surface);
  letter-spacing:-.015em;
  text-wrap:balance;
  overflow-wrap:anywhere;
}
.ya-dver__o{
  font:var(--type-body-s);
  color:var(--on-surface-variant);
  overflow-wrap:anywhere;
  text-wrap:pretty;
}
.ya-dver__sled{
  margin-top:auto;
  padding-top:var(--sp-2);
  font:var(--type-label-m);
  color:var(--on-surface-variant);
  font-variant-numeric:tabular-nums;
}
.ya-dver__sled[hidden]{ display:none; }

/* ── Модификатор: сцена (Практика) ───────────────────────────────────────
   Слева квадрат-окно со SVG-сценой, справа колонка слов. Меры окна
   (--okno / --zazor / --pole-kart) задаёт экран-хозяин на сетке. */
.ya-dver--scena{
  --ya-dver-okno:var(--okno,100px);
  --ya-dver-zazor:var(--zazor,14px);
  --ya-dver-pole:var(--pole-kart,16px);
  grid-template-columns:var(--ya-dver-okno) minmax(0,1fr);
  gap:var(--ya-dver-zazor);
  padding:var(--ya-dver-pole);
  min-height:calc(var(--ya-dver-okno) + var(--ya-dver-pole) * 2);
  overflow:visible;
}
@media (hover:hover){
  .ya-dver--scena:hover{ border-color:var(--outline); }
}
.ya-dver--scena:active{
  background:var(--surface-container);
  transform:scale(.985);
}
html[data-theme="dark"] .ya-dver--scena{
  background:var(--surface-container);
  border-color:var(--outline-variant);
  box-shadow:var(--elev-3), inset 0 1px 0 color-mix(in srgb,var(--on-surface) 6%,transparent);
}
@media (hover:hover){
  html[data-theme="dark"] .ya-dver--scena:hover{
    border-color:var(--ya-selected-stroke,var(--primary));
    background-image:linear-gradient(var(--ya-selected-fill,transparent),var(--ya-selected-fill,transparent));
    box-shadow:var(--ya-selected-glow,none);
    transform:translateY(-1px);
    z-index:1;
  }
}
html[data-theme="dark"] .ya-dver--scena:active{
  background:var(--surface-container-high);
  background-image:none;
  box-shadow:none;
  transform:scale(.985);
}
html[data-dvizhenie="off"] .ya-dver--scena:active,
html[data-dvizhenie="off"][data-theme="dark"] .ya-dver--scena:hover{
  transform:none;
}

.ya-dver--scena .ya-dver__slova{
  display:flex;
  flex-direction:column;
  min-width:0;
  overflow-wrap:anywhere;
}
.ya-dver--scena .ya-dver__imya::after{
  content:' ›';
  font-weight:500;
  color:var(--on-surface-variant);
  opacity:.42;
}
@media (hover:hover){
  .ya-dver--scena:hover .ya-dver__imya::after{
    opacity:.72;
    color:var(--ya-primary-ink,var(--primary));
  }
}
html[data-theme="dark"] .ya-dver--scena .ya-dver__imya{ letter-spacing:-.01em; }
html[data-theme="dark"] .ya-dver--scena .ya-dver__imya::after{ opacity:.55; }
@media (hover:hover){
  html[data-theme="dark"] .ya-dver--scena:hover .ya-dver__imya::after{
    color:var(--ya-selected-meta,var(--primary));
    opacity:.9;
  }
}
.ya-dver--scena .ya-dver__o{
  margin-top:4px;
  min-height:calc(2 * 1.385em);
}
.ya-dver--scena .ya-dver__okno{
  width:var(--ya-dver-okno);
  height:var(--ya-dver-okno);
  border-radius:var(--shape-m);
  background:var(--surface-container-high);
  overflow:hidden;
  display:block;
  align-self:start;
  position:relative;
}
html[data-theme="dark"] .ya-dver--scena .ya-dver__okno{
  background:linear-gradient(160deg,
    color-mix(in srgb,var(--primary) 10%,var(--surface-container-highest)) 0%,
    var(--surface-container-highest) 55%,
    color-mix(in srgb,var(--primary) 6%,var(--surface-container-high)) 100%);
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb,var(--primary) 28%,transparent),
    0 0 20px color-mix(in srgb,var(--primary) 14%,transparent),
    var(--ya-selected-glow,none);
}
@supports not (color:color-mix(in srgb,#000 50%,#fff)){
  html[data-theme="dark"] .ya-dver--scena{
    box-shadow:var(--elev-3),inset 0 1px 0 rgba(242,244,247,.06);
  }
  html[data-theme="dark"] .ya-dver--scena .ya-dver__okno{
    background:#2A2F38;
    box-shadow:inset 0 0 0 1px rgba(168,200,254,.28),
      0 0 18px rgba(0,113,227,.18),
      0 0 0 1px rgba(59,155,255,.12),0 8px 24px rgba(0,113,227,.16);
  }
}
.ya-dver--scena .ya-dver__okno svg{ display:block; width:100%; height:100%; }

@media (min-width:1000px){
  .ya-dver--scena{
    grid-template-columns:minmax(0,1fr);
    grid-template-rows:auto 1fr;
    min-height:auto;
  }
  .ya-dver--scena .ya-dver__okno{
    width:100%;
    height:auto;
    aspect-ratio:16/10;
  }
}

/* ── Модификатор: панель (Сегодня) ───────────────────────────────────────
   Слева текст + тихий ход, справа визуальная панель со знаком. */
.ya-dver--panel{
  grid-template-columns:minmax(0,1fr) minmax(88px,38%);
  grid-template-rows:auto auto 1fr auto;
  gap:var(--sp-2) var(--sp-3);
  min-height:148px;
}
.ya-dver--panel .ya-dver__imya{ grid-column:1; grid-row:1; }
.ya-dver--panel .ya-dver__o{ grid-column:1; grid-row:2; }
.ya-dver--panel .ya-dver__hod{
  grid-column:1; grid-row:4;
  align-self:end; justify-self:start;
  margin-top:var(--sp-2);
  display:inline-flex; align-items:center; gap:6px;
  padding:7px 12px; border-radius:var(--shape-full);
  font:var(--type-label-m); font-weight:600; letter-spacing:.01em;
  color:var(--ya-primary-ink,var(--primary));
  background:var(--surface-container-high);
  border:1px solid var(--outline-variant);
  box-shadow:none;
  transition:
    background var(--dur-short,150ms) var(--ease-standard,ease),
    border-color var(--dur-short,150ms) var(--ease-standard,ease),
    color var(--dur-short,150ms) var(--ease-standard,ease);
}
.ya-dver--panel .ya-dver__panel{
  grid-column:2; grid-row:1 / -1;
  position:relative; min-height:96px;
  border-radius:var(--shape-m);
  display:flex; align-items:center; justify-content:center;
  background:
    radial-gradient(120% 90% at 70% 20%,
      color-mix(in srgb,var(--primary) 28%,transparent) 0%,
      transparent 55%),
    radial-gradient(90% 80% at 20% 90%,
      color-mix(in srgb,var(--primary) 14%,transparent) 0%,
      transparent 50%),
    linear-gradient(160deg,
      var(--surface-container-high) 0%,
      var(--surface-container) 100%);
  border:1px solid color-mix(in srgb,var(--primary) 16%,var(--outline-variant));
  overflow:hidden;
}
.ya-dver--panel .ya-dver__znak{
  position:relative; z-index:1;
  width:44px; height:44px;
  color:var(--ya-selected-meta,var(--primary));
  filter:drop-shadow(0 0 10px color-mix(in srgb,var(--primary) 35%,transparent));
}
.ya-dver--panel .ya-dver__znak svg{
  display:block; width:100%; height:100%; fill:none;
  stroke:currentColor; stroke-width:1.7;
  stroke-linecap:round; stroke-linejoin:round;
}
html[data-theme="dark"] .ya-dver--panel{
  background:linear-gradient(165deg,
    color-mix(in srgb,var(--primary) 7%,var(--surface-container-low)) 0%,
    var(--surface-container-low) 48%,
    var(--surface-container) 100%);
  border-color:color-mix(in srgb,var(--primary) 22%,var(--outline-variant));
  box-shadow:var(--elev-2), inset 0 1px 0 rgba(242,244,247,.04);
}
html[data-theme="dark"] .ya-dver--panel .ya-dver__imya{ color:var(--on-surface); }
html[data-theme="dark"] .ya-dver--panel .ya-dver__o{
  color:color-mix(in srgb,var(--on-surface) 72%,var(--on-surface-variant));
}
html[data-theme="dark"] .ya-dver--panel .ya-dver__panel{
  background:
    radial-gradient(120% 90% at 75% 15%,
      color-mix(in srgb,var(--ya-cta,#1A8CFF) 38%,transparent) 0%,
      transparent 52%),
    radial-gradient(80% 70% at 15% 85%,
      color-mix(in srgb,var(--primary) 22%,transparent) 0%,
      transparent 55%),
    linear-gradient(155deg,
      var(--surface-container-highest) 0%,
      var(--surface-container) 55%,
      var(--surface-container-low) 100%);
  border-color:color-mix(in srgb,var(--primary) 30%,transparent);
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--primary) 12%,transparent),
    0 0 24px color-mix(in srgb,var(--primary) 12%,transparent);
}
html[data-theme="dark"] .ya-dver--panel .ya-dver__hod{
  color:var(--ya-selected-meta,var(--primary));
  background:color-mix(in srgb,var(--primary) 10%,var(--surface-container-high));
  border-color:color-mix(in srgb,var(--primary) 28%,var(--outline-variant));
}
@media (hover:hover){
  .ya-dver--panel:hover{
    background:var(--surface-container);
    border-color:color-mix(in srgb,var(--primary) 28%,var(--outline-variant));
    box-shadow:var(--ya-selected-glow,none);
    transform:translateY(-2px);
  }
  .ya-dver--panel:hover .ya-dver__hod{
    background:var(--ya-selected-fill,color-mix(in srgb,var(--primary) 12%,transparent));
    border-color:color-mix(in srgb,var(--primary) 40%,var(--outline-variant));
    color:var(--ya-selected-meta,var(--primary));
  }
  html[data-theme="dark"] .ya-dver--panel:hover{
    background:linear-gradient(165deg,
      color-mix(in srgb,var(--primary) 12%,var(--surface-container)) 0%,
      var(--surface-container) 55%,
      var(--surface-container-high) 100%);
    border-color:color-mix(in srgb,var(--primary) 40%,var(--outline-variant));
  }
}
@media (max-width:419px){
  .ya-dver--panel{
    grid-template-columns:minmax(0,1fr) minmax(72px,34%);
    min-height:132px;
    gap:var(--sp-2) var(--sp-2);
    padding:var(--sp-3);
  }
  .ya-dver--panel .ya-dver__panel{ min-height:0; }
  .ya-dver--panel .ya-dver__znak{ width:36px; height:36px; }
}

/* ═══ ИЕРАРХИЯ ОБУЧЕНИЯ · .ya-kurs / .ya-tema / .ya-urok ══════════════════
   Общие строительные блоки дерева «Уроки»: сосуд курса, строка темы,
   строка занятия. Исторические .dr-kurs / .dr-vetv / .dr-uzel — алиасы тех
   же узлов (JS остаётся на них; в разметку добавлен ya-*). Экран-хозяин
   задаёт --dr-kart. Без #hex и без !important.
   Перенесено из learn.html (pass-3 · 19.09.2026).
   ════════════════════════════════════════════════════════════════════════ */
/* Курс / тема / занятие — см. шапку блока выше. */
/* ── УРОВЕНЬ 1 · КУРС = СОСУД ─────────────────────────────────────────── */
.ya-kurs, .dr-kurs { margin: 0 0 var(--sp-4, 16px); padding: 20px; border-radius: var(--shape-l, 16px);
  background: var(--dr-kart); border: 1px solid var(--outline-variant);
  box-shadow: var(--ya-card-elev, none); }
@media (min-width: 720px){.ya-kurs, .dr-kurs { padding: 24px; } }
@media (max-width: 520px){.ya-kurs, .dr-kurs { padding: 16px; } }.dr-kurs-shapka { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: var(--sp-4, 16px);
  align-items: start; padding: 0; border: 0; }
/* ПЕРЕНОС ТОЛЬКО ПО НУЖДЕ (18.09.2026). Стояло overflow-wrap:anywhere — оно
   рвёт слово, как только строка не влезает целиком, и на 360 имя читалось
   «Специальны / е Ясны». break-word рвёт слово, только если оно не помещается
   и одно: имена курсов таких длин не имеют, и перенос идёт по пробелу. */
.dr-kurs-imya { grid-column: 1; margin: 0; font: var(--type-headline-s, 600 22px/28px inherit);
  letter-spacing: -.01em; color: var(--on-surface); overflow-wrap: break-word; }.dr-kurs-imya .dr-vetv-zamok { display: none; }
/* Слот: кольцо, пилюля или галка — одной высоты, экран не прыгает. */
/* Колонка, а не ряд: под пилюлей встаёт тихая подпись «за все 14 тем» —
   из двух чисел цены подписанным было только меньшее («тема 1 499 ₽» в мете),
   а «14 990 ₽» стояло голым числом и читалось третьей ценой темы. Сумма
   по-прежнему звучит один раз, но теперь со словом. */
.dr-kurs-slot { grid-column: 2; grid-row: 1; justify-self: end; align-self: start; min-height: 40px;
  display: flex; flex-direction: column; align-items: flex-end; justify-content: center; gap: 2px;
  margin-top: -6px; }.dr-kurs-slot-pod { font: var(--type-label-s, 500 12px/16px inherit); color: var(--on-surface-variant);
  white-space: nowrap; }.dr-kurs-slot .dr-kolco { width: 40px; height: 40px; }.dr-kurs-slot .dr-kolco svg { width: 40px; height: 40px; }
/* Кольцо курса (06.10.2026): дорожка — волосок роли --outline-variant, а не
   тёмный --border-strong, дуга толще. Дуга 2/5 на тёмной дорожке той же
   толщины читалась пустым кольцом. Внутри — число «2/5». */
.dr-kurs-slot .dr-kolco-fon { stroke-width: 2.6; stroke: var(--outline-variant); }.dr-kurs-slot .dr-kolco-dol { stroke-width: 2.6; }
.dr-kolco-chislo { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font: var(--type-label-s, 500 12px/16px inherit); letter-spacing: -.02em; font-variant-numeric: tabular-nums; color: var(--on-surface); }
/* ПРОЙДЕННЫЙ КУРС — ГАЛОЧКА, НЕ ЗАЛИТЫЙ ДИСК С ГАЛКОЙ ВНУТРИ: диск читался
   как точка и галочка сразу. Но и тонкой тональной обводкой 1,5 слот быть не
   может: на снимке рядом с ним стояла плитка пройденной ТЕМЫ — сплошной
   квадрат 24 в --primary, — и знак ВТОРОГО уровня выходил громче знака
   ПЕРВОГО. Кольцо и было ответом: у слота своя прорисовка от 0 до 100, и
   пройденный курс — её конец, то есть ЗАМКНУТОЕ кольцо тем же пером 2,2 и той
   же ролью, что дуга доли. Форма продолжает сама себя, галочка садится
   внутрь, диска нет. */
.dr-kurs-ok { width: 40px; height: 40px; border-radius: 50%; box-sizing: border-box;
  display: flex; align-items: center; justify-content: center;
  background: var(--ya-selected-fill); box-shadow: inset 0 0 0 2.2px var(--primary);
  color: var(--primary); }.dr-kurs-ok .ya-ik { width: 22px; height: 22px; }.dr-kurs-pod { grid-column: 1 / -1; margin: 4px 0 0; font: var(--type-body-m, 400 15px/22px inherit);
  color: var(--on-surface-variant); max-width: var(--stroka-max, 64ch); }.dr-kurs-meta { grid-column: 1 / -1; margin: 8px 0 0; font: var(--type-label-s, 500 12px/16px inherit);
  color: var(--on-surface-variant); font-variant-numeric: tabular-nums; }
/* «Подробнее о курсе» — ссылка на страницу курса (kurs.html): «для кого» и
   описание живут там, а не в складке карточки. Цель нажатия 40 видимых,
   48 нажимаемых — через ::before. */
/* Цель доведена до нормы ВИДИМЫМ размером: было 40 видимых и 48 нажимаемых
   через ::before — человек целился в то, что видит, а нажималось больше. */
.dr-kurs-podrobno-knop { grid-column: 1 / -1; justify-self: start; display: inline-flex; align-items: center; gap: 2px;
  min-height: 48px; padding: 0 8px; margin: var(--sp-2, 8px) -8px 0; position: relative; text-decoration: none;
  cursor: pointer; font: var(--type-label-l, 600 14px/20px inherit); color: var(--primary);
  border-radius: var(--shape-s, 8px); }.dr-kurs-podrobno-knop:hover { background: color-mix(in srgb, var(--on-surface) 6%, transparent); }.dr-kurs-podrobno-knop:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }.ya-kurs > .dr-stvol, .dr-kurs > .dr-stvol, .ya-kurs > .dr-esche, .dr-kurs > .dr-esche { margin-top: var(--sp-4, 16px); }

/* ПИЛЮЛЯ-ЦЕНА (.dr-cena) и слово для чтеца (.dr-vsluh) — в core/komponenty.css:
   те же на странице курса. Здесь только тональный вариант для темы. */

/* ── УРОВЕНЬ 2 · ТЕМА = СТРОКА ЗАГОЛОВОЧНОЙ ГАРНИТУРЫ ─────────────────── */
.dr-stvol, .dr-stvol::before, .dr-uzly::before, .dr-vetv-knop::before, .ya-tema--byl > .dr-vetv-knop::before, .dr-vetv--byl > .dr-vetv-knop::before { content: none; }.dr-stvol { padding: 0; margin: 0; }.ya-tema, .dr-vetv { border: 0; margin: 0; background: none; }.ya-tema + .ya-tema, .dr-vetv + .dr-vetv { border-top: 1px solid var(--outline-variant); }.dr-vetv-knop { display: grid; grid-template-columns: 24px minmax(0, 1fr) auto 24px; column-gap: 12px;
  align-items: center; min-height: 56px; padding: 8px; margin: 0 -8px; list-style: none; cursor: pointer;
  border-radius: var(--shape-s, 8px); position: relative; }.dr-vetv-knop::-webkit-details-marker { display: none; }.dr-vetv-knop:hover { background: color-mix(in srgb, var(--on-surface) 6%, transparent); }.dr-vetv-knop:active { background: color-mix(in srgb, var(--on-surface) 10%, transparent); }.dr-vetv-knop:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }.dr-vetv-knop > .dr-kolco { display: none; }
/* Плитка 24×24 — вторая форма рядом с кольцом курса, их не перепутать.
   Один знак на плитку: пусто / налито долей / галочка / замок. Охра и точка
   поверх галочки не ставятся — пройденное всегда только галочка. */
.dr-stupen { width: 24px; height: 24px; border-radius: var(--shape-s, 8px); background: var(--surface-container-high);
  display: inline-flex; align-items: center; justify-content: center; position: relative; flex: 0 0 auto; }
/* Галка в плитке — та же роль, что у галки в слоте курса (--primary внутри
   кольца). Было --on-ok-container на --ok-container: «пройдено» звучало на
   трёх уровнях тремя цветами (синее кольцо, зелёная плитка, зелёная точка).
   Теперь один смысл — одна форма (галка) и одна роль, а размер и вес обводки
   падают по уровням: 40/2,2 → 24/1,5 → 14/1,6 штрихом. */
.dr-stupen .ya-ik { display: none; width: 16px; height: 16px; }.ya-tema--byl:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen, .dr-vetv--byl:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen { background: var(--ya-selected-fill); box-shadow: inset 0 0 0 1.5px var(--ya-selected-stroke); }
/* ЧАСТИЧНО ПРОЙДЕННАЯ ТЕМА — ПЛИТКА, НАЛИТАЯ ДОЛЕЙ (19.09.2026). Состояний у
   плитки было два — пусто и галка, — и тема с двумя пройденными занятиями из
   шести выглядела нетронутой, хотя кольцо курса рядом налито на треть и мета
   говорит «пройдено 2». Доля приходит переменной --dolya (проценты, ставит
   ветвьHTML), заливка — та же роль, что у кольца курса: одно состояние — один
   цвет, разные уровни — разные формы. */
.ya-tema--chast:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen, .dr-vetv--chast:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen {
  background: linear-gradient(to top, var(--primary) calc(var(--dolya, 0) * 1%), var(--surface-container-high) 0);
  box-shadow: inset 0 0 0 1.5px var(--ya-selected-stroke); }
/* ПРОЙДЕННОЕ ОСТАЁТСЯ ПРОЙДЕННЫМ И ПОД ЗАМКОМ. У человека, прошедшего тему и
   потерявшего доступ (вышел из учётной записи, сменил устройство — прогресс
   лежит локально), плитка становилась «закрыто», а подпись рядом оставалась
   «Пройдено». Разводим состояния не порядком правил, а признаком :not(--vsyo):
   порядок держится только пока никто не переставит строки, а признак говорит
   сам за себя. О замке при этом сказано знаком у имени темы и подписью
   «Пройдено · нужен ключ».
   ЗАКРЫТО — ТИХИЙ ЗАМОК, А НЕ ОХРА С ТОЧКОЙ. Охряная плитка с точкой внутри
   была третьим цветом в словаре плитки и читалась состоянием «что-то не так»;
   замок 16 тем же пером говорит ровно то, что есть, и ничего не обещает. */
.ya-tema--zamok:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen, .dr-vetv--zamok:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen { background: var(--surface-container-high); box-shadow: none; }.ya-tema--zamok:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen .ya-ik--zamok, .dr-vetv--zamok:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen .ya-ik--zamok { display: block; color: var(--on-surface-variant); }
/* Ответа сервера ещё нет — плитка молчит: «проверяю» и «закрыто» разные вещи.
   ГАСЯЩЕЕ ПРАВИЛО ВЕСИТ СТОЛЬКО ЖЕ, СКОЛЬКО ЗАЖИГАЮЩЕЕ (19.09.2026). Здесь
   стояло четыре класса против пяти у правила замка выше — и «проверяю доступ»
   показывало замок: «ждём» всегда идёт вместе с «закрыта» (ветвьHTML: ждём =
   закрыта && ветвьПроверяется), обе строки получают оба класса, а вес перебивает
   порядок. Дописан тот же :not(--vsyo): теперь правила равны по весу и решает
   место в файле — как и задумано. Стережёт проба «проверяю доступ: плитка молчит». */
.ya-tema--zhdu:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen, .dr-vetv--zhdu:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen { background: var(--surface-container-high); }.ya-tema--zhdu:not(.ya-tema--vsyo) > .dr-vetv-knop .dr-stupen .ya-ik--zamok, .dr-vetv--zhdu:not(.dr-vetv--vsyo) > .dr-vetv-knop .dr-stupen .ya-ik--zamok { display: none; }
/* ПРОЙДЕННАЯ ТЕМА — КОЛЬЦО, А НЕ СПЛОШНОЕ ПЯТНО (19.09.2026). Плитка была
   залита --primary целиком: 576 px² насыщенной краски на ВТОРОМ уровне против
   ~260 px² по штриху кольца на ПЕРВОМ — знак темы кричал громче знака курса, и
   на карточке глаз шёл снизу вверх. Размер по уровням падал правильно
   (40 → 24 → 14), вес краски — нет. Теперь все три уровня говорят одним
   приёмом и разным весом: кольцо курса 40 обводкой 2,2 → плитка темы 24
   обводкой 1,5 → галочка занятия 14 штрихом 1,6. Заливка долей (--chast выше)
   не тронута: она про путь, а это про его конец, и разведены они признаком
   :not(--vsyo), а не порядком строк. */
.ya-tema--vsyo > .dr-vetv-knop .dr-stupen, .dr-vetv--vsyo > .dr-vetv-knop .dr-stupen { background: var(--ya-selected-fill); box-shadow: inset 0 0 0 1.5px var(--ya-selected-stroke); }.ya-tema--vsyo > .dr-vetv-knop .dr-stupen .ya-ik--galochka, .dr-vetv--vsyo > .dr-vetv-knop .dr-stupen .ya-ik--galochka { display: block; color: var(--primary); }.dr-vetv-imya .dr-vetv-zamok { display: none; }.dr-vetv-tekst { min-width: 0; }.dr-vetv-imya { font: var(--type-title-m, 600 16px/24px inherit); color: var(--on-surface); white-space: normal;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }.dr-vetv-pod { display: block; margin-top: 1px; font: var(--type-body-s, 400 13px/18px inherit); color: var(--on-surface-variant); }.dr-vetv-pod b { font-weight: 600; }
/* Пилюля цены ТЕМЫ — тональная и ниже курсовой (32 против 40): иерархия
   цен та же, что у знаков. Со строки-темы она ушла (перехватывала нажатие) и
   стоит теперь внутри раскрытой темы, рядом с «Ввести ключ». */
.dr-cena--tema { height: 32px; min-height: 32px; padding: 0 12px; border-radius: var(--shape-full, 999px);
  background: var(--secondary-container); color: var(--on-secondary-container);
  font: var(--type-label-s, 500 12px/16px inherit); font-variant-numeric: tabular-nums; }
/* Подушка до 50×(ширина+12): 32 видимых — это иерархия цен, менять её нельзя,
   а цель касания меньше 48 промахивается. Было -8px: ровно 48 по расчёту и 47
   по замеру — половина пикселя решала, попал человек или нет. */
.dr-cena--tema::before { inset: -9px -6px; }.dr-shevron { width: 18px; height: 18px; color: var(--on-surface-variant); justify-self: end;
  transition: transform var(--dur-short, .15s) var(--ease-standard, ease); }.ya-tema[open] > .dr-vetv-knop .dr-shevron, .dr-vetv[open] > .dr-vetv-knop .dr-shevron, .dr-esche[open] > .dr-esche-knop .dr-shevron { transform: rotate(180deg); }.dr-vetv-strelka, .dr-esche-strelka { display: none; }

/* ── УРОВЕНЬ 3 · ЗАНЯТИЕ = СТРОКА ТЕКСТОВОЙ ГАРНИТУРЫ ─────────────────── */
.dr-uzly { position: static; margin: 0; padding: 0 0 8px 36px; }.ya-tema--otkryta > .dr-uzly, .dr-vetv--otkryta > .dr-uzly { padding-left: 0; display: block; }.ya-tema--otkryta, .dr-vetv--otkryta { border: 0; }
/* Колонка знака — 14, а не 8: в ней стоит не только точка, но и галочка с
   стрелкой того же пера, что знаки вида справа. Зазор сжат 12 → 8, чтобы
   левый блок вырос всего на 2 px и имена не начали переноситься чаще. */
.ya-urok, .dr-uzel { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; column-gap: 10px; align-items: start;
  min-height: 48px; padding: 13px 8px; margin: 0 -8px; width: calc(100% + 16px); box-sizing: border-box;
  border-radius: var(--shape-s, 8px); color: inherit; text-decoration: none; position: relative; opacity: 1; }.ya-urok:hover, .dr-uzel:hover { background: color-mix(in srgb, var(--on-surface) 6%, transparent); }
/* ─── ОТМЕТКА ЗАНЯТИЯ (18.09.2026) ─────────────────────────────────────
   Было: пройденное занятие — точка 8, залитая --ok. Зелёный выпадал не
   потому, что зелёный: (1) --ok в дизайн-системе объявлен цветом «верно и
   неверно в ВОПРОСАХ», и здесь отвечал на чужой вопрос; (2) точка была
   единственным сплошным цветным блобом на экране, где весь словарь —
   штриховые глифы 14×14 со stroke 1.6; (3) третий уровень иерархии выходил
   громче второго — точка занятия давала 10,2:1 к фону карточки, а плитка
   пройденной ТЕМЫ над ней 2,0:1; (4) «пройдено» и «начато» различались
   одним оттенком — два одинаковых кружка, синий и зелёный.
   Стало: ПРОЙДЕНО — ГАЛОЧКА-ШТРИХ 14 тем же пером и того же размера, что
   знаки вида в правой колонке, цветом --on-surface-variant. Отличие от
   соседних состояний — ФОРМА, а не оттенок: читается в ч/б, при
   дальтонизме и на солнце. Площадь тона ≈18 px² против 50 у точки и 576 у
   плитки темы — уровень снова тише тех, что над ним. Ровно так пройденное
   занятие уже размечено на «Подробнее о курсе» (kurs.html): два экрана
   перестали спорить, а --ok вернулся вопросам.
   ДАЛЬШЕ — СТРЕЛКА того же пера в --primary: у этого состояния своего знака
   не было вовсе, и вся его заметность держалась на заливке 1,11:1, которая
   на ярком экране и при печати исчезает. Заливку подпираем обводкой.
   НАЧАТО — залитая точка 8 --primary, НЕ НАЧАТО — контурная точка 8.
   ГОТОВИТСЯ — знака нет совсем: у строки есть ярлык «готовится» и нет
   адреса, отметка состояния ей не нужна, а пунктирное кольцо 8 от
   контурного кольца 8 на телефоне неотличимо. */
/* ─── ЗНАК СОСТОЯНИЯ — КОЛОНКА 22 (06.10.2026) ───────────────────────────
   Номер занятия переехал из имени в колонку знака (learn.html, узелHTML), и
   колонка стала 22 — высотой строки имени (15/22): знак стоит на первой
   строке, имя в две строки выравнивается по своему левому краю. Строка
   выровнена по верху (align-items: start), поле 13 сверху и снизу держит
   прежние 48 на одну строку.
     не начато — номер, нейтральный; без номера — точка-контур 6;
     начато    — номер (или точка) в кольце 22, налитом наполовину, --primary;
     пройдено  — галочка-штрих 16 цветом успеха --ok;
     дальше    — по состоянию, а строку выделяют заливка и слово «Дальше». */
.dr-uzel-znak { width: 22px; height: 22px; box-sizing: border-box; position: relative;
  display: flex; align-items: center; justify-content: center; justify-self: start;
  border: 0; border-radius: 0; background: none; color: var(--on-surface-variant); }
.dr-uzel-nomer { position: relative; font: var(--type-label-s, 500 12px/16px inherit); letter-spacing: normal;
  text-transform: none; font-variant-numeric: tabular-nums; color: inherit; }
.dr-uzel-tochka { width: 6px; height: 6px; border-radius: 50%; box-sizing: border-box;
  border: 1.5px solid var(--outline); position: relative; }
.dr-uzel-znak--nachato { color: var(--primary); }
.dr-uzel-znak--nachato .dr-uzel-tochka { background: var(--primary); border-color: var(--primary); }
.dr-uzel-kolco { position: absolute; inset: 0; width: 22px; height: 22px; transform: rotate(-90deg); }
.dr-uzel-kolco__fon, .dr-uzel-kolco__dol { fill: none; stroke-width: 2; }
.dr-uzel-kolco__fon { stroke: var(--outline-variant); }
.dr-uzel-kolco__dol { stroke: var(--primary); stroke-linecap: round; stroke-dasharray: 62.83; stroke-dashoffset: 31.42; }
/* Селектор двухклассовый нарочно: строка «дальше» бывает и начатой, и тогда
   правило .dr-uzel--nachato .dr-uzel-znak (тоже 0,2,0, но выше по файлу)
   заливало бы глиф — выходил синий квадрат 14×14 вместо стрелки. */
.ya-urok .dr-uzel-znak--galka, .dr-uzel .dr-uzel-znak--galka { border: 0; border-radius: 0; background: none; }.dr-uzel-znak--galka svg { width: 16px; height: 16px; display: block;
  fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }.dr-uzel .dr-uzel-znak--galka, .ya-urok .dr-uzel-znak--galka { color: var(--ok); }
/* «Готовится» и строки без адреса знака не получают: пустая ячейка сама
   говорит «здесь пока ничего». */
.ya-urok--net .dr-uzel-znak, .dr-uzel--net .dr-uzel-znak { border: 0; background: none; }
/* Тихие метки после имени: «бесплатно» (пробное), «по желанию». */
.dr-uzel-metka { display: inline-block; margin-left: 8px; padding: 0 8px; border-radius: var(--shape-full, 999px);
  font: var(--type-label-s, 500 12px/16px inherit); letter-spacing: normal; vertical-align: 1px; white-space: nowrap;
  border: 1px solid var(--outline-variant); color: var(--on-surface-variant); }
.dr-uzel--proba .dr-uzel-metka { border-color: transparent; background: var(--surface-container-high); }
/* «Дальше» — слово у правого края единственной выделенной строки. */
.dr-uzel-dalshe { font: var(--type-label-s, 500 12px/16px inherit); letter-spacing: normal; text-transform: none;
  color: var(--ya-selected-on, var(--primary)); }
/* Пробное занятие — до курса: отделено от занятий волоском. */
.dr-proba { margin-top: var(--sp-3, 12px); border-bottom: 1px solid var(--outline-variant); padding-bottom: 4px; margin-bottom: 4px; }
/* Над строкой замка свой волосок не нужен: у строки замка он уже есть. */
.dr-proba--nad-zamkom { border-bottom: 0; padding-bottom: 0; margin-bottom: 0; }
/* Тема без шапки (курс из одной темы): занятия сразу, без отступа ступени. */
.dr-vetv--plosko { border: 0; padding: 0 0 4px; }
.dr-vetv--plosko > .dr-uzly { padding: 0; }.ya-urok--net, .dr-uzel--net { cursor: default; opacity: 1; }.dr-uzel-tekst { min-width: 0; }.dr-uzel-imya { font: var(--type-body-m, 400 15px/22px inherit); color: var(--on-surface); }.ya-urok--gotovo .dr-uzel-imya, .dr-uzel--gotovo .dr-uzel-imya, .ya-urok--net .dr-uzel-imya, .dr-uzel--net .dr-uzel-imya { color: var(--on-surface-variant); }
/* Заливка «ты здесь» даёт 1,11:1 — вдвое ниже порога, который ДС требует от
   единственного признака. Добавляем обводку ролью: она и есть признак. */
.ya-urok--dalshe, .dr-uzel--dalshe { background: var(--ya-selected-fill); box-shadow: inset 0 0 0 1px var(--ya-selected-stroke); }.ya-urok--dalshe .dr-uzel-imya, .dr-uzel--dalshe .dr-uzel-imya { color: var(--ya-selected-on, var(--on-surface)); }
/* ЗАНЯТИЯ ЗАКРЫТОЙ ТЕМЫ ГАСИМ ЦЕЛИКОМ. Они выглядели в точности как
   открытые непройденные — то же имя в --on-surface, та же мера, тот же
   курсор-рука, — а нажатие отбрасывало назад к карточке замка: приглашение,
   которое гасят. Теперь строка сразу говорит, что она за дверью, а список
   по-прежнему виден: человек должен знать, что там есть. */
.ya-tema--zamok .ya-urok, .dr-vetv--zamok .dr-uzel { cursor: default; }.ya-tema--zamok .dr-uzel-imya, .dr-vetv--zamok .dr-uzel-imya, .ya-tema--zamok .dr-uzel-mera, .dr-vetv--zamok .dr-uzel-mera { color: var(--on-surface-variant); }
/* ЗНАКОВ ПЯТЬ, И ШЕСТОГО НЕТ (19.09.2026). У строк закрытой темы кольцо 8
   рисовалось пунктиром 1,5 — на 1× это четыре крошки, которые читаются
   артефактом рендера, а не состоянием, и вблизи путаются со значком раскладки
   у правого края той же строки. Что тема закрыта, сказано один раз — строкой
   замка на карточке курса; строке занятия повторять нечем, ей довольно
   приглушённого кольца. */
.ya-tema--zamok .dr-uzel-znak, .dr-vetv--zamok .dr-uzel-znak { border-color: var(--outline-variant); background: transparent; }.ya-tema--zamok .dr-uzel-znak--galka, .dr-vetv--zamok .dr-uzel-znak--galka { border: 0; }.ya-tema--zamok .ya-urok--net .dr-uzel-znak, .dr-vetv--zamok .dr-uzel--net .dr-uzel-znak { border: 0; }
/* Дорога оплатить — внутри раскрытой темы, рядом с «Ввести ключ». Раньше
   пилюля цены стояла ВНУТРИ строки-темы и перехватывала нажатие: её
   невидимая зона занимала 81 % высоты строки, и рука, тянувшаяся к шеврону,
   открывала лист оплаты вместо темы. */
.dr-tema-kupit { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 0 0 8px; font: var(--type-body-s, 400 13px/18px inherit); color: var(--on-surface-variant); }.dr-uzel-gotovitsya { margin-left: 8px; padding: 2px 8px; border-radius: var(--shape-full, 999px);
  font: var(--type-label-s, 500 12px/16px inherit); vertical-align: middle;
  background: var(--surface-container-high); color: var(--on-surface-variant); }
/* Часть внутри темы (если осталась) — тихая капитель. */
/* Подпись темы: одна тихая строка над занятиями. */
.dr-vetv-o { margin: 0; padding: 2px 8px 8px 0; font: var(--type-body-s, 400 13px/18px inherit); color: var(--on-surface-variant); }.dr-chast { font: var(--type-label-m, 600 12px/16px inherit); letter-spacing: var(--track-label, .08em);
  text-transform: uppercase; color: var(--on-surface-variant); padding: 12px 0 4px; }

/* ── «МОЁ ОБУЧЕНИЕ» — единственная тональная карточка ───────────────────
   Белый сосуд принадлежит только курсу. Стили блока — выше, в «МОЁ ОБУЧЕНИЕ». */

/* ── «ЕЩЁ N ТЕМ» ──────────────────────────────────────────────────────── */
.dr-esche-knop { display: flex; align-items: center; gap: 4px; min-height: 48px; padding: 0 8px; margin: 0 -8px;
  cursor: pointer; list-style: none; font: var(--type-label-l, 600 14px/20px inherit); color: var(--primary);
  border-radius: var(--shape-s, 8px); }.dr-esche-knop::-webkit-details-marker { display: none; }.dr-esche-knop:hover { background: color-mix(in srgb, var(--on-surface) 6%, transparent); }.dr-esche > .dr-stvol { margin-top: 0; }
/* Подпись хвоста меняется по состоянию: свёрнут — «Ещё 10 тем», раскрыт —
   «Свернуть». Дверь одна — вот эта: правил второй кнопки «Свернуть» под
   хвостом здесь больше нет (решение владельца 18.09.2026). */
.dr-esche[open] .dr-esche-eshe, .dr-esche:not([open]) .dr-esche-svern { display: none; }
/* И СТОИТ ОНА ВСЕГДА ВНИЗУ СПИСКА (19.09.2026). Одна дверь — ещё не вся
   правка: в раскрытом виде «Свернуть» оставалась на своём месте, между
   четвёртой и пятой темой, и список из четырнадцати читался разорванным на
   4 + 10, а свернуть его можно было только прокрутив десять тем обратно
   вверх. Сама дверь (summary) уходит за содержимое порядком флексов: в
   свёрнутом виде она по-прежнему единственная строка, в раскрытом — последняя.
   Порядок в разметке не трогаем: summary обязан быть первым ребёнком details. */
.dr-esche { display: flex; flex-direction: column; }.dr-esche > .dr-esche-knop { order: 2; }
/* Шов между четырьмя видимыми темами и десятью из хвоста: правило
   «.dr-vetv + .dr-vetv» через границу двух стволов не работает, и на месте
   склейки не было черты — ровно там, где список и читался разорванным. */
.dr-esche > .dr-stvol > .ya-tema:first-child, .dr-esche > .dr-stvol > .dr-vetv:first-child { border-top: 1px solid var(--outline-variant); }

/* ── Модификатор: список (Библиотека · справочники) ─────────────────────
   Строка-дверь с иконкой слева: не hub-сцена и не панель, а list-row.
   Разметка:
     <a class="ya-dver ya-dver--spisok" href="…">
       <span class="ya-dver__ikona" aria-hidden="true">…svg…</span>
       <span class="ya-dver__imya">…</span>
       <span class="ya-dver__o">…</span>
       <span class="ya-dver__sled">…</span>
     </a>
   Алиасы .bk-dver / .bk-znak / .bk-imya / .bk-o / .bk-schet — та же разметка.
   ════════════════════════════════════════════════════════════════════ */
.ya-dver--spisok,
.bk-dver{
  display:grid;
  grid-template-columns:34px 1fr;
  gap:2px 14px;
  align-items:start;
  min-height:72px;
  padding:14px 16px;
  border-radius:var(--shape-l);
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  color:inherit;
  text-decoration:none;
  height:auto;
  overflow:visible;
  box-shadow:none;
}
.ya-dver--spisok:active,
.bk-dver:active{ background:var(--surface-container-high); transform:none; }
@media (hover:hover){
  .ya-dver--spisok:hover,
  .bk-dver:hover{ background:var(--surface-container); }
}
.ya-dver--spisok .ya-dver__ikona,
.ya-dver--spisok .bk-znak,
.bk-znak{
  grid-row:1 / span 3;
  width:34px; height:34px;
  border-radius:var(--shape-s);
  margin-top:2px;
  display:flex; align-items:center; justify-content:center;
  background:var(--surface-container); color:var(--primary);
}
.ya-dver--spisok .ya-dver__ikona svg,
.ya-dver--spisok .bk-znak svg,
.bk-znak svg{
  width:19px; height:19px;
  stroke:currentColor; fill:none;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round;
}
.ya-dver--spisok .ya-dver__imya,
.ya-dver--spisok .bk-imya,
.bk-imya{
  display:block; grid-column:2;
  font:var(--type-title-l); color:var(--on-surface);
  letter-spacing:normal; text-wrap:unset;
}
.ya-dver--spisok .ya-dver__o,
.ya-dver--spisok .bk-o,
.bk-o{
  display:block; grid-column:2; margin-top:4px;
  font:var(--type-body-s); color:var(--on-surface-variant);
}
.ya-dver--spisok .ya-dver__sled,
.ya-dver--spisok .bk-schet,
.bk-schet{
  display:block; grid-column:2; margin-top:6px; padding-top:0;
  font:var(--type-label-m); color:var(--on-surface-variant);
  font-variant-numeric:tabular-nums;
}

/* ═══ КАРТОЧКА УПРАВЛЕНИЯ · .ya-kartochka ═════════════════════════════════
   Закрытая карточка школы в сетке. Один шаблон на все двенадцать:
   диск, имя, счётчик «N из M», чипы тем, стрелка. На столе высота
   фиксирована (--ya-kartochka-h): имя сверху, чипы прижаты к низу.
   Длина названия и число чипов карточку не растягивают и не ужимают.
   На узком экране высота по содержимому, список остаётся столбцом.

   Раскрытая карточка — это details. Шапка тогда снова по содержимому
   (герой не держит пустой шаблон), стрелка поворачивается, тело
   рисует экран своими классами.

     <details class="ya-kartochka">
       <summary>
         <span class="ya-kartochka__disk">…эмблема…</span>
         <span class="ya-kartochka__imya">Имя</span>
         <span class="ya-kartochka__nom">1 из 12</span>
         <span class="ya-kartochka__temy">
           <span class="ya-kartochka__tema">тема</span>
         </span>
         <span class="ya-kartochka__strelka" aria-hidden="true">›</span>
       </summary>
     </details>

   Диск белый в обеих темах: --ya-cta-on не переключается в тёмной,
   в отличие от поверхностей. Своего hex у диска нет. */
.ya-kartochka{
  --ya-kartochka-h:152px;
  --ya-kartochka-disk:58px;
  box-sizing:border-box;
  border-radius:var(--shape-l);
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  color:inherit;
  overflow:hidden;
}
.ya-kartochka > summary{
  box-sizing:border-box;
  display:grid;
  grid-template-columns:var(--ya-kartochka-disk) minmax(0,1fr) auto;
  grid-template-rows:auto auto;
  gap:var(--sp-1) var(--sp-3);
  align-items:center;
  align-content:start;
  min-height:80px;
  padding:var(--sp-3);
  cursor:pointer;
  list-style:none;
  color:inherit;
}
.ya-kartochka > summary::-webkit-details-marker{ display:none; }
.ya-kartochka > summary:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:-2px;
}
.ya-kartochka:not([open]) > summary:active{
  background:var(--surface-container-high);
}
.ya-kartochka__disk{
  grid-column:1;
  grid-row:1 / span 2;
  width:var(--ya-kartochka-disk);
  height:var(--ya-kartochka-disk);
  border-radius:var(--shape-full);
  background:var(--ya-cta-on);
  border:1px solid var(--outline-variant);
  overflow:hidden;
  display:flex;
  align-items:center;
  justify-content:center;
  box-shadow:var(--ya-card-elev);
}
.ya-kartochka__imya{
  grid-column:2;
  grid-row:1;
  align-self:start;
  min-width:0;
  font:var(--type-title-m);
  color:var(--on-surface);
  display:-webkit-box;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:3;
  line-clamp:3;
  overflow:hidden;
}
.ya-kartochka__nom{
  grid-column:3;
  grid-row:1;
  align-self:start;
  font:var(--type-label-m);
  color:var(--on-surface-variant);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
  padding-top:2px;
}
.ya-kartochka__temy{
  grid-column:2 / span 2;
  grid-row:2;
  min-width:0;
  display:flex;
  flex-wrap:wrap;
  align-content:flex-start;
  gap:var(--sp-1);
  padding-right:22px;
}
.ya-kartochka__tema{
  max-width:100%;
  font:var(--type-label-s);
  padding:var(--sp-1) var(--sp-2);
  border-radius:var(--shape-full);
  background:var(--surface-container);
  color:var(--on-surface-variant);
  overflow-wrap:anywhere;
}
.ya-kartochka__strelka{
  grid-column:3;
  grid-row:2;
  justify-self:end;
  align-self:center;
  color:var(--on-surface-variant);
  font-size:1.2rem;
  line-height:1;
  transition:transform var(--dur-short) var(--ease-standard);
}
.ya-kartochka[open]{
  background:var(--surface-container-lowest);
  box-shadow:var(--ya-card-elev);
}
.ya-kartochka[open] .ya-kartochka__tema{ background:var(--surface-container-high); }
.ya-kartochka[open] .ya-kartochka__strelka{ transform:rotate(90deg); }

/* Стол: закрытые карточки одного роста. Три ряда шапки — имя, пружина,
   чипы. Пружина забирает остаток, чипы стоят на нижнем краю у всех,
   короткие имена карточку не ужимают. Высоты хватает на две строки
   имени и две строки чипов — дольше на этой ширине колонки не бывает. */
@media (min-width:900px){
  .ya-kartochka:not([open]){
    height:var(--ya-kartochka-h);
  }
  .ya-kartochka:not([open]) > summary{
    height:100%;
    grid-template-rows:auto minmax(0,1fr) auto;
    align-content:stretch;
  }
  .ya-kartochka:not([open]) .ya-kartochka__disk{
    grid-row:1 / span 3;
    align-self:center;
  }
  .ya-kartochka:not([open]) .ya-kartochka__temy{
    grid-row:3;
    align-self:end;
  }
  .ya-kartochka:not([open]) .ya-kartochka__strelka{
    grid-row:3;
    align-self:end;
  }
}

/* ─── Отзыв в конце урока ────────────────────────────────────────────
   Карточка: нижняя поверхность, обводка, радиус 14. Звезда — кнопка 48×48.
   Звёзды обязательны, чтобы закрыть урок кнопкой. Комментарий по желанию.
   Крестик оценку не ждёт. */
.ya-otzyv{
  padding:8px 24px 16px;
  max-width:var(--ur-kol,680px);
  margin:0 auto;
}
.ya-otzyv__kart{
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:14px;
  padding:18px 20px;
  box-shadow:var(--ya-card-elev);
}
.ya-otzyv__zag{
  margin:0 0 4px;
  font:var(--type-title-m);
  line-height:1.4;
  color:var(--on-surface);
}
.ya-otzyv__pod{
  margin:0 0 14px;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--on-surface-variant);
}
.ya-zvezdy{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
}
.ya-zvezdy__kn{
  box-sizing:border-box;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:48px;
  height:48px;
  padding:0;
  border-radius:12px;
  border:1.5px solid var(--outline);
  background:transparent;
  color:var(--outline);
  font:var(--type-title-l);
  line-height:1;
  cursor:pointer;
  /* Глобальное button{transition:all} иначе доливает заливку через прозрачность. */
  transition:none;
}
.ya-zvezdy__kn.is-on{
  border-color:var(--primary);
  background:var(--primary);
  color:var(--on-primary);
}
.ya-zvezdy__kn:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}
.ya-otzyv .ya-pole{ margin-top:14px; }
.ya-otzyv__ryad{
  display:flex;
  flex-direction:column;
  align-items:stretch;
  gap:8px;
  margin-top:14px;
}
.ya-otzyv__ryad .ya-btn{ width:100%; }
.ya-otzyv__beda{
  margin:0;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--error);
}
.ya-otzyv__spasibo{
  margin:0;
  font:var(--type-body-m);
  line-height:1.5;
  color:var(--on-surface);
}


/* ═══ Урок 5. Шестиугольник, карточки имён, семья «грани» ══════════════
   Раскладка та же, что у чертежей ys4: роли цвета, не свои краски.
   Долгое время — сплошная черта, не пунктир. Текст на заливке — on-surface. */
.ya-hex-lay{
  display:grid;
  grid-template-columns:minmax(0,1.15fr) minmax(220px,.9fr);
  gap:16px;
  align-items:stretch;
}
@media (max-width:760px){
  .ya-hex-lay{ grid-template-columns:1fr; }
  /* На узком экране чертёж раньше таблицы: не листать вверх к рисунку. */
  .ya-hex-pravo{ order:-1; }
}
.ya-hex-levo,.ya-hex-pravo{ min-width:0; }
.ya-hex-pravo{ display:flex; flex-direction:column; }
.ya-hex-ris{ flex:1 1 auto; }
.ya-hex-niz{
  margin-top:auto;
  display:flex;
  flex-direction:column;
  gap:10px;
  padding-top:8px;
}
.ya-hex-polzunok{
  display:flex;
  flex-direction:column;
  gap:6px;
  font:var(--type-body-s);
  color:var(--on-surface);
}
.ya-polzunok{
  width:100%;
  accent-color:var(--primary);
  height:28px;
}
.ya-hex-gloss{
  margin-top:8px;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--on-surface);
}
.ya-filtry{ display:flex; flex-wrap:wrap; gap:8px; margin:0 0 12px; }
.ya-tablica-obertka{ overflow-x:auto; }
.ya-tablica{
  width:100%;
  border-collapse:collapse;
  font:var(--type-body-s);
  color:var(--on-surface);
}
.ya-tablica th{
  text-align:left;
  font:var(--type-label-s, var(--type-body-s));
  color:var(--on-surface-variant);
  padding:6px 8px;
  border-bottom:1px solid var(--outline-variant);
}
.ya-tablica__ryad{
  display:grid;
  grid-template-columns:2.2rem minmax(0,1fr) auto;
  gap:8px;
  align-items:center;
  width:100%;
  text-align:left;
  padding:10px 8px;
  border:0;
  border-bottom:1px solid var(--outline-variant);
  background:transparent;
  color:inherit;
  font:inherit;
  cursor:pointer;
}
.ya-tablica__ryad:hover{ background:var(--surface-container); }
.ya-tablica__ryad--den{ background:var(--tertiary-container); color:var(--on-tertiary-container); }
.ya-tablica__ryad--noch{ background:var(--primary-container); color:var(--on-primary-container); }
.ya-tablica__ryad--ugol{
  background:var(--surface-container-lowest);
  box-shadow:inset 3px 0 0 var(--book-sutki);
}
.ya-tablica__ryad--ugol .ya-tablica__rol{ color:var(--book-sutki); }
.ya-tablica__ryad--den:hover{ background:var(--tertiary-container); }
.ya-tablica__ryad--noch:hover{ background:var(--primary-container); }
.ya-tablica__ryad--ugol:hover{ background:var(--surface-container-lowest); }
.ya-tablica__kartochka{ min-width:0; }
.ya-tablica__vybran > td{
  padding:8px 0 !important;
  border:0 !important;
}
.ya-tablica__kartochka--open{
  border:1.5px solid var(--primary);
  border-radius:var(--shape-l, 16px);
  overflow:hidden;
  background:var(--surface-container-lowest);
}
.ya-tablica__vybran .ya-tablica__ryad{
  box-shadow:none;
  border-bottom:1px solid var(--outline-variant);
}
.ya-tablica__vybran .ya-tablica__ryad--den{ background:var(--tertiary-container); }
.ya-tablica__vybran .ya-tablica__ryad--noch{ background:var(--primary-container); }
.ya-tablica__vybran .ya-tablica__ryad--ugol{
  background:var(--surface-container-lowest);
  box-shadow:inset 3px 0 0 var(--book-sutki);
}
.ya-tablica__kartochka--open .ya-tablica__ryad{ border-bottom-color:var(--outline-variant); }
.ya-tablica__n{ font-weight:700; }
.ya-tablica__rol{ color:var(--on-surface-variant); white-space:nowrap; }
.ya-tablica__gloss{
  padding:10px 12px 12px 2.6rem;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--on-surface);
  background:var(--surface-container-lowest);
}
.ya-vybor-chertezha{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  align-items:stretch;
  gap:8px;
}
.ya-vybor-chertezha__knop{
  display:flex;
  flex-direction:column;
  gap:6px;
  align-items:center;
  text-align:center;
  padding:8px 6px;
  border-radius:14px;
  border:1px solid var(--outline-variant);
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  font:inherit;
  cursor:pointer;
  min-width:0;
  height:100%;
  box-sizing:border-box;
}
.ya-vybor-chertezha__ris{
  display:flex;
  align-items:center;
  justify-content:center;
  width:100%;
  aspect-ratio:120 / 104;
  height:auto;
  min-height:0;
}
.ya-vybor-chertezha__ris svg{
  width:100%;
  height:100%;
  max-width:100%;
  flex:0 0 auto;
  display:block;
}
.ya-vybor-chertezha__knop--verno{ border-color:var(--ok); }
.ya-vybor-chertezha__knop--mimo{ border-color:var(--error); }
.ya-vybor-chertezha__imya{ font-weight:700; }
.ya-vybor-chertezha__txt{ font:var(--type-body-s); line-height:1.45; }
/* ═══ ПЕРЕВОРОТ КАРТОЧКИ · .ya-flip (19.10.2026) ═════════════════════════
   Общий 3D-переворот (React: ПереворотКарты в lessons/engine.js).
     <div class="ya-flip [ya-flip--oborot]">
       <div class="ya-flip__scena">
         <div class="ya-flip__storona ya-flip__lico">…</div>
         <div class="ya-flip__storona ya-flip__oborot">…</div>
     Обе стороны в ОДНОЙ ячейке сетки: высота карточки — большая из двух,
     переворот ничего ниже не сдвигает. Переключает класс --oborot, он меняет
     только transform. Тихий режим — мягкая смена прозрачности. */
.ya-flip{ -webkit-perspective:1100px; perspective:1100px; min-width:0; }
.ya-flip__scena{
  display:grid; height:100%;
  -webkit-transform-style:preserve-3d; transform-style:preserve-3d;
  -webkit-transform:rotateY(0deg); transform:rotateY(0deg);
  transition:transform var(--flip-dur,.55s) cubic-bezier(.4,0,.2,1);
}
.ya-flip--oborot > .ya-flip__scena{ -webkit-transform:rotateY(180deg); transform:rotateY(180deg); }
.ya-flip__storona{
  grid-area:1 / 1; min-width:0; box-sizing:border-box;
  -webkit-backface-visibility:hidden; backface-visibility:hidden;
  -webkit-transform:rotateY(0deg) translateZ(1px); transform:rotateY(0deg) translateZ(1px);
  /* Где WebKit не прячет обратную грань — прячем явно ровно на середине. */
  visibility:visible; transition:visibility 0s linear calc(var(--flip-dur,.55s) / 2);
}
.ya-flip__oborot{ -webkit-transform:rotateY(180deg) translateZ(1px); transform:rotateY(180deg) translateZ(1px); visibility:hidden; }
.ya-flip--oborot .ya-flip__lico{ visibility:hidden; }
.ya-flip--oborot .ya-flip__oborot{ visibility:visible; }
@media (prefers-reduced-motion:reduce){
  .ya-flip__scena, .ya-flip--oborot > .ya-flip__scena{ -webkit-transform:none; transform:none; transition:none; }
  .ya-flip__storona, .ya-flip__oborot{ -webkit-transform:none; transform:none; transition:opacity .25s ease, visibility 0s linear .25s; }
  .ya-flip__oborot{ opacity:0; }
  .ya-flip--oborot .ya-flip__lico{ opacity:0; }
  .ya-flip--oborot .ya-flip__oborot{ opacity:1; transition:opacity .25s ease, visibility 0s; }
}
html[data-dvizhenie="off"] .ya-flip__scena, html[data-dvizhenie="off"] .ya-flip--oborot > .ya-flip__scena{ -webkit-transform:none; transform:none; }
html[data-dvizhenie="off"] .ya-flip__storona, html[data-dvizhenie="off"] .ya-flip__oborot{ -webkit-transform:none; transform:none; }
html[data-dvizhenie="off"] .ya-flip__oborot{ opacity:0; }
html[data-dvizhenie="off"] .ya-flip--oborot .ya-flip__lico{ opacity:0; }
html[data-dvizhenie="off"] .ya-flip--oborot .ya-flip__oborot{ opacity:1; }
.ya-karty{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
/* Нечётное число карточек — столбиком: сирота во второй колонке рвала сетку. */
.ya-karty--nechet{ grid-template-columns:1fr; }
.ya-karty__polozheniya{ margin:var(--sp-3) 0 0; font:var(--type-body-m); line-height:1.7; color:var(--on-surface-variant); }
.ya-karty__polozheniya-zag{ font-weight:600; }
@media (max-width:640px){ .ya-karty{ grid-template-columns:1fr; } }
.ya-karta{
  display:block;
  width:100%;
  min-height:220px;
  padding:0;
  border:none;
  border-radius:16px;
  background:transparent;
  color:var(--on-surface);
  text-align:left;
  font:inherit;
  cursor:pointer;
  /* iOS Safari схлопывает поворот в подмену сторон, если у сцены нет
     webkit-preserve-3d, а у граней нет своего translateZ. */
  -webkit-perspective:900px;
  perspective:900px;
  overflow:visible;
}
.ya-karta__scena{
  position:relative;
  display:block;
  min-height:248px;
  -webkit-transform-style:preserve-3d;
  transform-style:preserve-3d;
  -webkit-transform:rotateY(0deg);
  transform:rotateY(0deg);
  -webkit-transition:-webkit-transform .5s ease;
  transition:transform .5s ease;
}
.ya-karta--oborot .ya-karta__scena{
  -webkit-transform:rotateY(180deg);
  transform:rotateY(180deg);
}
.ya-karta__lico,.ya-karta__oborot{
  position:absolute;
  inset:0;
  display:flex;
  flex-direction:column;
  gap:6px;
  padding:14px;
  border-radius:16px;
  border:1px solid var(--outline-variant);
  background:var(--ya-karta-lico,var(--surface-container-lowest));
  color:var(--on-surface);
  -webkit-backface-visibility:hidden;
  backface-visibility:hidden;
  /* Прокрутка на самой грани ломает 3D в Safari: оборот вспыхивает сразу.
     Листать можно внутренний список, грань остаётся плоскостью поворота. */
  overflow:visible;
  -webkit-transform:rotateY(0deg) translateZ(1px);
  transform:rotateY(0deg) translateZ(1px);
}
.ya-karta__lico,
.ya-karta__oborot{
  align-items:center;
  justify-content:center;
  text-align:center;
}
.ya-karta__oborot{
  -webkit-transform:rotateY(180deg) translateZ(1px);
  transform:rotateY(180deg) translateZ(1px);
  background:var(--ya-karta-ten,var(--secondary-container));
  border-color:var(--ya-karta-ten-rule,var(--outline-variant));
  color:var(--on-secondary-container);
}
/* Где движок не прячет обратную грань (WebKit без 3D-слоя: оборот лежал
   поверх лица зеркальным), невидимую грань прячем явно. Смена видимости —
   ровно на середине поворота (.25s из .5s), так что сам переворот виден. */
.ya-karta__lico{ visibility:visible; -webkit-transition:visibility 0s linear .25s; transition:visibility 0s linear .25s; }
.ya-karta__oborot{ visibility:hidden; -webkit-transition:visibility 0s linear .25s; transition:visibility 0s linear .25s; }
.ya-karta--oborot .ya-karta__lico{ visibility:hidden; }
.ya-karta--oborot .ya-karta__oborot{ visibility:visible; }
@media (prefers-reduced-motion:reduce){
  .ya-karta__lico,.ya-karta__oborot{ -webkit-transition:none; transition:none; }
}
html[data-dvizhenie="off"] .ya-karta__lico,
html[data-dvizhenie="off"] .ya-karta__oborot{ -webkit-transition:none; transition:none; }
.ya-karta__list{
  display:flex;
  flex-direction:column;
  gap:6px;
  min-height:0;
  max-height:100%;
  overflow:auto;
  -webkit-overflow-scrolling:touch;
  /* Короткая грань (демо-переворот) иначе висит у верха с пустотой снизу. */
  flex:1 1 auto;
  width:100%;
  align-items:center;
  justify-content:center;
  text-align:center;
  box-sizing:border-box;
}
.ya-karta__lico .ya-karta__list,
.ya-karta__oborot .ya-karta__list{
  align-items:center;
  justify-content:center;
  text-align:center;
}
.ya-karta__znak{ width:128px; height:128px; display:block; flex-shrink:0; margin:0 auto 4px; }
/* Компактные карточки-выражения (ys6, «пролить свет на…»): без знака, только
   текст — лицо в одну строку, оборот вмещает пару фраз. */
.ya-karty--kompakt{ grid-template-columns:1fr; gap:var(--sp-2,8px); }
.ya-karty--kompakt .ya-karta{ min-height:0; }
.ya-karty--kompakt .ya-karta__scena{ min-height:128px; }
.ya-karty--kompakt .ya-karta__imya{ font:var(--type-title-m,inherit); font-weight:700; }
.ya-karty--kompakt .ya-karta__tekst{ font:var(--type-body-s); line-height:1.45; }
@media (max-width:640px){ .ya-karty--kompakt .ya-karta__scena{ min-height:188px; } }
.ya-karta__imya{ font-weight:700; }
.ya-karta__tekst{ font:var(--type-body-m); line-height:1.5; }
@media (prefers-reduced-motion:reduce){
  .ya-karta__scena{
    -webkit-transition:none;
    transition:none;
  }
}
html[data-dvizhenie="off"] .ya-karta__scena{
  -webkit-transition:none;
  transition:none;
}
.ya-rod{ display:flex; flex-direction:column; align-items:center; gap:12px; }
.ya-rod__centr{
  width:96px; height:96px; border-radius:999px;
  display:flex; align-items:center; justify-content:center;
  background:var(--primary); color:var(--on-primary);
  font-weight:700; letter-spacing:.04em;
}
.ya-rod__kolco{ display:flex; flex-wrap:wrap; gap:8px; justify-content:center; }
.ya-rod__tolk{
  margin-top:12px;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--on-surface);
}
.ya-vecher p{ margin:0 0 8px; font:var(--type-body-m, var(--type-body-s)); line-height:1.5; color:var(--on-surface); }
.ya-vecher__vremya{ font-weight:400; }
.ya-vesh-imya,.ya-vesh-mesto{ display:flex; flex-direction:column; gap:4px; margin-bottom:8px; font:var(--type-body-s); color:var(--on-surface); }
.ya-vesh-imya input,.ya-vesh-mesto input{
  min-height:44px;
  padding:8px 12px;
  border-radius:12px;
  border:1px solid var(--outline);
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  font:inherit;
}
.ya-vesh-mesto--aktiv input{ border-color:var(--primary); }
.ya-vesh-mesto__n{ font-weight:700; }
.ya-vesh-knopki{ display:flex; flex-wrap:wrap; gap:8px; margin-top:12px; }
.ya-vesh-primer,.ya-vesh-gotovo{
  margin-top:12px;
  font:var(--type-body-s);
  line-height:1.5;
  color:var(--on-surface);
}
/* «Своя вещь»: имя сверху на всю ширину; двенадцать мест — подпись
   слева от ввода в одной строке; на столе два столбца (1–6 | 7–12);
   шестиугольник под сеткой по центру. Без двухколоночной каши поле|чертёж. */
.ya-vesh{
  display:flex;
  flex-direction:column;
  gap:var(--sp-4);
  min-width:0;
}
.ya-vesh .ya-vesh-imya,
.ya-vesh .ya-vesh-mesto,
.ya-vesh .ya-vesh-knopki,
.ya-vesh .ya-vesh-primer,
.ya-vesh .ya-vesh-gotovo,
.ya-vesh .ya-hex-schet{ margin:0; }
.ya-vesh .ya-vesh-imya{ width:100%; max-width:none; }
.ya-vesh__polya{
  display:grid;
  grid-template-columns:minmax(0,1fr);
  gap:var(--sp-2);
  min-width:0;
}
.ya-vesh .ya-vesh-mesto{
  display:grid;
  /* Фиксированная колонка подписи под «12 короткое» — все вводы одной
     ширины; на столе 54rem хватает примерам без обрезки. */
  grid-template-columns:4.75rem minmax(0,1fr);
  align-items:center;
  column-gap:var(--sp-1, 4px);
  min-width:0;
}
.ya-vesh .ya-vesh-mesto__n{
  font:var(--type-label-l);
  font-weight:700;
  color:var(--on-surface);
  white-space:nowrap;
  line-height:1.2;
  letter-spacing:0;
}
.ya-vesh .ya-vesh-mesto input{
  box-sizing:border-box;
  width:100%;
  min-width:0;
  height:var(--h-btn-compact);
  min-height:var(--h-btn-compact);
  max-height:var(--h-btn-compact);
  padding:0 var(--sp-2);
  /* Тело текста (Inter), не display-метка: у Manrope в плейсхолдере
     пробелы слипались в «Чтоздесьувашейвещи?». */
  font:var(--type-body-s);
  letter-spacing:normal;
  word-spacing:normal;
  line-height:1.3;
  overflow:hidden;
  text-overflow:clip;
}
.ya-vesh .ya-vesh-mesto input::placeholder{
  color:var(--on-surface-variant);
  opacity:1;
  white-space:nowrap;
  font:var(--type-body-s);
  letter-spacing:normal;
  word-spacing:normal;
}
.ya-vesh__shema{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:var(--sp-2);
  width:100%;
  min-width:0;
}
.ya-vesh__shema-ris{
  width:min(100%, 240px);
  max-width:240px;
}
.ya-vesh__shema-ris svg{
  display:block;
  width:100%;
  max-width:100%;
  height:auto;
}
.ya-vesh__shema .ya-hex-gloss{
  text-align:center;
  margin:0;
  max-width:100%;
  /* Подпись шире чертежа — не режем обёрткой 240px. */
  font:var(--type-body-s);
  letter-spacing:normal;
  word-spacing:normal;
  color:var(--on-surface);
}
.ya-vesh .ya-vesh-knopki{ gap:var(--sp-2); }
.ya-vesh .ya-vesh-knopki .ya-btn{
  flex:1 1 calc(50% - var(--sp-2));
  margin:0;
}
.ya-vesh .ya-vesh-primer,
.ya-vesh .ya-vesh-gotovo ul{
  margin:0;
  padding:0 0 0 var(--sp-4);
}
.ya-vesh .ya-vesh-primer li + li,
.ya-vesh .ya-vesh-gotovo li + li{ margin-top:var(--sp-2); }
@media (min-width:768px){
  /* Сначала вниз по левому столбцу (1–6), потом правый (7–12). */
  .ya-vesh__polya{
    grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    grid-template-rows:repeat(6, auto);
    grid-auto-flow:column;
    column-gap:var(--sp-4);
    row-gap:var(--sp-2);
  }
  .ya-vesh .ya-vesh-mesto{
    grid-template-columns:4.75rem minmax(0,1fr);
  }
  .ya-vesh .ya-vesh-mesto input{
    padding:0 var(--sp-1, 4px);
  }
  /* На столе ввод чуть шире: короче боковой паддинг. */
  .ya-vesh .ya-vesh-mesto input{
    padding-inline:2px;
  }
}

/* Словарь урока. Запись — две строки на любой ширине: термин и ссылки на
   положения в одной строке, краткое — под ними. Один кегль у термина,
   одна черта между записями. Не влезли термин и ссылки в узкую строку —
   ссылки переносятся под термин целиком, диапазон («21–24») не рвётся. */
.ya-slovar{ min-width:0; }
.ya-slovar__spisok{ margin:0; padding:0; }
.ya-slovar__zapis{ padding:var(--sp-3) 0; }
.ya-slovar__zapis:first-child{ padding-top:0; }
.ya-slovar__zapis:last-child{ padding-bottom:0; }
.ya-slovar__zapis + .ya-slovar__zapis{ border-top:1px solid var(--outline-variant); }
.ya-slovar__stroka{
  display:flex;
  flex-wrap:wrap;
  align-items:baseline;
  column-gap:var(--sp-3);
  row-gap:var(--sp-1);
  margin:0;
}
.ya-slovar__termin{
  font:var(--type-body-m);
  font-weight:700;
  color:var(--on-surface);
  min-width:0;
  overflow-wrap:break-word;
}
.ya-slovar__pol{
  font:var(--type-body-m);
  color:var(--on-surface-variant);
  min-width:0;
}
.ya-slovar__pol a,
.ya-slovar__pol span{ white-space:nowrap; }
.ya-slovar__kratko{
  margin:var(--sp-1) 0 0;
  font:var(--type-body-m);
  font-size:16px;
  line-height:1.5;
  color:var(--on-surface);
}

.ya-put{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px; }
.ya-put__punkt{ display:flex; gap:8px; align-items:flex-start; color:var(--on-surface); }
.ya-put__punkt--gotov{ color:var(--ok); }
.ya-put__znak{
  width:28px; height:28px; border-radius:999px; flex:none;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--surface-container-highest); color:var(--on-surface);
  font-weight:700;
}
.ya-put__punkt--gotov .ya-put__znak{ background:var(--ok); color:var(--on-ok, var(--surface)); }

.ya-hex-zadacha{
  margin:0 0 10px;
  font:var(--type-title-m, var(--type-body-m));
  color:var(--on-surface);
}
.ya-hex-schet,.ya-hex-gotovo{
  margin:0;
  font:var(--type-body-s);
  color:var(--on-surface-variant);
}
.ya-hex-gotovo{ color:var(--ok); font-weight:700; }
.ya-filtry--melko{ gap:6px; }
.ya-filtry--melko .ya-btn{
  min-height:var(--h-btn-compact);
  padding:0 var(--sp-3);
  width:auto;
}
.ya-tablica--plotno .ya-tablica__ryad{ padding:8px; }
.ya-tablica__ryad--zhdet{
  box-shadow:inset 0 0 0 1.5px var(--outline);
}
.ya-zov-mesto{ position:relative; }
.ya-karty > .ya-zov-mesto,
.ya-vybor-chertezha > .ya-zov-mesto{ min-width:0; }
.ya-vybor-chertezha > .ya-zov-mesto{ display:flex; }
.ya-karty > .ya-zov-mesto > .ya-karta,
.ya-vybor-chertezha > .ya-zov-mesto > .ya-vybor-chertezha__knop{ width:100%; }
.ya-vybor-chertezha > .ya-zov-mesto > .ya-vybor-chertezha__knop{ flex:1 1 auto; }
.ya-rod__kolco > .ya-zov-mesto,
.ya-filtry > .ya-zov-mesto{ display:inline-flex; }

/* Палец «нажми» — то же движение, что .ur-tap-coach у проверок первого урока. */
.ya-nazhim{
  position:absolute; z-index:3; pointer-events:none;
  left:var(--tap-x); top:var(--tap-y);
  width:40px; height:40px; padding:0;
  display:flex; align-items:center; justify-content:center;
  border-radius:999px;
  background:var(--primary-container); color:var(--on-primary-container);
  border:2px solid var(--primary);
  box-shadow:0 0 0 4px color-mix(in srgb, var(--primary) 22%, transparent);
  transform:translate(-50%, calc(-50% - 4px));
  animation:ya-nazhim 1.7s ease-in-out infinite;
}
.ya-nazhim__palec{ display:block; line-height:0; color:var(--primary); }
.ya-nazhim__palec .ya-palec, .ur-tap-coach__finger .ya-palec{ transform:rotate(180deg); }
/* Над целью, снаружи рамки: низ чипа на 6px выше верхнего края цели. */
.ya-nazhim--nad{ top:0 !important; margin-top:-26px; }
@keyframes ya-nazhim{
  0%,100%{ opacity:.92; transform:translate(-50%, calc(-50% - 4px)); }
  50%{ opacity:1; transform:translate(-50%, calc(-50% - 9px)); }
}
@keyframes ya-polzunok-tolchok{
  0%,100%{ transform:translateX(0); }
  50%{ transform:translateX(10px); }
}
.ya-polzunok--zov{ animation:ya-polzunok-tolchok 1.7s ease-in-out infinite; }
@keyframes ya-hex-puls{
  0%,100%{ opacity:.35; }
  50%{ opacity:1; }
}
.ya-hex-puls{ animation:ya-hex-puls 1.7s ease-in-out infinite; }
@media (prefers-reduced-motion:reduce){
  .ya-nazhim,.ya-polzunok--zov,.ya-hex-puls{ animation:none; }
  .ya-nazhim{ opacity:1; }
  .ya-hex-puls{ opacity:.85; }
}
html[data-dvizhenie="off"] .ya-nazhim,
html[data-dvizhenie="off"] .ya-polzunok--zov,
html[data-dvizhenie="off"] .ya-hex-puls{ animation:none; }
html[data-dvizhenie="off"] .ya-nazhim{ opacity:1; }
html[data-dvizhenie="off"] .ya-hex-puls{ opacity:.85; }

.ya-dalshe{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:center;
  gap:8px 12px;
  padding:4px 24px 28px;
  max-width:var(--ur-kol, 680px);
  margin:0 auto;
}
.ya-dalshe__pochemu{
  margin:0;
  font:var(--type-body-s);
  color:var(--on-surface-variant);
  text-align:center;
}

.ya-rod--pautina{
  position:relative;
  width:min(100%, 420px);
  aspect-ratio:1;
  margin:0 auto;
  overflow:hidden;
}
.ya-rod--pautina .ya-rod__centr{
  position:absolute; left:50%; top:50%;
  transform:translate(-50%,-50%);
  width:72px; height:72px;
  z-index:1;
}
.ya-rod__niti{
  position:absolute; inset:0;
  width:100%; height:100%;
  z-index:0; pointer-events:none;
}
.ya-rod__nit{ stroke:var(--outline); stroke-width:.4; }
.ya-rod__nit--otkryta{
  stroke:var(--primary); stroke-width:.9;
  stroke-dasharray:1; stroke-dashoffset:0;
  animation:ya-rod-nit .45s ease-out;
}
@keyframes ya-rod-nit{ from{ stroke-dashoffset:1 } to{ stroke-dashoffset:0 } }
.ya-rod__uzel{
  position:absolute; z-index:1;
  transform:translate(-50%,-50%);
  width:30%; max-width:7.2rem;
}
.ya-rod__knop{
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:2px; width:100%; min-height:48px; padding:4px 2px;
  border-radius:12px; border:1px solid var(--outline);
  background:var(--surface-container-lowest); color:var(--on-surface);
  font:var(--type-body-s); line-height:1.15; cursor:pointer;
}
.ya-rod__knop--otkryt{ border-color:var(--primary); color:var(--primary); }
.ya-rod__knop--seichas{ background:var(--primary-container); color:var(--on-primary-container); }
@media (prefers-reduced-motion:reduce){
  .ya-rod__nit--otkryta{ animation:none; }
}
html[data-dvizhenie="off"] .ya-rod__nit--otkryta{ animation:none; }

.ya-vecher-verh{
  margin-top:4px; padding-bottom:4px;
}
.ya-vecher-schet{
  margin:0 0 8px;
  font:var(--type-body-s);
  font-weight:400;
  color:var(--on-surface);
}
/* Одна горизонтальная лента компактных пилюль 1–5; имя момента — подписью ниже. */
.ya-vecher-momenty{
  display:flex;
  flex-wrap:nowrap;
  align-items:center;
  justify-content:center;
  gap:6px;
  margin:0 0 6px;
  min-width:0;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.ya-vecher-momenty::-webkit-scrollbar{ display:none; }
.ya-vecher-moment{
  box-sizing:border-box;
  flex:0 0 auto;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:2px;
  min-width:2.5rem;
  min-height:2.5rem;
  padding:0 8px;
  border:1px solid var(--outline-variant);
  border-radius:999px;
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  font:var(--type-label-m, var(--type-body-s));
  font-weight:400;
  cursor:pointer;
}
.ya-vecher-moment:disabled{
  cursor:default;
  color:color-mix(in srgb, var(--on-surface) 38%, transparent);
  background:var(--surface-container);
}
.ya-vecher-moment--сейчас{
  background:var(--primary);
  color:var(--on-primary);
  border-color:var(--primary);
}
.ya-vecher-moment--byl{
  box-shadow:inset 0 0 0 1.5px var(--primary);
  background:var(--primary-container);
  color:var(--on-primary-container);
  border-color:transparent;
}
.ya-vecher-moment__n{ font-variant-numeric:tabular-nums; }
.ya-vecher-galochka{ font-size:.85em; line-height:1; }
.ya-vecher__moment-imya{
  margin:0 0 8px;
  text-align:center;
  font:var(--type-body-s);
  font-weight:400;
  color:var(--on-surface-variant);
}
.ya-vecher-nav__strelka{
  flex:0 0 auto;
  min-width:2.5rem;
  align-self:center;
}
.ya-vecher-nav__strelka--pust{ visibility:hidden; pointer-events:none; }
/* Карусель: вкладки + подпись + рисунок в одном кадре; слайды равной высоты. */
.ya-vecher-karusel{
  position:relative; overflow:hidden; min-width:0;
}
.ya-vecher-karusel__lenta{
  display:flex; width:100%;
  transition:transform .32s ease;
  will-change:transform;
}
.ya-vecher-karusel--tixo .ya-vecher-karusel__lenta{ transition:none; }
.ya-vecher-karusel__slajd{
  flex:0 0 100%; width:100%; min-width:100%;
  box-sizing:border-box;
  display:flex; flex-direction:column; gap:var(--sp-2);
  padding:0 1px;
}
.ya-vecher-karusel__slajd--pust{ visibility:hidden; pointer-events:none; }
.ya-vecher__scena{
  margin:0;
  font:var(--type-body-m, var(--type-body-s));
  line-height:1.45;
  font-weight:400;
  color:var(--on-surface);
  text-align:center;
}
.ya-vecher__ris-ryad{
  display:flex;
  align-items:center;
  gap:var(--sp-2);
  min-width:0;
}
.ya-vecher__ris{
  flex:1 1 auto;
  width:auto;
  max-width:none;
  max-height:30vh;
  margin:0;
  min-width:0;
}
@media (max-width:640px){
  .ya-vecher__ris{ max-height:26vh; }
}
.ya-vecher__okno{
  width:100%;
  max-width:100%;
  max-height:30vh;
  height:auto;
  display:block;
  border-radius:var(--shape-m, 12px);
}
@media (max-width:640px){
  .ya-vecher__okno{ max-height:26vh; }
}
.ya-vecher__blok{
  box-sizing:border-box;
  margin:0;
  padding:var(--sp-2) var(--sp-3);
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l, 16px);
  min-width:0;
}
.ya-vecher__blok p{ margin:0 0 var(--sp-2); }
.ya-vecher__blok p:last-child{ margin-bottom:0; }
.ya-vecher__blok .ya-vecher__vremya{ margin-bottom:var(--sp-2); }
.ya-vecher__vod{ font-weight:400; color:var(--on-surface-variant); }
.ya-vecher__blok--vedayet{
  display:grid;
  /* Колонка схемы — фиксированной ширины: у «auto» с width:min(100%,…)
     внутри Safari считал процент от строки и сжимал текст до слова в строке. */
  grid-template-columns:minmax(0,1fr) 140px;
  gap:var(--sp-2) var(--sp-3);
  align-items:center;
}
.ya-vecher__ved-txt{ min-width:0; }
.ya-vecher__shema{
  margin:0;
  display:flex;
  justify-content:center;
  align-items:center;
  width:100%;
  min-width:0;
  flex-shrink:0;
}
.ya-vecher__shema svg{
  width:100%;
  max-width:160px;
  height:auto;
  display:block;
}
/* На телефоне — столбиком: текст на всю ширину, схема под ним. */
@media (max-width:520px){
  .ya-vecher__blok--vedayet{
    grid-template-columns:minmax(0,1fr);
  }
  .ya-vecher__ved-txt{ justify-self:stretch; }
  .ya-vecher__shema{ width:140px; justify-self:center; }
}
@media (prefers-reduced-motion:reduce){
  .ya-vecher-karusel__lenta{ transition:none; }
  .ya-vecher__okno, .ya-vecher__shema svg{ transition:none; }
}
html[data-dvizhenie="off"] .ya-vecher-karusel__lenta{ transition:none; }
html[data-dvizhenie="off"] .ya-vecher__okno,
html[data-dvizhenie="off"] .ya-vecher__shema svg{ transition:none; }

.ya-linia-sveta{ display:block; width:min(100%,280px); height:auto; margin:var(--sp-4) auto 0; }
@media (prefers-reduced-motion:reduce){
  .ya-vecher__okno, .ya-vecher__shema svg{ transition:none; }
}
html[data-dvizhenie="off"] .ya-vecher__okno,
html[data-dvizhenie="off"] .ya-vecher__shema svg{ transition:none; }

/* Акцент слова — цвет из токенов, без курсива и полужирного. */
.ya-rod__zerno{
  font-style:normal;
  font-weight:400;
  color:var(--tertiary);
}
.ya-nomer--krasny{ color:var(--error); font-weight:400; }
.ya-nomer--zhelty{ color:var(--tertiary); font-weight:400; }

/* ── АНАЛОГИЯ (ys1–ys6) ─────────────────────────────────────────────
   Выноска-аналогия внутри объяснения: без ярлыка (17.10.2026), только
   текст body-l в рамке с полосой акцента. Без засечек и без наклона: правило
   «ни одного курсива» (tests/uroki-bez-kursiva). Акцент — тонкая полоса
   слева цвета tertiary, рамка — outline-variant, как у карточек. */
/* Выноска-аналогия (02.11.2026, ys7 методист): пунктирная скруглённая
   рамка цвета акцента/tertiary — как в макете методиста. Без ярлыка
   «Аналогия.» (срезает голос урока). Без курсива. */
.ya-analogiya{
  margin:var(--sp-4) 0 var(--sp-1);
  padding:var(--sp-3) var(--sp-4);
  border-radius:var(--shape-m);
  border:1.5px dashed var(--accent, var(--tertiary));
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  text-align:left;
}
.ya-analogiya__tekst{
  /* Размер основного текста (body-l), не мелкий шрифт: обзор 17.10.2026. */
  font:var(--type-body-l);
  font-style:normal;
  color:var(--on-surface);
}
/* ── РИСУНОК СЛЕВА + МЕНЮ СПРАВА (ys7 методист) ─────────────────────
   На широких экранах — две колонки; на телефоне — стек. */
.ya-ris-menu{
  display:grid;
  grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);
  gap:var(--sp-4);
  align-items:start;
  margin:var(--sp-3) 0;
}
.ya-ris-menu__ris{min-width:0}
.ya-ris-menu__menu{min-width:0}
@media (max-width:720px){
  .ya-ris-menu{grid-template-columns:1fr}
}
.ya-vremya-kart p{font:var(--type-body-m);color:var(--on-surface)}

/* ── YS7 UI POLISH (05.11.2026) ─────────────────────────────────────
   Рисунки крупнее, цели касания ≥44px, явные стейты без скачков. */
.ya-ris-menu{
  gap:var(--sp-5);
  align-items:stretch;
}
.ya-ris-menu__ris{
  display:flex;
  flex-direction:column;
  justify-content:center;
}
.ya-ris-menu__ris > svg{
  max-width:min(100%,440px);
  width:100%;
  height:auto;
  shape-rendering:geometricPrecision;
  text-rendering:geometricPrecision;
}
.ya-ris-menu__ris > svg [stroke]{
  vector-effect:non-scaling-stroke;
}
.ya-ris-menu__menu{
  display:flex;
  flex-direction:column;
  gap:var(--sp-3);
  min-height:100%;
}
.ya-ris-menu__menu .ya-btn{
  min-height:44px;
  justify-content:flex-start;
  text-align:left;
  transition:background .15s ease, border-color .15s ease, box-shadow .15s ease, color .15s ease;
}
@media (prefers-reduced-motion:reduce){
  .ya-ris-menu__menu .ya-btn{transition:none}
}
html[data-dvizhenie="off"] .ya-ris-menu__menu .ya-btn{transition:none}

/* Концы креста / кнопки пар — стейты */
.ya-ris-menu [data-konec-btn][aria-pressed="true"],
.ya-ris-menu [data-konec-btn].ya-btn--filled{
  box-shadow:inset 0 0 0 2px var(--primary);
}
.ya-ris-menu [data-konec-btn]:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}

/* Карточка времени — фиксированная мин. высота, чтобы Раньше/Дальше не прыгали */
.ya-vremya-kart{
  min-height:9.5rem;
  padding:var(--sp-3) var(--sp-4);
  border-radius:var(--shape-m);
  border:1px solid var(--outline-variant);
  background:var(--surface-container-low);
  color:var(--on-surface);
}
.ya-vremya-kart__meta{
  font:var(--type-label-m);
  color:var(--on-surface-variant);
  margin:0 0 var(--sp-1);
}
.ya-vremya-kart__imya{
  font:var(--type-title-s);
  font-weight:700;
  margin:0 0 var(--sp-2);
  color:var(--on-surface);
}
.ya-vremya-kart p{margin:0 0 var(--sp-1);font:var(--type-body-m);color:var(--on-surface)}
.ya-vremya-kart p:last-child{margin-bottom:0}

/* Переключатель взгляда */
.ya-vzglyad-tabs{
  display:flex;
  gap:var(--sp-2);
  flex-wrap:wrap;
}
.ya-vzglyad-tabs .ya-btn{
  min-height:44px;
  flex:1 1 auto;
}
.ya-vzglyad-tabs .ya-btn[aria-selected="true"]{
  box-shadow:inset 0 0 0 2px var(--primary);
}

/* Раньше / Дальше на краях */
.ya-svet-knopki .ya-btn[disabled],
.ya-svet-knopki .ya-btn[aria-disabled="true"]{
  opacity:0.45;
  cursor:not-allowed;
}

/* Имена: выбранное имя, подсветка строк, ошибка без скачка */
.ya-imena-bank .ya-btn[aria-pressed="true"]{
  outline:2px solid var(--accent, var(--primary));
  outline-offset:2px;
}
.ya-imena-slot{
  min-height:48px;
  transition:outline-color .15s ease, background .15s ease, border-color .15s ease;
}
.ya-imena-slot[data-await="1"]{
  outline:2px dashed var(--accent, var(--primary));
  outline-offset:0;
}
.ya-imena-slot[data-ok="1"]{
  border-color:var(--ok) !important;
}
.ya-imena-oshibka{
  min-height:1.4em;
  margin:0 0 var(--sp-1);
  color:var(--error);
  font:var(--type-body-s);
}
.ya-imena-oshibka:empty{display:none}

/* Верный ответ в «Проверь себя» — зелёный через класс DS, не инлайн */
.ya-btn.ya-btn--verno{
  background:var(--ok) !important;
  color:var(--on-ok, #fff) !important;
  border-color:var(--ok) !important;
  opacity:1 !important;
}
.ya-btn.ya-btn--verno:disabled{opacity:1}

/* Четверти — активная карточка */
.ya-chetvert-kart{
  min-height:7.5rem;
  padding:var(--sp-3) var(--sp-4);
  border-radius:var(--shape-m);
  border:1px solid var(--outline-variant);
  background:var(--surface-container-low);
}
.ya-chetvert-kart__imya{font:var(--type-title-s);font-weight:700;margin:0 0 var(--sp-2)}
.ya-chetvert-kart p{margin:0;font:var(--type-body-m)}

/* Рисунок явного света — крупнее */
[data-yavnyj-ris] > svg{
  max-width:min(100%,420px);
  shape-rendering:geometricPrecision;
}


/* ── ЗАДАНИЕ (рамка интерактивного блока урока) ───────────────────────
   Одна рамка для «Сделай сам», «Нажимай на лучи», «Открывай карточки» и
   т.п.: поверхность low, радиус shape-l, полоса слева цвета книги.
   Внутри: TaskFrameLabel, ЗаголовокРаздела, .ya-zadanie__uslovie (условие),
   само задание и .ya-uspeh (итог). */
.ya-zadanie{
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  border-left:3px solid var(--book-sutki, var(--primary));
  border-radius:var(--shape-l);
  padding:var(--sp-4) var(--sp-4);
}
@media (max-width:640px){ .ya-zadanie{ padding:var(--sp-4) var(--sp-3); } }
.ya-zadanie__uslovie{ font:var(--type-body-m); color:var(--on-surface); margin:0 0 var(--sp-3); }
/* Итог задания: короткая строка цвета ok. */
.ya-uspeh{ font:var(--type-body-s); color:var(--ok); margin-top:var(--sp-2); }

/* ── РИСУНОК В РАМКЕ (чертёж/график без задания) ─────────────────────── */
.ya-ris-ramka{
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l);
  padding:var(--sp-4) var(--sp-3);
}
.ya-ris-ramka__podpis{ font:var(--type-body-s); color:var(--on-surface-variant); text-align:center; margin-top:var(--sp-2); }

/* Шаги урока: рамка и ход, цифра чернилами, без своего цвета на шаг. */
.ya-karta-shagov{
  list-style:none;
  padding:0;
  margin:16px 0 0;
  display:flex;
  flex-direction:column;
  gap:var(--sp-2);
}
.ya-karta-shagov__ryad{
  display:flex;
  align-items:center;
  gap:var(--sp-3);
  width:100%;
  margin:0;
  padding:10px 12px;
  border:1px solid var(--outline);
  border-radius:var(--shape-m, 12px);
  background:var(--surface-container-lowest);
  color:var(--on-surface);
  font:var(--type-body-m);
  font-style:normal;
  font-weight:400;
  text-align:left;
  cursor:pointer;
}
.ya-karta-shagov__ryad--tiho{ cursor:default; }
button.ya-karta-shagov__ryad:hover{ background:var(--surface-container); }
button.ya-karta-shagov__ryad:focus-visible{
  outline:2px solid var(--outline);
  outline-offset:2px;
}
.ya-karta-shagov__znak{
  flex:none;
  width:40px;
  height:40px;
  border-radius:999px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  border:1px solid var(--outline);
  background:transparent;
  color:var(--on-surface);
  font:var(--type-title-m);
  font-weight:400;
  font-style:normal;
  line-height:1;
}
.ya-karta-shagov__tekst{
  flex:1 1 auto;
  min-width:0;
  padding-top:0;
  font:var(--type-body-m);
  font-style:normal;
  font-weight:400;
  line-height:1.45;
  color:var(--on-surface);
}
.ya-karta-shagov__tekst b{
  font:inherit;
  font-style:normal;
  font-weight:400;
}
.ya-karta-shagov__hod{
  flex:none;
  margin-top:8px;
  color:var(--on-surface-variant);
}
@media (prefers-reduced-motion:reduce){
  .ya-karta-shagov__ryad, .ya-analogiya{ transition:none; }
}
html[data-dvizhenie="off"] .ya-karta-shagov__ryad,
html[data-dvizhenie="off"] .ya-analogiya{ transition:none; }

/* Прошедшие ворота, включая «Конец»: тот же заголовок, что у разделов, без курсива и без коричневого. */
.ya-vorota{
  padding:var(--sp-6) var(--sp-5) var(--sp-3);
  max-width:var(--ur-kol, 680px);
  margin:0 auto;
  text-align:center;
}
.ya-vorota__cherta{
  height:2px;
  width:min(100%, 160px);
  margin:0 auto var(--sp-4);
  background:var(--ya-razdel-accent,var(--outline));
  border-radius:2px;
}
.ya-vorota__imya{
  font:var(--type-title-l);
  font-style:normal;
  color:var(--on-surface);
}
.ya-vorota__pod{
  margin-top:var(--sp-2);
  font:var(--type-body-s);
  color:var(--on-surface-variant);
}

/* Тихая шапка урока: курс, одна полоса хода, мета. Без «Урок N» и без 2/4. */
.ya-urok-hod{
  position:relative;
  height:3px;
  width:100%;
  background:color-mix(in srgb, var(--outline-variant) 85%, var(--surface-container-high));
  overflow:hidden;
}
.ya-urok-hod__tiho,
.ya-urok-hod__tverdo{
  position:absolute;
  left:0; top:0; bottom:0;
  max-width:100%;
  transition:width .35s ease;
}
.ya-urok-hod__tiho{
  /* Доля текущего урока внутри сегмента курса — тише primary. */
  background:color-mix(in srgb, var(--primary) 42%, var(--outline-variant));
}
.ya-urok-hod__tverdo{
  background:var(--primary);
}
.ya-urok-meta{
  font:var(--type-label-s);
  font-weight:400;
  letter-spacing:var(--track-label, .02em);
  color:var(--on-surface-variant);
  text-transform:none;
}
@media (prefers-reduced-motion:reduce){
  .ya-urok-hod__tiho, .ya-urok-hod__tverdo{ transition:none; }
}
html[data-dvizhenie="off"] .ya-urok-hod__tiho,
html[data-dvizhenie="off"] .ya-urok-hod__tverdo{ transition:none; }

/* Вход урока. Один вид во всех уроках: крупное имя, под ним вторичная строка.
   Без курсива и без отдельной краски.
   --sp-5 в шкале нет (4·8·12·16·24·32): без запасного значения вся padding-
   строка становилась недействительной и заливка резала буквы. */
.ya-vhod{
  box-sizing:border-box;
  padding:var(--sp-8) var(--sp-6) var(--sp-6);
  max-width:var(--ur-kol,680px);
  margin:var(--sp-3) auto 0;
  background:var(--surface-container-lowest);
  border-radius:var(--shape-l,16px);
  border:1px solid var(--outline-variant);
}
.ya-vhod__yarlyk{
  margin:0 0 var(--sp-3);
  font:var(--type-label-s);
  letter-spacing:var(--track-label);
  text-transform:uppercase;
  color:var(--on-surface-variant);
}
.ya-vhod__imya{
  margin:0 0 var(--sp-4);
  font:var(--type-headline-l);
  font-style:normal;
  font-weight:600;
  color:var(--on-surface);
  overflow:visible;
}
.ya-vhod__lid{
  margin:0;
  font:var(--type-body-l);
  font-style:normal;
  font-weight:400;
  color:var(--on-surface-variant);
}

/* ═══ ПОЛОЖЕНИЕ В УРОКЕ · .ya-polozhenie ════════════════════════════════════
   Одна вставка на все уроки, где цитируется положение книги. Не отдельный
   цвет: поверхность карточки и тихая кромка, как у остальных карточек.
   Строка читается «Положение 47» — слово и номер одним кеглем, одним
   шрифтом шкалы, прописными цифрами. «в книге» — та же строка, обычное
   начертание, ссылка в учебник. Движения нет; оба выключателя всё равно
   гасят переход, если его добавят позже. */
.ya-polozhenie{
  margin:var(--sp-3) 0 var(--sp-1);
  padding:var(--sp-2) var(--sp-3);
  background:var(--surface-container-low);
  color:var(--on-surface);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-m);
}
.ya-polozhenie--otkryto{ padding-bottom:var(--sp-3); }
.ya-polozhenie__stroka{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--sp-3);
}
.ya-polozhenie__imya{
  flex:1 1 auto;
  min-width:0;
  min-height:44px;
  display:flex;
  align-items:center;
  gap:var(--sp-2);
  margin:0;
  padding:0;
  border:0;
  background:transparent;
  color:inherit;
  font:var(--type-title-s);
  font-style:normal;
  font-weight:600;
  font-variant:normal;
  font-variant-numeric:lining-nums;
  letter-spacing:0;
  text-transform:none;
  text-align:left;
  cursor:pointer;
}
.ya-polozhenie__nadpis{
  font:inherit;
  font-size:15px; /* = .ya-polozhenie__kniga: номер и книга одного кегля */
  font-style:normal;
  font-weight:inherit;
  font-variant:normal;
  font-variant-numeric:lining-nums;
  letter-spacing:0;
  text-transform:none;
}
.ya-polozhenie__znak{
  flex:0 0 auto;
  color:var(--on-surface-variant);
  font:inherit;
  font-style:normal;
  font-weight:400;
  font-variant-numeric:lining-nums;
  text-transform:none;
}
.ya-polozhenie__kniga{
  flex:0 0 auto;
  min-height:44px;
  display:inline-flex;
  align-items:center;
  font:var(--type-title-s);
  font-size:15px;
  font-style:normal;
  font-weight:400;
  font-variant:normal;
  font-variant-numeric:lining-nums;
  letter-spacing:0;
  text-transform:none;
  color:var(--on-surface-variant);
  text-decoration:underline;
  text-decoration-thickness:1px;
  text-underline-offset:3px;
}
.ya-polozhenie__imya:focus-visible,
.ya-polozhenie__kniga:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}
.ya-polozhenie__tsitata{
  margin:var(--sp-2) 0 0;
  font:var(--type-body-m);
  font-style:normal;
  line-height:1.55;
  color:var(--on-surface);
}
.ya-polozhenie__primechanie{
  margin-top:var(--sp-2);
  font:var(--type-body-s);
  font-style:normal;
  font-weight:400;
  color:var(--on-surface-variant);
}
@media (prefers-reduced-motion:reduce){
  .ya-polozhenie,
  .ya-polozhenie *{
    animation:none;
    transition:none;
  }
}
html[data-dvizhenie="off"] .ya-polozhenie,
html[data-dvizhenie="off"] .ya-polozhenie *{
  animation:none;
  transition:none;
}

/* Слово-акцент в имени входа (itogi1: «вы научились видеть сутки»). Цвет
   акцента системы; начертание то же, что у всего заголовка: без курсива,
   без отдельной жирности. */
.ya-vhod__akcent{
  color:var(--ya-primary-ink);
  font:inherit;
  font-style:normal;
}

/* Положение строкой-ссылкой: номер и «в книге», без раскрытия цитаты. */
.ya-polozhenie--ssylka .ya-polozhenie__imya{ cursor:default; }

/* ═══ ИТОГИ БЛОКА · .ya-itogi-* ═════════════════════════════════════════════
   Экран «Подведем итог блока» (itogi1). Путь остановок, «Теперь вы умеете»,
   «Финал блока», «Весь курс — три блока». Только роли tokeny.css; ширина —
   колонка урока (--ur-kol). Движение одно — мягкая смена карточки
   остановки; оба выключателя движения его гасят. */
.ya-itogi-put,
.ya-itogi-sekciya,
.ya-itogi-kurs{
  box-sizing:border-box;
  max-width:var(--ur-kol,680px);
  margin:var(--sp-4) auto 0;
  padding:0 var(--sp-6);
}

/* Полоса пути: шесть остановок одной строкой. На телефоне — прокрутка
   вбок, выбранная остановка встаёт в середину. */
.ya-itogi-polosa{
  position:relative;
  overflow-x:auto;
  overscroll-behavior-x:contain;
  scrollbar-width:none;
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l,16px);
}
.ya-itogi-polosa::-webkit-scrollbar{ display:none; }
.ya-itogi-polosa__ryad{
  position:relative;
  display:flex;
  gap:var(--sp-1);
  min-width:max-content;
  padding:var(--sp-3) var(--sp-2);
}
/* Нить пути — через середины плиток, от первой до последней. */
.ya-itogi-polosa__ryad::before{
  content:"";
  position:absolute;
  left:calc(var(--sp-2) + 36px);
  right:calc(var(--sp-2) + 36px);
  top:calc(var(--sp-3) + var(--sp-1) + 26px);
  height:2px;
  background:var(--outline-variant);
}
.ya-itogi-ostanovka{
  position:relative;
  flex:0 0 72px;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:var(--sp-2);
  min-height:44px;
  margin:0;
  padding:var(--sp-1) 0 var(--sp-1);
  border:0;
  border-radius:var(--shape-m);
  background:transparent;
  color:var(--on-surface-variant);
  font:inherit;
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
}
.ya-itogi-ostanovka:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}
.ya-itogi-ostanovka__plitka{
  position:relative;
  box-sizing:border-box;
  width:52px;
  height:52px;
  padding:5px;
  border-radius:var(--shape-full);
  background:var(--surface-container-lowest);
  box-shadow:0 0 0 1px var(--outline-variant);
  transition:box-shadow var(--dur-medium) var(--ease-standard);
}
.ya-itogi-ostanovka__plitka .ya-itogi-ris{ display:block; width:100%; height:100%; }
.ya-itogi-ostanovka--aktivna .ya-itogi-ostanovka__plitka{
  box-shadow:0 0 0 2px var(--surface-container-lowest),0 0 0 4px var(--primary);
}
@media (hover:hover){
  .ya-itogi-ostanovka:not(.ya-itogi-ostanovka--aktivna):hover .ya-itogi-ostanovka__plitka{
    box-shadow:0 0 0 1px var(--outline);
  }
}
.ya-itogi-ostanovka__znak{
  position:absolute;
  right:-4px;
  bottom:-4px;
  display:flex;
  align-items:center;
  justify-content:center;
  width:20px;
  height:20px;
  border-radius:var(--shape-full);
  background:var(--ok);
  color:var(--on-ok);
  box-shadow:0 0 0 2px var(--surface-container-lowest);
}
.ya-itogi-ostanovka__znak .ya-ik{ width:14px; height:14px; }
.ya-itogi-ostanovka__imya{
  font:var(--type-label-m);
  letter-spacing:0;
  text-transform:none;
  white-space:nowrap;
}
.ya-itogi-ostanovka--aktivna .ya-itogi-ostanovka__imya{ color:var(--on-surface); }

/* Карточка остановки: рисунок, метка, имя урока, текст, мысль, положения. */
.ya-itogi-karta{
  margin-top:var(--sp-3);
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l,16px);
  overflow:hidden;
}
.ya-itogi-karta:focus-visible{
  outline:2px solid var(--primary);
  outline-offset:2px;
}
.ya-itogi-karta__telo{
  display:flex;
  flex-direction:column;
  gap:var(--sp-4);
  padding:var(--sp-6);
}
.ya-itogi-karta__telo--smena{
  animation:ya-itogi-smena var(--dur-medium) var(--ease-emphasized-decel) both;
}
@keyframes ya-itogi-smena{
  from{ opacity:0; transform:translateY(6px); }
  to{ opacity:1; transform:none; }
}
.ya-itogi-karta__ris{
  flex:0 0 auto;
  width:112px;
  height:112px;
  padding:var(--sp-2);
  box-sizing:border-box;
  border-radius:var(--shape-full);
  background:var(--surface-container-low);
}
.ya-itogi-karta__ris .ya-itogi-ris{ display:block; width:100%; height:100%; }
.ya-itogi-karta__slova{ min-width:0; }
.ya-itogi-karta__metka{
  margin:0 0 var(--sp-1);
  font:var(--type-label-l);
  color:var(--on-surface-variant);
}
.ya-itogi-karta__imya{
  margin:0 0 var(--sp-3);
  font:var(--type-title-l);
  color:var(--on-surface);
}
.ya-itogi-karta__tekst{
  margin:0;
  font:var(--type-body-l);
  color:var(--on-surface);
}
/* Мысль остановки: строка-вывод урока — черта акцента слева, тот же кегль
   текста, без курсива (курсив в системе только у цитаты книги). */
.ya-itogi-mysl{
  margin:var(--sp-4) 0 0;
  padding:var(--sp-1) 0 var(--sp-1) var(--sp-4);
  border-left:3px solid var(--primary);
  font:var(--type-body-l);
  font-style:normal;
  color:var(--on-surface);
}
.ya-itogi-nerazryv{ white-space:nowrap; }
.ya-itogi-polozheniya{ margin-top:var(--sp-3); }
.ya-itogi-polozheniya .ya-polozhenie{ margin:var(--sp-2) 0 0; }

.ya-itogi-nav{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--sp-3);
  margin-top:var(--sp-3);
}
.ya-itogi-nav .ya-btn{ gap:var(--sp-1); }

/* «Теперь ты умеешь» — обычная карточка урока; «Финал блока» — тихая
   заливка цвета курса, чтобы финал стоял особняком. */
.ya-itogi-umeete,
.ya-itogi-final{
  padding:var(--sp-6);
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l,16px);
}
.ya-itogi-final{
  background:var(--book-sutki-container);
  border-color:var(--book-sutki-container);
}
.ya-itogi-sekciya .ur-razdel[tabindex="-1"]:focus{ outline:none; }
.ya-itogi-umeete .ur-razdel,
.ya-itogi-final .ur-razdel{ margin:0 0 var(--sp-3); }
.ya-itogi-umeete__spisok{
  list-style:none;
  margin:0;
  padding:0;
  display:grid;
  gap:var(--sp-3);
}
.ya-itogi-umeete__punkt{
  display:flex;
  align-items:flex-start;
  gap:var(--sp-3);
  font:var(--type-body-l);
  color:var(--on-surface);
}
.ya-itogi-umeete__znak{
  flex:0 0 auto;
  display:flex;
  align-items:center;
  justify-content:center;
  width:24px;
  height:24px;
  margin-top:1px;
  border-radius:var(--shape-full);
  background:var(--ok-container);
  color:var(--on-ok-container);
}
.ya-itogi-final__tekst{
  margin:0;
  font:var(--type-body-l);
  color:var(--on-surface);
}

/* «Весь курс — три блока». Телефон — столбиком с нитью между карточками;
   от 768px — три карточки в ряд, как таблица методиста. */
.ya-itogi-kurs{ margin-top:var(--sp-8); }
.ya-itogi-kurs__zag{
  margin:0 0 var(--sp-4);
  font:var(--type-headline-s);
  color:var(--on-surface);
  text-align:center;
  text-wrap:balance;
}
.ya-itogi-bloki{
  list-style:none;
  margin:0;
  padding:0;
  display:grid;
  grid-template-columns:1fr;
  gap:var(--sp-4);
}
.ya-itogi-blok{
  position:relative;
  display:flex;
  flex-direction:column;
  padding:var(--sp-6);
  background:var(--surface-container-lowest);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l,16px);
  color:var(--on-surface);
}
.ya-itogi-blok + .ya-itogi-blok::before{
  content:"";
  position:absolute;
  left:50%;
  top:calc(-1 * var(--sp-4) - 1px);
  width:2px;
  height:var(--sp-4);
  margin-left:-1px;
  background:var(--outline-variant);
}
.ya-itogi-blok--sleduyushchiy{
  border-color:var(--primary);
  box-shadow:inset 0 0 0 1px var(--primary);
}
.ya-itogi-blok--vperedi{
  background:var(--surface-container-low);
  color:var(--on-surface-variant);
}
.ya-itogi-blok__verh{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--sp-2);
  margin-bottom:var(--sp-3);
}
.ya-itogi-blok__nomer{
  font:var(--type-label-l);
  color:var(--on-surface-variant);
}
.ya-itogi-status{
  display:inline-flex;
  align-items:center;
  gap:var(--sp-1);
  min-height:24px;
  padding:0 var(--sp-2);
  border-radius:var(--shape-full);
  font:var(--type-label-m);
  letter-spacing:0;
  text-transform:none;
  white-space:nowrap;
}
.ya-itogi-status .ya-ik{ width:14px; height:14px; }
.ya-itogi-status--proyden{ background:var(--ok-container); color:var(--on-ok-container); }
.ya-itogi-status--sleduyushchiy{ background:var(--primary); color:var(--on-primary); }
.ya-itogi-status--vperedi{
  background:var(--surface-container-high);
  color:var(--on-surface-variant);
  box-shadow:inset 0 0 0 1px var(--outline-variant);
}
.ya-itogi-blok__glagol{
  margin:0 0 var(--sp-1);
  font:var(--type-headline-s);
  color:inherit;
}
.ya-itogi-blok--proyden .ya-itogi-blok__glagol,
.ya-itogi-blok--sleduyushchiy .ya-itogi-blok__glagol{ color:var(--on-surface); }
.ya-itogi-blok__tema{
  margin:0 0 var(--sp-1);
  font:var(--type-body-l);
  color:inherit;
}
.ya-itogi-blok__uroki{
  margin:0 0 var(--sp-3);
  font:var(--type-body-s);
  color:var(--on-surface-variant);
}
.ya-itogi-blok__opis{
  margin:0;
  padding-top:var(--sp-3);
  border-top:1px solid var(--outline-variant);
  display:grid;
  gap:var(--sp-2);
  font:var(--type-body-m);
}
.ya-itogi-blok__opis div{ margin:0; }
.ya-itogi-blok__opis dt{
  display:inline;
  font:inherit;
  color:var(--on-surface-variant);
}
.ya-itogi-blok__opis dd{
  display:inline;
  margin:0;
  color:inherit;
}
.ya-itogi-kurs__itog{
  margin:var(--sp-6) auto 0;
  max-width:36em;
  font:var(--type-title-m);
  color:var(--on-surface);
  text-align:center;
  text-wrap:balance;
}

@media (min-width:768px){
  .ya-itogi-polosa__ryad{ min-width:0; }
  .ya-itogi-ostanovka{ flex:1 1 0; min-width:0; }
  .ya-itogi-polosa__ryad::before{
    left:calc(var(--sp-2) + (100% - 2 * var(--sp-2)) / 12);
    right:calc(var(--sp-2) + (100% - 2 * var(--sp-2)) / 12);
  }
  .ya-itogi-karta__telo{
    flex-direction:row;
    align-items:flex-start;
    gap:var(--sp-6);
    padding:var(--sp-6);
  }
  .ya-itogi-karta__ris{ width:136px; height:136px; }
  .ya-itogi-bloki{ grid-template-columns:repeat(3,minmax(0,1fr)); }
  .ya-itogi-blok{ padding:var(--sp-4); }
  .ya-itogi-blok + .ya-itogi-blok::before{
    left:calc(-1 * var(--sp-4) - 1px);
    top:50%;
    width:var(--sp-4);
    height:2px;
    margin:-1px 0 0;
  }
}

@media (prefers-reduced-motion:reduce){
  .ya-itogi-karta__telo--smena{ animation:none; }
  .ya-itogi-ostanovka__plitka{ transition:none; }
}
html[data-dvizhenie="off"] .ya-itogi-karta__telo--smena{ animation:none; }
html[data-dvizhenie="off"] .ya-itogi-ostanovka__plitka{ transition:none; }

/* ═══ Пробное занятие · бесплатный вводный урок ═══════════════════════════════════════ */
.ya-vhod__yarlyk{
  margin:0 0 var(--sp-2);
  font:var(--type-label-m);
  letter-spacing:var(--track-label);
  color:var(--on-surface-variant);
  text-transform:none;
}
.ya-demo-sutki{ position:relative; min-width:0; }
.ya-demo-sutki__svg{
  display:block; width:100%; height:auto;
  border-radius:var(--shape-l); overflow:hidden;
  background:var(--reader-sheet);
}
/* Сутки одним взглядом: кадр рисует JS (DemoSutkiAnimBlock в engine.js) —
   и в движении, и в тихом режиме. Здесь нет ни @keyframes, ни transform /
   stop-color на светиле и небе: CSS перебивал атрибуты кадра, и в Safari и
   Chrome солнце стояло, а звёзды щёлкали. */
.ya-demo-sutki__shagi{
  display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-top:var(--sp-3);
}

.ya-demo-age{
  box-sizing:border-box;
  display:flex; flex-direction:column; align-items:center;
  gap:var(--sp-3);
  /* --sp-5 в шкале нет: без запасного значения вся padding-строка
     становилась недействительной — текст и ползунок липли к краям.
     sp-8 даёт воздух вокруг заголовков, ползунка и абзаца after. */
  padding:var(--sp-8) var(--sp-8);
  text-align:center;
  background:var(--primary-container);
  color:var(--on-primary-container);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l, 16px);
}
/* По центру в демо — всегда заголовок (шкала .ur-razdel / type-title),
   не центрированный body. Проза «after» — слева, body. */
.ya-demo-age__title{
  margin:0;
  font:var(--type-title-m);
  font-weight:700;
  color:var(--on-primary-container);
  text-wrap:balance;
}
.ya-demo-age__lead{
  margin:0;
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-primary-container);
}
.ya-demo-age__prompt{
  margin:0;
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-primary-container);
  width:100%;
}
.ya-demo-age__vozrast{
  font:var(--type-title-m);
  font-weight:700;
  color:var(--on-primary-container);
}
.ya-demo-age .ya-polzunok{ width:100%; max-width:100%; align-self:stretch; }
.ya-demo-age__chislo{
  margin:0; font:var(--type-display-m);
  color:var(--on-primary-container); font-variant-numeric:tabular-nums; letter-spacing:0;
}
.ya-demo-age__caption{
  margin:0;
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-primary-container);
  max-width:28rem;
}
.ya-demo-age__after{
  margin:var(--sp-2) 0 0;
  font:var(--type-body-m);
  color:var(--on-primary-container);
  line-height:1.5;
  text-align:left;
  align-self:stretch;
  opacity:.92;
}

.ya-demo-now{
  box-sizing:border-box;
  display:flex; flex-direction:column; align-items:center;
  gap:var(--sp-2);
  padding:var(--sp-8) var(--sp-8);
  text-align:center;
  background:var(--surface-container-low);
  border:1px solid var(--outline-variant);
  border-radius:var(--shape-l, 16px);
}
.ya-demo-now__icon{ display:block; line-height:0; color:var(--primary); }
.ya-demo-now__heading{
  margin:0;
  font:var(--type-title-m);
  font-weight:700;
  color:var(--on-surface);
  text-wrap:balance;
}
.ya-demo-now__clock{
  display:block;
  margin:var(--sp-1) 0 0;
  font:var(--type-display-s);
  font-variant-numeric:tabular-nums;
  letter-spacing:-0.02em;
  color:var(--on-surface);
}
.ya-demo-now__device{
  margin:0 0 var(--sp-2);
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-surface-variant);
}
.ya-demo-now__q{
  margin:0;
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-surface);
  max-width:28rem;
}
.ya-demo-now__after{
  margin:var(--sp-2) 0 0;
  font:var(--type-body-m);
  color:var(--on-surface-variant);
  line-height:1.5;
  text-align:left;
  align-self:stretch;
  max-width:28rem;
}

.ya-demo-quiz__ris{ margin-bottom:var(--sp-3); }
.ya-demo-pic{
  display:block; width:100%; height:auto; aspect-ratio:240 / 120;
  border-radius:var(--shape-m); background:var(--surface-container-low);
}
.ya-demo-quiz__q{ margin:0 0 var(--sp-3); font:var(--type-title-m, 600 18px/24px var(--ya-font-display)); color:var(--on-surface); }
.ya-demo-quiz__var{ display:flex; flex-direction:column; gap:var(--sp-2); }
.ya-demo-quiz__btn{ justify-content:flex-start; text-align:left; width:100%; }
.ya-demo-quiz__btn--ok,
.ya-demo-quiz__btn--reveal{
  border-color:var(--ok); color:var(--ok); background:color-mix(in srgb, var(--ok) 12%, var(--surface-container-lowest));
}
.ya-demo-quiz__btn--bad{
  border-color:var(--error, var(--book-sutki)); color:var(--error, var(--book-sutki));
  background:color-mix(in srgb, var(--error, var(--book-sutki)) 10%, var(--surface-container-lowest));
}
.ya-demo-quiz__fb{ margin:var(--sp-3) 0 0; font:var(--type-body-s); line-height:1.45; }
.ya-demo-quiz__fb--ok{ color:var(--ok); }
.ya-demo-quiz__fb--bad{ color:var(--error, var(--book-sutki)); }

/* Сетка демо-переворотов = .ya-karty; сами карты — .ya-karta (3D). */
.ya-demo-flip.ya-karty{ gap:var(--sp-3); }
.ya-demo-flip__ikon{
  width:48px; height:48px; display:flex; align-items:center; justify-content:center;
  background:transparent; margin:0 auto 4px;
}
.ya-demo-flip__ikon svg{ width:36px; height:36px; }
.ya-demo-flip__after{ margin:var(--sp-4) 0 0; font:var(--type-body-m); line-height:1.5; color:var(--on-surface); }

.ya-demo-pattern{ display:flex; flex-direction:column; gap:var(--sp-4); align-items:stretch; }
.ya-demo-pattern__grid{
  display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-3);
}
@media (max-width:480px){ .ya-demo-pattern__grid{ grid-template-columns:1fr; } }
.ya-demo-pattern__card{
  border:1px solid var(--outline-variant); border-radius:var(--shape-l);
  background:var(--surface-container-lowest); overflow:hidden;
}
.ya-demo-pattern__ris{
  /* 2:1 как viewBox 220×110 — без slice-кропа семян у широкой карточки */
  aspect-ratio:2 / 1;
  height:auto;
  background:var(--surface-container-low);
  position:relative; overflow:hidden;
}
.ya-demo-pattern__ris svg{ display:block; width:100%; height:100%; }
.ya-demo-pattern__card--uzor .ya-demo-pattern__uzor{
  stroke-dasharray:0.05 0.035;
  stroke-dashoffset:0;
  animation:ya-demo-uzor-draw .9s var(--ease-emphasized-decel, ease-out) both;
}
@keyframes ya-demo-uzor-draw{
  from{ stroke-dashoffset:1; }
  to{ stroke-dashoffset:0; }
}
@media (prefers-reduced-motion:reduce){
  .ya-demo-pattern__card--uzor .ya-demo-pattern__uzor{ animation:none; }
}
html[data-dvizhenie="off"] .ya-demo-pattern__card--uzor .ya-demo-pattern__uzor{ animation:none; }

.ya-demo-pattern__txt{
  padding:var(--sp-3); display:flex; flex-direction:column; gap:4px; text-align:center;
}
.ya-demo-pattern__txt strong{
  font:var(--type-title-m);
  font-weight:700;
  color:var(--on-surface);
}
.ya-demo-pattern__txt span{
  font:var(--type-title-s);
  font-weight:700;
  color:var(--on-surface-variant);
}
.ya-demo-pattern__after{
  font:var(--type-body-m); line-height:1.55; color:var(--on-surface); text-align:left;
}

.ya-demo-granit{
  position:relative; display:block; width:100%; padding:0; border:none;
  background:transparent; cursor:pointer; border-radius:var(--shape-l); overflow:hidden;
}
.ya-demo-granit__svg{ display:block; width:100%; height:auto; }
.ya-demo-granit__shema{
  transition:filter .55s var(--ease-emphasized-decel, ease-out);
}
.ya-demo-granit:not(.ya-demo-granit--open) .ya-demo-granit__shema{ filter:blur(6px); }
.ya-demo-granit--open .ya-demo-granit__shema{ filter:blur(0); }
@media (prefers-reduced-motion:reduce){
  .ya-demo-granit__shema{ transition:none; }
}
html[data-dvizhenie="off"] .ya-demo-granit__shema{ transition:none; }
.ya-demo-granit__lock{
  position:absolute; inset:0; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:var(--sp-2);
  color:var(--reader-sheet); text-align:center; padding:var(--sp-4);
}
.ya-demo-granit__lock-t{ font:var(--type-title-m, 600 18px/24px var(--ya-font-display)); }
.ya-demo-granit__lock-h{ font:var(--type-body-s); opacity:.9; }
.ya-demo-granit--open{ cursor:default; }
.ya-demo-granit__txt{ margin-top:var(--sp-4); font:var(--type-body-m); line-height:1.55; color:var(--on-surface); }
.ya-demo-granit__txt p{ margin:0 0 var(--sp-3); }
.ya-demo-granit__txt h3{ margin:0 0 var(--sp-2); }

.ya-demo-want{
  display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-3);
}
@media (max-width:480px){ .ya-demo-want{ grid-template-columns:1fr; } }
.ya-demo-want__btn{
  display:flex; flex-direction:column; align-items:center; gap:var(--sp-2);
  padding:var(--sp-4); border:1px solid var(--outline-variant); border-radius:var(--shape-l);
  background:var(--surface-container-lowest); color:var(--on-surface); cursor:pointer;
  font:var(--type-title-s, 600 16px/22px var(--ya-font-display));
}
.ya-demo-want__btn--on{
  border-color:var(--primary); background:var(--primary-container); color:var(--on-primary-container);
}
.ya-demo-want__ikon{
  width:40px; height:40px; display:flex; align-items:center; justify-content:center;
  background:transparent; border-radius:0;
}
.ya-demo-want__fb{ margin:var(--sp-4) 0 0; font:var(--type-body-m); line-height:1.5; color:var(--on-surface); }

.ya-demo-plan__stats{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:var(--sp-2);
  margin-bottom:var(--sp-4);
}
@media (max-width:480px){ .ya-demo-plan__stats{ grid-template-columns:1fr 1fr; } }
.ya-demo-plan__stat{
  text-align:center; padding:var(--sp-3); border-radius:var(--shape-m);
  background:var(--surface-container-low); border:1px solid var(--outline-variant);
}
.ya-demo-plan__stat strong{
  display:block; font:var(--type-headline-s, 600 22px/28px var(--ya-font-display)); color:var(--on-surface);
}
.ya-demo-plan__stat span{ font:var(--type-title-s); font-weight:700; color:var(--on-surface-variant); }
.ya-demo-plan__pillars{ display:flex; flex-direction:column; gap:var(--sp-3); }
.ya-demo-plan__pillar{
  display:grid;
  grid-template-columns:auto 1fr;
  column-gap:var(--sp-3);
  align-items:start;
  padding:var(--sp-4); border-radius:var(--shape-l);
  border:1px solid var(--outline-variant);
}
.ya-demo-plan__pillar--workshop{
  background:var(--primary-container); color:var(--on-primary-container);
}
.ya-demo-plan__pillar--sky{
  background:var(--secondary-container); color:var(--on-secondary-container);
}
.ya-demo-plan__pillar--thing{
  background:var(--tertiary-container); color:var(--on-tertiary-container);
}
.ya-demo-plan__ikon{
  width:40px; height:40px; display:flex; align-items:center; justify-content:center;
  flex-shrink:0; line-height:0;
}
.ya-demo-plan__ikon svg{ display:block; width:36px; height:36px; }
.ya-demo-plan__pillar-txt{ min-width:0; }
.ya-demo-plan__pillar strong{
  display:block; margin-bottom:var(--sp-2);
  font:var(--type-title-m);
  font-weight:700;
  font-style:normal;
}
.ya-demo-plan__pillar--workshop strong{ color:var(--primary); }
.ya-demo-plan__pillar--sky strong{ color:var(--primary); }
.ya-demo-plan__pillar--thing strong{ color:var(--ogon-konchik); }
.ya-demo-plan__pillar p{
  margin:0; font:var(--type-body-s); line-height:1.45;
  color:inherit; opacity:.9;
}

.ya-demo-faq{ display:flex; flex-direction:column; gap:var(--sp-2); }
.ya-demo-faq__item{
  border:1px solid var(--outline-variant); border-radius:var(--shape-m);
  background:var(--surface-container-lowest); overflow:hidden;
}
.ya-demo-faq__q{
  width:100%; display:flex; justify-content:space-between; align-items:center; gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4); border:none; background:transparent; cursor:pointer;
  font:var(--type-title-s, 600 16px/22px var(--ya-font-display)); color:var(--on-surface); text-align:left;
}
.ya-demo-faq__plus{ font:var(--type-title-m); color:var(--primary); }
.ya-demo-faq__a{
  margin:0; padding:0 var(--sp-4) var(--sp-4);
  font:var(--type-body-m); line-height:1.5; color:var(--on-surface-variant);
}

/* ═══ ЯРЛЫК · .ya-yarlyk ═══════════════════════════════════════════════
   ЗАЧЕМ. Статус занятия/сущности («готовится», «прохожу», «готово») рисовался
   локально (.kr-yarlyk на kurs.html) и не жил в SoT. Ярлык — короткая pill-
   плашка рядом с именем, не кнопка и не фишка.

   НЕ ПУТАТЬ с .ya-vhod__yarlyk — тот eyebrow входа урока (uppercase-подпись),
   а не status-pill.

     <span class="ya-yarlyk">готовится</span>
     <span class="ya-yarlyk ya-yarlyk--hod">прохожу</span>
     <span class="ya-yarlyk ya-yarlyk--gotovo">готово</span>
     <span class="ya-yarlyk ya-yarlyk--vnimanie">осторожно</span>
*/
.ya-yarlyk{
  display:inline-block;box-sizing:border-box;
  padding:var(--sp-1) var(--sp-2);border-radius:var(--shape-full);
  background:var(--secondary-container);color:var(--on-secondary-container);
  font:var(--type-label-s);line-height:1.25;vertical-align:middle;
  white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.ya-yarlyk--hod{
  background:var(--primary-container);color:var(--on-primary-container)}
.ya-yarlyk--gotovo{
  background:var(--ok-container);color:var(--on-ok-container)}
.ya-yarlyk--vnimanie{
  background:var(--tertiary-container);color:var(--on-tertiary-container)}
/* Беда: правка, которая уберёт вопрос при публикации. Не путать со
   «вниманием» — то про несохранённое, это про необратимое. */
.ya-yarlyk--beda{
  background:var(--error-container);color:var(--on-error-container)}

/* ═══ ПОЛОСА · .ya-polosa ═══════════════════════════════════════════════
   ЗАЧЕМ. Линейная метрика «N из M» на хабе/курсе жила как .dr-put-polosa.
   Шагомер (.ya-shagi) — маршрут со словами шага; полоса — только доля и счёт.
   Слова главные: полоса вторична и стоит рядом, не вместо текста.

     <div class="ya-polosa">
       <p class="ya-polosa__schet"><span class="ya-polosa__n">16</span> из
         <span class="ya-polosa__m">42</span></p>
       <div class="ya-polosa__zhelob" role="progressbar" aria-valuemin="0"
            aria-valuemax="42" aria-valuenow="16" aria-label="16 из 42">
         <span class="ya-polosa__zaliv" style="--ya-dolya:38%"></span>
       </div>
     </div>
*/
.ya-polosa{display:block;min-width:0}
.ya-polosa__schet{
  margin:0 0 var(--sp-1);font:var(--type-label-m);color:var(--on-surface-variant);
  overflow-wrap:anywhere}
.ya-polosa__n{font-weight:700;color:var(--on-surface)}
.ya-polosa__m{font-weight:600;color:var(--on-surface)}
.ya-polosa__zhelob{
  display:block;height:6px;border-radius:var(--shape-full);
  background:var(--surface-container-high);overflow:hidden}
.ya-polosa__zaliv{
  display:block;height:100%;width:var(--ya-dolya,0%);min-width:0;
  border-radius:inherit;background:var(--primary);
  transition:width var(--dur-medium) var(--ease-standard)}
.ya-polosa--tonal .ya-polosa__zaliv{background:var(--secondary)}

/* ═══ КРОШКА · .ya-kroshka ══════════════════════════════════════════════
   ЗАЧЕМ. Хлебные крошки на kurs.html были локальным .kr-kroshka. Общий блок
   для kurs / lesson / админ-оболочек. В оболочке приложения возврат уже даёт
   стрелка — там крошку можно скрыть (см. body[data-yk-tip]).

     <nav class="ya-kroshka" aria-label="Где ты">
       <a href="learn.html"><span class="ya-ik ya-ik--18 ya-ik--nazad" aria-hidden="true"></span>Уроки</a>
       <span class="ya-kroshka__sep" aria-hidden="true">·</span>
       <span aria-current="page">Костёр</span>
     </nav>
*/
.ya-kroshka{
  display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  font:var(--type-label-l);color:var(--on-surface-variant)}
.ya-kroshka a{
  display:inline-flex;align-items:center;gap:2px;min-height:var(--cel-min);
  color:var(--primary);text-decoration:none;border-radius:var(--shape-s)}
.ya-kroshka a:hover{text-decoration:underline}
.ya-kroshka a:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
.ya-kroshka [aria-current]{color:var(--on-surface-variant);font-weight:600}
.ya-kroshka__sep{opacity:.7;user-select:none}
body[data-yk-tip] .ya-kroshka{display:none}

/* ═══ ВКЛАДКИ · .ya-vkladki ═════════════════════════════════════════════
   ЗАЧЕМ. Page-tabs со счётчиком («Занятия · 12») жили только в админке как
   .ad-tabs. Это НЕ .ya-perekl: переключатель меняет вид того же экрана
   (aria-pressed); вкладки уводят к другому разделу (role=tablist/tab).

     <div class="ya-vkladki" role="tablist" aria-label="Разделы">
       <button class="ya-vkladki__vklad" type="button" role="tab" aria-selected="true"
               id="tab-z" aria-controls="panel-z">
         Занятия<span class="ya-vkladki__schet">12</span>
       </button>
       <button class="ya-vkladki__vklad" type="button" role="tab" aria-selected="false"
               id="tab-m" aria-controls="panel-m">
         Материалы<span class="ya-vkladki__schet">3</span>
       </button>
     </div>
*/
.ya-vkladki{
  display:flex;flex-wrap:wrap;align-items:stretch;gap:0;
  border-bottom:1px solid var(--outline-variant);min-width:0}
.ya-vkladki__vklad{
  box-sizing:border-box;appearance:none;margin:0;
  display:inline-flex;align-items:center;gap:var(--sp-2);
  min-height:var(--cel-min);padding:var(--sp-2) var(--sp-3);
  font:var(--type-label-l);color:var(--on-surface-variant);
  background:transparent;border:none;
  border-bottom:2px solid transparent;margin-bottom:-1px;
  cursor:pointer;border-radius:var(--shape-s) var(--shape-s) 0 0}
.ya-vkladki__vklad:hover{color:var(--on-surface);background:var(--surface-container-low)}
.ya-vkladki__vklad:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
.ya-vkladki__vklad[aria-selected="true"]{
  color:var(--primary);font-weight:700;border-bottom-color:var(--primary)}
.ya-vkladki__schet{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:1.5em;padding:0 var(--sp-1);border-radius:var(--shape-full);
  font:var(--type-label-s);font-weight:700;
  color:var(--on-surface-variant);background:var(--surface-container-high)}
.ya-vkladki__vklad[aria-selected="true"] .ya-vkladki__schet{
  color:var(--on-primary);background:var(--primary)}

/* ═══ ПРОДОЛЖИТЬ · .ya-prodolzhit ═══════════════════════════════════════
   ЗАЧЕМ. Блок «Моё обучение» на learn.html жил локально (.dr-put / .dr-prod).
   SoT: путь (счёт + полоса с искрой) и дверь в следующий урок.
   Виды: --pust / --hod / --konec (+ --est / --poln). Дверь: __dver;
   без адреса — __dver--vybor; клеймо «Продолжить» — __dver--hod.
   Анимации полосы — когда на предке .dr-zhivo (ставит learn.html).
*/
/* ─── «МОЁ ОБУЧЕНИЕ» ──────────────────────────────────────────────────
   Один тональный сосуд: тихий статус, полоса, внутри — плитка следующего
   шага. Плитка раньше была приклеена отрицательным полем к низу карточки
   и читалась подвалом, а не дверью. Теперь у неё зазор, свой радиус и
   своя заливка — как у выбранного занятия в дереве.

   Три вида:
     --pust  ещё не трогали: плитка тихая, без двери (ko0 не утверждён)
     --hod   идут: «Продолжить» (начатое) или «Дальше» (следующее)
     --konec открытых занятий не осталось: дверь в свой круг

   Процентов на экране нет: полоса и «4 из 82». Слова для чтеца — в
   aria-label полосы. Счёт стоит всегда, включая ноль. */
.ya-prodolzhit { margin: 10px 0 0; padding: var(--sp-4, 16px); border-radius: var(--shape-l, 16px);
  background:
    linear-gradient(180deg,
      color-mix(in srgb, var(--primary) 7%, var(--surface-container)) 0%,
      var(--surface-container) 42%);
  border: 0; }
.ya-prodolzhit__ryad { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; }
.ya-prodolzhit__zag { flex: 0 0 auto; font: var(--type-label-s, 500 12px/16px inherit);
  letter-spacing: var(--track-label, .08em); text-transform: uppercase;
  color: var(--on-surface-variant); }
.ya-prodolzhit__schet { flex: 1 1 auto; min-width: 4.5em; text-align: right;
  font: var(--type-label-l, 600 14px/20px inherit); color: var(--on-surface);
  font-variant-numeric: tabular-nums; }
.ya-prodolzhit__polosa { position: relative; height: 8px; margin: 10px 0 12px; border-radius: 999px;
  background: var(--outline-variant); }
.ya-prodolzhit__polosa i { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: 999px;
  overflow: hidden;
  background:
    linear-gradient(180deg, color-mix(in srgb, var(--inverse-on-surface) 38%, transparent) 0%, transparent 52%),
    linear-gradient(90deg,
      var(--ya-cta, var(--primary)) 0%,
      var(--primary) 48%,
      color-mix(in srgb, var(--primary) 52%, var(--inverse-on-surface)) 100%); }
.ya-prodolzhit__polosa i::before { content: ''; position: absolute; inset: 0; border-radius: inherit;
  background: linear-gradient(90deg,
    transparent 0%,
    color-mix(in srgb, var(--on-primary) 45%, transparent) 50%,
    transparent 100%);
  pointer-events: none; }
.ya-prodolzhit__iskra { position: absolute; top: 50%; left: 0; width: 10px; height: 10px;
  border-radius: 50%; transform: translate(-50%, -50%);
  background: var(--inverse-on-surface);
  box-shadow: 0 0 10px color-mix(in srgb, var(--primary) 60%, transparent);
  opacity: 0; pointer-events: none; z-index: 1; }
/* ИСКРА — ГОЛОВА ПОЛОСЫ, А НЕ ДЫРА В НЕЙ (19.09.2026). Роль
   --inverse-on-surface переворачивается вместе с темой (#F0F1F3 против
   #1A1D21), а замысел «искра — самое светлое на полосе» не переворачивается:
   в тёмной искра выходила темнее и заливки, и жёлоба, и на «73 из 73» на
   конце полосы стояла чёрная выемка. В тёмной берём светлую роль темы. */
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]) .ya-prodolzhit__iskra { background: var(--on-surface); } }
:root[data-theme="dark"] .ya-prodolzhit__iskra { background: var(--on-surface); }
/* Полоса и кольца ПРОРИСОВЫВАЮТСЯ при загрузке: путь растёт, и это единственное
   движение, которое здесь что-то значит. Класс .dr-zhivo вешает скрипт кадром
   позже первого рендера — иначе перехода нет, значение уже стоит. */
.dr-zhivo .ya-prodolzhit__polosa i { width: var(--cel, 0%); }
.dr-zhivo .ya-prodolzhit--est .ya-prodolzhit__iskra { left: var(--cel, 0%); opacity: 1; }
.ya-prodolzhit--pust .ya-prodolzhit__iskra { display: none; }

/* Плитка шага — вложенный сосуд, не подвал. Цель касания — вся плитка. */
.ya-prodolzhit__dver { display: flex; align-items: center; gap: 12px; width: 100%;
  box-sizing: border-box; min-height: var(--cel-min, 48px);
  text-align: left; text-decoration: none; cursor: pointer;
  margin: 0; padding: 12px;
  border: 0; border-radius: var(--shape-m, 12px);
  background: var(--ya-selected-fill);
  box-shadow: inset 0 0 0 1.5px var(--ya-selected-stroke); color: inherit; }
.ya-prodolzhit__dver:hover { box-shadow: inset 0 0 0 1.5px var(--ya-selected-stroke), var(--ya-selected-glow); }
.ya-prodolzhit__dver:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.ya-prodolzhit__dver--vybor { cursor: default; background: var(--surface-container-high);
  box-shadow: none; }
.ya-prodolzhit__dver--vybor:hover { box-shadow: none; }
.ya-prodolzhit__znak { flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--primary) 16%, transparent);
  color: var(--primary); }
.ya-prodolzhit__znak .ya-ik { width: 18px; height: 18px; vertical-align: 0; }
.ya-prodolzhit--pust .ya-prodolzhit__znak { background: var(--surface-container-highest);
  color: var(--on-surface-variant); }
.ya-prodolzhit--konec .ya-prodolzhit__znak { background: color-mix(in srgb, var(--primary) 18%, transparent);
  color: var(--primary); }
.ya-prodolzhit__tekst { flex: 1; min-width: 0; }
.ya-prodolzhit__metka { display: inline-flex; align-items: center; height: 20px;
  padding: 0 8px; margin-bottom: 4px; border-radius: var(--shape-full, 999px);
  font: var(--type-label-s, 500 12px/16px inherit); letter-spacing: normal;
  text-transform: none; color: var(--ya-selected-meta);
  background: color-mix(in srgb, var(--primary) 12%, transparent); }
.ya-prodolzhit--pust .ya-prodolzhit__metka { color: var(--on-surface-variant);
  background: var(--surface-container-highest); }
.ya-prodolzhit__imya { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; font: var(--type-title-m, 600 16px/24px inherit);
  color: var(--ya-selected-on, var(--on-surface)); }
.ya-prodolzhit--pust .ya-prodolzhit__imya { color: var(--on-surface); }
.ya-prodolzhit__pod { display: block; margin-top: 2px; font: var(--type-body-s, 400 13px/18px inherit);
  color: var(--on-surface-variant);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ya-prodolzhit--pust .ya-prodolzhit__pod,
.ya-prodolzhit--konec .ya-prodolzhit__pod { white-space: normal; }
.ya-prodolzhit__strelka { flex: 0 0 auto; display: flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; color: var(--ya-selected-meta); }
.ya-prodolzhit__strelka .ya-ik { width: 18px; height: 18px; }



html[data-dvizhenie="on"] .ya-prodolzhit__polosa > i {
  transition: width .7s var(--ease-emphasized-decel, cubic-bezier(.05,.7,.1,1));
}
html[data-dvizhenie="on"] .ya-prodolzhit__iskra {
  transition: left .7s var(--ease-emphasized-decel, cubic-bezier(.05,.7,.1,1));
}
html[data-dvizhenie="on"] .dr-zhivo .ya-prodolzhit__dver {
  animation: ya-prodolzhit-v var(--dur-medium) var(--ease-emphasized-decel, cubic-bezier(.05,.7,.1,1)) both;
}
html[data-dvizhenie="on"] .dr-zhivo .ya-prodolzhit--est .ya-prodolzhit__polosa > i::before {
  animation: ya-prodolzhit-blesk 1.1s var(--ease-emphasized-decel, cubic-bezier(.05,.7,.1,1)) .55s 1 both;
}
html[data-dvizhenie="on"] .dr-zhivo .ya-prodolzhit--hod.ya-prodolzhit--est:not(.ya-prodolzhit--poln) .ya-prodolzhit__iskra {
  animation: ya-prodolzhit-iskra 2.8s var(--ease-standard, ease) infinite;
}
html[data-dvizhenie="on"] .dr-zhivo .ya-prodolzhit__dver--hod .ya-prodolzhit__znak {
  animation: ya-prodolzhit-dyhanie 2.6s var(--ease-standard, ease) infinite;
}
@keyframes ya-prodolzhit-v { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes ya-prodolzhit-blesk {
  from { opacity: 0; transform: translateX(-70%); }
  40% { opacity: 1; }
  to { opacity: 0; transform: translateX(130%); }
}
@keyframes ya-prodolzhit-iskra {
  0%, 100% { box-shadow: 0 0 6px color-mix(in srgb, var(--primary) 40%, transparent); }
  50% { box-shadow: 0 0 12px 3px color-mix(in srgb, var(--primary) 28%, transparent); }
}
@keyframes ya-prodolzhit-dyhanie {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--primary) 30%, transparent); }
}
/* ↑ Скобка закрыта 06.10.2026: без неё браузер глотал ВСЁ, что ниже
   (.ya-glavy, .ya-svodka, .ya-reestr, блоки курса). Страж — tests/css-skobki.spec.mjs. */


/* ═══ ГЛАВЫ · .ya-glavy ═════════════════════════════════════════════════
   ЗАЧЕМ. Оглавление курса в плеере: список занятий ветви, текущее отмечено.
   На узком — складка/лист; на широком — та же колонка, без sidebar 444.
   Не путать с TocBlock внутри урока («что в этом занятии»).

     <nav class="ya-glavy" aria-label="Занятия курса">
       <a class="ya-glavy__punkt" href="lesson.html?lesson=ys1">Ясна и Веда</a>
       <a class="ya-glavy__punkt ya-glavy__punkt--now" href="lesson.html?lesson=ys2" aria-current="page">Где у суток шов</a>
       <span class="ya-glavy__punkt ya-glavy__punkt--skor">Готовится</span>
     </nav>
*/
.ya-glavy{
  display:flex;flex-direction:column;gap:2px;
  margin:0;padding:var(--sp-2) 0;list-style:none}
.ya-glavy__zag{
  margin:0 0 var(--sp-2);padding:0 var(--sp-3);
  font:var(--type-label-m);letter-spacing:var(--track-label);
  text-transform:uppercase;color:var(--on-surface-variant)}
.ya-glavy__punkt{
  display:flex;align-items:center;gap:var(--sp-2);
  min-height:var(--cel-min,48px);padding:var(--sp-2) var(--sp-3);
  border-radius:var(--shape-m,12px);
  font:var(--type-body-m);color:var(--on-surface);text-decoration:none;
  border:0;background:transparent;text-align:left;cursor:pointer;
  box-sizing:border-box;width:100%;overflow-wrap:anywhere}
a.ya-glavy__punkt:hover{background:var(--surface-container-low)}
a.ya-glavy__punkt:focus-visible{outline:2px solid var(--primary);outline-offset:2px}
.ya-glavy__punkt--now{
  background:var(--secondary-container);color:var(--on-secondary-container);
  font-weight:600;cursor:default}
.ya-glavy__punkt--now:hover{background:var(--secondary-container)}
.ya-glavy__punkt--skor{
  color:var(--on-surface-variant);cursor:default}
.ya-glavy__punkt--skor:hover{background:transparent}
.ya-glavy__meta{
  flex:0 0 auto;margin-left:auto;
  font:var(--type-label-s);color:var(--on-surface-variant);white-space:nowrap}
.ya-glavy__punkt--now .ya-glavy__meta{color:var(--on-secondary-container)}
/* Лист поверх урока (мобильный / из меню). */
.ya-glavy-list{
  position:fixed;inset:0;z-index:160;display:flex;flex-direction:column;
  justify-content:flex-end;background:color-mix(in srgb, var(--scrim, #000) 40%, transparent)}
.ya-glavy-list__kart{
  max-height:min(72vh,560px);overflow:auto;
  background:var(--surface-container-lowest);
  border-radius:var(--shape-l,16px) var(--shape-l,16px) 0 0;
  padding:var(--sp-3) var(--sp-2) calc(var(--sp-4) + env(safe-area-inset-bottom,0px));
  box-shadow:0 -8px 28px color-mix(in srgb, var(--on-surface) 12%, transparent)}
.ya-glavy-list__shapka{
  display:flex;align-items:center;gap:var(--sp-2);
  padding:var(--sp-2) var(--sp-3) var(--sp-3);
  border-bottom:1px solid var(--outline-variant)}
.ya-glavy-list__imya{flex:1;min-width:0;font:var(--type-title-m);color:var(--on-surface)}
@media (min-width:768px){
  .ya-glavy-list{justify-content:center;align-items:center;padding:var(--sp-6)}
  .ya-glavy-list__kart{
    width:min(420px,100%);max-height:min(70vh,640px);
    border-radius:var(--shape-l,16px);box-shadow:0 12px 40px color-mix(in srgb, var(--on-surface) 18%, transparent)}
}


/* ═══ СВОДКА · .ya-svodka ═══════════════════════════════════════════════
   ЗАЧЕМ. Плитка метрики (число + подпись) в админке была .ad-stat/.ad-stats.
   Не KPI CSAT/NPS — только плотность «N изменений / M черновиков».

     <div class="ya-svodka">
       <div class="ya-svodka__plitka"><strong class="ya-svodka__n">12</strong>
         <span class="ya-svodka__pod">изменений</span></div>
     </div>
*/
.ya-svodka{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:baseline;
  padding:var(--sp-2) var(--sp-3);border-radius:var(--shape-m,12px);
  background:var(--surface-container);color:var(--on-surface-variant);
  font:var(--type-label-l)}
.ya-svodka__plitka{display:inline-flex;align-items:baseline;gap:6px}
.ya-svodka__n{font:var(--type-title-m);color:var(--on-surface);font-variant-numeric:tabular-nums}
.ya-svodka__pod{font:var(--type-label-m);color:var(--on-surface-variant)}

/* ═══ РЕЕСТР · .ya-reestr ═══════════════════════════════════════════════
   ЗАЧЕМ. Таблица/грид данных админки. НЕ .ya-tablica (механика урока).

     <div class="ya-reestr-wrap"><table class="ya-reestr">…</table></div>
*/
.ya-reestr-wrap{overflow:auto;border:1px solid var(--outline-variant);
  border-radius:var(--shape-m,12px);background:var(--surface-container-lowest)}
.ya-reestr{width:100%;border-collapse:collapse;font:var(--type-body-s);
  color:var(--on-surface)}
.ya-reestr th,.ya-reestr td{
  padding:10px 12px;text-align:left;vertical-align:top;
  border-bottom:1px solid var(--outline-variant)}
.ya-reestr th{font:var(--type-label-m);letter-spacing:var(--track-label);
  text-transform:uppercase;color:var(--on-surface-variant);
  background:var(--surface-container-low);white-space:nowrap}
.ya-reestr tr:last-child td{border-bottom:0}
.ya-reestr--plotno th,.ya-reestr--plotno td{padding:6px 10px}
.ya-btn--opasno{color:var(--error);border-color:color-mix(in srgb,var(--error) 35%,transparent);
  background:var(--surface-container-lowest)}
.ya-btn--opasno:hover:not(:disabled){background:color-mix(in srgb,var(--error) 10%,transparent)}

/* ── БЛОКИ КУРСА (06.10.2026) ─────────────────────────────────────────────
   Курс сеткой блоков (learn.html, блокиHTML): блок — складка с шапкой той же
   роли, что имя темы (--type-title-m), под ней тихая строка состояния. Между
   блоками — волосок роли --outline-variant. Ненаписанный блок: шапка
   приглушена, справа одно тихое «готовится» (слово «скоро» запрещено проверкой «обещания», scripts/proverki.mjs); строки внутри — неактивные: текст
   и номер цветом --on-surface с прозрачностью --state-disabled-content
   (роль «недоступно» дизайн-системы), без наведения, без руки-курсора. Никаких
   серых плашек: тот же лист, только тише. */
.dr-blok { margin: 0; }
.dr-blok + .dr-blok { border-top: 1px solid var(--outline-variant); }
.dr-kurs--bloki .dr-stvol { margin-top: var(--sp-2, 8px); }
.dr-blok-knop { display: grid; grid-template-columns: minmax(0, 1fr) auto 24px; column-gap: 12px; align-items: center;
  min-height: 56px; padding: 10px 8px; margin: 0 -8px; cursor: pointer; list-style: none;
  border-radius: var(--shape-s, 8px); }
.dr-blok-knop::-webkit-details-marker { display: none; }
.dr-blok-knop:hover { background: color-mix(in srgb, var(--on-surface) 6%, transparent); }
.dr-blok-knop:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
.dr-blok[open] > .dr-blok-knop .dr-shevron { transform: rotate(180deg); }
.dr-blok-tekst { min-width: 0; }
.dr-blok-imya { display: block; font: var(--type-title-m, 600 16px/24px inherit); color: var(--on-surface); }
.dr-blok-pod { display: block; margin-top: 1px; font: var(--type-body-s, 400 13px/18px inherit); color: var(--on-surface-variant); }
.dr-blok--skoro .dr-blok-imya { color: var(--on-surface-variant); }
.dr-blok-skoro { font: var(--type-label-s, 500 12px/16px inherit); color: var(--on-surface-variant); }
.dr-blok-telo { padding: 0 0 8px; }
.dr-blok-telo > .dr-proba { margin-top: 0; }
.dr-blok-telo > .dr-kurs-zamok { margin-top: 0; }
.dr-uzel--skoro, .ya-urok.dr-uzel--skoro { cursor: default; }
.dr-uzel--skoro:hover, .ya-urok.dr-uzel--skoro:hover { background: none; }
.dr-uzel--skoro .dr-uzel-imya, .dr-uzel--skoro .dr-uzel-znak, .dr-uzel--skoro .dr-uzel-mera {
  color: var(--on-surface); opacity: var(--state-disabled-content, .38); }
.dr-uzel-skoro-znak { width: 14px; height: 14px; }
.dr-kolco-chislo--uzko { font-size: 11px; letter-spacing: -.04em; }
html[data-dvizhenie="off"] .dr-blok-knop .dr-shevron { transition: none; }

/* ═══ ПАНЕЛЬ · .ya-panel + __verh, __dela ═════════════════════════════════
   Рабочая поверхность админки: вопросы темы, черновики, заявка, уроки на
   сервере. Нижняя поверхность и волосок, радиус карточки. __verh — ряд над
   содержимым: слева, что это (счёт, имя), справа действия (__dela); на узком
   экране ряд переносится, кнопки не сжимаются. Панели подряд — с зазором.
     <section class="ya-panel">
       <div class="ya-panel__verh"><span>…</span>
         <span class="ya-panel__dela">…кнопки…</span></div>
       …строки .ya-stroka--tiho…
     </section> */
.ya-panel{
  box-sizing:border-box; min-width:0; padding:var(--sp-4);
  background:var(--surface-container-lowest); color:var(--on-surface);
  border:1px solid var(--outline-variant); border-radius:var(--shape-l);
}
.ya-panel + .ya-panel{ margin-top:var(--sp-3); }
.ya-panel__verh{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:var(--sp-2) var(--sp-3); margin-bottom:var(--sp-4);
  font:var(--type-body-m); color:var(--on-surface);
}
.ya-panel__dela{ display:flex; flex-wrap:wrap; gap:var(--sp-2); }
/* Сноска под содержимым панели: как устроено то, что выше (куда уходят
   правки). Отделена волоском, кеглем подписи. */
.ya-panel__pod{
  margin:var(--sp-3) 0 0; padding:var(--sp-3) var(--sp-2) 0;
  border-top:1px solid var(--outline-variant);
  font:var(--type-body-s); color:var(--on-surface-variant);
}

/* ═══ ВАРИАНТЫ ОТВЕТА · .ya-varianty + __ryad, __znak ═════════════════════
   Правка вопроса: в строке отметка верного (радио — один верный, флажок —
   несколько), поле варианта и «×». Отметка родная, окрашена accent-color:
   это форма редактора, а не экран урока, и родную отметку диктор читает без
   доработки — каждой дают aria-label «Верный — вариант N». Пара соответствий —
   два поля через __znak «↔» в той же строке. Группа живёт внутри .ya-pole:
   метка поля — имя группы (role="group" + aria-labelledby).
     <div class="ya-pole" role="group" aria-labelledby="var-m">
       <span class="ya-pole__metka" id="var-m">Варианты</span>
       <div class="ya-varianty">
         <div class="ya-varianty__ryad"><input type="radio" aria-label="Верный — вариант 1">
           <input class="ya-pole__vvod" aria-label="Вариант 1">
           <button class="ya-btn ya-btn--opasno" aria-label="Убрать вариант 1">×</button></div>
         <button class="ya-btn">+ Добавить вариант</button>
       </div>
     </div> */
.ya-pole > .ya-varianty{ grid-column:1 / -1; }
.ya-varianty{ display:flex; flex-direction:column; gap:var(--sp-2); }
.ya-varianty > .ya-btn{ align-self:flex-start; }
.ya-varianty__ryad{ display:flex; align-items:center; gap:var(--sp-2); }
label.ya-varianty__ryad{ min-height:var(--cel-min); cursor:pointer; font:var(--type-body-l); }
.ya-varianty__ryad > .ya-pole__vvod{ flex:1 1 0; min-width:0; min-height:var(--cel-min); }
.ya-varianty__ryad > input[type=radio],
.ya-varianty__ryad > input[type=checkbox]{
  flex:none; width:20px; height:20px; margin:0;
  accent-color:var(--primary); cursor:pointer;
}
.ya-varianty__znak{ flex:none; color:var(--on-surface-variant); }


/* ═══ Урок 6. Свет нарастает и спадает ═════════════════════════════════
   Те же роли цвета, что у чертежей уроков 4–5: нарастает — ok, спадает —
   book-sutki, ровно — tertiary. Своих красок и теней нет. */
.ya-svet-panel{ display:flex; flex-direction:column; gap:12px; }
.ya-svet-vopros{ display:flex; flex-direction:column; gap:6px; }
.ya-svet-vopros__q{ margin:0; font:var(--type-body-m); color:var(--on-surface-variant); }
.ya-svet-vopros__vremya{ margin:0; font:var(--type-title-m); font-weight:700; color:var(--on-surface); }
.ya-svet-knopki{ display:flex; flex-wrap:wrap; gap:10px; }
.ya-svet-knopki .ya-zov-mesto{ flex:1 1 140px; position:relative; }
.ya-svet-knopki .ya-btn{ width:100%; }
.ya-svet-knopka{ min-height:48px; box-shadow:inset 0 0 0 1px var(--outline); color:var(--on-surface); }
.ya-svet-knopka--mimo{ box-shadow:inset 0 0 0 2px var(--error); color:var(--error); background:var(--error-container); }
.ya-svet-otvet{
  margin:0; padding:12px 14px; border-radius:10px;
  background:var(--surface-container-lowest); border-left:3px solid var(--primary);
  font:var(--type-body-s); line-height:1.55; color:var(--on-surface);
}
.ya-svet-otvet--verno{ border-left-color:var(--ok); }
.ya-svet-otvet--mimo{ border-left-color:var(--error); }
.ya-svet-otvet__kto{ font-weight:700; }
.ya-svet-legenda{ list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:6px 14px; font:var(--type-body-s); color:var(--on-surface-variant); }
.ya-svet-legenda li{ display:inline-flex; align-items:center; gap:6px; }
.ya-svet-legenda__znak{
  display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px;
  border-radius:50%; border:2px solid; background:var(--surface-container-lowest); font-weight:800; font-size:13px; line-height:1;
}
.ya-svet-para{
  padding:12px 14px; border-radius:10px; background:var(--surface-container-lowest);
  border-left:3px solid var(--tertiary);
}
.ya-svet-para__zag{ margin:0 0 4px; font:var(--type-body-m); font-weight:700; color:var(--on-surface); }
.ya-svet-para__tekst{ margin:0; font:var(--type-body-s); line-height:1.55; color:var(--on-surface); }
.ya-svet-spisok{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:6px; }
.ya-svet-spisok__ryad{
  display:flex; gap:10px; align-items:baseline; padding:8px 12px; border-radius:8px;
  background:var(--surface-container); color:var(--on-surface-variant); font:var(--type-body-s);
}
.ya-svet-spisok__ryad--est{ background:var(--tertiary-container); color:var(--on-surface); }
.ya-svet-spisok__nomera{ font-weight:700; white-space:nowrap; min-width:4.2em; }
.ya-svet-luchi{ animation:ya-svet-luchi .45s ease-out both; }
@keyframes ya-svet-luchi{ from{ opacity:0; } to{ opacity:1; } }
@media (prefers-reduced-motion:reduce){ .ya-svet-luchi{ animation:none; } }
html[data-dvizhenie="off"] .ya-svet-luchi{ animation:none; }
.ya-svet-zvezda{ display:grid; grid-template-columns:minmax(0,1.1fr) minmax(220px,.9fr); gap:16px; align-items:center; }
@media (max-width:760px){ .ya-svet-zvezda{ grid-template-columns:1fr; } }
.ya-svet-zvezda__niz{ display:flex; flex-direction:column; gap:10px; }
.ya-svet-zvezda__imya{ margin:0; font:var(--type-title-m); font-weight:700; color:var(--on-surface); }
.ya-svet-grafik svg text{ font-family:inherit; }
.ya-svet-polya{ display:grid; grid-template-columns:1fr; gap:12px; margin:12px 0; }
.ya-svet-pole{ display:flex; flex-direction:column; gap:6px; }
.ya-svet-pole__zag{ font:var(--type-body-m); font-weight:700; color:var(--on-surface); }
.ya-svet-pole textarea{
  font:var(--type-body-m); line-height:1.5; padding:10px 12px; border-radius:8px; resize:vertical;
  border:1px solid var(--outline); background:var(--surface-container-lowest); color:var(--on-surface);
}
.ya-svet-pole textarea:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }
.ya-blok-spisok{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px; }
.ya-blok-spisok__punkt{
  display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:10px;
  background:var(--surface-container); color:var(--on-surface); font:var(--type-body-m);
}
.ya-blok-spisok__punkt--tut{ background:var(--primary-container); box-shadow:inset 0 0 0 1px var(--primary); font-weight:700; }
.ya-blok-spisok__n{
  flex:none; width:28px; height:28px; border-radius:50%; display:inline-flex; align-items:center; justify-content:center;
  background:var(--surface-container-lowest); border:1px solid var(--outline-variant); font-weight:700; font-size:14px;
}
.ya-blok-spisok__punkt--tut .ya-blok-spisok__n{ background:var(--primary); color:var(--on-primary); border-color:var(--primary); }
.ya-blok-spisok__imya{ flex:1; min-width:0; }
.ya-blok-spisok__tut{ font:var(--type-label-s); color:var(--on-primary-container); }
.ya-svet-hit:focus:not(:focus-visible){ outline:none; }
.ya-svet-hit:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }

/* ═══ Ссылка на положение · .ya-pol-ssylka ════════════════════════════════
   Один вид для всех ссылок в учебник внутри урока: в строке текста, под
   отзывом («Открыть · пол. 128»), в чтении («пол. 127 · …») и в словаре.
   Цвет акцента и подчёркивание; номер тем же кеглем и шрифтом, что слово;
   без заливок и чужих цветов. В строке зона нажатия ≥44px — псевдоэлемент. */
.ya-pol-ssylka{
  position:relative;
  /* primary-ink: 5.2:1 и на серых карточках (surface-container), где
     --primary давал 4.0–4.3 (обзор 17.10.2026). В тёмной теме = --primary. */
  color:var(--ya-primary-ink, var(--primary));
  font:inherit;
  font-style:normal;
  font-variant-numeric:lining-nums;
  text-decoration:underline;
  text-decoration-thickness:1px;
  text-underline-offset:3px;
  border-radius:4px;
  cursor:pointer;
}
.ya-pol-ssylka::after{
  content:'';
  position:absolute;
  /* Зона нажатия не меньше 44×44 и у ссылки из одной цифры («42»). */
  left:50%; top:50%;
  width:max(calc(100% + 8px), 44px); height:44px;
  transform:translate(-50%,-50%);
}
.ya-slovar__pol .ya-pol-ssylka{ display:inline-block; padding:0 8px; margin:0 -2px; }
.ya-pol-ssylka:focus-visible{ outline:2px solid var(--primary); outline-offset:2px; }
.ya-pol-ssylka--otdelno{
  display:inline-flex;
  align-items:center;
  min-height:44px;
  font:var(--type-body-m);
  font-style:normal;
  font-variant-numeric:lining-nums;
}
.ya-pol-ssylka--otdelno::after{ content:none; }

/* ═══ Урок 6: места под отклик и текст — ничего не прыгает ════════════════ */
.ya-svet-ris{ max-width:360px; }
@media (max-width:600px){ .ya-svet-ris{ max-width:272px; } }
.ya-svet-otvet-mesto{ min-height:84px; display:flex; flex-direction:column; justify-content:flex-end; }
.ya-luchi-niz{ min-height:168px; }
.ya-svet-para-mesto{ min-height:110px; }
@media (max-width:760px){
  .ya-svet-zvezda__tekst{ min-height:124px; }
}
.ya-svet-zvezda__tekst{ margin:0; }
.ya-svet-snachala{ background:transparent; box-shadow:inset 0 0 0 1px var(--outline); color:var(--primary); }

/* Вводная блока: «сегодня» — значок отдельной строкой под названием. */
.ya-blok-spisok__punkt--tut{ flex-wrap:wrap; }
.ya-blok-spisok__punkt--tut .ya-blok-spisok__tut{
  display:inline-flex; align-items:center; min-height:24px; padding:0 10px; border-radius:999px;
  background:var(--primary); color:var(--on-primary); font:var(--type-label-m); letter-spacing:0;
}
/* Кнопки звезды — в один ряд на любом шаге: «Дальше» и «Сначала» рядом,
   а не друг под другом, — высота блока не меняется. */
.ya-svet-zvezda .ya-svet-knopki{ flex-wrap:nowrap; }
.ya-svet-zvezda .ya-svet-knopki .ya-btn{ width:auto; flex:1 1 0; min-width:0; }
/* Симулятор курса в шапке карточки «Уроков» (learn.html, к.симулятор) */
.dr-kurs-sim { grid-column: 1 / -1; margin-top: var(--sp-3, 12px); }

/* ═══ КУРС-СИМУЛЯТОР · learn.html «Знаки сути» · ритм как /para ═══════════
   Только .dr-kurs--sim: заголовок ближе к --t-h2 лендинга, двери с зазором
   карточек, без изменения остальных курсов. */
.dr-kurs--sim{
  padding:var(--sp-4,16px);
  gap:0;
}
@media (min-width:720px){
  .dr-kurs--sim{ padding:var(--sp-5,20px); }
}
.dr-kurs--sim .dr-kurs-imya{
  /* как .dr-kurs-imya / para H3-шкала, не раздувать до headline-m 26 */
  font:var(--type-headline-s);
  font-weight:600;
  letter-spacing:-.01em;
}
.dr-kurs--sim .dr-kurs-pod{
  margin-top:var(--sp-2,8px);
  font:var(--type-body-m);
  color:var(--on-surface-variant);
}
.dr-kurs--sim .ya-dver--spisok,
.dr-kurs--sim .dr-kurs-sim{
  margin-top:var(--sp-3,12px);
}
.dr-kurs--sim .dr-kurs-podrobno-knop{
  margin-top:var(--sp-3,12px);
  color:var(--ya-primary-ink);
}


/* «Ещё N положений» под двумя первыми карточками длинной цепочки. */
.ya-pol-esche{ min-height:44px; margin:var(--sp-1) 0 var(--sp-2); padding:0 var(--sp-2); }
