/* ============================================================
   design.css — ЕДИНСТВЕННЫЙ источник дизайна сайта.
   Токены + база + адаптив + генератор + коммерция + поддержка.
   Стили фреймов — в frames.css. Двух файлов достаточно.
   ============================================================ */

/* ── шрифт ── */
/* MANROPE ЛЕЖИТ У НАС, И ЭТО ЕДИНСТВЕННОЕ ЕГО ОБЪЯВЛЕНИЕ.
 *
 * Раньше на всех тринадцати страницах стояли preconnect к fonts.googleapis.com
 * и fonts.gstatic.com плюс `<link rel="preload" as="style">` на таблицу Google.
 * Тэга `rel="stylesheet"` при этом не было НИ ОДНОГО, и превращать preload в
 * стиль было некому: правило @font-face не читалось, шрифт не применялся,
 * текст рисовался запасным системным. То есть адрес, User-Agent и IP каждого
 * посетителя уезжали к Google на каждой загрузке — а взамен сайт не получал
 * ничего.
 *
 * Файл переменный по оси wght и сужен до 400..600 — ровно те начертания, что
 * просила прежняя ссылка (400;500;600). Набор знаков: латиница, кириллица,
 * пунктуация, стрелки, валюты. 38 КБ на всё вместо четырёх запросов наружу.
 *
 * `font-display:swap` — текст виден сразу запасным шрифтом и перерисовывается,
 * когда приедет свой: пустой экран в ожидании шрифта на тонкой сети мы уже
 * разбирали (замер 02.09).
 *
 * Лицензия (SIL OFL 1.1) и правообладатель лежат ВНУТРИ файла шрифта, в его
 * таблице имён: отдельный OFL.txt рядом был бы предметом, которого никто не
 * читает и который поставка возит зря.
 *
 * Путь относительный от этого файла: адрес шрифта знает тот, кто его объявил,
 * и второго объявления в разметке нет — там стоит только preload на тот же
 * файл. */
/* Латиница заголовков — тот же Forum, что кириллица (08.10, языки): английская страница выглядит как русская.
   Был Cinzel 500–600: заголовок весом 700 его не выбирал, и латиница уходила в Georgia. */
@font-face{font-family:'World Display';src:url('../../../assets/fonts/forum-latin.woff2') format('woff2');font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0020-007E,U+00A0,U+00AB,U+00B7,U+00BB,U+2013-2014,U+2019,U+201C-201D,U+2026}
@font-face{font-family:'World Display';src:url('../../../assets/fonts/forum-cyrillic.woff2') format('woff2');font-weight:400 700;font-style:normal;font-display:swap;unicode-range:U+0400-045F,U+2116}
@font-face{font-family:'World Label';src:url('../../../assets/fonts/marcellus-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0020-007E,U+00B7,U+2013-2014}
@font-face{
  font-family:'Manrope';
  src:url('../../../assets/fonts/manrope-400-600.woff2') format('woff2');
  font-weight:400 600;
  font-style:normal;
  font-display:swap;
}

/* ── tokens ── */
/* Все CSS-переменные объявлены здесь, в :root этого файла. */
:root{
  /* Выделение текста в поле описания; тёмная тема мира даёт своё (02.10). */
  --selection-bg: rgba(46, 70, 34, .18);
  /* ПОЛЕ ОПИСАНИЯ (владелец 03.10): видимый край в покое, кольцо в фокусе и
   * «фриз» — серее, пока перевод или бросок пишут в поле. Тёмная тема мира
   * даёт свои числа. */
  --field-bg: var(--surface);
  --field-line: var(--line-strong);
  --field-ring: color-mix(in srgb, var(--accent) 25%, transparent);
  --field-frozen-ink: var(--muted);
  --field-frozen-bg: var(--muted-surface);
  --field-frozen-line: var(--line);
  /* Единая шкала отступов (одно значение — одна переменная на весь сайт) */
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:24px;
  --space-6:32px;
  /* -- Fonts -- */
  --font-ui:'Manrope',ui-sans-serif,system-ui,sans-serif;
  /* ШРИФТ ВЫВЕСКИ Animaniq: Cinzel для латиницы, Forum для кириллицы — одно имя,
     два файла по unicode-range (у Cinzel кириллицы нет). Заголовки, разделы. */
  --font-display:'World Display',Georgia,serif;
  /* Дескриптор и метки: Marcellus, кириллица — Forum тем же приёмом. */
  --font-label:'World Label','World Display',Georgia,serif;
  --font-mono:ui-monospace,'SF Mono',Menlo,Consolas,monospace;

  /* -- Ink / text colors -- */
  --ink:#1b1822;
  --ink-strong:#0d0c11;
  --ink-soft:#35303d;
  --muted:#5c5466;
  --muted-soft:#6b6373;
  /* Служебная метка, неизвестная каталогу (11.10, владелец: «фон — только тёмно-серым, текст светло-серым»). */
  --tag-miss-bg:#e7e5e4;
  --tag-miss-fg:#78716c;
  --tag-err:#dc2626;
  --on-dark:#fff;   /* intentional: value==surface, semantics differ (text on dark) */
  --danger-text:#9e2b1e;
  --accent-dark:#6b5122;
  --support-ink:#1f5e55;

  /* -- Surfaces -- */
  --surface:#fbf8f1;
  --surface-tint:#f8f4ec;
  --soft:#f7f2e9;
  --muted-surface:#ebe4d6;
  --outer:#f5f0e6;

  /* -- Accent / status colors -- */
  --accent:#8a6a2e;
  --accent-soft:#f1e8d6;
  --accent-strong:var(--accent);
  --warn:#a4561c;
  --danger:var(--danger-text);
  --danger-bg:#fbeae6;
  --danger-border:#e3b3aa;

  /* -- Lines / borders -- */
  --line:#e2d8c4;
  --line-strong:#d4c7ad;
  --border:1px solid var(--line);
  --border-strong:1px solid var(--line-strong);

  /* ПОЛУПРОЗРАЧНОЕ ПОЛОТНО ПОЛОСЫ СОСТОЯНИЯ. Полоса лежит ПОВЕРХ страницы, и
     непрозрачная она отрезает низ содержимого; сквозь эту — видно, что там
     работа продолжается. Значение с прозрачностью, поэтому именем, а не
     подбором на месте: то же полотно понадобится следующему слою поверх
     страницы. */
  --veil:rgba(245,240,230,.86);
  /* ПОЛОТНО ШАПКИ АВТОРА. Оно же лежит под шапкой профиля, когда обложки нет:
     профиль показывает ту же страницу автора, и второй градиент рядом разошёлся
     бы с первым при первой правке. */
  --hero-veil:linear-gradient(160deg,var(--night),#2a2233 70%,#3a2e1c);

  /* -- Layout widths -- */
  --shell-max:1280px;
  --content-max:1180px;
  --wrap-max:calc(var(--content-max) + var(--space-5) * 2);
  --grid-2:repeat(2,minmax(0,1fr));
  --grid-4:repeat(4,minmax(0,1fr));

  /* -- Spacing / edges (8pt) -- */
  --space-bottom:clamp(70px,6vw,96px);
  --gap:clamp(18px,1.7vw,24px); /* intentional: value==h-section */
  --page-head-gap:clamp(48px,4.2vw,68px); /* intentional: value==ui-space-5 */

  /* -- Sizes / controls -- */
  --topbar-height:74px;
  /* ОДНА ВЫСОТА ДЛЯ ПОЛЕЙ, СПИСКОВ И КНОПОК (20.10, владелец: «один стиль — одинаковые размеры»; в профиле список был
     55, поле 57, кнопка 46, главная кнопка 58). Поле, список, кнопка и главная кнопка — одно число; правило
     craft:control-size меряет это на страницах. */
  --control:52px;
  --field-width:440px;
  /* ПАЛЕЦ. Наименьшая цель, в которую попадают пальцем не целясь. Число одно
     на всю раскладку узкого экрана — навигацию, подвал, вкладки, значки
     помощи: разъехавшись, они читались бы как небрежность, а правка «сделать
     цели крупнее» обошла бы половину мест. 21.09: до этого числа цели шапки
     были 17 точек высотой. */
  --tap:44px;
  /* КЕГЛЬ ПОЛЯ ВВОДА — У ОДНОГО ВЛАДЕЛЬЦА. Он был написан в пяти местах через
     `--body`, и поднять его на телефоне значило пересилить каждое своим
     селектором — то есть завести пятерых вторых владельцев. Теперь поля зовут
     имя, а узкий экран правит ИМЯ (ниже, в разделе «палец»): вес селектора
     при этом ничего не решает. */
  --fs-field:var(--body);
  --row-icon:28px;   /* intentional: value==ui-space-4, semantics differ */
  --action-width:clamp(260px,24vw,380px);
  --action-wide:clamp(300px,32vw,440px);
  --action-height:var(--control);

  /* -- Radii -- */
  --frame-radius:16px;
  /* РАЗМЕР ВЫРЕЗА ОБЪЯВЛЕН ОДИН РАЗ. Он нужен в двух местах — самой ячейке и
     высоте раздела в две строки, — и переписанный числом он разъехался бы при
     первой же правке: ячейка стала бы крупнее, а раздел остался прежним и
     подрезал бы вторую строку. */
  /* Круглая кнопка ряда инструментов и кружки выбранных вырезов рядом с ней
     обязаны быть одного роста: они стоят в одной строке, и разъехавшись на
     пару точек читаются как случайность. Число одно на обоих. */
  --tool-round:38px;
  /* Поле вокруг полки вырезов: крестик и галочка торчат за край ячейки, и без
     этого поля собственная прокрутка раздела их срезает. Число участвует и в
     высоте раздела — потому объявлено именем, а не вписано дважды. */
  --cutout-pad:6px;
  /* Допуск на округление: браузер считает высоту рядов дробями, и полка, чьё
     содержимое совпадает с пределом ТОЧНО, заводила прокрутку из-за доли
     точки. Две точки — меньше, чем видно глазом, и больше, чем любая дробь. */
  --cutout-fit:2px;
  --cutout-face:88px;
  --cutout-figure:120px;
  --ui-radius:8px;
  --ui-radius-sm:4px;
  /* ТЕКСТ НА ЗОЛОТЕ — светлая карточка, не фон страницы: на #8a6a2e фон
     страницы даёт 4.42, ниже порога AA для мелких прописных кнопок; карточка — 4.7. */
  --on-gold:var(--surface);
  /* НОЧЬ БРЕНДА — подложка тёмных мест светлой темы Ivory: подвал, обложки,
     витрина, вырезка значка. Светлый фон страницы — --outer. Значки на тёмных
     карточках кадров берут светлые тона Night (--icon-*, --like, --tag-gold),
     а не золото и зелень светлой страницы: на ночи те дают контраст ниже 3. */
  --night:#0d0c11;
  --gold-deep:var(--accent-dark);
  --ui-pill:999px;
  --fill-input:0 0 0 999px var(--surface) inset;
  --blur-modal:14px;
  --blur-soft:10px;

  /* -- Typography scale -- */
  --h1:clamp(25px,2.35vw,36px);
  --h2:clamp(24px,2.1vw,32px);
  --h3:clamp(18px,1.25vw,22px);
  --body:15px;
  --small:13px;
  --micro:11px;
  --fs-lg:18px;
  --fs-xl:22px;
  --fs-2xl:28px;
  /* `--fs-3xl` СНЯТ 04.09: его единственным читателем был кегль стрелок окна
   * просмотра, а стрелки перестали быть буквами — их размер задаёт доля
   * кнопки, а не шрифт. Настройка без читателя выглядит рабочей и меняется
   * впустую. */

  /* -- Font weights -- */
  --fw-text:400;
  --fw-ui:500;
  --fw-title:600;

  /* -- Letter-spacing: caps tracking -- */
  --caps:.12em;

  /* -- Letter-spacing: heading tracking (negative) -- */
  --track-1:-.01em;
  --track-2:-.02em;
  --track-4:-.03em;

  /* -- Motion durations -- */
  --dur-1:.14s;
  --dur-2:.18s;
  --dur-3:.15s;
  --dur-5:.28s;
  --dur-8:.35s;
  /* Уход полосы состояния: заметно дольше прихода — исчезновение глазу поймать
     нечем, и быстрый уход оставляет пустое место вместо слов. */
  --dur-9:.6s;

  /* -- Landing -- */
  --landing-soft:#f1ebdf;

  /* -- Support -- */
  --support-reply-offset:clamp(14px,2vw,28px);

  /* -- Frame icons -- */
  /* ВОССТАНОВЛЕНО 03.09. Правило висящих ссылок нашло, что половина имён этого
     набора и соседних не объявлена НИГДЕ: `--icon-warn`, `--icon-danger`,
     `--icon-muted`, `--like`, `--like-own`, `--warn-text`, `--trans-fade`,
     `--dur-4`, `--dur-6`. Стили кадров ими пользуются — браузер молча
     пропускал, и значки теряли цвет, а переходы длительность.
     Значения взяты из мест, где они назывались в пояснениях и в соседних
     наборах. */
  --icon-accent:#8fd0c4;
  --icon-warn:#f5a623;
  --icon-danger:#f5484a;
  /* ОПУБЛИКОВАНО (владелец 09.10): голубой — «в мир», не спорит с зелёным «приватно» и оранжевой проверкой. */
  --icon-public:#6db3ff;
  /* Удача хода (05.10, владелец: «нет ошибки — пусть промигивают зелёным»). */
  --icon-ok:#3fd17f;
  --icon-muted:#c5cad6;
  --icon-view:#6fd3f0;
  --icon-download:#74c0ee;
  --icon-reuse:#d8d4f0;
  /* ПОДЛОЖКА ЗНАЧКА — цвет вырезки под наложенным знаком (замок на щите):
     совпадает с тёмной подложкой значка кадра, и наложение не сливается. */
  --icon-knock:var(--night);
  --like:#e0a3b8;
  --like-own:var(--icon-accent);
  --warn-text:#f5a623;
  --dur-4:.24s;
  --dur-6:.4s;
  --trans-fade:opacity var(--dur-3) ease;
  /* ПОРЯДОК НАЛОЖЕНИЯ — НАЗВАННЫЙ НАБОР, А НЕ ЧИСЛА НАУГАД.
   *
   * Было тринадцать значений без имени, от 0 до 9999: почему окно 30, а
   * сообщение 50, знал только тот, кто писал. Между соседними оставлено место,
   * чтобы вставить слой, не двигая остальные. Порядок ВНУТРИ карточки (0…5)
   * остаётся числами: он местный и читается вместе с кодом. */
  --layer-menu: 20;
  --layer-modal: 30;
  --layer-toast: 50;
  --layer-notice: 40;   /* полоса уведомления о cookie: под тостами, над страницей */
  --layer-viewer: 60;
  --layer-top: 1000;
  --layer-debug: 9999;
  /* ТЕНИ — НАЗВАННЫЙ НАБОР, А НЕ РОССЫПЬ.
   *
   * Было 46 теней, 21 разная, четыре повторены дословно (11, 6, 5 и 2 раза).
   * Правка «сделать мягче» обошла бы не все места, а пропущенная тень читается
   * как небрежность. Названы ровно повторяющиеся; встречающиеся по разу
   * остаются числами. */
  --shadow-card: 0 16px 40px rgba(60,45,20,.10);
  --shadow-modal: 0 24px 64px rgba(40,30,15,.16);
  --shadow-soft: 0 10px 26px rgba(60,45,20,.06);
  --shadow-chip: 0 0 0 1px rgba(255,255,255,.55), 0 1px 2px rgba(0,0,0,.35);
--shadow-pub: 0 2px 8px rgba(0,0,0,.35);
  /* ЦВЕТА ЗНАЧКОВ ДЕЙСТВИЙ — ЗДЕСЬ, У ОСТАЛЬНЫХ ЦВЕТОВ.
   *
   * Пять цветов жили числом в стилях кадров, и два из них были копиями уже
   * названных (`--icon-accent`, `--icon-warn`). Правка имени их не трогала:
   * цвет «опубликовать» менялся бы в одном месте и оставался прежним в другом.
   * Замер 02.09 нашёл это сравнением объявленных имён с числами в файлах. */
  --icon-view:#6fd3f0;

  /* -- Landing/text palette (общая для index/blog/landing-секций) -- */
  --landing-ink-1:var(--ink);
  --landing-ink-3:var(--ink-soft);
  --landing-heading:#0d0c11;
  --landing-muted-1:var(--muted);
  --landing-muted-3:#6c6474;
  --landing-muted-4:#766e7c;
  --landing-muted-5:#6f6777;
  --landing-surface-dark:var(--ink);

  /* -- Градиенты (общие) -- */
  --grad-featured:linear-gradient(145deg,var(--night),#221c2c 64%,#2c2418);
  --grad-cta-green:linear-gradient(180deg,#86672b,var(--accent-dark));

  /* -- Точечные общие цвета -- */
  --author-cover-deep:var(--night);
  --tag-gold:#c9a96e;

}

/* ── base ── */

/* ── Skip link (a11y) ──────────────────────────────────────── */
/* Ссылка «к содержимому» спрятана сдвигом ВВЕРХ, а не влево (19.10, арабский): сдвиг влево на 9999 px при письме справа
 * налево растягивал страницу на 10 000 px влево — горизонтальная прокрутка в пустоту. */
.skip-link{position:absolute;inset-inline-start:var(--space-3);top:0;transform:translateY(-200%);z-index:var(--layer-top);padding:var(--space-3) var(--space-4);background:var(--surface);color:var(--ink);border:var(--border);border-radius:var(--ui-radius);text-decoration:none}
.skip-link:focus{transform:none}

/* ── Variables ─────────────────────────────────────────────── */
/* Все переменные — в :root выше. */

/* ── Reset ─────────────────────────────────────────────────── */
*{box-sizing:border-box}
/* ПЕРЕХОД ПО ЯКОРЮ НЕ ПРИЖИМАЕТ ЗАГОЛОВОК К КРАЮ.
   Браузер ставит цель ровно в верх окна: надстрочник раздела («Ваш аккаунт»,
   «Поддержка») оказывается на самой кромке и читается обрезанным. Воздух
   назван ОДИН РАЗ и здесь — у всей страницы, а не по правилу на каждый раздел:
   у `.mf-legal-sec` он уже стоял своим числом, и это было второе объявление
   одного и того же. */
html{scroll-behavior:smooth;scroll-padding-top:var(--space-6)}

/* ── Anti-FOUC / hydration cloak (centralized) ──────────────────
   Prevents the F5 "flash + jump": page content is faded out until
   scripts (i18n text swap, auth/billing hydration) settle, then it
   fades in once. Safety net: even if JS never removes the class, the
   keyframe forces content visible after 1.2s so the page can't get
   stuck blank. Honors prefers-reduced-motion (no fade, instant show). */
html.boot-cloak body{
  opacity:0;
  animation:bootReveal 0s linear 1.2s forwards; /* fallback reveal */
}
html.boot-ready body{
  opacity:1;
  transition:opacity var(--dur-2) ease;
  animation:none;
}
@keyframes bootReveal{to{opacity:1}}
@media(prefers-reduced-motion:reduce){
  html.boot-cloak body{opacity:1;animation:none}
  html.boot-ready body{transition:none}
}

body{margin:0;background:var(--outer);color:var(--ink);font-family:var(--font-ui);font-size:var(--body);font-weight:var(--fw-ui);line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:geometricPrecision}
a{color:inherit;text-decoration:none}
button,input,textarea,select{font:inherit;color:inherit}
button{cursor:pointer;background:transparent;border:0;padding:0}
img,svg{display:block;max-width:100%}
svg{width:1.1em;height:1.1em}
/* `hidden` ОБЯЗАН ПРЯТАТЬ, И ЭТОГО НЕ ДЕЛАЛ.
 *
 * Вес у `[hidden]` и у любого класса одинаков (0-1-0), а классы объявлены
 * ниже — значит `.site-notice{display:flex}` побеждал, и узел со скрытым
 * атрибутом оставался на экране. Поэтому 09.09 сообщение «Часть страницы не
 * собралась» читалось ДВАЖДЫ: в полосе внизу и строкой в потоке страницы —
 * тем самым узлом `[data-fact="page.status"]`, который заведён для краски, а
 * не для глаза, и в разметке стоит с `hidden`.
 *
 * Ниже по файлу росли обходы того же закона: `.support-list-view[hidden]`,
 * `[data-settings-panel][hidden]` и ещё пять — каждый прятал свой узел заново.
 * Они сняты: обход общего закона повторяется столько раз, сколько узлов, а
 * следующий скрытый узел снова окажется видимым.
 *
 * `!important` здесь — не сила, а порядок: `hidden` не оформление, а
 * состояние, и спорить с ним оформлению нечем. */
[hidden]{display:none !important}
h1,h2,h3,p{margin-top:0}
h1{margin-bottom:var(--space-3)}
/* ЗАГОЛОВКИ — ШРИФТ ВЫВЕСКИ Animaniq (брендбук: Cinzel, кириллица — Forum).
   Трекинг положительный: римские прописные в плотном наборе слипаются. Кегль
   и вес — прежние, их задают правила ниже и классы страниц. */
h1,h2,h3,.site-page-title,.site-feature-title,.mf-author-name{font-family:var(--font-display);letter-spacing:.02em}
h2,.site-feature-title{font-size:var(--h2);font-weight:var(--fw-title);line-height:1.12;letter-spacing:.02em}
h2{margin-bottom:0}
h3,.site-card-head{font-size:var(--h3);font-weight:var(--fw-title);line-height:1.2}
h3{margin-bottom:0}
p{color:var(--muted);font-size:var(--small);margin-bottom:0}
small{color:var(--muted);font-size:var(--small)}
strong,b{font-weight:var(--fw-title)}
table{width:100%;border-collapse:collapse}
th,td{text-align:left;border-bottom:var(--border);padding:var(--space-4) var(--space-3);vertical-align:middle}
th{color:var(--muted-soft);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
td:last-child,th:last-child{text-align:right}
.site-card table td:last-child{color:var(--accent-strong);font-weight:var(--fw-title)}
label{display:block;margin-bottom:var(--space-2);color:var(--ink);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
input,textarea,select{width:100%;font-size:var(--fs-field);border:var(--border-strong);background:var(--surface);border-radius:var(--ui-radius);padding:var(--space-4) var(--space-5);outline:none;transition:border-color var(--dur-3)}
input:focus,textarea:focus,select:focus{border-color:var(--accent)}
/* Высота поля и списка — одна (--control); :where — без веса, свой вид компонента (поле в строке главной) её пересиливает. */
:where(input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=file]),select){height:var(--control);padding-block:0}
textarea{min-height:220px;resize:vertical}
label+input,label+textarea,label+select{margin-bottom:var(--space-5)}

/* ── Shell ─────────────────────────────────────────────────── */
.site-root{width:min(100%,var(--shell-max));min-height:100vh;margin:0 auto;background:var(--surface);border-left:var(--border-strong);border-right:var(--border-strong);display:flex;flex-direction:column;overflow:hidden}
.site-topbar{width:100%;max-width:var(--wrap-max);min-height:var(--topbar-height);margin:0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:var(--gap);padding:0 var(--space-5);background:var(--surface);border-bottom:var(--border);flex:0 0 auto}
.site-workspace{width:100%;max-width:var(--wrap-max);margin:0 auto;flex:1 0 auto;background:var(--surface);padding:var(--space-6) var(--space-5) var(--space-bottom)}
.site-footer{width:100%;max-width:var(--wrap-max);margin:0 auto;display:grid;grid-template-columns:auto 1fr;align-items:center;gap:var(--gap);padding:var(--space-5) var(--space-5);background:var(--soft);border-top:var(--border);flex:0 0 auto}
.site-footer .site-nav{justify-self:end;justify-content:flex-end;flex-wrap:wrap}

/* ── Nav & actions ─────────────────────────────────────────── */
.site-nav,.site-actions{display:flex;align-items:center;gap:clamp(16px,1.6vw,28px);min-width:0}
.site-nav{justify-self:start}
.site-actions{justify-self:end;justify-content:flex-end}
.site-nav a,.site-actions a,.site-actions button{position:relative;color:var(--muted);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase;white-space:nowrap}
.site-nav a:hover,.site-actions a:hover,.site-actions button:hover{color:var(--ink)}
/* Флажок у ссылки — отступ зазором, а не пробелом текста: в гибком ряду (телефон) пробел пропадал — «🇷🇺ПРОФИЛЬ» (08.10). */
.site-nav a:has(>.mf-flag),.site-actions a:has(>.mf-flag){display:inline-flex;align-items:center;gap:.45em}
.site-nav a[aria-current="page"],.site-actions a[aria-current="page"]{color:var(--ink)}
.site-nav a[aria-current="page"]::after,.site-actions a[aria-current="page"]::after{content:'';position:absolute;left:0;right:0;bottom:-10px;height:2px;background:var(--accent)}
.site-actions a b{color:var(--warn);margin-right:var(--space-2)}
/* ПОЛОСА ТОКЕНОВ (владелец 21.10, макет tokbar): 3 px, как полоса хода в поле; полная — после начисления, тратится —
 * уходит вправо, зелёный → красный по доле; 100 и ниже — короткий пульс раз в несколько секунд. */
[data-auth-token-link]{position:relative}
.mf-tokbar{--tokbar-ok:#2fbf4a;--tokbar-low:#e5484d;position:absolute;left:0;right:0;bottom:-7px;display:flex;justify-content:flex-end;height:3px;border-radius:2px;background:var(--line);overflow:hidden}
.mf-tokbar[hidden]{display:none}
.mf-tokbar>i{width:var(--tokbar-share);height:100%;border-radius:2px;background:color-mix(in oklch,var(--tokbar-ok) var(--tokbar-share),var(--tokbar-low));transition:width .6s ease,background-color .6s ease}
.mf-tokbar.is-low>i{animation:mf-tokbar-pulse 6s ease-in-out infinite}
@keyframes mf-tokbar-pulse{0%,70%,100%{opacity:1}78%{opacity:.2}86%{opacity:1}92%{opacity:.2}}
@media(prefers-reduced-motion:reduce){.mf-tokbar.is-low>i{animation:none}}

/* ── Brand — single definition ─────────────────────────────── */
.site-brand{
  justify-self:center;
  display:grid;
  place-items:center;
  gap:var(--space-2);
  min-width:clamp(230px,22vw,360px);
  min-height:58px;
  padding:var(--space-2) var(--space-5);
  border:1px solid color-mix(in srgb,var(--ink) 55%,var(--line));
  border-radius:0;
  background:var(--surface);
  color:var(--ink);
  text-decoration:none;
}
.site-brand-logo{width:min(100%,288px);height:auto;display:block;aspect-ratio:575/120}
.site-brand>b{display:none}
.site-brand>span{display:none}
.site-footer .site-brand{min-width:220px;justify-self:start;padding:0;background:transparent;border:0;box-shadow:none}
.site-footer .site-brand-logo{width:min(100%,210px);max-height:50px;object-fit:contain}

/* ── Page head ─────────────────────────────────────────────── */
.site-head{width:100%;max-width:var(--content-max);margin:0 auto var(--page-head-gap);padding:0;background:transparent;border:0}
.site-head.site-section{margin:0 auto var(--page-head-gap)}
.site-head>span,.site-head>div>span,.site-head>p:first-child{display:block;margin:0 0 var(--space-4);color:var(--muted);font-size:var(--small);font-weight:var(--fw-ui);letter-spacing:0;text-transform:none}
.site-head>p:not(:first-child),.site-head>div>p{max-width:900px;margin:0;color:var(--muted);font-size:var(--body);line-height:1.5}

/* Page title (section-level H1) + subordinate settings subhead.
   H1 dominant; the settings H2 reads as a section label, not a rival title. */
.site-page-title{max-width:1040px;margin:0 0 var(--space-5);font-size:var(--h1);color:var(--ink)}
/* ЗАГОЛОВОК БЕЗ ПОДЗАГОЛОВКА НЕ ДЕРЖИТ ОТСТУП ПОД СОБОЙ.
   Нижний отступ заголовка отделяет его от ПОЯСНЕНИЯ под ним. Там, где
   пояснения нет (галерея), он складывался с промежутком ряда головы — два
   отступа об одном, объявленные разными владельцами и не знающие друг о друге.
   На экране это давало провал между названием страницы и её отборами. */
.site-head > div > .site-page-title:last-child{margin-bottom:0}
.site-section>.site-head:has(.site-local-menu) h2{font-size:var(--h2);color:var(--ink)}

/* ── Layout sections ───────────────────────────────────────── */
.site-section{width:100%;max-width:var(--content-max);margin:0 auto}
/* ШАГ МЕЖДУ СЕКЦИЯМИ — ОДИН НА САЙТ И ОБЪЯВЛЕН ОДИН РАЗ.
   Своего отступа у секций не было вовсе: соседние стояли впритык, а воздух
   между ними давали ЧУЖИЕ поля — черта и отступы последнего сообщения внутри
   предыдущей секции. Стоило снять черту в одном месте, как «Мои работы»
   прижались к кнопкам. Расстояние между секциями — свойство страницы, а не
   побочный след того, что стоит в конце предыдущей. Шаг тот же, что у головы
   страницы: второго ритма на сайте нет. */
.site-workspace > .site-section + .site-section{margin-top:var(--page-head-gap)}
.site-section>.site-head{max-width:none;margin:0 0 var(--space-5);padding-bottom:var(--space-5);border-bottom:var(--border);display:flex;align-items:flex-end;justify-content:space-between;gap:var(--gap);flex-wrap:wrap}
.site-section>.site-head h2{margin:0;font-size:var(--h2)}
/* ВЫРАВНИВАНИЕ МЕНЮ РЕШАЕТ ОДИН — ТОТ, В КОМ МЕНЮ ЛЕЖИТ.
 *
 * Было два правила об одном: обёртка витрины прижимала строки вправо
 * (`align-items:flex-end`), а это правило добавляло `justify-content:flex-end`
 * и запас `min-width:360px`. Запас и давал непонятный отступ справа: короткая
 * строка резервировала 360 пикселей и прижималась к правому краю — пустое
 * место читалось как поломка (владелец, 03.09).
 *
 * Теперь правило шапки трогает ПРЯМЫХ детей: меню, лежащее в обёртке,
 * выравнивает обёртка, и спорить им больше не о чем. */
/* ВЫРАВНИВАНИЕ МЕНЮ — ОДНО ПРАВИЛО НА ВСЕ МЕНЮ ШАПКИ.
 *
 * Их было ДВА: одно для прямых детей шапки (с прижатием вправо), другое для
 * любых вложенных (без прижатия). Меню витрины лежат в обёртке, то есть НЕ
 * прямые дети, — и попадали под второе. Владелец возвращался к этому дважды:
 * «прижми меню вправо, эта проблема уже была» (03.09).
 *
 * Два правила об одном виде расходятся при первой же перестановке разметки:
 * стоит завернуть меню в ещё один слой — и прижатие снова пропадёт. Теперь
 * правило одно и не зависит от глубины. */
.site-section>.site-head .site-local-menu{margin:0;justify-content:flex-end;gap:var(--space-5);overflow-x:auto;padding-bottom:2px}
.site-section>.site-head .site-tab,[data-settings-shell] .site-local-menu .site-tab{min-height:0;border:0;border-radius:0;background:transparent;padding:0 0 var(--space-2);color:var(--muted);font-size:var(--body);font-weight:var(--fw-ui);letter-spacing:0;text-transform:none;box-shadow:none}
.site-section>.site-head .site-tab:hover,[data-settings-shell] .site-local-menu .site-tab:hover{color:var(--accent-strong);border-color:transparent}
.site-section>.site-head .site-tab[aria-selected="true"],.site-section>.site-head .site-tab[aria-pressed="true"],.site-section>.site-head .site-tab[aria-current="true"],[data-settings-shell] .site-local-menu .site-tab[aria-selected="true"],[data-settings-shell] .site-local-menu .site-tab[aria-pressed="true"],[data-settings-shell] .site-local-menu .site-tab[aria-current="true"]{background:transparent;border-color:transparent;color:var(--accent-strong);font-weight:var(--fw-title);box-shadow:inset 0 -2px 0 var(--accent)}
.site-section>span:first-child{display:block;margin:0 0 var(--space-5);color:var(--ink);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
.site-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:var(--gap);max-width:var(--content-max);margin:0 auto}
.site-card .site-grid{max-width:none;margin:0}
.site-card-body>.site-grid{gap:clamp(10px,1vw,14px)}

/* ── Cards ─────────────────────────────────────────────────── */
.site-card{background:var(--surface);border:var(--border);border-radius:var(--frame-radius);overflow:hidden;padding:var(--space-5)}
.site-card-body>.site-card+.site-card,.site-card-foot>.site-card+.site-card{margin-top:var(--gap)}
.site-card .site-card{background:var(--surface)}
.site-card>h2,.site-card-body>.site-card>h2{font-size:var(--h2);margin:0 0 var(--space-5);color:var(--ink)}
.site-card-head{display:flex;align-items:center;gap:var(--space-4);flex-wrap:wrap;margin-bottom:var(--space-5);color:var(--ink);font-size:var(--h3)}
.site-card-head .site-row-icon{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;border:1px solid color-mix(in srgb,var(--accent) 55%,var(--line));color:var(--accent);background:var(--accent-soft);font-size:var(--small);font-weight:var(--fw-title);flex:0 0 auto}
.site-card-head>.site-button:last-child{margin-left:auto}
.site-card-body{display:grid;gap:var(--gap);align-content:start}
/* ЯЧЕЙКА СЕТКИ НЕ ДАВИТ НА КАРТОЧКУ. По умолчанию ячейка сетки не может стать
   уже своего содержимого — и список героев в помощи, где имя не переносится,
   раздвигал тело карточки на 51 точку за край телефона; страница молчала, за
   край выносило `overflow` корня. Ячейка жмётся, длинное имя обрезается
   многоточием — оно и без того умеет. */
.site-card-body>*{min-width:0}
.site-card-body>.site-card{margin-top:0}
.site-card-foot{display:flex;align-items:center;justify-content:center;gap:var(--space-3);flex-wrap:wrap;padding-top:var(--gap);margin-top:var(--gap);border-top:var(--border)}
.site-card-foot>p{width:100%;margin:0;color:var(--muted);font-size:var(--small);line-height:1.5;text-align:center}
.site-card-foot>p a{color:var(--accent-strong);font-weight:var(--fw-title);text-decoration:none}
.site-card-foot>p a:hover{text-decoration:underline}

/* ── Rows ──────────────────────────────────────────────────── */
.site-row{width:100%;display:grid;grid-template-columns:var(--row-icon) minmax(0,1fr) max-content var(--space-5);align-items:center;column-gap:var(--space-5);row-gap:2px;border:0;border-top:var(--border);background:transparent;text-align:left;padding:var(--space-4) 0;color:inherit}
.site-row:first-child{border-top:0}
.site-card>.site-row{margin-left:calc(var(--space-5)*-1);margin-right:calc(var(--space-5)*-1);width:calc(100% + var(--space-5)*2);padding-left:var(--space-5);padding-right:var(--space-5)}
.site-row>*{min-width:0}
.site-row-icon{grid-column:1;width:var(--row-icon);min-height:var(--row-icon);align-self:center;justify-self:start;color:var(--muted);display:grid;place-items:center}
.site-row-icon:empty{visibility:hidden}
.site-row-main{grid-column:2;align-self:center}
.site-row-meta{grid-column:4;grid-row:1;align-self:center;justify-self:end;text-align:right;color:var(--muted);font-size:var(--small);line-height:1.2}
.site-row span,.site-row small{display:block}
.site-row small.site-row-meta{grid-column:3;grid-row:2;justify-self:end;align-self:start;color:var(--muted);font-weight:var(--fw-ui)}
.site-row-main b{display:block}
.site-notice{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-4) 0;border-top:var(--border);background:transparent;border-radius:0;color:var(--muted);font-size:var(--small);line-height:1.5;margin:0}
.site-notice strong{display:block;margin-bottom:var(--space-2);color:var(--ink);font-size:var(--small)}
.site-notice .site-row-icon{flex:0 0 auto;margin-top:1px;color:var(--muted)}
.site-card-foot+.site-notice{border-top:0}

/* ── Buttons ───────────────────────────────────────────────── */
.site-button{cursor:pointer;text-decoration:none;line-height:1;white-space:nowrap;min-height:var(--control);display:inline-flex;align-items:center;justify-content:center;gap:var(--space-3);border:var(--border);border-radius:var(--ui-radius);background:var(--surface);padding:0 var(--space-5);color:var(--ink);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase;transition:border-color var(--dur-3),color var(--dur-3)}
.site-button:hover{border-color:var(--accent);color:var(--accent-strong)}
.site-button-primary{min-height:var(--action-height);padding:0 clamp(22px,2.2vw,34px);border-radius:var(--ui-radius);background:var(--accent-strong);border-color:var(--accent-strong);color:var(--on-gold);padding:0 clamp(22px,2.2vw,34px);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
.site-button-primary:hover{background:color-mix(in srgb,var(--accent-strong) 86%,#000);border-color:color-mix(in srgb,var(--accent-strong) 86%,#000);color:var(--on-gold)}
/* РАЗМЕР ГЛАВНОГО ДЕЙСТВИЯ — ОТДЕЛЬНО ОТ ЦВЕТА.
 * Высота и поля жили ВНУТРИ `site-button-primary`, вместе с тёмным фоном:
 * сделать кнопку крупной значило сделать её тёмной. Владелец 03.09 попросил
 * улучшение белым и того же размера — без этого разделения пришлось бы
 * переписывать цвет поверх вида, то есть держать два ответа о фоне. */
.site-button-action{min-height:var(--action-height);padding:0 clamp(22px,2.2vw,34px)}
/* ПОЛОСА ПРОГРЕССА НА КНОПКЕ «УЛУЧШИТЬ ОПИСАНИЕ» (владелец, 24.09): тонкая
   линия по нижнему краю, растёт слева направо по --progress; зелёная к концу,
   красная при отказе. Кнопка не гаснет — нажатия идут в очередь. */
[data-normalize]{position:relative;overflow:hidden}
.mf-btn-progress{--mf-progress:0;position:absolute;left:0;bottom:0;height:4px;width:100%;transform-origin:left center;transform:scaleX(var(--mf-progress));background:var(--icon-accent);transition:transform .12s linear;pointer-events:none}
.mf-btn-progress[data-done="fail"]{background:var(--icon-danger)}
.mf-btn-progress[data-done="ok"]{background:var(--icon-ok)}
.site-button-wide{width:min(100%,var(--action-wide));min-height:var(--action-height)}
.site-card-foot .site-button-primary{flex:1 1 var(--action-width);max-width:var(--action-wide)}
.site-card-foot .site-button-primary.site-button-wide{flex-basis:var(--action-wide)}
.site-card>.site-button-primary,.site-card-body>.site-button-primary,aside.site-card>.site-button-primary,.site-card>div>.site-button-primary,aside.site-card>div>.site-button-primary{display:flex;width:min(100%,var(--action-width));margin-inline:auto}
.site-button-primary+p,.site-card-foot+p,.site-card-foot+.site-notice,.site-card>div>.site-button-primary+p,aside.site-card>div>.site-button-primary+p{margin-top:var(--space-3)}
.site-card>div>.site-button-primary+p,aside.site-card>div>.site-button-primary+p{max-width:var(--action-width);margin-inline:auto;color:var(--muted);text-align:left}

/* ── Tabs & local menu ─────────────────────────────────────── */
.site-local-menu{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin:0 0 var(--space-5)}
.site-head .site-local-menu{margin-top:var(--space-5)}
.site-card>.site-local-menu:first-child,.site-card-body>.site-local-menu:first-child{margin-top:0}
.site-tab{cursor:pointer;text-decoration:none;line-height:1;white-space:nowrap;min-height:var(--control);display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);border:var(--border);border-radius:var(--ui-radius);background:var(--surface);padding:0 var(--space-5);color:var(--muted);font-size:var(--small);font-weight:var(--fw-title);letter-spacing:0;text-transform:none;transition:border-color var(--dur-3),background-color var(--dur-3),color var(--dur-3)}
.site-tab:hover{border-color:var(--accent);color:var(--accent-strong)}
.site-tab[aria-selected="true"],.site-tab[aria-pressed="true"],.site-tab[aria-current="true"]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-strong);font-weight:var(--fw-title)}
[data-settings-shell] .site-local-menu{gap:var(--space-5);align-items:flex-end;margin:0 0 var(--space-5);padding-bottom:2px}
/* ── Controls ──────────────────────────────────────────────── */
.site-control{cursor:pointer;display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);min-height:200px;border:var(--border);border-radius:var(--ui-radius);background:var(--surface);padding:var(--space-5);text-align:left;transition:border-color var(--dur-2),background-color var(--dur-2)}
.site-control:hover{border-color:var(--accent)}
.site-control[aria-pressed="true"],.site-control[data-state="selected"]{background:var(--accent-soft);border-color:var(--accent)}
.site-control .site-row-icon{width:30px;height:30px;border-radius:50%;border:var(--border-strong);display:grid;place-items:center;background:var(--surface);flex:0 0 auto;transition:border-color var(--dur-2)}
.site-control .site-row-icon:empty{visibility:visible}
.site-control .site-row-icon:empty::before{content:'';width:10px;height:10px;border-radius:50%;background:transparent;transition:background var(--dur-2)}
.site-control[aria-pressed="true"] .site-row-icon,.site-control[data-state="selected"] .site-row-icon{border-color:var(--accent)}
.site-control[aria-pressed="true"] .site-row-icon:empty::before,.site-control[data-state="selected"] .site-row-icon:empty::before{background:var(--accent)}
.site-control .site-row-main{font-size:clamp(15px,1.1vw,18px);font-weight:var(--fw-title);letter-spacing:var(--track-2);color:var(--ink)}
.site-control .site-row-main b{display:block;font:inherit;letter-spacing:var(--track-4)}
.site-control .site-row-main small{display:block;margin-top:var(--space-2);color:var(--muted);font-size:var(--small);font-weight:var(--fw-ui);letter-spacing:0;line-height:1.5}
.site-control>.site-row-meta{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;gap:var(--space-2);width:100%;color:var(--muted);font-size:var(--small);font-weight:var(--fw-title);line-height:1.3}
.site-control>.site-row-meta b{display:inline-flex;border-radius:var(--ui-radius);background:var(--accent-soft);color:var(--accent-strong);padding:var(--space-2) var(--space-3);font-size:var(--small);font-weight:var(--fw-title);line-height:1.5;white-space:nowrap}
.site-control>.site-row-meta small{display:inline;font-size:var(--small);color:var(--muted);font-weight:var(--fw-ui)}
.site-card-body>.site-grid .site-control{min-height:170px;padding:var(--space-5);border-radius:var(--ui-radius);align-self:stretch;width:100%}
.site-card-body>.site-grid .site-control .site-row-main{font-size:var(--body)}
.site-card-body>.site-grid .site-control>.site-row-meta{font-size:var(--small)}
.site-card-body>.site-grid .site-control>.site-row-meta b{font-size:var(--micro);padding:2px var(--space-2)}

/* ── Panels ────────────────────────────────────────────────── */
/* Clean info/CTA blocks: one visual surface only.
   Panels inside cards must not create nested bordered boxes. */

/* ── Modal & toast ─────────────────────────────────────────── */
[data-modal]{position:fixed;inset:0;z-index:var(--layer-modal);background:rgba(8,12,10,.74);backdrop-filter:blur(var(--blur-modal));-webkit-backdrop-filter:blur(var(--blur-modal));display:none;place-items:center;padding:var(--space-5)}
[data-modal][aria-hidden="false"],[data-modal][data-state="open"]{display:grid}
[data-modal]>.site-card{width:min(980px,100%);max-height:90vh;overflow:auto;cursor:default}
/* ПОЛОСА СОСТОЯНИЯ — ОДИН КАНАЛ И ОДНО МЕСТО.
   Тост стоял в правом нижнем углу и жил три секунды; строка `page.status` жила
   в потоке страницы и занимала место всегда. Осталась одна полоса: приклеена к
   ОКНУ (шапка у нас уезжает при прокрутке, и сообщение, привязанное к ней,
   пропадало бы ровно тогда, когда человек начал работать), выезжает снизу,
   содержимое не двигает.

   Своих величин здесь нет: отступы из шкалы, цвета по именам, скорость и слой —
   те же, что у прочих всплывающих. */
/* ПОЛОСА ГОВОРИТ ПОВЕРХ ВСЕГО, ЧТО ОТКРЫТО (боевой случай 15.09).
   Она стояла на слое сообщений (50), а окна — на слое просмотрщика (60):
   человек бросал фото в окно лиц, окно честно отвечало «распознавание
   выключено», и ответ уходил ПОД окно. Полоса — единственный канал сообщений
   на сайте; если её не видно при открытом окне, окно снова окажется немым, и
   кто-нибудь заведёт вторую строку внутри — ровно то, от чего уходили. */
[data-status-strip]{
  position:fixed;left:0;right:0;bottom:0;z-index:var(--layer-top);
  display:flex;flex-direction:column;gap:1px;
  /* ПОЯВЛЕНИЕ — ПРОЯВЛЕНИЕ, А НЕ ВЫЛЕТ. Полоса выезжала снизу на всю свою
     высоту: движение через полэкрана глаз ловит как рывок и отрывает от
     работы. Теперь она проступает на месте и приподнимается на шаг. */
  /* УХОД ДОЛЬШЕ ПРИХОДА. Появление можно заметить и дочитать, исчезновение
     заметить нечем: если гасить за тот же срок, глаз ловит пропажу уже пустой.
     Срок ухода стоит в БАЗОВОМ правиле, приход — в состоянии «открыто»:
     переход берётся из того состояния, В КОТОРОЕ идут. */
  transform:translateY(var(--space-2));opacity:0;
  transition:transform var(--dur-9) ease,opacity var(--dur-9) ease;
  pointer-events:none;
}
[data-status-strip][data-state="open"]{
  transform:translateY(0);opacity:1;pointer-events:auto;
  transition:transform var(--dur-5) ease,opacity var(--dur-5) ease;
}
@media(prefers-reduced-motion:reduce){
  [data-status-strip]{transition:none;transform:none}
}
.site-status-line{
  margin:0;display:flex;align-items:center;justify-content:center;
  gap:var(--space-4);padding:var(--space-3) var(--space-5);
  /* СООБЩЕНИЕ, А НЕ ТРЕВОГА. Полоса была плотной заливкой — чёрной на обычное
     слово, ярко-жёлтой и красной на прочее, — и любое из них выдёргивало из
     работы (владелец, 09.09). Полотно у всех трёх родов теперь одно и то же,
     полупрозрачное; род говорит ТЕКСТ и черта сверху, а не заливка во всю
     ширину. Беду видно, работать она не мешает. */
  background:var(--veil);color:var(--ink-soft);
  border-top:var(--border);
  /* Размытие — ради читаемости поверх картинок галереи: без него сквозь
     полотно проступает рисунок и слова теряются. Браузер без него покажет
     просто плотное полотно. */
  backdrop-filter:blur(10px);
  font-size:var(--small);font-weight:var(--fw-title);line-height:1.5;
  /* ЧИСЛА В ПОЛОСЕ — ТАБЛИЧНЫЕ. Остаток и место в очереди переписываются на
     месте, и при пропорциональных цифрах строка дёргается на каждой смене
     разряда. Табличные держат ширину: меняется число, а не строка. */
  font-variant-numeric:tabular-nums;
}
/* Род сообщения — цвет СЛОВ и черты, а не полотна: жёлтый говорит «работает не
   всё», красный — «не работает». Оба берутся по именам из общей палитры. */
.site-status-line[data-tone="warn"]{color:var(--warn);border-top-color:var(--warn)}
.site-status-line[data-tone="error"]{color:var(--danger-text);border-top-color:var(--danger-border)}
/* Ссылка берёт цвет строки: у трёх родов он разный, и второй список цветов
   рядом разошёлся бы с первым. */
.site-status-line a{color:inherit;text-decoration:underline;white-space:nowrap}
.site-card>[data-support-status]:empty{display:none}
.site-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}

/* ── Icons ─────────────────────────────────────────────────── */
.site-ui-icon{width:1.12em;height:1.12em;min-width:1.12em;min-height:1.12em;stroke-width:1.85;vector-effect:non-scaling-stroke}
.site-row-icon .site-ui-icon{width:1.18em;height:1.18em;min-width:1.18em;min-height:1.18em}
.site-card-head .site-row-icon .site-ui-icon{width:1em;height:1em;min-width:1em;min-height:1em}
.site-notice .site-row-icon .site-ui-icon{width:1.1em;height:1.1em;min-width:1.1em;min-height:1.1em}
.site-row-icon[data-icon-ready="1"]{color:var(--ink);font-size:var(--fs-lg);line-height:1}
.site-card-head .site-row-icon[data-icon-ready="1"]{color:var(--ink-soft)}
.site-control .site-row-icon[data-icon-ready="1"]{width:20px;height:20px;min-height:20px;border:0;background:transparent;border-radius:0;padding:0;color:var(--ink-soft)}
.site-control[aria-pressed="true"] .site-row-icon[data-icon-ready="1"],.site-control[data-state="selected"] .site-row-icon[data-icon-ready="1"],.site-tab[aria-selected="true"] .site-row-icon[data-icon-ready="1"]{color:var(--accent-strong)}
.site-notice .site-row-icon[data-icon-ready="1"]{margin-top:var(--space-2)}
.site-row-main b,.site-control .site-row-main b,.site-card-head .site-row-main,.site-notice strong{font-weight:var(--fw-title);letter-spacing:var(--track-4)}
.site-row-meta,.site-row-meta small,.site-row-main small,.site-notice span,.site-notice small{font-weight:var(--fw-ui)}
.site-row-main small{line-height:1.5}
.site-row-meta[data-icon-ready="1"]{display:grid;place-items:center;color:var(--muted);font-size:var(--body);line-height:1}
.site-row:hover .site-row-meta[data-icon-ready="1"],.site-control:hover .site-row-meta[data-icon-ready="1"]{color:var(--accent-strong)}
/* Note — hidden at rest, revealed on hover */
/* Auth modal component: scoped component, no auth logic changes. */
#authModal[data-modal]{
  z-index:var(--layer-viewer);
  padding:clamp(10px,2vw,22px);
  background:rgba(15,17,16,.66);
  backdrop-filter:blur(var(--blur-soft));
}
/* ── Auth modal — centred card design ─────────────────────── */
#authModal[data-modal]>.site-auth-modal{
  position:relative;
  width:min(600px,calc(100vw - 32px));
  max-height:calc(100dvh - 48px);
  overflow:hidden;
  border:var(--border);
  border-radius:var(--ui-radius);
  background:var(--soft);
  box-shadow:var(--shadow-modal);
  cursor:default;
}
/* Remove hero panel — single column card */
#authModal .site-auth-card{
  display:flex;
  flex-direction:column;
  gap:0;
  overflow-y:auto;
  overflow-x:hidden;
  max-height:calc(100dvh - 48px);
  height:auto;
  padding:var(--space-6) var(--space-6);
  box-sizing:border-box;
  flex-shrink:0;
}
#authModal .site-auth-card::-webkit-scrollbar{width:6px}
#authModal .site-auth-card::-webkit-scrollbar-thumb{background:rgba(0,0,0,.12);border-radius:var(--ui-pill)}

/* Close button */
#authModal .site-auth-close{
  position:absolute;
  top:14px;
  right:14px;
  z-index:2;
  width:36px;
  height:36px;
  display:grid;
  place-items:center;
  border:var(--border);
  border-radius:var(--ui-radius);
  background:rgba(255,255,255,.9);
  color:var(--muted);
  font-size:var(--body);
  font-weight:var(--fw-title);
  line-height:1;
  cursor:pointer;
  transition:background var(--dur-1),border-color var(--dur-1),color var(--dur-1);
}
/* Наведение на кнопки окна входа — закрытие и запасной вход выглядят
 * одинаково, и правило у них одно. */
#authModal .site-auth-close:hover,

/* Header copy */
#authModal .site-auth-copy{
  margin-bottom:var(--space-5);
  text-align:center;
}
#authModal .site-auth-copy h1{
  margin:0 0 var(--space-3);
  /* Заголовок не заходит под крестик закрытия (телефон, 20.10). */
  padding-inline:var(--tap);
  color:var(--ink);
  font-size:var(--h1);
}
#authModal .site-auth-copy h1 span{
  display:inline;
  color:inherit;
}
#authModal .site-auth-copy [data-auth-modal-lead]{
  margin:0;
  color:var(--muted);
  font-size:var(--body);
  line-height:1.5;
  font-weight:var(--fw-text);
}

/* Panels */
#authModal .site-auth-panels,
#authModal .site-auth-form{
  width:100%;
}
#authModal .site-auth-form{
  display:grid;
  gap:0;
}

/* Fields */
#authModal .site-auth-fields{
  display:grid;
  gap:var(--space-4);
  margin-bottom:var(--space-5);
}
#authModal .site-auth-field{
  display:grid;
}
#authModal .site-auth-field label{
  margin:0 0 var(--space-2);
  color:var(--ink-soft);
  font-size:var(--micro);
  font-weight:var(--fw-title);
  letter-spacing:var(--caps);
  text-transform:uppercase;
}
#authModal .site-auth-field input{
  width:100%;
  min-height:54px;
  padding:0 var(--space-5);
  border:var(--border-strong);
  border-radius:var(--ui-radius);
  background:var(--surface);
  font-size:var(--fs-field);
  font-weight:var(--fw-text);
  color:var(--ink-strong);
  transition:border-color var(--dur-3);
  /* Prevent browser autofill blue background */
  -webkit-box-shadow:var(--fill-input) !important;
  box-shadow:var(--fill-input);
}
#authModal .site-auth-field input:focus{
  outline:none;
  border-color:rgba(0,0,0,.38);
  /* Keep white bg on focus — no colour shift */
  -webkit-box-shadow:var(--fill-input) !important;
  box-shadow:var(--fill-input);
}
/* Autofill: force white background and dark text */
#authModal .site-auth-field input:-webkit-autofill,
#authModal .site-auth-field input:-webkit-autofill:hover,
#authModal .site-auth-field input:-webkit-autofill:focus,
#authModal .site-auth-field input:-webkit-autofill:active{
  -webkit-box-shadow:var(--fill-input) !important;
  -webkit-text-fill-color:var(--ink-strong) !important;
  caret-color:var(--ink-strong);
  border-color:rgba(0,0,0,.14) !important;
}
#authModal .site-auth-field input::placeholder{color:var(--muted-soft)}

/* Password field with eye button */
#authModal .site-auth-field-wrap{
  position:relative;
  display:grid;
}
#authModal .site-auth-field-wrap input{
  padding-right:52px;
}
#authModal .site-auth-eye{
  position:absolute;
  right:14px;
  top:50%;
  transform:translateY(-50%);
  width:28px;
  height:28px;
  display:grid;
  place-items:center;
  border:none;
  background:none;
  color:var(--muted-soft);
  cursor:pointer;
  border-radius:var(--ui-radius);
  transition:color var(--dur-1);
  padding:0;
}
#authModal .site-auth-eye:hover,
#authModal .site-auth-eye--active{
  color:var(--accent-strong);
}

/* ГЛАВНОЕ ДЕЙСТВИЕ ВИДНО ВСЕГДА (владелец, 22.09: «окно создания аккаунта
   влезает под рамку окна»).
   ЗАМЕР: окно 1280×600, вкладка регистрации — карточка 552 точки при
   содержимом 849; кнопка «Создать аккаунт» стояла на 671, то есть на 95 точек
   ниже дна окна. Достать её можно было прокруткой ВНУТРИ карточки, но признака
   прокрутки на виду нет, и форма читается как обрезанная.
   Кнопка липнет ко дну карточки: прокручиваются поля, действие остаётся на
   экране. Подложка непрозрачная — иначе под кнопкой просвечивают поля.
   БЕЗ ОТРИЦАТЕЛЬНЫХ ПОЛЕЙ: первый заход растянул полосу шире коробки формы
   (`margin-inline: -space-6`), и craft:phone-reach тут же назвал перелив
   340 против 308. */
#authModal .site-auth-actions{
  margin-bottom:0;
  position:sticky;
  bottom:0;
  z-index:1;
  padding-block:var(--space-3);
  background:var(--soft);
  /* Тень сверху снята (20.10, владелец: «кривоватый элемент над кнопкой»): в коротком окне под полосой ничего не
     прокручивается, и тень рисовала тёмную ступень над кнопкой. */
}
#authModal .site-auth-actions .site-button-primary{
  width:100%;
  min-height:52px;
  border-radius:var(--ui-radius);
  font-size:var(--body);
  letter-spacing:var(--caps);
  font-weight:var(--fw-title);
}

/* Divider */
#authModal .site-auth-divider{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  margin:var(--space-5) 0;
  color:var(--muted-soft);
  font-size:var(--small);
  font-weight:var(--fw-title);
  text-transform:uppercase;
  letter-spacing:var(--caps);
}
#authModal .site-auth-divider::before,
#authModal .site-auth-divider::after{
  content:'';
  flex:1;
  height:1px;
  background:rgba(0,0,0,.1);
}

/* Alt action buttons (create account / restore) */
#authModal .site-auth-alt{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:var(--space-3);
}
#authModal .site-auth-alt-btn{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:var(--space-2);
  min-height:48px;
  padding:0 var(--space-4);
  border:var(--border-strong);
  border-radius:var(--ui-radius);
  background:var(--surface);
  color:var(--ink-soft);
  font-size:var(--small);
  font-weight:var(--fw-title);
  text-decoration:none;
  transition:background var(--dur-1),border-color var(--dur-1),color var(--dur-1);
  cursor:pointer;
}
#authModal .site-auth-alt-btn:hover{
  background:var(--muted-surface);
  border-color:rgba(0,0,0,.2);
  color:var(--ink-strong);
}
#authModal .site-auth-alt-btn svg{
  flex:0 0 auto;
  opacity:.55;
}

/* Назад из сброса — тихая ссылка под кнопкой (20.10). */
#authModal .site-auth-back{display:flex;align-items:center;justify-content:center;min-height:44px;margin-top:var(--space-4);color:var(--muted);font-size:var(--small);font-weight:var(--fw-title);text-decoration:none}
#authModal .site-auth-back:hover{color:var(--ink)}


/* Notices */
#authModal .site-notice[data-auth-user-box]{
  border-radius:var(--ui-radius);
}

/* Responsive */
@media(max-width:640px){
  #authModal[data-modal]{padding:var(--space-3);align-items:end;}
  #authModal[data-modal]>.site-auth-modal{border-radius:var(--ui-radius);max-height:96dvh;}
  #authModal .site-auth-card{padding:var(--space-5) var(--space-5) 28px;}
  #authModal .site-auth-alt{grid-template-columns:1fr;}
  #authModal .site-auth-copy h1{font-size:var(--h1);}
  #authModal .site-auth-copy [data-auth-modal-lead]{font-size:var(--body);}
}

/* ── Auth inline error ─────────────────────────────────────── */
/* Space is always reserved — no layout jump on error appearance */
#authModal .site-auth-inline-error{
  /* Always visible in DOM, takes space, but content hidden */
  display:block;
  min-height:44px;           /* reserved height = one line of error text */
  margin-top:var(--space-3);
  padding:var(--space-3) var(--space-4);
  border-radius:var(--ui-radius);
  background:transparent;
  border:1.5px solid transparent;
  color:transparent;
  font-size:var(--small);
  font-weight:var(--fw-ui);
  line-height:1.5;
  transition:background var(--dur-3), border-color var(--dur-3), color var(--dur-3);
  pointer-events:none;
  user-select:none;
}
#authModal .site-auth-inline-error[data-visible]{
  background:var(--danger-bg);
  border-color:var(--danger-border);
  color:var(--danger);
  pointer-events:auto;
  user-select:auto;
}

@media(max-width:1080px){.site-topbar{grid-template-columns:1fr;justify-items:center;padding-top:var(--space-3);padding-bottom:var(--space-3)}.site-nav,.site-actions{justify-self:center;justify-content:center;flex-wrap:wrap}.site-nav a[aria-current="page"]::after,.site-actions a[aria-current="page"]::after{bottom:-6px}.site-footer{grid-template-columns:1fr}.site-footer .site-brand,.site-footer .site-nav{justify-self:start;justify-content:flex-start}}
@media(max-width:720px){.site-brand{min-width:0;width:100%;padding:var(--space-2) var(--space-3)}.site-brand-logo{width:min(100%,250px)}.site-row{grid-template-columns:var(--row-icon) minmax(0,1fr);row-gap:var(--space-2)}.site-row-meta{grid-column:2;justify-self:start;text-align:left}.site-notice{flex-direction:column}.site-button-wide,.site-card-foot .site-button-primary{justify-content:center}.site-control{min-height:0;padding:var(--space-4)}.site-card-body>.site-grid .site-control{min-height:0}}
@media(max-width:640px){.site-brand-logo{width:min(100%,250px);max-height:52px;}}

.site-topbar .site-brand {
  align-self: center;
  min-width: clamp(240px, 20vw, 340px);
  min-height: 56px;
  padding:0 var(--space-2);
  border: 0;
  background: transparent;
  box-shadow: none;
}
.site-topbar .site-brand-logo {
  width: min(100%, 300px);
  max-height: 58px;
  object-fit: contain;
}


/* ── generator (non-frame) ── */
/* ── Генератор: вариант 2 — одна переключаемая центральная область ──────────── */
.site-generator-stage{
  display: block;
  margin-top:var(--space-4);
}
.site-generator-stage > [data-settings-panel]{
  display: block;
}
.site-generator-prompt{
  display: block;
}
.site-generator-prompt textarea{
  width: 100%;
  /* Поле выше в 1,7 раза (11.10, владелец): служебное «Под капотом» занимает строки. */
  min-height: 240px;
  resize: vertical;
  line-height:1.5;
}
.site-generator-stage [data-settings-panel="negative"] textarea{
  width: 100%;
  min-height: 200px;
  resize: vertical;
  line-height:1.5;
}
/* Ряды настроек/исключений/лиц в одной колонке, с воздухом между ними */
.site-generator-stage [data-settings-panel="main"] > .site-row,
.site-generator-stage [data-settings-panel="negative"] > div,
.site-generator-stage [data-settings-panel="reference"] > .site-row,
.site-generator-stage [data-settings-panel="reference"] > .site-card{
  margin-bottom:var(--space-3);
}
/* Панель действий: подсказка слева, основная кнопка справа, на всю ширину */
/* КНОПКИ ПРАВКИ ОПИСАНИЯ СТОЯТ В ОДНОМ РЯДУ С ГЕНЕРАЦИЕЙ (владелец, 01.09).
 *
 * Свой блок под полем (`site-prompt-tools`) снят вместе со своими стилями:
 * пустой набор правил для разметки, которой больше нет, — тот же мёртвый
 * предмет, что и осиротевшее имя в коде.
 *
 * Обе кнопки обычные. Зелёная в ряду одна — «Создать изображение»: две главные
 * рядом не дают понять, какая запускает работу. Сообщение об улучшении ушло
 * под строку про токены, где живут все слова о деньгах. */
.site-generator-actions{
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap:var(--space-5);
  margin-top:var(--space-5);
  flex-wrap: wrap;
}
/* СЛОВА О РАБОТЕ — СТОЛБЦОМ СЛЕВА, ДЕЙСТВИЕ — СПРАВА, В ОДНОМ РЯДУ.
 *
 * Здесь каждое сообщение занимало ПОЛНУЮ строку: `page.status` — заданной
 * основой в 100%, сообщение об улучшении — тем же. Плюс `.site-notice` рисует
 * черту сверху и держит вертикальные отступы, потому что рассчитан стоять
 * ОТДЕЛЬНО, среди карточек. В ряду действий он стоит не отдельно: три строки
 * растягивались на три ряда, каждая со своей чертой, и кнопки уезжали на
 * четвёртый — между полем описания и действием получалась лестница из полос.
 *
 * Слова собраны в один узел и идут столбцом; ряд остаётся рядом из двух
 * предметов: что сказано о работе и что с ней делать. Черты и отступы
 * отдельного сообщения внутри столбца сняты — рядом с кнопкой это подпись, а
 * не карточка. */
/* ЗАПИСЬ СЛЕВА УЖЕ, ЧЕМ КНОПКИ. Она разливалась на всю оставшуюся ширину и
   выталкивала «Улучшить описание» на свою строку — два действия оказывались
   столбиком, хотя это ряд (слово владельца 16.09). Теперь у записи своя доля,
   и кнопки стоят рядом при любой её длине. */
.site-generator-said{
  display:flex;
  flex-direction:column;
  flex:1 1 320px;
  max-width:52%;
  /* Три строки об одной работе читаются как один абзац, а не как три
     сообщения: между ними шаг межстрочья, а не отступ между блоками. */
  gap:var(--space-1);
  margin-right:auto;
  min-width:0;
}
.site-generator-said .site-notice{
  border-top:0;
  padding:0;
  /* ЦЕНА — ФОН, А НЕ ОБЪЯВЛЕНИЕ. Строка стоит на экране постоянно, и читают её
     один раз перед нажатием; тёмная она спорит за внимание с самой работой
     (владелец, 09.09: «чёрный это жёстко»). Бледная — видна, когда нужна, и не
     мешает, когда нет. */
  color: var(--muted-soft);
}
/* ДВА ДЕЙСТВИЯ — В ОДИН РЯД И ОДНОЙ ВЫСОТЫ. «Улучшить описание» и «Создать
   изображение» делают с одной работой разное, но стоят на одном шаге, и
   столбик читался как «сперва одно, потом другое». */
/* Обе кнопки ряда действий — высотой действия из набора. Своё число здесь
   спорило бы с `site-button-action` и `site-button-primary`, у которых эта
   высота уже объявлена именем: вчера ровно так разъехались зона загрузки и
   «Применить» в окне вырезов. */
.site-generator-actions [data-normalize],
.site-generator-actions [data-generate]{
  flex:0 0 auto;
  min-height:var(--action-height);
}
/* ОДИН РАЗМЕР НА ОБА ДЕЙСТВИЯ (владелец, 23.09: «размер и поведение — как у
   кнопки генерации»). Ширина, поля и шрифт надписи у «Улучшить описание» те
   же, что у «Создать изображение»; цвет свой — зелёная в ряду одна, иначе
   не видно, какая из двух запускает платную работу. */
.site-generator-actions [data-normalize],
.site-generator-actions [data-generate]{
  min-width: 220px;
  padding:0 clamp(22px,2.2vw,34px);
  justify-content:center;
  font-size:var(--micro);
  font-weight:var(--fw-title);
  letter-spacing:var(--caps);
  text-transform:uppercase;
}
@media(max-width:640px){
  /* ДВЕ БЕЛЫЕ КНОПКИ В РЯД, ОДНОГО ВЕСА.
 *
 * Правка описания — не действие над работой, поэтому кнопки стоят под самим
 * полем, а не в блоке действий, и обе обычные: зелёная там одна — «Создать
 * изображение», и второй главной кнопки рядом быть не должно, иначе человек
 * не поймёт, какая из них запускает работу.
 *
 * Цена улучшения ушла из надписи на кнопке в общую строку про токены: цена
 * работы и цена улучшения — факты одного рода, и стоять им вместе. */
.site-generator-actions{ justify-content: stretch; }
  .site-generator-actions [data-normalize],
  .site-generator-actions [data-generate]{ width: 100%; }
  /* На узком экране столбец слов занимает всю ширину: рядом с ним ничего не
     помещается, а кнопки ниже растянуты на всю строку. */
  .site-generator-said{ flex:1 1 100%; margin-right:0; max-width:none; }
}

/* ============================================================
   MAGICHKA flat frame system
   Single public CSS source for mutating/image frames.
   DOM state is controlled by frame-render.js through data-* only.
   ============================================================ */
@property --mgk-wave-period{ syntax:'<time>'; inherits:true; initial-value:7s; }
@property --mgk-wave-amp{ syntax:'<number>'; inherits:true; initial-value:1; }
@property --mgk-wave-glow-size{ syntax:'<length>'; inherits:true; initial-value:10px; }
@property --mgk-wave-opacity{ syntax:'<number>'; inherits:true; initial-value:.8; }



/* Единая форма карточек в галерейных сетках: все 16:9, изображение
   заливает через object-fit:cover (см. .mf-frame-img). Контекстное правило
   (карточка внутри галерейной сетки) с [data-ratio] — законно сильнее
   per-image .mf-frame[data-ratio], сетка ровная без «гуляющих» форм. */

/* Гарантия полной заливки картинкой в галерейных карточках (без чёрных полей). */














/* Форма фрейма соответствует его пропорциям (--mf-ratio-w/h из ratio фрейма;
   16:9 по умолчанию). Галерея выкладывается masonry: карточки разной высоты,
   9:16 — высокие, 16:9 — широкие. Картинка заливает карточку через cover;
   карточка уже в пропорциях изображения, поэтому чёрных полей нет. */





/* Модераторские мутации фрейма: снято с публикации навсегда / удалено (надгробие). */

/* Затемнённая подложка надгробия (на весь фрейм). */

/* Заголовок удалённой работы (что именно удалено) — крупнее, выше центра. */

/* Сообщение об удалении + дата + сумма возврата — ниже центра. */


















































/* Подсветка ТОЛЬКО опубликованных карточек по владельцу. Лёгкий приём, чтобы
   не путать с выделением/ошибкой: тонкая цветная нижняя кромка + мягкое
   свечение. МОИ — зелёные, ЧУЖИЕ — холодные синие. Не трогаем ::before/::after
   фрейма (их занимают оверлеи модерации/надгробия) — рисуем по .mf-frame-media. */
















@media(prefers-reduced-motion:reduce){[data-support-reply-card]{transition:none}.support-reply-card-dot{animation:none}}

/* commerce flat layout */
.site-commerce-page{
  --commerce-ink:var(--ink);
  --commerce-muted:var(--muted);
  --commerce-green:var(--accent);
  color:var(--commerce-ink);
}
.site-commerce-page *{box-sizing:border-box;min-width:0}
.site-commerce-page .site-section{max-width:100%}
.site-commerce-page-head{display:grid;grid-template-columns:minmax(0,1fr) minmax(230px,320px);gap:var(--space-5);align-items:end;margin-bottom:var(--space-5)}
.site-commerce-page-head>div:first-child{min-width:0}
.site-commerce-page-head span{display:block;color:var(--commerce-muted);font-weight:var(--fw-title);letter-spacing:var(--track-1)}
.site-commerce-page-head h2{margin:var(--space-4) 0 var(--space-2);color:var(--ink);font-size:var(--h1);text-wrap:balance;max-width:860px}
.site-commerce-page-head p{margin:0;color:var(--commerce-muted);max-width:760px;font-size:clamp(16px,1.25vw,21px);line-height:1.5}
.site-commerce-balance-card{display:grid;align-content:center;gap:var(--space-2);padding:var(--space-5);border-radius:var(--ui-radius);background:var(--surface);border:var(--border)}
.site-commerce-balance-card span,.site-commerce-balance-card small{color:var(--commerce-muted);font-size:var(--small);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}.site-commerce-balance-card strong{display:block;color:var(--ink);font-size:var(--h1)}
.site-commerce-note{display:grid;grid-template-columns:minmax(180px,.28fr) minmax(0,1fr) auto;gap:var(--space-4);align-items:center;margin:var(--space-5) 0 var(--space-5);padding:var(--space-5) var(--space-5);border-radius:var(--ui-radius);background:var(--muted-surface);border:var(--border);color:var(--commerce-muted)}
.site-commerce-note strong{color:var(--commerce-ink);font-size:var(--fs-xl);line-height:1.2}.site-commerce-note span{line-height:1.5}.site-commerce-note .site-button{white-space:nowrap}
.site-commerce-products{display:grid;grid-template-columns:var(--grid-4);gap:var(--space-4);align-items:stretch}.site-commerce-products--tokens{margin-top:0}
.site-commerce-product{appearance:none;-webkit-appearance:none;position:relative;display:grid;grid-template-rows:auto auto auto 1fr auto;gap:var(--space-3);align-items:start;min-height:230px;padding:var(--space-5);border-radius:var(--ui-radius);border:var(--border);background:var(--surface);text-align:left;text-decoration:none;color:var(--commerce-ink);cursor:pointer;transition:border-color var(--dur-1) ease,box-shadow var(--dur-1) ease,transform var(--dur-1) ease,background var(--dur-1) ease}
.site-commerce-product:hover,.site-commerce-product:focus-visible{transform:translateY(-2px);border-color:rgba(201,169,110,0.75);box-shadow:var(--shadow-modal),0 0 0 4px rgba(201,169,110,0.13);outline:none}.site-commerce-product[aria-pressed="true"],.site-commerce-product--featured{background:var(--grad-featured);color:var(--on-dark);border-color:rgba(255,255,255,.18)}
.site-commerce-product-tag{display:inline-flex;align-items:center;width:max-content;min-height:28px;padding:var(--space-2) var(--space-3);border-radius:var(--ui-radius);background:rgba(201,169,110,0.22);color:var(--commerce-green);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}.site-commerce-product--featured .site-commerce-product-tag,.site-commerce-product[aria-pressed="true"] .site-commerce-product-tag{background:rgba(255,255,255,.13);color:var(--tag-gold)}
/* Сколько генераций в пакете — считается от цены биллинга (23.09). */
.site-commerce-product-gens{display:block;margin-top:var(--space-1);font-weight:var(--fw-title)}
.site-commerce-product b{font-size:var(--h1);white-space:normal;overflow-wrap:anywhere}.site-commerce-product small{color:currentColor;opacity:.66;line-height:1.3}.site-commerce-product strong{justify-self:start;display:inline-flex;align-items:center;font-size:clamp(20px,1.6vw,26px);line-height:1;color:var(--ink);letter-spacing:var(--track-2);font-weight:var(--fw-title)}.site-commerce-product--featured strong{color:var(--on-dark)}.site-commerce-product-cta{align-self:end;display:inline-flex;align-items:center;justify-content:center;width:100%;min-height:42px;padding:var(--space-3) var(--space-3);border-radius:var(--ui-radius);background:rgba(201,169,110,0.2);border:1px solid rgba(201,169,110,0.31);color:var(--commerce-green);font-size:var(--small);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}.site-commerce-product--featured .site-commerce-product-cta{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.24);color:var(--on-dark)}.site-commerce-product:hover .site-commerce-product-cta,.site-commerce-product:focus-visible .site-commerce-product-cta{background:rgba(201,169,110,0.35)}
.site-commerce-explain{margin-top:var(--space-5)}.site-commerce-explain .site-card{min-height:142px}.site-commerce-explain .site-card h2{font-size:var(--h2)}.site-commerce-explain .site-card p{color:var(--commerce-muted);line-height:1.5}
.site-purchase-modal[data-modal]{z-index:var(--layer-toast);background:rgba(8,10,9,.64);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px)}
.site-purchase-modal[data-modal][aria-hidden="false"],.site-purchase-modal[data-modal][data-state="open"]{display:grid;place-items:center;pointer-events:auto;padding:var(--space-4)}
.site-commerce-history-modal{width:min(980px,100%);max-height:88vh;overflow:auto;border-radius:var(--ui-radius);background:var(--surface)}
.site-commerce-table{width:100%;border-collapse:collapse}.site-commerce-table th,.site-commerce-table td{padding:var(--space-4) var(--space-3);border-bottom:1px solid rgba(239,233,220,.08);text-align:left}.site-commerce-table th{color:var(--commerce-muted);font-size:var(--small);text-transform:uppercase;letter-spacing:var(--caps)}

/* ---- Consolidated token payment modal (flat UI repair: single source of truth) ---- */
/* Модалка оплаты — консолидированное правило (флет flat). */
/* Flat, compact, no inner scroll, no side instruction column, no oversized headings. */
/* Scoped under [data-payment-modal] to override the generic [data-modal]>.site-card rule (980px + overflow:auto). */
[data-payment-modal]>.site-payment-modal-card--tokens,
.site-payment-modal-card--tokens{
  width:min(640px,calc(100vw - 32px));
  max-width:640px;
  max-height:calc(100dvh - 32px);
  overflow:hidden;
  display:grid;
  grid-template-rows:auto minmax(0,1fr) auto;
  border-radius:var(--ui-radius);
  background:var(--soft);
  border:var(--border);
  box-shadow:var(--shadow-modal)
}
.site-payment-modal-card--tokens .site-card-head{
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-4);align-items:start;
  padding:20px var(--space-4) 12px;border-bottom:var(--border)
}
.site-payment-modal-card--tokens .site-card-head>div{min-width:0}
.site-payment-modal-card--tokens .site-card-head span{font-size:var(--small);font-weight:var(--fw-title);color:var(--commerce-muted);text-transform:uppercase;letter-spacing:var(--caps)}
.site-payment-modal-card--tokens .site-card-head h2{
  margin:var(--space-2) 0 var(--space-2);font-size:var(--h2);
  white-space:normal;overflow-wrap:anywhere
}
.site-payment-modal-card--tokens .site-card-head p{
  max-width:none;margin:0;color:var(--commerce-muted);font-size:var(--small);line-height:1.5
}
.site-payment-modal-card--tokens .site-card-head .site-button{align-self:start;min-width:auto;white-space:nowrap}

/* Single-column body, no side instruction column, no inner scroll (compact static layout) */
/* ОДНА ЛИНИЯ МЕЖДУ ЧАСТЯМИ КАРТОЧКИ (08.10, владелец: «неаккуратно… чинить централизованно»).
   Разделитель — у шапки (снизу) и подвала (сверху); блоки в теле линий не рисуют и отступа тела
   не удваивают. Было: тело с отступом + блок со своими линиями = две линии и пустая полоса
   над «Что перевести» и над подвалом. Правило общее — см. «.site-card-body > …» ниже. */
.site-payment-modal-grid--tokens{display:block;padding:0;overflow:visible;min-height:0}
.site-payment-modal-main--tokens{min-width:0}
.site-commerce-payment-box{padding:var(--space-5) var(--space-4);border-radius:0;background:transparent;border:0}
.site-commerce-payment-head{margin-bottom:var(--space-3)}
.site-commerce-payment-head h3{margin:0;font-size:var(--h3)}
.site-commerce-payment-head p{margin:var(--space-2) 0 0;color:var(--commerce-muted);font-size:var(--small);line-height:1.5}
.site-commerce-inline-note{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);align-items:center;margin:0 0 var(--space-3);color:var(--commerce-ink);font-size:var(--small);font-weight:var(--fw-title)}
.site-commerce-inline-note [data-order-rubles]{color:var(--commerce-ink);font-weight:var(--fw-title)}
.site-commerce-inline-note .site-commerce-note-label{color:var(--commerce-muted);font-weight:var(--fw-text)}

/* Essential fields: full-width, readable, copy targets */
.site-commerce-field-grid--essential{display:grid;grid-template-columns:1fr;gap:var(--space-3)}
.site-commerce-field-grid--essential label{display:grid;gap:var(--space-2);min-width:0;color:var(--commerce-muted);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
.site-commerce-field-grid--essential input{
  width:100%;height:50px;padding:0 var(--space-4);border-radius:var(--ui-radius);border:var(--border);
  background:var(--surface);color:var(--commerce-ink);font-size:var(--fs-field);font-weight:var(--fw-title);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap
}
.site-commerce-field-wide{grid-column:1/-1}

/* ПОЛЕ С КНОПКОЙ КОПИРОВАНИЯ: кнопка ВНУТРИ поля, у правого края.
   У обёртки и кнопки классов не было вовсе (пустые `class=""` жили в разметке
   с 1729), и кнопка падала под поле влево — человек видел её отдельно от
   строки, которую она копирует (найдено владельцем 16.09).
   Адрес кошелька и сумма — длинные и точные: поле не сжимается, кнопка не
   налезает на текст. */
.site-copy-field{position:relative;display:block}
.site-copy-field input{width:100%;padding-right:44px}
.site-copy-btn{
  position:absolute;top:50%;right:6px;transform:translateY(-50%);
  width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;
  border:var(--border);border-radius:var(--ui-radius);background:var(--surface);
  color:var(--muted);cursor:pointer
}
.site-copy-btn:hover{color:var(--ink);border-color:var(--line-strong)}
.site-commerce-plain-status{margin:var(--space-3) 0 0;color:var(--commerce-muted);font-size:var(--small);line-height:1.5}

/* Actions: two compact buttons, disabled until quote ready */

/* Status row: wraps, never forces scroll. Matches the modal subtitle style
   (same muted tone and weight as the header text) for visual consistency. */
.site-payment-modal-status{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-2);align-items:start;padding:var(--space-5) var(--space-4) var(--space-5);border-top:var(--border);color:var(--commerce-muted);white-space:normal}
.site-payment-modal-status span{font-weight:var(--fw-title);color:var(--commerce-muted);font-size:var(--small);line-height:1.5;min-width:0;overflow-wrap:anywhere}
.site-payment-modal-status small{min-width:0;overflow-wrap:anywhere}

@media(max-width:640px){
  [data-payment-modal]>.site-payment-modal-card--tokens,
  .site-payment-modal-card--tokens{
    width:calc(100vw - 20px);max-width:none;max-height:calc(100dvh - 20px);border-radius:var(--ui-radius);
    /* Whole card scrolls on small screens; no fixed 1fr body that overlaps the footer. */
    display:flex;flex-direction:column;overflow-y:auto;-webkit-overflow-scrolling:touch
  }
  .site-payment-modal-card--tokens>*{flex:0 0 auto}
  .site-payment-modal-card--tokens{line-height:1.3}
  .site-payment-modal-grid--tokens{padding:0}
  /* Шапка на телефоне: «Закрыть» в углу, подзаголовок — во всю ширину, а не столбиком рядом с кнопкой. */
  .site-payment-modal-card--tokens .site-card-head{display:block;position:relative}
  .site-payment-modal-card--tokens .site-card-head .site-button{position:absolute;top:var(--space-4);right:var(--space-4)}
  .site-payment-modal-card--tokens .site-card-head>div>span,
  .site-payment-modal-card--tokens .site-card-head h2{display:block;padding-right:120px}
  .site-commerce-payment-box{padding:var(--space-4) var(--space-4)}
}


/* ============================================================
 * Support ticket indicators (site-wide)
 * ============================================================ */
.support-nav-badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 var(--space-2);margin-left:var(--space-2);border-radius:var(--ui-radius-sm);background:var(--accent-strong);color:var(--on-dark);font-size:var(--micro);font-weight:var(--fw-title);line-height:1;letter-spacing:0;vertical-align:middle;box-shadow:0 0 0 2px var(--surface)}
.site-nav a[data-support-unread]::after,.site-actions a[data-support-unread]::after{display:none}
a[data-support-unread]{color:var(--ink)}

@keyframes supportPulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--accent) 55%,transparent)}70%{box-shadow:0 0 0 6px transparent}100%{box-shadow:0 0 0 0 transparent}}

[data-support-reply-card]{position:fixed;right:var(--support-reply-offset);bottom:var(--support-reply-offset);z-index:var(--layer-top);display:flex;align-items:center;gap:var(--space-3);max-width:360px;padding:var(--space-4);border-radius:var(--ui-radius);border:1px solid color-mix(in srgb,var(--accent) 30%,var(--line));background:var(--surface);box-shadow:var(--shadow-card);opacity:0;transform:translateY(10px) scale(.98);transition:opacity var(--dur-5) ease,transform var(--dur-5) ease;pointer-events:auto}
[data-support-reply-card][data-state="open"]{opacity:1;transform:translateY(0) scale(1)}
.support-reply-card-dot{flex:0 0 auto;width:10px;height:10px;border-radius:50%;background:var(--accent);animation:supportPulse 1.8s ease-out infinite}
.support-reply-card-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.support-reply-card-body strong{font-size:var(--small);font-weight:var(--fw-title);color:var(--ink);letter-spacing:var(--track-1)}
.support-reply-card-body span{font-size:var(--small);color:var(--muted);line-height:1.3}
.support-reply-card-open{flex:0 0 auto;align-self:center;padding:var(--space-2) var(--space-4);border-radius:var(--ui-radius-sm);background:var(--accent-strong);color:var(--on-dark);font-size:var(--small);font-weight:var(--fw-title);text-decoration:none;white-space:nowrap}
.support-reply-card-open:hover{background:color-mix(in srgb,var(--accent-strong) 88%,#000)}
.support-reply-card-close{flex:0 0 auto;align-self:flex-start;width:22px;height:22px;margin:calc(-1 * var(--space-2)) calc(-1 * var(--space-2)) 0 0;border:0;background:transparent;color:var(--muted-soft);font-size:var(--fs-lg);line-height:1;cursor:pointer;border-radius:50%}
.support-reply-card-close:hover{color:var(--ink);background:var(--muted-surface)}

/* Central flat landing system: single source of truth for the first page. */
.site-landing{
  background:linear-gradient(180deg,var(--surface) 0%,var(--surface-tint) 56%,var(--surface) 100%);
  padding:0 var(--space-5) clamp(48px,5vw,76px);
}
.site-landing h1,
.site-landing h2,
.site-landing h3,
.site-landing p{margin:0}
.site-landing-section{max-width:var(--content-max);margin-left:auto;margin-right:auto}
.site-landing-showcase{padding-top:var(--space-2)}
.site-landing-hero{
  max-width:1180px;
  margin:0 auto;
  text-align:center;
  padding:clamp(20px,2.4vw,34px) 0 clamp(30px,3.2vw,44px);
}
.site-landing-hero h1{
  color:var(--ink);
  max-width:1180px;
  margin:0 auto;
  font-size:var(--h1);
  text-align:center;
  text-wrap:balance;
}
.site-landing-hero p.site-landing-lead{
  max-width:760px;
  margin:var(--space-5) auto 0;
  color:var(--landing-muted-1);
  font-size:clamp(15px,1vw,17px);
  line-height:1.5;
  font-weight:var(--fw-ui);
  text-align:center;
  margin-left:auto;
  margin-right:auto;
}
.site-landing-actionline{display:flex;justify-content:center;margin-top:28px}
/* ГЛАВНАЯ: ПОЛЕ, СТЕНА РАБОТ, «MADE BY THE COMMUNITY» (20.10, макет главной). Стена — открытые работы мира под вуалью,
 * наклон и медленный дрейф; без работ (`data-wall` нет) первый экран прежний — чистый. */
.mf-home-hero{position:relative;overflow:hidden;border-radius:calc(var(--ui-radius) * 3);max-width:none}
.mf-home-hero[data-wall="1"]{min-height:min(78vh,620px);display:flex;align-items:center;justify-content:center}
.mf-home-wall{position:absolute;inset:-12%;display:grid;grid-template-columns:repeat(6,1fr);grid-auto-rows:190px;gap:6px;transform:rotate(-4deg);pointer-events:none}
.mf-home-wall img{width:100%;height:100%;object-fit:cover;border-radius:12px;animation:mf-home-drift 22s linear infinite alternate}
.mf-home-wall img:nth-child(3n){grid-row:span 2}
.mf-home-hero[data-wall="1"]::before{content:'';position:absolute;inset:0;z-index:1;background:radial-gradient(ellipse at 50% 55%,rgba(11,11,11,.62),rgba(11,11,11,.35) 75%),linear-gradient(180deg,rgba(11,11,11,.1),rgba(11,11,11,.85))}
@keyframes mf-home-drift{to{transform:translateY(-40px)}}
@media(prefers-reduced-motion:reduce){.mf-home-wall img{animation:none}}
.mf-home-in{position:relative;z-index:2;width:100%;max-width:820px;margin:0 auto;padding:var(--space-6) var(--space-4)}
.mf-home-hero[data-wall="1"] h1,.mf-home-hero[data-wall="1"] .site-landing-lead{color:var(--on-dark);text-shadow:0 2px 18px rgba(0,0,0,.55)}
.mf-home-badge{display:inline-flex;gap:var(--space-2);align-items:center;margin:0 0 var(--space-4);padding:var(--space-1) var(--space-3);border:1px solid rgba(255,255,255,.18);border-radius:999px;background:rgba(0,0,0,.35);font-size:var(--small);color:var(--on-dark)}
.mf-home-badge b{color:var(--accent)}
.mf-home-ask{display:flex;gap:var(--space-2);margin:var(--space-5) auto 0;padding:var(--space-2);background:var(--surface);border:var(--border);border-radius:calc(var(--ui-radius) * 2);box-shadow:var(--shadow-modal)}
.mf-home-ask input{flex:1;min-width:0;min-height:var(--tap);background:none;border:0;color:var(--ink);font:inherit;font-family:var(--font-display);font-size:17px;padding:0 var(--space-3);outline:0}
.mf-home-ask .site-action-main{flex:0 0 auto}
.mf-home-chips{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-2);margin-top:var(--space-4)}
.mf-home-chips a{display:inline-flex;align-items:center;gap:var(--space-1);min-height:36px;padding:0 var(--space-3);border:var(--border);border-radius:999px;background:var(--surface);color:var(--ink);font-size:var(--small);text-decoration:none}
.mf-home-chips a:hover{border-color:var(--accent)}
.mf-home-note{margin:var(--space-4) 0 0;font-size:var(--small);color:var(--muted);text-align:center}
.mf-home-hero[data-wall="1"] .mf-home-note{color:var(--on-dark);opacity:.75}
.mf-home-today[hidden]{display:none}
.mf-home-today-head{display:flex;align-items:baseline;gap:var(--space-4);margin:0 0 var(--space-4)}
.mf-home-today-head h2{margin:0}
.mf-home-today-head a{margin-inline-start:auto;color:var(--accent-dark);font-size:var(--small)}
.mf-home-feed{columns:4 220px;column-gap:var(--space-3)}
.mf-home-card{display:block;position:relative;margin:0 0 var(--space-3);break-inside:avoid;border-radius:calc(var(--ui-radius) * 2);overflow:hidden;background:var(--surface)}
.mf-home-card img{display:block;width:100%;height:auto;min-height:120px}
.mf-home-card-meta{position:absolute;inset:auto 0 0 0;padding:var(--space-6) var(--space-3) var(--space-2);background:linear-gradient(transparent,rgba(0,0,0,.8));color:var(--on-dark);font-size:var(--small);opacity:0;transition:opacity .2s}
.mf-home-card:hover .mf-home-card-meta,.mf-home-card:focus-visible .mf-home-card-meta{opacity:1}
@media(max-width:640px){
  .mf-home-hero{border-radius:0}
  .mf-home-wall{grid-template-columns:repeat(3,1fr);grid-auto-rows:150px}
  .mf-home-ask{flex-direction:column}
  .mf-home-ask .site-action-main{width:100%}
  .mf-home-feed{columns:2 140px}
  .mf-home-card-meta{opacity:1}
}

.site-action-main{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:var(--space-3);
  min-height:56px;
  padding:0 var(--space-6);
  border-radius:var(--ui-radius);
  background:var(--grad-cta-green);
  color:var(--on-gold);
  border:1px solid var(--gold-deep);
  box-shadow:var(--shadow-card),inset 0 1px 0 rgba(255,255,255,.28);
  font-size:var(--small);
  font-weight:var(--fw-title);
  letter-spacing:var(--caps);
  text-transform:uppercase;
  text-decoration:none;
  transition:transform var(--dur-2) ease,filter var(--dur-2) ease,background var(--dur-2) ease;
}
.site-action-main:hover{transform:translateY(-1px);filter:brightness(1.05);color:var(--on-gold)}

/* Editorial index strip: replacement for old pills. Central component, not a local adaptation. */

.site-feature-layout{
  display:grid;
  grid-template-columns:minmax(0,1.35fr) minmax(320px,.9fr);
  grid-template-rows:repeat(3,minmax(156px,1fr));
  gap:var(--space-4);
}
.site-feature-card{
  position:relative;
  min-height:156px;
  border-radius:var(--ui-radius);
  overflow:hidden;
  border:1px solid rgba(0,0,0,.13);
  background:var(--ink-strong);
  box-shadow:var(--shadow-card);
}
.site-feature-card{--feature-plain:0px;min-height:var(--feature-plain)}
.site-feature-card--lead{grid-row:1 / span 3;--feature-lead:620px;min-height:var(--feature-lead)}
.site-feature-card-link,
.site-feature-card-link img,
.site-feature-card-shade{position:absolute;inset:0;width:100%;height:100%}
.site-feature-card-link{display:block;color:var(--on-dark);text-decoration:none}
.site-feature-card-link img{object-fit:cover;transition:transform var(--dur-8) ease,filter var(--dur-8) ease}
.site-feature-card-shade{background:linear-gradient(180deg,rgba(0,0,0,.03) 0%,rgba(0,0,0,.16) 40%,rgba(0,0,0,.82) 100%)}
.site-feature-card:not(.site-feature-card--lead) .site-feature-card-shade{background:linear-gradient(180deg,rgba(0,0,0,.02) 0%,rgba(0,0,0,.24) 42%,rgba(0,0,0,.76) 100%)}
.site-feature-card-copy{position:absolute;left:32px;right:32px;bottom:30px;z-index:2;display:block;color:var(--on-dark)}
.site-feature-card:not(.site-feature-card--lead) .site-feature-card-copy{left:24px;right:22px;bottom:20px}
.site-feature-kicker{
  display:inline-grid;
  grid-auto-flow:column;
  align-items:center;
  gap:var(--space-3);
  margin-bottom:var(--space-5);
  color:rgba(255,255,255,.82);
  font-size:var(--micro);
  font-weight:var(--fw-title);
  letter-spacing:var(--caps);
  text-transform:uppercase;
}
.site-feature-kicker::before{content:'';display:block;width:38px;height:1px;background:rgba(255,255,255,.72)}
.site-feature-title{display:block;max-width:640px;color:var(--on-dark);font-size:var(--h2)}
.site-feature-card--lead .site-feature-title{font-size:var(--h1)}
.site-feature-text{display:block;max-width:520px;margin-top:var(--space-4);color:rgba(255,255,255,.88);font-size:var(--body);line-height:1.5;font-weight:var(--fw-ui)}
.site-feature-card:not(.site-feature-card--lead) .site-feature-text{margin-top:var(--space-3);font-size:var(--small);max-width:360px}
.site-feature-arrow{position:absolute;right:0;bottom:0;font-size:var(--fs-xl);color:var(--on-dark)}
.site-feature-action{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:48px;
  margin-top:var(--space-5);
  padding:0 var(--space-5);
  border-radius:var(--ui-radius);
  border:1px solid rgba(255,255,255,.78);
  color:var(--on-dark);
  font-size:var(--small);
  font-weight:var(--fw-title);
  letter-spacing:var(--caps);
  text-transform:uppercase;
}
.site-feature-card:hover img{transform:scale(1.025);filter:saturate(1.08)}

.site-benefit-grid{display:grid;grid-template-columns:var(--grid-4);gap:var(--space-4);margin-top:34px}
.site-benefit-card{min-height:154px;padding:var(--space-5) var(--space-5) var(--space-5);border:var(--border);border-radius:var(--ui-radius);background:var(--surface);box-shadow:var(--shadow-soft)}
.site-benefit-card span{display:block;color:var(--landing-heading);font-size:var(--fs-2xl);line-height:1;margin-bottom:var(--space-5)}
.site-benefit-card h2{color:var(--ink);font-size:var(--h2)}
.site-benefit-card p{margin-top:var(--space-3);color:var(--landing-muted-3);font-size:var(--small);line-height:1.5;font-weight:var(--fw-ui)}

.site-gallery-preview{padding-top:58px;text-align:center}
.site-section-head h2{color:var(--ink);font-size:var(--h2)}
.site-section-head h2::before,.site-section-head h2::after{content:'✧';color:var(--landing-muted-5);font-size:.7em;margin:0 var(--space-4)}
.site-section-head p{margin-top:var(--space-3);color:var(--landing-muted-4);font-size:var(--small);font-weight:var(--fw-ui)}
.site-thumb-grid{display:grid;grid-template-columns:var(--grid-4);gap:var(--space-3)}
.site-thumb-card{position:relative;display:block;aspect-ratio:16/8.55;overflow:hidden;border-radius:var(--ui-radius);border:1px solid rgba(0,0,0,.1);background:var(--landing-surface-dark);color:var(--on-dark);text-decoration:none}
.site-thumb-card img{width:100%;height:100%;object-fit:cover;transition:transform var(--dur-5) ease,filter var(--dur-5) ease}
.site-thumb-card::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,0) 48%,rgba(0,0,0,.62) 100%)}
.site-thumb-card span{position:absolute;left:14px;bottom:11px;z-index:2;color:var(--on-dark);font-size:var(--small);font-weight:var(--fw-title)}
.site-thumb-card:hover img{transform:scale(1.035);filter:saturate(1.08)}
.site-link-more{display:inline-flex;align-items:center;justify-content:center;min-height:46px;margin-top:var(--space-5);padding:0 var(--space-6);border-radius:var(--ui-radius);border:var(--border);background:var(--surface);color:var(--landing-ink-3);font-size:var(--small);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase;text-decoration:none}
.site-link-more:hover{background:var(--muted-surface);color:var(--ink-strong)}
.site-final-panel{display:flex;align-items:center;justify-content:space-between;gap:var(--space-5);margin-top:48px;padding:var(--space-5) var(--space-6);border:var(--border);border-radius:var(--ui-radius);background:var(--surface);box-shadow:var(--shadow-card)}
.site-final-panel h2{color:var(--ink);font-size:var(--h2)}
.site-final-panel p{margin-top:calc(var(--space-2) - 2px);color:var(--landing-muted-3);font-size:var(--small);font-weight:var(--fw-ui)}
.site-final-panel .site-action-main{min-height:52px;padding:0 var(--space-6);font-size:var(--small);flex:0 0 auto}
@media(max-width:1100px){
  .site-landing-hero{padding-top:clamp(34px,4vw,56px)}
  .site-landing-hero h1{max-width:900px;font-size:var(--h1)}
  .site-feature-layout{grid-template-columns:1fr;grid-template-rows:auto}
  .site-feature-card--lead{grid-row:auto;--feature-lead:520px}
  .site-feature-card:not(.site-feature-card--lead){--feature-plain:230px}
  .site-benefit-grid{grid-template-columns:var(--grid-2)}
  .site-thumb-grid{grid-template-columns:var(--grid-2)}
}
@media(max-width:720px){
  .site-landing{padding-top:0;padding-left:16px;padding-right:16px}
  .site-landing-hero{padding:var(--space-6) 0 var(--space-5)}
  .site-landing-hero h1{max-width:520px;font-size:var(--h1)}
  .site-landing-lead br{display:none}
  .site-landing-hero p.site-landing-lead{max-width:520px;font-size:var(--body);line-height:1.5}
  .site-feature-card--lead{--feature-lead:460px}
  .site-feature-card-copy{left:20px;right:20px;bottom:22px}
  .site-feature-card--lead .site-feature-title{font-size:var(--h1)}
  .site-benefit-grid,.site-thumb-grid{grid-template-columns:1fr}
  .site-final-panel{align-items:flex-start;flex-direction:column;padding:var(--space-5)}
}

/* Runtime-only technical links are hidden in production UI. */
[data-generation-mode-link],
[data-generation-mode-footer]{display:none}

/* ============================================================================
 * frame-icons-flat.css — ПЛОСКОЕ оформление иконок фрейма.
 *
 * Иконка из реестра (mf-icons.js) рендерится IconKit'ом как ОДИН плоский
 * слой <svg> (обводка currentColor, без заливки). Никаких halo/core/fill —
 * никаких неоновых «версий». Этот файл задаёт только ЦВЕТ (через color),
 * подложку контрола и вращение спиннера.
 *
 * Цвет приходит из data-tone (accent/warn/danger/muted/…) → color иконки.
 * ========================================================================== */

/* ── Палитра по токену (плоские цвета) ── */

/* Иконка наследует цвет через currentColor (stroke="currentColor" в разметке) */


/* data-tone → плоский color */





/* Тоны контролов фрейма */






/* Контролы без data-tone — белые */


/* Слева внизу: лайк/реюз (роль metric) — плоский цвет по владельцу фрейма */



/* CTA (роль cta) — монохром в тон контента */


/* ── Подложка контрола (фон не просвечивает, без эффектов на самой иконке) ── */




/* Статус-бейдж: плотная подложка, чтобы плоская иконка читалась на фото */


/* ── Анимация «генерация идёт» / загрузка: вращение ── */
@keyframes mf-icon-spin { to { transform: rotate(360deg); } }






/* ── support widget ── */
/* ============================================================================
 * support-widget.css — единый стиль чат-виджета поддержки Magichka.
 *
 * Самодостаточный модуль: вся разметка виджета (список тикетов + переписка)
 * оформляется ТОЛЬКО здесь, в design.css.
 *
 * Опирается на глобальные surface/ink/accent-переменные из :root design.css,
 * но имеет свою ЛОКАЛЬНУЮ шкалу (--sw-*), чтобы виджет был единообразен и
 * не зависел от изменений общей сетки.
 *
 * Принцип: один селектор = одно определение вне @media. Переопределения —
 * только в @media и состояниях ([data-*], :hover, [hidden]). Один масштаб
 * отступов, один масштаб радиусов, одна типографика.
 * ========================================================================== */

/* ---- Локальные токены виджета --------------------------------------------- */
.support-modal {
  /* Шкала отступов (8pt, как в проекте, но локальная и неизменная для виджета) */
  /* Радиусы */
  --sw-radius: 12px;        /* карточка/инпут */
  /* `--sw-radius-sm` снят: это тот же радиус, что общий `--ui-radius` (8px).
   * Второе имя одного предмета расходится при первой правке скругления. */      /* мелкие элементы, бейджи */
  /* `--sw-radius-card` снят: тот же предмет, что общий `--frame-radius` (16px). */   /* само окно виджета */
  --sw-radius-bubble: 14px; /* пузыри сообщений */
  /* Размеры */
  --sw-avatar: 40px;        /* аватар в шапке и аватары сообщений */
  --sw-avatar-ticket: 44px; /* иконка-аватар статуса в карточке тикета */
  --sw-control: 44px;       /* высота поля ввода, кнопок composer */
  --sw-width: 390px;
  --sw-height: 580px;
  /* Цвета-роли — насыщенные, как в утверждённом макете (не бледные
     глобальные токены: --accent-soft #f5fbef слишком белёсый для плашек). */
  --sw-surface: var(--soft);
  --sw-surface-sunken: #f1ebdf;
  --sw-line: var(--line);
  --sw-accent: #8a6a2e;            /* золото бренда (кнопки, имена) */
  --sw-accent-soft: #efe4cc;       /* мягкий золотой фон плашек/пузырей юзера */        /* зелёная иконка на плашке «есть ответ» */
  --sw-warn: #a34a12;              /* оранжевый «открыт» (иконка/текст); 21.10 темнее: #c5601f на фоне виджета — 3.7 < 4.5 */
  --sw-warn-soft: #faece7;         /* мягкий оранжевый фон плашки «открыт» */
  /* Типографика */
  /* Контейнер-виджет (правый нижний угол, без затемнения страницы) */
  position: fixed;
  inset: auto var(--space-4) var(--space-4) auto;
  z-index:var(--layer-viewer);
  display: none;
}

.support-modal[data-state="open"] { display: block; }

.support-modal-card {
  width: min(var(--sw-width), calc(100vw - var(--space-5)));
  height: min(var(--sw-height), calc(100dvh - 48px));
  display: flex;
  flex-direction: column;
  background: var(--sw-surface);
  border: 1px solid var(--sw-line);
  border-radius: var(--frame-radius);
  box-shadow:var(--shadow-modal);
  overflow: hidden;
}

/* ---- Шапка виджета -------------------------------------------------------- */
.support-modal-head {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--sw-line);
}
.support-standard-icon { display: inline-flex; width: 20px; height: 20px; align-items: center; justify-content: center; color: currentColor; }
.support-standard-icon svg { display: block; width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.support-head-avatar .support-standard-icon, .support-head-avatar .support-standard-icon svg { width: 22px; height: 22px; }
.support-msg-avatar .support-standard-icon, .support-msg-avatar .support-standard-icon svg { width: 20px; height: 20px; }
.support-send-btn .support-standard-icon, .support-send-btn .support-standard-icon svg, .support-attach-btn .support-standard-icon, .support-attach-btn .support-standard-icon svg { width: 19px; height: 19px; }

.support-head-avatar {
  flex: 0 0 auto;
  width: var(--sw-avatar);
  height: var(--sw-avatar);
  border-radius: var(--ui-radius);
  background: var(--sw-accent);
  color:var(--on-gold);
  display: flex;
  align-items: center;
  justify-content: center;
}
.support-head-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.support-head-title { font-size:var(--body); font-weight: var(--fw-title); color: var(--ink); letter-spacing: var(--track-1); }
.support-head-status { display: flex; align-items: center; gap: var(--space-3); font-size: var(--small); color: var(--sw-accent); }
.support-head-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--sw-accent); flex: 0 0 auto; }
.support-modal-close {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  border-radius: var(--ui-radius);
  border: 1px solid var(--sw-line);
  background: var(--sw-surface);
  color: var(--ink);
  font-size:var(--fs-lg);
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}
.support-modal-close:hover { background: var(--sw-surface-sunken); }

/* ---- Внутренняя область (список ИЛИ переписка) ---------------------------- */
.support-chat { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }

/* ============================ СПИСОК ТИКЕТОВ ============================== */
/* Два вида окна поддержки — список и переписка — устроены одинаково: колонка
 * во всю высоту. Правило одно на оба. */
/* Два вида окна поддержки — список и переписка — устроены одинаково: колонка
 * во всю высоту. Правило одно на оба. */
/* Два вида окна поддержки — список и переписка — устроены одинаково: колонка
 * во всю высоту. Правило одно на оба (сведено 03.09). */
.support-list-view,
.support-thread-view { display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto; }

/* Вкладки — подчёркивание, без пилюль */
.support-list-tabs {
  display: flex;
  gap: var(--space-5);
  flex: 0 0 auto;
  padding: 0 var(--space-4);
  border-bottom: 1px solid var(--sw-line);
}
.support-list-tab {
  padding: var(--space-3) 0;
  border: 0;
  border-bottom: 2px solid transparent;
  background: transparent;
  color: var(--muted);
  font-size:var(--body);
  font-weight: var(--fw-ui);
  cursor: pointer;
  margin-bottom: -1px;
  transition: color var(--dur-1) ease, border-color var(--dur-1) ease;
}
.support-list-tab:hover { color: var(--ink); }
/* «Поиск» — пункт справа от отборов; открытый — как выбранный. */
.support-search-toggle { margin-left: auto; }
.support-search-toggle[aria-expanded="true"] { color: var(--ink); border-bottom-color: var(--ink); }
.support-list-tab[aria-selected="true"] { color: var(--ink); border-bottom-color: var(--ink); font-weight: var(--fw-title); }

/* Поиск */
.support-search { position: relative; flex: 0 0 auto; display: flex; align-items: center; padding: var(--space-3) var(--space-4) 0; }
.support-search[hidden] { display: none; }
.support-search-icon { position: absolute; left: var(--space-5); color: var(--muted-soft); pointer-events: none; }
.support-search-input {
  width: 100%;
  padding: var(--space-3) var(--space-3) var(--space-3) var(--sw-avatar);
  border: 1px solid var(--sw-line);
  border-radius: var(--ui-radius);
  background: var(--sw-surface-sunken);
  color: var(--ink);
  font: inherit;
  font-size:var(--fs-field);
}
.support-search-input::placeholder { color: var(--muted-soft); }
.support-search-input:focus { outline: none; border-color: var(--sw-accent); background: var(--sw-surface); }

/* Тело списка */
.support-list-body { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; overflow: hidden; padding: var(--space-3) var(--space-3); }
.support-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; }

/* Карточка тикета — единая сетка: аватар | контент | сторона | шеврон */
.support-ticket-row {
  display: grid;
  grid-template-columns: auto 1fr auto auto;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-3);
  border-radius: var(--sw-radius);
  border: 0;
  background: transparent;
  cursor: pointer;
  text-align: left;
  width: 100%;
  font: inherit;
  color: inherit;
  transition: background var(--dur-1) ease;
}
.support-ticket-row:hover { background: var(--sw-surface-sunken); }

.support-ticket-ava {
  flex: 0 0 auto;
  width: var(--sw-avatar-ticket);
  height: var(--sw-avatar-ticket);
  border-radius: var(--sw-radius);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--sw-surface-sunken);
  color: var(--muted);
}
.support-ticket-ava[data-status="open"] { background: var(--sw-warn-soft); color: var(--sw-warn); }
.support-ticket-ava[data-status="answered"] { background: var(--sw-accent-soft); color: var(--support-ink); }
.support-ticket-ava[data-status="closed"] { background: var(--sw-surface-sunken); color: var(--muted-soft); }

.support-ticket-row-main { min-width: 0; display: flex; flex-direction: column; gap: var(--space-1); }
.support-ticket-row-top { display: flex; align-items: center; gap: var(--space-3); min-width: 0; }
.support-ticket-row-ref { font-size: var(--small); font-weight: var(--fw-title); color: var(--muted); letter-spacing: var(--caps); flex: 0 0 auto; }
.support-ticket-row-status { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--small); color: var(--muted); }
.support-ticket-row-status[data-status="open"] { color: var(--sw-warn); }
.support-ticket-row-status[data-status="answered"] { color: var(--sw-accent); }
.support-ticket-row-status[data-status="closed"] { color: var(--muted-soft); }
.support-ticket-row-dot,

.support-ticket-row-subject { font-size: var(--body); font-weight: var(--fw-title); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; letter-spacing: var(--track-1); }
.support-ticket-row-snippet { font-size: var(--small); color: var(--muted-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.support-ticket-row-side { display: flex; flex-direction: column; align-items: flex-end; gap: var(--space-1); flex: 0 0 auto; }
.support-ticket-row-time { font-size: var(--micro); color: var(--muted-soft); white-space: nowrap; }
.support-ticket-row-unread {
  min-width: 18px;
  height: 18px;
  padding:0 var(--space-2);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius:var(--ui-radius);
  font-size: var(--micro);
  font-weight: var(--fw-title);
  line-height: 1;
  color:var(--on-dark);
  background: var(--sw-accent);
  white-space: nowrap;
}
.support-ticket-row-chevron { flex: 0 0 auto; color: var(--muted-soft); }
.support-ticket-divider { height: 1px; background: var(--sw-line); margin: 0 var(--space-3); }

/* Пустое состояние списка */
.support-list-empty { margin: auto; display: flex; flex-direction: column; align-items: center; gap: var(--space-3); color: var(--muted); text-align: center; max-width: 300px; padding: var(--space-5) 0; }
/* ЗАГОЛОВОК ПУСТОГО СОСТОЯНИЯ — ОДНО ПРАВИЛО НА ТРИ МЕСТА.
 * Оно было написано трижды дословно: список обращений, переписка, требование
 * входа. Правка одного оставила бы два прежними, и пустые состояния перестали
 * бы выглядеть одинаково — а они про одно и то же. */
.support-list-empty strong,
.support-chat-empty strong,
.support-auth-required strong { display: block; font-size: var(--body); font-weight: var(--fw-title); color: var(--ink); }

/* Подпись пустого состояния — одна на список и переписку, как и заголовок. */
.support-list-empty span { display: block; font-size: var(--small); line-height: 1.5; }

/* Кружок-значок пустого состояния. СТОИТ ОТДЕЛЬНЫМ ПРАВИЛОМ: когда у правил
 * выше не стало своих объявлений, их селекторы прилипли сюда — и заголовок с
 * подписью получили размер кружка 56×56 со скруглением 50%. Текст лез по
 * одному слову в строку, а стиль выглядел написанным (найдено 14.09). */
.support-empty-icon { width: 56px; height: 56px; padding: var(--space-4); border-radius: 50%; background: var(--sw-surface-sunken); color: var(--sw-accent); margin-bottom: var(--space-3); box-sizing: border-box; }

/* Футер списка */
.support-list-foot { flex: 0 0 auto; padding: var(--space-3) var(--space-4) var(--space-4); border-top: 1px solid var(--sw-line); }
.support-list-foot .site-button { width: 100%; }

/* Кнопка «Новое обращение» — фирменный изумруд виджета (а не тёмно-зелёный
   глобальный site-button-primary), чтобы совпадать с утверждённым макетом. */
.support-list-foot .site-button-primary {
  background: var(--sw-accent);
  border-color: var(--sw-accent);
  color:var(--on-gold);
}
.support-list-foot .site-button-primary:hover {
  background: color-mix(in srgb, var(--sw-accent) 88%, #000);
  border-color: color-mix(in srgb, var(--sw-accent) 88%, #000);
}

/* ============================ ПЕРЕПИСКА ================================== */

.support-back { align-self: flex-start; display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-3) var(--space-4) var(--space-3); border: 0; background: transparent; color: var(--muted); font-size: var(--small); cursor: pointer; }
.support-back:hover { color: var(--ink); }

/* Шапка тикета в переписке — плоская строка под «← К списку», с нижней
   разделительной линией. Без коробки/фона/скругления (как в макете). */
.support-ticket-head {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin: 0;
  padding: 0 var(--space-4) var(--space-3);
  border: 0;
  border-bottom: 1px solid var(--sw-line);
  border-radius: 0;
  background: transparent;
}
.support-ticket-ref { font-size:var(--body); font-weight: var(--fw-title); color: var(--ink); letter-spacing:var(--caps); flex: 0 0 auto; }
.support-ticket-status { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--small); font-weight: var(--fw-ui); }
.support-ticket-status[data-status="open"] { color: var(--sw-warn); }
.support-ticket-status[data-status="answered"] { color: var(--sw-accent); }
.support-ticket-status[data-status="closed"] { color: var(--muted-soft); }
.support-ticket-status-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex: 0 0 auto; }
.support-ticket-meta { margin-left: auto; font-size: var(--micro); color: var(--muted-soft); flex: 0 0 auto; }

/* Лента сообщений */
.support-chat-feed { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-3) var(--space-4); }
.support-chat-feed > :first-child { margin-top: auto; }
.support-chat-feed.is-empty { justify-content: center; }

/* Ряд сообщения: аватар + пузырь */
.support-msg-row { display: flex; align-items: flex-end; gap: var(--space-3); max-width: 100%; }
.support-msg-row--user { flex-direction: row-reverse; }
.support-msg-avatar { flex: 0 0 auto; width: 34px; height: 34px; border-radius: var(--ui-radius); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.support-msg-avatar--admin { background: var(--sw-accent); color:var(--on-gold); }
.support-msg-avatar--user { background: var(--sw-accent-soft); color: var(--sw-accent); }
.support-msg-avatar img { width: 22px; height: 22px; object-fit: contain; }

.support-msg {
  max-width: 76%;
  padding: var(--space-3) var(--space-3);
  border-radius: var(--sw-radius-bubble);
  font-size:var(--body);
  line-height:1.5;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  border: 1px solid var(--sw-line);
}
.support-msg--user { background: var(--sw-accent-soft); color: var(--ink); border-color: transparent; border-bottom-right-radius: var(--space-1); }
.support-msg--admin { background: var(--sw-surface); color: var(--ink); border-bottom-left-radius: var(--space-1); }
.support-msg-author { display: block; font-size: var(--micro); font-weight: var(--fw-title); color: var(--sw-accent); margin-bottom: 2px; }
.support-msg-text { display: block; }
.support-msg time { display: block; font-size: var(--micro); color: var(--muted-soft); margin-top: var(--space-1); }
.support-msg--user time { color: color-mix(in srgb, var(--ink) 45%, transparent); }

.support-msg-row--system { justify-content: center; align-items: center; gap: var(--space-3); }
.support-msg-row--system .support-msg-avatar--system { width: 28px; height: 28px; background: var(--sw-surface-sunken); color: var(--muted); border: 1px solid var(--sw-line); }
.support-msg--system { max-width: min(92%, 520px); background: var(--sw-surface-sunken); color: var(--muted); border-style: dashed; border-radius: var(--ui-radius); text-align: center; box-shadow: none; }
.support-msg-kind { display: block; margin-bottom: 2px; font-size: var(--micro); font-weight: var(--fw-title); letter-spacing: var(--caps); text-transform: uppercase; color: var(--muted-soft); }
.support-msg--system time { color: var(--muted-soft); }

/* Пустое состояние переписки */
.support-chat-empty { margin: auto; display: flex; flex-direction: column; align-items: center; gap: var(--space-3); max-width: 300px; text-align: center; color: var(--muted); }

.support-chat-empty span { display: block; font-size: var(--small); color: var(--muted); line-height:1.5; }

/* Вложения в сообщениях */
.support-msg-attach { display: block; margin-bottom: var(--space-1); border-radius: var(--ui-radius); overflow: hidden; }
.support-msg-attach--img img { display: block; max-width: 200px; max-height: 200px; width: auto; height: auto; border-radius: var(--ui-radius); }
.support-msg-attach--file { display: inline-flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-3); border-radius: var(--ui-radius); background: var(--sw-surface-sunken); color: inherit; font-size: var(--small); text-decoration: none; }

/* Composer: скрепка | поле | отправка */
.support-chat-compose { flex: 0 0 auto; display: grid; grid-template-columns: auto 1fr auto; gap: var(--space-3); align-items: end; padding: var(--space-3) var(--space-4); border-top: 1px solid var(--sw-line); }
.support-chat-compose input[type="file"] { display: none; }
.support-chat-compose textarea {
  min-height: var(--sw-control);
  max-height: 140px;
  resize: none;
  margin: 0;
  padding: var(--space-3) var(--space-3);
  border: 1px solid var(--sw-line);
  border-radius: var(--ui-radius);
  background: var(--sw-surface);
  color: var(--ink);
  font: inherit;
  font-size:var(--fs-field);
}
.support-chat-compose textarea:focus { outline: none; border-color: var(--sw-accent); }
.support-attach-btn {
  flex: 0 0 auto;
  width: var(--sw-control);
  height: var(--sw-control);
  border: 1px solid var(--sw-line);
  border-radius: var(--ui-radius);
  background: var(--sw-surface);
  color: var(--muted);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background var(--dur-1) ease, color var(--dur-1) ease;
}
.support-attach-btn:hover { background: var(--sw-surface-sunken); color: var(--ink); }
.support-send-btn {
  width: var(--sw-control);
  height: var(--sw-control);
  min-height: var(--sw-control);
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--ui-radius);
  background: var(--sw-accent);
  color:var(--on-gold);
  cursor: pointer;
}
.support-send-btn:disabled { opacity: .5; cursor: default; }
.support-chat-status { flex: 0 0 auto; padding: 0 var(--space-4) var(--space-3); font-size: var(--small); color: var(--muted); }
.support-chat-status:empty { display: none; }

/* Превью прикреплённого файла (над composer) */
.support-attach-preview { display: flex; align-items: center; gap: var(--space-3); margin: 0 var(--space-4) var(--space-1); padding: var(--space-3) var(--space-3); border: 1px solid var(--sw-line); border-radius: var(--ui-radius); background: var(--sw-surface-sunken); }
.support-attach-thumb { flex: 0 0 auto; width: 36px; height: 36px; border-radius:var(--ui-radius); overflow: hidden; display: flex; align-items: center; justify-content: center; background: var(--sw-surface); color: var(--muted); }
.support-attach-thumb img { width: 100%; height: 100%; object-fit: cover; }
.support-attach-name { flex: 1 1 auto; min-width: 0; font-size: var(--small); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.support-attach-remove { flex: 0 0 auto; width: 24px; height: 24px; border: 0; background: transparent; color: var(--muted); font-size:var(--fs-lg); line-height: 1; cursor: pointer; border-radius: 50%; }
.support-attach-remove:hover { background: var(--sw-surface); color: var(--ink); }

/* ---- Мобильная адаптация (виджет почти во всю ширину снизу) --------------- */
@media(max-width:640px) {
  .support-modal { inset: auto var(--space-3) var(--space-3) var(--space-3); }
  .support-modal-card { width: 100%; height: min(var(--sw-height), calc(100dvh - 16px)); }
}

/* ---- Меньше движения, если просит система -------------------------------- */
@media(prefers-reduced-motion:reduce) {
  .support-modal-card, .support-ticket-row, .support-list-tab, .support-attach-btn { transition: none; }
}

/* v153: персональная переписка только после входа */
.support-auth-required {
  margin: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  max-width: 320px;
  min-height: 280px;
  padding: var(--space-5) var(--space-4);
  text-align: center;
  color: var(--muted);
}
.support-auth-required span:not(.support-empty-icon) {
  display: block;
  font-size: var(--small);
  line-height:1.5;
}
.support-auth-required .site-button {
  width: 100%;
  margin-top: var(--space-3);
}


/* ── responsive (last: media overrides) ── */
/* ── Responsive ────────────────────────────────────────────── */

@media(max-width:720px){
  :root{--row-icon:22px}
}

.site-auth-brand-kicker, .site-auth-brand-title { text-transform: uppercase; letter-spacing: var(--caps); }

@media(max-width:640px) {
  .site-topbar .site-brand-logo { width: min(100%, 238px); max-height: 50px; }}











@media(max-width:820px){
  [data-modal]{padding:var(--space-3)}
}

/* НОМЕР ЧЕЛОВЕКА В ПРОФИЛЕ. Моноширинный, потому что его сверяют посимвольно;
 * кнопка рядом, а не поверх, — копирование не должно попадать по номеру. */
.site-profile-id{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);margin-top:var(--space-2)}
.site-profile-id code{font-family:var(--font-mono);font-size:var(--small);color:var(--ink);background:var(--soft);border:var(--border);border-radius:var(--ui-radius);padding:var(--space-1) var(--space-2)}
.site-profile-id-copy{border:0;background:transparent;padding:0;color:var(--accent-strong);font-weight:var(--fw-ui);font-size:var(--small);cursor:pointer}
.site-profile-id-copy:hover,.site-profile-id-copy:focus-visible{text-decoration:underline}
.site-profile-id-copy.is-copied{color:var(--muted)}

/* ПРИМЕР В СПРАВКЕ — ССЫЛКА, А НЕ КНОПКА: она ВЕДЁТ в генератор, и человек
 * должен видеть это до нажатия (адрес в строке состояния, открытие в новой
 * вкладке средней кнопкой). Вид у неё общий, строки управления. */


/* ПЕРЕКЛЮЧАТЕЛЬ ЯЗЫКА СНЯТ 07.09: 54 строки стилей на элемент, которого нет ни
 * на одной странице и который не собирает ни один файл кода. Мёртвые правила не
 * ломают вид, но врут о составе сайта: следующий читает их и думает, что
 * многоязычность есть. Понадобится — вернётся вместе с разметкой. */

/* ═══════════════════════════════════════════════════════════════════
   PREMIUM GENERATION WAVES & PHASE TRANSITIONS
   
   Архитектура:
   - Каждая фаза имеет свой цветовой язык через CSS-переменные
   - Волны: 4 слоя синусоид с разными амплитудами/скоростями
   - Мутации фреймов: cross-dissolve через transition на переменных
     + scale-pulse на step-иконке при смене фазы (data-phase-prev)
   ═══════════════════════════════════════════════════════════════════ */

/* Flat create workspace: keep My Works visible even in guest/local mode. */
body:has(#generator) #my-gallery,
body[data-create-auth="guest"] #my-gallery,
body[data-create-auth="authenticated"] #my-gallery{
  display:block;
  visibility:visible;
}
body:has(#generator) #my-gallery[aria-hidden="true"]{
  display:block;
}
#my-gallery[data-local-workspace-section="my-gallery"]{
  min-height: 220px;
}
#my-gallery[data-local-workspace-section="my-gallery"] [data-personal-gallery]:empty::before{
  content:attr(data-empty-label); /* надпись — в разметке, на языке страницы (2248) */
  grid-column:1 / -1;
  display:block;
  padding:var(--space-6) var(--space-4);
  text-align:center;
  color:var(--muted);
}

/* Flat interaction safety: hidden modals and decorative layers must never catch clicks. */
[data-modal][aria-hidden="true"],
[data-modal]:not([aria-hidden="false"]):not([data-state="open"]){
  display: none;
  pointer-events: none;
}
.site-topbar,
.site-workspace,
.site-footer,
.site-nav,
.site-actions,
.site-local-menu,
.site-generator-actions,
#generator,
#my-gallery{
  pointer-events: auto;
}
.site-nav a,
.site-actions a,
.site-actions button,
.site-tab,
.site-button,
.site-row,
.site-control,
textarea,
input,
select,
button,
a[href]{
  pointer-events: auto;
}



/* ============================================================
   AUTHOR PUBLIC PROFILE — public creator page (author.html)
   Tokens only. Reuses .mf-pub-grid gallery runtime below.
   ============================================================ */
@media(max-width:640px){
}

/* PROFILE IDENT — раздельные строки имя/email/подсказка (фикс слипания inline) */

/* AVATAR EDIT + MODAL */
/* Правило `.author-avatar[data-avatar-edit]:hover …` снято вместе с
 * `.author-avatar`: обёртки больше нет, а значок правки живёт в профиле, где
 * его показывает `.site-profile-avatar:hover` ниже. */

/* PROFILE AVATAR (editable in cabinet) */
.site-profile-avatar{position:relative;overflow:hidden}
.site-profile-avatar img[data-flat-avatar]{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit}

/* ХАЙЛАЙТ КЛЮЧЕВЫХ СЛОВ В ПОЛЕ ПРОМПТА (см. assets/js/lexicon-highlight.js).

   КРАСИТСЯ ТЕКСТ, А НЕ ФОН — И ЭТО РЕШЕНИЕ ПО СУЩЕСТВУ, А НЕ ПО ВКУСУ.
   Поле промпта — рабочая поверхность: человек пишет, стирает, выделяет,
   перечитывает. Заливка фоном рвёт строку на цветные плашки, спорит с
   выделением мышью и с подчёркиванием проверки орфографии, а на длинном
   описании превращает абзац в мозаику. Цвет ГЛИФА оставляет строку строкой.

   КАК ЭТО РАБОТАЕТ. Текст рисует ЗЕРКАЛО (оно теперь видимое), а поле держит
   курсор и выделение и само становится прозрачным по глифам. Отсюда три
   обязательства, каждое из которых иначе ломает работу с текстом:
     - курсор виден: caret-color задан явно, иначе он исчезнет вместе с текстом;
     - выделение читаемо: ::selection возвращает глифам цвет, иначе выделенный
       кусок выглядит пустым прямоугольником;
     - подсказка-заглушка видна: placeholder рисует поле, и прозрачным он тоже
       станет — цвет задан отдельно.

   МЕТРИКИ ЗЕРКАЛА И ПОЛЯ СОВПАДАЮТ ДО ПИКСЕЛЯ. Пока текст был невидим, разъезд
   давал сдвиг подсветки; теперь он даст ДВОЙНОЙ ТЕКСТ — заметнее, но и цена
   ошибки выше. Метрики заданы здесь один раз и наследуются обоими узлами. */
.mf-lex-wrap{position:relative;display:block;font-size:var(--fs-field);background:var(--field-bg);border-radius:var(--ui-radius);transition:background-color var(--dur-2)}
.mf-lex-wrap .mf-lex-mirror,
.mf-lex-wrap .mf-lex-input{
  font:inherit;
  font-family:inherit;
  font-size:inherit;
  line-height:1.5;
  letter-spacing:inherit;
  padding:var(--space-3);
  border:1px solid transparent;
  border-radius:var(--ui-radius);
  white-space:pre-wrap;
  overflow-wrap:break-word;
  word-break:normal;
  tab-size:4;
}
.mf-lex-wrap .mf-lex-mirror{
  /* Зеркало ложится ровно на поле, включая случай, когда человек ПОТЯНУЛ поле
   * за уголок: inset:0 держит его на размере обёртки, а обёртка растёт вслед
   * за полем. Своей высоты у зеркала нет — второй источник размера разъехался
   * бы с полем на первом же изменении. */
  /* Место и размер зеркала задаёт JS по фактическому положению поля: `inset:0`
     держался на допущении, что поле занимает обёртку целиком, и любой отступ
     или иная модель размеров разъезжали текст. Здесь остаётся только «вне
     потока». */
  position:absolute;
  overflow:hidden;
  pointer-events:none;
  color:var(--ink);         /* обычный текст читается из зеркала */
  background:transparent;
  z-index:0;
}
.mf-lex-wrap .mf-lex-input{
  position:relative;z-index:1;
  /* Блоком: у строчного поля под ним зазор, и полоса хода вставала под краем. */
  display:block;
  /* Край поля рисует само поле: зеркало под ним прозрачно и без рамки, и до
   * 03.10 у поля не было видно ни края, ни фона (владелец: «непонятно, где
   * края поля ввода»). Ширина рамки та же, что у зеркала, — метрики не едут. */
  border-color:var(--field-line);
  transition:border-color var(--dur-2),box-shadow var(--dur-2);
  background:transparent;
  color:transparent;                  /* глифы рисует зеркало */
  caret-color:var(--ink);    /* курсор обязан остаться видимым */
}
/* ВЫДЕЛЕНИЕ КРАСИТ ТОЛЬКО ФОН. ГЛИФЫ — ВСЕГДА ЗЕРКАЛО.
 *
 * Здесь стояло `color` — «чтобы выделенное читалось». Это и был источник
 * двоения: при выделении поле РИСОВАЛО СВОИ ГЛИФЫ поверх зеркальных, и текст
 * шёл вторым слоем. Все снимки владельца (27.08, четыре штуки) сделаны с
 * выделенным текстом — потому двоение и не уходило после трёх правок
 * геометрии: причина была не в геометрии.
 *
 * Выделение остаётся видимым: его показывает ФОН, а текст поверх фона рисует
 * зеркало. Читается так же, слоёв — один. */
.mf-lex-wrap .mf-lex-input::selection{
  /* Цвет выделения — у темы мира (--selection-bg): зелёные 18% на чёрном поле
   * не видны вовсе (владелец 02.10). Без своей темы — прежний. */
  background:var(--selection-bg);
}
.mf-lex-wrap .mf-lex-input::placeholder{
  color:var(--muted-soft);   /* заглушка не должна исчезать вместе с текстом */
}
/* ПОДСВЕТКА ОПИСАНИЯ — ДВА ЯЗЫКА, И НИ ОДИН НЕ ТРОГАЕТ МЕТРИКИ (28.09).
 *
 * Жалоба владельца: «плохо воспринимается». Разбор снимка:
 *   — пять оттенков одной светлоты читались радугой без иерархии: синий,
 *     зелёный, сине-зелёный и фиолетовый на белом различались с трудом;
 *   — вес 600 в зеркале шире глифов поля: курсор поля уезжал от видимого
 *     текста, тем дальше, чем больше подсвеченных слов в строке;
 *   — «не найдено» (бордовая плашка) отличалось от «найдено» (серая плашка)
 *     только оттенком — при дальтонизме и мельком не отличалось вовсе.
 *
 * Теперь:
 *   СЛОВО СЛОВАРЯ (герой, место, сила, клан, мир) — цветной текст и полоса
 *     маркера того же тона под нижней частью строки. Полоса — фон, а не
 *     рамка и не вес: ширина глифов та же, курсор стоит где стоял. Тонов
 *     четыре, разведены по оттенку И светлоте полосы.
 *   СЛУЖЕБНАЯ МЕТКА (`<ctl:…>`, `<lora:…>`, `<model:…>`) — приглушённый
 *     серый шрифт без плашки (владелец 09.10): метка не отвлекает от текста.
 *   ОШИБКА — плашка метки в красном и ВОЛНИСТОЕ подчёркивание: язык
 *     проверки орфографии, знакомый всем, работает и без цвета.
 *   НАБИРАЕТСЯ — серый текст и точечное подчёркивание, без плашки.
 *
 * Контраст текста к белому (WCAG AA ≥ 4.5): синий 8.6, бирюза 5.9,
 * фиолет 7.1, охра 6.9, пурпур 7.6, красный 7.9; серый метки приглушён нарочно. */
.mf-lex-wrap .mf-lex-mirror mark{
  background:none;
  padding:0;margin:0;
  font-weight:inherit;               /* вес меняет ширину глифов — только цвет и фон */
  color:inherit;
  -webkit-box-decoration-break:clone;box-decoration-break:clone;
  border-radius:2px;
}
/* Маркер под словом: нижняя треть строки тоном категории. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--person,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--power,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--place,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--clan,
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--curse,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--technique,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--world{
  background-image:linear-gradient(to top, var(--lex-band) 0, var(--lex-band) .32em, transparent .32em);
}
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--person{color:#1d4ed8;--lex-band:rgba(29,78,216,.16)}    /* кто  — синий */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--place,
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--world{color:#0f766e;--lex-band:rgba(15,118,110,.16)}   /* где  — бирюза */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--power,
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--technique{color:#6d28d9;--lex-band:rgba(109,40,217,.15)}   /* чем  — фиолет */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--clan{color:#92400e;--lex-band:rgba(217,119,6,.22)}    /* чьи  — охра */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--curse{color:#9d174d;--lex-band:rgba(190,24,93,.16)}    /* проклятия — пурпур */

/* Служебная метка (`<ctl:…>`, `<lora:…>`, `<model:…>`), известная каталогу мира, — приглушённый серый шрифт без
   плашки (владелец 09.10: «вставки не подсвечивать фоном, а выводить в серый цвет шрифта — не должны отвлекать
   от основного текста»). Тон — имя темы мира: светлое поле Animaniq и тёмное OpenWorld. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag{
  color:var(--muted-soft);background:none;
}
/* Неизвестная каталогу мира — красная плашка и волнистая черта ошибки. */
/* Неизвестная каталогу (11.10, владелец: «служебное бледнее основного текста; фон — только тёмно-серым, текст
   светло-серым»): тихая серая плашка и тонкая волна, без красного. */
/* 12.10 (владелец: «пишу то, чего нет, — никак не проявляется»): плашка та же серая, волна — цвета ошибки, как
   у проверки орфографии; неизвестный вид метки (`<nude>`) красится так же. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag-missing,.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag-unknown{
  color:var(--tag-miss-fg);background:var(--tag-miss-bg);border-radius:3px;
  text-decoration:underline wavy var(--tag-err);text-decoration-thickness:1.5px;text-underline-offset:3px;
}
/* Зеркало «Под капотом» (генератор мира, наборы узла и героев) — ещё бледнее вставок: это случится и так. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag-mirror{
  color:var(--muted-soft);background:none;opacity:.7;
}
/* Исключённое человеком (`<-…>`, «Под капотом»): тот же серый, зачёркнуто — генератору не уходит. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag-off{
  color:var(--muted-soft);background:none;text-decoration:line-through;
}
/* Слабое окно (12.10): слова после первого окна кодировщика — бледнее. */
.mf-lex-wrap .mf-lex-mirror .mf-lex-weak{opacity:.5}
.mf-lex-wrap .mf-lex-mirror mark.is-weak{opacity:.5}
/* Метка ещё набирается (нет `>`): серый текст, точечная черта, без плашки. */
.mf-lex-wrap .mf-lex-mirror mark.mf-lex--tag-open{
  color:#6b7280;background:none;
  text-decoration:underline dotted #9ca3af;text-decoration-thickness:1.5px;text-underline-offset:3px;
}

/* МЕТКА КУРСОРА В ЗЕРКАЛЕ. Нулевой ширины и невидима: она нужна не глазу, а
   измерению — по ней подсказка узнаёт, где сейчас курсор. Высота обычной
   строки, чтобы подсказка вставала ПОД строкой, а не поверх неё. */
/* МЕТКА КУРСОРА НЕ РАЗРЫВАЕТ СЛОВО.
 *
 * Стояло `display:inline-block`. Нулевая ширина обманчива: строчно-блочный
 * элемент — ОТДЕЛЬНАЯ коробка, и вставленный ВНУТРЬ слова он разбивает его на
 * два самостоятельных куска. При `white-space:pre-wrap` в этом месте
 * появляется возможность переноса и зазор — слово на экране расходится ровно
 * там, где стоял курсор. Владелец 08.09 увидел это как «пробелы вставляются
 * внутри предыдущего слова»: в самом тексте их нет, расходится ЗЕРКАЛО.
 *
 * `inline` с пустым содержимым коробки не создаёт и текст не рвёт. Место для
 * подсказки метка по-прежнему даёт: у пустого строчного элемента есть и
 * `offsetTop`, и высота строки, а именно их читает подстрочник. Высоту задаём
 * строкой, а не своим числом — подсказка должна стоять под строкой текста, а
 * не под выдуманной величиной. */
.mf-lex-wrap .mf-lex-caret{
  display:inline;
  line-height:inherit;
}

/* ПОДСКАЗКА — ПОДСТРОЧНИК ПОД НАБИРАЕМЫМ СЛОВОМ, А НЕ СТРОКА ПОД ОКНОМ.
   Глазу не нужно уходить вниз и возвращаться на каждой букве.

   Она НЕ ловит указатель (pointer-events:none): накрыв собой текст, она иначе
   отняла бы у поля клик и постановку курсора. Выбор — только с клавиатуры, Tab,
   как и решено: подстановка происходит по явному действию.

   Она НЕ занимает места в потоке (position:absolute): появление подсказки не
   должно дёргать вёрстку под полем. */
.mf-lex-hint{
  position:absolute;
  z-index:2;
  pointer-events:none;
  max-width:100%;
  padding:2px var(--space-2);
  border-radius:var(--ui-radius);
  background:var(--surface);
  border:1px solid var(--outer);
  box-shadow:0 2px 8px rgba(0,0,0,.08);
  font-size:var(--small);
  line-height:1.4;
  color:var(--muted);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}

/* ФЛАГ АВТОРА В КАРТОЧКЕ: примечание к имени, а не второе имя.
   Мельче подписи и с малым отступом — глаз читает автора, потом страну.
   Своей строки не занимает и при отсутствии страны не оставляет места. */
.mf-author-flag{
  flex:0 0 auto;
  margin-left:4px;
  font-size:.85em;
  line-height:1;
  vertical-align:baseline;
  opacity:.9;
}

/* ЗНАЧОК ФЛАГА (домен assets/js/flags.js). Размер задаётся ЗДЕСЬ: рисунок
   один на все места, а места разные — карточка, шапка, профиль. */
.mf-flag{
  display:inline-block;
  /* Подпись в карточке мелкая: 1.2em от неё давало значок в девять пикселей,
     где полосы схлопывались в одну муть. Держим НИЖНИЙ ПРЕДЕЛ в пикселях —
     флаг остаётся читаемым независимо от того, каким шрифтом набрана строка. */
  width:1.45em;
  height:.95em;
  min-width:15px;
  min-height:10px;
  vertical-align:-.12em;
  border-radius:2px;
  overflow:hidden;
  line-height:0;
  /* Светлое кольцо снаружи вместо тёмной обводки внутри: рисунок не теряет
     крайние полосы, а значок отделяется и от тёмной карточки, и от светлой
     шапки. Тень снизу даёт ему объём, чтобы он не читался как опечатка. */
  box-shadow:var(--shadow-chip);
}
.mf-flag img{display:block;width:100%;height:100%;object-fit:cover}
/* Страна без рисунка: аккуратная метка с кодом, а не пустота и не чужой флаг */
.mf-flag--code{
  width:auto;height:auto;line-height:1;
  padding:0 3px;
  font-size:.7em;font-weight:700;letter-spacing:.02em;
  border:1px solid currentColor;border-radius:3px;
  opacity:.65;
}

/* ОБРАЗЦЫ ВНЕШНОСТИ В ПРОФИЛЕ. Выбор виден пальцем и глазом: сам образец и
   есть кнопка — подпись к градиенту ничего не добавила бы. */
.site-row-note{display:block;opacity:.75}

/* ШАПКА ПРОФИЛЯ: круг аватара и имя рядом, как в карточках сайта. Раньше они
   стояли отдельными блоками и читались как два разных факта. */
/* КРУГ НА СВОЕЙ СТРАНИЦЕ БОЛЬШЕ, ПОТОМУ ЧТО ЗДЕСЬ ЕГО НАСТРАИВАЮТ.
   Пятьдесят шесть пикселей хватает, чтобы УЗНАТЬ себя, и не хватает, чтобы
   выбрать, что попадёт в круг: раньше это делали двумя ползунками в соседней
   колонке, и результат их движения на этой странице не показывался вовсе —
   `object-position` картинке никто не ставил. Крутили вслепую.
   Теперь картинку двигают в самом круге, и потому он такого размера, чтобы
   было видно, что двигаешь. */

/* ССЫЛКА НА СВОЮ СТРАНИЦУ АВТОРА в шапке профиля: подпись, а не кнопка —
   действие второстепенное, а выглядеть кнопкой значит спорить с главным. */
/* СВОЯ СТРАНИЦА — СПРАВА, А НЕ ПОД ИМЕНЕМ. Ссылка стояла третьей строкой в
   столбце имени, под подсказкой о правке, — и терялась ровно там, где человек
   уже читает про другое. Профиль и страница автора — две стороны одного, и
   переход между ними обязан быть виден с первого взгляда. */
/* Номер аккаунта — отдельной тихой карточкой: он не про то, как вас видят, а
   про то, как вас найдёт поддержка. Соседство с именем и обложкой делало из
   технической строки часть облика. */

/* ЗАТЕМНЕНИЕ ПОД ОБЛОЖКОЙ СТРАНИЦЫ АВТОРА.
   Шапка пишет светлым по картинке, которую выбрал сам автор; на светлом снимке
   имя и счёт работ пропадали. Слой включается меткой `data-cover` — там, где
   картинка действительно есть: над градиентом по умолчанию затемнять нечего. */
.mf-author-hero{position:relative}
.mf-author-hero[data-cover="1"]::before,.mf-author-mosaic::after{
  content:'';position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(12,18,14,.34),rgba(12,18,14,.74));
}
.mf-author-hero-inner{position:relative}
/* ОБЛОЖКА-МОЗАИКА (19.10): семь работ автора под вуалью, когда своей обложки нет; на телефоне — пять. */
.mf-author-mosaic{position:absolute;inset:0;display:grid;grid-template-columns:2fr 1fr 1fr 1fr;grid-template-rows:1fr 1fr;gap:2px;overflow:hidden}
.mf-author-mosaic img{width:100%;height:100%;min-height:0;object-fit:cover}
.mf-author-mosaic img:first-child{grid-row:span 2}
@media(max-width:640px){.mf-author-mosaic{grid-template-columns:2fr 1fr 1fr}.mf-author-mosaic img:nth-child(n+6){display:none}}

/* Буква вместо аватара: узел ищет `ui-runtime`, а правила у него не было —
   класс жил только в разметке и в коде. */
/* Флаг рядом со списком стран: он и есть предмет выбора — человек выбирает не
   строку, а знак, который увидят другие. */
.site-profile-country{display:flex;align-items:center;gap:var(--space-3)}
.site-profile-country select{flex:1 1 auto;min-width:0}
.site-profile-avatar-letter{
  display:flex;align-items:center;justify-content:center;
  width:100%;height:100%;
  font-weight:var(--fw-title);
  font-size:1.25rem;color:var(--on-dark);
  background:var(--accent-dark);
  border-radius:inherit;
}

/* ═══ ПУБЛИЧНАЯ СТРАНИЦА АВТОРА ═══════════════════════════════════════════
   Отдельный продукт: её открывают по ссылке из сети. Ни меню, ни лого, ни
   рабочих панелей — фон, автор, работы. Всё на общей шкале сайта: своих
   значений «на глаз» здесь нет. */
.mf-author-page{background:var(--outer)}
/* РАМКА — ТА ЖЕ, ЧТО У РАБОЧЕГО САЙТА, НО НЕВИДИМАЯ (1724). Ширину содержимого
   считает `.site-root` — с его границами; без неё на узком экране шапка автора
   выходила на две точки шире профильной. Вид публичной страницы прежний: фон
   страницы, а не белая колонка, граница прозрачная. */
.mf-author-page .site-root{background:transparent;border-color:transparent}
.mf-author-hero{
  /* ОДИН РОСТ НА ОБЕ СТРАНИЦЫ. Обложка кадрируется по высоте шапки: пока
     высота бралась от содержимого, профиль и публичная страница резали одну и
     ту же картинку по-разному, и человек видел разные куски (владелец, 10.09).
     Рост назначен здесь и потому одинаков у обеих. */
  min-height:clamp(220px,26vw,320px);
  display:flex;flex-direction:column;justify-content:center;
  padding:var(--space-6) var(--space-5);
  /* Второй цвет перехода — уже названный `--accent-dark`: числом он жил в
     верхнем регистре и потому не попадался поиску. Первый остаётся числом:
     своего имени у него нет, и заводить имя ради одного места незачем. */
  background:var(--hero-veil);
  color:var(--on-dark);
  text-align:center;
}
/* ШИРИНА СОДЕРЖИМОГО — ОБЩАЯ ВЕЛИЧИНА САЙТА.
   Здесь стояло `var(--page-max, 1180px)` — имени `--page-max` в проекте НЕТ,
   и запасное число 1180 работало всегда. Ровно та же величина объявлена как
   `--content-max`: сменит владелец ширину — моя страница останется прежней,
   и разойдётся с остальными молча. */
.mf-author-hero-inner{max-width:var(--content-max);margin:0 auto}
.mf-author-avatar{
  width:96px;height:96px;margin:0 auto var(--space-4);
  border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-size:2rem;font-weight:var(--fw-title);
  background:rgba(255,255,255,.14);overflow:hidden;
  box-shadow:0 0 0 3px rgba(255,255,255,.25);
}
.mf-author-avatar img{width:100%;height:100%;object-fit:cover}
.mf-author-name{
  display:flex;align-items:center;justify-content:center;gap:var(--space-2);
  font-size:clamp(1.5rem, 4vw, 2.25rem);margin:0;
  /* Вес и строка названы: в профиле имя — абзац, на странице автора —
     заголовок, и без этого браузер давал им разный вес. */
  font-weight:var(--fw-title);line-height:1.15;
}
.mf-author-sub{opacity:.85;margin-top:var(--space-2)}
/* ТЕКСТ ШАПКИ — ЦВЕТА ШАПКИ (10.09, FLAT 1723). Общее `p{color:var(--muted)}`
   красило серым всё, что свёрстано абзацем: в профиле имя — абзац, и оно
   выходило серым по тёмной обложке, а на странице автора имя — заголовок, и
   там белое. Одна шапка — один цвет; тень держит его на светлых обложках. */
.mf-author-hero .mf-author-name,.mf-author-hero .mf-author-sub{color:inherit}
.mf-author-hero .mf-author-name{text-shadow:0 1px 14px rgba(0,0,0,.35)}
.mf-author-hero .mf-author-sub{text-shadow:0 1px 8px rgba(0,0,0,.45)}

/* Верх страницы автора — та же рамка, что рабочая область сайта: ширина
   содержимого и те же поля, поэтому шапка в ширину профильной. */
.mf-author-top{max-width:var(--wrap-max);margin:0 auto;padding:var(--space-6) var(--space-5) 0}
.mf-author-works{max-width:var(--wrap-max);margin:0 auto;padding:var(--space-5)}
/* Сетка сама решает число колонок по ширине: правил под каждый размер экрана
   не заводим — они разойдутся при первой правке одного из них. */
.mf-author-empty,.mf-author-more{text-align:center;color:var(--muted);padding:var(--space-5)}

/* Место под флажок в имени автора: без него строка дёргается, когда флаг
   приходит позже имени. */
.mf-flag-slot{display:inline-flex;align-items:center;min-height:1em}/* ЗНАК КЛАНА: того же роста, что флажок, и стоит следом за ним. Разный размер
   у двух соседних меток читается как разная важность{
  display:inline-block;width:1.45em;height:.95em;
  min-width:15px;min-height:10px;
  margin-left:4px;border-radius:3px;vertical-align:-.12em;
  box-shadow:var(--shadow-chip);
}

/* ПРАВКА ПО МЕСТУ: поле выглядит текстом, но отзывается на наведение — иначе
   человек не догадается, что его можно менять, и подсказка внизу останется
   единственным намёком. */
/* ПРАВКА ИМЕНИ: НАДПИСЬ И ПОЛЕ — ОДНО МЕСТО, ДВА СОСТОЯНИЯ.
   Правка идёт в настоящем поле ввода (см. profile-inline-edit): надпись
   принадлежит краске, и править её нельзя. Чтобы подмена не читалась как
   прыжок, поле наследует шрифт, вес и размер надписи, а отличается только
   чертой снизу — та же черта, что появляется у надписи при наведении. */
.mf-editable{cursor:text;border-bottom:1px dashed transparent;transition:border-color var(--dur-3)}
.mf-editable:hover,.mf-editable:focus-visible{border-bottom-color:var(--muted-soft);outline:none}
.mf-name-input{
  font:inherit;font-weight:var(--fw-title);color:var(--ink);
  width:100%;max-width:20ch;min-width:8ch;
  padding:0;margin:0;
  background:transparent;border:0;border-bottom:1px solid var(--accent);
  border-radius:0;outline:none;
  /* Каретка того же цвета, что черта: правка выглядит одним предметом, а не
     полем, вставленным в чужую строку. */
  caret-color:var(--accent);
}

/* ПРЕДПРОСМОТР ФОНА: место под картинку задано заранее, чтобы страница не
   прыгала, когда она загрузится. Пустое состояние показано штриховкой, а не
   пустотой: пустота читается как «не работает». */
input[type="range"]{padding:0;border:0;background:transparent}

/* ═══ ИНСТРУМЕНТЫ НАД РАМКОЙ ОПИСАНИЯ ════════════════════════════════════
   Пропорции и лица стояли во вкладках — человек должен был знать, что они
   там. Теперь они рядом с описанием, значками. Размеры и отступы — общая
   шкала сайта, своих чисел здесь нет. */
/* РЯД ИНСТРУМЕНТОВ СТОИТ НАД ПОЛЕМ ОПИСАНИЯ, А НЕ В ШАПКЕ СТРАНИЦЫ.
   Он был третьим предметом в голове секции (заголовок — ряд — вкладка), и
   выбранные вырезы висели посреди неё, ни к чему не прислонённые: владелец
   дважды назвал это сбитым положением. Место вырезов и пропорции — рядом с
   тем, что они меняют, то есть у поля описания.
   Переносятся как буквы: двух десятков вырезов одна строка не держит. */
.mf-prompt-tools{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3);margin-bottom:var(--space-3)}
/* ССЫЛКИ В ПОМОЩЬ — В РЯДУ ИНСТРУМЕНТОВ, СПРАВА (владелец, 28.09). Правила
   мира, цена и последствие выреза стояли тремя строками под полем и отнимали
   высоту у галереи; теперь они в помощи, а здесь — дорога к ним, на месте,
   которое ряд и так занимал. Высота касания — как у кнопок ряда. */
/* ПОДСТРОЧНОЕ МЕНЮ (владелец 29.09) — ОДИН ВИД НА ВСЕ МЕСТА: ссылки помощи у
   поля описания, «Удалить все» на удалённых, герои витрины. Мелкие пункты
   справа, прижатые к линии раздела сверху; выбранный — подчёркнут, число —
   мелким после имени. Пункты, рождённые скриптом, делает только subline.js.
   Касание: на мыши пункт низкий (прижат к линии), на пальце — не ниже пальца. */
.mf-subline{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:0 var(--space-4);margin:var(--space-1) 0 var(--space-3);margin-left:auto}
.mf-subline[hidden]{display:none}
.mf-subline-item{display:inline-flex;align-items:baseline;gap:var(--space-1);min-height:24px;padding:0;border:0;background:none;color:var(--muted);font:inherit;font-size:var(--small);text-decoration:underline;text-decoration-color:transparent;text-underline-offset:4px;cursor:pointer}
.mf-subline-item:hover{color:var(--ink);text-decoration-color:currentColor}
.mf-subline-item[aria-current="true"]{color:var(--ink);text-decoration-color:var(--accent);text-decoration-thickness:2px}
.mf-subline-item--danger{color:var(--danger-text)}
.mf-subline-item--danger:hover{color:var(--danger-text)}
.mf-subline-count{color:var(--muted-soft);font-size:var(--micro);text-decoration:none}
.mf-subline-note{color:var(--muted-soft);font-size:var(--small)}
/* Броски аспектов под полем описания (01.10): две полоски мелких пунктов, полоса прогресса под пунктом. */
.mf-aspects{display:flex;flex-direction:column;gap:var(--space-1);margin:var(--space-2) 0 var(--space-1)}
.mf-aspects-row{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-4)}
.mf-aspect{position:relative;display:inline-flex;align-items:center;min-height:28px;padding:0 0 4px;border:0;background:none;color:var(--muted);font:inherit;font-size:var(--small);cursor:pointer}
.mf-aspect:hover{color:var(--ink)}
.mf-aspect[aria-busy="true"]{color:var(--ink)}
.mf-aspect--scene{color:var(--accent)}
.mf-aspect--open{color:var(--ink)}
.mf-frame-views{display:inline-flex;align-items:center;gap:var(--space-1);color:var(--muted);font-size:var(--small)}
.mf-frame-views[hidden]{display:none}
.mf-frame-views svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8}
[data-faces-picked-row].is-off img{opacity:.45;filter:grayscale(1)}
.mf-faces-off{align-self:center;margin-left:var(--space-1);color:var(--tag-err);font-size:var(--small);white-space:nowrap}
button.mf-faces-off{background:none;border:0;padding:0;font:inherit;font-size:var(--small);text-decoration:underline;cursor:pointer}
.mf-pub-grid[aria-busy="true"]:empty{min-height:100vh}
.mf-aspect-sheet[hidden]{display:none}
.mf-aspect-sheet-box{width:min(620px,100%)}
.mf-aspect-sheet-title{margin:var(--space-2) 0 0;color:var(--muted);font-size:var(--small);font-weight:600;letter-spacing:.06em;text-transform:uppercase}
.mf-aspect-sheet .mf-aspects-row{gap:var(--space-2) var(--space-4)}
.mf-aspect-sheet .mf-aspect{font-size:inherit;color:var(--ink);padding:2px var(--space-2) 4px;border:1px solid transparent;border-radius:999px}
.mf-aspect-sheet .mf-aspect[aria-pressed="true"]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-strong)}
.mf-aspect-apply{align-self:flex-end;margin-top:var(--space-2)}
.mf-aspect--list>span:first-child{color:var(--ink)}
.mf-aspect:disabled{cursor:default;opacity:.45}
.mf-aspect[aria-busy="true"]:disabled{opacity:1}
/* ИДУЩИЙ ПУНКТ — КНОПКА В РАМКЕ, ВНУТРИ БЕЖИТ СВЕТ (владелец 07.10, вариант 3 вместо «● ждёт»).
 * Рамка — псевдоэлемент поверх полей: соседние пункты не сдвигаются. */
.mf-aspect[aria-busy="true"]{isolation:isolate}
.mf-aspect[aria-busy="true"]::after{content:"";position:absolute;left:calc(-1 * var(--space-2));right:calc(-1 * var(--space-2));top:50%;height:calc(1em + var(--space-3));transform:translateY(calc(-50% - 2px));z-index:-1;pointer-events:none;border:1px solid var(--accent);border-radius:var(--ui-pill);background:linear-gradient(90deg,transparent,var(--selection-bg),transparent) no-repeat;background-size:50% 100%;animation:mf-aspect-run 1.4s linear infinite}
@keyframes mf-aspect-run{0%{background-position:-60% 0}100%{background-position:160% 0}}
@media (prefers-reduced-motion:reduce){.mf-aspect[aria-busy="true"]::after{animation:none}}
/* ОКНО «ВЫРАЖЕНИЕ» (face-window.js; премиальный вид — владелец 19.10 15:45: «то, что надо улучшить до премиальности,
 * например окно эмоций»). Было: плотный ряд пилюль с лицами 24 px — лица не читались, подписи и сила колеса жили
 * своими формами, кость — эмодзи. Стало: лица — плитки одной сетки (лицо 44 px над подписью, подпись целиком в две
 * строки), вкладки — подчёркнутые, сила колеса — переключатель в строке раздела, выбор — рамка и метка акцентом,
 * лоток с «Добавить» стоит внизу всегда. На телефоне окно во весь экран, вкладки листаются. */
.mf-facewin{grid-template-columns:minmax(0,1fr)}
.mf-rights-box.mf-face-box{width:min(920px,100%);height:min(760px,92vh);overflow:hidden;display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-5)}
.mf-face-sub{margin:-6px 0 0;color:var(--muted);font-size:var(--small)}
/* Шапка, вкладки, поиск и лоток не сжимаются — листается только середина. */
.mf-face-box>*:not(.mf-face-body){flex:0 0 auto}
.mf-face-tabs{display:flex;gap:var(--space-5);border-bottom:var(--border);overflow-x:auto;scrollbar-width:none}
.mf-face-tab{position:relative;flex:0 0 auto;padding:var(--space-2) 0;border:0;background:none;color:var(--muted);font:inherit;font-size:var(--body);cursor:pointer;white-space:nowrap}
.mf-face-tab::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;border-radius:2px;background:transparent}
.mf-face-tab:hover{color:var(--ink)}
.mf-face-tab.is-on{color:var(--ink);font-weight:var(--fw-title)}
.mf-face-tab.is-on::after{background:var(--accent)}
.mf-face-tab-n{display:inline-block;min-width:18px;margin-left:6px;padding:0 5px;border-radius:9px;background:var(--accent);color:var(--on-gold);font-size:11px;font-weight:var(--fw-title);line-height:18px;text-align:center}
.mf-face-find{position:relative}
.mf-face-find svg{position:absolute;left:12px;top:50%;width:16px;height:16px;transform:translateY(-50%);color:var(--muted);pointer-events:none}
.mf-face-search{width:100%;min-height:40px;padding:0 var(--space-3) 0 36px;border:var(--border);border-radius:var(--ui-pill);background:var(--soft);color:var(--ink);font:inherit;font-size:var(--small)}
.mf-face-search:focus{outline:none;border-color:var(--accent)}
.mf-face-body{flex:1 1 auto;overflow:auto;display:flex;flex-direction:column;gap:var(--space-4);padding-right:2px;overscroll-behavior:contain}
.mf-face-hint{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin:0;color:var(--muted);font-size:var(--small)}
.mf-face-dice{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:0 var(--space-3);border:var(--border);border-radius:var(--ui-pill);background:none;color:var(--ink);font:inherit;font-size:var(--small);cursor:pointer}
.mf-face-dice svg{width:16px;height:16px}
.mf-face-dice:hover{border-color:var(--accent);color:var(--accent)}
.mf-face-group-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin:0 0 var(--space-2)}
.mf-face-group-title{margin:0;font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase;color:var(--muted);cursor:default}
details.mf-face-group>summary{cursor:pointer;margin-bottom:var(--space-2)}
/* Сила колеса — переключатель из трёх сегментов в строке раздела. */
.mf-face-levels{display:inline-flex;padding:2px;border:var(--border);border-radius:var(--ui-pill);background:var(--soft)}
.mf-face-level{min-height:28px;padding:0 var(--space-3);white-space:nowrap;border:0;border-radius:var(--ui-pill);background:none;color:var(--muted);font:inherit;font-size:var(--small);cursor:pointer}
.mf-face-level.is-on{background:var(--accent);color:var(--on-gold);font-weight:var(--fw-title)}
/* Плитки: одна сетка для всех разделов с лицами, подпись целиком (владелец 07.10: без обрезков и сирот). */
.mf-face-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:var(--space-2)}
.mf-face-grid--chips{display:flex;flex-wrap:wrap}
/* Колесо — ровно 8 лепестков: 4×2 без сироты (владелец 07.10), и на телефоне тоже — плитки ниже, а не столбик. */
.mf-face-grid--wheel{grid-template-columns:repeat(4,minmax(0,1fr))}
.mf-face-item{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:6px;min-width:0;padding:var(--space-3) var(--space-2) var(--space-2);border:1px solid transparent;border-radius:var(--ui-radius);background:var(--soft);color:var(--ink);font:inherit;font-size:var(--small);line-height:1.25;text-align:center;cursor:pointer;transition:border-color var(--dur-2),background var(--dur-2),transform var(--dur-2)}
.mf-face-item>span:last-child{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
.mf-face-grid{--face-icon:44px}
.mf-face-item svg{width:var(--face-icon);height:var(--face-icon);flex:0 0 var(--face-icon);color:var(--ink-soft);stroke-width:2.2;transition:color var(--dur-2)}
.mf-face-grid--chips .mf-face-item{flex-direction:row;padding:var(--space-1) var(--space-3);border-radius:var(--ui-pill);min-height:36px}
.mf-face-glyph{font-size:var(--h3);line-height:1}
.mf-face-item:hover,.mf-face-item:focus-visible{border-color:var(--line);background:var(--surface);outline:none}
.mf-face-item:hover svg,.mf-face-item:focus-visible svg{color:var(--ink)}
.mf-face-item.is-on{border-color:var(--accent);background:var(--accent-soft)}
.mf-face-item.is-on svg{color:var(--accent)}
/* Метка выбора в углу плитки: видно без цвета (рамка и галочка). */
.mf-face-item.is-on::after{content:"✓";position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%;background:var(--accent);color:var(--on-gold);font-size:11px;font-weight:var(--fw-title);line-height:18px;text-align:center}
.mf-face-grid--chips .mf-face-item.is-on::after{position:static;margin-left:2px}
.mf-face-item:disabled{opacity:.4;cursor:default}
.mf-face-empty{margin:0;color:var(--muted)}
.mf-face-tray{display:flex;align-items:center;gap:var(--space-3);margin:0 calc(-1 * var(--space-5)) calc(-1 * var(--space-5));padding:var(--space-3) var(--space-5);border-top:var(--border);background:var(--surface)}
.mf-face-picked{flex:1 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1);min-width:0}
.mf-face-chip{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:0 var(--space-3);border:1px solid var(--accent);border-radius:var(--ui-pill);background:var(--accent-soft);color:var(--ink);font:inherit;font-size:var(--small);cursor:pointer}
.mf-face-go{min-height:var(--tap);padding:0 var(--space-5);border:0;border-radius:var(--ui-pill);background:var(--accent);color:var(--on-gold);font:inherit;font-weight:var(--fw-title);cursor:pointer}
.mf-face-go:disabled{background:var(--soft);color:var(--muted);cursor:default}
/* Телефон: окно во весь экран, плитки уже, цели касания не меньше --tap (craft:phone-content). */
@media(max-width:640px){
  .mf-rights-box.mf-face-box{width:100%;height:100dvh;max-height:none;border-radius:0;padding:var(--space-4)}
  .mf-face-tray{margin:0 calc(-1 * var(--space-4)) calc(-1 * var(--space-4));padding:var(--space-3) var(--space-4)}
  .mf-face-grid{grid-template-columns:repeat(auto-fill,minmax(88px,1fr))}
  .mf-face-grid--wheel{grid-template-columns:repeat(4,minmax(0,1fr))}
  .mf-face-grid--wheel .mf-face-item{padding:var(--space-2) 2px}
  .mf-face-grid--wheel{--face-icon:36px}
  .mf-facewin{padding:0}
  .mf-face-group-head{flex-wrap:wrap}
  .mf-aspect,.mf-tape .mf-tape-btn,.mf-face-tab,.mf-face-level,.mf-face-chip,.mf-face-dice{min-height:var(--tap);min-width:var(--tap)}
}
.mf-aspects-foot{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-4);color:var(--muted);font-size:var(--small)}
/* МЕСТО (06.10 14:33): пункты — одной строкой в инструментах над полем (ряды — без своих коробок);
   ссылки помощи — под полем, слева от ленты шагов. */
/* Два ряда (человек / сцена), прижаты вправо, по центру высоты кнопок (владелец 06.10 15:08–15:10). */
.mf-prompt-tools>.mf-aspects{flex-direction:column;align-items:flex-end;align-self:center;gap:0;margin:0 0 0 auto;flex:1 1 320px}
.mf-prompt-tools>.mf-aspects>.mf-aspects-row{justify-content:flex-end;gap:0 var(--space-3)}
.mf-aspects-foot{margin-top:var(--space-1)}
/* ОДНА СТРОКА ДЕЙСТВИЯ (владелец 19.10: «компактнее по высоте»): ряд действий живёт в подстроке под полем —
 * слева помощь, справа шаги, «Сообщить» и «Создать». Было три яруса (подстрока, кнопка, флажок), стал один. */
.mf-aspects-foot>.site-generator-actions{order:2;margin:0;gap:var(--space-4)}
.mf-aspects-foot:not(:has(>.mf-tape))>.site-generator-actions{margin-left:auto}
/* ОДИН ГОЛОС В РЯДУ (владелец 19.10: «уродливый дизайн»): «Сообщить» — тихая строка как ссылки помощи, не заголовок
 * капителью (общее правило label давало капитель и нижний отступ — флажок висел выше ряда); флажок — квадрат, отмеченный — акцентом.
 * Кнопка в ряду — высотой касания, а не отдельного блока: ряд один, и высота его — по кнопке. */
.mf-aspects-foot:has(>.site-generator-actions){margin-top:var(--space-3)}
/* Высота — общая (--control, 20.10): своё «палец» здесь делало кнопку ниже такой же кнопки на других страницах. */
.mf-aspects-foot>.site-generator-actions [data-normalize],.mf-aspects-foot>.site-generator-actions [data-generate]{min-width:200px}
/* Слова о работе — своей строкой под рядом и только когда сказаны: пустой столбец не держит места. */
.mf-aspects-foot .site-generator-said{order:4;flex:1 1 100%;max-width:none;margin:0}
.mf-aspects-foot .site-generator-said:not(:has(>:not([hidden]))){display:none}
/* Телефон: помощь, шаги справа, «Сообщить» над кнопкой во всю ширину; ряд действий растворён в подстроке. */
@media(max-width:640px){.mf-aspects-foot>.site-generator-actions{display:contents}.mf-aspects-foot>.site-generator-actions>.site-button{order:3;flex:1 1 100%}}
/* ТЕЛЕФОН (08.10, ревизия крафта страницы генерации): пункты бросков — ровные таблетки слева во всю ширину,
 * а не текст с разными зазорами, прижатый вправо («Фантазия» сиротой в последней строке). */
@media(max-width:640px){
  .mf-prompt-tools>.mf-aspects{flex:1 1 100%;flex-direction:row;flex-wrap:wrap;gap:var(--space-1);margin:var(--space-2) 0 0}
  /* Два ряда (человек / сцена) на телефоне — один общий поток: иначе «Поза» сиротой в конце первого ряда. */
  .mf-prompt-tools>.mf-aspects>.mf-aspects-row{display:contents}
  .mf-prompt-tools .mf-aspect{justify-content:center;padding:0 var(--space-3);border:var(--border);border-radius:var(--ui-pill);background:var(--soft)}
  .mf-prompt-tools .mf-aspect[aria-busy="true"]::after{left:-1px;right:-1px}
  /* Вкладки раздела («Моя галерея · Опубликованные · Удалённые») — одной строкой, листаются пальцем. */
  .site-section>.site-head .site-local-menu{flex-wrap:nowrap;justify-content:flex-start;gap:var(--space-4);scrollbar-width:none}
  .site-section>.site-head .site-local-menu::-webkit-scrollbar{display:none}
}
.mf-tape{display:inline-flex;align-items:center;gap:var(--space-1);margin-inline-end:var(--space-2)}
.mf-tape-btn{min-width:28px;min-height:28px;border:0;background:none;color:var(--muted);font:inherit;cursor:pointer}
.mf-tape-btn:hover:not(:disabled){color:var(--ink)}
.mf-tape-btn:disabled{opacity:.35;cursor:default}
/* ФОКУС — акцентный край и мягкое кольцо: видно, куда печатаешь. */
.mf-lex-wrap .mf-lex-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--field-ring)}
/* ФРИЗ (владелец 03.10): перевод или бросок пишут в поле — текст серее, фон
 * поднят к карточке, край тише, правка закрыта. Не «сломано», а «на паузе». */
.mf-field-frozen{background:var(--field-frozen-bg)}
.mf-field-frozen .mf-lex-mirror{color:var(--field-frozen-ink)}
.mf-field-frozen .mf-lex-input,.mf-field-frozen .mf-lex-input:focus{border-color:var(--field-frozen-line);box-shadow:none;cursor:not-allowed}
/* Без подсветки словаря поле рисует текст само. */
textarea.mf-field-frozen-self{color:var(--field-frozen-ink);background:var(--field-frozen-bg);border-color:var(--field-frozen-line);cursor:not-allowed}
/* ПОЛОСА ХОДА — одна, внизу поля, на перевод и бросок (владелец 03.10). */
.mf-field-bar{--mf-progress:0;position:absolute;left:1px;right:1px;bottom:1px;z-index:2;height:3px;border-radius:0 0 var(--ui-radius) var(--ui-radius);transform-origin:left center;transform:scaleX(var(--mf-progress));background:var(--accent);transition:transform .12s linear;pointer-events:none}
.mf-field-bar[data-done="fail"]{background:var(--icon-danger)}
.mf-field-bar[data-done="ok"]{background:var(--icon-ok)}
/* Затор очереди 27B (18.10): полоса полной ширины, косая штриховка, без хода — «стоим», а не «идём». */
/* Владелец 19.10 13:08: «оранжевые тромбы один за другим, не быстро»; 13:45: «длинные, 3–4 на всю длину с
 * пропорциональными промежутками» — четыре тромба на ширину поля, промежуток пропорционален (64/36), шаг 2,4 с: видно, что очередь живая, но не обещан ход. */
.mf-field-bar[data-jam]{height:5px;transition:none;background:linear-gradient(90deg,var(--accent) 0 64%,transparent 64% 100%);background-size:25% 100%;animation:mf-jam-crawl 2.4s linear infinite}
/* Плитка — четверть ширины; сдвиг на одну плитку = 33.333% (позиция в % отсчитывается от остатка 75%). */
@keyframes mf-jam-crawl{from{background-position:0 0}to{background-position:33.333% 0}}
@media(prefers-reduced-motion:reduce){.mf-field-bar[data-jam]{animation:none}}
.mf-field-host{position:relative}
/* Удаление работы: карточка гаснет в миг клика, до ответа службы (03.10). */
.mf-frame.is-leaving,[data-img].is-leaving{opacity:.3;transform:scale(.97);pointer-events:none;transition:opacity var(--dur-2),transform var(--dur-2)}
.mf-aspects-row{position:relative}
a.mf-subline-item{text-decoration-color:currentColor}
/* Под линией раздела меню встаёт вплотную: у шапки раздела свой нижний
   отступ (space-5), и без этой поправки пункты висели бы в 28 точках от линии. */
.site-section>.site-head+.mf-subline{margin-top:calc(var(--space-1) - var(--space-5))}
/* В ряду инструментов над полем описания — к верху ряда, справа. */
.mf-prompt-tools>.mf-subline{align-self:flex-start;margin:0 0 0 auto}
/* Ссылки помощи под полем, в строке ленты шагов (06.10 14:33). */
.mf-aspects-foot>.mf-subline{margin:0;justify-content:flex-start}
@media (pointer:coarse){.mf-subline-item{min-height:var(--tap)}}
.mf-tool{
  display:inline-flex;align-items:center;gap:var(--space-2);
  padding:6px 10px;border:var(--border);border-radius:var(--ui-radius);
  background:var(--surface);color:inherit;
}
.mf-tool:hover{border-color:var(--accent)}
/* Своя пропорция (метка <ar:W:H>, 06.10) — значок и рамка цветом акцента: видно, что это не кнопка круга. */
.mf-tool--custom{color:var(--accent);border-color:var(--accent)}
.mf-tool-icon{display:block;background:currentColor;border-radius:2px;opacity:.75}
.mf-tool-label{font-size:var(--micro);letter-spacing:var(--caps)}

/* КАПСУЛА ЛИЦА (владелец 19.10 13:47): лицо в строке одно, на два вопроса. Левая половина — КАКОЕ (нарисованное
 * выражение, окно эмоций), правая — ЧЬЁ (портрет в рамке, окно лиц); между ними тонкая черта. Рамка общая,
 * наведение красит только свою половину — видно, что это две двери одной комнаты. Мир без эмоций — одна половина. */
.mf-face-pill{position:relative;align-items:stretch;gap:0;padding:0;border-radius:var(--ui-pill);transition:border-color var(--dur-2)}
.mf-face-pill:hover,.mf-face-pill:focus-within{border-color:var(--accent)}
.mf-face-pill .mf-face-half{position:relative;min-width:var(--tap);padding:5px 10px;justify-content:center;border:0;border-radius:var(--ui-pill);background:none;color:inherit;opacity:.82;transition:color var(--dur-2),opacity var(--dur-2)}
.mf-face-pill .mf-face-half:hover,.mf-face-pill .mf-face-half:focus-visible{color:var(--accent);opacity:1;outline:none}
.mf-face-pill .mf-face-half:disabled{opacity:.4;cursor:progress}
.mf-face-pill--two .mf-face-half+.mf-face-half::before{content:"";position:absolute;left:0;top:25%;bottom:25%;width:1px;background:var(--line)}
.mf-face-half svg{width:22px;height:22px;display:block}
.mf-face-half[data-aspect] svg{stroke-width:2.6}
.mf-face-pill .mf-tool-count{top:-6px;right:-6px}

/* Тело и кадр (R1346): счёт сдвинутых регуляторов — уголком у кнопки. */
.mf-tool[data-body-open]{position:relative}
/* «Тело и кадр» без прокрутки (владелец 07.10): 18 ползунков — два столбца, строки плотнее. */
/* «ТЕЛО И КАДР» (владелец 08.10 20:22: «не цифрами — словами; дизайнерски, компактно, премиально»).
   Группы карточками; строка: имя слева, значение словом и сила точками справа, тонкая дорожка с заливкой
   от «Авто» до бегунка и отметкой нейтрали, слова концов под ней. Тронутая строка — золотом. */
.mf-rights-box.mf-body-box{width:min(940px,100%);max-height:min(92dvh,860px);overflow:auto}
.mf-body-list{columns:2 360px;column-gap:var(--space-3)}
.mf-body-group{break-inside:avoid;margin:0 0 var(--space-2);border:var(--border);border-radius:calc(var(--ui-radius) + 4px);padding:var(--space-2) var(--space-4) 2px;background:color-mix(in srgb,var(--surface) 70%,transparent);display:grid;gap:0;align-content:start}
.mf-body-group-title{margin:0;font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.mf-body-row{display:grid;grid-template-columns:1fr;gap:0;padding:3px 0 1px;border-radius:var(--ui-radius);cursor:default}
.mf-body-track{display:grid;grid-template-columns:minmax(52px,auto) minmax(0,1fr) minmax(52px,auto);align-items:center;gap:var(--space-2)}
.mf-body-end{font-size:11px;line-height:1.1;color:var(--muted-soft);white-space:nowrap}
.mf-body-end--right{text-align:right}
.mf-body-row+.mf-body-row{border-top:1px dashed color-mix(in srgb,var(--line) 70%,transparent)}
.mf-body-top{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2);min-height:18px}
.mf-body-name{font-size:var(--small);font-weight:500;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mf-body-value{display:inline-flex;align-items:baseline;gap:6px;font-size:var(--small);color:var(--muted);white-space:nowrap}
.mf-body-row[data-state="set"] .mf-body-value{color:var(--accent-strong);font-weight:600}
.mf-body-dots{font-size:8px;letter-spacing:2px;color:var(--accent)}
.mf-body-row input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:var(--body-hit);margin:2px 0 0;padding:0;border:0;background:transparent;cursor:pointer;
  --track:color-mix(in srgb,var(--line) 85%,transparent);--from:50%;--to:50%;--zero:50%}
.mf-body{--body-hit:20px;--body-thumb:16px;--body-thumb-shadow:0 1px 4px rgba(0,0,0,.18)}
.mf-body-row input[type=range]::-webkit-slider-runnable-track{height:4px;border-radius:4px;
  background:linear-gradient(90deg,transparent calc(var(--zero) - 1px),var(--muted) calc(var(--zero) - 1px),var(--muted) calc(var(--zero) + 1px),transparent calc(var(--zero) + 1px)) ,linear-gradient(90deg,var(--track) var(--from),var(--accent) var(--from),var(--accent) var(--to),var(--track) var(--to))}
.mf-body-row input[type=range]::-moz-range-track{height:4px;border-radius:4px;background:linear-gradient(90deg,var(--track) var(--from),var(--accent) var(--from),var(--accent) var(--to),var(--track) var(--to))}
.mf-body-row input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:var(--body-thumb);height:var(--body-thumb);margin-top:calc(2px - var(--body-thumb) / 2);border-radius:50%;background:var(--surface);border:2px solid var(--muted);box-shadow:var(--body-thumb-shadow);transition:transform var(--dur-2),border-color var(--dur-2)}
.mf-body-row input[type=range]::-moz-range-thumb{width:var(--body-thumb);height:var(--body-thumb);border-radius:50%;background:var(--surface);border:2px solid var(--muted);box-shadow:var(--body-thumb-shadow)}
.mf-body-row[data-state="set"] input[type=range]::-webkit-slider-thumb{border-color:var(--accent);background:var(--accent)}
.mf-body-row[data-state="set"] input[type=range]::-moz-range-thumb{border-color:var(--accent);background:var(--accent)}
.mf-body-row input[type=range]:active::-webkit-slider-thumb,.mf-body-row input[type=range]:focus-visible::-webkit-slider-thumb{transform:scale(1.15)}
.mf-body-row input[type=range]:focus-visible{outline:none}
.mf-body-row:has(input:focus-visible) .mf-body-name{color:var(--accent-strong)}
.mf-body-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin-top:var(--space-2);position:sticky;bottom:calc(-1 * var(--space-4));padding:var(--space-2) 0;background:var(--surface);z-index:1}
.mf-body-apply{border:1px solid var(--accent);border-radius:var(--ui-radius);background:var(--accent);color:var(--on-gold);padding:var(--space-2) var(--space-5);min-height:44px;margin-left:auto;font-weight:600;letter-spacing:.04em}
.mf-body-apply:disabled{opacity:.45;cursor:not-allowed}
.mf-body-said--over{color:#B3261E}
.mf-body-reset{border:var(--border);border-radius:var(--ui-radius);background:transparent;color:var(--ink);padding:var(--space-2) var(--space-4);min-height:44px}
@media(max-width:720px){.mf-rights-box.mf-body-box{padding:var(--space-3);gap:var(--space-2);max-height:92dvh}.mf-body-list{columns:1}.mf-body-track{grid-template-columns:minmax(44px,auto) minmax(0,1fr) minmax(44px,auto)}.mf-body-group{padding:var(--space-2) var(--space-3)}.mf-body{--body-hit:30px;--body-thumb:22px}}
.mf-tool-count{
  position:absolute;top:-4px;right:-4px;min-width:18px;height:18px;
  border-radius:9px;background:var(--accent);color:var(--on-gold);
  font-size:.7rem;line-height:18px;text-align:center;
}

/* «ПОД КАПОТОМ» (09.10): кнопка-переключатель над полем и подстрочник вставки под ним. Включено — рамка
   акцентом; счёт вставок уголком, как у лиц. Подстрочник — тихая строка действий, не всплывающее окно. */
.mf-tool--hood{position:relative;font-size:var(--small)}
.mf-tool--hood.is-on{color:var(--accent);border-color:var(--accent)}
.mf-tool--hood.is-busy{opacity:.6;cursor:progress}
.mf-hood-panel{margin-top:var(--space-2);padding:var(--space-2) var(--space-3);border:var(--border);border-radius:var(--ui-radius);font-size:var(--small)}
.mf-hood-panel-head,.mf-hood-panel-empty{margin:0 0 var(--space-1);color:var(--muted)}
.mf-hood-panel-note{margin:0 0 var(--space-1);color:var(--warn)}
.mf-chips{display:flex;flex-wrap:wrap;gap:var(--space-1)}
.mf-chip{min-height:28px;padding:0 var(--space-2);border:var(--border);border-radius:999px;background:var(--tag-miss-bg);color:var(--tag-miss-fg);font-family:var(--font-mono);font-size:.85em;cursor:pointer}
.mf-chip:hover,.mf-chip:focus-visible{color:var(--ink);border-color:currentColor}
.mf-chip.is-mirror{background:none;border-style:dashed;opacity:.7}
.mf-chip.is-off{text-decoration:line-through}
.mf-chip.is-gen{border-color:var(--accent);color:var(--ink);font-weight:700}
.mf-chip.is-error{text-decoration:underline wavy var(--tag-err);text-underline-offset:3px}
.mf-hood-adds{margin-top:var(--space-1);padding:var(--space-2) var(--space-3);border-radius:var(--ui-radius-sm);background:var(--tag-miss-bg);color:var(--muted);font-size:var(--small);line-height:1.45}
.mf-hood-adds p{margin:0}
.mf-hood-adds b{font-weight:600;color:var(--tag-miss-fg)}
.mf-hood-adds-head{color:var(--tag-miss-fg)}
.mf-tagpick{position:fixed;z-index:var(--layer-menu);width:min(340px,calc(100vw - 32px));max-height:min(420px,70vh);display:flex;flex-direction:column;
  background:var(--surface);color:var(--ink);border:var(--border);border-radius:var(--ui-radius);box-shadow:0 12px 32px rgba(0,0,0,.28);font-size:var(--small);overflow:hidden}
.mf-tagpick-head{display:flex;align-items:baseline;gap:var(--space-2);padding:var(--space-2) var(--space-3) 0}
.mf-tagpick-kind{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:.75em}
.mf-tagpick-code{font-family:var(--font-mono);color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-tagpick-why{margin:var(--space-1) var(--space-3) 0;color:var(--muted);line-height:1.4}
.mf-tagpick-why.is-error{color:var(--tag-err)}
.mf-tagpick-filter{margin:var(--space-2) var(--space-3) 0;min-height:32px;padding:0 var(--space-2);border:var(--border);border-radius:var(--ui-radius-sm);background:var(--field-bg);color:inherit;font:inherit}
.mf-tagpick-list{list-style:none;margin:var(--space-1) 0 0;padding:0 var(--space-1);overflow:auto;flex:1 1 auto}
.mf-tagpick-sub{padding:var(--space-2) var(--space-2) 2px;color:var(--muted);font-size:.75em;text-transform:uppercase;letter-spacing:.06em}
.mf-tagpick-item{display:flex;align-items:center;gap:var(--space-2);width:100%;min-height:32px;padding:0 var(--space-2);border:0;border-radius:var(--ui-radius-sm);background:none;color:inherit;font:inherit;text-align:left;cursor:pointer}
.mf-tagpick-item code{font-family:var(--font-mono);flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-tagpick-item span{color:var(--muted);white-space:nowrap}
.mf-tagpick-item:has(.mf-tagpick-info){flex-wrap:wrap;row-gap:0;padding-block:var(--space-1)}
.mf-tagpick-info{flex:1 0 100%;color:var(--muted);font-size:.8em;line-height:1.3;white-space:normal}
.mf-tagpick-item[aria-selected="true"],.mf-tagpick-item:hover{background:var(--muted-surface)}
.mf-tagpick-item.is-current code::after{content:" ✓";color:var(--muted)}
.mf-tagpick-weight{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3) 0}
.mf-tagpick-weight input[type=range]{flex:1 1 auto;accent-color:var(--accent)}
.mf-tagpick-weight output,.mf-tagpick-seed input{font-family:var(--font-mono);min-width:4ch;text-align:right}
.mf-tagpick-seed{display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-3) 0}
.mf-tagpick-seed input{flex:1 1 auto;min-height:32px;padding:0 var(--space-2);border:var(--border);border-radius:var(--ui-radius-sm);background:var(--field-bg);color:inherit;text-align:left}
.mf-tagpick-acts{display:flex;flex-wrap:wrap;gap:var(--space-1);padding:var(--space-2) var(--space-2);margin-top:var(--space-1);border-top:var(--border)}
.mf-tagpick-act{min-height:32px;padding:0 var(--space-2);border:0;border-radius:var(--ui-radius-sm);background:none;color:var(--ink-soft);font:inherit;cursor:pointer}
.mf-tagpick-act:hover,.mf-tagpick-act:focus-visible{background:var(--muted-surface);color:var(--ink)}
.mf-tagpick-act.is-danger{margin-left:auto;color:var(--warn)}
.mf-tagpick-empty{padding:var(--space-2);color:var(--muted)}

/* ═══ ОКНО ЛИЦ ═══════════════════════════════════════════════════════════
   Сеткой, как просмотрщик: контролы одного размера, положение — сеткой, а не
   отступами. */
.mf-faces{position:fixed;inset:0;z-index:var(--layer-viewer);display:grid;place-items:center;background:rgba(12,14,12,.86);padding:var(--space-4)}
body.mf-faces-open{overflow:hidden}
/* ОКНО ШИРЕ (владелец, 15.09): лиц у человека десятки, и в семьсот двадцать
   точек они лезли в четыре кружка на ряд. Тысяча сто — это восемь-десять
   кружков в ряду при том же кегле. */
/* ТРИ ЗОНЫ, И ПРОКРУЧИВАЕТСЯ ТОЛЬКО СРЕДНЯЯ.
   Прокручивалась вся коробка: список рос, и вместе с ним уезжали за край
   заголовок, кнопка и сами выбранные вырезы — владелец назвал это дважды.
   Теперь шапка и подвал стоят на месте всегда, а лента живёт между ними. */
.mf-faces-box{
  /* ОКНО РОСТОМ ПО СОДЕРЖИМОМУ, А НЕ В ПОЛЭКРАНА ВСЕГДА.
     Высота была задана жёстко, и при трёх лицах половина окна оставалась
     пустой: человек видел большую пустоту и искал в ней то, чего нет (снимки
     владельца 17.09). Теперь окно ровно по содержимому и упирается в потолок
     экрана, когда содержимого много. Подвал при этом остаётся прижатым книзу:
     средняя строка сетки тянется. */
  /* ПОЛЯ ОКНА НЕ ДОЛЖНЫ СЪЕДАТЬ РЯД ВЫРЕЗОВ. При двух разделах по две строки
     содержимое упиралось в потолок экрана на пару десятков точек — и окно
     заводило прокрутку там, где всё почти помещалось. Внешние поля и зазоры
     на шаг меньше: они про воздух, а не про содержимое. */
  /* ОКНО ВСЕГДА В ЭКРАНЕ (2250, снимок владельца 09.10: низ окна уходил под край). Строка сетки minmax(0,auto)
     при одном max-height не сжималась — подвал выталкивался за экран. Колонка: шапка и подвал своего роста,
     середина сжимается и листается внутри; высота — по видимой области (dvh: без полос браузера телефона). */
  width:min(1100px,100%);max-height:min(92vh,940px);max-height:min(92dvh,940px);
  display:flex;flex-direction:column;
  background:var(--surface);border-radius:var(--frame-radius);
  padding:var(--space-4);gap:var(--space-3);overflow:hidden;
}
.mf-faces-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-4);flex:0 0 auto}
.mf-faces-box > .mf-faces-body{flex:1 1 auto;min-height:0}
.mf-faces-box > .mf-faces-foot{flex:0 0 auto}
.mf-faces-head h2{margin:0}
.mf-faces-close{width:36px;height:36px;border-radius:50%;font-size:1.3rem;border:var(--border)}
/* СТРОКА НА ФОТО, кружки внутри неё — как буквы: переносятся сами и
   заполняют ширину. Правил под каждую ширину экрана не заводим. */
.mf-faces-grid{display:flex;flex-direction:column;gap:var(--space-4)}
.mf-face-row{display:flex;flex-direction:column;gap:var(--space-2)}
/* Подпись раздела: имя обычным весом, счёт тише и правее. Ни заглавных, ни
   разделителей — читается как строка, а не как ярлык. */
.mf-face-row-note{display:flex;align-items:baseline;gap:var(--space-2);font-size:var(--small);color:var(--muted)}
.mf-face-row-note b{color:var(--ink);font-weight:var(--fw-title)}
.mf-face-row + .mf-face-row{padding-top:var(--space-4);border-top:var(--border)}
/* ДВЕ СТРОКИ ВИДНЫ ЦЕЛИКОМ, ДАЛЬШЕ — ПРОКРУТКА ВНУТРИ РАЗДЕЛА (владелец, 17.09).
   Раздел с тремя десятками вырезов раньше выталкивал соседний за край окна:
   лица занимали всё, а тела приходилось искать прокруткой всего окна. Теперь
   у каждого раздела своя высота в две строки, и оба видны всегда.
   Высота считается от самой ячейки: две ячейки плюс зазор между ними — так
   вторая строка видна ПОЛНОСТЬЮ, а третья явно подрезана и зовёт прокрутить. */
.mf-face-shelf{
  display:flex;flex-wrap:wrap;gap:var(--space-3);align-items:flex-end;
  /* ВЫСОТА СЧИТАЕТ И ПОЛЕ ВОКРУГ. Без него полоса прокрутки появлялась там,
     где всё помещалось: содержимое было выше предела ровно на эти поля — одна
     строка лиц и две строки тел уже «не влезали» (снимок владельца 17.09). */
  max-height:calc(var(--cutout-face) * 2 + var(--space-3) + var(--cutout-pad) * 2 + var(--cutout-fit));
  overflow-y:auto;overflow-x:hidden;
  padding:var(--cutout-pad);margin:calc(var(--cutout-pad) * -1);
}
/* ВЫРЕЗ УЗНАЮТ ГЛАЗОМ, ЗНАЧИТ ОН ДОЛЖЕН БЫТЬ ВИДЕН. Кружок в 64 точки
   показывал лицо размером с ноготь; 88 — тот размер, на котором своё лицо
   отличаешь от похожего, не приглядываясь. */
.mf-face{
  width:var(--cutout-face);height:var(--cutout-face);border-radius:50%;overflow:hidden;
  border:2px solid transparent;padding:0;background:var(--muted-surface);
}
/* ТЕЛО — КРУПНЫЙ КВАДРАТ, И ВЫРЕЗ В НЁМ НЕ РЕЖЕТСЯ.
   Квадрат держит ровный ряд рядом с кружками лиц, а фигура в него вписывается
   целиком: обрезка по квадрату отняла бы ноги и позу — ровно то, ради чего
   тело и берут, а лицо в таком огрызке неотличимо от лица из соседнего ряда.
   Поля по бокам заливаются тем же тоном, что и подложка ячейки: пустое поле
   вокруг силуэта читается как воздух кадра, а не как дырка. */

/* ТЕЛА ИДУТ ЛЕНТОЙ ПОД ЛИЦАМИ И НЕ РАСТУТ ВНИЗ.
   Крупные квадраты, перенесённые по строкам, съедали окно: три тела — и лица
   уехали за край. Лента прокручивается вбок, занимает одну строку при любом
   числе тел и оставляет лицам их место. */
/* ТЕЛА — ТЕ ЖЕ ДВЕ СТРОКИ, только ячейка крупнее. Лента вбок снята: она
   прятала тела за правым краем, а прокрутка вбок мышью неудобна и незаметна.
   Считаем от своего размера ячейки. */
.mf-face-row--figure .mf-face-shelf{
  max-height:calc(var(--cutout-figure) * 2 + var(--space-3) + var(--cutout-pad) * 2 + var(--cutout-fit));
}
.mf-face-row--figure .mf-face-cell{flex:0 0 auto}
.mf-face:hover{border-color:var(--accent)}
.mf-face img{width:100%;height:100%;object-fit:cover}

/* Ячейка лица: кружок и крестик. Выбранное обведено рамкой — это единственный
   способ показать выбор на круглой картинке, не закрывая её саму. */
.mf-face-cell{position:relative;width:var(--cutout-face);height:var(--cutout-face)}
/* ВЫБРАННОЕ ОТЛИЧАЕТСЯ НЕ ОТТЕНКОМ РАМКИ, А ТОЛЩИНОЙ И ЗНАКОМ. Тонкая обводка
   терялась среди десятка кружков — при беглом взгляде человек не понимал, что
   отмечено. Обводка втрое толще, а знак снимает последние сомнения. */
.mf-face-cell--on .mf-face{border-width:3px;border-color:var(--accent);box-shadow:0 0 0 4px rgba(46,70,34,.18)}
.mf-face-cell--on::after{
  content:'✓';position:absolute;left:-4px;bottom:-2px;
  width:22px;height:22px;border-radius:50%;
  background:var(--accent);color:var(--on-gold);font-size:.75rem;line-height:22px;text-align:center;
}
.mf-face-del{
  position:absolute;top:-4px;right:-4px;width:20px;height:20px;border-radius:50%;
  background:var(--surface);border:var(--border);line-height:1;font-size:.9rem;
}
.mf-face-del:hover{border-color:#B3261E;color:#B3261E}

/* ── ТЕЛО: КРУПНЫЙ КВАДРАТ ─────────────────────────────────────────────────
   Квадрат держит ровный ряд рядом с кружками лиц, а фигура вписывается в него
   целиком: обрезка отняла бы ноги и позу — то, ради чего тело и берут. Поля по
   бокам в тон подложки читаются как воздух кадра, а не как дырка.

   ЧАСТНЫЙ СЛУЧАЙ СТОИТ ПОСЛЕ ОБЩЕГО. Эти правила лежали ВЫШЕ `.mf-face-cell`,
   и при равной силе селекторов побеждал не смысл, а порядок строк: ячейка тела
   получала размер лица (88), картинка оставалась 120 — квадраты вылезали за
   свои места, налезали друг на друга и выглядели обрезанными. Именно это
   владелец увидел как «зазоров нет и квадраты не квадратные» (16.09). */
.mf-face-cell--figure{width:var(--cutout-figure);height:var(--cutout-figure)}
.mf-face--figure{width:var(--cutout-figure);height:var(--cutout-figure);border-radius:var(--ui-radius)}
.mf-face--figure img{object-fit:contain;background:var(--muted-surface)}
/* Крестик остаётся КРУЖКОМ и на квадрате — он про действие, а не про форму
   выреза; у угла квадрата он прижимается внутрь, иначе висит в пустоте. */
.mf-face-cell--figure .mf-face-del{top:2px;right:2px}
/* Галочка выбора у квадрата тоже уходит внутрь: у кружка её угол приходится на
   пустое место рядом с окружностью, у квадрата — на сам вырез. */
.mf-face-cell--figure.mf-face-cell--on::after{left:2px;bottom:2px}
/* Вид выреза в полосе выбранных описан НИЖЕ, после `.mf-picked`: здесь стоял
   его дубль, и жив он был только потому, что ниже лежал второй такой же. Два
   объявления одного факта опасны именно этим — одно чинит то, что ломает
   другое, и оба выглядят нужными. */
/* Тело окна прокручивается ТОЛЬКО когда разделы не поместились по-настоящему:
   у каждого раздела своя высота, и на доли точки тело реагировать не должно. */
.mf-faces-body{min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;gap:var(--space-3);padding-bottom:var(--cutout-fit)}
/* ЛЮДИ В ОКНЕ ЛИЦ (03.10, макет «Окно лиц — люди и узнавание»). Слева люди,
   справа вырезы выбранного; на узком экране список людей встаёт лентой сверху. */
.mf-people{display:flex;gap:var(--space-4);min-height:0}
.mf-people-list{display:flex;flex-direction:column;gap:var(--space-1);width:260px;flex:0 0 260px;border-right:var(--border);padding-right:var(--space-3);min-height:0;overflow-y:auto}
/* С ЛЮДЬМИ ОКНО ВЫСОТОЙ В ЭКРАН, А ПРОКРУТКА — У КАЖДОЙ КОЛОНКИ СВОЯ (владелец, 04.10:
   «поправь скроллинг»). Прокручивалось всё окно, а внутри разделов — ещё и полки по
   две строки: две прокрутки одна в другой. Теперь полки растут, колонка прокручивается. */
.mf-faces-box--people{height:min(92vh,940px);grid-template-rows:auto minmax(0,1fr) auto}
.mf-faces-box--people .mf-faces-body{overflow:hidden;padding-bottom:0}
.mf-faces-box--people .mf-people{flex:1 1 auto}
.mf-faces-box--people .mf-person{overflow-y:auto;padding-right:var(--space-2)}
.mf-people--on .mf-face-shelf{max-height:none;overflow:visible}
.mf-people-list[hidden]{display:none}
.mf-person{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column;gap:var(--space-3)}
.mf-person-item{display:flex;align-items:center;gap:var(--space-3);width:100%;text-align:left;padding:var(--space-2);border:1px solid transparent;border-radius:var(--ui-radius);background:transparent;color:var(--ink);min-height:56px}
.mf-person-item:hover{background:var(--muted-surface)}
.mf-person-item--on{border-color:var(--accent);background:var(--muted-surface)}
.mf-person-item--drop{border-style:dashed;border-color:var(--accent)}
.mf-person-row + .mf-person-item--unknown{margin-top:var(--space-2);border-top:var(--border);border-radius:0}
/* СТЕРЕТЬ ЧЕЛОВЕКА (06.10): × справа у строки; первое нажатие — «Стереть?» красным, второе стирает. */
.mf-person-row{position:relative;display:flex}
.mf-person-row .mf-person-item{padding-right:40px}
.mf-person-erase{position:absolute;right:4px;top:50%;transform:translateY(-50%);min-width:32px;height:32px;border:0;border-radius:16px;background:transparent;color:var(--muted);font-size:1.1rem;opacity:.55}
.mf-person-row:hover .mf-person-erase,.mf-person-erase:focus{opacity:1}
.mf-person-erase:hover{background:var(--muted-surface);color:#B3261E}
.mf-person-erase--armed{opacity:1;background:#B3261E;color:#fff;font-size:var(--small);padding:0 var(--space-2)}
.mf-person-erase--armed:hover{background:#8C1D18;color:#fff}
/* Корзина видна, пока тащат человека; за краем окна тоже стирает. */
.mf-people-trash{margin-top:var(--space-2);padding:var(--space-3);border:1px dashed #B3261E;border-radius:var(--ui-radius);color:#B3261E;text-align:center;font-size:var(--small)}
.mf-people-trash[hidden]{display:none}
.mf-people-trash--over{background:#B3261E;color:#fff}
/* Слабый вырез (сервер): мало похож на остальные лица человека — тусклый, «Взять» его не берёт. */
.mf-face-cell--weak{opacity:.45}
.mf-face-cell--weak:hover{opacity:.8}
.mf-person-weak{border:1px solid #B3261E;border-radius:var(--ui-radius);padding:var(--space-2) var(--space-3);background:transparent;color:#B3261E;min-height:40px}
.mf-person-avatar{position:relative;width:44px;height:44px;border-radius:50%;overflow:hidden;flex:0 0 44px;background:var(--muted-surface);display:grid;place-items:center}
/* Лицо — в центре круга (2250: в сетке с place-items картинка брала свой рост, а не круг, и лицо съезжало). */
.mf-person-avatar img{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;object-position:50% 50%}
.mf-person-avatar--unknown{border:1px dashed var(--muted);color:var(--muted);background:transparent}
.mf-person-text{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
.mf-person-name{font-weight:var(--fw-title);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-person-count{font-size:var(--small);color:var(--muted)}
.mf-person-picked{min-width:22px;height:22px;padding:0 var(--space-1);border-radius:11px;background:var(--accent);color:var(--on-gold);font-size:.75rem;display:grid;place-items:center}
.mf-person-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);position:sticky;top:0;z-index:1;background:var(--surface);padding-bottom:var(--space-2);border-bottom:var(--border)}
.mf-person-head[hidden]{display:none}
.mf-person-title{margin:0;font-size:1.35rem;font-weight:var(--fw-title);background:none;border:0;padding:0;color:var(--ink);cursor:text}
button.mf-person-title:hover{text-decoration:underline dotted}
.mf-person-note{flex:1 1 220px;margin:0;font-size:var(--small);color:var(--muted)}
.mf-person-note--wide{flex-basis:100%}
.mf-person-rename{font-size:1.2rem;padding:var(--space-1) var(--space-2);border:1px solid var(--accent);border-radius:var(--ui-radius);background:var(--surface);color:var(--ink);min-width:0;width:16ch}
.mf-person-take{border:1px solid var(--accent);border-radius:var(--ui-radius);padding:var(--space-2) var(--space-3);background:transparent;color:var(--accent);min-height:40px}
.mf-person-merge select{min-height:40px;border:var(--border);border-radius:var(--ui-radius);background:var(--surface);color:var(--ink);padding:0 var(--space-2)}
.mf-cut-menu{position:fixed;z-index:calc(var(--layer-viewer) + 1);min-width:200px;max-height:60vh;overflow:auto;background:var(--surface);border:var(--border);border-radius:var(--ui-radius);padding:var(--space-1);box-shadow:0 8px 24px rgba(0,0,0,.35);display:flex;flex-direction:column}
.mf-cut-menu-note{font-size:var(--small);color:var(--muted);padding:var(--space-1) var(--space-2)}
.mf-cut-menu-item{text-align:left;background:none;border:0;border-radius:4px;padding:var(--space-2);color:var(--ink);min-height:40px}
.mf-cut-menu-item:hover,.mf-cut-menu-item:focus{background:var(--muted-surface)}
.mf-cut-menu-item--new{color:var(--accent);font-weight:var(--fw-title)}
.mf-cut-menu-item--del{color:#B3261E;border-top:var(--border);border-radius:0}
@media(max-width:720px){
  .mf-people{flex-direction:column}
  .mf-people-list{flex-direction:row;width:auto;flex:0 0 auto;overflow-x:auto;border-right:0;border-bottom:var(--border);padding:0 0 var(--space-2)}
  .mf-person-item{width:auto;flex:0 0 auto}
  .mf-person-row{flex:0 0 auto}
  .mf-person-erase{opacity:1}
  .mf-person-row + .mf-person-item--unknown{margin-top:0;border-top:0}
  .mf-person-count{display:none}
}
/* ВЫБРАННОЕ НЕ УЕЗЖАЕТ ВМЕСТЕ С ЛЕНТОЙ. Полка выбранных прилипает к верху
   прокрутки: на десятом фото человек всё ещё видит, с чем он работает. */
.mf-chosen{
  position:sticky;top:0;z-index:1;display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--space-3);padding:var(--space-3) 0;background:var(--surface);
  border-bottom:var(--border);
}
.mf-chosen[hidden]{display:none}
.mf-chosen-note{font-size:var(--small);color:var(--muted)}
.mf-chosen-drop{border:0;background:transparent;color:var(--muted);font-size:var(--small);text-decoration:underline;padding:0}
.mf-chosen-drop:hover{color:var(--ink)}
.mf-faces-none{margin:var(--space-5) 0}
/* ЗОНА ЗАГРУЗКИ — ПОЛОСА В ПОДВАЛЕ, РЯДОМ С КНОПКОЙ.
   Прямоугольник сбоку отнимал у ленты треть ширины и всё равно уезжал вверх
   при прокрутке. Полоса стоит на месте, занимает одну строку и принимает
   перетаскивание на всю свою длину. */
/* ХОД РАБОТЫ НА САМОЙ ЗОНЕ: полоса по её нижнему краю. Человек смотрит туда,
   куда бросил файл, а не на строку внизу окна. Бегущая — когда срока не знаем
   (ждём службу); ровная доля — когда идёт запись вырезов. */

.mf-faces-drop--busy{border-style:solid;border-color:var(--accent);color:var(--ink);cursor:progress}
.mf-drop-bar{
  position:absolute;left:0;bottom:0;height:3px;width:0;
  background:var(--accent);transition:width .2s ease;
}
.mf-drop-bar--run{width:35%;animation:mf-drop-run 1.1s linear infinite}
@keyframes mf-drop-run{from{transform:translateX(-100%)}to{transform:translateX(300%)}}
.mf-faces-drop{
  /* Зона занимает всю ширину, которую не забрала кнопка. Высота — у подвала,
     одним именем с кнопкой. */
  flex:1 1 auto;align-self:stretch;
  display:flex;align-items:center;justify-content:center;text-align:center;
  border:1px dashed var(--muted-soft);border-radius:var(--ui-radius);
  color:var(--muted);cursor:pointer;padding:var(--space-3) var(--space-4);
  font-size:var(--small);position:relative;overflow:hidden;
}
.mf-faces-drop--over{border-color:var(--accent);color:var(--ink)}
/* Подвал стоит на месте всегда: зона загрузки слева, «Применить» справа.
   Кнопка не уезжает с прокруткой — она нужна ровно в тот миг, когда человек
   долистал до нужного выреза. Оба предмета одной высоты: ряд из двух разных
   высот читается как случайный. */
.mf-faces-foot{
  display:flex;flex-wrap:wrap;align-items:stretch;gap:var(--space-3) var(--space-4);
  padding-top:var(--space-4);border-top:var(--border);
}
/* ВЫСОТА ДЕЙСТВИЯ ОБЪЯВЛЕНА В НАБОРЕ — `--action-height`, 58 точек, по ней
   стоят «Создать изображение» и «Улучшить описание». Я написал рядом своё
   число 48 и получил ряд из двух разных высот: кнопка знала имя, зона — моё
   число (владелец назвал это дважды, 16 и 17.09).
   Теперь зона берёт ту же высоту тем же именем, а не тянется к соседу: у
   растяжения слишком много условий, чтобы на него полагаться. */
/* ВЫСОТА РЯДА ОБЪЯВЛЕНА, А НЕ ВЫВЕДЕНА.
   Оба предмета брали `min-height` и дальше тянулись друг к другу растяжением.
   Вывод зависит от отступов, кегля, рамки и округления — у зоны свои поля, у
   кнопки свои, и они трижды расходились на несколько точек (владелец назвал
   это трижды: 16 и 17.09). Объявленная высота не зависит ни от чего. */
.mf-faces-foot .mf-faces-drop,
.mf-faces-foot .site-button{height:var(--action-height);min-height:var(--action-height)}
/* Слова согласия — строкой ПОД рядом, во всю ширину и тише подписи: человек
   должен их видеть, но решение принимает по зоне и кнопке, а высоту ряда эта
   строка менять не вправе. */
/* ДИАЛОГ ПРАВ НА ФОТО — поверх окна лиц, до разбора снимка (владелец, 25.09). */
.mf-rights{position:fixed;inset:0;z-index:calc(var(--layer-viewer) + 1);display:grid;place-items:center;background:rgba(8,12,10,.74);padding:var(--space-4)}
.mf-rights-box{width:min(560px,100%);max-height:92vh;overflow:auto;background:var(--surface);border:var(--border);border-radius:var(--frame-radius);padding:var(--space-5);display:flex;flex-direction:column;gap:var(--space-3)}
.mf-rights-box h2{margin:0}
.mf-rights-lead,.mf-rights-note{margin:0;color:var(--muted);font-size:var(--small);line-height:1.45}
.mf-rights-item{display:flex;align-items:flex-start;gap:var(--space-3);line-height:1.4;cursor:pointer;text-transform:none;letter-spacing:normal;font-weight:normal;color:var(--ink)}
.mf-rights-item input{width:18px;height:18px;padding:0;margin:.15em 0 0;flex:0 0 18px;accent-color:var(--accent)}
.mf-rights-item span{flex:1 1 auto;min-width:0;font-size:var(--small)}
.mf-rights-actions{display:flex;justify-content:flex-end;gap:var(--space-3);flex-wrap:wrap}
.mf-rights-actions .site-button:disabled{opacity:.45;cursor:not-allowed}
.mf-drop-consent{flex:1 0 100%;color:var(--muted-soft);font-size:var(--micro);line-height:1.3;text-align:center}
.mf-faces-foot .site-button{flex:0 0 auto}
/* ВЫБРАННЫЕ ВЫРЕЗЫ СТОЯТ У КНОПКИ ЛИЦ — там же, где их выбирали. Их бывает
   несколько, поэтому это полоса, а не одна картинка поверх кнопки: та умела
   показать ровно один. Переносятся как буквы — второй строкой, если не
   влезли. */
/* Полоса выбранных стоит вплотную к своей кнопке и переносится вместе с ней:
   она принадлежит кнопке лиц, а не ряду вообще. */
.mf-picked-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);max-width:100%}
/* ОДНА ВЕЩЬ — ОДНА ФОРМА. Тело рисовалось квадратом в окне (120), высокой
   карточкой на полке выбранных (38×54) и квадратом в полосе у кнопки (38):
   три формы одного предмета, из них две — наследство отменённого решения.
   Владелец назвал форму 16.09: тело — квадрат. Меняется только размер. */
.mf-picked{
  width:var(--tool-round);height:var(--tool-round);padding:0;overflow:hidden;
  border:2px solid var(--accent);background:var(--muted-surface);
}
.mf-picked img{width:100%;height:100%;object-fit:cover;display:block}
/* ФОРМА НАЗЫВАЕТ ВИД: лицо — кружком, фигура человека — квадратом (владелец,
   16.09). Употребляются они одинаково, и разный показ — единственное, чем они
   различаются на экране. */
/* Вырез не показался: знак вместо пустоты. Пустой кружок человек читает как
   «вырез пропал», хотя пропала только картинка. */
.mf-cutout-failed{
  display:flex;align-items:center;justify-content:center;
  border-color:#B3261E;color:#B3261E;font-weight:var(--fw-ui);
}
.mf-picked--face{border-radius:50%}
.mf-picked--figure{border-radius:var(--ui-radius)}
/* Тело вписывается целиком и в малом размере: обрезка по квадрату в 38 точек
   оставила бы от фигуры пояс. */
.mf-picked--figure img{object-fit:contain;background:var(--muted-surface)}
.mf-picked:hover{border-color:#B3261E}
/* На полке в окне кружок крупнее, чем в строке инструментов: там он стоит
   рядом с кнопкой и равняется по ней, здесь — сам по себе. Частное после
   общего, иначе общее его затрёт. */
.mf-chosen .mf-picked{width:44px;height:44px}
/* Зона выключена: распознавание на узле не поднято. Тон приглушённый, а не
   тревожный — это не поломка человека и не его вина. */
.mf-faces-drop[data-off="yes"]{border-color:var(--line-strong);color:var(--muted);cursor:not-allowed;background:var(--surface-tint)}/* ═══ СЕТКА ГАЛЕРЕИ: ОДНА НА ВЕСЬ САЙТ ═══════════════════════════════════
   Ячейки ОДНОГО размера. Ячейка по соотношению самого кадра честнее, но ряд
   сетки тянется по самой высокой карточке: одна вертикальная работа оставляла
   в ряду дыры на весь экран (28.08, витрина). Ровный ритм не врёт — полная
   работа открывается нажатием. */
/* ═══ СЕТКА ГАЛЕРЕИ: КОЛОНКАМИ, А НЕ РЯДАМИ ══════════════════════════════
   Работы разной формы. В сетке рядами строка тянется по самой высокой
   карточке, и вертикальный кадр оставляет дыры на весь экран (28.08, дважды).
   Ровнять всех под квадрат тоже нельзя — карточка теряет свою форму и часть
   изображения.
   Колонки решают это без расчётов: карточки текут сверху вниз, каждая своей
   высоты, дыр не остаётся. Это встроенная возможность браузера, а не наша
   раскладка на скриптах. */
/* СВОЕЙ СЕТКИ ГАЛЕРЕИ БОЛЬШЕ НЕТ.
 *
 * Здесь была раскладка колонками, заведённая для витрины. У сайта УЖЕ есть
 * сетка работ — `.mf-pub-grid` в `frames.css`: четыре колонки, расчёт высоты
 * по пропорциям кадра, общий отступ, контейнерные запросы. Витрина выходила
 * узкой и с другим ритмом (29.08, снимок владельца рядом с рабочей галереей).
 *
 * Второй ответ на тот же вопрос расходится с первым молча: правка одной сетки
 * не доходит до другой. Витрина и страница автора берут готовую.
 */



/* ПРАВИЛА СТРАНИЦ КЛАНА И СТРАНЫ СНЯТЫ вместе с самими страницами (28.08:
   клан и страна — сортировки витрины, а не продукты). Стиль, которому нечего
   красить, — обещание того, чего нет: следующий решит, что страница есть, и
   станет искать её. */

/* Знак страны в шапке её страницы: того же роста, что знак клана — обе метки
   одного веса, и разный размер читался бы как разная важность. */

/* Клан на доске витрины — не ссылка на страницу (её нет), а переключатель
   сортировки. Выглядит ссылкой{
  color:inherit;text-decoration:underline;text-underline-offset:2px;
  background:none;border:0;padding:0;font:inherit;cursor:pointer;
}

/* МЕСТО ПОД РАБОТУ, ПОКА ОНА ИДЁТ. Пустая сетка читается как «ничего нет» или
   «сломалось»; серое место говорит: галерея пришла, работы идут. Дыхание
   медленное — быстрое мигание торопит там, где торопиться нечем. */
.mf-waiting{
  width:100%;
  aspect-ratio:3 / 4;
  border-radius:var(--frame-radius);
  background:var(--muted-surface);
  animation:mf-waiting-breath 1.8s ease-in-out infinite;
  margin-bottom:var(--space-3);
  break-inside:avoid;
}
@keyframes mf-waiting-breath{
  0%,100%{opacity:.55}
  50%{opacity:.85}
}
/* Кому движение мешает — его нет: место остаётся, дыхание пропадает. */
@media(prefers-reduced-motion:reduce){
  .mf-waiting{animation:none}
}

/* ═══ ДВА МЕНЮ ОТБОРА НА ВИТРИНЕ ═════════════════════════════════════════
   Период и клан — РАЗНЫЕ вопросы, и человек задаёт их независимо. Две строки,
   а не одна: свалив их вместе, мы заставили бы выбирать одно вместо другого.

   Меню, а не список: в галерее выбор меняют часто и подряд, и каждое
   переключение должно стоить одного нажатия, а не двух. Вид взят у главного
   меню сайта — переучиваться человеку не приходится. */
/* Меню витрины: строки одной ширины, каждая прижата вправо своим содержимым.
 * `align-items:stretch` вместо `flex-end` — строки занимают ширину обёртки, и
 * пустого места справа не остаётся. */
/* Обёртка складывает меню в столбец; ПРИЖАТИЕ ЗДЕСЬ НЕ ПОВТОРЯЕТСЯ — им
   владеет правило шапки выше. Второе такое же правило было бы третьим местом,
   где решается одно. */
/* ОБЁРТКА ЗАНИМАЕТ ВСЮ СВОБОДНУЮ ШИРИНУ ШАПКИ.
 *
 * Без этого она сжималась по содержимому: прижимать меню было НЕ К ЧЕМУ —
 * строка кланов и так занимала всю обёртку, и «вправо» ничего не меняло.
 * Владелец возвращался с этим трижды (03.09).
 *
 * `flex:1 1 auto` даёт обёртке остаток строки после заголовка; внутри неё
 * правило шапки прижимает оба меню к правому краю. */
/* Герои и кланы витрины с 29.09 — подстрочное меню под линией (.mf-subline):
 * перенос строк и прижатие вправо — у него, число работ — .mf-subline-count. */

/* СПИСОК ПЕРСОНАЖЕЙ В ПОМОЩИ. Пример описания читают глазами и берут целиком,
   поэтому он набран моноширинным и переносится по словам, а не режется. */
/* КАРТОЧКА — СТОЛБИК С ОДНИМ ШАГОМ.
 *
 * Отступы между именем, описанием, кнопкой и подписью задавались каждым куском
 * вида по-своему: у кнопки был свой верхний отступ, у пояснения — свои поля и
 * своя черта. Карточки с набором стиля выходили выше и разделены иначе, чем
 * карточки без него (снимок владельца 09.09).
 *
 * Один столбик, один `gap` — и любое число частей внутри даёт одинаковый ритм.
 * Ни одна часть внутри своих отступов больше не назначает. */
/* ═══ СТРОКИ ПОМОЩИ: ОДИН ВИД НА ВЕСЬ РАЗДЕЛ ══════════════════════════════
 *
 * Правила письма и персонажи — одно и то же по устройству: заголовок виден
 * всегда, содержимое под свёрткой, пример применяется кнопкой-значком прямо в
 * строке. Поэтому и стиль один (владелец, 15.09): две похожие, но разные
 * таблицы стилей разошлись бы при первой же правке.
 *
 * ПЕРСОНАЖИ В ПОМОЩИ: СТРОКА НА ГЕРОЯ ═════════════════════════════════════
 *
 * Героев шестьдесят один. Раскрытые описания давали простыню, по которой не
 * найти нужного (владелец, 14.09). Строка держит имя, ключ набора и кнопку
 * применения; описание раскрывается по щелчку и закрывается обратно.
 *
 * ЦВЕТОМ СКАЗАНО ОДНО: есть ли обученный набор. Оттенки близки НАМЕРЕННО —
 * это подсказка, а не деление списка надвое; кричащая разница превратила бы
 * список в две таблицы. */
.mf-help-character,
.mf-help-row{
  margin:0;
  padding:0;
  border-bottom:var(--border);
}
.mf-help-character:last-child,
.mf-help-row:last-child{border-bottom:0}
.mf-help-character > *,
.mf-help-row > *{margin:0}

/* Строка правила — такая же, как строка героя; черта слева у неё нейтральная:
   цвет здесь ничего не сообщает, все правила равны между собой. */
.mf-help-row > .mf-help-row-head{border-left-color:var(--line)}
.mf-help-row[open] > .mf-help-row-head{background:var(--surface-tint)}
.mf-help-row-body{padding:0 var(--space-3) var(--space-3) var(--space-4);color:var(--muted)}
.mf-help-row-body > * + *{margin-top:var(--space-3)}
.mf-help-row-body code{overflow-wrap:anywhere}

.mf-help-character-head,
.mf-help-row-head{
  display:flex;align-items:center;gap:var(--space-3);
  padding:var(--space-3) var(--space-3) var(--space-3) var(--space-4);
  cursor:pointer;
  list-style:none;
  border-left:3px solid transparent;
  /* Своя строка не выше кнопки: ради этого список и сжимали. */
  min-height:0;
}
.mf-help-character-head::-webkit-details-marker,
.mf-help-row-head::-webkit-details-marker{display:none}
.mf-help-character-head:hover,
.mf-help-row-head:hover{background:var(--surface-tint)}
.mf-help-character[data-trained="yes"] > .mf-help-character-head{border-left-color:var(--accent)}
.mf-help-character[data-trained="yes"][open] > .mf-help-character-head{background:var(--accent-soft)}
.mf-help-character[data-trained="announced"] > .mf-help-character-head{border-left-color:var(--warn);border-left-style:dashed}
.mf-help-character[data-trained="announced"][open] > .mf-help-character-head{background:var(--surface-tint)}
.mf-help-character[data-trained="no"] > .mf-help-character-head{border-left-color:var(--line-strong)}
.mf-help-character[data-trained="no"][open] > .mf-help-character-head{background:var(--surface-tint)}
.mf-help-character[data-trained="yes"] > .mf-help-character-head > b{color:var(--ink)}
.mf-help-character[data-trained="no"] > .mf-help-character-head > b{color:var(--muted)}
.mf-help-character-head > b{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* У правила заголовок длиннее имени героя: переносим, а не режем многоточием
   — обрезанное правило перестаёт быть правилом. */
.mf-help-row-head > b{flex:1 1 auto;min-width:0}

/* Ключ набора — мелкой меткой, не кнопкой: он сообщает, а не зовёт нажать. */
.mf-help-character-key{
  flex:0 0 auto;
  font-size:var(--small);
  color:var(--muted);
  opacity:.85;
}

/* Кнопка применения со значок величиной: взять пример можно, не раскрывая
   описания, и места в строке она почти не занимает. */
.mf-help-character-page,
.mf-help-character-apply,
.mf-help-row-apply{
  flex:0 0 auto;
  display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;
  border:var(--border);border-radius:50%;
  color:var(--ink);text-decoration:none;
  font-size:var(--small);line-height:1;
}
.mf-help-character-page:hover,
.mf-help-character-apply:hover,
.mf-help-row-apply:hover{background:var(--accent);border-color:var(--accent);color:var(--surface)}

/* Описание — длинная строка без переносов по природе. Даёт горизонтальную
   прокрутку всей странице, если не переносить: рвём по словам, а слишком
   длинное слово — по букве. */
.mf-help-character-prompt{
  display:block;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.5;
  padding:0 var(--space-3) var(--space-3) var(--space-4);
  color:var(--muted);
}
.mf-help-character .site-row-note{padding:0 var(--space-3) var(--space-3) var(--space-4)}
/* Кнопка примера не назначает себе ни показа, ни отступов: показ у неё свой
   (`inline-flex`), а расстояние до соседей задаёт шаг столбика выше. */



/* ═══ ПРОФИЛЬ = СТРАНИЦА АВТОРА, ТОЛЬКО ПРАВИТСЯ ═══════════════════════════
 *
 * Профиль был отдельной вёрсткой: свой кружок, своя строка имени, свои
 * отступы. Он и расходился со страницей автора — а делается всё РАДИ НЕЁ
 * (владелец, 10.09). Свой квадратный кружок вместо круга был следствием того
 * же: правило скругления жило в старой шапке профиля и умерло вместе с ней.
 *
 * Теперь шапка профиля — ТЕ ЖЕ классы, что у страницы автора
 * (`mf-author-hero`, `mf-author-avatar`, `mf-author-name`, `mf-author-sub`).
 * Разойтись им больше нечем: вид у них один на двоих. Здесь остаётся только
 * то, чего на публичной странице нет и быть не может, — правка.
 */
/* КОРОБКА ШАПКИ — ОДНА НА ОБЕ СТРАНИЦЫ (1724, слово владельца 10.09): карточка
   в ширину содержимого сайта, с его скруглением. Публичная шапка была во всю
   ширину окна, и обложка, кадрированная в профиле, ложилась на неё с обрезкой. */
.mf-hero-card{padding:0;overflow:hidden}
.mf-hero-card .mf-author-hero{border-radius:0}
/* Обложки нет — под шапкой общее полотно: пустая обложка это обычный вид, а
   не поломка. Ставит и снимает картинку общий хозяин (`MagichkaAuthorHero`). */

/* ПРАВКА ИМЕНИ НЕ ДВИГАЕТ НИ ОДНОГО СОСЕДА.
 *
 * Поле ввода было отдельной строкой с собственным шрифтом: при нажатии имя
 * пропадало, флаг падал вниз, подсказка исчезала — на снимке владельца видно,
 * как всё прыгает. Поле стоит В ТОЙ ЖЕ строке и наследует шрифт, цвет и
 * выравнивание имени; отличается только чертой снизу. */
/* Имя и поле — ОДНА ЯЧЕЙКА. Размер задаёт имя; поле ложится поверх и потому
   ничего не двигает. Прячется не разметка, а видимость. */
.mf-name-slot{position:relative;display:inline-block}
.mf-name-slot.is-editing .mf-editable{visibility:hidden}
.mf-profile-hero .mf-name-input{
  position:absolute;inset:0;width:100%;
  font:inherit;color:inherit;text-align:center;
  background:transparent;border:0;border-bottom:1px solid rgba(255,255,255,.55);
  border-radius:0;padding:0;outline:none;caret-color:var(--on-dark);
}
.mf-profile-hero .mf-editable{border-bottom:1px dashed transparent}
.mf-profile-hero .mf-editable:hover{border-bottom-color:rgba(255,255,255,.45)}

/* Ссылка на свою страницу — в голове страницы, а не в шапке: шапка профиля
   обязана выглядеть ровно как публичная, где такой кнопки нет. */
.mf-head-actions{margin:var(--space-4) 0 0}

/* Ряд равных карточек: пустых половин на странице больше нет. */
/* Профиль — две карточки в ряд (владелец 29.09: «по два блока, не три»); на телефоне — одна. */
.mf-profile-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
@media(max-width:720px){.mf-profile-grid{grid-template-columns:1fr}}
.mf-profile-grid .site-card{display:flex}
.mf-profile-grid .site-card-body{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-3);width:100%}
/* ОДНА ШИРИНА ПОЛЕЙ В КАРТОЧКАХ ПРОФИЛЯ (20.10, владелец: «размеры плавают»): карточка жмёт детей к их содержимому,
   и ширина поля шла от длины подсказки или самого длинного пункта списка. Поля и списки — во всю карточку, не шире
   --field-width; кнопки — по надписи. */
.mf-profile-grid .site-card-body>:is(.site-profile-country,.mf-password-form){align-self:stretch;max-width:var(--field-width)}
/* Текст согласия — во всю ширину карточки: иначе колонка тела сжимает его по содержимому. */
.mf-profile-grid .mf-consent-terms{align-self:stretch}
.mf-profile-balance{margin:0;font-size:var(--h2);font-weight:var(--fw-title);line-height:1.1}
.mf-profile-balance b{font-weight:inherit}


/* ═══ СТОЛБИК РАЗДЕЛА ═════════════════════════════════════════════════════
 *
 * Шаг МЕЖДУ секциями объявлен один на сайт, а внутри секции ритма не было
 * вовсе: расстояние между соседними карточками давало то, что каждая из них
 * принесла с собой. На профиле из-за этого поплыли все отступы сразу — карточки
 * стояли то вплотную, то с двойным зазором (владелец, 10.09).
 *
 * Столбик задаёт ОДИН шаг, тот же, что между колонками сетки. Части внутри
 * своих отступов не назначают. */
.site-stack{display:flex;flex-direction:column;gap:var(--gap)}
.site-stack > *{margin:0}


/* ═══ ПРАВКА КАРТИНОК ШАПКИ: КАРАНДАШ → ПАНЕЛЬ → КАДР НА МЕСТЕ (FLAT 1723) ═══
 *
 * Слово владельца 10.09: один значок правки — карандаш; по нему — источник
 * картинки (вставка, файл, камера); картинка встаёт прямо в шапку, таскается и
 * масштабируется; клик — зафиксировано. Окна в пол-экрана больше нет. */

/* КАРАНДАШ — ОДИН НА ОБЕ КАРТИНКИ. Светлое стекло поверх любой обложки,
   виден всегда: правку не ищут наведением. */
.mf-pencil{
  position:absolute;z-index:2;width:34px;height:34px;padding:0;border:0;
  display:grid;place-items:center;border-radius:var(--ui-pill);cursor:pointer;
  color:var(--accent-strong);background:rgba(255,255,255,.92);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  box-shadow:0 2px 10px rgba(12,18,14,.28),0 0 0 1px rgba(255,255,255,.6) inset;
  transition:transform var(--dur-3) ease,box-shadow var(--dur-3) ease,background var(--dur-3) ease;
}
.mf-pencil svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.mf-pencil:hover{transform:translateY(-1px);background:#fff;box-shadow:0 6px 18px rgba(12,18,14,.32),0 0 0 1px rgba(255,255,255,.8) inset}
.mf-pencil:focus-visible{outline:none;box-shadow:0 0 0 3px var(--accent),0 6px 18px rgba(12,18,14,.32)}
.mf-pencil--cover{top:var(--space-4);right:var(--space-4)}
.mf-pencil--avatar{right:-6px;bottom:-4px;width:30px;height:30px}
/* Кружок режет содержимое по кругу, поэтому карандаш стоит рядом, в общей ячейке. */
.mf-avatar-slot{position:relative;width:96px;height:96px;margin:0 auto var(--space-4)}
.mf-avatar-slot .mf-author-avatar{margin:0}
/* Пока картинку кадрируют или отправляют, карандаши не мешают. */
[data-framing] .mf-pencil,[data-framing]~.mf-pencil,.mf-profile-hero[data-framing] .mf-pencil{visibility:hidden}
[data-sending]{opacity:.6;transition:opacity var(--dur-3) ease}

/* ПАНЕЛЬ ИСТОЧНИКА — У КАРАНДАША, А НЕ ПОСЕРЕДИНЕ ЭКРАНА. */
.mf-src{
  position:fixed;z-index:var(--layer-top);width:min(328px,calc(100vw - 24px));
  padding:var(--space-4);border-radius:var(--frame-radius);
  background:var(--surface);color:var(--ink);
  box-shadow:0 18px 50px rgba(12,18,14,.28),0 0 0 1px rgba(12,18,14,.06);
  animation:mf-src-in .16s ease-out;
}
@keyframes mf-src-in{from{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:none}}
.mf-src.is-busy{pointer-events:none;opacity:.7}
.mf-src-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-3)}
.mf-src-title{font-weight:var(--fw-title);font-size:var(--body);letter-spacing:.01em}
.mf-src svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
.mf-src-close{border:0;background:transparent;color:var(--muted);width:30px;height:30px;border-radius:var(--ui-pill);display:grid;place-items:center;cursor:pointer}
.mf-src-close:hover{background:var(--muted-surface);color:var(--ink)}
.mf-src-close span{display:none}
.mf-src-drop{
  display:flex;flex-direction:column;align-items:center;gap:var(--space-1);
  padding:var(--space-5) var(--space-4);border-radius:12px;cursor:pointer;text-align:center;
  border:1.5px dashed var(--muted-soft);background:var(--surface-tint);color:var(--ink);
  transition:border-color var(--dur-3) ease,background var(--dur-3) ease;
}
.mf-src-drop svg{width:28px;height:28px;color:var(--accent);margin-bottom:var(--space-1)}
.mf-src-drop strong{font-weight:var(--fw-title);font-size:var(--body)}
.mf-src-drop small{color:var(--muted);font-size:var(--small)}
.mf-src-drop:hover,.mf-src-drop:focus-visible,.mf-src-drop.is-over{outline:none;border-color:var(--accent);background:var(--accent-soft)}
.mf-src-row{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2);margin-top:var(--space-3)}
.mf-src-camera .mf-src-row{grid-template-columns:1fr 1fr}
.mf-src-btn{
  display:flex;flex-direction:column;align-items:center;gap:var(--space-1);
  padding:var(--space-3) var(--space-2);border-radius:10px;cursor:pointer;
  border:var(--border);background:var(--surface);color:var(--ink);font:inherit;font-size:var(--small);
  transition:border-color var(--dur-3) ease,background var(--dur-3) ease,transform var(--dur-3) ease;
}
.mf-src-btn:hover{border-color:var(--accent);background:var(--accent-soft)}
.mf-src-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--accent)}
.mf-src-btn--primary{background:var(--accent-strong);border-color:var(--accent-strong);color:var(--on-dark)}
.mf-src-btn--primary:hover{background:var(--accent-dark);border-color:var(--accent-dark)}
.mf-src-link{
  display:flex;align-items:center;justify-content:center;gap:var(--space-2);width:100%;
  margin-top:var(--space-3);padding:var(--space-2);border:0;border-radius:10px;cursor:pointer;
  background:transparent;color:var(--accent-strong);font:inherit;font-size:var(--small);
}
.mf-src-link:hover{background:var(--muted-surface)}
.mf-src-camera video{display:block;width:100%;border-radius:12px;background:#000;aspect-ratio:4/3;object-fit:cover}
.mf-src-error{margin:var(--space-2) 0 0;min-height:0;color:var(--danger-text);font-size:var(--small)}
.mf-src-error:empty{display:none}

/* КАДР НА МЕСТЕ. Рамка — сам узел страницы; за рамкой картинка видна
   полупрозрачной, чтобы было видно, что обрежется. */
.mf-frm{position:absolute;z-index:var(--layer-top)}
.mf-frm-ghost{
  position:absolute;left:0;top:0;max-width:none;opacity:.55;pointer-events:none;
  transform-origin:0 0;filter:saturate(.8);
}
.mf-frm-view{
  position:absolute;inset:0;overflow:hidden;cursor:grab;touch-action:none;outline:none;
  border-radius:inherit;box-shadow:0 0 0 2px #fff,0 0 0 9999px rgba(12,18,14,.35);
}
.mf-frm-view.is-circle{border-radius:50%}
.mf-frm-view.is-dragging{cursor:grabbing}
.mf-frm-view:focus-visible{box-shadow:0 0 0 2px #fff,0 0 0 5px rgba(255,255,255,.35),0 0 0 9999px rgba(12,18,14,.35)}
.mf-frm-img{position:absolute;left:0;top:0;max-width:none;transform-origin:0 0;user-select:none;-webkit-user-drag:none}
.mf-frm-bar{
  position:absolute;left:50%;top:calc(100% + var(--space-3));transform:translateX(-50%);
  --frm-range:120px;
  display:flex;align-items:center;gap:var(--space-2);padding:6px 6px 6px 10px;white-space:nowrap;
  border-radius:var(--ui-pill);background:rgba(20,26,20,.9);color:var(--on-dark);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  box-shadow:0 10px 30px rgba(12,18,14,.35);
}
.mf-frm-zoom{width:28px;height:28px;border:0;border-radius:var(--ui-pill);background:rgba(255,255,255,.12);color:inherit;font-size:18px;line-height:1;cursor:pointer}
.mf-frm-zoom:hover{background:rgba(255,255,255,.22)}
.mf-frm-range{width:var(--frm-range);accent-color:var(--accent)}
.mf-frm-btn{height:32px;padding:0 var(--space-4);border:0;border-radius:var(--ui-pill);cursor:pointer;font:inherit;font-size:var(--small);font-weight:var(--fw-title);background:transparent;color:inherit}
.mf-frm-btn:hover{background:rgba(255,255,255,.12)}
.mf-frm-btn--primary{background:var(--accent);color:var(--on-gold)}
.mf-frm-btn--primary:hover{filter:brightness(.92)}
.mf-frm-zoom:focus-visible,.mf-frm-btn:focus-visible{outline:none;box-shadow:0 0 0 2px #fff}
.mf-frm-hint{
  position:absolute;left:50%;bottom:calc(100% + var(--space-3));transform:translateX(-50%);
  margin:0;white-space:nowrap;font-size:var(--small);color:var(--on-dark);
  text-shadow:0 1px 3px rgba(0,0,0,.6);
}
/* Для обложки панель встаёт внутрь рамки у нижнего края: под шапкой — чужие
   карточки, и панель накрыла бы их. */
.mf-frm-view:not(.is-circle)~.mf-frm-bar{top:auto;bottom:var(--space-4)}
.mf-frm-view:not(.is-circle)~.mf-frm-hint{bottom:auto;top:var(--space-4)}
/* Узкий экран: панель кадра укладывается в ширину шапки, подсказка
   переносится, а не уходит за край. */
@media(max-width:640px){
  .mf-frm-bar{--frm-range:72px;gap:var(--space-1);padding:var(--space-1) var(--space-1) var(--space-1) 6px}
  .mf-frm-btn{padding:0 var(--space-3)}
  .mf-frm-hint{white-space:normal;text-align:center;width:max-content;max-width:calc(100vw - 32px)}
}

/* ═══ УВЕДОМЛЕНИЕ ОБ ОТКРЫТОМ ТЕСТИРОВАНИИ (FLAT 1726, раскладка 1728) ═════
 * Окно проекта: общее затемнение `[data-modal]`, карточка сайта. Раз в день;
 * закрывается только подтверждением.
 *
 * БЕЗ ПРОКРУТКИ (слово владельца 11.09). На широком экране пункты и правовой
 * блок стоят рядом — высота почти вдвое меньше. Не помещается и так (низкий
 * ноутбук, телефон) — окно само сворачивает правовой блок в строку
 * «Развернуть» (`site-notice.js`, `fit`). */
html.mf-notice-lock{overflow:hidden}
.mf-notice-veil{z-index:var(--layer-top)}
[data-modal]>.site-card.mf-notice{
  width:min(1080px,100%);max-height:calc(100vh - 2 * var(--space-5));max-height:calc(100dvh - 2 * var(--space-5));
  padding:0;position:relative;border:0;border-radius:calc(var(--frame-radius) + 4px);
  box-shadow:0 30px 90px rgba(8,12,10,.45);animation:mf-notice-in .28s cubic-bezier(.2,.8,.2,1);
  /* Размеры, которые телефон уменьшает, — именами: одно место на величину. */
  --notice-icon:34px;--notice-glyph:18px;--notice-ok:46px;
}
@keyframes mf-notice-in{from{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:none}}
.mf-notice::before{
  content:'';position:absolute;inset:0 0 auto;height:4px;
  background:linear-gradient(90deg,var(--accent-strong),var(--accent),var(--accent-strong));
}
.mf-notice-head{
  padding:clamp(20px,2.4vw,30px) clamp(18px,3.4vw,40px) var(--space-4);
  background:linear-gradient(180deg,var(--accent-soft),var(--surface));
}
.mf-notice-badge{
  display:inline-flex;align-items:center;gap:var(--space-2);
  padding:5px var(--space-3);border-radius:var(--ui-pill);
  background:var(--surface);color:var(--accent-strong);box-shadow:0 0 0 1px rgba(201,169,110,0.31) inset;
  font-size:var(--small);font-weight:var(--fw-title);letter-spacing:.02em;
}
.mf-notice-badge i{width:8px;height:8px;border-radius:50%;background:var(--accent);animation:mf-notice-pulse 2.4s ease-out infinite}
/* Пульс — прозрачность кольца, а не второе число тени: одно место на цвет. */
@keyframes mf-notice-pulse{from{outline:0 solid var(--accent);outline-offset:0;opacity:1}to{outline:6px solid transparent;outline-offset:2px;opacity:.85}}
.mf-notice-title{margin:var(--space-3) 0 0;font-size:var(--h1);font-weight:var(--fw-title);line-height:1.15;color:var(--ink-strong);letter-spacing:-.01em}
.mf-notice-lead{margin:var(--space-2) 0 0;max-width:74ch;font-size:var(--body);line-height:1.5;color:var(--ink-soft)}
.mf-notice-body{
  display:grid;grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);gap:var(--space-5) clamp(20px,3vw,36px);align-items:start;
  padding:var(--space-1) clamp(18px,3.4vw,40px) 0;
}
.mf-notice-points{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:1fr;gap:var(--space-3)}
.mf-notice-point{display:flex;gap:var(--space-3);align-items:flex-start}
.mf-notice-point strong{display:block;font-size:var(--body);font-weight:var(--fw-title);color:var(--ink);margin-bottom:2px}
.mf-notice-point p{margin:0;font-size:var(--small);line-height:1.5;color:var(--muted)}
.mf-notice-short{display:none}
.mf-notice.is-short .mf-notice-full{display:none}
.mf-notice.is-short .mf-notice-short{display:block}
.mf-notice.is-tight .mf-notice-lead{display:none}
/* Блок свёрнут — пункты сеткой 2×2 во всю ширину, строка «Развернуть» под
   ними: пустой колонки рядом со свёрнутым блоком не остаётся. */
.mf-notice.is-compact .mf-notice-body{grid-template-columns:1fr}
.mf-notice.is-compact .mf-notice-points{grid-template-columns:1fr 1fr;column-gap:var(--space-6)}
.mf-notice-icon{
  flex:none;width:var(--notice-icon);height:var(--notice-icon);border-radius:11px;display:grid;place-items:center;
  background:var(--accent-soft);color:var(--accent-strong);box-shadow:0 0 0 1px rgba(201,169,110,0.18) inset;
}
.mf-notice-icon svg{width:var(--notice-glyph);height:var(--notice-glyph);fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.mf-notice-legal{padding:var(--space-3) var(--space-4) var(--space-1);border-radius:12px;background:var(--muted-surface)}
.mf-notice-legal summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);list-style:none;cursor:pointer;margin-bottom:var(--space-2)}
.mf-notice-legal summary::-webkit-details-marker{display:none}
.mf-notice-legal summary:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:4px}
.mf-notice-legal h3{margin:0;font-size:var(--small);font-weight:var(--fw-title);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft)}
.mf-notice-legal-toggle{display:none;font-size:var(--small);color:var(--accent-dark);text-decoration:underline;text-underline-offset:3px}
.mf-notice-legal:not([open]){padding-bottom:var(--space-3)}
.mf-notice-legal:not([open]) summary{margin-bottom:0}
.mf-notice-legal:not([open]) .mf-notice-legal-toggle{display:inline}
.mf-notice-legal p{margin:0 0 var(--space-2);font-size:12px;line-height:1.55;color:var(--muted);text-align:justify;hyphens:auto}
.mf-notice-foot{
  position:sticky;bottom:0;margin-top:var(--space-4);
  padding:var(--space-3) clamp(18px,3.4vw,40px) var(--space-4);
  display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-5);
  background:var(--surface);box-shadow:0 -1px 0 var(--line);
}
.mf-notice-ok{min-width:240px;height:var(--notice-ok);font-size:var(--body)}
.mf-notice-edition{flex:1 1 auto;margin:0;font-size:12px;color:var(--muted)}
.mf-notice-links{display:flex;gap:var(--space-4);margin-left:auto}
.mf-notice-links a{font-size:var(--small);color:var(--accent-strong);text-decoration:underline;text-underline-offset:3px}
.mf-notice-fine{flex:1 1 100%;margin:0;font-size:12px;line-height:1.45;color:var(--muted)}
/* Средний экран: пункты в две колонки над правовым блоком. */
@media(max-width:1080px){
  .mf-notice-body{grid-template-columns:1fr}
  .mf-notice-points{grid-template-columns:1fr 1fr;column-gap:var(--space-6)}
}
/* Телефон: плотнее поля и строки, кнопка во всю ширину, окно почти во весь
   экран — место под текст, а не под затемнение. */
@media(max-width:640px){
  .mf-notice-veil[data-modal]{padding:var(--space-2)}
  [data-modal]>.site-card.mf-notice{max-height:calc(100vh - 2 * var(--space-2));max-height:calc(100dvh - 2 * var(--space-2));border-radius:var(--frame-radius);--notice-icon:28px;--notice-glyph:15px;--notice-ok:44px}
  .mf-notice-head{padding:var(--space-4) var(--space-4) var(--space-3)}
  .mf-notice-title{margin-top:var(--space-2);font-size:22px}
  .mf-notice-lead{font-size:var(--small)}
  .mf-notice-body{gap:var(--space-3);padding:0 var(--space-4)}
  .mf-notice-points,.mf-notice.is-compact .mf-notice-points{grid-template-columns:1fr;gap:var(--space-2)}
  .mf-notice-point{gap:var(--space-2)}
  .mf-notice-point strong{font-size:var(--small)}
  .mf-notice-point p{font-size:12px;line-height:1.4}
  .mf-notice-icon{border-radius:9px}
  .mf-notice-foot{margin-top:var(--space-3);padding:var(--space-3) var(--space-4);gap:var(--space-2) var(--space-4)}
  .mf-notice-ok{flex:1 1 100%}
  .mf-notice-edition{flex:1 1 100%}
  .mf-notice-links{margin-left:0}
  .mf-notice-fine{font-size:11px}
}
@media(prefers-reduced-motion:reduce){
  [data-modal]>.site-card.mf-notice,.mf-notice-badge i{animation:none}
}

/* ═══ ПОДВАЛ САЙТА — ОДИН НА ВСЕ СТРАНИЦЫ (FLAT 1727) ════════════════════════
 * Слово владельца 10.09: разделы сайта в подвале — сервис, помощь с прямым
 * входом в чат поддержки, документы. Тёмный, чтобы страница заканчивалась, а
 * не обрывалась. */
.site-footer.mf-foot{display:block;padding:clamp(28px,4vw,44px) var(--space-5) var(--space-5);background:var(--landing-surface-dark);color:rgba(239,233,220,.72);border-top:1px solid var(--line-strong)}
.mf-foot-top{display:grid;grid-template-columns:minmax(220px,1.4fr) repeat(3,minmax(150px,1fr));gap:var(--space-6) var(--space-5)}
.mf-foot-brand .site-brand{display:inline-flex;flex-direction:column;align-items:flex-start;gap:var(--space-1);min-width:0}
.mf-foot .site-brand-logo{opacity:.92}
.mf-foot .site-brand span{color:rgba(255,255,255,.5);font-size:10px;letter-spacing:.24em}
.mf-foot-name{color:#fff;font-weight:var(--fw-title);letter-spacing:.2em;text-decoration:none}
.mf-foot-brand p{margin:var(--space-3) 0 0;max-width:34ch;font-size:var(--small);line-height:1.6;color:rgba(255,255,255,.62)}
.mf-foot-col{display:flex;flex-direction:column;gap:var(--space-2);align-items:flex-start}
.mf-foot-col b{margin-bottom:var(--space-1);font-size:11px;font-weight:var(--fw-title);letter-spacing:.14em;text-transform:uppercase;color:#fff}
.mf-foot-col a,.mf-foot-col button{padding:0;border:0;background:none;font:inherit;font-size:var(--small);color:rgba(255,255,255,.72);text-decoration:none;cursor:pointer;text-align:left;transition:color var(--dur-3) ease}
.mf-foot-col a:hover,.mf-foot-col button:hover,.mf-foot-col a[aria-current="page"]{color:#fff}
.mf-foot-col a:focus-visible,.mf-foot-col button:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}
.mf-foot-bottom{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-5);margin-top:clamp(24px,3vw,36px);padding-top:var(--space-4);border-top:1px solid rgba(255,255,255,.12);font-size:12px;color:rgba(255,255,255,.5)}
@media(max-width:820px){.mf-foot-top{grid-template-columns:1fr 1fr}.mf-foot-brand{grid-column:1/-1}}
@media(max-width:640px){.mf-foot-top{grid-template-columns:1fr}}

/* ═══ ПРАВОВЫЕ ДОКУМЕНТЫ (FLAT 1727) ═════════════════════════════════════════
 * Каждый раздел — «коротко» простыми словами, затем точный текст. Строка —
 * по ширине чтения; оглавление прилипает на широком экране. */
.mf-legal-edition{margin-top:var(--space-3);font-size:var(--small);color:var(--muted)}
.mf-legal-edition a{color:var(--accent-strong)}
.mf-legal{display:grid;grid-template-columns:230px minmax(0,1fr);gap:var(--gap);align-items:start}
.mf-legal-toc{position:sticky;top:var(--space-5);padding:var(--space-4);border:var(--border);border-radius:var(--frame-radius);background:var(--surface)}
.mf-legal-toc b{display:block;margin-bottom:var(--space-2);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.mf-legal-toc ol{margin:0;padding-left:1.3em;display:flex;flex-direction:column;gap:6px;font-size:var(--small)}
.mf-legal-toc a{color:var(--ink-soft);text-decoration:none}
.mf-legal-toc a:hover{color:var(--accent-strong);text-decoration:underline}
.mf-legal-doc{padding:clamp(22px,3.4vw,40px)}
.mf-legal-sec{max-width:72ch}
.mf-legal-sec+.mf-legal-sec{margin-top:var(--space-6);padding-top:var(--space-5);border-top:var(--border)}
.mf-legal-sec h2{display:flex;align-items:baseline;gap:var(--space-3);margin:0 0 var(--space-3);font-size:var(--h3);font-weight:var(--fw-title);color:var(--ink-strong)}
.mf-legal-sec h2 span{font-size:var(--small);color:var(--accent);font-weight:var(--fw-title)}
.mf-legal-plain{margin:0 0 var(--space-3);padding:var(--space-3) var(--space-4);border-radius:10px;background:var(--accent-soft);color:var(--ink);font-size:var(--body)}
.mf-legal-sec p,.mf-legal-sec li{font-size:var(--body);line-height:1.65;color:var(--ink-soft)}
.mf-legal-sec p{margin:0 0 var(--space-3)}
.mf-legal-sec ul{margin:0 0 var(--space-3);padding-left:1.2em;display:flex;flex-direction:column;gap:6px}
@media(max-width:820px){.mf-legal{grid-template-columns:1fr}.mf-legal-toc{position:static}}

/* ═══ ПОЛОСА УВЕДОМЛЕНИЯ — СТРАНИЦЫ ИЗ ПОИСКА (FLAT 1727) ═════════════════════
 * Не перекрывает содержимое: страница получает снизу поле на её высоту. */
.mf-notice-bar{
  position:fixed;left:50%;bottom:var(--space-3);transform:translateX(-50%);z-index:var(--layer-modal);
  width:min(980px,calc(100vw - 24px));display:flex;align-items:center;gap:var(--space-3);
  padding:10px 10px 10px var(--space-4);border-radius:var(--frame-radius);
  background:rgba(17,23,20,.92);color:rgba(255,255,255,.86);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  box-shadow:0 12px 36px rgba(8,12,10,.35);animation:mf-notice-in .28s cubic-bezier(.2,.8,.2,1);
}
.mf-notice-bar p{flex:1 1 auto;margin:0;font-size:var(--small);line-height:1.45;color:inherit}
.mf-notice-bar b{color:#fff}
.mf-notice-bar a{color:#fff;text-decoration:underline;text-underline-offset:2px}
.mf-notice-bar-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--accent)}
.mf-notice-bar-more{flex:none;padding:0 var(--space-3);height:36px;border:0;border-radius:var(--ui-pill);background:rgba(255,255,255,.1);color:#fff;font:inherit;font-size:var(--small);cursor:pointer}
.mf-notice-bar-more:hover{background:rgba(255,255,255,.18)}
.mf-notice-bar-ok{flex:none;height:36px;min-width:110px}
@media(max-width:640px){
  .mf-notice-bar{flex-wrap:wrap;padding:var(--space-3)}
  .mf-notice-bar p{flex:1 1 calc(100% - 20px)}
  .mf-notice-bar-more,.mf-notice-bar-ok{flex:1 1 0}
}
@media(prefers-reduced-motion:reduce){.mf-notice-bar{animation:none}}

/* ═══ ПОМОЩЬ: ПОДДЕРЖКА; ПРОФИЛЬ: СОГЛАСИЕ (FLAT 1727) ═══════════════════════ */
.mf-help-support .site-card-body{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-3)}
.mf-help-support-lead{margin:0;font-size:var(--body);color:var(--ink-soft)}
.mf-help-legal button.site-control{font:inherit;text-align:left;cursor:pointer}
/* ДОКУМЕНТЫ И СОГЛАСИЕ — ОТДЕЛЬНЫЙ БЛОК ПРОФИЛЯ (1729). Состояние видно по
   значку: зелёный щит — действующая редакция подтверждена, серый — нет. */
.mf-consent-card .site-card-body{gap:var(--space-4)}
.mf-consent-state{display:flex;align-items:flex-start;gap:var(--space-3)}
.mf-consent-icon{flex:none;width:40px;height:40px;border-radius:12px;display:grid;place-items:center;background:var(--muted-surface);color:var(--muted)}
.mf-consent-icon svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.mf-consent-state[data-state="given"] .mf-consent-icon{background:var(--accent-soft);color:var(--accent-strong);box-shadow:0 0 0 1px rgba(201,169,110,0.22) inset}
.mf-consent-state b{display:block;font-size:var(--body);font-weight:var(--fw-title);color:var(--ink)}
.mf-consent-state small{display:block;margin-top:2px;font-size:var(--small);color:var(--muted)}
.mf-consent-links{display:flex;flex-wrap:wrap;gap:var(--space-2)}
/* БЛОКИ СОГЛАСИЙ (владелец, 25.09) — в стиле блока документов, одна разметка на вид. */
.mf-consent-facts{margin:0;font-size:var(--small);color:var(--muted)}
.mf-consent-terms{font-size:var(--small);color:var(--muted)}
.mf-consent-terms summary{cursor:pointer;color:var(--ink);font-weight:var(--fw-title)}
.mf-consent-terms ul{margin:var(--space-2) 0;padding-left:1.3em;display:grid;gap:var(--space-1)}
.mf-consent-terms p{margin:0}
.mf-consent-points{margin:0;padding-left:1.2em;display:grid;gap:var(--space-2);font-size:var(--small);color:var(--ink);line-height:1.45}
.mf-consent-links a,.mf-consent-links button{
  display:inline-flex;align-items:center;height:32px;padding:0 var(--space-3);border:var(--border);border-radius:var(--ui-pill);
  background:var(--surface);color:var(--ink-soft);font:inherit;font-size:var(--small);text-decoration:none;cursor:pointer;
  transition:border-color var(--dur-3) ease,color var(--dur-3) ease,background var(--dur-3) ease;
}
.mf-consent-links a:hover,.mf-consent-links button:hover{border-color:var(--accent);color:var(--accent-strong);background:var(--accent-soft)}
.mf-consent-links a:focus-visible,.mf-consent-links button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}


/* ═══ ПАЛЕЦ: УЗКИЙ ЭКРАН И КАСАНИЕ (21.09) ═══════════════════════════════════
 *
 * ЗАМЕР, С КОТОРОГО НАЧАЛОСЬ. Страницы подняты настоящим браузером в размере
 * телефона (390×844). Оказалось: ссылки шапки — 59×17 точек кеглем 11,
 * ссылки подвала — 20 точек высотой, значки применения в помощи — 26×26,
 * вкладки ленты — 23 точки, поле описания — кегль 15. Ни одно из этих чисел
 * не поменялось бы от поворота телефона: узкий экран их не касался вовсе.
 *
 * ПОЧЕМУ ЗДЕСЬ, А НЕ ВТОРОЙ ВЕТКОЙ. Второй, «мобильный» путь уже был — и был
 * мёртв (1903). Это тот же ОДИН путь: правила ниже меняют РАЗМЕР тех же
 * узлов, не заводя ни своей разметки, ни своего обработчика.
 *
 * УСЛОВИЕ СОСТАВНОЕ. Узкий экран — телефон в руке; `pointer:coarse` —
 * планшет, где экран широкий, а целятся тем же пальцем. Оба ведут к одному
 * размеру, и потому стоят одним правилом, а не двумя копиями.  */
@media(max-width:820px),(pointer:coarse){
  /* Навигация шапки: строка текста превращается в строку-цель. */
  .site-nav a,.site-actions a,.site-actions button{
    display:inline-flex;align-items:center;min-height:var(--tap);
    padding:0 var(--space-2);font-size:var(--small);
  }
  /* Черта текущей страницы шла под строкой текста; строка выросла — черта
     садится на её край, иначе висела бы в пустоте. */
  .site-nav a[aria-current="page"]::after,.site-actions a[aria-current="page"]::after{bottom:var(--space-1)}

  /* Подвал: те же ссылки, тот же размер цели, включая имя сайта под знаком. */
  .mf-foot-col a,.mf-foot-col button,.mf-foot-name,
  .mf-consent-links a,.mf-consent-links button{display:inline-flex;align-items:center;min-height:var(--tap)}

  /* Вкладки ленты («Моя галерея», «Сегодня», «Неделя»): вид текстовый,
     высота — пальца. Отступ снизу оставлен черте выбранной вкладки. */
  .site-section>.site-head .site-tab,[data-settings-shell] .site-local-menu .site-tab{
    min-height:var(--tap);padding-top:var(--space-2);
  }

  /* Значки помощи: взять пример и открыть героя. Были 26×26. */
  .mf-help-character-page,.mf-help-character-apply,.mf-help-row-apply{width:var(--tap);height:var(--tap)}

  /* Ряд инструментов описания: пропорция кадра и кнопка вырезов. Круглая
     кнопка и кружки выбранных вырезов рядом с ней обязаны быть одного роста —
     потому правится их общее имя, а не каждая по себе. */
  .mf-tool{min-height:var(--tap)}
  :root{--tool-round:var(--tap)}

  /* Окно входа: закрытие (было 36) и глаз пароля (был 28). Полю добавлено
     место справа ровно под выросший глаз — иначе пароль уйдёт под него. */
  #authModal .site-auth-close{width:var(--tap);height:var(--tap)}
  #authModal .site-auth-eye{width:var(--tap);height:var(--tap);right:var(--space-2)}
  #authModal .site-auth-field-wrap input{padding-right:60px}


  /* Профиль (28.09, замер с вошедшим — у пустого стенда профиль гостевой):
     карандаши обложки и аватара, «Копировать» номер, ссылки согласий. */
  .mf-pencil,.mf-pencil--avatar{width:var(--tap);height:var(--tap)}
  .mf-pencil--avatar{right:0;bottom:0}
  .site-profile-id-copy{min-height:var(--tap)}
  .mf-consent-terms>summary{min-height:var(--tap);line-height:var(--tap)}

  /* Поле кеглем ниже шестнадцати точек заставляет телефон приблизить
     страницу при касании — и обратно он её НЕ отдаляет: человек остаётся на
     увеличенной странице с уехавшей раскладкой. Правится ИМЯ кегля: все поля
     сайта, включая поле описания с его зеркалом подсветки, зовут его. */
  :root{--fs-field:16px}
}

/* ═══ ПАКЕТЫ ТОКЕНОВ НА УЗКОМ ЭКРАНЕ ═════════════════════════════════════════
 *
 * Четыре колонки стояли безусловно: на телефоне карточка получала 73 точки,
 * текст вылезал за неё, четвёртая уходила за край экрана и обрезалась
 * `overflow` корня — страница покупки была нерабочей и молчала об этом.
 * Строка-подсказка над ними держала три колонки с запасом 180 точек и
 * наезжала на заголовок. */
@media(max-width:820px){
  .site-commerce-products{grid-template-columns:var(--grid-2)}
  .site-commerce-note{grid-template-columns:1fr;align-items:start}
}
@media(max-width:640px){
  .site-commerce-products{grid-template-columns:1fr}
}

/* ═══ ВОЗРАСТНОЙ ЭКРАН (владелец, 28.09) ═══════════════════════════════════
   ЗАМОК — ЗДЕСЬ, А НЕ В СКРИПТЕ. Мир для взрослых пишет в голову
   `<meta name="age-gate" content="18">`; страница с чужими работами несёт
   `data-age-gate` на `<html>`. Пока нет ответа (`data-age-ok`), видно только
   сам экран — и без скриптов тоже: закрытое по умолчанию не зависит от того,
   дошёл ли файл. Открывает страницу `age-gate.js` по cookie сегодняшнего дня
   или по нажатию. */
html[data-age-gate]:has(meta[name="age-gate"]:not([content=""])):not([data-age-ok]){overflow:hidden}
html[data-age-gate]:has(meta[name="age-gate"]:not([content=""])):not([data-age-ok]) body > :not(.mf-age-gate){visibility:hidden}
/* Фон экрана непрозрачный и ночной: браузер без `:has` замка не держит, и
   экран поверх страницы обязан закрывать её сам. */
.mf-age-gate{position:fixed;inset:0;z-index:var(--layer-top);display:flex;align-items:center;justify-content:center;padding:var(--space-4) 16px;background:var(--night);overflow-y:auto}
.mf-age-card{width:100%;max-width:640px;margin:auto;background:var(--surface);border-radius:calc(var(--ui-radius) * 2);box-shadow:var(--shadow-modal);padding:clamp(20px,4vw,36px);color:var(--ink)}
.mf-age-mark{display:inline-flex;align-items:center;justify-content:center;width:64px;height:64px;border:3px solid var(--danger-text);border-radius:50%;color:var(--danger-text);font-weight:800;font-size:22px;margin-bottom:var(--space-3)}
.mf-age-title{margin:0 0 var(--space-3);font-family:var(--font-display);font-weight:400;font-size:clamp(22px,3.2vw,30px);line-height:1.2}
.mf-age-lead{margin:0 0 var(--space-2);line-height:1.5;color:var(--ink);font-size:var(--body)}
.mf-age-list{margin:0 0 var(--space-4);padding-left:1.2em;line-height:1.5;font-size:var(--body)}
.mf-age-list li{margin-bottom:var(--space-1)}
.mf-age-list a,.mf-age-fine a,.mf-age-check a{color:var(--accent-dark)}
.mf-age-actions{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-bottom:var(--space-2)}
/* Явное согласие галочками (20.10): две отметки-плашки; вход — когда отмечены обе. */
.mf-age-checks{display:grid;gap:var(--space-2);margin:0 0 var(--space-4)}
.mf-age-check,.mf-check{display:flex;gap:var(--space-3);align-items:flex-start;padding:var(--space-3);border:var(--border);border-radius:var(--ui-radius);cursor:pointer;line-height:1.45;font-size:var(--body);font-weight:400;text-transform:none;letter-spacing:normal;color:var(--ink)}
.mf-age-check:has(input:checked),.mf-check:has(input:checked){border-color:var(--accent)}
/* Отметка — вся плашка (цель касания ≥ 44, правило phone-content): прозрачный переключатель поверх, знак рисует подпись; ссылки — над ним. */
.mf-age-check,.mf-check{position:relative}
.mf-age-check input,.mf-check input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.mf-age-check>span::before,.mf-check>span::before{content:'';display:inline-block;box-sizing:border-box;width:20px;height:20px;margin-inline-end:var(--space-3);vertical-align:-4px;border:2px solid var(--muted);border-radius:4px}
.mf-age-check:has(input:checked)>span::before,.mf-check:has(input:checked)>span::before{content:'✓';border-color:var(--accent);background:var(--accent);color:var(--on-gold);font-size:14px;line-height:16px;text-align:center}
.mf-age-check:has(input:focus-visible),.mf-check:has(input:focus-visible){outline:2px solid var(--accent);outline-offset:2px}
.mf-age-check a,.mf-check a{position:relative;z-index:1}
.mf-age-actions .site-button:disabled{opacity:.45;cursor:not-allowed}
.mf-age-hint{margin:0 0 var(--space-4);font-size:var(--small);color:var(--muted)}
.mf-age-hint[hidden]{display:none}
.mf-age-actions .site-button{flex:1 1 220px;justify-content:center;min-height:var(--tap)}
.mf-age-fine{margin:0 0 var(--space-2);font-size:var(--small);line-height:1.45;color:var(--muted)}
/* ОКНО МЕТОК (tag-help.js, 29.09): оболочка — общего окна согласий (.mf-rights), здесь только своё. */
.mf-tags-box{width:min(760px,100%)}
.mf-tags-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}
.mf-tags-close{width:40px;height:40px;flex:0 0 40px;border:var(--border);border-radius:var(--ui-radius);background:transparent;color:var(--ink);font-size:24px;line-height:1;cursor:pointer}
.mf-tags-body{display:flex;flex-direction:column;gap:var(--space-4)}
.mf-tags-section h3{margin:0 0 var(--space-1);font-size:var(--small);letter-spacing:var(--caps);text-transform:uppercase}
.mf-tags-note{margin:0 0 var(--space-2);color:var(--muted);font-size:var(--small);line-height:1.4}
.mf-tags-row{display:flex;flex-wrap:wrap;gap:var(--space-2)}
.mf-tags-chip{display:inline-flex;align-items:baseline;gap:var(--space-2);padding:var(--space-1) var(--space-2);border:var(--border);border-radius:var(--ui-radius-sm);background:var(--soft);color:var(--ink);cursor:pointer;text-align:left}
.mf-tags-chip code{font-family:var(--font-mono);font-size:var(--small)}
.mf-tags-chip span{color:var(--muted);font-size:var(--micro)}
.mf-tags-chip:hover,.mf-tags-chip:focus-visible{border-color:var(--accent)}
/* СМЕНА ПАРОЛЯ В ПРОФИЛЕ (profile-password.js, 29.09): три поля и кнопка столбиком. */
.mf-password-form{display:flex;flex-direction:column;gap:var(--space-2);margin-top:var(--space-2)}
.mf-password-form .site-button{align-self:flex-start}

/* Уведомление о cookie (02.10): полоса внизу, не закрывает работу, одна кнопка. */
.mf-cookie{position:fixed;left:var(--space-4);right:var(--space-4);bottom:var(--space-4);z-index:var(--layer-notice);display:flex;align-items:center;gap:var(--space-4);max-width:880px;margin:0 auto;padding:var(--space-3) var(--space-4);border:1px solid var(--line);border-radius:var(--ui-radius);background:var(--surface);color:var(--ink);box-shadow:0 8px 28px rgba(0,0,0,.18)}
.mf-cookie-text{margin:0;flex:1;font-size:var(--small);color:var(--ink-soft)}
.mf-cookie-text a{color:var(--accent);text-underline-offset:3px}
.mf-cookie-ok{flex:none}
@media(max-width:640px){.mf-cookie{flex-direction:column;align-items:stretch}}

/* Промежуточный кадр идущей генерации (02.10): под подписью, слегка размыт —
 * кадр недорисован; край размытия спрятан небольшим увеличением. */
.mf-frame-preview{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:blur(3px);transform:scale(1.04);opacity:.92;transition:opacity .3s ease,filter .3s ease;pointer-events:none}
/* Проверка готовой картинки (владелец 03.10): последний кадр держится, размыт сильнее, пока ждём вердикт. */
.mf-frame-preview--checking{filter:blur(8px);transform:scale(1.06)}


/* «Чем платить» на странице токенов (06.10, XMR рядом с ETH): карточки до окна оплаты; не объявленная сеть скрыта, молчащая — серая. */
.site-pay-choice{margin:var(--space-3) 0}
.site-pay-choice>h2{font-size:var(--fs-lg);margin:0 0 var(--space-2)}
/* ЧЕМ ПЛАТИТЬ (18.10, «премиально»): строки-карточки одной колонкой — знак монеты, имя и сеть, довод; справа отметка и срок. */
.site-pay-choice-list{display:grid;grid-template-columns:1fr;gap:var(--space-2);max-width:720px}
.site-pay-card{--pay-mark:44px;position:relative;display:grid;grid-template-columns:var(--pay-mark) minmax(0,1fr) auto;align-items:center;gap:var(--space-3);width:100%;text-align:left;padding:var(--space-3) var(--space-4);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--ink);cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s}
.site-pay-card:hover:not([disabled]){border-color:var(--accent);transform:translateY(-1px)}
.site-pay-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.site-pay-mark{display:grid;place-items:center;width:var(--pay-mark);height:var(--pay-mark);border-radius:50%;font-size:22px;font-weight:var(--fw-title);color:#fff;background:var(--ink-soft)}
.site-pay-mark[data-coin="usdt"]{background:#26A17B}
.site-pay-mark[data-coin="eth"]{background:#627EEA}
.site-pay-mark[data-coin="xmr"]{background:#F26822}
.site-pay-mark[data-coin="nowpayments"]{background:var(--accent-strong);color:var(--on-gold)}
[data-hosted-pay][aria-disabled="true"]{opacity:.5;pointer-events:none}
.site-pay-text{display:flex;flex-direction:column;gap:2px;min-width:0}
.site-pay-name{display:flex;align-items:baseline;gap:var(--space-2);flex-wrap:wrap}
.site-pay-name>b{font-size:18px}
.site-pay-name>em{font-style:normal;font-size:var(--small);color:var(--muted)}
.site-pay-text>[data-pay-pitch]{color:var(--ink-soft);font-size:var(--small)}
.site-pay-side{display:flex;flex-direction:column;align-items:flex-end;gap:var(--space-1);text-align:right}
.site-pay-side>small{color:var(--muted);font-size:var(--small)}
.site-pay-badge{font-style:normal;font-size:12px;font-weight:var(--fw-title);padding:2px 8px;border-radius:999px;background:var(--accent-strong);color:var(--on-gold);white-space:nowrap}
.site-pay-badge[data-kind="soon"]{background:var(--muted-surface);color:var(--muted)}
.site-pay-card[aria-checked="true"]{border-color:var(--accent);background:var(--accent-soft);box-shadow:inset 0 0 0 1px var(--accent)}
.site-pay-card[disabled]{cursor:not-allowed}
.site-pay-card[disabled] .site-pay-mark{filter:grayscale(1);opacity:.55}
.site-pay-card[disabled] .site-pay-text{opacity:.6}
@media(max-width:640px){.site-pay-card{--pay-mark:36px;grid-template-columns:var(--pay-mark) minmax(0,1fr);padding:var(--space-3)}.site-pay-mark{font-size:18px}.site-pay-side{grid-column:2;flex-direction:row;align-items:center;gap:var(--space-2)}}
.site-pay-help{margin-top:var(--space-2)}
.site-pay-help>summary{cursor:pointer;color:var(--accent-strong)}
/* «Нет криптовалюты?» (08.10): коротко, три шага цифрами, ссылки строкой — без стены текста. */
.site-pay-help-lead{margin:var(--space-2) 0 var(--space-1);color:var(--ink);font-size:var(--small)}
.site-pay-help-steps{margin:0 0 var(--space-1);padding-left:var(--space-5);color:var(--ink-soft);font-size:var(--small)}
.site-pay-help-steps>li{margin:2px 0}
.site-pay-help-note{margin:0 0 var(--space-1);color:var(--muted);font-size:var(--small)}
.site-pay-help-links{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-4);margin:0}
.site-pay-help-links>a{color:var(--accent-strong)}
.site-commerce-product-crypto{display:block;color:var(--muted);font-size:13px}

/* ВЫБОР ЯЗЫКА (20.10, lang-picker.js): пункт меню «флаг + код» — тем же видом, что пункты меню (владелец: «меню не
   меняй на кнопки»); в подвале — тот же пункт. Окно одно: под пунктом меню, у подвала — над ним; до 640px — шторка снизу. */
.mf-lang-item{display:inline-flex;align-items:center;justify-content:center;gap:.45em;background:none;border:0;padding:0;min-height:44px;min-width:44px;cursor:pointer}
.mf-lang-foot{color:rgba(255,255,255,.75);font-size:var(--micro);font-weight:var(--fw-title);letter-spacing:var(--caps);text-transform:uppercase}
.mf-lang-foot:hover{color:#fff}
.mf-langbox-veil{position:fixed;inset:0;z-index:var(--layer-modal);background:rgba(0,0,0,.35)}
.mf-langbox-veil[hidden]{display:none}
.mf-langbox{--langbox-top:auto;--langbox-bottom:auto;--langbox-right:var(--space-4);position:fixed;top:var(--langbox-top);bottom:var(--langbox-bottom);right:var(--langbox-right);width:min(560px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 96px));overflow:auto;background:#141414;color:#fff;border:1px solid rgba(255,255,255,.12);border-radius:18px;box-shadow:0 30px 80px rgba(0,0,0,.6);padding:var(--space-4)}
.mf-langbox h3{margin:2px 4px 10px;font-size:13px;color:#A8A8A8;font-weight:600;letter-spacing:.3px;text-transform:uppercase}
.mf-langbox-grab{display:none;width:36px;height:4px;border-radius:2px;background:#444;margin:0 auto 10px}
.mf-langbox-find{width:100%;height:44px;border-radius:12px;background:#1c1c1c;border:1px solid rgba(255,255,255,.12);color:#fff;font:inherit;padding:0 14px;margin-bottom:12px}
.mf-langbox-find::placeholder{color:#8a8a8a}
.mf-langbox-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
.mf-langbox-lang{display:flex;align-items:center;gap:var(--space-3);min-height:52px;padding:var(--space-2) var(--space-3);border-radius:10px;border:0;background:none;color:#fff;font:inherit;text-align:left;cursor:pointer}
.mf-langbox-lang[hidden]{display:none}
.mf-langbox-lang:hover,.mf-langbox-lang:focus-visible{background:#1f1f1f;outline:0}
.mf-langbox-lang[aria-current="true"]{background:rgba(255,138,76,.12);box-shadow:inset 0 0 0 1px rgba(255,138,76,.5)}
.mf-langbox-lang>span{min-width:0}
.mf-langbox-lang b{display:block;font-weight:600;font-size:14px}
.mf-langbox-lang b i{font-style:normal;color:#8a8a8a}
.mf-langbox-lang small{display:block;color:#8a8a8a;font-size:12px}
.mf-langbox-lang em{margin-left:auto;font-style:normal;color:var(--accent)}
.mf-langbox-foot{display:flex;flex-wrap:wrap;gap:var(--space-2);justify-content:space-between;align-items:center;margin-top:12px;padding:10px 4px 0;border-top:1px solid rgba(255,255,255,.12);font-size:12px;color:#8a8a8a}
.mf-langbox-foot a{color:#D6D6D6}
@media(max-width:640px){
  .mf-langbox{left:0;right:0;top:auto;bottom:0;width:auto;max-height:78vh;border-radius:18px 18px 0 0;padding:10px 12px 16px}
  .mf-langbox-grab{display:block}
  .mf-langbox-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
.mf-lang-auto{font-size:var(--micro);color:rgba(255,255,255,.5);margin-left:var(--space-2)}
/* ОБЛАКО ТЕГОВ ВИТРИНЫ (09.10, TAG_CLOUD; владелец: «облако словами, премиально на вид, просто и линейно»):
   слова разного размера в строку, три первых — цветом бренда, выбранные — чипами с крестиком сверху. */
/* ФИЛЬТРЫ ВИТРИНЫ — ВЫДВИЖНОЙ ПАНЕЛЬЮ СВЕРХУ (владелец 09.10: «гигантское — сделай аккуратно»). Закрыто — кнопка
   со счётчиком и строка чипов выбранного; открыто — компактные строки «ключ — значения». Облако — 12–17 px. */
.mf-shelf-head{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;gap:var(--space-3)}
.mf-shelf-title{font-size:clamp(18px,2.2vw,24px);margin:0}
.mf-filter-toggle{display:inline-flex;align-items:center;gap:var(--space-2);min-height:var(--tap);padding:0 var(--space-3);border:var(--border);border-radius:var(--ui-radius);background:var(--surface);color:var(--ink-soft);font:inherit;font-size:var(--small);cursor:pointer;white-space:nowrap}
.mf-filter-toggle:hover,.mf-filter-toggle:focus-visible,.mf-filter-toggle[aria-expanded="true"]{border-color:var(--accent);color:var(--ink)}
.mf-filter-count{min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--accent);color:var(--on-gold);font-size:11px;font-weight:700;line-height:18px;text-align:center}
.mf-filter-reset{min-height:32px;padding:0 var(--space-2);border:0;background:none;color:var(--muted);font:inherit;font-size:var(--small);text-decoration:underline;cursor:pointer}
.mf-filter-panel{display:grid;grid-template-columns:max-content 1fr;align-items:baseline;gap:var(--space-2) var(--space-4);margin:var(--space-2) 0 var(--space-4);padding:var(--space-3) var(--space-4);border:var(--border);border-radius:var(--ui-radius);background:var(--surface)}
.mf-filter-row{display:contents}
.mf-filter-row:has(> nav[hidden]),.mf-filter-row:has(> .mf-tag-cloud[hidden]){display:none}
.mf-filter-key{font-size:11px;font-weight:600;letter-spacing:var(--caps);text-transform:uppercase;color:var(--muted)}
.mf-filter-panel{--filter-tab-h:var(--tap)}
.mf-filter-panel .site-tab{min-height:var(--filter-tab-h)}
.mf-filter-panel .site-local-menu{justify-content:flex-start;flex-wrap:wrap;margin:0;gap:var(--space-1)}
/* Период внутри панели — тихие кнопки: на мыши — компактно, на пальце — прежние 44 px. */
@media(hover:hover) and (pointer:fine){.mf-filter-panel{--filter-tab-h:30px}.mf-filter-panel .site-tab{padding:0 var(--space-3);border-color:transparent;background:none}.mf-filter-panel .site-tab[aria-current="true"]{background:var(--accent-soft);border-color:transparent}}
.mf-filter-row > nav{margin:0;justify-content:flex-start}
.mf-tag-cloud{--tag-word-h:auto;display:flex;flex-direction:column;gap:var(--space-2)}
.mf-tag-head{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}
.mf-tag-words{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--space-1) var(--space-3);line-height:1.3}
.mf-tag-word{min-height:var(--tag-word-h);appearance:none;border:0;background:none;padding:2px 0;color:var(--ink-soft);font-family:inherit;font-weight:500;cursor:pointer;opacity:.86;transition:opacity var(--dur-4),color var(--dur-4)}
.mf-tag-word:hover,.mf-tag-word:focus-visible{opacity:1;color:var(--accent);outline:none}
.mf-tag-word.is-top{opacity:1;font-weight:600}
.mf-tag-word.is-picked{color:var(--accent);opacity:1}
.mf-shelf-tools{display:flex;align-items:center;gap:var(--space-2);margin-left:auto}
.mf-filter-panel [data-shelf-character]:not([data-shelf-character=""])[aria-current="true"],.mf-filter-panel [data-shelf-clan]:not([data-shelf-clan=""])[aria-current="true"],.mf-tag-word.is-picked{padding:0 var(--space-2);border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:999px;background:var(--accent-soft);color:var(--accent-strong)}
.mf-filter-panel [data-shelf-character]:not([data-shelf-character=""])[aria-current="true"]::after,.mf-filter-panel [data-shelf-clan]:not([data-shelf-clan=""])[aria-current="true"]::after,.mf-tag-word.is-picked::after,.mf-filter-panel .site-tab[aria-current="true"]:not([data-shelf-period="all"])::after{content:'×';margin-left:var(--space-1);font-weight:700}
.mf-tag-up{font-size:10px;margin-left:2px;color:var(--icon-ok);font-weight:600}
@media(max-width:640px){.mf-filter-panel{grid-template-columns:1fr;gap:var(--space-1)}.mf-filter-key{margin-top:var(--space-2)}.mf-tag-words{--tag-word-h:32px}.mf-shelf-title{font-size:18px}}

/* ЗАКРЫТО ДЛЯ РЕГИОНА (09.10, `блокСтраны`): экран вместо страницы. */

/* Строка над работами автора (19.10, владелец 11:13: «шапка испорчена»): облако тегов слева, тихая кнопка повтора
 * справа — шапка автора та же, что в профиле, без вставок. */
.mf-author-bar{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3) var(--space-5);margin:0 0 var(--space-4)}
.mf-author-bar>.mf-author-tags{flex:999 1 480px;min-width:0;margin:0}
.mf-author-follow{flex:0 0 auto;display:inline-flex;align-items:center;gap:var(--space-1);min-height:var(--tap);padding:0 var(--space-5);border:0;border-radius:var(--ui-radius);background:var(--accent);color:var(--on-gold);font:inherit;font-weight:var(--fw-title);cursor:pointer;white-space:nowrap}
.mf-author-follow[aria-pressed="true"]{background:none;border:var(--border);color:inherit;font-weight:400}
.mf-author-follow[hidden]{display:none}
/* СВЯЗЬ МЕЖДУ АВТОРАМИ (19.10, макет «Author page — related authors»): «Similar handwriting» под работами автора и
 * «Similar from other authors» в просмотрщике. */
.mf-similar{max-width:var(--wrap-max);margin:0 auto var(--space-6);padding:var(--space-5) var(--space-5) 0;box-sizing:border-box}
.mf-similar>.mf-similar-title{padding-top:var(--space-5);border-top:var(--border)}
.mf-similar-title{margin:0 0 var(--space-4)}
.mf-similar-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-4)}
@media(max-width:640px){.mf-similar-grid{grid-template-columns:1fr}}
.mf-similar-card{display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-4);border:var(--border);border-radius:var(--ui-radius);background:var(--surface)}
.mf-similar-head{display:flex;gap:var(--space-3);align-items:center;color:inherit;text-decoration:none}
.mf-similar-avatar{width:48px;height:48px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:var(--soft);font-weight:var(--fw-title);font-size:20px;flex-shrink:0}
.mf-similar-who{display:flex;flex-direction:column;min-width:0}
.mf-similar-sub{color:var(--muted);font-size:var(--small)}
.mf-similar-shots{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-1)}
.mf-similar-shots img{width:100%;height:96px;object-fit:cover;border-radius:8px;background:var(--soft)}
.mf-similar-chips{display:flex;flex-wrap:wrap;gap:var(--space-1)}
.mf-similar-chip{font-size:var(--small);border:var(--border);border-radius:6px;padding:2px 8px}
.mf-similar-open{font-size:var(--small)}
/* СЕРИИ АВТОРА (19.10): те же карточки, что «похожий почерк», над работами; карточка — кнопка отбора по тегу. */
.mf-series{max-width:var(--wrap-max);margin:0 auto;padding:var(--space-5) var(--space-5) 0;box-sizing:border-box}
.mf-series-card{font:inherit;color:inherit;text-align:start;cursor:pointer}
.mf-series-card:hover{border-color:var(--accent)}
/* На телефоне серии — строка из трёх: одно превью и слово, без стопки во весь экран. */
@media(max-width:640px){.mf-series .mf-similar-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2)}.mf-series-card{padding:var(--space-2)}.mf-series-card .mf-similar-shots{grid-template-columns:1fr}.mf-series-card .mf-similar-shots img:nth-child(n+2){display:none}}
/* ЛЕНТА «ПОДПИСКИ» (19.10, макет «Following feed»): вкладки, строка авторов, метка NEW, «N new» в шапке. */
.mf-feed-tabs{display:flex;gap:var(--space-5);border-bottom:var(--border);margin:0 0 var(--space-4)}
.mf-feed-tabs[hidden]{display:none}
.mf-feed-tabs button{appearance:none;background:none;border:0;border-bottom:2px solid transparent;padding:var(--space-3) 0;min-height:var(--tap);color:var(--muted);font:inherit;cursor:pointer}
.mf-feed-tabs button[aria-pressed="true"]{color:inherit;border-bottom-color:var(--accent);font-weight:var(--fw-title)}
.mf-feed-new,.mf-nav-new{display:inline-block;margin-left:var(--space-1);padding:0 7px;border-radius:9px;background:var(--accent);color:var(--on-gold);font-size:11px;font-weight:var(--fw-title);line-height:18px}
.mf-feed-new[hidden]{display:none}
.mf-follow-strip{display:flex;gap:var(--space-4);overflow-x:auto;padding:0 0 var(--space-4);margin:0 0 var(--space-4)}
.mf-follow-strip[hidden]{display:none}
.mf-follow-author{flex:0 0 84px;display:flex;flex-direction:column;align-items:center;gap:var(--space-1);color:inherit;text-decoration:none;text-align:center}
.mf-follow-avatar{width:64px;height:64px;border-radius:16px;display:flex;align-items:center;justify-content:center;background:var(--soft);border:var(--border);font-weight:var(--fw-title);font-size:24px}
.mf-follow-author.has-new .mf-follow-avatar{border:2px solid var(--accent)}
.mf-follow-name{font-size:var(--small);line-height:1.2;max-width:84px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-follow-note{font-size:11px;color:var(--muted)}
.mf-follow-author.has-new .mf-follow-note{color:var(--accent)}
.mf-follow-find{flex:0 0 auto;align-self:flex-start;display:flex;align-items:center;justify-content:center;min-height:64px;padding:0 var(--space-4);border:1px dashed var(--line);border-radius:16px;color:var(--muted);font-size:var(--small);text-decoration:none}
.mf-is-new{outline:2px solid var(--accent);outline-offset:-2px}
.mf-is-new::after{content:'NEW';position:absolute;left:10px;bottom:34px;padding:2px 6px;border-radius:6px;background:var(--accent);color:var(--on-gold);font-size:11px;font-weight:var(--fw-title);pointer-events:none}

/* ЛЕНТА С КОНЦОМ И КНОПКА «НАВЕРХ» (20.10, владелец: «до низа листать очень долго… подняться вверх одним кликом»).
   «Показать ещё» — после трёх автоматических страниц, по центру под лентой (feed-more.js). «Наверх» — круг справа
   внизу, появляется после двух экранов (to-top.js); над нижней полосой браузера телефона. */
.mf-feed-more{display:flex;margin:var(--space-5) auto;min-width:min(100%,var(--action-width))}
.mf-to-top{position:fixed;right:var(--space-4);bottom:calc(var(--space-4) + env(safe-area-inset-bottom));z-index:var(--layer-menu);width:var(--control);height:var(--control);border-radius:50%;border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-modal);cursor:pointer}
.mf-to-top[hidden]{display:none}
.mf-to-top svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
