/* ═══════════════════════════════════════════════════════════════
   ВИТРИНА — главная страница

   Подключается только здесь: набор крупный, а в кабинете он не
   нужен ни строчкой. Токены берутся из app.css, свои добавляются
   только для пульта: он следует теме страницы, но в тёмной теме
   уходит чуть глубже фона, чтобы читаться панелью.
   ═══════════════════════════════════════════════════════════════ */

:root{
  /* Пульт следует теме страницы. Раньше он был тёмным всегда — и в светлой
     теме выглядел чужеродной заплаткой, будто про него забыли. */
  --deck:var(--surface); --deck-2:var(--surface-2); --deck-3:var(--sunken);
  --deck-line:var(--line);
  --deck-ink:var(--ink); --deck-ink-2:var(--ink-2); --deck-ink-3:var(--ink-3);
  --deck-edge:var(--line-soft);

  --c:var(--m-text);        /* цвет активной модальности */
  --c-ink:#FFFFFF;          /* текст на заливке этим цветом */
}
html[data-theme="dark"]{
  /* В тёмной теме пульт чуть глубже страницы — так он читается панелью,
     а не просто прямоугольником того же тона. */
  --deck:#0E120F; --deck-2:#161B17; --deck-3:#1C221D;
  --deck-line:rgba(255,255,255,.10); --deck-edge:rgba(255,255,255,.06);
  --c-ink:#06090A;
}

/* ─── общее ─────────────────────────────────────────────────── */

/* Витрина идёт во всю ширину.
   Без этого правила .guest-body остаётся сеткой с place-items:center,
   а justify-items:center заставляет содержимое взять ширину по контенту.
   Тогда бегущая строка растягивает страницу на тысячи пикселей, и всё
   остальное центрируется внутри этой ширины — то есть за краем экрана. */
.guest-body.flush{display:block;padding:0;width:100%;max-width:100%}

/* overflow-x:clip, а не hidden: hidden сделал бы страницу
   отдельным полем прокрутки и сломал прилипающие элементы. */
.home{width:100%;max-width:100%;overflow-x:clip;justify-self:stretch}
.home section{position:relative;padding-left:26px;padding-right:26px;max-width:100%}
.home .in{max-width:1440px;margin:0 auto;width:100%}
.home .mid{max-width:1120px;margin:0 auto;width:100%}

.eyebrow{
  display:inline-flex;align-items:center;gap:9px;height:28px;padding:0 12px;border-radius:999px;
  background:color-mix(in srgb,var(--c) 12%,transparent);
  border:1px solid color-mix(in srgb,var(--c) 28%,transparent);
  font-family:var(--font-mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--c);transition:color .6s,background .6s,border-color .6s;
}
.eyebrow i{width:5px;height:5px;border-radius:50%;background:currentColor;flex:none}

.hh{
  font-family:var(--font-display);font-weight:500;letter-spacing:-.045em;line-height:1.08;
  font-size:clamp(25px,3.4vw,44px);margin:0 0 12px;text-wrap:balance;
}
.hh em{font-style:normal;color:var(--c);transition:color .6s}
.hsub{color:var(--ink-3);font-size:15px;line-height:1.65;margin:0;max-width:58ch}

/* ─── появление по прокрутке ────────────────────────────────── */
[data-rise]{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.75,.3,1),transform .7s cubic-bezier(.2,.75,.3,1)}
[data-rise].in{opacity:1;transform:none}

/* ═══ 1. ПЕРВЫЙ ЭКРАН ═══════════════════════════════════════ */
.top{padding-top:6px;padding-bottom:14px}
.top h1{
  font-family:var(--font-display);font-weight:500;letter-spacing:-.042em;line-height:1.16;
  font-size:clamp(20px,2.3vw,28px);margin:12px 0 6px;
}
.top .sub{color:var(--ink-3);font-size:14.5px;margin:0;max-width:58ch}

.work{
  padding-bottom:64px;
  display:grid;grid-template-columns:minmax(0,404px) minmax(0,1fr);gap:18px;align-items:stretch;
}

/* ─── пульт ─────────────────────────────────────────────────── */
.deck{
  background:var(--deck);border:1px solid var(--deck-line);border-radius:20px;
  padding:16px;color:var(--deck-ink);display:flex;flex-direction:column;position:relative;
  box-shadow:var(--shadow-2);overflow:hidden;
}
/* Тонкое свечение активной модальности по верхней кромке пульта. */
.deck::before{
  content:"";position:absolute;inset:-1px -1px auto -1px;height:120px;pointer-events:none;
  background:radial-gradient(70% 100% at 50% 0%,color-mix(in srgb,var(--c) 22%,transparent),transparent 72%);
  transition:background .7s cubic-bezier(.4,0,.2,1);
}
.deck > *{position:relative;z-index:1}

.dtabs{display:grid;grid-template-columns:repeat(5,1fr);gap:3px;margin-bottom:16px}
.dtab{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  height:58px;border:0;border-radius:12px;background:var(--deck-2);cursor:pointer;
  font-size:10px;color:var(--deck-ink-3);
  transition:background .2s,color .2s,transform .2s;
}
.dtab svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.dtab:hover{color:var(--deck-ink);transform:translateY(-2px)}
.dtab[aria-selected="true"]{background:var(--tc);color:var(--c-ink);font-weight:600}

/* Шапка формы: без неё пульт читался как картинка, а не как то,
   куда можно печатать. Здесь же счётчик и подпись модуля. */
.dhead{
  display:flex;align-items:center;gap:9px;margin-bottom:12px;padding-bottom:12px;
  border-bottom:1px solid var(--deck-line);
}
.dhead .dot{width:7px;height:7px;border-radius:50%;background:var(--c);flex:none;
  box-shadow:0 0 0 4px color-mix(in srgb,var(--c) 18%,transparent);transition:background .5s,box-shadow .5s}
.dhead .tt{font-size:13.5px;font-weight:600;color:var(--deck-ink)}
.dhead .badge{
  margin-left:auto;font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--c);background:color-mix(in srgb,var(--c) 15%,transparent);
  padding:4px 8px;border-radius:6px;transition:color .5s,background .5s;
}

.dlabel{
  display:flex;align-items:center;gap:8px;
  font-family:var(--font-mono);font-size:9.5px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--deck-ink-3);margin-bottom:8px;
}
.dlabel .cnt{margin-left:auto;color:var(--deck-ink-3);letter-spacing:0}

/* Поле, открытое настройкой (текст песни), живёт в пульте и никуда
   не переезжает — ему хватает привязки к .deck. */
.deck .rev textarea{
  width:100%;background:var(--deck-3);border:1px solid var(--deck-line);border-radius:11px;
  padding:12px 13px;font-size:13.5px;color:var(--deck-ink);resize:vertical;
  min-height:92px;line-height:1.55;cursor:text;
  transition:border-color .18s,box-shadow .18s;
}
.deck .rev textarea:hover{border-color:var(--ink-4)}
.deck .rev textarea:focus{
  outline:none;border-color:color-mix(in srgb,var(--c) 55%,transparent);
}
.deck .rev textarea::placeholder{color:var(--deck-ink-3)}

/* Поле со своей панелью: вложения и отправка внутри рамки — так это
   читается как строка чата, а не как абстрактное поле с кнопкой ниже.

   ВАЖНО: все правила привязаны к .dfield, а не к .deck. Поле переезжает
   из пульта под переписку, и привязка к .deck отвалилась бы вместе с
   ним — вместе с шириной и снятием обводки. */
.dfield{
  position:relative;background:var(--deck-3);border:1px solid var(--deck-line);
  border-radius:14px;transition:border-color .18s,box-shadow .18s;
}
.dfield:hover{border-color:var(--ink-4)}
/* Подсветка фокуса едва заметная: поле и так единственное на панели,
   а глобальная обводка здесь только мешала бы. */
.dfield:focus-within{border-color:var(--ink-3)}

.dfield textarea{
  width:100%;display:block;background:none;border:0;outline:none;
  border-radius:14px 14px 0 0;padding:13px 14px 6px;
  font-size:14.5px;line-height:1.55;color:var(--deck-ink);
  resize:vertical;min-height:92px;cursor:text;
}
.dfield textarea:hover,.dfield textarea:focus{border:0;box-shadow:none;outline:none}
.dfield textarea::placeholder{color:var(--deck-ink-3)}

.dtools{display:flex;align-items:center;gap:4px;padding:6px 8px 8px 10px}
.tools-gap{flex:1}
.tool{
  width:32px;height:32px;border-radius:9px;display:grid;place-items:center;border:0;
  background:none;color:var(--deck-ink-3);cursor:pointer;
  transition:background .16s,color .16s;
}
.tool:hover{background:var(--deck-2);color:var(--deck-ink)}
.tool svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.dsend{
  width:34px;height:34px;border-radius:11px;display:grid;place-items:center;border:0;
  background:var(--c);color:var(--c-ink);cursor:pointer;
  transition:transform .16s,filter .16s,opacity .16s;
}
.dsend:hover{transform:translateY(-1px);filter:brightness(1.08)}
.dsend[disabled]{opacity:.45;pointer-events:none}
.dsend svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round}

/* ─── поля, которые открывает выбор настройки ───────────────
   «Свой текст» без места для текста — тупик: выбор есть,
   вписать некуда. То же с режимами видео по кадрам. */
.dreveal:empty{display:none}
.dreveal{margin-bottom:16px}
.rev{
  background:var(--deck-2);border:1px solid var(--deck-line);border-radius:13px;padding:12px;
  animation:revIn .28s cubic-bezier(.2,.8,.3,1) both;
}
@keyframes revIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.rev > .rl{
  display:flex;align-items:center;gap:8px;margin-bottom:9px;
  font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--c);
}
.rev > .rl .cnt{margin-left:auto;color:var(--deck-ink-3);letter-spacing:0}
.rev textarea{
  min-height:92px;background:var(--deck-3);border:1px solid var(--deck-line);
  border-radius:11px;font-size:13.5px;
}
/* Слоты под файлы: пунктир — привычный знак «сюда можно положить». */
.slots{display:flex;gap:8px;flex-wrap:wrap}
.slot{
  flex:1;min-width:118px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;
  min-height:84px;padding:12px 10px;border-radius:11px;cursor:pointer;
  background:var(--deck-3);border:1.5px dashed var(--deck-line);
  color:var(--deck-ink-3);font-size:11.5px;text-align:center;line-height:1.35;
  transition:border-color .18s,color .18s,background .18s;
}
.slot:hover{border-color:color-mix(in srgb,var(--c) 55%,transparent);color:var(--deck-ink);background:var(--deck-2)}
.slot svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}

/* Настройки идут группами со своей подписью: «Скорость» и «Формат»
   вперемешку одной кучей читались как случайный набор кнопок. */
.dopts{margin:16px 0}
.dg{display:grid;grid-template-columns:74px minmax(0,1fr);gap:10px;align-items:center;margin-bottom:8px}
.dg:last-child{margin-bottom:0}
.dg > .gk{
  font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--deck-ink-3);text-align:right;line-height:1.25;
}
/* Сегмент: варианты одной настройки склеены в один переключатель,
   поэтому их не спутать с вариантами соседней. */
.dseg{
  display:flex;gap:2px;padding:2px;background:var(--deck-2);
  border:1px solid var(--deck-line);border-radius:10px;
}
/* Много вариантов (у изображений их одиннадцать) — переносим строкой,
   иначе они уехали бы в боковую прокрутку и половина осталась бы скрытой. */
.dseg.many{flex-wrap:wrap}
.dseg.many .dopt{flex:0 0 auto}
/* Значение одно — это не выбор, а факт модели: показываем как надпись. */
.dfix{
  display:inline-flex;align-items:center;height:30px;padding:0 11px;border-radius:9px;
  background:var(--deck-2);border:1px dashed var(--deck-line);
  font-family:var(--font-mono);font-size:11.5px;color:var(--deck-ink-2);
}
.dopt{
  flex:1;min-width:0;display:inline-flex;align-items:center;justify-content:center;
  height:28px;padding:0 9px;border-radius:8px;background:none;border:0;
  font-size:12px;color:var(--deck-ink-2);cursor:pointer;white-space:nowrap;
  transition:background .16s,color .16s;
}
.dopt:hover{color:var(--deck-ink);background:var(--deck-3)}
.dopt.on{background:color-mix(in srgb,var(--c) 22%,transparent);color:var(--c);font-weight:600}

/* ─── модели ────────────────────────────────────────────────── */
.dmodels{display:flex;flex-direction:column;gap:2px;max-height:198px;overflow-y:auto;margin-bottom:14px;scrollbar-width:thin}
.dmodels::-webkit-scrollbar{width:5px}
.dmodels::-webkit-scrollbar-thumb{background:var(--deck-line);border-radius:3px}
.dgroup{
  display:flex;align-items:center;gap:8px;padding:9px 4px 5px;
  font-family:var(--font-mono);font-size:9px;letter-spacing:.11em;text-transform:uppercase;color:var(--deck-ink-3);
}
.dgroup::after{content:"";flex:1;height:1px;background:var(--deck-line)}
.dmi{
  display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:10px;cursor:pointer;
  border:1px solid transparent;transition:background .14s,border-color .14s;
}
.dmi:hover{background:var(--deck-2)}
.dmi.on{background:color-mix(in srgb,var(--c) 14%,transparent);border-color:color-mix(in srgb,var(--c) 40%,transparent)}
.dmi .dot{width:6px;height:6px;border-radius:50%;background:var(--m-text);flex:none}
.dmi.on .dot{background:var(--c)}
.dmi .nm{font-size:13px;font-weight:500;line-height:1.3}
.dmi .by{font-family:var(--font-mono);font-size:10px;color:var(--deck-ink-3);margin-left:auto;flex:none}
/* Отметка бесплатной модели — не приглушение платных, а подсказка:
   у гостя эти работают сразу. */
.dmi .by.free{
  color:var(--m-text);background:color-mix(in srgb,var(--m-text) 15%,transparent);
  padding:3px 7px;border-radius:5px;letter-spacing:.05em;text-transform:uppercase;font-size:9px;
}
/* Платные приглушены и не выбираются. Цен гостю не показываем:
   до регистрации важно не «сколько», а «открывается в кабинете». */
.dmi.locked{opacity:.38;cursor:default}
.dmi.locked:hover{background:none}
.dmi.locked .dot{background:var(--deck-ink-3)}
.dmi.locked .by{display:inline-flex;align-items:center;gap:5px;text-transform:none;letter-spacing:0;font-family:var(--font-ui);font-size:11px}
.dmi.locked .by svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2}

.deck-foot{margin-top:auto;padding-top:14px;border-top:1px solid var(--deck-line)}
.dgo{
  width:100%;display:inline-flex;align-items:center;justify-content:center;gap:9px;height:48px;
  border:0;border-radius:13px;font-size:14.5px;font-weight:600;cursor:pointer;
  background:var(--c);color:var(--c-ink);
  transition:transform .16s,filter .16s,box-shadow .16s;
  box-shadow:0 10px 30px -10px color-mix(in srgb,var(--c) 60%,transparent);
}
html[data-theme="dark"] .dgo{color:#06090A}
.dgo:hover{transform:translateY(-2px);filter:brightness(1.07);text-decoration:none}
.dgo svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.dgo[disabled]{opacity:.65;pointer-events:none}
.dhint{margin-top:11px;font-size:11.5px;color:var(--deck-ink-3);line-height:1.5;text-align:center}
.dhint b{color:var(--deck-ink-2);font-weight:600}
.dhint a{color:var(--c)}

/* ─── витрина ───────────────────────────────────────────────── */
.show{
  position:relative;background:var(--surface);border:1px solid var(--line);border-radius:20px;
  overflow:hidden;min-height:544px;
}
.show-head{
  position:absolute;inset:0 0 auto 0;z-index:3;display:flex;align-items:center;gap:9px;
  padding:14px 16px;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4);
  background:linear-gradient(180deg,var(--surface) 58%,transparent);
}
.show-head i{width:6px;height:6px;border-radius:50%;background:var(--c);transition:background .6s}
.scene{position:absolute;inset:42px 16px 16px;opacity:0;pointer-events:none;transition:opacity .4s}
.scene.on{opacity:1;pointer-events:auto}

@keyframes pop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:none}}

/* ─── область результата ────────────────────────────────────
   Не выдуманные картинки: пустое состояние ровно такое же,
   как в кабинете до запуска. Рамка принимает выбранное
   соотношение сторон, поэтому видно, что именно получится. */
.out{display:flex;flex-direction:column;height:100%;gap:14px}
.out-box{flex:1;display:grid;place-items:center;min-height:0}
.out-frame{
  position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  max-width:100%;max-height:100%;padding:20px;border-radius:16px;
  background:var(--surface-2);border:1.5px dashed var(--line);
  transition:aspect-ratio .35s cubic-bezier(.2,.8,.3,1),width .35s cubic-bezier(.2,.8,.3,1);
}
.out-frame.track{width:100%;aspect-ratio:auto;min-height:132px}
.out-ico{
  width:42px;height:42px;border-radius:13px;display:grid;place-items:center;
  background:color-mix(in srgb,var(--c) 13%,transparent);color:var(--c);
  transition:background .5s,color .5s;
}
.out-ico svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.out-cap{font-size:13.5px;color:var(--ink-3);text-align:center;line-height:1.5;max-width:26ch}
.out-size{
  font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-4);
}

/* Дорожка звука: очертание плеера, а не бегущие полоски. */
.out-track{display:flex;align-items:center;gap:3px;width:100%;height:46px;margin-top:2px}
.out-track i{flex:1;background:var(--c);border-radius:2px;opacity:.28;transition:background .5s}

/* Что уйдёт в работу — теми же словами, что в форме. */
.out-sum{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;flex:none}
.out-sum span{
  display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:8px;
  background:var(--surface-2);border:1px solid var(--line-soft);
  font-family:var(--font-mono);font-size:10.5px;color:var(--ink-3);
}
.out-sum span b{color:var(--ink-2);font-weight:600;font-family:var(--font-ui);font-size:12px}
.out-sum span.head{background:color-mix(in srgb,var(--c) 10%,transparent);border-color:transparent}
.out-sum span.head b{color:var(--c)}

/* переписка */
/* Поле ввода стоит под разговором, как в любом чате: слева, в панели
   настроек, его никто не искал — глаз ищет строку внизу переписки. */
.chat-wrap{display:flex;flex-direction:column;height:100%;gap:12px}
.chat{
  flex:1;min-height:0;display:flex;flex-direction:column;gap:11px;
  justify-content:flex-end;padding:0 4px;overflow-y:auto;scrollbar-width:thin;
}
.chat-foot{flex:none}

/* На светлой панели поле берёт цвета страницы, а не пульта:
   тёмная рамка посреди белого блока выглядела бы заплаткой. */
.chat-foot .dfield{background:var(--surface-2);border-color:var(--line)}
.chat-foot .dfield:hover{border-color:var(--ink-4)}
/* Фокус обозначаем только рамкой: цветное свечение на светлой панели
   выглядело кричаще, а поле здесь и так единственное. */
.chat-foot .dfield:focus-within{border-color:var(--ink-3);box-shadow:none}
.chat-foot textarea{color:var(--ink);min-height:64px}
.chat-foot textarea::placeholder{color:var(--ink-4)}
.chat-foot .tool{color:var(--ink-4)}
.chat-foot .tool:hover{background:var(--sunken);color:var(--ink)}
.chat-foot .dsend{background:var(--c);color:var(--c-ink)}
.bub{max-width:78%;padding:13px 16px;border-radius:17px;font-size:14px;line-height:1.58}
.scene.on .bub{animation:pop .5s cubic-bezier(.2,.8,.3,1) both}
.bub.me{align-self:flex-end;background:var(--c);color:#fff;border-bottom-right-radius:6px}
html[data-theme="dark"] .bub.me{color:#06090A}
.bub.ai{align-self:flex-start;background:var(--surface-2);border:1px solid var(--line);border-bottom-left-radius:6px;color:var(--ink-2)}
.bub.ai b{color:var(--c)}
.bub.err{align-self:flex-start;background:var(--crit-soft);border:1px solid color-mix(in srgb,var(--crit) 26%,transparent);color:var(--crit)}
/* Три точки, пока модель думает. */
.typing{display:inline-flex;gap:4px;align-items:center;padding:4px 0}
.typing i{width:6px;height:6px;border-radius:50%;background:var(--c);animation:blink 1.25s infinite}
.typing i:nth-child(2){animation-delay:.18s}
.typing i:nth-child(3){animation-delay:.36s}
@keyframes blink{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}

/* ─── окно «нужен вход» ─────────────────────────────────────
   Открывается по запуску генерации: форма настоящая, но выполнить
   её без аккаунта нельзя — списывать не с чего. */
/* Вуаль задана явным тёмным цветом, а не из --ink: в тёмной теме
   --ink почти белый, и экран не затемнялся, а выцветал. */
.gate{
  position:fixed;inset:0;z-index:200;display:none;place-items:center;padding:20px;
  background:
    radial-gradient(120% 80% at 50% 0%,color-mix(in srgb,var(--c) 24%,transparent),transparent 62%),
    rgba(9,12,10,.58);
  backdrop-filter:blur(3px) saturate(115%);
}
.gate.open{display:grid;animation:fade .24s ease both}
@keyframes fade{from{opacity:0}to{opacity:1}}
.gate-box{
  position:relative;width:min(100%,430px);background:var(--surface);
  border:1px solid var(--line);border-radius:22px;padding:32px 30px 30px;text-align:center;
  box-shadow:0 30px 80px -20px rgba(0,0,0,.45), 0 0 0 1px rgba(255,255,255,.04) inset;
  animation:lift .32s cubic-bezier(.2,.8,.3,1) both;
}
@keyframes lift{from{opacity:0;transform:translateY(16px) scale(.97)}to{opacity:1;transform:none}}
.gate-box::before{
  content:"";position:absolute;inset:0 0 auto 0;height:4px;border-radius:22px 22px 0 0;
  background:linear-gradient(90deg,var(--m-voice),var(--m-image) 25%,var(--m-video) 50%,var(--m-music) 75%,var(--m-text));
}
.gate-ico{
  width:52px;height:52px;border-radius:16px;display:grid;place-items:center;margin:6px auto 16px;
  background:color-mix(in srgb,var(--c) 13%,transparent);color:var(--c);
}
.gate-ico svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.gate h3{
  font-family:var(--font-display);font-weight:500;font-size:21px;letter-spacing:-.035em;
  margin:0 0 10px;color:var(--ink);
}
.gate p{margin:0 0 22px;font-size:14px;line-height:1.6;color:var(--ink-3)}
.gate p b{color:var(--ink-2);font-weight:600}
.gate-go{display:flex;gap:9px;justify-content:center;flex-wrap:wrap}
.gate-close{
  position:absolute;top:14px;right:14px;width:30px;height:30px;border-radius:9px;
  display:grid;place-items:center;color:var(--ink-4);background:none;border:0;cursor:pointer;
  transition:background .15s,color .15s;
}
.gate-close:hover{background:var(--surface-2);color:var(--ink)}
.gate-close svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}

/* ═══ 2. БЕГУЩАЯ СТРОКА МОДЕЛЕЙ ════════════════════════════ */
/* Селектор с .home — иначе общее правило .home section вернуло бы
   боковые отступы, а лента должна идти от края до края. */
.home .ticker{
  padding:0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  background:var(--surface);
}
/* Обрезающий слой отдельным элементом: лента шире экрана всегда,
   и клипать её должен свой контейнер, а не секция. */
.ticker .clip{width:100%;max-width:100%;overflow:hidden}
.ticker .row{display:flex;width:max-content;animation:run 46s linear infinite;will-change:transform}
.ticker:hover .row{animation-play-state:paused}
@keyframes run{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.ticker .it{
  display:inline-flex;align-items:center;gap:10px;padding:15px 22px;white-space:nowrap;
  font-size:13.5px;color:var(--ink-3);border-right:1px solid var(--line-soft);
}
.ticker .it b{color:var(--ink-2);font-weight:600}
.ticker .it i{width:6px;height:6px;border-radius:50%;background:var(--mc,var(--accent));flex:none}

/* ═══ 3. ЧТО ПОЛУЧАЕТСЯ ════════════════════════════════════ */
.mods{padding-top:66px;padding-bottom:66px}
.mods-head{margin-bottom:28px}
.mods-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(232px,1fr));gap:12px}
.mcard{
  position:relative;display:block;text-decoration:none;color:inherit;overflow:hidden;
  background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:20px 18px 18px;
  transition:transform .28s cubic-bezier(.2,.8,.3,1),box-shadow .28s,border-color .28s;
}
.mcard::before{content:"";position:absolute;inset:0 0 auto 0;height:3px;background:var(--mc)}
/* Цветное свечение прорастает снизу при наведении. */
.mcard::after{
  content:"";position:absolute;inset:auto 0 0 0;height:0;pointer-events:none;
  background:linear-gradient(0deg,color-mix(in srgb,var(--mc) 16%,transparent),transparent);
  transition:height .35s cubic-bezier(.2,.8,.3,1);
}
.mcard:hover{transform:translateY(-6px);box-shadow:var(--shadow-2);border-color:color-mix(in srgb,var(--mc) 45%,var(--line));text-decoration:none}
.mcard:hover::after{height:100%}
.mcard > *{position:relative;z-index:1}
.mcard .ico{
  width:40px;height:40px;border-radius:12px;display:grid;place-items:center;margin-bottom:13px;
  background:color-mix(in srgb,var(--mc) 13%,transparent);color:var(--mc);
  transition:transform .28s cubic-bezier(.2,.8,.3,1);
}
.mcard:hover .ico{transform:scale(1.08) rotate(-4deg)}
.mcard .ico svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.mcard b{display:block;font-size:16px;letter-spacing:-.015em;margin-bottom:7px;color:var(--ink)}
.mcard p{margin:0 0 14px;font-size:13px;line-height:1.6;color:var(--ink-3)}
.mcard .px{
  font-family:var(--font-mono);font-size:11.5px;color:var(--mc);font-weight:500;
  display:flex;align-items:center;gap:7px;padding-top:12px;border-top:1px solid var(--line-soft);
}
.mcard .px svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2;transition:transform .28s}
.mcard:hover .px svg{transform:translateX(4px)}

/* ═══ 4. КАК ЭТО РАБОТАЕТ ══════════════════════════════════ */
.flow{padding-bottom:66px}
.flow .mid{position:relative}
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:28px;position:relative}
/* Линия, соединяющая шаги: прочерчивается при появлении секции. */
.steps::before{
  content:"";position:absolute;left:34px;right:34px;top:29px;height:2px;
  background:linear-gradient(90deg,var(--m-text),var(--m-image),var(--m-video));
  transform:scaleX(0);transform-origin:left;transition:transform 1.1s cubic-bezier(.2,.75,.3,1) .2s;
}
.steps.in::before{transform:scaleX(1)}
.step{position:relative;padding-top:0}
.step .n{
  width:58px;height:58px;border-radius:17px;display:grid;place-items:center;margin-bottom:15px;
  background:var(--surface);border:1px solid var(--line);position:relative;z-index:2;
  font-family:var(--font-mono);font-weight:700;font-size:17px;color:var(--sc);
  box-shadow:var(--shadow-1);transition:transform .3s cubic-bezier(.2,.8,.3,1),box-shadow .3s;
}
.step:hover .n{transform:translateY(-4px) scale(1.04);box-shadow:var(--shadow-2)}
.step b{display:block;font-size:16.5px;letter-spacing:-.02em;margin-bottom:7px}
.step p{margin:0;font-size:13.5px;line-height:1.65;color:var(--ink-3)}
.step p code{
  font-family:var(--font-mono);font-size:12px;background:var(--surface-2);
  border:1px solid var(--line-soft);border-radius:5px;padding:1px 5px;color:var(--ink-2);
}

/* ═══ 5. ПРОТОКОЛ ══════════════════════════════════════════ */
.money{padding-bottom:66px}
.money .mid{display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);gap:44px;align-items:center}
.ledger{
  background:var(--surface);border:1px solid var(--line);border-radius:18px;overflow:hidden;
  box-shadow:var(--shadow-1);
}
.ledger .lh{
  display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--line-soft);
  font-family:var(--font-mono);font-size:9.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-4);
}
.ledger .lh .bal{margin-left:auto;color:var(--ink);font-size:13px;letter-spacing:0;font-weight:700}
.lrow{
  display:grid;grid-template-columns:auto 1fr auto auto;gap:14px;align-items:center;
  padding:13px 16px;border-bottom:1px solid var(--line-soft);
  opacity:0;transform:translateX(-10px);
  transition:opacity .5s cubic-bezier(.2,.8,.3,1),transform .5s cubic-bezier(.2,.8,.3,1);
}
.ledger.in .lrow{opacity:1;transform:none}
.lrow:last-child{border-bottom:0}
.lrow .d{width:8px;height:8px;border-radius:50%;background:var(--rc)}
.lrow .t{font-size:13.5px}
.lrow .t small{display:block;font-family:var(--font-mono);font-size:10px;color:var(--ink-4);margin-top:2px}
.lrow .s{font-family:var(--font-mono);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--rc)}
.lrow .a{font-family:var(--font-mono);font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums;text-align:right}
.lrow.ret{background:color-mix(in srgb,var(--ok) 7%,transparent)}

/* ═══ 6. ТАРИФЫ ════════════════════════════════════════════ */
.rates{padding-bottom:66px}
.rates-head{display:flex;align-items:flex-end;gap:22px;margin-bottom:20px;flex-wrap:wrap}
.rates-head .hh{margin:0}
.rates-head p{margin:0 0 4px auto;font-size:13px;color:var(--ink-3);max-width:40ch}
.rates .tbl tbody tr{transition:background .16s}
.rates .tbl tbody tr:hover{background:var(--surface-2)}
.rates .tbl td:first-child{font-weight:600}

/* ═══ 7. ИНСТРУМЕНТЫ ═══════════════════════════════════════ */
.tools{padding-bottom:66px}
.tools .mid{
  background:var(--surface);border:1px solid var(--line);border-radius:20px;padding:32px;
  box-shadow:var(--shadow-1);
}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}
.chip{
  display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 15px;border-radius:999px;
  background:var(--surface-2);border:1px solid var(--line);font-size:13px;color:var(--ink-2);
  text-decoration:none;transition:background .18s,color .18s,border-color .18s,transform .18s;
}
.chip:hover{background:var(--ink);color:var(--ground);border-color:var(--ink);transform:translateY(-3px);text-decoration:none}
.chip i{width:6px;height:6px;border-radius:50%;background:var(--cc,var(--accent));flex:none;transition:background .18s}
.chip:hover i{background:currentColor}
.chip.all{background:transparent;border-style:dashed}

/* ═══ 8. ФИНАЛ ═════════════════════════════════════════════ */
.fin{padding-bottom:80px}
/* Панель тёмная в обеих темах.
   Раньше фон брался из --ink: в тёмной теме он почти белый, и блок
   вспыхивал светлым пятном посреди тёмной страницы — выглядело так,
   будто темы перепутаны местами. */
.fin .mid{
  position:relative;overflow:hidden;border-radius:24px;padding:clamp(34px,5vw,62px);
  background:#0E1310;color:#EFF2EA;text-align:center;
  border:1px solid rgba(255,255,255,.07);
}
.fin .mid::before{
  content:"";position:absolute;inset:0 0 auto 0;height:4px;
  background:linear-gradient(90deg,var(--m-voice),var(--m-image) 25%,var(--m-video) 50%,var(--m-music) 75%,var(--m-text));
}
/* Медленно плывущее пятно света — единственная фоновая анимация. */
.fin .mid::after{
  content:"";position:absolute;width:70%;aspect-ratio:1;left:15%;top:-40%;border-radius:50%;
  background:radial-gradient(circle,color-mix(in srgb,var(--m-video) 26%,transparent),transparent 62%);
  animation:drift 17s ease-in-out infinite alternate;pointer-events:none;
}
@keyframes drift{
  from{transform:translate(-14%,0) scale(1)}
  to{transform:translate(14%,9%) scale(1.16)}
}
.fin .mid > *{position:relative;z-index:1}
.fin h2{
  font-family:var(--font-display);font-weight:500;letter-spacing:-.05em;
  font-size:clamp(26px,3.6vw,46px);line-height:1.04;margin:0 0 14px;
}
.fin p{margin:0 auto 26px;max-width:50ch;font-size:15px;line-height:1.65;opacity:.76}
.fin .fine{margin-top:16px;font-size:12.5px;opacity:.6}
.fin .fine a{color:inherit;text-decoration:underline}

/* ─── адаптив ───────────────────────────────────────────────── */
@media(max-width:1040px){
  .work{grid-template-columns:1fr}
  .show{min-height:380px;order:-1}
  .money .mid{grid-template-columns:1fr;gap:26px}
  .steps::before{display:none}
}
@media(max-width:680px){
  .home section{padding-left:16px;padding-right:16px}
  .work{padding-bottom:44px}
  .dtab{font-size:0;gap:0;height:50px}
  .dtab svg{width:20px;height:20px}
  .dg{grid-template-columns:1fr;gap:5px}
  .dg > .gk{text-align:left}
  .tools .mid{padding:22px}
  .mods,.flow,.money,.rates,.tools{padding-bottom:46px}
  .mods{padding-top:46px}
  .lrow{grid-template-columns:auto 1fr auto;gap:10px;padding:12px}
  .lrow .a{display:none}
}

/* ─── движение по желанию системы ───────────────────────────── */
@media(prefers-reduced-motion:reduce){
  [data-rise]{opacity:1;transform:none;transition:none}
  .steps::before{transform:scaleX(1);transition:none}
  .lrow{opacity:1;transform:none;transition:none}
  .ticker .row,.fin .mid::after,.typing i{animation:none}
  .scene.on .bub{animation:none;opacity:1}
  .out-frame{transition:none}
  .mcard:hover,.chip:hover,.dtab:hover,.step:hover .n,.dgo:hover{transform:none}
}

/* Ссылка на полный каталог под таблицей тарифов. */
.rates-more{
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  margin-top:16px;font-size:13px;color:var(--ink-3);
}
.rates-more .btn{margin-left:auto}
.rates-more .btn svg{width:15px;height:15px;stroke-width:2;transition:transform .2s}
.rates-more .btn:hover svg{transform:translateX(3px)}
@media(max-width:640px){
  .rates-more .btn{margin-left:0;width:100%}
}
