/* ── Общая обвязка страниц-спутников ──
   404, оферта, политика, возврат после оплаты. Один файл на все: иначе
   четыре копии разъедутся уже через пару правок.

   Палитра (--bg, --accent-rgb и прочее) остаётся в самой странице — здесь
   только то, что у страниц общее: фон, выбор языка, переключатель темы.
   Требуется от страницы: токены палитры и --grain-op. */

/* Декоративные слои шире экрана намеренно — пятну надо куда-то ходить. Но
   создавать горизонтальную прокрутку они не должны: `.bgwash` прибит к окну и
   не обрезается overflow у body, а `.glow` просто шире экрана. На узком
   телефоне это давало полосу прокрутки в 80 пикселей (замер 15.09). */
html{overflow-x:hidden}
/* Системный квадрат подсветки нажатия на телефоне — прочь (владелец 16.09). */
button,a{-webkit-tap-highlight-color:transparent}

/* ── Фон ──
   Три слоя. Перелив — два мягких пятна, которые очень медленно ходят и
   дышат: 38 секунд на проход, движение замечаешь, только если смотреть
   специально. Точки и зерно — то же, что на главной. */
/* Цвет фона берётся из --st — цвета состояния экрана. Не задан (главная,
   оферта, политика) — остаётся брендовый зелёный. Так экран «не прошло»
   целиком красный, а «в обработке» целиком янтарный, а не зелёный фон с
   красным кольцом посередине (владелец 15.09). */
.bgwash{position:fixed;inset:-25%;z-index:0;pointer-events:none;
  background:
    radial-gradient(38% 34% at 22% 26%, rgb(var(--st,var(--accent-fill-rgb,var(--accent-rgb)))/.15), transparent 70%),
    radial-gradient(34% 30% at 78% 72%, rgb(var(--st,var(--accent-fill-rgb,var(--accent-rgb)))/.11), transparent 70%);
  animation:tsbWash 38s ease-in-out infinite alternate}
@keyframes tsbWash{
  from{transform:translate3d(-3%,-2%,0) scale(1)}
  to{transform:translate3d(3%,2%,0) scale(1.08)}}
#_pcanvas{position:fixed;inset:0;pointer-events:none;z-index:0;opacity:.45}
#_n{position:fixed;inset:0;pointer-events:none;z-index:9998;background-repeat:repeat;opacity:.26}

/* ── Цвет переливается ──
   Двигается не цвет, а положение градиента: он шире элемента, и его медленно
   протягивает насквозь. Браузеру это дёшево — работа идёт на композиции. */
@keyframes tsbFlowX{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
@keyframes tsbFlowY{0%{background-position:50% 0%}50%{background-position:50% 100%}100%{background-position:50% 0%}}

/* ── Перелив кнопок ──
   Владелец 15.09: «не вижу приятного перелива». Двух близких зелёных для
   этого мало — между ними почти нет разницы. Добавлена третья, светлая
   остановка узкой полосой: по кнопке проходит именно блик, а не плавная
   смена оттенка. Селектор с body — чтобы перебить правила .btn самих
   страниц: их стили подключаются после модуля. */
:root{--btn-sheen:#8af0ae}

[data-theme='light']{--btn-sheen:#27b357}
body .btn:not(.ghost){
  background-image:linear-gradient(110deg,
    var(--accent) 32%, var(--btn-sheen) 50%, var(--accent) 68%);
  background-size:280% 100%;
  animation:tsbFlowX 7s ease-in-out infinite}


/* ── Голова парит вместе со стрелками ──
   Парение на обёртке .headfloat (её создаёт tsb-chrome.js), а не на самой
   картинке: стрелки лежат внутри и ходят с головой один в один. Свою
   анимацию у картинки гасим — иначе качалось бы дважды. */
@keyframes tsbBob{0%,100%{transform:translateY(0) rotate(-.5deg)}50%{transform:translateY(-12px) rotate(.4deg)}}
.headfloat{position:relative;animation:tsbBob 6s ease-in-out infinite}
.headbox .head,.headbox img{animation:none!important}
@media (prefers-reduced-motion:reduce){.headfloat{animation:none}}

/* ── Подсказка «голову можно тянуть» ──
   Две залитые стрелки на уровне ушей, с отступом от них в долях ширины
   головы. Своего движения нет — только медленное дыхание прозрачностью.
   Гаснут, пока голову держат, возвращаются через три секунды покоя
   (владелец 16.09; логика в tsb-chrome.js). */
.drag-hint{position:absolute;inset:0 clamp(-48px,-20%,-30px);pointer-events:none;z-index:4;transition:opacity .7s ease}
.drag-hint.off{opacity:0;transition-duration:.25s}
.drag-hint i{position:absolute;top:60%;margin-top:-9px;color:var(--accent);line-height:0;
  animation:tsbBreath 2.6s ease-in-out infinite}
.drag-hint i.l{left:0}
.drag-hint i.r{right:0;animation-delay:1.3s}
@keyframes tsbBreath{0%,100%{opacity:.35}50%{opacity:.9}}
@media (prefers-reduced-motion:reduce){.drag-hint i{animation:none;opacity:.55}}

/* ── Смена темы кругом из точки нажатия ── */
::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}
::view-transition-old(root){z-index:1}
::view-transition-new(root){z-index:2}

/* ── Язык и тема ──
   Без подложки и без логотипа: владелец 14.09 попросил снять плашку, а
   органы управления поднять над содержимым. Ведут себя ровно как в шапке
   главной — код языка с галочкой, по нажатию список названий. */
.tools{display:flex;justify-content:center;align-items:center;gap:10px;
  position:relative;z-index:20}
.langbox{position:relative;display:flex}
.langbtn,.themebtn{height:34px;border-radius:10px;border:1px solid var(--border);background:none;
  cursor:pointer;display:flex;align-items:center;color:var(--text);font-family:inherit;
  transition:border-color .25s,background .25s}
.langbtn{gap:6px;padding:0 9px 0 11px;font-size:12px;font-weight:700;letter-spacing:.04em}
.langbtn:hover,.themebtn:hover{border-color:var(--accent)}
.langbtn[aria-expanded="true"]{border-color:var(--accent);background:var(--surface-2)}
.langbtn svg{transition:transform .28s cubic-bezier(.23,1,.32,1)}
.langbtn[aria-expanded="true"] svg{transform:rotate(180deg)}

/* Имя перехода вынимает кнопку из общего снимка страницы: круг смены темы
   идёт под ней, а иконка в это время перетекает поверх. Без этого солнце
   превращалось бы в луну мгновенно — оно было бы частью снимка. */
.themebtn{width:34px;justify-content:center;padding:0;position:relative;overflow:hidden;
  view-transition-name:themebtn}
.themebtn .ico{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  transition:opacity .5s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.34,1.3,.5,1)}
.themebtn .sun{opacity:1;transform:none}
.themebtn .moon{opacity:0;transform:rotate(-80deg) scale(.5)}

[data-theme='light'] .themebtn .sun{opacity:0;transform:rotate(80deg) scale(.5)}
[data-theme='light'] .themebtn .moon{opacity:1;transform:none}

.menu{position:absolute;top:42px;left:50%;min-width:186px;padding:5px;z-index:400;
  background:var(--bg-soft);border:1px solid var(--border);border-radius:14px;
  box-shadow:0 20px 44px rgba(0,0,0,.42);transform-origin:top center;
  opacity:0;transform:translateX(-50%) translateY(-9px) scale(.95);pointer-events:none;
  transition:opacity .2s cubic-bezier(.16,1,.3,1),transform .3s cubic-bezier(.23,1,.32,1)}
.menu.on{opacity:1;transform:translateX(-50%) translateY(0) scale(1);pointer-events:auto}
.menu button{width:100%;display:flex;align-items:center;gap:11px;padding:10px 11px;border-radius:10px;
  background:transparent;border:none;cursor:pointer;text-align:left;font-family:inherit;
  font-size:13.5px;font-weight:500;color:var(--text-dim);transition:background .2s,color .2s}
.menu button:hover{background:var(--surface)}
.menu button.on{background:var(--surface-2);color:var(--text);font-weight:700}
.menu .mcode{font-size:11px;letter-spacing:.06em;color:var(--text-mute);margin-left:auto}

/* Меню у правого края — для страниц, где органы управления не по центру */
.tools.right .menu{left:auto;right:0;transform-origin:top right;
  transform:translateY(-9px) scale(.95)}
.tools.right .menu.on{transform:translateY(0) scale(1)}

/* ── Палец, а не курсор ──
   Кнопки языка и темы были 34 пикселя. Для мыши хватает, для пальца мало:
   принятый минимум — 44. Растим их там, где указатель неточный, а не по
   ширине экрана: планшет бывает и широким. */
@media (pointer:coarse){
  .langbtn,.themebtn{height:44px}
  .themebtn{width:44px}
  .langbtn{padding:0 12px 0 14px;font-size:13px}
  .menu{top:52px}
  .menu button{padding:13px 12px}
}

@media (prefers-reduced-motion:reduce){
  .bgwash,.themebtn .ico,.langbtn svg,.menu{animation:none!important;transition:none!important}
}
