/* ===== Доработки по фидбеку (слой поверх макета) — Editorial Luxury ===== */

/* --r-ease живёт в style.css :root (единый источник токенов) */

/* --- КНОПКА-ССЫЛКА: цвет ссылки контейнера перебивал белый текст → фикс --- */
a.btn{color:#fff}
a.btn--ghost{color:var(--violet)}

/* --- отступ якорей под липкую шапку (скролл не проскакивает) --- */
/* Анонс остаётся в начале страницы и уезжает с ней: липнет только шапка
   (position:sticky у неё свой, style.css). Раньше липким был весь блок, и
   на прокрутке баннер держал сверху 64px экрана. z-index обёртке нужен и
   в потоке: декорации первого экрана лезут поверх полосы. */
.site-top{position:relative;z-index:var(--z-site-top)}
/* шапка перекрывает контент, пока висит сверху: своего --z-header (50)
   ей хватало под обёрткой с z-index 100, теперь она сама себе слой */
.header{z-index:var(--z-site-top)}
/* под липкой шапкой: 79px её высоты плюс воздух. Было 156 — там в
   запас входил ещё и анонс-бар, который больше не липнет */
#catalog,#expert,#blog,#lead,#subscribeError,[data-captcha-fail],#media,.hero-slider{scroll-margin-top:96px}
/* любая якорная секция без своего правила: заголовок не уходит под шапку
   (#media на /blog/ уезжал целиком, T6-10). :where — специфичность 0, правила
   конкретных секций (96/100/136px) его перебивают, как и раньше */
:where(section[id]){scroll-margin-top:96px}
/* Высота липкого блока плавает: анонс-бар включается из админки, на узком
   экране шапка переносится. Реальное значение в --sticky-top кладёт main.js
   (measureStickyTop), 88px — запас на случай, если JS не отработал. */
.course-lesson{scroll-margin-top:calc(var(--sticky-top,88px) + 18px)}

/* --- ФОРМА ФОТО: скруглённый прямоугольник вместо «домика» (арки) везде --- */
.hero__media,.expert__photo,.pbar__media,.slide__media{border-radius:28px}
.hero__media::after,.expert__photo::after{display:none} /* убрать cover-lines-«домик» */
.pbar__media,.pbar__img{border-radius:28px}

/* --- HERO: фото-приветствие с play-кнопкой (видео вместо статичного фото) --- */
.hero__video{position:relative;display:grid!important;place-items:center;
  background:url("../assets/img/lector.42a24936407a.jpg") center 20%/cover no-repeat;min-height:440px}
.hero__play{position:relative;z-index:2;width:88px;height:88px;border-radius:50%;border:none;cursor:pointer;
  background:var(--glass);color:var(--violet);font-size:26px;display:grid;place-items:center;
  box-shadow:var(--float);transition:transform .5s var(--r-ease)}
.hero__play:hover{transform:scale(1.08)}
.hero__vlabel{position:absolute;left:20px;bottom:18px;z-index:2;color:#fff;font-weight:600;font-size:var(--fs-fine);
  padding:7px 14px;border-radius:var(--r-pill);background:var(--night-fill);backdrop-filter:blur(6px)}

/* --- СЛАЙДЕР: стрелки не на тексте; кнопки не заливаются в невидимость --- */
.slider__arrow{top:auto;bottom:18px;transform:none;background:rgba(255,255,255,.94);color:var(--violet);box-shadow:var(--shadow-sm)}
.slider__arrow--prev{left:auto;right:74px}.slider__arrow--next{right:18px}
.slider__dots{position:absolute;left:52px;bottom:26px}
.slide__text{padding:52px 54px}.slide__text p{max-width:34ch}
.slide .btn::after{display:none} /* белые кнопки слайдера не заливаем виолетом */
.slide .btn{transition-property:transform,box-shadow,background-color,border-color,color,letter-spacing;
  transition-duration:.55s;transition-timing-function:cubic-bezier(.4,.05,.2,1)}
.slide .btn:hover{transform:translateY(-2px);box-shadow:0 18px 40px -14px rgba(0,0,0,.28)}
@media(max-width:920px){.slide__text{padding:32px 24px 66px}.slider__dots{left:24px;bottom:22px}.slider__arrow--prev{right:66px}}

/* --- ЛИД-МАГНИТ подтверждение «в корзине» --- */
.added-note{margin-top:16px;padding:12px 16px;border-radius:var(--r-small);
  background:var(--lavender-soft);color:var(--violet);font-weight:600;font-size:var(--fs-note)}
/* Ошибка отправки выглядела ровно как успех — тем же лавандовым. */
.added-note--error{background:var(--error-soft);color:var(--error)}
.added-note a{color:inherit;text-decoration:underline}
.btn.is-added{background:var(--green)}

/* ===== ОТЗЫВЫ: editorial-карты — бумага, хэйрлайны, монограмма (без
   градиентов, гигантской кавычки, оранжевых звёзд и аватарок-кружков) ===== */
.reviews .rev-track{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:22px;align-items:stretch}
.reviews__more{display:flex;justify-content:center;margin-top:clamp(28px,4vw,48px)}
.rev-card{border-radius:18px;box-shadow:var(--shadow);border:1px solid var(--edge-card);background:#fff;overflow:hidden}
/* текстовые 1-в-1 промпт-чип Sidekick: текст + чип-логотип и имя слева
   внизу + кружок-стрелка справа; звёзды выпилены (выглядели дёшево) */
.rev-card:not(.rev-card--video){display:flex;flex-direction:column;justify-content:center;padding:22px 20px 16px;position:relative}
.rev-card:not(.rev-card--video) p{position:relative;font:400 14px/1.55 'Open Sans',sans-serif;color:var(--muted-strong);margin:0 0 18px;order:1}
.rev-card .stars{display:none}
.rev-card .top{order:3;display:flex;align-items:center;gap:8px;padding:0;border:none}
/* чип-логотип (как фиолетовая иконка Sidekick) с инициалом */
.rev-card .top .ava{width:24px;height:24px;border-radius:8px;flex:0 0 auto;
  background:linear-gradient(135deg,#8B6CD9,var(--violet));border:none;color:#fff;
  display:grid;place-items:center;font:600 11px/1 'Open Sans',sans-serif}
.rev-card .who b{display:block;font:600 var(--fs-mini)/1.3 'Open Sans',sans-serif;letter-spacing:.06em;color:var(--muted);text-transform:none}
.rev-card .who small{display:none}
/* Стрелка справа внизу — ссылка на продукт, о котором отзыв (решение Дани
   25.09.2026). Раньше тут был нарисованный кружок «↑» — значок «отправить»,
   который звал нажать, а нажать было нечего. Вид — как у «Пациентам →»:
   контур, на наведении заливка. Нажимается только она, не вся карточка. */
.rev-go{margin-left:auto;flex:none;position:relative;width:34px;height:34px;border-radius:50%;
  border:1px solid var(--lavender);display:grid;place-items:center;color:var(--violet);
  font-size:var(--fs-sm);line-height:1;text-decoration:none}
.rev-go::before{content:"";position:absolute;inset:-5px}   /* под палец — 44 px */
.rev-go:hover{background:var(--violet);border-color:var(--violet);color:#fff;transform:translateX(2px)}
.rev-go:focus-visible{outline:2px solid var(--violet);outline-offset:3px}
.rev-vmeta .rev-go{align-self:flex-end}
/* видео — брендовый постер (серые заглушки прячем), мета снизу */
.rev-card--video{display:flex;flex-direction:column}
.rev-card--video .rev-video{aspect-ratio:16/11;min-height:0;border:none;box-shadow:none;
  background:radial-gradient(120% 100% at 78% 8%,rgba(255,255,255,.22),transparent 52%),linear-gradient(150deg,#9f83df,#d99f82)}
.rev-card--video .rev-video img{display:none!important}
.rev-card--video .rev-play{background:transparent;border:none} /* кнопка на весь блок — прозрачная, кружок это span внутри */
.rev-card--video .rev-dur{background:var(--night-fill);color:#fff}
.rev-card--video .rev-vmeta{padding:22px 24px;background:#fff;flex:1;display:flex;flex-direction:column;justify-content:center}
.rev-card--video .rev-vmeta .stars{color:var(--terra-ink);font-size:10px;letter-spacing:6px}
.rev-card--video .rev-vmeta p{font:italic 400 15px/1.5 'Arsenal',Georgia,serif;margin-top:10px}
/* На телефоне облако выключено (motion.js: от 861 px) и отзывы идут списком:
   замер на 390×844 — шесть карт ≈1475 px, почти два экрана, четыре ≈985 px.
   Скрыты пятая и шестая; страница продукта (body.prod-clean) не задета */
@media (max-width:860px){
  body.home-clean section.reviews .rev-track > .rev-card:nth-child(n+5){display:none}
}

/* ===== REELS: вертикальные 9:16 карточки, не кружочки ===== */
.stories__row{display:flex;gap:18px;justify-content:center;flex-wrap:wrap}
/* style.css держит на ряду overflow-x:auto ради узких экранов, но браузер
   тянет вторую ось следом (visible при auto становится auto) — и низ тени
   срезался кромкой ряда. Широким экранам прокрутка не нужна вовсе */
@media(min-width:721px){.stories__row{overflow:visible}}
.story{width:170px}
.story__ring{width:100%;aspect-ratio:9/16;border-radius:22px;padding:0;background:linear-gradient(160deg,var(--lav-deep),var(--terra-soft));
  position:relative;overflow:hidden;transition:transform .5s var(--r-ease);
  /* тень своя, а не общий --float: у того 50px размытия при spread −28px дают
     плотное пятно с ясной кромкой — под рядом карточек оно читалось полосой
     чужого фона. Два слоя: ближний контакт и дальний мягкий рассеянный */
  box-shadow:0 3px 8px -4px rgba(86,61,135,.18),0 22px 44px -20px rgba(86,61,135,.26)}
.story:hover .story__ring{transform:translateY(-6px)}
.story__inner{position:absolute;inset:0;border-radius:22px;display:grid;place-items:center;background:transparent}
/* картинка карточки — теперь настоящий <img> (был CSS-фон, п.133): кнопка
   воспроизведения лежит в .story__inner следом по документу и потому поверх */
.story__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:22px}
/* кружок воспроизведения ушёл из центра в угол и уменьшился: по центру он
   держал кадр как сторис, а подпись теперь живёт внизу самого кадра */
.story__inner{place-items:start end;padding:10px}
.story .play-sm{left:auto;top:10px;right:10px;transform:none;width:34px;height:34px;border-radius:50%;background:var(--glass);color:var(--violet);display:grid;place-items:center;font-size:12px;box-shadow:var(--lift)}
.story__cap{position:absolute;left:0;right:0;bottom:0;z-index:2;
  padding:38px 14px 14px;text-align:left;font-weight:600;font-size:var(--fs-fine);
  color:#fff;line-height:1.25;
  /* затемнение обязательно: у трёх из пяти превью низ кадра светлый — на KUBE
     ровно в этом месте белая подпись и тонет */
  background:linear-gradient(180deg,rgba(46,34,71,0),rgba(46,34,71,.86))}
@media(max-width:720px){.stories__row{flex-wrap:nowrap;overflow-x:auto;justify-content:flex-start;scroll-snap-type:x mandatory;padding-bottom:8px}.story{flex:0 0 150px;scroll-snap-align:start}}

/* ===== БЛОГ: карточки с картинкой, ровная высота ===== */
.blog-grid .post{display:flex;flex-direction:column;background:#fff;border:1px solid var(--line);border-radius:22px;overflow:hidden;box-shadow:var(--shadow);transition:transform .5s var(--r-ease)}
.blog-grid a.post:hover{transform:translateY(-4px)}
.post__img{aspect-ratio:16/10;background:linear-gradient(160deg,var(--lav-deep),var(--terra-soft))}
.post__img img{width:100%;height:100%;object-fit:cover;display:block}
.post__b{padding:22px 24px;display:flex;flex-direction:column;gap:10px;flex:1}
.post--soon{opacity:.72}

/* ===== ПРОДУКТ: баннер сбалансирован, картинка выровнена по заголовку ===== */
.pbar .pbar__grid{align-items:center;gap:52px}
.pbar__media{aspect-ratio:4/4.4;box-shadow:var(--float)}
.pbar__media .pbar__img{width:100%;height:100%;object-fit:cover}

/* «из чего состоит» / «программа» — вложенные плитки, 2 колонки */
.compose ul{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:0;padding:0;list-style:none}
.compose li{background:#fff;border:1px solid var(--line);border-radius:18px;padding:22px 24px;display:flex;gap:16px;align-items:flex-start;box-shadow:var(--shadow-sm)}
.compose li i{flex:0 0 auto;width:38px;height:38px;border-radius:12px;background:var(--lavender-soft);color:var(--violet);display:grid;place-items:center;font-style:normal;font-weight:700;font-family:'Arsenal',Georgia,serif}
@media(max-width:720px){.compose ul{grid-template-columns:1fr}}

/* «для кого» — плитки во всю ширину, не строчки слева */
.for-whom ul{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;list-style:none;padding:0;margin:0}
.for-whom li{background:var(--cream);border:1px solid var(--line);border-radius:18px;padding:20px 22px;font-weight:500;font-size:var(--fs-sm)}
@media(max-width:860px){.for-whom ul{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.for-whom ul{grid-template-columns:1fr}}

/* «лектор» — центрированная широкая карточка, не пустая половина */
.lectors{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:22px;max-width:720px;margin:0 auto}
.lector{background:linear-gradient(160deg,#fff,#fbf6ef);border:1px solid var(--line);border-radius:24px;padding:26px;box-shadow:var(--shadow);display:flex;gap:22px;align-items:center}
.lector .ph{width:110px;height:110px;flex:0 0 auto;border-radius:20px;background:url("../assets/img/lector.42a24936407a.jpg") center/cover}
.lector b{font-size:var(--fs-lede);font-family:'Arsenal',Georgia,serif}
.lector small{display:block;color:var(--violet);font-weight:600;margin:2px 0 8px}

/* «вам может быть интересно» — одинаковая высота, картинки заполняют кадр */
.related{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
@media(max-width:900px){.related{grid-template-columns:1fr 1fr}}
.rel{display:flex;flex-direction:column;background:#fff;border:1px solid var(--line);border-radius:20px;overflow:hidden;box-shadow:var(--shadow);transition:transform .5s var(--r-ease)}
.rel:hover{transform:translateY(-4px)}
.rel .img{aspect-ratio:16/11;overflow:hidden;border-radius:0;background:linear-gradient(160deg,var(--lav-deep),var(--terra-soft))}
.rel .img img,.rel .img svg{width:100%;height:100%;object-fit:cover;display:block;border-radius:0}
.rel .b{display:flex;flex-direction:column;gap:8px;padding:16px 18px;flex:1}
.rel .b b{font-size:var(--fs-sm);line-height:1.3}
.rel .b .p{margin-top:auto;font-weight:700;color:var(--violet)}

/* --- карточки товара: цена всегда у низа (без описания не задиралась вверх) --- */
.pcard__b{display:flex;flex-direction:column}
.pcard__meta{margin-top:auto}
.plist{align-items:stretch}

/* --- восстановление: заметная альтернатива по e-mail --- */
.auth-alt{margin-top:26px;padding-top:22px;border-top:1px solid var(--line);text-align:center}
.auth-alt span{display:block;color:var(--muted);font-size:var(--fs-note);margin-bottom:12px}

/* ===== Партия 3 ===== */

/* верхнее меню в одну строку — надписи не переносятся */
.header__nav{gap:20px}
.header__nav a{white-space:nowrap;font-size:var(--fs-sm)}
@media(max-width:1180px){.header__nav{gap:12px}.header__nav a{font-size:var(--fs-fine)}}

/* Reels: кнопка-CTA по центру (не одна слева) */
.stories__cta{display:flex;width:max-content;margin:34px auto 0}

/* HERO-СЛАЙД: картинка во всю ширину + градиентная вуаль слева — без стыка/белой полосы */
.slide{position:relative}
.slide__media{position:absolute;inset:0;z-index:0;border-radius:0}
.slide__text{position:relative;z-index:2;background:transparent!important}
.slide::before{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(100deg,var(--violet) 34%,rgba(86,61,135,.55) 56%,rgba(86,61,135,.12) 78%,transparent 92%)}
.slide--2::before{background:linear-gradient(100deg,var(--terra) 34%,rgba(189,115,99,.55) 56%,var(--terra-wash) 78%,transparent 92%)}
.slide--3::before{background:linear-gradient(100deg,var(--blue) 34%,rgba(63,129,191,.55) 56%,rgba(63,129,191,.12) 78%,transparent 92%)}
@media(max-width:640px){.slide::before{background:linear-gradient(180deg,rgba(86,61,135,.75),rgba(86,61,135,.5))}}

/* ===== УРОКИ: файлы карточками, аккуратные карточки уроков ===== */
.lesson-body.prose{margin:14px 0}
.file-card{display:flex;align-items:center;gap:14px;margin-top:12px;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:var(--cream);text-decoration:none;transition:.25s var(--r-ease)}
.file-card:hover{transform:translateY(-2px);box-shadow:var(--lift);border-color:var(--lavender)}
.file-card__ic{flex:0 0 auto;width:44px;height:44px;border-radius:12px;background:linear-gradient(150deg,#e05a5a,#c23b3b);color:#fff;display:grid;place-items:center;font-size:var(--fs-tag);font-weight:800;letter-spacing:.5px}
.file-card__name{flex:1;color:var(--ink);font-weight:600;font-size:var(--fs-sm);word-break:break-word;line-height:1.3}
.file-card__dl{flex:0 0 auto;color:var(--violet);font-weight:700;font-size:var(--fs-note);white-space:nowrap}

/* ── Отзывы: видео-эмбед и форма ────────────────────────────── */
.rev-embed{position:relative;aspect-ratio:9/16;background:#000;border-radius:var(--radius-sm) var(--radius-sm) 0 0;overflow:hidden}
.rev-embed iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.review-form{max-width:560px;margin:40px auto 0;padding:30px 28px;background:linear-gradient(180deg,#fff,#fbf6ef);border:1px solid var(--line);border-radius:24px;box-shadow:var(--shadow)}
.review-form h3{font-family:'Arsenal',Georgia,serif;font-size:24px;margin:0 0 18px;color:var(--ink)}
.review-form label{display:block;margin-bottom:14px;font-size:var(--fs-note);font-weight:600;color:var(--violet)}
.review-form input,.review-form select,.review-form textarea{display:block;width:100%;margin-top:6px;padding:12px 14px;border:1.5px solid var(--field-line);border-radius:12px;background:#fff;font:inherit;color:var(--ink)}
.review-form input:focus,.review-form select:focus,.review-form textarea:focus{outline:none;border-color:var(--violet);box-shadow:var(--field-ring)}
.review-form textarea{resize:vertical;min-height:110px}
.review-form .btn{margin-top:6px}
.review-form small.muted{display:block;margin-top:10px}

/* ── Карточки товара: заголовок ПОД обложкой (редакционный стиль) ──────
   Было: белый заголовок наложен на обложку → на баннерах с впечатанным
   текстом получался двойной нечитаемый текст. Стало: чистая картинка
   сверху, тёмный читаемый заголовок в теле карточки. */
.pcard__cover{box-shadow:none}
.pcard__b{gap:12px;padding:22px 24px 24px}
.pcard__b .pcard__title{
  position:static;z-index:auto;color:var(--ink);
  font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:21px;line-height:1.22;letter-spacing:.1px;
  text-shadow:none;margin:0;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}
.pcard:hover .pcard__title{color:var(--violet)}
.pcard__b p{color:var(--text-secondary);font-size:var(--fs-note);line-height:1.55;margin:0}
.pcard__meta{margin-top:auto;padding-top:6px}

/* ── Мобайл-фиксы аудита ──────────────────────────────────────────────
   Футер: 4-колоночная сетка не сворачивалась на телефоне → колонки
   наезжали, длинный e-mail вылезал. Карточки: цена «от 14900 ₽» ломалась
   на 3 строки в тесной 2-колонке. */
/* Палец: ссылки подвала стояли шагом 38px при кегле 17 — меньше 44px, на
   которые целятся большим пальцем. Растим не кегль, а зону нажатия. */
@media(hover:none){
  .footer__col a{padding-block:6px;margin-bottom:5px}
  .footer__docs a{padding-block:4px}
}
@media(max-width:760px){
  .footer__top{grid-template-columns:1fr 1fr;gap:24px 28px}
  .footer a,.footer__col a{overflow-wrap:anywhere}
}
@media(max-width:420px){
  /* колонки навигации остаются парой даже на узком: ссылки короткие, а в
     один столбец подвал вытягивался на два экрана. Блок бренда — во всю
     ширину, ему нужна строка под слоган и кружки каналов. */
  .footer__top{grid-template-columns:1fr 1fr}
  .footer__brand{grid-column:1/-1}
}
@media(max-width:560px){
  .pcard__meta{flex-direction:column;align-items:flex-start;gap:8px}
  .pcard__price{font-size:var(--fs-lede)}
  .pcard__b .pcard__title{font-size:18px;-webkit-line-clamp:4}
  .pcard__b{padding:18px 18px 20px}
}

/* ── Плеер курса: сайдбар модулей/уроков + панель урока ────────────────
   Простыня всех уроков заменена навигацией: слева липкий сайдбар
   (прогресс + модули + уроки со статусами), справа один открытый урок. */
.course-layout{display:grid;grid-template-columns:320px 1fr;gap:40px;align-items:start}
.course-nav{position:sticky;top:88px;background:linear-gradient(180deg,#fff,#fbf6ef);
  border:1px solid var(--line);border-radius:22px;padding:20px 16px;
  box-shadow:var(--shadow);max-height:calc(100vh - 108px);
  display:flex;flex-direction:column;gap:14px}
.course-nav__progress{padding:4px 6px 14px;border-bottom:1px solid var(--line)}
.course-nav__ptop{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px;
  font-size:var(--fs-fine);color:var(--muted)}
.course-nav__ptop b{font-family:'Arsenal',Georgia,serif;font-size:18px;color:var(--violet)}
.course-nav__cert{margin-top:12px}
.course-nav__list{overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding-right:4px;margin:-2px}
.course-nav__mod{font-family:'Arsenal',Georgia,serif;font-size:var(--fs-fine);letter-spacing:.4px;
  color:var(--terra-ink);text-transform:none;margin:14px 8px 6px;font-weight:700}
.course-nav__item{display:flex;align-items:flex-start;gap:11px;padding:10px 12px;border-radius:13px;
  color:var(--ink);text-decoration:none;font-size:var(--fs-note);line-height:1.35;transition:.18s var(--r-ease,ease)}
.course-nav__item:hover{background:var(--cream)}
.course-nav__item.is-active{background:var(--lavender-soft);color:var(--violet);font-weight:600}
.course-nav__ic{flex:0 0 auto;width:20px;height:20px;margin-top:1px;border-radius:50%;
  border:2px solid var(--lavender);background:#fff;position:relative}
.course-nav__item.is-active .course-nav__ic{border-color:var(--violet)}
.course-nav__item.is-done .course-nav__ic{background:var(--green);border-color:var(--green)}
.course-nav__item.is-done .course-nav__ic::after{content:"";position:absolute;left:5px;top:2px;
  width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
/* закрытый по drip урок: виден, но неактивен — раньше он не доходил до
   разметки вовсе, и курс выглядел короче, чем он есть */
.course-nav__item--locked{color:var(--muted);cursor:default}
.course-nav__item--locked:hover{background:transparent}
.course-nav__ic--lock{border-style:dashed;border-color:var(--muted);background:transparent}
.course-nav__when{display:block;margin-top:2px;font-size:var(--fs-tag);color:var(--muted);white-space:nowrap}
/* поздравление на месте, где у пройденного курса раньше было пусто */
.course-done-note{margin:14px 0 0;padding:11px 13px;border-radius:13px;
  background:var(--lavender-soft);display:flex;flex-direction:column;gap:2px}
.course-done-note b{font-size:var(--fs-note);color:var(--violet)}
.course-done-note span{font-size:var(--fs-mini);color:var(--muted)}
.course-main{min-width:0}
.course-lesson{background:#fff;border:1px solid var(--line);border-radius:24px;
  padding:34px 38px;box-shadow:var(--shadow)}
.course-lesson+.course-lesson{margin-top:24px}   /* без JS: интервал между уроками */
.course-lesson__head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:18px}
.course-lesson__head h2{margin:0;font-size:28px;line-height:1.15}
.course-lesson__foot{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:22px;
  padding-top:20px;border-top:1px solid var(--line)}
.btn--ghost{background:transparent;border:1.5px solid var(--lavender);color:var(--violet)}
/* заливка превращала вторичное действие в плашку и спорила с основным CTA */
.btn--ghost:hover{background:transparent;border-color:var(--violet);color:var(--ink-deep);
  box-shadow:var(--lift-sm)}
/* Атрибут hidden обязан побеждать наши display-правила. .btn задаёт
   display:inline-flex, а авторский стиль бьёт UA-правило [hidden]{display:none}
   независимо от специфичности — и кнопка «Следующий урок» оставалась видимой
   на последнем уроке и на курсе из одного урока: JS честно ставил hidden,
   браузер честно его игнорировал. Та же мина уже чинилась в support-chat.css. */
.btn[hidden]{display:none}
@media(max-width:900px){
  .course-layout{grid-template-columns:1fr;gap:22px}
  .course-nav{position:static;max-height:none}
  /* было 340px намертво: при 23 уроках в окошко влезало три строки, и на
     телефоне было не понять, где ты в курсе. Считаем от вьюпорта (dvh —
     чтобы адресная строка мобильного браузера не срезала список), потолок
     560px, чтобы на планшете оглавление не съедало весь экран */
  .course-nav__list{max-height:min(60vh,560px);max-height:min(60dvh,560px);
    scroll-behavior:smooth}
  .course-lesson{padding:26px 22px}
  .course-lesson__head h2{font-size:var(--fs-h3)}
}

/* доступность: текст только для скринридеров (статус «пройден» в сайдбаре) */
.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ═══ ЖИВОЙ ФОН + УСИЛЕННЫЙ МОУШЕН (режим «ярко», как Shopify) ═══════════
   Canvas перекрывает статичную атмосферу body::before; если WebGL нет —
   (WebGL-фон livebg выпилен 18.07 — по дизайну его нигде нет) */

@media (prefers-reduced-motion: no-preference){
  /* выезды секций выразительнее: больше дистанция + лёгкий зум + стаггер */
  .dl-rv{transform:translateY(60px) scale(.965);
    transition:opacity 1s var(--dl-ease,cubic-bezier(.16,1,.3,1)),
               transform 1.05s var(--dl-ease,cubic-bezier(.16,1,.3,1));
    transition-delay:calc(var(--dl-i,0)*.11s)}

  /* ── Батч 1: направленные входы (Shopify «встречный выезд») ──────────
     motion.js вешает data-mo по роли/позиции. Всё под no-preference —
     у кого отключена анимация, design-layer вернёт transform:none. */
  .dl-rv[data-mo="left"]{transform:translateX(-46px)}
  .dl-rv[data-mo="right"]{transform:translateX(46px)}
  .dl-rv[data-mo="fade"]{transform:none}                 /* медиа с параллаксом — только opacity */
  .dl-rv[data-mo="scale"]{transform:scale(.9)}
  .dl-rv[data-mo="mask"]{opacity:1;transform:none;clip-path:inset(0 0 110% 0);
    transition:clip-path 1.05s var(--dl-ease,cubic-bezier(.16,1,.3,1))}
  .dl-rv[data-mo="mask"].dl-in{clip-path:inset(0 -6% -10% 0)}
}

/* ═══ Батч 2: hover-физика, каунтеры-строка, маркиза ═══════════════════ */
/* микро-движение стрелок/иконок при наведении (лифты карточек уже в макете) */
.pcard__go,.stories__cta{transition:transform .4s var(--r-ease)}
.pcard:hover .pcard__go{transform:translateX(5px)}
.rel:hover .img img{transform:scale(1.06)}
.story:hover .story__ring{transform:translateY(-8px) scale(1.02)}

/* строка-цифры (каунтеры) */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:6px}
.stat{background:rgba(255,255,255,.6);backdrop-filter:blur(6px);border:1px solid var(--line);
  border-radius:22px;padding:30px 22px;text-align:center;box-shadow:var(--shadow)}
.stat__n{font-family:'Arsenal',Georgia,serif;font-size:clamp(2.2rem,4vw,3.2rem);color:var(--violet);line-height:1}
.stat__l{margin-top:10px;color:var(--text-secondary);font-size:var(--fs-note);line-height:1.4}
@media(max-width:820px){.stats{grid-template-columns:1fr 1fr}}

/* бегущая строка ценностей */
.marq{overflow:hidden;padding:16px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.marq__t{display:inline-flex;gap:0;white-space:nowrap;will-change:transform;animation:marq 30s linear infinite}
.marq:hover .marq__t{animation-play-state:paused}
.marq__t span{font-family:'Arsenal',Georgia,serif;font-size:clamp(1.3rem,2.4vw,2rem);color:var(--violet);
  opacity:.55;padding:0 34px;position:relative}
.marq__t span::after{content:"·";position:absolute;right:-4px;color:var(--terra-ink)}
@keyframes marq{to{transform:translateX(-50%)}}

@media (prefers-reduced-motion: reduce){
  .marq__t{animation:none}
}
@media(max-width:820px){
}

/* ---------- топ-бар анонсов v2: заметный, живой ---------- */
.topbar{
  position:relative;overflow:hidden;text-align:center;padding:0;
  background:linear-gradient(115deg,#1d1532,#2c2049 38%,#3f2d66 62%,#251b3b);
  background-size:220% 220%;animation:tb-aurora 14s ease infinite;
  color:#fff;font-size:var(--fs-note);letter-spacing:.02em;
}
@keyframes tb-aurora{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.topbar::after{
  content:"";position:absolute;top:0;bottom:0;width:40%;left:-45%;pointer-events:none;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.13),transparent);
  animation:tb-sheen 6s cubic-bezier(.16,1,.3,1) infinite;
}
@keyframes tb-sheen{0%,55%{left:-45%}100%{left:120%}}
.topbar__in{display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap;
  padding:10px 18px;position:relative}
.topbar__text{font-weight:500}
.topbar__text em{font-family:'Arsenal';font-style:italic;font-size:var(--fs-md);color:#E9DDFF}
/* кнопка анонса живёт по общему канону: плашка при наведении не
   осветляется (это была заливка), меняются глубина и набор */
.topbar__cta{display:inline-flex;align-items:center;gap:9px;font-weight:600;font-size:var(--fs-fine);
  padding:5px 6px 5px 15px;border-radius:999px;background:rgba(255,255,255,.12);
  border:1px solid transparent;text-decoration:none;color:#fff}
.topbar__cta:hover{transform:translateY(-1px);
  border-color:rgba(255,255,255,.34);
  box-shadow:var(--lift)}
.topbar__arr{width:21px;height:21px;border-radius:50%;background:#fff;color:var(--night);
  display:grid;place-items:center;font-size:var(--fs-mini);line-height:1;
  transition:transform .4s var(--dl-ease)}
.topbar__cta:hover .topbar__arr{transform:translateX(2px)}
@media(max-width:640px){
  .topbar__in{gap:9px;padding:9px 14px}
  .topbar__text{font-size:var(--fs-mini)}.topbar__text em{font-size:var(--fs-note)}
  .topbar__cta{font-size:var(--fs-mini);padding:4px 5px 4px 12px}
}
@media(prefers-reduced-motion:reduce){
  .topbar{animation:none}.topbar::after{animation:none;display:none}
}

/* ---------- шапка: прозрачное стекло, не спорит с фоном ---------- */
.header{background:transparent;border-bottom:1px solid transparent;backdrop-filter:none;
  transition:background .5s,box-shadow .5s,border-color .5s}
.header.dl-scrolled{backdrop-filter:blur(18px);  /* фон задаёт прем-шапка ниже */
  -webkit-backdrop-filter:blur(18px);
  border-bottom:1px solid var(--edge-soft);
  box-shadow:var(--shadow-sm)}
.icon-btn{background:rgba(255,255,255,.55);border-color:var(--edge-card)}

/* ---------- топ-бар v3: живость ---------- */
/* дрейфующие световые сферы */
.topbar__orb{position:absolute;top:50%;width:120px;height:120px;border-radius:50%;
  pointer-events:none;filter:blur(26px);opacity:.5;will-change:transform}
.topbar__orb--a{background:radial-gradient(circle,#FFB25E 0%,transparent 70%);
  animation:tb-orb-a 17s ease-in-out infinite}
.topbar__orb--b{background:radial-gradient(circle,#FF7A45 0%,transparent 70%);
  animation:tb-orb-b 23s ease-in-out infinite}
@keyframes tb-orb-a{
  0%,100%{transform:translate(-10vw,-50%) scale(1)}
  50%{transform:translate(55vw,-50%) scale(1.5)}}
@keyframes tb-orb-b{
  0%,100%{transform:translate(85vw,-50%) scale(1.3)}
  50%{transform:translate(25vw,-50%) scale(.9)}}

/* мерцающие искры */
.topbar__spark{position:absolute;left:var(--sx);top:50%;font-size:9px;color:#D9C7FF;
  pointer-events:none;opacity:0;transform:translateY(-50%) scale(.4);
  animation:tb-spark 3.8s ease-in-out var(--sd) infinite}
@keyframes tb-spark{
  0%,100%{opacity:0;transform:translateY(-50%) scale(.4) rotate(0deg)}
  50%{opacity:.95;transform:translateY(-56%) scale(1.15) rotate(90deg)}}

/* название курса: переливающийся градиент по буквам */
.topbar__text em{background:linear-gradient(100deg,#E9DDFF 20%,#fff 40%,#F4C9BC 60%,#E9DDFF 80%);
  background-size:250% 100%;-webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  animation:tb-em-shine 5s linear infinite}
@keyframes tb-em-shine{from{background-position:125% 0}to{background-position:-125% 0}}

/* CTA: стрелка-непоседа. Дышащее свечение снято 11.09: оно крутило
   box-shadow ключевыми кадрами, и ореол на наведении вспыхивал скачком —
   переход не работает, когда значение до него давала анимация. */
.topbar__arr{animation:tb-arr-nudge 3.2s cubic-bezier(.16,1,.3,1) infinite}
@keyframes tb-arr-nudge{0%,74%,100%{transform:translateX(0)}
  80%{transform:translateX(3px)}88%{transform:translateX(-1px)}}
.topbar__cta:hover .topbar__arr{animation:none;transform:translateX(2px)}

@media(prefers-reduced-motion:reduce){
  .topbar__orb,.topbar__spark,
  .topbar__text em,.topbar__cta,.topbar__arr{animation:none!important}
  .topbar__spark{opacity:.5}
}

/* ---------- Shopify-мод: вуаль настроения по секциям ---------- */
#moodveil{position:fixed;inset:0;z-index:-1;pointer-events:none;
  background-color:transparent;transition:background-color 1.3s ease}
body[data-mood="lav"] #moodveil{background-color:rgba(142,111,216,.08)}
body[data-mood="violet"] #moodveil{background-color:rgba(86,61,135,.09)}
body[data-mood="terra"] #moodveil{background-color:rgba(189,115,99,.08)}
body[data-mood="night"] #moodveil{background-color:var(--night-wash)}
@media(prefers-reduced-motion:reduce){#moodveil{transition:none}}

/* ---------- ротатор подзаголовка в hero ---------- */
.hero__name span.rotw{transition:transform .5s cubic-bezier(.16,1,.3,1),opacity .5s,filter .5s;
  will-change:transform}
.hero__name span.rotw.out{transform:translateY(-.75em);opacity:0;filter:blur(5px)}
.hero__name span.rotw.pre{transition:none;transform:translateY(.75em);opacity:0;filter:blur(5px)}

/* ---------- магнитные кнопки: пружинный возврат ---------- */
/* ЕДИНЫЙ канон перехода кнопок. Раньше здесь перечислялись только
   transform, box-shadow, background и color — рамка и разрядка в список не
   попадали и щёлкали мгновенно, отчего ховер читался резким. Правило
   грузится позже design-layer, поэтому именно оно задаёт тон всем .btn. */
.btn,.topbar__cta,.hero__play{transition-property:transform,box-shadow,background-color,border-color,color;
  transition-duration:.55s;transition-timing-function:cubic-bezier(.4,.05,.2,1)}

/* Свечение кнопок переехало в static/css/glow.css и работает на всех
   страницах, а не только на главной. Здесь блок стоять не может: скоуп
   body.home-clean.nx-seq весил 0,3,1 и молча перебивал общую механику —
   на главной кнопка cookie-баннера получала от него семь слоёв в покое
   против нуля на наведении, то есть вспышку вместо снятого света. */


/* ---------- Shopify-выезды v2: с боков, «раздача карт», поп-ин ---------- */
@media (prefers-reduced-motion: no-preference){
  .dl-rv[data-mo="swing-l"]{transform:translateX(-72px) rotate(-2.5deg) scale(.97);
    transition-timing-function:cubic-bezier(.34,1.4,.5,1)}
  .dl-rv[data-mo="swing-r"]{transform:translateX(72px) rotate(2.5deg) scale(.97);
    transition-timing-function:cubic-bezier(.34,1.4,.5,1)}
  .dl-rv[data-mo="deal-l"]{transform:translateY(64px) rotate(-3.5deg) scale(.95)}
  .dl-rv[data-mo="deal-r"]{transform:translateY(64px) rotate(3.5deg) scale(.95)}
  .dl-rv[data-mo="pop"]{transform:scale(.55);
    transition-timing-function:cubic-bezier(.34,1.56,.64,1)}
  /* конечное состояние ПОСЛЕДНИМ: равная специфичность с [data-mo]-стартами,
     без этого правила раскрытый элемент остался бы смещённым (каскад) */
  .dl-rv.dl-in{opacity:1;transform:none}
}
/* Посадка на якорь внутри блока с выездом: браузер прыгает к цели, пока блок
   ещё сдвинут на 60 px, а выезжает он уже после прыжка — ошибка подписки
   (#subscribeError в .pnewsletter) оставалась на 33 px под шапкой (iPhone, T5-04).
   Блок с целью раскрыт сразу. :is() — чтобы старый браузер без :has() не
   выбросил и сам :target */
.dl-rv:is(:target,:has(:target)){opacity:1;transform:none;transition:none}

/* ---------- Shopify Editions: облако отзывов, фокус наведением ----------
   Сцена — сам .rev-track: заголовок и форма отзыва остаются в потоке,
   поэтому одно облако живёт и на главной, и на странице продукта. */
@media(min-width:861px) and (prefers-reduced-motion:no-preference){
  .reviews.rev-cloud-sec{position:relative;overflow:hidden;padding:var(--sec-half) 0}
  .rev-cloud-sec .container{max-width:none;padding:0 5vw}
  /* заголовок живёт В сцене (реф Editions/Sidekick): верх-лево, поверх призраков */
  .rev-cloud-sec .section-head{position:absolute;left:max(calc(50% - 600px),188px);top:9vh;z-index:7;
    text-align:left;max-width:520px;margin:0}
  /* сияние под заголовком: тёплый свет сцены (как у прожектора) — призраки,
     проплывающие глубоко под текстом, тают в нём, заголовок всегда читаем */
  .rev-cloud-sec .section-head::before{content:"";position:absolute;z-index:-1;pointer-events:none;
    inset:-64px -110px -72px -90px;
    background:radial-gradient(closest-side,rgba(255,252,244,.97) 34%,rgba(255,252,244,.8) 62%,rgba(255,252,244,0) 100%)}
  .rev-cloud-sec .section-head h2{font-size:clamp(26px,2.5vw,38px);line-height:1.2;max-width:16ch}
  .rev-track.rev-cloud{position:relative;display:block;overflow:visible;
    height:92vh;padding:0;margin:0}
  /* свет сцены: тёплый прожектор из глубины поддерживает механику фокуса */
  .rev-track.rev-cloud::before{content:"";position:absolute;left:50%;top:46%;width:74vw;height:74vh;
    transform:translate(-50%,-50%);pointer-events:none;
    background:radial-gradient(closest-side,rgba(255,252,244,.85),rgba(255,252,244,0) 72%)}
  .rev-cloud-sec .review-form{position:relative;z-index:8;max-width:560px;margin-top:10px}
  /* глубина: карты в тумане (фейд+блюр); --mx/--my — параллакс за мышью,
     транзишен трансформа даёт мягкую инерцию следования */
  .rev-cloud .rev-card{position:absolute;left:var(--cx,auto);top:var(--cy,auto);
    width:250px;max-width:none;min-width:0;margin:0;
    transform:translate(calc(-50% + var(--mx,0px)),calc(-50% + var(--my,0px)))
              scale(var(--cs,.9));
    opacity:.72;filter:blur(1px) saturate(.9);cursor:pointer;
    transition:opacity .7s var(--dl-ease,cubic-bezier(.16,1,.3,1)),
               filter .7s var(--dl-ease,cubic-bezier(.16,1,.3,1)),
               transform 1.1s cubic-bezier(.22,1,.36,1),
               box-shadow .7s}
  /* прожектор: наведённая карта резкая и крупнее — подъём без неона,
     тонкое кольцо и глубокая рассеянная тень */
  .rev-cloud .rev-card.lit{opacity:1;filter:none;z-index:6;
    transform:translate(calc(-50% + var(--mx,0px)),calc(-50% + var(--my,0px)))
              scale(1.06);
    border-color:var(--edge-strong);
    box-shadow:var(--veil)}
  .rev-cloud .rev-card--video{width:290px}
  .rev-cloud .rev-card--video .rev-embed{aspect-ratio:16/9}
  /* карты как промпт-чипы рефа Sidekick: компакт, простой текст,
     монограмма слева-снизу, звёзды справа-снизу, без линий внутри */
  .rev-cloud .rev-card{border-radius:14px}
  .rev-cloud .rev-card:not(.rev-card--video){padding:16px 16px 12px}
  .rev-cloud .rev-card:not(.rev-card--video) p{font-size:var(--fs-fine);margin-bottom:14px}
  /* призраки-эхо: много карт на фоне, неактивные, но живут в параллаксе */
  .rev-cloud .rev-ghost{opacity:.24;filter:blur(5px) saturate(.8);pointer-events:none;z-index:0;cursor:default}
  .rev-cloud .rev-ghost.rev-card{box-shadow:none}
  /* текст нефокусных растворён (как в рефе): силуэт строк без букв */
  .rev-cloud .rev-card:not(.lit) p{opacity:.5}
  .rev-cloud .rev-card:not(.lit) .who b{opacity:.5}
  .rev-cloud .rev-ghost p{opacity:.18!important}
  /* на главной у карты нет цветного квадрата-инициала (30.09, подпись — одно
     название продукта), а призрак держался именно на нём: без него размытая
     копия — белое на белом, и «куча отзывов вдалеке» пропадала. Видимость
     теперь у самого призрака: плотнее, с рамкой и строчками, но заметно глуше
     живых карт (.72 и blur 1px), чтобы их не путали с кликабельными */
  body.home-clean .rev-cloud .rev-ghost{opacity:.4;filter:blur(4px) saturate(.8)}
  body.home-clean .rev-cloud .rev-ghost.rev-card{border-color:rgba(46,34,71,.28)}
  body.home-clean .rev-cloud .rev-ghost p{opacity:.5!important}
  body.home-clean .rev-cloud .rev-ghost .who b{opacity:.7!important}
  /* радужная аура фокусной карты (реф Sidekick): перелив по краям */
  .rev-cloud .rev-card::before{content:"";position:absolute;inset:-8px;border-radius:22px;
    padding:11px;background:conic-gradient(from var(--rvA,40deg),#F5A8C7,#8B6CD9,#7FB8EF,#C9A8F0,#F5A8C7);
    -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
    -webkit-mask-composite:xor;
    mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude;
    filter:blur(12px);opacity:0;transition:opacity .7s;pointer-events:none}
  .rev-cloud .rev-card.lit::before{opacity:.78;animation:revAura 6s linear infinite}
  @keyframes revAura{to{--rvA:400deg}}
  /* кнопка фокусной переливается */
  .rev-cloud .rev-card.lit .top::after{
    background:linear-gradient(120deg,#8B6CD9,#E48BB5,#6FA8E8,#8B6CD9);
    background-size:300% 300%;animation:revBtn 4s ease infinite}
  @keyframes revBtn{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}
  .rev-cloud .rev-card--video .rev-vmeta{padding:14px 18px}
  .rev-cloud .rev-card--video .rev-vmeta p{font-size:var(--fs-fine)}
}

/* Горизонтальная pin-галерея каталога удалена по фидбеку Юли 09.07 —
   категории показываются обычной сеткой (стили сетки в style.css). */

/* ---------- Reels: аккордеон-галерея (наведение распахивает карту) ---------- */
@media(min-width:861px) and (prefers-reduced-motion:no-preference){
  .stories__row{display:flex;flex-wrap:nowrap;gap:14px;height:430px;
    align-items:stretch;justify-content:center;max-width:1080px;margin:0 auto}
  .stories__row .story{width:auto;flex:1 1 0;min-width:0;display:flex;flex-direction:column;
    transition:flex-grow 1s cubic-bezier(.22,1,.36,1),opacity .6s,filter .6s}
  .stories__row .story__ring{flex:1;aspect-ratio:auto;height:auto;position:relative}
  .stories__row .story:hover{flex-grow:2.4}
  /* остальные уходят в тень, пока одна в фокусе */
  .stories__row:hover .story:not(:hover){opacity:.55;filter:saturate(.7)}
  /* свои градиенты у карточек — лента не монотонная */
  .story:nth-child(5n+2) .story__ring{background:linear-gradient(160deg,#e3d3fa,#cdb4ef)}
  .story:nth-child(5n+3) .story__ring{background:linear-gradient(160deg,#f6ddd2,#eec3b2)}
  .story:nth-child(5n+4) .story__ring{background:linear-gradient(160deg,#f3e7c9,#ecd9ad)}
  .story:nth-child(5n+5) .story__ring{background:linear-gradient(160deg,#d9e4f5,#c2d4ee)}
  /* блик пробегает по распахнутой карте */
  .story__ring::after{content:"";position:absolute;top:0;bottom:0;width:45%;left:-60%;
    background:linear-gradient(100deg,transparent,rgba(255,255,255,.35),transparent);
    transform:skewX(-12deg);transition:left 1.1s cubic-bezier(.22,1,.36,1);pointer-events:none}
  .story:hover .story__ring::after{left:120%}
  .story:hover .play-sm{transform:scale(1.15)}
  .play-sm{transition:transform .5s cubic-bezier(.34,1.56,.64,1)}
  /* перекраска подписи на ховер убрана вместе с переездом подписи в кадр:
     на затемнении она белая, фиолетовый там не читался */
}

/* ---------- продукт: секции по центру, заголовок с градиентной чертой ---------- */
@media(min-width:961px){
  .pblock .container{max-width:1060px}
  .pblock .container > h2{text-align:center;margin:0 0 36px;
    font-size:clamp(28px,2.6vw,38px);line-height:1.15}
  .pblock .container > h2::after{content:"";display:block;width:56px;height:3px;
    border-radius:3px;background:linear-gradient(90deg,var(--lavender),var(--terra));
    margin:14px auto 0}
  .prog-more{display:block;margin:18px auto 0}
}
/* прозы: во всю правую колонку; пункты = тёплые плашки в 2 колонки
   (голые строки читаются «пусто» — визуальная масса как у cat-card) */
.pblock .prose:not(.for-whom){max-width:none;font-size:var(--fs-md);line-height:1.6}
.pblock .prose:not(.for-whom) ul{list-style:none;padding:0;margin:14px 0;
  display:grid;grid-template-columns:1fr 1fr;gap:12px}
.pblock .prose:not(.for-whom) li{position:relative;padding:14px 18px 14px 42px;
  background:linear-gradient(160deg,#fff,var(--cream-mist));border:1px solid var(--line);
  border-radius:14px;box-shadow:var(--shadow-sm)}
.pblock .prose:not(.for-whom) li:nth-child(3n+2){background:linear-gradient(160deg,#fff,var(--lav-card))}
.pblock .prose:not(.for-whom) li:nth-child(3n+3){background:linear-gradient(160deg,#fff,var(--terra-surface))}
.pblock .prose:not(.for-whom) li::before{content:"";position:absolute;left:18px;top:21px;
  width:9px;height:9px;border-radius:3px;background:var(--lavender)}
.pblock .prose:not(.for-whom) b,.pblock .prose:not(.for-whom) strong{color:var(--violet)}
.pblock .prose:not(.for-whom) h3,.pblock .prose:not(.for-whom) h4{margin:26px 0 4px}
.pblock .prose:not(.for-whom) > p:last-child em,.pblock .prose:not(.for-whom) em{color:var(--violet)}
@media(max-width:1100px){.pblock .prose:not(.for-whom) ul{grid-template-columns:1fr}}

/* «из чего состоит»: компактные строгие плитки вместо блёклых панелей */
.pblock .compose li{background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:18px 20px;box-shadow:var(--shadow-sm)}
.pblock .compose li i{width:32px;height:32px;border-radius:10px;font-size:var(--fs-sm)}

/* программа: лёгкий список с волосяными линиями, а не стена карточек */
.pblock--prog .compose ul{grid-template-columns:1fr 1fr;gap:0 44px}
/* специфичность (0,3,1) бьёт мобильный откат design-layer — возвращаем сами */
@media(max-width:960px){.pblock--prog .compose ul{grid-template-columns:1fr}}
.pblock--prog .compose li{background:transparent;border:0;box-shadow:none;border-radius:0;
  border-bottom:1px solid var(--line);padding:13px 4px;
  flex-direction:row;align-items:baseline;gap:14px;overflow:visible}
.pblock--prog .compose li::after{display:none}
.pblock--prog .compose li i{flex:0 0 26px;text-align:right;font-size:17px;color:var(--lavender)}
.pblock--prog .compose li b{display:inline;font-size:var(--fs-md);margin:0}
.pblock--prog .compose li small{font-size:var(--fs-tag);letter-spacing:.06em}
/* свёрнутое состояние + кнопка (создаёт motion.js) */
.pblock--prog .compose{transition:max-height .9s var(--dl-ease,cubic-bezier(.16,1,.3,1))}
.pblock--prog.collapsed .compose{max-height:500px;overflow:hidden;
  -webkit-mask-image:linear-gradient(#000 68%,transparent);
  mask-image:linear-gradient(#000 68%,transparent)}
.pblock--prog.open .compose{max-height:6000px}
.prog-more{margin-top:16px}

/* лектор: карточка не сирота — во всю правую колонку, крупнее фото */
.pblock .lectors{max-width:none}
.pblock .lector{display:flex;gap:22px;align-items:center;background:#fff;
  border:1px solid var(--line);border-radius:20px;padding:24px 26px;
  box-shadow:var(--shadow)}
.pblock .lector .ph{width:96px;height:96px;border-radius:18px;flex:0 0 auto;
  background:linear-gradient(135deg,var(--lavender),var(--terra))}
/* строки программы не тянутся под самую высокую в ряду */
.pblock--prog .compose ul{align-items:start}
.pblock--prog .compose li{min-height:0;height:auto}

/* ---------- продукт: доводка по фидбеку 08.07 ---------- */
/* нумерованные списки CMS (ol) — те же плашки, номер в чипе */
.pblock .prose:not(.for-whom) ol{list-style:none;counter-reset:po;padding:0;margin:14px 0;
  display:grid;grid-template-columns:1fr 1fr;gap:12px}
.pblock .prose:not(.for-whom) ol li{counter-increment:po;padding-left:52px}
.pblock .prose:not(.for-whom) ol li::before{content:counter(po);width:24px;height:24px;
  top:13px;left:16px;border-radius:8px;background:var(--lavender-soft);color:var(--violet);
  display:grid;place-items:center;font-weight:700;font-size:var(--fs-mini);font-family:'Arsenal',Georgia,serif}
@media(max-width:1100px){.pblock .prose:not(.for-whom) ol{grid-template-columns:1fr}}

/* «доступ N мес. / бессрочный» у кнопки — чип с галочкой, не сирота */
.pbuy .muted{display:inline-flex;align-items:center;gap:9px;align-self:center;
  padding:10px 18px;border-radius:999px;background:var(--lavender-soft);
  color:var(--violet);font-weight:600;font-size:var(--fs-fine);white-space:nowrap}
.pbuy .muted::before{content:"";display:inline-block;width:15px;height:15px;flex:0 0 auto;
  background:currentColor;
  -webkit-mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg>') center/contain no-repeat;
          mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg>') center/contain no-repeat}

/* лектор — крупная представительная карточка */
.pblock .lector{padding:34px 38px;gap:32px;border-radius:var(--radius);
  background:linear-gradient(155deg,#fff,var(--cream-mist))}
.pblock .lector .ph{width:150px;height:150px;border-radius:24px}
.pblock .lector b{font-size:25px;font-family:'Arsenal',Georgia,serif;font-weight:400}
.pblock .lector small{display:block;font-size:var(--fs-note);color:var(--terra-ink);
  font-weight:700;letter-spacing:.04em;margin:5px 0 10px}
.pblock .lector p{font-size:var(--fs-md);line-height:1.55;max-width:60ch;margin:0}

/* похожие: бейдж типа продукта на карточке */
.rel .b{position:relative}
.rel-type{display:inline-block;font-size:var(--fs-micro);font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:var(--violet);background:var(--lavender-soft);
  border-radius:999px;padding:4px 10px;margin-bottom:8px;width:max-content}
/* подпись секции похожих — по центру под заголовком */
.rel-sub{text-align:center;color:var(--muted);margin:-22px 0 30px;font-size:var(--fs-sm)}
/* заголовок отзывов продукта — в общем стиле секций (центр + черта) */
@media(min-width:961px){
  .rev-cloud-sec .container > h2{text-align:center;font-size:clamp(28px,2.6vw,38px)}
  .rev-cloud-sec .container > h2::after{content:"";display:block;width:56px;height:3px;
    border-radius:3px;background:linear-gradient(90deg,var(--lavender),var(--terra));
    margin:14px auto 0}
}
/* play в рилсах: угол, а не центр — по центру кружок держал кадр как сторис,
   а низ кадра занимает подпись. Инсетами, БЕЗ translate-центрирования:
   базовый слой центрирует через translate(-50%,-50%), а hover-scale его
   затирал, кнопка прыгала на полразмера вправо-вниз */
.stories__row .story__inner .play-sm{position:absolute;inset:12px 12px auto auto;margin:0;transform:none}
.stories__row .story:hover .story__inner .play-sm{transform:scale(1.15)}

/* ---------- правки 08.07 вечер ---------- */
/* «Личный приём»: карточка-плашка читалась ИИшно — editorial-строка:
   хэйрлайн сверху, капс-лейбл терра, сериф-CTA со стрелкой в круге
   (грамматика каталога/отзывов; акцент секции остаётся у фото/заголовка) */
.priem{margin-top:38px;background:none;border:0;border-radius:0;box-shadow:none;
  padding:26px 0 0;border-top:1px solid var(--dl-hairline);
  display:flex;align-items:center;justify-content:space-between;gap:26px;flex-wrap:wrap}
.priem .t b{font-size:var(--fs-tag);font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  color:var(--terra-ink);margin-bottom:7px}
.priem .t span{font-size:var(--fs-sm);color:var(--muted)}
.priem__cta{display:inline-flex;align-items:center;gap:15px;text-decoration:none;
  font-family:'Arsenal',Georgia,serif;font-size:clamp(20px,1.8vw,24px);line-height:1.15;
  color:var(--violet)}
.priem__lbl{position:relative}
.priem__lbl::after{content:"";position:absolute;left:0;bottom:-6px;height:1px;width:100%;
  background:currentColor;opacity:.28;transform:scaleX(.34);transform-origin:left;
  transition:transform .55s cubic-bezier(.22,.61,.2,1),opacity .55s}
.priem__cta:hover .priem__lbl::after{transform:scaleX(1);opacity:.62}
.priem__arr{display:grid;place-items:center;width:42px;height:42px;border-radius:50%;
  flex:0 0 auto;border:1px solid var(--edge-strong);font-size:17px;
  transition:background .45s,color .45s,border-color .45s,
    transform .45s cubic-bezier(.22,.61,.2,1)}
.priem__cta:hover .priem__arr{background:var(--violet);border-color:var(--violet);
  color:#fff;transform:translateX(5px)}

/* топ-бар v5: яркий оранжевый закат (фидбек Юли 08.07 — читаться ярче) */
.topbar{font-size:var(--fs-sm);
  background:linear-gradient(115deg,#C25A35,#E8763F 30%,#F5934F 52%,#E06A38 78%,#C25A35);
  background-size:260% 260%;animation:tb-aurora 10s ease infinite}
.topbar__in{padding:14px 20px;gap:16px}
.topbar__text em{font-size:18px;
  background:linear-gradient(100deg,#FFEDDA 20%,#fff 40%,#FFD3AE 60%,#FFEDDA 80%);
  background-size:250% 100%;-webkit-background-clip:text;background-clip:text}
.topbar__cta{font-size:var(--fs-note);padding:7px 8px 7px 18px;background:rgba(255,255,255,.18)}
/* вспышка белого на оранжевой полосе ломала спокойную глубину общего ховера */
.topbar__cta:hover{background:rgba(255,255,255,.18)}
.topbar__arr{width:23px;height:23px;color:#C25A35}
.topbar__spark{color:#FFE0BE;font-size:var(--fs-tag)}
.topbar__orb--a{background:radial-gradient(circle,#F2D8A7 0%,transparent 70%);opacity:.6}
.topbar__orb--b{background:radial-gradient(circle,#8E6FD8 0%,transparent 70%);opacity:.55}
/* иконки сайдбара ЛК — SVG вместо эмодзи */
.lk__nav button .ic{display:inline-grid;place-items:center;width:22px}
.lk__nav button .ic svg{width:18px;height:18px}
/* фото профиля: загруженный аватар и блок выбора */
.lk__user .ava,.ava--lg{background-size:cover;background-position:center}
.ava--lg{width:84px;height:84px;border-radius:50%;flex:0 0 auto;
  background-color:transparent;background-image:linear-gradient(135deg,var(--lavender),var(--terra))}
.ava-pick{cursor:pointer}

/* ---------- пакет «Editions»: интро, нить прогресса, VT, курсор ---------- */
/* интро-занавес (раз за сессию; inline-скрипт в base.html гейтит повтор) */
#intro{position:fixed;inset:0;z-index:var(--z-intro);display:grid;place-items:center;
  pointer-events:none}
#intro::before,#intro::after{content:"";position:absolute;left:0;right:0;height:50.5%;
  background:var(--cream)}
#intro::before{top:0;animation:introUp .95s cubic-bezier(.76,0,.24,1) 1.1s forwards}
#intro::after{bottom:0;animation:introDown .95s cubic-bezier(.76,0,.24,1) 1.1s forwards}
#intro img{position:relative;z-index:2;height:76px;
  animation:introLogo .7s ease .1s both,introLogoOut .4s ease .85s forwards}
@keyframes introLogo{from{opacity:0;transform:translateY(18px) scale(.92)}to{opacity:1;transform:none}}
@keyframes introLogoOut{to{opacity:0;transform:scale(1.1)}}
@keyframes introUp{to{transform:translateY(-101%)}}
@keyframes introDown{to{transform:translateY(101%)}}
@media(prefers-reduced-motion:reduce){#intro{display:none}}

/* нить прогресса чтения */
#readbar{position:fixed;top:0;left:0;right:0;height:2.5px;z-index:var(--z-readbar);
  transform:scaleX(0);transform-origin:0 50%;pointer-events:none;
  background:linear-gradient(90deg,var(--lavender),var(--terra),var(--violet))}


/* ---------- категории: общий язык с главной/продуктом ---------- */
.cathead{padding:var(--sec-half) 0 20px}
.cathead h1{font-size:var(--fs-h1)}
.cathead__band{height:4px;width:84px;
  background:linear-gradient(90deg,var(--accent),var(--accent-soft))}
.cathead__chip{display:inline-block;margin-left:12px;vertical-align:2px;
  font-size:var(--fs-tag);font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--accent);background:var(--accent-soft);border-radius:999px;padding:5px 13px}
/* подфильтры — пилюльный тумблер, как на главной */
.subfilter{display:inline-flex;flex-wrap:wrap;gap:4px;background:#fff;
  border:1px solid var(--line);border-radius:var(--radius);padding:6px;
  box-shadow:var(--shadow-sm)}
.subfilter button{border:0;background:transparent;padding:10px 20px;cursor:pointer;
  transition:background .35s,color .35s,box-shadow .35s}
.subfilter button.on{background:var(--accent);color:#fff;border:0;
  box-shadow:0 8px 20px -8px var(--accent)}

/* ---------- живой поиск (панель из шапки, Ctrl/Cmd+K) ----------
   Механика — как у поиска apple.com и палитр Raycast/Linear: страница уходит
   в размытие, панель проявляется сверху со стороны лупы (точка роста —
   центр кнопки, --qs-ox), содержимое догоняет лесенкой, одна плашка
   выделения переезжает между строками. Всё на transition, не keyframes:
   Esc посреди открытия разворачивает движение от текущего кадра. Закрытие —
   тот же путь обратно и короче. Панель прячется visibility с задержкой, а не
   display:none — иначе у закрытия не было бы движения вовсе.
   Во вшитом критическом CSS (includes/critical_css.html) живут ПРЕЖНИЕ
   правила панели: display:none держит её скрытой, пока этот файл не
   доехал, а остальное (рамка, отступы строки, круглый крестик) здесь
   перекрыто явно — до пересборки критического CSS. */
.qs{--qs-ease:cubic-bezier(.16,1,.3,1);--qs-ease-in:cubic-bezier(.4,0,.9,.6);
  display:block;position:fixed;inset:0;z-index:var(--z-overlay);visibility:hidden;pointer-events:none;
  transition:visibility 0s linear .26s}
.qs.on{visibility:visible;pointer-events:auto;transition-delay:0s}
.qs__back{position:absolute;inset:0;background:var(--night-veil);
  backdrop-filter:blur(14px) saturate(115%);-webkit-backdrop-filter:blur(14px) saturate(115%);
  opacity:0;transition:opacity .26s var(--qs-ease-in)}
.qs.on .qs__back{opacity:1;transition:opacity .45s var(--qs-ease)}
.qs__panel{position:relative;width:min(640px,calc(100% - 32px));max-width:none;margin:clamp(72px,12vh,128px) auto 0;
  background:#fff;border:0;border-radius:24px;overflow:hidden;animation:none;
  backdrop-filter:none;-webkit-backdrop-filter:none;
  box-shadow:0 0 0 1px rgba(46,36,64,.06),var(--veil);
  transform-origin:var(--qs-ox,50%) 0;opacity:0;transform:translateY(-12px) scale(.965);
  transition:opacity .2s var(--qs-ease-in),transform .26s var(--qs-ease-in)}
.qs.on .qs__panel{opacity:1;transform:none;
  transition:opacity .3s var(--qs-ease),transform .55s var(--qs-ease)}
/* содержимое догоняет панель лесенкой: строка, подпись, подвал */
.qs__row,.qs__label,.qs__foot{opacity:0;transform:translateY(-6px);transition:opacity .15s,transform .15s}
.qs.on .qs__row,.qs.on .qs__label,.qs.on .qs__foot{opacity:1;transform:none;
  transition:opacity .4s var(--qs-ease) var(--d,0s),transform .55s var(--qs-ease) var(--d,0s)}
.qs.on .qs__row{--d:.04s}
.qs.on .qs__label{--d:.09s}
.qs.on .qs__foot{--d:.14s}

.qs__row{position:relative;display:flex;align-items:center;gap:0;padding:0;border-bottom:0}
.qs__glyph{position:absolute;left:24px;top:50%;margin-top:-10px;color:var(--violet);pointer-events:none}
/* Поле — вся строка. Видимый фокус — линия под строкой наливается фирменным
   цветом: рамка вокруг единственного поля панели читалась как анкета. */
.qs__input{flex:1;min-width:0;border:0;outline:0;background:transparent;border-radius:0;
  padding:24px 96px 24px 58px;font-family:inherit;font-size:var(--fs-h4);font-weight:500;
  line-height:1.3;letter-spacing:-.01em;color:var(--ink);
  box-shadow:inset 0 -1px 0 var(--line)}   /* фокус — сразу, без перехода: индикатор не догоняет */
.qs__input:focus,.qs__input:focus-visible{outline:0;box-shadow:inset 0 -2px 0 var(--violet)}
.qs__input::placeholder{color:var(--muted);opacity:.75}
.qs__input::-webkit-search-cancel-button{-webkit-appearance:none;display:none}
.qs__close{position:absolute;right:18px;top:50%;transform:translateY(-50%);width:auto;height:28px;min-width:28px;
  padding:0 9px;display:inline-flex;align-items:center;justify-content:center;border:0;
  border-radius:999px;background:var(--line);color:var(--muted);cursor:pointer;
  transition:background .2s,color .2s}
.qs__close:hover{color:var(--ink)}
.qs__close:focus-visible{outline:2px solid var(--violet);outline-offset:2px}
.qs__close kbd{font-family:inherit;font-size:var(--fs-micro);font-weight:700;letter-spacing:.04em;
  background:none;border:0;padding:0;color:inherit}
.qs__x{display:none}

.qs__label{padding:16px 26px 6px;min-height:1em;font-size:var(--fs-micro);font-weight:700;
  letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.qs__list{position:relative;max-height:min(56vh,calc(var(--qs-vh,100vh) - 280px));
  overflow-y:auto;overscroll-behavior:contain;padding:4px 12px 12px;
  transition:height .45s var(--qs-ease)}
.qs__hl{position:absolute;left:12px;right:12px;top:0;height:0;border-radius:14px;
  background:var(--lavender-soft);background:color-mix(in srgb,var(--lavender-soft) 62%,#fff);
  opacity:0;pointer-events:none;
  transition:transform .32s var(--qs-ease),height .32s var(--qs-ease),opacity .2s}
.qs__hl.on{opacity:1}
/* строки двигает search.js (Web Animations): оставшаяся в выдаче переезжает,
   новая проявляется, ушедшая (.qs__gone) гаснет на своём месте поверх потока */
.qs__item,.qs__gone{position:relative;display:flex;align-items:center;gap:14px;padding:10px 12px;
  border-radius:14px}
.qs__gone{position:absolute;left:12px;right:12px;pointer-events:none}
.qs__list.is-growing{overflow-y:hidden}
.qs__item:focus-visible{outline:2px solid var(--violet);outline-offset:-2px}
.qs__pic{width:56px;height:40px;border-radius:10px;flex:0 0 auto;overflow:hidden;
  background:linear-gradient(135deg,var(--lavender),var(--terra))}
.qs__pic img{width:100%;height:100%;object-fit:cover;display:block}
.qs__body{flex:1;min-width:0}
.qs__body b{display:block;font-size:var(--fs-sm);font-weight:600;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qs__body small{color:var(--muted);font-size:var(--fs-mini)}
/* продукт найден по описанию: строка отрывка под типом и ценой, слово в <mark> */
.qs__hit{display:block;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qs__hit mark,.search-result__excerpt mark{background:none;color:var(--ink);font-weight:600}
/* то же на странице /search/: отрывок второй строкой в li (li — flex, ссылка на всю ширину) */
.search-results__list .search-result{flex-wrap:wrap;row-gap:0}
.search-result__excerpt{flex:0 0 100%;margin:6px 0 0;color:var(--muted);font-size:var(--fs-fine);line-height:1.5}
.qs__go{color:var(--violet);opacity:0;transform:translateX(-4px);
  transition:opacity .2s,transform .35s var(--qs-ease)}
.qs__item.sel .qs__go{opacity:1;transform:none}
.qs__empty{padding:26px 20px;text-align:center;color:var(--muted);font-size:var(--fs-note)}

.qs__foot{display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:12px 22px 14px 26px;border-top:1px solid var(--line);
  font-size:var(--fs-mini);color:var(--muted)}
.qs__keys kbd{display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;
  margin-right:3px;border-radius:6px;background:var(--line);font-family:inherit;
  font-size:var(--fs-micro);font-weight:700;color:var(--ink)}
.qs__keys kbd + kbd{margin-left:-1px}
.qs__keys kbd:nth-of-type(3){margin-left:12px}
.qs__all{margin-left:auto;color:var(--violet);font-weight:600;white-space:nowrap}
.qs__all-go{display:inline-block;transition:transform .35s var(--qs-ease)}
.qs__all:hover .qs__all-go,.qs__all:focus-visible .qs__all-go{transform:translateX(3px)}

/* палец: подсказок про клавиши нет, вместо «Esc» — крестик */
@media(hover:none),(pointer:coarse){
  .qs__keys,.qs__close kbd{display:none}
  .qs__x{display:block}
  .qs__close{width:34px;height:34px;padding:0}
}
/* телефон: панель — шторка сверху, список меряется по видимой области
   (--qs-vh из visualViewport), чтобы конец не уходил под клавиатуру */
@media(max-width:700px){
  .qs__panel{width:calc(100% - 20px);margin:10px auto 0;border-radius:22px}
  .qs__glyph{left:18px}
  .qs__input{padding:19px 62px 19px 48px;font-size:var(--fs-lg)}
  .qs__close{right:14px}
  .qs__label{padding:14px 20px 4px}
  .qs__list{max-height:calc(var(--qs-vh,100vh) - 200px);padding:4px 8px 8px}
  .qs__hl,.qs__gone{left:8px;right:8px}
  .qs__foot{padding:12px 20px}
}
@media(prefers-reduced-motion:reduce){
  .qs__panel,.qs.on .qs__panel,.qs__row,.qs__label,.qs__foot{transform:none}
  .qs__list,.qs__hl{transition:none}
}
@media(prefers-reduced-transparency:reduce){
  .qs__back{backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(46,34,71,.6)}
}

/* ---------- бут-хореография v2: киношная сборка при заходе ---------- */
@media(prefers-reduced-motion:no-preference){
  body.boot .topbar{animation:bootTop .85s cubic-bezier(.22,1,.36,1) calc(var(--bd,0s) + .25s) backwards}
  /* шапка собирается по элементам: лого слева, меню по пункту, кнопки справа */
  body.boot .logo{animation:bootL .8s cubic-bezier(.22,1,.36,1) calc(var(--bd,0s) + .3s) backwards}
  body.boot .header__nav a{animation:bootHead .65s cubic-bezier(.22,1,.36,1) backwards}
  body.boot .header__nav a:nth-child(1){animation-delay:calc(var(--bd,0s) + .4s)}
  body.boot .header__nav a:nth-child(2){animation-delay:calc(var(--bd,0s) + .46s)}
  body.boot .header__nav a:nth-child(3){animation-delay:calc(var(--bd,0s) + .52s)}
  body.boot .header__nav a:nth-child(4){animation-delay:calc(var(--bd,0s) + .58s)}
  body.boot .header__nav a:nth-child(5){animation-delay:calc(var(--bd,0s) + .64s)}
  body.boot .header__nav a:nth-child(6){animation-delay:calc(var(--bd,0s) + .7s)}
  body.boot .header__nav a:nth-child(7){animation-delay:calc(var(--bd,0s) + .76s)}
  body.boot .header__actions{animation:bootR .8s cubic-bezier(.22,1,.36,1) calc(var(--bd,0s) + .5s) backwards}
  /* hero: кинозум — из узкой светящейся рамки, с блюром в резкость */
  body.boot .hero-slider .slider{animation:bootHero 1.45s cubic-bezier(.16,1,.3,1) calc(var(--bd,0s) + .15s) backwards}
  /* контент слайда: строки вылетают с пружиной */
  body.boot .slide__text > *{animation:bootUp .9s cubic-bezier(.3,1.4,.45,1) backwards}
  body.boot .slide__text > :nth-child(1){animation-delay:calc(var(--bd,0s) + .85s)}
  body.boot .slide__text > :nth-child(2){animation-delay:calc(var(--bd,0s) + .97s)}
  body.boot .slide__text > :nth-child(3){animation-delay:calc(var(--bd,0s) + 1.09s)}
  body.boot .slide__text > :nth-child(4){animation-delay:calc(var(--bd,0s) + 1.21s)}
  body.boot .slide__media{animation:bootMedia 1.6s cubic-bezier(.16,1,.3,1) calc(var(--bd,0s) + .3s) backwards}
  /* страницы без слайдера: мягкое проявление контента (только opacity —
     transform сломал бы sticky-потомков на время анимации) */
  body.boot main{animation:bootMain 1s ease calc(var(--bd,0s) + .25s) backwards}
}
@keyframes bootTop{from{transform:translateY(-110%)}}
@keyframes bootL{from{opacity:0;transform:translateX(-28px)}}
@keyframes bootR{from{opacity:0;transform:translateX(28px)}}
@keyframes bootHead{from{opacity:0;transform:translateY(-18px)}}
@keyframes bootHero{
  0%{opacity:0;transform:translateY(70px) scale(1.12);filter:blur(10px);
    clip-path:inset(26% 18% 26% 18% round 44px)}
  45%{opacity:1;filter:blur(0)}
  100%{transform:none;clip-path:inset(0 0 0 0 round var(--radius,24px))}}
@keyframes bootUp{from{opacity:0;transform:translateY(64px)}}
@keyframes bootMedia{from{opacity:0;transform:scale(1.18)}}
@keyframes bootMain{from{opacity:0}}

/* ---------- «Что внутри»: живые цифры продукта (созвон 08.07, п.1) ---------- */
.inside{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.inside__card{position:relative;overflow:hidden;display:flex;flex-direction:column;gap:10px;
  padding:34px 34px 30px;border-radius:30px;min-height:210px;font-size:var(--fs-md);line-height:1.5}
.inside__card::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:url("../assets/cover-lines.edbb8a824af3.svg") center/cover no-repeat;opacity:.2;mix-blend-mode:soft-light}
.inside__card--lav{background:linear-gradient(160deg,var(--lav-card),var(--lav-card-2))}
.inside__card--terra{background:linear-gradient(160deg,var(--terra-soft),var(--terra-surface))}
.inside__card--cream{background:linear-gradient(160deg,var(--dl-cream-deep),var(--cream-mist))}
.inside__card--night{background:linear-gradient(155deg,var(--dl-night),var(--night-2));color:#EFE9FA}
.inside__card--night b{color:#fff}
.inside__num{font-family:'Arsenal';font-weight:400;font-size:60px;line-height:1;color:var(--lavender)}
.inside__card--terra .inside__num{color:var(--terra-ink)}
.inside__card--cream .inside__num{color:var(--gold)}
.inside__card b{font-family:'Arsenal';font-weight:400;font-size:var(--fs-h3);line-height:1.2}
.inside__card p{margin:0;color:inherit;opacity:.86}
/* карточки без цифры: заголовок опускается на линию цифровых */
.inside__card:not(:has(.inside__num)) b{margin-top:auto}
@media(max-width:760px){
  .inside{grid-template-columns:1fr}
  .inside__card{min-height:0;padding:26px 24px}
  .inside__num{font-size:46px}
  .inside__card:not(:has(.inside__num)) b{margin-top:0}
}

/* ---------- hero CTA (фидбек Юли 09.07, п.5) ---------- */
.hero__cta{display:flex;gap:14px;margin-top:28px;flex-wrap:wrap}

/* ---------- страница контактов (фидбек Юли 09.07, п.7) ---------- */
.contacts-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.contact-card{display:flex;flex-direction:column;gap:6px;padding:30px 32px;border-radius:var(--radius);
  background:linear-gradient(160deg,var(--lav-card),var(--lav-card-2));transition:transform .4s var(--r-ease,ease)}
.contact-card:nth-child(2){background:linear-gradient(160deg,var(--terra-soft),var(--terra-surface))}
.contact-card:nth-child(3){background:linear-gradient(160deg,var(--dl-cream-deep),var(--cream-mist))}
.contact-card:nth-child(4){background:linear-gradient(160deg,var(--lav-card),var(--lav-card-2))}
.contact-card:hover{transform:translateY(-4px)}
.contact-card b{font-family:'Arsenal';font-weight:400;font-size:var(--fs-h3)}
.contact-card span{color:var(--violet);font-weight:600}
.contact-card p{margin:0;opacity:.75;font-size:var(--fs-note)}
@media(max-width:700px){.contacts-grid{grid-template-columns:1fr}}

/* ---------- «Задать вопрос» (фидбек Юли 09.07, п.8) ---------- */
.askq{margin-top:44px;padding:38px 40px;border-radius:30px;
  background:linear-gradient(160deg,var(--lav-card),var(--lav-card-2))}
.askq__head h2{font-size:clamp(1.5rem,2.6vw,2rem);margin-bottom:6px}
.askq__head p{opacity:.75;margin:0 0 22px}
.askq__form{display:flex;flex-direction:column;gap:14px}
.askq__row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.askq__form .field{background:#fff}
.askq__form .btn{align-self:flex-start}
.askq__done{text-align:center;padding:16px 0}
.askq__done b{font-family:'Arsenal';font-weight:400;font-size:26px;display:block;margin-bottom:6px}
@media(max-width:700px){.askq{padding:26px 22px}.askq__row{grid-template-columns:1fr}}

/* ===== БАТЧ 12: HERO-СЛАЙДЕР → EDITORIAL PREMIUM (живопись + гигантская типографика + нумерация) ===== */
.hero-slider{padding:34px 0 14px}
.slide{min-height:clamp(480px,58vh,620px)}
/* живописные кадры сезона (Flux, рен-масло, неон-акцент по цвету слайда) */
.slide:nth-child(1) .slide__media{background:url("../img/home/slide-meno.1e3ddd1b6bd6.webp") center/cover}
.slide:nth-child(2) .slide__media{background:url("../img/home/slide-guide.94da01742b83.webp") center 60%/cover}
.slide:nth-child(3) .slide__media{background:url("../img/home/slide-glp.1eec6e6b601f.webp") center/cover}
/* скримы тоньше — живопись дышит, текст слева читается */
.slide::before{background:linear-gradient(97deg,var(--night-solid) 0%,rgba(86,61,135,.6) 34%,var(--dl-hairline) 58%,transparent 78%)}
.slide--2::before{background:linear-gradient(97deg,rgba(97,49,35,.88) 0%,var(--terra-line) 34%,var(--terra-wash) 58%,transparent 78%)}
.slide--3::before{background:linear-gradient(97deg,rgba(21,49,84,.9) 0%,rgba(63,129,191,.5) 34%,rgba(63,129,191,.12) 58%,transparent 78%)}
/* editorial-типографика + номер главы */
.slides{counter-reset:sl}
.slide{counter-increment:sl}
.slide__text{padding:64px 60px 104px;max-width:660px}
.slide__text .eyebrow{display:flex;align-items:center;gap:14px;font-size:var(--fs-mini);letter-spacing:.22em}
.slide__text .eyebrow::before{content:"0" counter(sl);font:600 12px/1 "Open Sans",sans-serif;letter-spacing:.08em;color:#fff;opacity:.92;padding:5px 10px;border:1px solid rgba(255,255,255,.42);border-radius:999px}
.slide__text h2{font-size:clamp(38px,4.6vw,72px);line-height:1.02;letter-spacing:-.01em;max-width:14ch;margin:18px 0 16px}
.slide__text p{font-size:var(--fs-lg);max-width:40ch;opacity:.92}
/* тёмный слайд требует белой надписи, поэтому глубина не съедает контраст */
.slide .btn--slide{align-self:flex-start;background:transparent;color:#fff;border:1px solid rgba(255,255,255,.55);padding:13px 28px;border-radius:999px}
.slide .btn--slide:hover{background:transparent;border-color:var(--violet);color:#fff;
  transform:translateY(-1px);box-shadow:var(--lift-sm)}
/* прогресс: цифры 01/02/03 с линией-таймером вместо точек */
.slider__dots{counter-reset:sd;left:60px;bottom:30px;gap:26px;align-items:flex-end}
.slider__dots button{counter-increment:sd;width:auto!important;height:auto;background:none!important;border-radius:0;color:rgba(255,255,255,.5);font:600 12px/1 "Open Sans",sans-serif;letter-spacing:.12em;display:flex;flex-direction:column;gap:8px;transition:color .3s}
.slider__dots button::before{content:"0" counter(sd)}
.slider__dots button::after{content:"";display:block;width:46px;height:2px;background:rgba(255,255,255,.28)}
.slider__dots button.active{color:#fff}
.slider__dots button.active::after{background-color:rgba(255,255,255,.28);background-image:linear-gradient(#fff,#fff);background-repeat:no-repeat;animation:sdFill 5s linear both}
@keyframes sdFill{from{background-size:0% 100%}to{background-size:100% 100%}}
/* белый знак остаётся читаемым на всех трёх картинах, а отклик даёт глубина */
.slider__arrow{background:transparent;border:1px solid rgba(255,255,255,.45);color:#fff;box-shadow:none;width:44px;height:44px;font-size:20px;
  transition-property:transform,box-shadow,background-color,border-color,color,letter-spacing;
  transition-duration:.55s;transition-timing-function:cubic-bezier(.4,.05,.2,1)}
.slider__arrow:hover{background:transparent;border-color:var(--violet);color:#fff;
  transform:translateY(-1px);letter-spacing:.06em;
  box-shadow:var(--lift-sm)}
@media(max-width:920px){
  .slide__text{padding:44px 26px 104px}
  .slide__text h2{font-size:clamp(34px,9vw,48px)}
  .slider__dots{left:26px;bottom:26px}
  .slide::before,.slide--2::before,.slide--3::before{background:linear-gradient(180deg,rgba(30,22,45,.7) 0%,rgba(30,22,45,.42) 60%,rgba(30,22,45,.6) 100%)}
}

/* ===== БАТЧ 13: панель = глава с заголовком (реф Editions: тёмная зона всегда несёт типографику) ===== */
section.hero-slider{padding:64px 0 56px}
.hs-head{margin-bottom:30px}
.hs-head .eyebrow{display:block;color:#B9A7E0;margin-bottom:12px;font-size:var(--fs-mini);letter-spacing:.24em}
.hs-head h2{color:#fff;font-size:clamp(36px,4.4vw,68px);line-height:1.02;letter-spacing:-.01em}
@media(max-width:920px){section.hero-slider{padding:48px 0 44px}.hs-head{margin-bottom:20px}}

/* ===== БАТЧ 14: ЗОНА ИСТОРИИ — статы крупнее, лид-магнит = синий editorial-блок знания ===== */
.stat__n{font-size:clamp(56px,6.4vw,96px);line-height:1}
.stat__l{font-size:var(--fs-mini);letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-top:10px}
/* лид-магнит: партитура бренда — чек-лист = знание = синий; жёсткий блок, editorial */
.lead{padding:56px 0}

/* ===== БАТЧ 15: КАТАЛОГ ГЛАВНОЙ = EDITORIAL-ИНДЕКС (реф: fantasy.co work list) ===== */
/* тумблер: пилюли → текстовые табы с подчёркиванием */
.aud-toggle{background:none;border:none;box-shadow:none;display:flex;gap:28px;padding:0;margin:22px 0 4px;border-radius:0}
/* капс-текст в языке eyebrow; !important гасит чип и тень active из style.css */
.aud-toggle button{background:none!important;border:none;border-radius:0;box-shadow:none!important;padding:6px 0 10px;
  font:600 13px/1 "Open Sans",sans-serif;letter-spacing:.1em;text-transform:uppercase;
  color:var(--muted);position:relative;transition:color .3s}
.aud-toggle button:hover{color:#3A2B5E}
.aud-toggle button::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--violet);
  transform:scaleX(0);transform-origin:left;transition:transform .35s ease}
.aud-toggle button.active{color:var(--violet)!important}
.aud-toggle button.active::after{transform:none}
/* ===== БАТЧ 21: КАТАЛОГ = ТИПОГРАФИКА-ИНТЕРФЕЙС (реф shopify.design:
   разделы — гигантские серифные строки-ссылки; ховер наливает фиолет,
   рисует подчёркивание, пускает световой мазок по строке — отсылка
   к живописи hero; без линий, номеров и карточек) ===== */
/* плавная смена аудитории: контейнер едет по высоте, уходящая гаснет вверх,
   входящая проявляется снизу */
.aud-panels{transition:height .55s cubic-bezier(.32,.72,0,1);overflow:hidden}
.aud-panel{transition:opacity .2s,transform .2s}
.aud-panel.leaving{opacity:0;transform:translateY(-10px)}
.aud-panel.active{animation:audIn .5s cubic-bezier(.32,.72,0,1)}
@keyframes audIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .aud-panels{transition:none}
  .aud-panel.active{animation:none}
}
/* служебная шапка: eyebrow слева, табы справа — одной строкой, список = герой */
.cat-head{display:flex;align-items:baseline;justify-content:space-between;gap:24px;
  padding-bottom:18px;border-bottom:1px solid var(--edge-card)}
.cat-head .eyebrow{margin:0}
.cat-head .aud-toggle{margin:0}
@media(max-width:920px){.cat-head{flex-direction:column;align-items:flex-start;gap:6px}}
/* отступ padding'ом, не margin: margin схлопывается сквозь панель и врёт
   offsetHeight при анимации высоты (обрезало подстрочные «р»/«ц») */
.aud-panel.active{display:flow-root}
/* ===== ОГЛАВЛЕНИЕ ГЛАВНОЙ — механика Shopify Editions, типографика наша:
   интро — серифный Arsenal в полном контрасте; док внизу слева — капс
   с трекингом (язык eyebrow/тумблера), актив фиолетом с дорожкой ===== */
@media(min-width:1200px){
  .vhero-intro{position:relative;z-index:4;height:112vh;
    display:flex;align-items:flex-start;justify-content:center}
  /* центр первого экрана, не секции: секция выше вьюпорта на хвост-ранвей */
  .pgx-frame{margin-top:max(20px,calc(46vh - 330px))}
  /* ночная вуаль первой загрузки (чертёжная фаза Editions): выше хедера,
     интро на время секвенции поднимается ещё выше */
  .pgx-veil{position:fixed;inset:0;z-index:var(--z-veil);background:var(--night);pointer-events:none}
  .vhero-intro.pgx-lift{z-index:var(--z-veil-hero)}
  /* чертёж: циркульные дуги, вертикали-колонны, угловые метки */
  .pgx-draft{position:absolute;inset:0;width:100%;height:100%}
  .pgx-draft circle,.pgx-draft line{stroke:rgba(255,255,255,.42);fill:none;stroke-width:1;
    vector-effect:non-scaling-stroke}
  .pgx-corn{position:absolute;width:44px;height:44px;opacity:0;
    border-left:1px solid rgba(255,255,255,.62);border-top:1px solid rgba(255,255,255,.62)}
  .pgx-corn--br{transform:rotate(180deg)}
  /* рамка-рождение (язык рамки hero): хэйрлайн, лёгкий крем-налив */
  .pgx-frame{position:relative;display:flex;flex-direction:column;align-items:flex-start;
    gap:16px;padding:40px 48px 34px;border:1px solid rgba(86,61,135,.4);
    background:rgba(253,247,235,.22)}
  .pgx-brand{display:flex;flex-direction:column;gap:10px}
  .pgx-brand b{font:400 clamp(30px,2.5vw,38px)/1.05 'Arsenal',Georgia,serif;color:var(--night);
    letter-spacing:-.01em;font-weight:400}
  .pgx-brand span{font:600 12px/1 'Open Sans',sans-serif;letter-spacing:.32em;
    text-transform:uppercase;color:var(--violet)}
  .pgx-sub{margin:0;font:italic 400 15px/1.5 'Arsenal',Georgia,serif;color:var(--muted)}
  .pgx-stage{display:flex;flex-direction:column;gap:3px;will-change:transform}
  .pgx-stage button{display:flex;align-items:baseline;width:min(470px,46vw);
    background:none;border:none;cursor:pointer;text-align:left;padding:0;
    font:400 clamp(19px,1.75vw,23px)/1.3 'Arsenal',Georgia,serif;
    color:var(--night);transition:color .3s}
  .pgx-stage button:hover{color:var(--violet)}
  .pgx-stage button span{flex:0 1 auto;white-space:nowrap}
  .pgx-stage button .dots{flex:1;margin:0 14px;border-bottom:1px dotted rgba(46,34,71,0);
    transition:border-color .3s}
  .pgx-stage button:hover .dots{border-color:var(--night-fill)}
  .pgx-stage button i{font:400 14px/1 'Arsenal',Georgia,serif;font-style:normal;
    color:rgba(46,34,71,.78);letter-spacing:.04em}
  /* док: низ-лево, капс с трекингом — служебная типографика сайта */
  .page-index{position:fixed;left:14px;bottom:16px;z-index:var(--z-page-index);
    display:flex;flex-direction:column;gap:1px;transition:opacity .5s}
  .page-index.pgx-wait{opacity:0;pointer-events:none}
  .page-index button{display:flex;align-items:baseline;width:154px;padding:3px 0;
    background:none;border:none;cursor:pointer;text-align:left;
    font:600 11.5px/1.5 'Open Sans',sans-serif;letter-spacing:.11em;text-transform:uppercase;
    color:var(--text-secondary);transition:color .35s}
  .page-index button span{display:block;max-width:110px;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap}
  .page-index button .dots{flex:1;margin:0 7px;border-bottom:1px dotted rgba(86,61,135,0);
    transition:border-color .3s}
  .page-index button i{font:400 11px/1 'Arsenal',Georgia,serif;font-style:normal;
    letter-spacing:.03em;color:inherit}
  .page-index button:hover{color:var(--night)}
  .page-index button.on{color:var(--violet)}
  .page-index button.on .dots{border-color:rgba(86,61,135,.55)}
  /* ночные зоны */
  .page-index.inv button{color:rgba(255,255,255,.78)}
  .page-index.inv button:hover{color:#fff}
  .page-index.inv button.on{color:#fff}
  .page-index.inv button.on .dots{border-color:rgba(255,255,255,.6)}
}
@media(max-width:1199.9px){.page-index,.vhero-intro{display:none}}

/* якорная прокрутка оглавления: зазор под липкую шапку */
.vhero,.hero-slider,.lead,.cat,.reviews,.expert,.stories,.blog{scroll-margin-top:136px}

/* Контейнеры страниц держат общий центральный рельс. Прежний глобальный
   отступ под левое оглавление сдвигал вправо страницы без оглавления
   (корзину, поиск и ЛК). */
@media(min-width:1200px){
  .container{margin-left:auto;margin-right:auto}
  /* сцена отзывов растянута на всю ширину — рельс держим паддингом */
  .rev-cloud-sec .container{margin:0;padding-left:max(5vw,196px)}
}

/* ночная бут-заглушка главной: те же шторы #intro, но без логотипа и в ночи;
   секвенция снимает их на DOMContentLoaded; страховка — авторазъезд позже */
body.pgx-boot #intro::before,body.pgx-boot #intro::after{background:var(--night);animation-delay:2.6s}
body.pgx-boot #intro img{display:none}

/* рамка героя — только хэйрлайн: крем-заливка с блюром давала молочную
   плиту поверх светлых облаков («белый фон» из фидбека 11.07) */
.vhero.vhero--frame .vhero__in{background:transparent;
  backdrop-filter:none;-webkit-backdrop-filter:none}

/* угол ауры отзывов: регистрируем, чтобы анимировался плавно */
@property --rvA{syntax:'<angle>';initial-value:40deg;inherits:false}

/* ══ КАТЕГОРИЯ КАТАЛОГА — ПРЕМ-СКИН (16.07, body.cat-clean) ═══════════
   Белый лист вместо крема, хэйрлайн-карточки без тяжёлых теней,
   зум обложки на ховере, цена тише, стрелка в круге (система главной).
   Заголовки продуктов нормализованы в данных (были капсом с импорта). */
body.cat-clean{background:#fff}
body.cat-clean .cathead{padding:44px 0 8px}
body.cat-clean .cathead h1{color:var(--violet);letter-spacing:-.015em}
body.cat-clean .cathead__band{width:100%;height:1px;border-radius:0;
  background:var(--hair);margin-top:30px}
body.cat-clean .cathead__chip{background:transparent;color:var(--muted);
  border:1px solid var(--hair-strong);box-shadow:none}
body.cat-clean .subfilter{border:1px solid var(--hair);box-shadow:none;
  background:#fff}
body.cat-clean .subfilter button{color:var(--muted);transition:color .2s,background .25s}
body.cat-clean .subfilter button.on{background:var(--violet);color:#fff}
body.cat-clean .plist-sec{padding:34px 0 90px}
body.cat-clean .plist{gap:28px}
body.cat-clean .pcard{border:1px solid var(--hair);border-radius:18px;
  box-shadow:none;background:#fff;
  transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s,border-color .25s}
body.cat-clean .pcard:hover{transform:translateY(-4px);border-color:var(--hair-active);
  box-shadow:var(--shadow)}
body.cat-clean .pcard__cover{border-bottom:1px solid var(--hair-soft)}
body.cat-clean .pcard__img{transition:transform .8s cubic-bezier(.16,1,.3,1)}
body.cat-clean .pcard:hover .pcard__img{transform:scale(1.05)}
body.cat-clean .pcard__tag{background:rgba(255,255,255,.94);color:var(--violet);
  font-weight:600;letter-spacing:.06em;text-transform:uppercase;font-size:var(--fs-tag)}
body.cat-clean .pcard__tag.free{background:var(--violet);color:#fff}
.pcard__tag.closed,body.cat-clean .pcard__tag.closed{left:auto;right:16px;
  background:rgba(238,236,240,.96);color:var(--text-secondary);box-shadow:none}
/* снятое с продажи в списке приглушено: рядом с продающимися карточками
   яркая цена того, что купить нельзя, читается как предложение */
.pcard--closed{opacity:.66}
.pcard--closed:hover{opacity:.9}
.pcard--closed .pcard__price{color:var(--muted)}
body.cat-clean .pcard__price{font-size:var(--fs-lg);font-weight:600}
body.cat-clean .pcard__go{width:36px;height:36px;border-radius:50%;
  display:grid;place-items:center;gap:0;font-size:var(--fs-md);color:var(--violet);
  border:1px solid var(--hair-strong);
  transition:background .25s,color .25s,border-color .25s,transform .35s}
body.cat-clean .pcard:hover .pcard__go{background:var(--violet);color:#fff;
  border-color:var(--violet);transform:none}
@media(prefers-reduced-motion:reduce){
  body.cat-clean .pcard,body.cat-clean .pcard__img{transition:none}
}

/* ── настройка воздуха и ритма категории (16.07, вторая итерация):
   шапка дышит как секции главной, подпись под H1 (иерархия эйбрау →
   заголовок → подпись), тип-лейбл в карточке (закрывает дыру у 26
   продуктов без описания), ступень средней колонки против монотонности
   сетки, мета прижата к низу — карточки в ряду держат линию ── */
body.cat-clean .cathead{padding:78px 0 8px}
body.cat-clean .cathead .crumbs{margin-bottom:26px}
body.cat-clean .cathead h1{margin-top:8px}
body.cat-clean .cathead p{margin-top:18px;font-size:var(--fs-md);color:var(--muted);max-width:52ch}
body.cat-clean .cathead__band{margin-top:46px}
body.cat-clean .subfilter{margin-top:16px}
body.cat-clean .plist-sec{padding:56px 0 132px}
body.cat-clean .plist{column-gap:30px;row-gap:48px}
body.cat-clean .pcard__kind{font-size:var(--fs-micro);letter-spacing:.2em;text-transform:uppercase;
  color:var(--muted);font-weight:600}
body.cat-clean .pcard__b{gap:10px;padding:24px 26px 26px}
body.cat-clean .pcard__meta{margin-top:auto;padding-top:12px}
@media(min-width:921px){
  /* ступень вешает main.js по видимому индексу (nth-child ломался фильтром) */
  body.cat-clean .plist>.pcard--step{margin-top:36px}
}
/* белый лист категории: глушим фоновые атмосферы — WebGL-канвас и
   скролльную вуаль настроения (терра-вуаль красила низ в крем,
   споря с белыми карточками) */
body.cat-clean #moodveil{display:none}
/* пустой результат фильтра: подпись мягко всплывает, пока сетка
   плавно сжимается (высоту анимирует main.js) */
body.cat-clean .plist-empty{margin:26px 0 0;color:var(--muted);font-size:var(--fs-md);
  opacity:0;transform:translateY(10px);
  transition:opacity .6s cubic-bezier(.16,1,.3,1) .25s,
             transform .6s cubic-bezier(.16,1,.3,1) .25s}
body.cat-clean .plist-empty.on{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){
  body.cat-clean .plist-empty{transition:none;transform:none}
}

/* ══ СТРАНИЦА ПРОДУКТА — ПРЕМ-СКИН (16.07, body.prod-clean) ════════════
   Тот же язык, что на главной и в категории: белый лист вместо крема,
   хэйрлайны вместо пастельных плит и тяжёлых теней, тихая цена, воздух
   в шапке. Капс уроков нормализован в данных (321 шт., бэкап в docs/).
   Лента-росчерк в баннере остаётся — лежит под контентом. */
body.prod-clean{background:#fff}
body.prod-clean #moodveil{display:none}

/* шапка продукта: воздух и иерархия как в категории */
body.prod-clean .pbar{padding:84px 0 60px}
body.prod-clean .pbar .crumbs{margin-bottom:24px}
body.prod-clean .pbar h1{color:var(--violet);font-weight:400;letter-spacing:-.01em}
body.prod-clean .pbar .lede{color:var(--muted)}
body.prod-clean .price-now{font-weight:400;color:var(--violet)}
body.prod-clean .pbar__media{box-shadow:none;border:1px solid var(--hair)}
body.prod-clean .smart-note{background:#fff;border:1px solid var(--hair-strong)}

/* секции: больше воздуха, полоса под заголовком — хэйрлайн */
body.prod-clean .block{padding:88px 0}
body.prod-clean .pblock .container > h2::after{width:64px;height:1px;
  background:var(--hair-strong)}

/* «О продукте»: списки без пастельных заливок */
body.prod-clean .pblock .prose:not(.for-whom) li{background:#fff;
  border:1px solid var(--hair);box-shadow:none}
body.prod-clean .pblock .prose:not(.for-whom) li:nth-child(3n+2),
body.prod-clean .pblock .prose:not(.for-whom) li:nth-child(3n+3){background:#fff}

/* «Что внутри»: белые карточки с хэйрлайном, лифт на ховере;
   тёмная карточка остаётся единственным акцентом */
body.prod-clean .inside__card{background:#fff;border:1px solid var(--hair);
  box-shadow:none;border-radius:18px;
  transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s,border-color .25s}
body.prod-clean .inside__card::after{display:none}
body.prod-clean .inside__card:hover{transform:translateY(-4px);
  border-color:var(--hair-active);box-shadow:var(--shadow)}
body.prod-clean .inside__card--night{background:linear-gradient(155deg,var(--night),var(--night-2));
  border-color:transparent}

/* программа: номера — хэйрлайн-круги */
body.prod-clean .compose li{box-shadow:none}
body.prod-clean .for-whom li{background:#fff;border-color:var(--hair)}
body.prod-clean .compose li i{background:#fff;border:1px solid var(--hair-strong);
  border-radius:50%;font-weight:400}

/* лектор, FAQ, тарифы, похожие: хэйрлайны вместо теней */
body.prod-clean .lector{box-shadow:none;border-color:var(--hair)}
body.prod-clean .acc{box-shadow:none;border-color:var(--hair);background:#fff}
body.prod-clean .tariff{border:1px solid var(--hair)}
body.prod-clean .tariff.hit{border:1.5px solid var(--violet)}
body.prod-clean .rel{box-shadow:none;border-color:var(--hair);
  transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s,border-color .25s}
body.prod-clean .rel:hover{transform:translateY(-4px);border-color:var(--hair-active);
  box-shadow:var(--shadow)}
/* скролл-дрифт (view()) на картинках похожих дёргал их при ховере:
   карточка сдвигается → view() пересчитывает дрифт → рывок в противоход.
   На продукте дрифт глушим, вместо него плавный зум картинки */
body.prod-clean .rel .img{animation:none}
body.prod-clean .rel .img img{transition:transform .6s cubic-bezier(.16,1,.3,1)}
body.prod-clean .rel:hover .img img{transform:scale(1.045)}
@media(prefers-reduced-motion:reduce){
  body.prod-clean .inside__card,body.prod-clean .rel{transition:none}
  body.prod-clean .rel .img img{transition:none}
  body.prod-clean .rel:hover .img img{transform:none}
}
/* лента-росчерк на мобиле вылезала за вьюпорт (h-scroll) — прячем */
@media(max-width:900px){body.prod-clean .dl-ribbon{display:none}}

/* «Для кого» на продукте: вместо пустоватых боксов — редакционный
   чек-лист колонкой, галочка в хэйрлайн-круге, разделители-хэйрлайны */
body.prod-clean .for-whom ul{display:flex;flex-direction:column;gap:0;
  max-width:640px;margin:0 auto}
body.prod-clean .for-whom li{background:none;border:none;border-radius:0;
  border-top:1px solid var(--hair);padding:20px 4px;
  display:flex;align-items:flex-start;gap:16px;
  font-weight:400;font-size:var(--fs-lg);line-height:1.5}
body.prod-clean .for-whom li:first-child{border-top:0}
body.prod-clean .for-whom li::before{content:"";flex:0 0 auto;width:26px;height:26px;
  margin-top:1px;border-radius:50%;border:1px solid var(--hair-strong);
  background:url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23563D87" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 12.5l4 4 8-9"/></svg>') center/13px no-repeat}

/* лектор: мини-версия блока «Об эксперте» с главной */
body.prod-clean .plector{display:grid;grid-template-columns:340px 1fr;gap:64px;
  align-items:center;max-width:1000px;margin:0 auto}
body.prod-clean .plector__media{margin:0;border-radius:20px;overflow:hidden;
  border:1px solid var(--hair);aspect-ratio:3/4}
body.prod-clean .plector__media img{width:100%;height:100%;object-fit:cover;display:block}
body.prod-clean .plector__name{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:clamp(30px,3.2vw,42px);color:var(--violet);margin:0;letter-spacing:-.01em}
body.prod-clean .plector__role{margin:10px 0 0;color:var(--terra-ink);font-size:var(--fs-md);
  letter-spacing:.02em}
body.prod-clean .plector__facts{list-style:none;margin:28px 0 0;padding:0}
body.prod-clean .plector__facts li{border-top:1px solid var(--hair);
  padding:15px 2px;font-size:var(--fs-lg);color:var(--text-secondary);line-height:1.5}
body.prod-clean .plector__facts li:last-child{border-bottom:1px solid var(--hair)}
body.prod-clean .plector__link{display:inline-flex;align-items:center;gap:10px;
  margin-top:28px;color:var(--violet);font-weight:600;font-size:var(--fs-md)}
body.prod-clean .plector__link span{width:32px;height:32px;border-radius:50%;
  display:grid;place-items:center;font-size:var(--fs-note);border:1px solid var(--hair-strong);
  transition:background .25s,color .25s,border-color .25s}
body.prod-clean .plector__link:hover span{background:var(--violet);color:#fff;
  border-color:var(--violet)}
@media(max-width:720px){
  body.prod-clean .plector{grid-template-columns:1fr;gap:24px;max-width:460px}
  body.prod-clean .plector__media{max-width:300px}
}

/* ── прем-фиксы аудита продукта (16.07) ─────────────────────────────────
   1) «Что внутри»: карточки без числа центрируют контент — не висит дыра
   2) похожие: карточки в системе категории (тихий тип, «от», стрелка в круге)
   3) подписка: чистый градиент вместо AI-картинки с псевдотекстом
   4) полоса под «Отзывы» — хэйрлайн, как у остальных заголовков */
body.prod-clean .inside__card:not(:has(.inside__num)){justify-content:center}
body.prod-clean .rel-type{background:none;padding:0;border-radius:0;
  font-size:var(--fs-micro);letter-spacing:.2em;color:var(--muted);font-weight:600;margin-bottom:2px}
body.prod-clean .rel .b{padding:18px 20px;gap:8px}
body.prod-clean .rel .b b{font-size:var(--fs-sm)}
body.prod-clean .rel-meta{margin-top:auto;display:flex;align-items:center;
  justify-content:space-between;gap:10px;padding-top:10px}
body.prod-clean .rel .b .p{margin-top:0;font-weight:600;font-size:var(--fs-lg);color:var(--violet)}
body.prod-clean .rel-go{width:32px;height:32px;border-radius:50%;display:grid;
  place-items:center;font-size:14px;color:var(--violet);
  border:1px solid var(--hair-strong);
  transition:background .25s,color .25s,border-color .25s}
body.prod-clean .rel:hover .rel-go{background:var(--violet);color:#fff;border-color:var(--violet)}
body.prod-clean .pnewsletter{background:linear-gradient(150deg,var(--night),var(--night-2))}
@media(min-width:961px){
  body.prod-clean .rev-cloud-sec .container > h2::after{height:1px;border-radius:0;
    background:var(--hair-strong);width:64px}
}

/* разделение секций хэйрлайнами — как на главной (nx-line2) */
body.prod-clean article > .block,
body.prod-clean article > .reviews{border-top:1px solid var(--hair-soft)}

/* ── наполнение продукта в ритме главной (16.07) ────────────────────────
   Полоса доверия продукта и тёмная цитата-манифест между программой и лектором. */
body.prod-clean .pproof{border-block:1px solid var(--hair);background:#fff}
body.prod-clean .pproof__in{display:grid;
  grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px;padding:38px 0}
body.prod-clean .pproof__i{padding-inline:22px;border-left:1px solid var(--hair-soft);
  display:flex;flex-direction:column}
body.prod-clean .pproof__i:first-child{border-left:0}
body.prod-clean .pproof__n{font-family:'Arsenal',Georgia,serif;font-weight:700;line-height:1;
  font-size:var(--fs-num);color:var(--violet)}
body.prod-clean .pproof__l{margin-top:10px;font-size:var(--fs-note);color:var(--muted)}
@media(max-width:720px){
  body.prod-clean .pproof__in{grid-template-columns:1fr 1fr;gap:24px 8px}
  body.prod-clean .pproof__i:nth-child(odd){border-left:0}
}

body.prod-clean .pquote{position:relative;overflow:hidden;
  background:linear-gradient(150deg,var(--night),var(--night-2));padding:96px 0;text-align:center}
body.prod-clean .pquote::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:url("../assets/cover-lines.edbb8a824af3.svg") center/cover no-repeat;
  opacity:.25;mix-blend-mode:soft-light}
body.prod-clean .pquote .container{position:relative;z-index:1}
body.prod-clean .pquote__t{margin:0 auto;max-width:21ch;
  font-family:'Arsenal',Georgia,serif;font-weight:400;line-height:1.3;
  font-size:clamp(24px,3vw,38px);color:#EFE9FA}
body.prod-clean .pquote__a{display:block;margin-top:26px;font-size:var(--fs-note);
  letter-spacing:.14em;text-transform:uppercase;color:rgba(217,207,235,.75)}
/* рельс оглавления (сдвиг .container вправо ≥1200px) нужен только
   страницам с левым доком — у продукта и категории его нет, контейнеры
   возвращаем к симметрии (цитата на тёмном выдавала сдвиг) */
@media(min-width:1200px){
  body.prod-clean .container,body.cat-clean .container{
    margin-left:auto;margin-right:auto}
}

/* стики-плашка покупки: тёмная пилюля спорила с белым листом, а ховер
   «Купить» заливал фиолетовым фиолетовую надпись (текст исчезал).
   Теперь белое стекло с хэйрлайном, кнопка — фиолетовая с белым текстом,
   ховер темнеет к #4A3473 (текст всегда читается) */
body.prod-clean .dl-buybar .in{background:var(--glass);
  border:1px solid var(--hair);
  box-shadow:var(--shadow)}
body.prod-clean .dl-buybar .t{color:var(--violet)}
body.prod-clean .dl-buybar .p{color:var(--muted)}
body.prod-clean .dl-buybar .btn{background:var(--violet);color:#fff}
body.prod-clean .dl-buybar .btn::after{background:#4A3473}
/* заливка-свип кнопок (::after, z-index:0) рисовалась ПОВЕРХ голых
   текстовых узлов — у кнопок без <span> надпись исчезала на ховере
   (стики-плашка «Купить», «В корзину» и др.). isolation + z-index:-1:
   свип поверх фона кнопки, но всегда под текстом */
.btn{isolation:isolate}
.btn::after{z-index:-1}
/* единая высота пилюль по всему сайту. Авторазмер давал разнобой:
   <a>/<span>/<label> наследовали line-height 1.6 (+4px к <button>),
   заливные без бордера были ниже ghost, соседство с полем растягивало
   кнопку по stretch (корзина, «Применить» 54px). Фикс-высота закрывает всё */
.btn{line-height:1.2;height:var(--btn-h-m);padding:0 var(--btn-px-m);
  font-size:var(--btn-fs-m);flex-shrink:0}
.btn--lg{height:var(--btn-h);padding:0 var(--btn-px);font-size:var(--btn-fs)}
.btn--sm{height:var(--btn-h-s);padding:0 var(--btn-px-s);font-size:var(--btn-fs-s)}

/* ══ ЛИЧНЫЙ КАБИНЕТ — ПРЕМ-РЕДИЗАЙН (18.07, body.lk-clean) ═══════
   Кабинет = продолжение журнала главной: белый фон, Arsenal-приветствие,
   терра-капс, хэйрлайны, редакционные строки. Сайдбар-дашборд убран,
   навигация — горизонтальные табы как ссылки хедера */
body.lk-clean{background:#fff}
body.lk-clean #moodveil{display:none}
body.lk-clean .lk{padding:var(--sec-half) 0}

/* шапка: приветствие + табы */
.lk__head{margin-bottom:42px}
.lk__hello{display:flex;align-items:center;gap:22px;margin-bottom:36px}
.lk__hello .ava{width:64px;height:64px;border-radius:50%;flex:0 0 auto;
  background:var(--lavender-soft) center/cover;display:grid;place-items:center;
  font-family:'Arsenal',Georgia,serif;font-weight:700;font-size:26px;color:var(--violet)}
.lk__eyebrow{display:block;font-size:var(--fs-mini);font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:var(--terra-ink);margin-bottom:4px}
.lk__hello h1{font-family:'Arsenal',Georgia,serif;font-weight:700;font-size:var(--fs-h1-page);
  color:var(--violet);letter-spacing:-.015em;line-height:1.06}
.lk__tabs{display:flex;gap:30px;align-items:baseline;
  border-bottom:1px solid var(--hair)}
.lk__tabs a,.lk__tabs button{position:relative;display:inline-block;padding:0 0 14px;
  font-size:var(--fs-sm);font-weight:600;color:var(--ink);opacity:.72;
  background:none;border:0;cursor:pointer;font-family:inherit;line-height:1.2}
.lk__tabs a:hover,.lk__tabs button:hover{opacity:1}
/* фокус с клавиатуры отличим от «этот раздел открыт»: на активной вкладке
   у .on тот же цвет, и без своей рамки было не понять, где сейчас курсор */
.lk__tabs a:focus-visible,.lk__tabs button:focus-visible{outline:2px solid var(--violet);
  outline-offset:3px;border-radius:3px;opacity:1}
.lk__tabs a::after{content:"";position:absolute;left:0;bottom:-1px;height:2px;width:0;
  border-radius:2px;background:var(--violet);transition:width .4s var(--r-ease)}
.lk__tabs a.on{color:var(--violet);opacity:1}
.lk__tabs a.on::after{width:100%}
.lk__tabs form{margin-left:auto}
.lk__tabs button{color:var(--muted);font-weight:500}
/* точка у вкладки «Профиль», пока телефон не привязан: подчёркивание вкладки
   уже занято состоянием «здесь вы сейчас», поэтому метка — сбоку сверху */
.lk__dot{position:absolute;top:1px;right:-10px;width:6px;height:6px;
  border-radius:50%;background:var(--terra)}

/* строка раздела «Вход и безопасность»: одна разметка на
   почту, пароль и телефон, у телефона — два тона (templates/lms/_phone_block.html).
   Промо — карточка в потоке дашборда; настройка — плоская секция профиля,
   чтобы не спорить с ритмом соседних .psec. Заливка кремовая, а не
   лавандовая: насыщенная плашка на кремовой странице читалась баннером */
.accrow{display:grid;gap:16px;margin:0 0 34px;padding:22px 24px;
  border-radius:var(--r-panel);background:#fff;
  border:1px solid var(--hair);box-shadow:none}
.accrow__top{display:flex;align-items:flex-start;gap:14px}
/* медальон вместо эмодзи: эмодзи рисуется шрифтом системы и в кабинете
   больше нигде не встречается */
.accrow__ic{flex:0 0 46px;width:46px;height:46px;border-radius:50%;
  background:#fff;border:1px solid var(--hair);color:var(--violet);
  display:grid;place-items:center}
.accrow__b{flex:1 1 auto;min-width:0}
.accrow__h{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:var(--fs-h3);color:var(--night);margin:0 0 4px;line-height:1.25}
.accrow__s{color:var(--muted);font-size:var(--fs-sm);margin:0}
.accrow[data-state="on"] .accrow__s,
.accrow[data-state="pending"] .accrow__s{color:var(--muted-strong);
  font-variant-numeric:tabular-nums}
.accrow .dj-chip{align-self:center}
.accrow .dj-error,.accrow .smart-note{margin:0}

/* три шага: точка с подписью, соединитель между ними. Состояние держит
   один атрибут data-step на списке, а не класс на каждом пункте */
.lk-steps{display:flex;align-items:flex-start;gap:0;margin:0;padding:0;
  list-style:none;counter-reset:s}
.lk-steps__i{flex:0 0 auto;position:relative;padding-top:14px;
  font-size:var(--fs-micro);color:var(--muted);letter-spacing:.02em;
  min-width:72px;text-align:left}
.lk-steps__i::before{content:"";position:absolute;top:0;left:0;width:8px;height:8px;
  border-radius:50%;border:1.5px solid var(--line);background:#fff}
.lk-steps__i+.lk-steps__i::after{content:"";position:absolute;top:3.5px;right:100%;
  width:64px;height:1px;background:var(--line)}
.lk-steps[data-step="1"] .lk-steps__i:first-child::before,
.lk-steps[data-step="2"] .lk-steps__i:nth-child(2)::before{
  border-color:var(--violet);box-shadow:0 0 0 3px var(--lavender-soft)}
.lk-steps[data-step="1"] .lk-steps__i:first-child,
.lk-steps[data-step="2"] .lk-steps__i:nth-child(2){color:var(--violet);font-weight:600}
.lk-steps[data-step="2"] .lk-steps__i:first-child::before{
  background:var(--violet);border-color:var(--violet)}
.lk-steps[data-step="2"] .lk-steps__i:nth-child(2)::after{background:var(--violet)}

.accrow__row{display:grid;grid-template-columns:1fr 1fr;gap:14px;max-width:660px}
/* раскрывашка приглашения: карточка на входе в кабинет зовёт одной кнопкой,
   а поля показывает тому, кто согласился. Нативная details — работает без
   JS и с клавиатуры */
.accrow__more{display:block}
/* сама кнопка — штатная .btn со свечением, как на главной; шеврон отдельным
   span, потому что ::after у .btn занят бликом (glow.css) */
.accrow__open{width:max-content;cursor:pointer;list-style:none}
.accrow__open::-webkit-details-marker{display:none}
.accrow__chev{width:7px;height:7px;border-right:1.5px solid currentColor;
  border-bottom:1.5px solid currentColor;transform:translateY(-2px) rotate(45deg);
  transition:transform .3s var(--r-ease)}
.accrow__more[open] .accrow__open{margin-bottom:18px}
.accrow__more[open] .accrow__chev{transform:translateY(1px) rotate(225deg)}
.accrow__more[open] .lk-steps,.accrow__more[open] form{animation:accrow-in .28s var(--r-ease) both}
@keyframes accrow-in{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  .accrow__chev{transition:none}
  .accrow__more[open] .lk-steps,.accrow__more[open] form{animation:none}
}
/* до раскрытия шаги обещают работу, которой ещё не просили */
.lk-steps--hide{display:none}
.accrow form{display:grid;gap:16px}
.accrow__f{display:grid;gap:6px;min-width:0}
.accrow__f .field{width:100%}
.accrow__lab{font-size:var(--fs-note);color:var(--muted-strong);font-weight:600}
.accrow__act{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.accrow .accrow__snooze{display:block;margin-top:-4px}

/* ячейки кода: настоящее поле одно (name="code"), ячейки — его отражение,
   поэтому без JS видно поле, а с JS — ячейки */
.accrow__cells{display:flex;gap:9px}
.accrow__cells .otp-digit:nth-child(3){margin-right:13px}
.accrow__cells .otp-digit{width:48px;height:48px;text-align:center;
  font-size:var(--fs-h3);border:1.4px solid var(--field-line);
  border-radius:var(--r-small);background:#fff;font-variant-numeric:tabular-nums}
.accrow__cells .otp-digit:focus{outline:none;border-color:var(--violet);
  box-shadow:var(--field-ring)}
.accrow__code{max-width:220px;letter-spacing:.32em;
  font-variant-numeric:tabular-nums}

@media(max-width:560px){
  .accrow{padding:18px;gap:14px}
  .accrow__row{grid-template-columns:1fr}
  /* «Позже» отдельной строкой, а не сбоку от кнопки: в правом нижнем углу
     висит пузырь чата и накрывает всё, что жмётся к краю */
  .accrow__act{width:100%}
  .accrow__act .btn{width:100%;text-align:center}
  .accrow__snooze{width:100%}
  .lk-phone__later{width:100%}
  .lk-steps__i{min-width:64px}
  .lk-steps__i+.lk-steps__i::after{width:56px}
  .accrow__cells{gap:6px}
  .accrow__cells .otp-digit{width:44px}
  .accrow__cells .otp-digit:nth-child(3){margin-right:9px}
}

/* КЛЮЧ В КОЛЬЦЕ ИЗ ТОЧЕК — идея из рефа Apple Account (Даня, 25.09), язык —
   кабинета: кольцо в цветах циферблатов полок, точки загораются по кругу по
   очереди, как их штрихи, а сам блок — строка кабинета, а не страница Apple
   («сделать родным и меньше»). Точки рисует сервер (lk_tags.phone_ring),
   здесь размер и зажигание. Размер кольца — переменная --ring у тона. */
.pring{flex:0 0 var(--ring,76px);width:var(--ring,76px);height:var(--ring,76px);
  position:relative;display:grid;place-items:center;border:0;border-radius:0;background:none}
.pring__dots{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.pring__key{position:relative;width:calc(var(--ring,76px) * .24);height:auto;color:var(--violet)}
/* ВАРИАНТ A «Ключ повернулся» (Даня 25.09, прототип в подборке анимаций):
   у привязанного номера в центре кольца галочка вместо ключа. Сразу после
   верного кода phone-bind.js ставит блоку .is-just-on — ключ делает четверть
   оборота, как в замке, гаснет, штрихом рисуется галочка, по кольцу проходит
   светлая волна. При обычном заходе на страницу виден сразу финальный кадр */
.pring__done{position:absolute;left:50%;top:50%;width:calc(var(--ring,76px) * .3);height:auto;
  translate:-50% -50%;color:var(--violet);opacity:0}
.pring__done path{stroke-dasharray:24;stroke-dashoffset:24}
.lk-phone[data-state="on"] .pring__key{opacity:0}
.lk-phone[data-state="on"] .pring__done{opacity:1}
.lk-phone[data-state="on"] .pring__done path{stroke-dashoffset:0}
@media (prefers-reduced-motion:no-preference){
  .lk-phone.is-just-on .pring__key{animation:pring-turn .62s cubic-bezier(.3,.7,.2,1) both}
  .lk-phone.is-just-on .pring__done{animation:pring-show .12s .47s both}
  .lk-phone.is-just-on .pring__done path{animation:pring-draw .38s .47s var(--dl-ease) both}
  .lk-phone.is-just-on .pring__dots circle{animation:pring-wave .52s ease-out both;
    animation-delay:calc(.14s + var(--k,0) * .62s + var(--i,0) * 40ms)}
}
@media (prefers-reduced-motion:reduce){
  .lk-phone.is-just-on .pring__key{animation:pring-show .2s both reverse}
  .lk-phone.is-just-on .pring__done{animation:pring-show .2s both}
}
@keyframes pring-turn{0%{opacity:1;transform:rotate(0)}68%{opacity:1;transform:rotate(90deg)}
  100%{opacity:0;transform:rotate(90deg) scale(.6)}}
@keyframes pring-show{from{opacity:0}to{opacity:1}}
@keyframes pring-draw{from{stroke-dashoffset:24}to{stroke-dashoffset:0}}
@keyframes pring-wave{35%{transform:scale(1.7);fill:var(--wave,var(--violet))}}
/* зажигание: точка за точкой по часовой (--k — очередь точки), внутренний
   ряд на шаг раньше внешнего. При загрузке ждём, пока проявится main
   (bootMain); при подмене региона (шаг кода, «привязан») phone-bind.js
   ставит --pring-d:0s, и кольцо загорается сразу — это отклик на смену шага */
@media (prefers-reduced-motion:no-preference){
  .pring__dots circle{transform-box:fill-box;transform-origin:center;
    animation:pring-lit .5s var(--dl-ease) both;
    animation-delay:calc(var(--pring-d, calc(var(--bd,0s) + .6s)) + var(--k,0) * .7s + var(--i,0) * 60ms)}
}
@keyframes pring-lit{from{opacity:0;transform:scale(.3)}to{opacity:1;transform:none}}

/* дашборд: тёмная плита, как «Продолжить» в кабинете и первый экран
   «Консультаций» (Даня 25.09: белая карточка бедная, справа пусто, «Позже»
   голым текстом). Слева заголовок, текст и две кнопки — белая пилюля и
   контурная; справа крупное кольцо, точки от лавандового к белому (--c),
   как циферблаты на тёмных плитках полок. Раскрытая форма и шаг кода —
   под текстом, кольцо остаётся справа */
.accrow--promo{--ring:clamp(128px,11vw,156px);--pad:clamp(22px,2.6vw,34px);
  position:relative;isolation:isolate;overflow:hidden;
  display:flex;flex-wrap:wrap;align-items:center;gap:18px 12px;
  padding:var(--pad) calc(var(--ring) + var(--pad) * 2.2) var(--pad) calc(var(--pad) * 1.2);
  min-height:calc(var(--ring) + var(--pad) * 2);
  border:0;border-radius:28px;background:var(--night);color:#fff;box-shadow:var(--veil);
  --glow:var(--btn-glow-light);--glow-off:var(--btn-glow-light-off);
  --glow-base:var(--btn-glow-light-base);--glow-base-off:var(--btn-glow-light-base-off)}
/* вместо размытой обложки — размытые пятна палитры, под кольцом светлее */
.accrow--promo::before{content:"";position:absolute;inset:-20%;z-index:-1;pointer-events:none;filter:blur(24px);
  background:radial-gradient(22% 46% at 84% 50%,rgba(179,149,219,.34),transparent 70%),
             radial-gradient(34% 52% at 6% 10%,rgba(86,61,135,.8),transparent 70%)}
.accrow--promo>*{flex:1 1 100%;min-width:0}
.accrow--promo .accrow__top{display:block}
.accrow--promo .pring{position:absolute;right:calc(var(--pad) * 1.2);top:50%;transform:translateY(-50%)}
.accrow--promo .pring__dots circle{fill:var(--c,var(--lavender))}
.accrow--promo .pring__key{color:#fff}
.accrow--promo .pring__done{color:#fff}
.accrow--promo{--wave:#fff}
.accrow--promo .accrow__h{font-weight:700;font-size:calc(var(--fs-h3) * 1.36);line-height:1.1;
  color:#fff;margin:0 0 8px;text-wrap:balance}
.accrow--promo .accrow__s,
.accrow--promo[data-state] .accrow__s{color:rgba(255,255,255,.78);font-size:var(--fs-md);max-width:52ch}
.accrow--promo .accrow__more:not([open]),.accrow--promo .accrow__snooze{flex:0 0 auto}
.accrow--promo .accrow__snooze{margin-top:0}
/* кнопки на тёмном: главная — белая пилюля, как «Продолжить», вторая — контур */
.accrow--promo .btn:not(.btn--ghost){background:#fff;color:var(--violet)}
.accrow--promo .btn--ghost{color:#fff;border-color:rgba(255,255,255,.42)}
.accrow--promo .btn--ghost:hover{color:#fff;border-color:#fff}
.accrow--promo .btn:focus-visible{outline-color:#fff}
/* подписи раскрытой формы и шага кода на тёмном */
.accrow--promo .accrow__lab{color:rgba(255,255,255,.88)}
.accrow--promo .accrow__hint{color:rgba(255,255,255,.64)}
.accrow--promo .lk-steps .lk-steps__i{color:rgba(255,255,255,.62)}
.accrow--promo .lk-steps[data-step="1"] .lk-steps__i:first-child,
.accrow--promo .lk-steps[data-step="2"] .lk-steps__i:nth-child(2){color:#fff}
.accrow--promo .lk-steps .lk-steps__i::before{background:transparent;border-color:rgba(255,255,255,.4)}
.accrow--promo .lk-steps .lk-steps__i+.lk-steps__i::after{background:rgba(255,255,255,.24)}
.accrow--promo .lk-steps[data-step="1"] .lk-steps__i:first-child::before,
.accrow--promo .lk-steps[data-step="2"] .lk-steps__i:nth-child(2)::before{
  border-color:#fff}
.accrow--promo .lk-steps[data-step="2"] .lk-steps__i:first-child::before{background:#fff;border-color:#fff}
.accrow--promo .lk-steps[data-step="2"] .lk-steps__i:nth-child(2)::after{background:#fff}
/* подпись пароля длиннее и уходит на две строки — поля выравниваем по низу */
.accrow--promo .accrow__row{align-items:end}
/* кольцо — в центре свободного места справа от содержимого (Даня 25.09:
   «сильно справа и много пустого места»). Ширину содержимого задаёт правый
   отступ плиты (--content своя у каждого шага и равна видимому краю: текст
   приглашения, поля формы, ячейки кода), кольцо встаёт посередине отступа; раскрыли
   форму — кольцо плавно переезжает. 100% в padding — ширина родителя, она же
   ширина плиты; в left у абсолютного кольца — ширина самой плиты. Уже 900 px
   места справа не хватает — там кольцо остаётся у правого края, как было */
@media (min-width:901px){
  .accrow--promo{--content:460px;--padl:calc(var(--pad) * 1.2);
    padding-right:calc(100% - var(--content) - var(--padl))}
  .accrow--promo:has(.accrow__more[open]){--content:580px}
  .accrow--promo[data-state="pending"]{--content:376px}  /* ровно по ячейкам: 6×52 + зазоры 5×10 + разрыв 12 */
  .accrow--promo .pring{right:auto;
    left:calc(var(--padl) + var(--content) + (100% - var(--padl) - var(--content)) / 2 - var(--ring) / 2);
    transition:left .55s var(--dl-ease)}
  /* свет плиты — под кольцом (оно теперь около 70–76 % ширины) */
  .accrow--promo::before{
    background:radial-gradient(22% 50% at 73% 50%,rgba(179,149,219,.34),transparent 70%),
               radial-gradient(34% 52% at 6% 10%,rgba(86,61,135,.8),transparent 70%)}
}
@media (min-width:901px) and (prefers-reduced-motion:reduce){
  .accrow--promo .pring{transition:none}
}
/* «привязан» на дашборде (Даня 25.09: после привязки блок пустой — текст
   прижат влево, кольцо одно справа): кольцо и текст одной группой по центру
   плиты. Сообщение «Номер добавлен. Вход по SMS включён.» повторяет плашку
   рядом — видно только скринридеру */
.accrow--promo[data-state="on"]{display:grid;grid-template-columns:auto auto;grid-template-rows:repeat(4,auto);
  justify-content:center;align-content:center;align-items:center;column-gap:clamp(28px,3.4vw,48px);row-gap:0;
  padding:var(--pad)}
.accrow--promo[data-state="on"] .accrow__top{display:contents}
/* свет плиты — под кольцом, а не справа над пустотой */
.accrow--promo[data-state="on"]::before{
  background:radial-gradient(20% 56% at 41% 50%,rgba(179,149,219,.34),transparent 70%),
             radial-gradient(34% 52% at 6% 10%,rgba(86,61,135,.8),transparent 70%)}
.accrow--promo[data-state="on"] .pring{position:relative;top:auto;right:auto;left:auto;transform:none;transition:none;grid-column:1;grid-row:1 / -1}
.accrow--promo[data-state="on"] :is(.accrow__b,.dj-chip),
.accrow--promo[data-state="on"]>:not(.accrow__top){grid-column:2;justify-self:start;margin-left:0}
.accrow--promo[data-state="on"] .dj-chip{margin-top:12px;align-self:auto}
.accrow--promo[data-state="on"] .accrow__act{margin-top:18px}
.accrow--promo[data-state="on"] .smart-note{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}
/* плашка «Вход по SMS включён» — в цветах сайта, а не зелёная (Даня 25.09):
   в профиле светло-лавандовая, на тёмной плите — лавандовое стекло */
.lk-phone .dj-chip--active{background:var(--lavender-soft);color:var(--violet)}
.accrow--promo .dj-chip--active{background:rgba(179,149,219,.2);color:#fff;border:1px solid rgba(179,149,219,.55)}
@media(max-width:560px){
  /* кольцо шире прежнего медальона: плашке «Вход по SMS включён» не хватало
     места, и номер ломался на две строки — плашка уходит под текст */
  .accrow__top{flex-wrap:wrap}
  .accrow__top .accrow__b{flex:1 1 170px}
  .accrow__top .dj-chip{margin-left:calc(var(--ring,76px) + var(--ring-gap,14px))}
  /* на телефоне кольцо встаёт слева от заголовка, кнопки — во всю ширину */
  .accrow--promo{--ring:72px;--ring-gap:14px;padding:20px;min-height:0;gap:14px}
  .accrow--promo .accrow__top{display:flex;align-items:center;gap:var(--ring-gap)}
  .accrow--promo .pring{position:relative;top:auto;right:auto;transform:none}
  .accrow--promo .accrow__h{font-size:var(--fs-h3)}
  .accrow--promo .accrow__more:not([open]),.accrow--promo .accrow__snooze{flex:1 1 100%}
  .accrow--promo .accrow__open{width:100%;justify-content:center}
  /* «привязан» на телефоне — всё столбиком по центру: кольцо, заголовок,
     номер, плашка, «Отключить» */
  .accrow--promo[data-state="on"]{grid-template-columns:auto;justify-items:center;text-align:center;--ring:96px}
  .accrow--promo[data-state="on"] .pring{grid-column:1;grid-row:auto;margin-bottom:14px}
  .accrow--promo[data-state="on"]::before{
    background:radial-gradient(46% 26% at 50% 26%,rgba(179,149,219,.34),transparent 70%),
               radial-gradient(40% 34% at 6% 8%,rgba(86,61,135,.8),transparent 70%)}
  .accrow--promo[data-state="on"] :is(.accrow__b,.dj-chip),
  .accrow--promo[data-state="on"]>:not(.accrow__top){grid-column:1;justify-self:center}
  /* «Отключить» — по центру и внутри своей строки (e2e поймал сдвиг −21,5 px) */
  .accrow--promo[data-state="on"] .accrow__act{justify-content:center}
}

/* ЗАПОЛНЕНИЕ ПО APPLE (Даня 25.09: «я бы взял у Эпл»). Замер account.apple.com:
   поле 56 px, скругление 12, подпись внутри поля — крупная, пока пусто, и
   уезжает вверх мелкой, когда в поле фокус или текст; фокус — рамка 2 px
   цветом акцента, без свечения; главная кнопка горит, только когда номер
   набран (phone-bind.js). Подпись всплывает через :has — где его нет, она
   просто всегда стоит вверху, поле от этого не ломается. */
.lk-phone .accrow__row .accrow__f{position:relative;display:block}
.lk-phone .accrow__row .accrow__lab{position:absolute;left:17px;right:17px;top:9px;z-index:1;
  font-size:var(--fs-mini);font-weight:500;line-height:1.3;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;pointer-events:none;transition:top .16s ease-out,font-size .16s ease-out,color .16s}
.lk-phone .accrow__row .accrow__f:has(.field:placeholder-shown:not(:focus)) .accrow__lab{
  top:18px;font-size:var(--fs-md)}
.lk-phone .accrow__row .field{height:56px;padding:24px 16px 6px;border-radius:12px;
  font-size:var(--fs-lg);border:1px solid var(--field-line);transition:border-color .2s,box-shadow .2s}
.lk-phone .accrow__row .field::placeholder{color:transparent;transition:color .2s}
.lk-phone .accrow__row .field:focus::placeholder{color:var(--muted)}
.lk-phone :is(.accrow__row .field,.accrow__cells .otp-digit):focus{outline:none;
  border-color:var(--violet);box-shadow:inset 0 0 0 1px var(--violet)}
/* ячейки кода — того же рода, что поле: 56 высотой, скругление 12; цифра
   входит в ячейку мягким «щелчком», как у Apple при вводе кода */
.lk-phone .accrow__cells{gap:10px}
.lk-phone .accrow__cells .otp-digit{flex:1 1 0;min-width:0;max-width:52px;height:60px;border-radius:12px;
  font-size:calc(var(--fs-h3) * 1.2);border:1px solid var(--field-line);transition:border-color .2s,box-shadow .2s}
@media (prefers-reduced-motion:no-preference){
  .lk-phone .accrow__cells .otp-digit:not(:placeholder-shown){animation:otp-pop .24s var(--dl-ease)}
}
@keyframes otp-pop{from{transform:scale(.84)}to{transform:none}}
/* на тёмной плите поля — стекло, фокус лавандовый */
.accrow--promo :is(.accrow__row .field,.accrow__cells .otp-digit){background:rgba(255,255,255,.07);
  border-color:rgba(255,255,255,.26);color:#fff;caret-color:#fff}
.accrow--promo .accrow__cells .otp-digit:not(:placeholder-shown){border-color:rgba(255,255,255,.55)}
.accrow--promo :is(.accrow__row .field,.accrow__cells .otp-digit):focus{border-color:var(--lavender);
  box-shadow:inset 0 0 0 1px var(--lavender)}
.accrow--promo .accrow__row .accrow__lab{color:rgba(255,255,255,.62)}
.accrow--promo .accrow__row .field:focus::placeholder{color:rgba(255,255,255,.4)}
/* автозаполнение браузера красит поле своим фоном — на тёмной плите это
   белая дыра; держим свой фон, не трогая тени (их считает тест токенов) */
.accrow--promo .accrow__row .field:-webkit-autofill{-webkit-text-fill-color:#fff;
  transition:background-color 600000s 0s,border-color .2s}
@media(max-width:560px){
  .lk-phone .accrow__cells{gap:6px}
  .lk-phone .accrow__cells .otp-digit{height:56px}
}

/* заголовок раздела */
body.lk-clean .lk-sec h2{font-family:'Arsenal',Georgia,serif;font-weight:400;font-size:30px;
  color:var(--violet);letter-spacing:-.01em;margin-bottom:6px}
body.lk-clean .lk-sec .lk-sub{color:var(--muted);margin-bottom:30px}
body.lk-clean .lk-next{margin-top:56px}
/* «Ваш следующий шаг» — сетка страницы каталога 1 в 1 (home.css,
   body.cat-page .plist): кабинет home.css не грузит, а у общей .plist из
   style.css другие отступ и переломы колонок */
body.lk-clean .lk-next-list{grid-template-columns:repeat(3,1fr);gap:clamp(18px,2.4vw,28px);align-items:stretch}
@media(max-width:1000px){body.lk-clean .lk-next-list{grid-template-columns:1fr 1fr}}
@media(max-width:620px){body.lk-clean .lk-next-list{grid-template-columns:1fr}}

/* «В ваших материалах» — уроки купленных курсов в выдаче поиска. Отдельная
   рамка, чтобы не путались с витриной: это уже оплаченное, а не покупка */
.my-lessons{margin-bottom:26px;padding:20px 22px;border-radius:20px;
  background:var(--cream);border:1px solid var(--line)}
.my-lessons__h{font-family:'Arsenal',Georgia,serif;font-size:var(--fs-h4);color:var(--violet);
  margin:0 0 6px}
.my-lessons__list{margin-top:0}

/* пустое состояние */
/* ПУСТОЕ СОСТОЯНИЕ — один компонент на весь сайт.
   Пустая корзина, история заказов, обращения в поддержку и раздел без
   материалов схлопывали страницу в одну строку: подвал уезжал под шапку,
   экран выглядел сломанным, а не пустым. Держим высоту, объясняем
   словами и даём ровно один выход. */
.lk-empty{display:grid;align-content:center;justify-items:center;gap:14px;
  min-height:320px;padding:var(--sec-half) 24px;text-align:center;
  background:#fff;border:1px solid var(--hair);border-radius:var(--r-panel)}
.lk-empty__ic{width:56px;height:56px;border-radius:50%;background:#fff;
  border:1px solid var(--hair);color:var(--violet);display:grid;place-items:center}
.lk-empty h3{font-family:'Arsenal',Georgia,serif;font-weight:400;font-size:26px;
  line-height:1.15;color:var(--night);margin:0}
.lk-empty p{max-width:42ch;margin:0;font-size:var(--fs-sm);line-height:1.6;color:var(--muted)}
.lk-empty .btn{margin-top:6px}
/* пустой материал: объяснение мелким, два выхода в ряд (F142) */
.course-empty{display:flex;flex-direction:column;align-items:center;gap:14px}
.course-empty p{margin-bottom:0}
.course-empty__note{font-family:'Open Sans',sans-serif;font-size:var(--fs-sm);max-width:44ch;line-height:1.6}
.course-empty .btn{min-width:220px}

/* профиль: карточка растворяется — хэйрлайн-секции на белом */
body.lk-clean .psec+.psec{margin-top:26px;padding-top:26px;border-top:1px solid var(--line)}
body.lk-clean .flabel{margin:0 0 10px;font-size:var(--fs-mini);font-weight:600;
  letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
body.lk-clean .fhint{margin-top:8px;font-size:var(--fs-fine)}
body.lk-clean .ava--lg{background:var(--lavender-soft) center/cover;
  display:grid;place-items:center;font-family:'Arsenal',Georgia,serif;font-weight:700;
  font-size:32px;color:var(--violet)}

/* пары «поле+кнопка» и поля — лавандовая рамка */
body.lk-clean .pair,body.gift-clean .pair{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:end}
body.lk-clean .field{border-color:var(--field-line);border-radius:14px}
body.lk-clean .field:focus{border-color:var(--violet);box-shadow:var(--field-ring)}
body.lk-clean .field:disabled{background:var(--lav-card-2);border-color:var(--line);color:var(--muted)}

/* служебные панели (пустые состояния, сообщения) */
body.lk-clean .dj-panel{background:transparent;border:1px solid var(--hair);
  box-shadow:none}

@media(max-width:900px){
  .lk__head{margin-bottom:32px}
  .lk__hello{gap:16px;margin-bottom:26px}
  .lk__hello .ava{width:52px;height:52px;font-size:21px}
  .lk__hello h1{font-size:31px}
  .lk__tabs{gap:20px;overflow-x:auto;scrollbar-width:none}
  .lk__tabs::-webkit-scrollbar{display:none}
  .lk__tabs a,.lk__tabs button{white-space:nowrap;font-size:var(--fs-note);padding-bottom:12px}
  .lk__tabs button{min-width:44px;min-height:44px}
  body.lk-clean .lk-sec h2{font-size:25px}
}
@media(max-width:560px){
  /* выход не прячется за правым краем: на телефоне табы переносятся,
     а не образуют недоступную горизонтальную ленту */
  .lk__tabs{flex-wrap:wrap;overflow-x:visible}
  /* пары «поле+кнопка»: кнопка отжимала инпут до огрызка — в столбик */
  body.lk-clean .pair,body.gift-clean .pair{grid-template-columns:1fr}
  body.lk-clean .pair .btn,body.gift-clean .pair .btn{width:100%}
}

/* Палец попадает в цель от 44px по высоте, мышь — в любую. Замер 27.08 на 360
   и 390: вкладки кабинета 29px, раскрывашка «Вернуть деньги» 21px, кнопка
   «Оплатить» 33px, малые кнопки 40px, пункт списка уроков 41px — мимо всех.
   Растим поля, а не шрифт: раскладка не меняется.

   Граница 900, а не 560: планшет и телефон в ландшафте — те же пальцы, а на
   561px замер показывал ровно те же 29px у вкладок (правка 28.08 после
   ревью). Ширины выше 900 отданы мыши и остаются как были. */
@media(max-width:900px){
  .lk__tabs a,.lk__tabs button{min-height:44px;padding:11px 0 14px}
  main .btn--sm{height:44px}
  .course-nav__item{padding:13px 12px}
  /* галочка согласия: сам квадратик 13px, и на широком экране подпись влезает
     в одну строку — вся цель выходила 26px. Растим строку, а не квадратик */
  main label:has(input[type=checkbox]){min-height:44px}
}

/* табы ЛК без перезагрузки: движение как у тумблера каталога */
.lk__main{transition:height .55s var(--r-ease)}
/* обёртка приглашения главной кабинета — только для подмены вкладками, раскладку не трогает */
.lk__promo{display:contents}
.lk-sec{transition:opacity .2s,transform .2s}
.lk-sec.leaving{opacity:0;transform:translateY(-10px)}
@media(prefers-reduced-motion:reduce){
  .lk__main{transition:none}
  .lk-sec{transition:none}
  .lk-sec.leaving{opacity:1;transform:none}
}

/* ══ КОРЗИНА — ПРЕМ-СКИН (18.07, body.cart-clean) ═════════════════
   Была dj-panel на креме. Теперь язык журнала: белый фон, Arsenal,
   редакционные строки позиций с хэйрлайнами, промокод и сертификат —
   раскрывашки, полоса баланса с покрытием заказа */
body.cart-clean{background:#fff}
body.cart-clean #moodveil{display:none}

.cart2{padding:48px 0 96px}
.cart2 .crumbs{margin-bottom:34px}
.cart2__eyebrow{display:block;font-size:var(--fs-mini);font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:var(--terra-ink);margin-bottom:10px}
.cart2 h1{font-family:'Arsenal',Georgia,serif;font-weight:700;font-size:var(--fs-h1-page);
  line-height:1.06;color:var(--violet);letter-spacing:-.015em;margin-bottom:34px}

/* позиции: редакционные строки */
.cline{display:flex;align-items:center;gap:22px;padding:22px 0;
  border-bottom:1px solid var(--hair)}
.cline:first-child{border-top:1px solid var(--hair)}
.cline__b{flex:1;min-width:0}
.cline__meta{display:block;font-size:var(--fs-tag);font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--terra-ink);margin-bottom:6px}
.cline__b>b{display:block;font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:21px;color:var(--ink);line-height:1.2}
.cline__price{flex:0 0 auto;font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-variant-numeric:tabular-nums;font-size:21px;
  color:var(--violet);white-space:nowrap}
.cline__x{position:relative;flex:0 0 auto;width:44px;height:44px;border-radius:50%;cursor:pointer;
  border:0;background:transparent;
  color:var(--muted);font-size:17px;line-height:1;display:grid;place-items:center;
  transition-property:transform,box-shadow,background-color,border-color,color,letter-spacing;
  transition-duration:.55s;transition-timing-function:cubic-bezier(.4,.05,.2,1)}
/* зона нажатия 44px, видимый хэйрлайн-круг остаётся прежним 34px */
.cline__x::before{content:"";position:absolute;inset:5px;border-radius:50%;
  border:1px solid var(--hair-strong);pointer-events:none}
/* терракота сохраняет смысл удаления без тяжёлого заливного кружка */
.cline__x:hover{background:transparent;border-color:var(--terra);color:var(--terra-ink);
  transform:translateY(-1px);letter-spacing:.06em;
  box-shadow:var(--lift-sm)}
.cline__x:hover::before{border-color:var(--terra)}

/* при снижении движения новые подъёмы не должны превращаться в резкие скачки */
@media(prefers-reduced-motion:reduce){
  .slider__arrow,.gift-chips button,.cline__x{transition:none}
  .slider__arrow:hover,.gift-chips button:hover,.cline__x:hover{transform:none}
}

/* промокод и сертификат: раскрывашки */
.cart-extras{margin-top:10px;border-top:1px solid var(--hair)}
.cart-x{padding:16px 0;border-bottom:1px solid var(--line)}
.cart-x summary{list-style:none;cursor:pointer;font-size:var(--fs-note);font-weight:600;
  color:var(--violet);min-height:44px;display:flex;align-items:center}
.cart-x summary::-webkit-details-marker{display:none}
.cart-x summary::after{content:"+";float:right;color:var(--muted);
  margin-left:auto;font-weight:400;font-size:18px;line-height:1;
  transition:transform .3s var(--r-ease)}
.cart-x[open] summary::after{transform:rotate(45deg)}
.cart-x[open] summary{margin-bottom:14px}
.cart-x__login{padding:16px 0;border-bottom:1px solid var(--line);font-size:var(--fs-note);
  color:var(--muted)}
.cart-x__login a{color:var(--violet);text-decoration:underline;text-underline-offset:3px}
body.cart-clean .pair{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:end}
body.cart-clean .field{border-color:var(--field-line);border-radius:14px}
body.cart-clean .field:focus{border-color:var(--violet);box-shadow:var(--field-ring)}

/* баланс: полоса в духе строки цифр */
.cart-balance{display:flex;align-items:baseline;gap:16px;margin-top:26px;
  padding:20px 24px;border:1px solid var(--hair);border-radius:20px;
  background:linear-gradient(160deg,var(--lav-card-2),#FFF)}
.cart-balance b{font-family:'Arsenal',Georgia,serif;font-weight:400;font-size:27px;
  color:var(--violet);white-space:nowrap}
.cart-balance span{font-size:var(--fs-fine);color:var(--muted)}

.cart-pay{margin-top:28px}
.cart-continue{margin-top:16px;text-align:center}
.cart-continue a{font-size:var(--fs-note);color:var(--muted)}
.cart-continue a:hover{color:var(--violet)}

@media(max-width:560px){
  .cart2{padding-top:26px}
  .cart2 h1{font-size:33px;margin-bottom:24px}
  .cline{gap:14px;padding:18px 0}
  .cline__b>b{font-size:var(--fs-lg)}
  .cline__price{font-size:var(--fs-lg)}
  .cart-balance{flex-direction:column;gap:6px;padding:18px 20px}
  body.cart-clean .pair{grid-template-columns:1fr}
  body.cart-clean .pair .btn{width:100%}
}

/* ══ CHECKOUT — язык корзины (тот же body.cart-clean) ═════════════ */
.pay-balance{display:flex;gap:12px;align-items:flex-start;margin:0 0 18px;
  cursor:pointer;font-size:var(--fs-note);line-height:1.5}
.pay-balance input{width:18px;height:18px;margin-top:2px;accent-color:var(--violet);flex:0 0 auto}
.pay-balance b{color:var(--violet)}
.pay-note{margin-top:12px;font-size:var(--fs-fine);color:var(--muted)}
.pay-note a{color:var(--violet);text-decoration:underline;text-underline-offset:3px}

/* ══ ВХОД/РЕГИСТРАЦИЯ — ночной экран, одна колонка по центру ════════
   (auth_base.html — отдельный каркас, но refine.css он подключает)
   Реф — вход Oura «один вопрос крупно» (выбор Дани 01.10): тёмный экран,
   крупный заголовок-вопрос, поле, кнопка. Фон — бывшая левая ночная панель
   (градиент и дышащие пятна те же), растянутая на весь экран; колонка по
   середине. Поля и кнопка — как на тёмной плите телефона в
   кабинете (.accrow--promo): белое поле, белая пилюля со светлым ореолом. */
body:has(.auth){background:var(--dl-night)}
/* длинная регистрация даёт полосу прокрутки, короткий вход — нет: без
   запаса под неё колонка на компьютере прыгала вбок на смене вкладок */
html:has(.auth){scrollbar-gutter:stable}
.auth{display:block;position:relative;isolation:isolate;min-height:100vh;min-height:100dvh;
  color:#fff;--focus:2px solid #fff;
  --glow:var(--btn-glow-light);--glow-off:var(--btn-glow-light-off);
  --glow-base:var(--btn-glow-light-base);--glow-base-off:var(--btn-glow-light-base-off)}
/* fixed: длинная регистрация прокручивается, фон стоит */
.auth__art{position:fixed;inset:0;z-index:-1;min-height:0;padding:0;
  background:linear-gradient(150deg,var(--dl-night),var(--night-2))}
.auth__art .glow{background:radial-gradient(circle,var(--hair),transparent 70%)}
.auth__art .glow--b{width:420px;height:420px;left:-140px;bottom:-160px;top:auto;right:auto;
  background:radial-gradient(circle,rgba(189,115,99,.25),transparent 70%)}
/* Колонка прижата к верху, а не центрирована по вертикали: центровка
   сдвигала логотип и вкладки на каждой смене вкладки (регистрация вдвое
   длиннее входа). Верхний отступ подобран так, чтобы короткий вход
   по-прежнему стоял посередине: при высоте 900 — 171px, как было при
   центровке; телефонный — в блоке max-width:820px. */
.auth__form-wrap{display:flex;align-items:flex-start;justify-content:center;
  min-height:100vh;min-height:100dvh;padding:clamp(48px,19vh,240px) 24px 48px;
  background:transparent}
.auth__form{max-width:460px}
.auth__logo{display:inline-block;margin-bottom:30px}
.auth__logo img{display:block;height:44px;width:auto;filter:brightness(0) invert(1)}
/* белый .8 на ночном фоне — 4.8:1 даже под светлым пятном в углу */
.auth__tabs{position:relative;background:transparent;border-radius:0;padding:0;gap:26px;
  margin-bottom:clamp(32px,6vh,52px);border-bottom:1px solid rgba(255,255,255,.16)}
/* табы — плоские ссылки (без вложенных кнопок: валидность + один Tab-стоп) */
.auth__tabs>a{position:relative;flex:0 0 auto;padding:0 0 12px;
  font-weight:600;font-size:var(--fs-fine);color:rgba(255,255,255,.8)}
.auth__tabs>a:hover,.auth__tabs>a.active{color:#fff}
.auth__tabs>a.active::after{content:"";position:absolute;left:0;right:0;bottom:-1px;
  height:2px;border-radius:2px;background:#fff}
/* С JS полоска одна на все вкладки (.auth__ink, её ставит main.js) и едет
   к новой вкладке от того места, где стоит сейчас: переход CSS при смене
   цели стартует с текущего значения. Без JS остаётся ::after выше. */
.auth__tabs--ink>a.active::after{content:none}
.auth__ink{position:absolute;left:0;bottom:-1px;height:2px;border-radius:2px;
  background:#fff;pointer-events:none;
  transition:transform .32s cubic-bezier(.22,1,.36,1),width .32s cubic-bezier(.22,1,.36,1)}
/* Переключение вкладок без перезагрузки (main.js): старый экран уходит в
   сторону, противоположную новой вкладке, и гаснет; новый приходит с её
   стороны; контейнер едет по высоте вместе с приходом. Сдвиги и
   прозрачность играет JS, высоту задаёт инлайном — здесь её длительность. */
.auth__body{transition:height .36s cubic-bezier(.22,1,.36,1)}
/* ждём ответ: экран на месте, только притухает — иначе белая дыра на
   время запроса (на телефоне это весь экран) */
.auth__body.loading{opacity:.55;transition:opacity .14s ease}
/* на время хода низ режем по высоте контейнера (иначе морф не виден), а
   бока — нет: сдвиг на 20px подрезал бы края поля и кнопки */
.auth__body.leaving,.auth__body.coming{position:relative;clip-path:inset(-24px -48px 0 -48px)}
/* уходящий экран лежит поверх приходящего, пока не погаснет */
.auth__ghost{position:absolute;top:0;left:0;right:0;pointer-events:none}
/* перенос в призрак — для браузера новая вставка, и @starting-style
   заголовка шагов входа заново проявлял его с нуля: на кадр заголовок
   исчезал, а поле и кнопка стояли. Призрак застывает целиком, поэтому
   important — перебить любой переход содержимого */
.auth__ghost *{transition:none!important}
/* заголовок получает фокус программно (ради экранного диктора) — рамку
   вокруг него рисовать не за что: человек по нему не ходил */
.auth__body h1:focus{outline:none}
@media(prefers-reduced-motion:reduce){
  .auth__body,.auth__ink{transition:none}
  /* притухание без перехода — это мигание, а не подсказка: тем, кто просил
     меньше движения, не показываем его вовсе */
  .auth__body.loading{opacity:1;transition:none}
}
.auth__form h1{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:clamp(30px,3.4vw,40px);line-height:1.12;margin:0 0 14px;
  color:#fff;letter-spacing:-.01em;text-wrap:balance}
.auth__form .sub,.auth__form .muted{color:rgba(255,255,255,.8);margin:0 0 24px}
.auth__form h1+form{margin-top:26px}
/* было !important — оно молча побеждало общее правило фокуса */
.auth__form form input:focus{border-color:var(--violet)}
/* главная кнопка — белая пилюля, как «Продолжить» на тёмной плите телефона */
.auth .btn:not(.btn--ghost){background:#fff;color:var(--violet)}
.auth__form form .btn{margin-top:8px}
.auth__foot{margin-top:18px;color:rgba(255,255,255,.8)}
.auth__foot .auth-foot__links{justify-content:flex-start}
.auth__body a:not(.btn){color:#fff;text-decoration:underline;
  text-decoration-color:rgba(255,255,255,.45);text-underline-offset:3px}
.auth__body a:not(.btn):hover{text-decoration-color:#fff}
.auth .authf__check{color:rgba(255,255,255,.88)}
.auth .authf__check input{accent-color:var(--lavender)}
.auth .law-more{color:#fff}
/* ошибка на фиолетовом — текстом, без плашки: светлая розовая подложка
   поверх фиолетового — та заливка, которую Даня снял 26.09. Цвет — тёплый
   коралл акцента бывшей арт-панели (#D9A08F, ~6:1 на этом фоне): светло-
   розовый --error-soft читался просто белым текстом, не ошибкой */
.auth .dj-error{background:none;padding:0;border-radius:0;
  color:#D9A08F;font-weight:600}

/* ── Вход в два шага (login.html, static/js/auth-steps.js) ─────────────
   Без JS форма обычная: оба поля, кнопка «Войти», заголовок первого шага.
   С JS (@media scripting) поля логина и пароля лежат в одной клетке сетки
   и сменяют друг друга прозрачностью: высота формы не скачет, а transition
   прерывается на середине и едет от текущего значения. Спрятанное поле
   остаётся в раскладке — display и visibility выключили бы его для
   менеджера паролей; из обхода Tab его убирает скрипт. Заголовки шагов
   разной длины, поэтому меняются целиком и проявляются (@starting-style):
   наложенные друг на друга, они оставляли над коротким пустую строку. */
.auth-steps__who,.auth-steps__h .auth-steps__s2,.auth-steps__go .auth-steps__s1{display:none}
.auth__form .auth-steps__h{margin-bottom:24px}
.auth-steps__whopad{display:block;padding:2px 0 18px;font-size:var(--fs-note);
  color:rgba(255,255,255,.8)}
.auth-steps__who b{color:#fff;font-weight:600;overflow-wrap:anywhere}
.auth-steps__who .auth__link{min-height:0}
@media(scripting:enabled){
  .auth-steps .auth-steps__lbl,.auth-steps form{display:grid}
  .auth-steps .auth-steps__h>span,.auth-steps .auth-steps__lbl>span{display:block;
    transition:opacity .2s var(--r-ease)}
  .auth-steps .auth-steps__lbl>span{grid-area:1/1}
  .auth-steps[data-step="1"] .auth-steps__h .auth-steps__s2,
  .auth-steps[data-step="2"] .auth-steps__h .auth-steps__s1{display:none}
  @starting-style{.auth-steps .auth-steps__h>span{opacity:0}}
  .auth-steps[data-step="1"] .auth-steps__s2,
  .auth-steps[data-step="2"] .auth-steps__s1{opacity:0}
  .auth-steps form{grid-template-columns:minmax(0,1fr)}
  .auth-steps form>.dj-error{grid-row:1}
  .auth-steps form>.authf{grid-row:2;grid-column:1;
    transition:opacity .22s var(--r-ease),transform .22s var(--r-ease)}
  .auth-steps form>[type="submit"]{grid-row:3}
  .auth-steps[data-step="1"] .authf:has([name="password"]),
  .auth-steps[data-step="2"] .authf:has([name="username"]){opacity:0;
    transform:translateY(6px);pointer-events:none}
  /* строка «логин · изменить» раскрывается по высоте: 0fr → 1fr */
  .auth-steps .auth-steps__who{display:grid;grid-template-rows:0fr;opacity:0;
    transition:grid-template-rows .24s var(--r-ease),opacity .2s var(--r-ease)}
  .auth-steps__whoin{min-height:0;overflow:hidden}
  .auth-steps[data-step="2"] .auth-steps__who{grid-template-rows:1fr;opacity:1}
}
@media(prefers-reduced-motion:reduce){
  .auth-steps .auth-steps__h>span,.auth-steps .auth-steps__lbl>span,
  .auth-steps form>.authf,.auth-steps .auth-steps__who{transition:none}
}

/* ══ СТРАНИЦА КУРСА — прем (body.course-clean) ════════════════════ */
body.course-clean{background:#fff}
body.course-clean #moodveil{display:none}
body.course-clean .cathead{background:transparent;padding:44px 0 6px}
body.course-clean .cathead h1{font-family:'Arsenal',Georgia,serif;
  color:var(--violet);letter-spacing:-.015em}
body.course-clean .cathead__band{display:none}
/* сайдбар уроков: из коробки с тенью — прозрачная колонка с хэйрлайнами */
body.course-clean .course-nav{background:transparent;border:0;box-shadow:none;
  padding:0 8px 0 0}
body.course-clean .course-nav__progress{border-bottom:1px solid var(--hair)}
body.course-clean .course-nav__item:hover{background:var(--lav-card-2)}
/* панель урока: тонкий лавандовый бордер вместо тени */
body.course-clean .course-lesson{box-shadow:none;border-color:var(--hair)}
/* плеер фокусирует урок программно (tabindex=-1) как скролл-якорь — сама
   панель не интерактивна, чёрный дефолт-аутлайн только шумит */
body.course-clean .course-lesson:focus{outline:none}
body.course-clean .course-lesson__head h2{font-family:'Arsenal',Georgia,serif;font-weight:400;
  color:var(--violet);letter-spacing:-.01em}
body.course-clean .course-lesson__foot{border-top-color:var(--line)}
body.course-clean .file-card{background:var(--lav-card-2);border-color:var(--hair)}

/* AI-репетитор продолжает правую колонку курса и использует каноничные
   .field/.btn; раньше include лежал за пределами container и был голым HTML. */
.course-assistant-section{margin-top:24px}
.assistant-widget{padding:32px 38px;border:1px solid var(--hair);
  border-radius:24px;background:var(--lav-card-2);color:var(--ink-deep)}
.assistant-widget__head h2{margin:0;font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:clamp(25px,3vw,32px);color:var(--violet);letter-spacing:-.01em}
.assistant-widget__log{display:grid;gap:10px;margin-top:20px}
.assistant-widget__log:empty{display:none}
.assistant-widget__log p{margin:0;padding:12px 16px;border-left:2px solid var(--lavender);
  background:#fff;font-size:var(--fs-note);line-height:1.6}
.assistant-widget__form{margin-top:22px}
.assistant-widget__form .flabel{display:block;margin-bottom:7px;font-size:var(--fs-fine);
  font-weight:600;color:var(--text-secondary)}
.assistant-widget__row{display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:18px;align-items:start}
.assistant-widget__field{height:52px;border-color:var(--field-line)}
.assistant-widget__field:focus{border-color:var(--violet);
  box-shadow:var(--field-ring)}
.assistant-widget__submit{height:52px}
.assistant-widget__meta{display:flex;justify-content:space-between;gap:16px;
  margin-top:7px;font-size:var(--fs-mini);color:var(--text-secondary)}
.assistant-widget__error{margin:10px 0 0}
/* ожидание ответа: генерация приходит одним куском через 15–40с */
.assistant-wait{opacity:.65;font-style:italic}
.assistant-wait::after{content:'…';display:inline-block;overflow:hidden;
  vertical-align:bottom;width:0;animation:assistant-dots 1.2s steps(4,end) infinite}
@keyframes assistant-dots{to{width:1.3em}}
@media(max-width:600px){
  .assistant-widget{padding:24px 20px}
  .assistant-widget__row{grid-template-columns:1fr;gap:12px}
  .assistant-widget__submit{width:100%}
}
@media(prefers-reduced-motion:reduce){
  .assistant-wait::after{animation:none;width:1.3em}
}

/* корзина/checkout: двухколонник — позиции слева, sticky-панель заказа
   справа (итого, промо/сертификат, баланс, кнопка). Левое одностолбие
   оставляло правую половину экрана пустой */
.cart-wrap{max-width:1120px}
.cart2__grid{display:grid;grid-template-columns:1fr 384px;gap:60px;align-items:start}
.cart2__items .cline:last-child{border-bottom:0}
.cart-side{position:sticky;top:104px;border:1px solid var(--hair);
  border-radius:24px;padding:26px 28px;background:#fff}
.cart-side__total{display:flex;justify-content:space-between;align-items:baseline;
  gap:16px;padding-bottom:16px;border-bottom:1px solid var(--line)}
.cart-side__total span{font-size:var(--fs-mini);font-weight:700;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted)}
.cart-side__total b{font-family:'Arsenal',Georgia,serif;font-weight:400;font-size:31px;
  color:var(--violet);font-variant-numeric:tabular-nums}
.cart-side .cart-extras{margin-top:0;border-top:0}
.cart-side .cart-balance{margin-top:16px;padding:14px 18px;flex-wrap:wrap;gap:6px 12px}
.cart-side .cart-balance b{font-size:var(--fs-h3)}
.cart-side .cart-balance span{font-size:var(--fs-mini)}
.cart-side .cart-pay{margin-top:18px}
.cart-side .pay-balance{margin:0 0 14px;font-size:var(--fs-fine)}
.cart-side .pay-note{font-size:var(--fs-mini)}
.cart2__items .cart-continue{text-align:left;margin-top:20px}
@media(max-width:960px){
  .cart2__grid{grid-template-columns:1fr;gap:26px}
  .cart-side{position:static}
  .cart2__items .cline:last-child{border-bottom:1px solid var(--hair)}
}

@media(max-width:820px){
  .auth__form-wrap{padding:clamp(32px,14vh,140px) 22px 32px}
  .auth__logo img{height:40px}
}

/* живость ночного фона входа: дыхание свечений, звёзды, въезд колонки */
.auth__art .glow{animation:authBreath 9s ease-in-out infinite}
.auth__art .glow--b{animation:authBreath 11s ease-in-out 2s infinite}
@keyframes authBreath{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.16);opacity:1}}
.auth__spark{position:absolute;pointer-events:none;color:rgba(232,220,250,.9);
  animation:authTwinkle 6s ease-in-out infinite}
.auth__spark::before{content:"✦";font-size:9px}
@keyframes authTwinkle{0%,100%{opacity:0;transform:scale(.6) rotate(0)}
  50%{opacity:.8;transform:scale(1) rotate(45deg)}}
@keyframes authRise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.auth__form{animation:authRise .7s .15s cubic-bezier(.32,.72,0,1) both}
@media(prefers-reduced-motion:reduce){
  .auth__art .glow,.auth__art .glow--b,.auth__spark,.auth__form{animation:none}
}

/* каталог: полировка до према + починка Shopify-выезда карточек.
   Ховер-transition body.cat-clean .pcard специфичнее базового .dl-rv —
   он перебивал транзишн выезда (opacity прыгала, транс укорачивался).
   На время reveal даём выезду приоритет; после JS снимает классы */
body.cat-clean .pcard.dl-rv{
  transition:opacity .85s var(--dl-ease),transform .85s cubic-bezier(.34,1.4,.5,1);
  transition-delay:calc(var(--dl-i,0)*.09s)}
/* капс типа — терра, как остальные mетки према */
body.cat-clean .pcard__kind{color:var(--terra-ink)}
/* цена — Arsenal, как цены в корзине/ЛК */
body.cat-clean .pcard__price{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:var(--fs-lede);color:var(--violet)}
/* фильтры: из белой коробки с заливным чипом — хэйрлайн-табы в языке ЛК */
body.cat-clean .subfilter{background:transparent;border:0;box-shadow:none;
  border-radius:0;padding:0;gap:26px;display:flex;flex-wrap:nowrap;
  overflow-x:auto;scrollbar-width:none;max-width:100%;
  border-bottom:1px solid var(--hair)}
body.cat-clean .subfilter::-webkit-scrollbar{display:none}
/* табы-фильтры: на /all/ это плоские ссылки (серверные фильтры), на
   категориях — кнопки (js-тумблер data-catfilter); стили общие */
body.cat-clean .subfilter>a,body.cat-clean .subfilter button{position:relative;
  flex:0 0 auto;padding:0 0 13px;border-radius:0;background:transparent;
  font-size:var(--fs-note);font-weight:600;color:var(--ink);opacity:.72;
  white-space:nowrap;transition:opacity .2s,color .2s}
body.cat-clean .subfilter>a:hover,body.cat-clean .subfilter button:hover{
  opacity:1;background:transparent;color:var(--ink)}
body.cat-clean .subfilter>a.on,body.cat-clean .subfilter button.on{
  background:transparent;color:var(--violet);opacity:1}
body.cat-clean .subfilter>a.on::after,body.cat-clean .subfilter button.on::after{
  content:"";position:absolute;left:0;right:0;
  bottom:-1px;height:2px;border-radius:2px;background:var(--violet)}

/* ══ ШАПКА ПОДЖИМАЕТСЯ ПРИ СКРОЛЛЕ (12.09) ═══════════════════════════
   Приём с voiceflow.com: наверху меню идёт во всю ширину, при прокрутке
   втягивается в компактную пилюлю по центру. Замер образца: 1360 → 880 px
   (на 35 % уже), переход .3s, радиус 12.
   У нас рельс 1256, поджимаем до 900 — та же доля. Пилюля рисуется на
   .header__in, а не на .header: полоса во всю ширину обязана остаться
   подложкой под ней, иначе при поджатии из-под шапки выглядывает страница
   и верх экрана начинает «дышать» на каждом кадре прокрутки. */
.header.dl-scrolled .header__in{
  /* 1000, а не 880 как у образца: у них в меню четыре пункта, у нас шесть
     плюс три круглые кнопки — замер содержимого дал 992 px, и при 900
     кнопка «Войти» вылезала за пилюлю. Ряд заодно поджимается зазорами */
  max-width:1000px;padding-inline:20px;gap:20px;
  /* плотная заливка, как на образце auxia.io: сплошной цвет, без стекла.
     На страницах без переезда кнопок доли пути нет — красим сразу */
  background:#fff;
  border:1px solid var(--hair);border-radius:var(--r-panel);
  box-shadow:0 14px 30px -22px rgba(86,61,135,.5);
  transition:max-width .3s cubic-bezier(.4,.05,.2,1),
             padding-inline .3s cubic-bezier(.4,.05,.2,1),
             transform .3s cubic-bezier(.4,.05,.2,1),
             background-color .3s,box-shadow .3s,border-color .3s}
/* в покое пилюли нет: ни фона, ни границы. max-width НЕ трогаем — его
   задаёт .container, и без него логотип с меню разъезжаются к краям окна */
.header__in{border:1px solid transparent;border-radius:var(--r-panel);
  transition:max-width .3s cubic-bezier(.4,.05,.2,1),
             padding-inline .3s cubic-bezier(.4,.05,.2,1),
             transform .3s cubic-bezier(.4,.05,.2,1),
             background-color .3s,box-shadow .3s,border-color .3s}
/* поджатая шапка сама себе плашка — общий фон полосы больше не нужен,
   иначе получаются две поверхности одна на другой. !important здесь не
   каприз: sheet.css красит .header.dl-scrolled тоже с !important */
.header.dl-scrolled{background:transparent!important;box-shadow:none;
  border-bottom-color:transparent;backdrop-filter:none}
/* логотип не сжимаем: во flex-ряду он первым отдавал ширину, и при поджатии
   «Доктор Эля» превращалась в вертикальную полоску */
.header .logo{flex:0 0 auto}
.header.dl-scrolled .header__nav{gap:16px}
/* стекло поджатой шапки стало прозрачнее (.56 вместо .9), и разбавленный фоном
   текст пунктов над тёмным подвалом уходил ниже AA: расчёт дал 3.8 при .85
   непрозрачности против 5.4 при полной. Цвет не трогаем — снимаем разбавление */
.header.dl-scrolled .header__nav a{opacity:1}
.header .header__nav,.header .header__actions{transition:gap .3s cubic-bezier(.4,.05,.2,1),margin-right .3s cubic-bezier(.4,.05,.2,1)}
.header.dl-scrolled .header__actions{gap:8px}
.header.dl-scrolled .logo img{width:150px;height:auto;transition:width .3s cubic-bezier(.4,.05,.2,1)}
.header .logo img{transition:width .3s cubic-bezier(.4,.05,.2,1)}
@media(max-width:980px){
  /* на узких экранах поджимать нечего: рельс и так уже пилюли */
  .header.dl-scrolled .header__in{max-width:none;padding-inline:0;
    background:transparent;border-color:transparent;box-shadow:none;backdrop-filter:none}
  .header.dl-scrolled{background:rgba(255,255,255,.86);backdrop-filter:blur(18px);
    border-bottom:1px solid var(--hair);box-shadow:var(--shadow-sm)}
}
@media(prefers-reduced-motion:reduce){
  .header__in,.header.dl-scrolled .header__in{transition:none}
}

/* ══ ШАПКА — ПРЕМ (18.07): белая поверхность, лавандовые хэйрлайны ═══
   Кремовая полупрозрачная плашка при скролле выбивалась из белых
   прем-страниц; иконки были белыми кругами с серым бордером */
.header.dl-scrolled{background:rgba(255,255,255,.86);backdrop-filter:blur(18px);
  border-bottom:1px solid var(--hair);
  box-shadow:var(--shadow-sm)}
.icon-btn{background:transparent;border:1px solid var(--hair-strong);
  color:var(--violet)}
.icon-btn:hover{background:transparent;border-color:var(--violet);
  box-shadow:var(--lift-sm)}
/* подчёркивание навигации — фиолетовое, как активные табы ЛК/входа */
.header__nav a::after{background:var(--violet)}
.header__nav a:hover{color:var(--violet)}
/* бургер на мобиле — в тот же хэйрлайн-язык */
@media(max-width:1120px){
  .burger{border:1px solid var(--hair-strong);background:transparent;border-radius:50%}
}
/* геометрия: меню по центру между логотипом и действиями (было прижато
   к логотипу — справа зияла дыра в 164px). У actions свой auto-отступ
   съедал долю пространства — глушим, авто-поля только у меню */
.header__nav{margin-left:auto;margin-right:auto}
.header__actions{margin-left:0}

/* ══ АНОНС-БАР v2 (18.07): бренд-цвета вместо оранжевых орбов + заметность ══ */
.topbar{font-size:var(--fs-note)}
.topbar__in{padding:12px 18px;gap:16px}
/* орбы — лаванда и терра из брендбука (были оранжевые #FFB25E/#FF7A45) */
.topbar__orb--a{background:radial-gradient(circle,var(--lavender) 0%,transparent 70%);opacity:.5}
.topbar__orb--b{background:radial-gradient(circle,var(--terra) 0%,transparent 70%);opacity:.45}
.topbar__text em{font-size:var(--fs-lg);color:#EFE3FF}
/* белая кнопка держит контраст на ночном фоне и отвечает только глубиной */
a.topbar__cta{text-decoration:none}
.topbar__cta{background:#fff;color:var(--violet);padding:6px 7px 6px 16px}
.topbar__cta:hover{background:#fff;border-color:var(--violet);color:var(--ink-deep);
  box-shadow:var(--lift-sm);animation:none}
.topbar__arr{background:var(--violet);color:#fff}
/* бегущая линия лаванда→терра понизу — живой акцент в бренд-цветах */
.topbar::before{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;z-index:2;
  background:linear-gradient(90deg,transparent 5%,var(--lavender),var(--terra),var(--lavender),transparent 95%);
  background-size:220% 100%;animation:tb-line 5s linear infinite}
@keyframes tb-line{0%{background-position:200% 0}100%{background-position:-100% 0}}
@media(prefers-reduced-motion:reduce){
  .topbar::before{animation:none}
}

/* ══ АНОНС-БАР v3 (18.07): крупнее и играет живее ═════════════════ */
.topbar{font-size:var(--fs-sm)}
.topbar__in{padding:17px var(--rail-pad);gap:18px;justify-content:center;
  max-width:var(--rail);margin-inline:auto}
/* точка, текст и кнопка стоят кучкой по центру (вариант A «Живая точка»,
   30.09). Разгон по краям (10.09) держался на чипе у левого края; без него
   точка у края оторвалась бы от текста, к которому относится */
.topbar__text{flex:0 1 auto;min-width:0;text-align:center}
.topbar__text em{font-size:var(--fs-lede)}
.topbar__cta{font-size:var(--fs-note);padding:8px 9px 8px 18px;gap:11px}
.topbar__arr{width:24px;height:24px;font-size:13px;
  animation:tb-arr-nudge 4.6s ease-in-out infinite}
@keyframes tb-arr-nudge{0%,76%,100%{transform:translateX(0)}
  84%{transform:translateX(4px)}92%{transform:translateX(0)}}
/* орбы крупнее и ярче — света в баре больше */
.topbar__orb{width:170px;height:170px;opacity:.6;filter:blur(30px)}
/* искры чуть крупнее */
.topbar__spark{font-size:11px}
@media(max-width:640px){
  .topbar{font-size:var(--fs-fine)}
  /* на телефоне распределять нечего: строки и так во всю ширину */
  .topbar__in{padding:12px 14px;gap:10px;justify-content:center}
  .topbar__text em{font-size:var(--fs-sm)}
  .topbar__cta{font-size:var(--fs-mini);padding:6px 7px 6px 14px}
}
@media(prefers-reduced-motion:reduce){.topbar__arr{animation:none}}

/* страница никогда не скроллится горизонтально: декор (лента-росчерк
   продукта, swing-выезды карточек, слайдер героя) вылезал за вьюпорт
   и дарил живой h-скролл (десктоп-продукт 1580px, мобила +65px).
   clip не создаёт скролл-контейнер — sticky-шапка живёт как жила */
html{overflow-x:hidden;overflow-x:clip}  /* hidden — фолбэк для Safari <16 */

/* ══ СТАТИЧЕСКИЕ СТРАНИЦЫ И КОНТАКТЫ — прем (body.page-clean) ═════ */
body.page-clean{background:#fff}
body.page-clean #moodveil{display:none}
body.page-clean .cathead{background:transparent;padding:44px 0 6px}
body.page-clean .cathead h1{font-family:'Arsenal',Georgia,serif;
  color:var(--violet);letter-spacing:-.015em}
body.page-clean .cathead__band{display:none}
body.page-clean .block{padding-bottom:96px}
/* читабельный текст оферты/политики: Arsenal-подзаголовки, хэйрлайны */
body.page-clean .prose{color:var(--ink)}
body.page-clean .prose h2,body.page-clean .prose h3{font-family:'Arsenal',Georgia,serif;
  font-weight:400;color:var(--violet);letter-spacing:-.01em}
body.page-clean .prose h2{font-size:26px;margin:34px 0 12px;padding-top:22px;
  border-top:1px solid var(--hair)}
body.page-clean .prose h2:first-child{border-top:0;padding-top:0;margin-top:0}
body.page-clean .prose a{text-underline-offset:2px}
/* карточки контактов: пастель остаётся, поверх — тонкий лавандовый бордер */
body.page-clean .contact-card{border:1px solid var(--hair);
  box-shadow:none}
body.page-clean .contact-card b{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:21px;color:var(--violet)}

/* поиск: рамка панели — лавандовый хэйрлайн в тон системе */
.qs__panel{border-color:var(--hair)}


/* ── «Официальные площадки»: реестр адресов ────────────────────────────────
   Не витрина соцсетей: сюда приходят сверить адрес, поэтому крупный объект
   записи — сам адрес, а название площадки ушло в служебный капс над ним.
   Логотипов нет ни у кого (символику Meta показывать нельзя, а значок у
   части списка сделал бы Instagram исключением), узнавание даёт адрес.
   Слева липкий манифест с правилами проверки, между колонками —
   лавандовый переплёт с бегущей терракотовой засечкой. */
body.page-clean .reg-page{padding-top:clamp(22px,3vw,38px)}

body.page-clean .reg-stage{display:grid;
  grid-template-columns:minmax(280px,.38fr) 1px minmax(0,.62fr);
  column-gap:clamp(30px,4vw,66px);align-items:start}

/* липнет ниже шапки с полосой анонса — иначе надзаголовок уходит под неё.
   Высота шапки зависит от длины анонса из CMS, поэтому скрипт измеряет её и
   кладёт в --reg-top; 156px — фолбэк на текущую вёрстку без JS */
body.page-clean .reg-manifest{position:sticky;top:var(--reg-top,156px)}
/* терракота на мелком капсе даёт 3.6:1 — для текста мало, берём её же
   затемнённый тон --terra-ink (5.23:1); чистая --terra остаётся на линиях
   и бегунке, там контраст не нормируется */
body.page-clean .reg-eyebrow{margin:0 0 16px;font-size:var(--fs-tag);font-weight:700;
  letter-spacing:.18em;text-transform:uppercase;color:var(--terra-ink)}
body.page-clean .reg-h1{margin:0;font-family:'Arsenal',Georgia,serif;font-weight:700;
  font-size:var(--fs-h1);line-height:1.06;letter-spacing:-.015em;
  color:var(--violet);text-wrap:balance}
body.page-clean .reg-lede{margin:22px 0 0;max-width:38ch;font-size:var(--fs-md);
  line-height:1.62;color:var(--muted)}

body.page-clean .reg-rules{margin:clamp(26px,3.4vw,40px) 0 0;
  border-top:1px solid var(--hair-soft)}
body.page-clean .reg-rules__h{margin:14px 0 0;font-size:var(--fs-micro);font-weight:700;
  letter-spacing:.16em;text-transform:uppercase;color:var(--terra-ink)}
body.page-clean .reg-rules__i{margin:0;padding:13px 0;
  border-bottom:1px solid var(--hair-soft);
  font-size:var(--fs-fine);line-height:1.5;color:var(--muted)}
body.page-clean .reg-rules__i:first-of-type{padding-top:14px}

body.page-clean .reg-stamp{margin:20px 0 0;font-size:var(--fs-tag);font-weight:600;
  letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
body.page-clean .reg-stamp span{color:var(--violet);font-variant-numeric:tabular-nums}

body.page-clean .reg-rail{position:relative;align-self:stretch;
  background:var(--hair-soft)}
body.page-clean .reg-rail__mark{position:absolute;left:-1px;top:0;width:3px;
  height:30px;background:var(--terra)}

body.page-clean .reg-list{min-width:0;border-top:1px solid var(--hair-soft)}

body.page-clean .reg-rec{position:relative;display:grid;
  grid-template-columns:clamp(40px,4vw,58px) minmax(0,1fr) clamp(44px,4.4vw,54px);
  align-items:center;gap:clamp(14px,2vw,26px);padding:clamp(22px,2.8vw,32px) 0;
  border-bottom:1px solid var(--hair-soft);text-decoration:none;color:var(--ink-deep)}
/* риска слева на ховере вместо сдвига блока: текст не должен прыгать,
   когда по нему ведут глазами и сверяют символы */
body.page-clean .reg-rec::before{content:"";position:absolute;left:-14px;top:0;
  bottom:0;width:2px;background:var(--violet);transform:scaleY(.3);opacity:0;
  transition:transform .55s cubic-bezier(.16,1,.3,1),opacity .55s cubic-bezier(.16,1,.3,1)}
body.page-clean a.reg-rec:hover::before{transform:scaleY(1);opacity:1}

body.page-clean .reg-rec__n{font-family:'Arsenal',Georgia,serif;font-weight:400;
  font-size:clamp(1.4rem,1.9vw,1.85rem);line-height:1;color:rgba(86,61,135,.62);
  font-variant-numeric:tabular-nums;align-self:start;padding-top:.34em}
body.page-clean .reg-rec__b{display:block;min-width:0}

body.page-clean .reg-rec__k{display:block;font-size:var(--fs-tag);font-weight:700;
  letter-spacing:.16em;text-transform:uppercase;color:var(--muted);
  transition:color .5s cubic-bezier(.16,1,.3,1)}
body.page-clean .reg-rec__k i{font-style:normal;font-weight:600;color:var(--muted)}
body.page-clean .reg-rec__k i::before{content:"· "}

body.page-clean .reg-rec__u{display:block;margin-top:9px;font-family:'Arsenal',Georgia,serif;
  font-weight:400;font-size:clamp(1.4rem,2.4vw,2.1rem);line-height:1.14;
  letter-spacing:-.008em;color:var(--ink-deep);overflow-wrap:anywhere;
  transition:color .5s cubic-bezier(.16,1,.3,1),transform .5s cubic-bezier(.16,1,.3,1)}
body.page-clean a.reg-rec:hover .reg-rec__u{color:var(--violet);transform:translateX(6px)}
body.page-clean a.reg-rec:hover .reg-rec__k{color:var(--terra-ink)}

body.page-clean .reg-rec__s{display:block;margin-top:10px;max-width:52ch;
  font-size:var(--fs-fine);line-height:1.55;color:var(--muted)}

body.page-clean .reg-rec__a{align-self:center;justify-self:end;
  width:clamp(44px,4.4vw,54px);height:clamp(44px,4.4vw,54px);
  border:1px solid var(--lavender);border-radius:50%;display:grid;place-items:center;
  font-size:var(--fs-lg);color:var(--violet);
  transition:background .5s cubic-bezier(.16,1,.3,1),color .5s cubic-bezier(.16,1,.3,1),
             border-color .5s cubic-bezier(.16,1,.3,1),transform .5s cubic-bezier(.16,1,.3,1)}
body.page-clean a.reg-rec:hover .reg-rec__a{background:var(--violet);border-color:var(--violet);
  color:#fff;transform:translateX(4px)}
body.page-clean .reg-rec:focus-visible{outline:2px solid var(--violet);outline-offset:6px}

/* сноска про Meta: вне ссылки, без рамок и предупреждающих подложек —
   она часть документа, а не тревожный баннер */
body.page-clean .reg-fn{margin:0;padding:16px 0 0 14px;max-width:60ch;
  border-left:1px solid var(--terra-line);font-size:var(--fs-tag);line-height:1.55;
  color:var(--muted)}

body.page-clean .reg-close{margin-top:clamp(36px,4.6vw,58px);
  border-top:1px solid var(--hair-soft);padding-top:clamp(20px,2.6vw,30px)}
body.page-clean .reg-close__t{margin:0;max-width:44ch;font-family:'Arsenal',Georgia,serif;
  font-style:italic;font-weight:400;font-size:clamp(1.2rem,1.9vw,1.5rem);
  line-height:1.35;color:var(--ink-deep)}
/* тихая ghost-пилюля канона сайта: страница служебная, звать кнопкой-заливкой
   тут нечего */
body.page-clean .reg-close__a{display:inline-flex;align-items:center;gap:.55em;
  margin-top:18px;padding:12px 24px;border:1px solid var(--lavender);border-radius:999px;
  background:transparent;font-size:var(--fs-mini);font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--violet);text-decoration:none;
  transition:background .5s cubic-bezier(.16,1,.3,1),
             border-color .5s cubic-bezier(.16,1,.3,1)}
body.page-clean .reg-close__a:hover{background:var(--lavender-soft);border-color:var(--violet)}
body.page-clean .reg-close__a i{font-style:normal;
  transition:transform .5s cubic-bezier(.16,1,.3,1)}
body.page-clean .reg-close__a:hover i{transform:translateX(4px)}
body.page-clean .reg-close__a:focus-visible{outline:2px solid var(--violet);outline-offset:4px}

body.page-clean .reg-foot{margin:26px 0 0;max-width:70ch;font-size:var(--fs-fine);
  line-height:1.6;color:var(--muted)}

@media(max-width:900px){
  body.page-clean .reg-stage{grid-template-columns:minmax(0,1fr);
    row-gap:clamp(26px,5vw,40px)}
  body.page-clean .reg-manifest{position:static}
  body.page-clean .reg-rail{display:none}
  body.page-clean .reg-rec{grid-template-columns:34px minmax(0,1fr) 40px;gap:12px}
  body.page-clean .reg-rec__u{font-size:clamp(1.15rem,5.2vw,1.6rem)}
  body.page-clean .reg-rec__a{width:40px;height:40px;font-size:var(--fs-sm)}
  body.page-clean .reg-rec::before{display:none}
  body.page-clean a.reg-rec:hover .reg-rec__u{transform:none}
}

@media(prefers-reduced-motion:reduce){
  body.page-clean .reg-rec__u,body.page-clean .reg-rec__a,
  body.page-clean .reg-rec__k,body.page-clean .reg-rec::before,
  body.page-clean .reg-close__a i,body.page-clean .reg-close__a::before,
  body.page-clean .reg-close__a::after{transition:none}
}

/* ── Узкие экраны 320px: табы входа/регистрации уезжали за край ─────────
   Три ссылки с разрывом 26px не сжимались (flex:0 0 auto) и при 320px
   вылезали на 34px за правую границу вместе с кнопкой формы. */
@media(max-width:360px){
  .auth__tabs{gap:16px}
  .auth__tabs>a{font-size:var(--fs-fine)}
  .auth__form-wrap{padding-left:16px;padding-right:16px}
}

/* ── Шапка на телефоне: логотип срезался левым краем ────────────────────
   Логотип 46px (≈165px в ширину) + две круглые иконки + кнопка «Войти» +
   бургер требуют 459px, а на 320px доступно 284px: шапка переполнялась и
   логотип с бургером уезжали за края. На телефоне уменьшаем логотип и
   иконки.
   Вход — круглая иконка профиля у ВСЕХ, на любой ширине и в любом
   состоянии шапки: у вошедшего с 20.09, у гостя вместо надписи «Войти» с
   24.09 (решения Дани). Текстовой кнопки в разметке больше нет, поэтому и
   прятать тут нечего. */
@media(max-width:560px){
  .header__in{gap:10px}
  .logo,.logo img{height:38px}
  .header__actions{gap:8px}
  /* flex-строка шапки сжимала кнопки: при 361px «меню» становилось 42.7px,
     при 320px — 39.3px, то есть зона нажатия чинилась только под замеренные
     ширины. flex:0 0 44px держит её на любой */
  .icon-btn,.burger{--touch-inset:2px;position:relative;flex:0 0 44px;
    width:44px;height:44px;border:0;background:transparent}
  .icon-btn::before,.burger::before{content:"";position:absolute;
    inset:var(--touch-inset);border:1px solid var(--hair-strong);
    border-radius:50%;pointer-events:none}
  .icon-btn:hover::before{border-color:var(--violet)}
  .cart-badge{top:calc(var(--touch-inset) - 4px);right:calc(var(--touch-inset) - 4px)}
  /* Вход в Студию не влезает пятой кнопкой: по замеру выше на 320px уже
     не хватало места четырём. У редактора он занимает место корзины —
     с телефона правят страницу, а не покупают; корзина остаётся по
     прямому адресу /cart/. */
  body.can-edit .icon-btn--cart{display:none}
}
@media(max-width:360px){
  .logo,.logo img{height:31px}
  .icon-btn,.burger{--touch-inset:4px;flex:0 0 44px;width:44px;height:44px}
}

/* поле «искать заново» на странице результатов: раньше уточнить запрос
   можно было только через иконку в шапке */
.search-again{display:flex;gap:10px;margin:0 0 18px}
.search-again input{flex:1;min-width:0;padding:14px 18px;border:1px solid var(--field-line);
  border-radius:999px;background:#fff;font:inherit;color:inherit}
.search-again input:focus{outline:none;border-color:var(--violet);
  box-shadow:var(--field-ring)}
.search-again .btn{flex:none}
@media(max-width:560px){
  .search-again{flex-direction:column}
  .search-again .btn{width:100%}
}

/* ── КУПЛЕННЫЕ ПОДАРОЧНЫЕ КОДЫ В КАБИНЕТЕ ───────────────────────────────
   Переехали из home.css 04.08: блок рисуется в /account/, а home.css теперь
   подключается только на страницах с nx-разметкой. Остальные правила ЛК
   (.lk-sec и соседние) и так живут здесь. Балансом и промокодом тут больше
   не пахнет: фичу снесла миграция 0050_drop_balance_strings, стили удалены
   07.09.2026 — разметки .lk-balance/.lk-redeem нет нигде в репозитории. */
/* купленные подарочные коды в кабинете */
.lk-gifts{margin:0 0 26px;padding:20px 22px;border-radius:var(--radius-sm);
  background:rgba(251,246,240,.8);border:1px solid var(--edge-card)}
.lk-gifts__h{margin:0 0 14px;font-family:'Arsenal',Georgia,serif;font-weight:700;
  font-size:18px;color:var(--ink)}
.lk-gifts__list{display:grid;gap:10px}
.lk-gift{display:flex;align-items:center;justify-content:space-between;gap:16px;
  flex-wrap:wrap;padding:12px 14px;border-radius:12px;background:#fff;
  border:1px solid var(--edge-soft)}
.lk-gift.is-used{opacity:.62}
.lk-gift__b{display:grid;gap:3px;min-width:0}
.lk-gift__p{font-size:var(--fs-note);color:var(--ink)}
.lk-gift__code{font:700 15px/1 'Open Sans',sans-serif;letter-spacing:.12em;
  color:var(--violet)}
.lk-gift__st{font-size:var(--fs-mini);color:var(--muted)}

/* ══ АНОНС-БАР v4 (11.09): счётчик слева, арки на фоне, полоса тоньше ═══
   Полоса читалась пустой: три объекта на рельсе 1256px оставляли по 190px
   дыры слева и справа от текста (замер на бою). Лечим не декором — его там
   и так с запасом, — а содержанием: слева встаёт счётчик до старта потока,
   текст с кнопкой уходят вправо, дыры сжимаются до 73px. */

/* высота 76 → 64: отбивка вместо padding задана min-height, поэтому полоса
   ровно 64px и не пляшет от того, что внутри — чип или счётчик */
.topbar__in{min-height:64px;padding:6px var(--rail-pad)}

/* арки бренда: та же геометрия дуг, что в логотипе и на первом экране.
   Отдельным слоем, а не фоном .topbar: у того анимируется background-position
   (аврора), и лишние слои поехали бы вместе с ней. ::before и ::after заняты
   бегущей линией и бликом. */
.topbar__arcs{position:absolute;inset:0;pointer-events:none;
  background-image:
    radial-gradient(circle at 12% 150%, transparent 58%, rgba(233,221,255,.13) 58.6%,
      rgba(233,221,255,.13) 60%, transparent 60.6%),
    radial-gradient(circle at 12% 150%, transparent 76%, rgba(233,221,255,.09) 76.6%,
      rgba(233,221,255,.09) 78%, transparent 78.6%),
    radial-gradient(circle at 88% -60%, transparent 62%, rgba(189,115,99,.16) 62.6%,
      rgba(189,115,99,.16) 64%, transparent 64.6%);
  background-size:520px 300px,520px 300px,460px 260px;
  background-position:left center,left center,right center;
  background-repeat:no-repeat}

@media(max-width:640px){
  /* счётчика «до старта» нет с 27.09.2026: слева в полосе мелкий чип, и
     разгон его с кнопкой по краям только рвал полосу */
  .topbar__in{min-height:0;padding:9px 14px;gap:8px}
}

/* ══ АНОНС-БАР v4 (30.09): живая точка вместо чипа «Анонс» ══════════════
   Светлая точка с тихим пульсом говорит «здесь новое». Слово из поля tag
   осталось читалкам (visually-hidden в base.html). */
.topbar__dot{position:relative;flex:none;width:8px;height:8px;border-radius:50%;background:#D9C7FF}
.topbar__dot::after{content:"";position:absolute;inset:-5px;border-radius:50%;
  border:1px solid #D9C7FF;opacity:0;animation:tb-ping 2.6s ease-out infinite}
@keyframes tb-ping{0%{transform:scale(.4);opacity:.8}100%{transform:scale(1.5);opacity:0}}
@media(max-width:860px){
  /* одна строка вместо трёх: текст слева до двух строк, кнопка — кружок
     со стрелкой справа. Надпись кнопки остаётся читалкам. До 860, а не до
     560: между ними текст и кнопка-пилюля в строку не влезали, и кнопка
     уходила второй строкой — полоса 88–102px на планшете (замер 30.09). */
  .topbar__in{justify-content:flex-start;gap:12px;padding:12px 14px}
  .topbar__text{flex:1;text-align:left;line-height:1.35}
  .topbar__cta{position:relative;flex:none;width:36px;height:36px;padding:0;gap:0;justify-content:center}
  /* зона нажатия 44px при кружке 36: отсчёт от padding-box, рамка 1px сверху */
  .topbar__cta::before{content:"";position:absolute;inset:-5px;border-radius:50%}
  .topbar__cta-t{position:absolute;width:1px;height:1px;overflow:hidden;
    clip:rect(0 0 0 0);white-space:nowrap}
  .topbar__arr{width:36px;height:36px;font-size:15px}
  .topbar__spark:not(.topbar__spark--phone){display:none}
}
@media(prefers-reduced-motion:reduce){.topbar__dot::after{animation:none}}

.header__actions{flex:0 0 auto}

/* ── ВЕРХ БЕЗ ПОЛОСЫ И РЫВКОВ (12.09) ────────────────────────────────
   Две беды поджатой шапки, обе видно глазами.

   1) Под пилюлей оставалась светлая полоса во всю ширину: секция пилюли
   гасила у .header стекло, тень и волосок, но объявлена ВЫШЕ блока
   «ШАПКА — ПРЕМ (18.07)», а тот включает backdrop-filter и тень заново.
   Отмена обязана стоять здесь, в конце файла. Ниже 981px не трогаем:
   там пилюли нет и фон обязан остаться на самой полосе.

   2) Пилюля поджималась по таймеру (.3s от класса на первом же пикселе),
   а не по колесу. Теперь ход пилюли задаёт доля пути прокрутки
   (static/js/topbar-dock.js): остановился на полпути — и шапка застыла на
   полпути.

   КАК ИДЁТ ХОД (24.09). Правила ниже с --sq/--sqe — не анимация, а МОДЕЛЬ
   раскладки: скрипт один раз ставит доли в 0 и 1 на самой шапке, меряет
   положения логотипа, пунктов меню, кнопок и пилюли и возвращает 0. Сам ход
   идёт только transform и opacity, раскладка на прокрутке не пересчитывается
   вовсе. Раньше скрипт писал доли в body на каждом кадре: переменные
   наследует весь документ, и браузер каждый кадр пересчитывал стили ~250
   элементов и заново раскладывал шапку. Замер 24.09 (/about/, ровный
   трекпад): средний кадр 119 мс, длинных 327 из 408, без скрипта — 24 мс.
   Раскладка с дробной шириной заодно двигала буквы по пиксельной сетке
   вразнобой — отсюда «рябь» текста на сжатии. */
@media(min-width:981px){
  .header.dl-scrolled{backdrop-filter:none;-webkit-backdrop-filter:none;
    box-shadow:none;border-bottom-color:transparent}
}
body.hdock-live{--sq:0;--sqe:0}
body.hdock-live .header .header__in{
  /* min(100%) обязателен: без него на 1281…1304px расчёт вылезает за окно и
     появляется боковая прокрутка */
  max-width:min(100%,calc(var(--rail) + 2 * (var(--ov) * (1 - var(--sqe)) + var(--clr) * (1 - var(--sq)))
                          - 256px * var(--sq)));
  padding-inline:calc(20px * var(--sq) + var(--ov) * (1 - var(--sqe)) + var(--clr) * (1 - var(--sq)));
  gap:calc(28px - 8px * var(--sq));
  /* сама полоса не красится: подложку рисует .header__pill ниже */
  background:transparent;border-color:transparent;box-shadow:none;
  position:relative;isolation:isolate;will-change:transform;
  /* ход задаёт колесо, а не таймер: переход тут делает движение догоняющим
     и не даёт остановиться там, где остановилась прокрутка */
  transition:none}
/* Подложка пилюли — отдельный слой, его вставляет скрипт. Лежит в размере
   СОБРАННОЙ пилюли (там он точен до пикселя), а на пути растягивается
   scaleX с поправкой радиуса. Приходит своей непрозрачностью: к концу её
   пути пилюля непрозрачна, иначе заголовок первого экрана проезжает сквозь
   меню. Плотность — с образца auxia.io (снято 20.09): сплошная заливка, ни
   стекла, ни размытия. Прозрачная подложка (решение 18.09) пропускала
   сквозь меню текст первого экрана. */
.header__pill{position:absolute;z-index:-1;top:-1px;bottom:-1px;left:0;
  box-sizing:border-box;background:#fff;border:1px solid rgba(179,149,219,.55);
  border-radius:var(--r-panel);box-shadow:0 14px 30px -22px rgba(86,61,135,.5);
  opacity:0;pointer-events:none;transform-origin:0 50%;will-change:transform,opacity;
  transition:background-color .3s cubic-bezier(.3,.25,.7,.53),
             border-color .3s cubic-bezier(.3,.25,.7,.53)}
/* Фиолетовая собранная шапка (Даня, 13.10) — цвета подвала, --rd-night.
   Фон идёт 300мс, текст, значки и логотип переключаются ОДНИМ кадром на
   150мс. В RGB середина белого/тёмного слишком светла для белых букв:
   встреча цветов — на ~58% тёмного (контраст обеих красок ~3,9). Зеркальные кривые фона
   проходят этот же цвет на 150мс в обе стороны. Всё состояние здесь;
   без color-mix/@property и без изменения обычного ховера наверху. */
body.hdock-violet .header{--btn-glow-dur:.3s;--ease-ui:ease}
body.hdock-tinting .header :is(.header__nav,.header__drop)>a{
  color:var(--ink);opacity:1;transition:color 0s linear .15s,opacity .2s ease}
body:not(.no-glow):not(.studio-mode).hdock-tinting .header :is(.icon-btn,.burger):not(.ckb__ok){
  transition:transform var(--btn-glow-dur) var(--ease-ui),
    box-shadow var(--btn-glow-dur) var(--ease-ui),background-color .3s ease,
    border-color .3s ease,color 0s linear .15s,
    opacity var(--btn-glow-dur) var(--ease-ui),visibility var(--btn-glow-dur) var(--ease-ui)}
body.hdock-tinting .header .burger span{transition:background-color 0s linear .15s}
body.hdock-tinting .header :is(.icon-btn,.burger)::before{transition:border-color .3s ease}
body.hdock-tinting .header .logo img,body.hdock-tinting .header.dl-scrolled .logo img{
  transition:width .3s cubic-bezier(.4,.05,.2,1),filter 0s linear .15s}
body.hdock-tinting.hdock-live .header .header__in .logo img{transition:filter 0s linear .15s}
body.hdock-violet .header__pill{background:var(--rd-night);border-color:var(--rd-night);
  transition-timing-function:cubic-bezier(.3,.47,.7,.75)}
/* Фигура в знаке прозрачна: яркость белит знак и надпись, а не подложку. */
body.hdock-violet .header .logo img{filter:brightness(10)}
body.hdock-violet .header .icon-btn{color:#fff;border-color:rgba(255,255,255,.6)}
body.hdock-violet .header .burger{border-color:rgba(255,255,255,.6)}
body.hdock-violet .header :is(.icon-btn,.burger)::before{border-color:rgba(255,255,255,.6)}
body.hdock-violet .header .burger span{background:#fff}
/* наведение и фокус белят кружок (glow.css) — значок на нём тёмный */
@media(hover:hover) and (pointer:fine){
  body.hdock-violet .header .icon-btn:hover{color:var(--ink)}
  body.hdock-violet .header .burger:hover span{background:var(--violet)}
}
body.hdock-violet .header .icon-btn:focus-visible{color:var(--violet)}
body.hdock-violet .header .burger:focus-visible span{background:var(--violet)}
/* до 920 пункты меню живут в белой выпадашке бургера — там они тёмные */
@media(min-width:921px){
  body.hdock-violet .header :is(.header__nav,.header__drop)>a{color:#fff}
  body.hdock-violet .header :is(.header__nav,.header__drop)>a::after{background:#fff}
  body.hdock-violet .header :is(.header__nav,.header__drop)>a:focus-visible{
    outline:2px solid #fff;outline-offset:4px;border-radius:4px}
}
/* На узком красится полоса. Плотный белый нужен только на время смены,
   затем наверху возвращается исходная прозрачность sheet.css. */
@media(max-width:980px){
  body.hdock-tinting .header{background:#fff!important;
    transition:background-color .3s cubic-bezier(.3,.25,.7,.53),box-shadow .5s,border-color .5s}
  body.hdock-violet .header{background:var(--rd-night)!important;
    transition:background-color .3s cubic-bezier(.3,.47,.7,.75),box-shadow .5s,border-color .5s}
}
@media(prefers-reduced-motion:reduce){
  .header__pill,.header :is(.header__nav,.header__drop)>a,
  .header .burger span,.header :is(.icon-btn,.burger)::before{transition:none}
}
@media(max-width:980px) and (prefers-reduced-motion:reduce){
  .header,body.hdock-violet .header{transition:none}
}
/* всё, что едет, — своими слоями: сдвиг слоя видеокарта ведёт с дробным
   пикселем, а буквы внутри не перекладываются */
body.hdock-live .header .logo,
body.hdock-live .header .header__nav>*,
body.hdock-live .header .header__actions{will-change:transform}
/* входная анимация (bootL/bootR/bootHead) тоже пишет transform и без
   сложения перебивала сдвиг скрипта: открыл прокрученную страницу — кнопки
   влетали в пилюлю из-за её края (191 px на +60 мс, ревью 24.09). Сложение
   стоит ВСЕГДА, а не только под скриптом: уже идущая анимация смену
   композиции не подхватывает. Без сдвига скрипта складывать не с чем */
.header .logo,.header .header__nav>*,.header .header__actions{animation-composition:add}
/* у прямых ссылок меню переход «всё за .2s» (style.css): transform уезжал с
   ним, ссылки отставали от ряда и наезжали на соседей до −21 px */
body.hdock-live .header .header__nav>a{transition-property:color,opacity}
body.hdock-live .header .logo{transform-origin:0 50%}
/* полоса осталась во всю ширину и сдвинута на LIFT вниз: без этого её
   невидимые края ловили клики под шапкой. Ловят только видимые части */
body.hdock-live .header .header__in{pointer-events:none}
body.hdock-live .header .header__in>*{pointer-events:auto}
/* Пилюля отходит от края экрана на 14 px — как в образце (voiceflow.com):
   там ряд стоит на 32px от верха окна и не липнет к кромке ни на секунду.
   Под скриптом сдвиг пишет он сам (LIFT в topbar-dock.js) по доле ухода
   анонс-бара. Сдвигом, а не отступом в потоке: padding-top растил полосу с
   79 до 93, и страница уезжала вниз под пальцем (документ 12089 → 12103).
   Ниже 981px не трогаем: пилюли нет, шапка лежит на кромке. */
/* Тот же зазор там, где скрипт шапку не ведёт (режим Студии): форму
   пилюли задаёт класс dl-scrolled своим переходом
   .3s — зазор идёт с ним заодно, тем же сдвигом и по той же кривой
   (transform добавлен в оба списка transition выше). Где скрипт работает,
   правило молчит: ход ведёт --sq, а не класс. */
@media(min-width:981px){
  body:not(.hdock-live) .header.dl-scrolled .header__in{transform:translateY(14px)}
  /* пока пилюли нет, край всё равно считается по той же формуле: иначе в первый
     же кадр поджатия запас равен нулю и угол «Войти» срезается капом пилюли */
  .header:not(.dl-scrolled) .header__in{
    max-width:min(100%,calc(var(--rail) + 2 * (var(--ov) + var(--clr))));
    padding-inline:calc(var(--ov) + var(--clr))}
}
body.hdock-live .header .header__nav{gap:calc(20px - 4px * var(--sq));transition:none}
/* до 1180 в покое зазор меню 12 (Партия 3): модель начиналась с 20, и на
   первом пикселе прокрутки пункты прыгали до 20 px. Конец тот же — 16 */
@media(max-width:1180px){
  body.hdock-live .header .header__nav{gap:calc(12px + 4px * var(--sq))}
}
/* зазор в блоке кнопок держим постоянным: чужое правило сжимает его 14 → 8
   переходом .3s, то есть уже ПОСЛЕ прокрутки — «Войти» доезжал на своём
   таймере, когда колесо давно остановилось */
body.hdock-live .header .header__actions{gap:14px;transition:none}
body.hdock-live .header .logo img{width:calc(188px - 38px * var(--sq));transition:none}
/* --ov: насколько блок кнопок вынесен за рельс. --clr: запас, который «Войти»
   обязана держать до скруглённого края пилюли. Оба нужны В ДВУХ местах разом:
   пилюля рисуется шире рельса ровно на (--ov + --clr), а padding на столько же
   вдавливает содержимое внутрь. Контент от этого не сдвигается, а край подложки
   всегда правее «Войти» на 13…21px — независимо от того, как быстро приходит
   стекло. Раньше запас считался как 20px*--sq − вынос*(1 − --sq) и обнулялся
   только к 150px прокрутки, а стекло было видно с 5-го пикселя: кнопка висела
   снаружи нарисованной плашки. */
.header{--ov:0px;--clr:12px}
/* круглые кнопки стояли вплотную к «Войти» и далеко от меню; сдвигаем пару
   вправо, к краю окна — но только пока шапка широкая: в пилюле вылет наружу
   вытолкнул бы «Войти» за её край */
@media(min-width:1281px){
  .header{--ov:clamp(0px,(100vw - var(--rail)) / 2 - 12px,36px)}
  /* в покое сдвиг стоит и без скрипта: иначе на первом же пикселе прокрутки
     блок дёргался бы вправо на все 36px разом */
  .header:not(.dl-scrolled) .header__actions{
    margin-right:calc(-1 * var(--ov));
    transition:margin-right .3s cubic-bezier(.4,.05,.2,1),gap .3s cubic-bezier(.4,.05,.2,1)}
  body.hdock-live .header .header__actions{
    margin-right:calc(-1 * var(--ov) * (1 - var(--sqe)))}
}
