/* Tangazo — язык дизайна, макеты 2026-09-13.
   Один CSS на все страницы веба; те же числа — во Flutter. Шкалы, токены и компоненты — docs/03-design/design-system.md (S2-99).
   Ограничения: без JS, без веб-шрифтов, все размеры в rem — уважаем системный размер шрифта. */

:root {
  color-scheme: dark light;
  /* тёмная тема — основная */
  --bg: #1B1614;        /* фон */
  --surface: #241E1B;   /* поверхность карточки, полосы, поля ввода */
  --line: #3A312C;      /* разделители */
  --text: #E4DBCF;      /* основной текст, ≈13:1 на фоне. Было #F1E9DE (14,9:1) — правка владельца
                           2026-10-12 с телефона: белый, особенно с жирными вставками, «режет»; яркость чуть ниже */
  --muted: #B5A797;     /* метаданные, 7,6:1 */
  --faint: #948779;     /* подписи, 5,1:1 */
  --wine: #D47A8C;      /* ТОЛЬКО интерактив: ссылки, рамки кнопок, 5,9:1 */
  --wine-fill: #8E2F44; /* заливка главной кнопки; текст на ней — --on-wine, 6,6:1 */
  --brass: #D9B77A;     /* ТОЛЬКО ●✓ и слово «проверено», 9,4:1 */
  --pending: #E0B45E;   /* ТОЛЬКО «не опубликовано» в подаче: полоса, слово, недостающее поле (S2-108) */
  --pending-bg: #3A2E1E; /* фон подтверждения на карточке подачи */
  /* Шаг вертикального ритма (S2-81, концепция 16.10 §11). ВСЕ вертикальные отступы
     и межстрочные gap пишутся calc(var(--space) * k), k из шкалы 0.25 / 0.5 / 0.75 / 1 / 1.5 / 2 / 2.5:
     «просторнее или плотнее» меняется здесь одним числом, а не правкой сотни мест.
     На телефоне шаг крупнее — медиазапрос ниже. Шаг 1,1rem, а не 1rem: владелец хотел
     «чуть больше нынешних» (S2-81), и при 1,1 ни один прежний отступ не стал меньше:
     строка ленты 1,1 → 1,1, заголовок раздела 2,25 → 2,75 и подвал 2,5 → 2,75 (k = 2.5 —
     единственный добавленный шаг; при k = 2 они стали бы 2,2). Исключение — чип: 0,3 → 0,275.
     Страж — backend/tests/test_css_spacing_guard.py */
  --space: 1.1rem;
  /* Типошкала (S2-99, docs/03-design/design-system.md): ПЯТЬ кеглей на весь сайт,
     других font-size в файле нет — страж test_css_spacing_guard.py. 15 px — минимум. */
  --fs-s: 0.9375rem;   /* 15 — подписи, метаданные, чипы, подсказки */
  --fs-m: 1rem;        /* 16 — текст, дата дня ленты */
  --fs-l: 1.125rem;    /* 18 — строка ленты, значения полей, адрес, подзаголовки */
  --fs-xl: 1.375rem;   /* 22 — город, заголовок раздела текста */
  --fs-xxl: 1.625rem;  /* 26 — h1 антиквой */
  /* Цвета вне палитры тем — тоже только токенами (одни в обеих темах). */
  --on-wine: #F1E9DE;              /* текст и бегунок на винной заливке, 6,6:1 */
  --shadow: rgb(0 0 0 / 0.35);     /* тень плавающего «+» и листа снизу */
  --scrim: rgb(0 0 0 / 0.5);       /* затемнение под листом и диалогом */
}
@media (max-width: 40rem) {
  :root { --space: 1.2rem; }
}
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) {
    --bg: #F7F1E8; --surface: #FFFFFF; --line: #E2D8CB;
    --text: #221B17; --muted: #5E5148; --faint: #74675D;
    --wine: #8E2F44; --wine-fill: #8E2F44; --brass: #7A5A1C;
    --pending: #8F5A0B; --pending-bg: #F6E7CC;
  }
}
:root[data-theme="light"] {
  color-scheme: light; /* выбор в профиле — и для полей ввода и прокрутки браузера (S2-81) */
  --bg: #F7F1E8; --surface: #FFFFFF; --line: #E2D8CB;
  --text: #221B17; --muted: #5E5148; --faint: #74675D;
  --wine: #8E2F44; --wine-fill: #8E2F44; --brass: #7A5A1C;
  --pending: #8F5A0B; --pending-bg: #F6E7CC;
}
/* Тёмная по выбору: палитра — та же, что у :root; меняется только схема браузера.
   Системная тема (нет data-theme) остаётся `dark light` из :root. */
:root[data-theme="dark"] { color-scheme: dark; }

/* ---------- база ---------- */
/* Поля и кнопки не берут кегль браузера (≈ 13 px у <select> и <button>) — мельче 15 нет нигде (S2-99). */
button, input, select, textarea { font: inherit; }
html { font-size: 100%; -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--text);
  font: var(--fs-m)/1.55 system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  padding: 0 1rem calc(var(--space) * 2); max-width: 40rem; margin-inline: auto;
  hyphens: manual; overflow-wrap: break-word; /* без переносов по слогам (владелец 03.11: «переносы внутри слова убрать, везде»); одно длинное слово на крупном шрифте всё равно не ломает ширину */
}
h1, h2.serif, .city { font-family: ui-serif, Georgia, "Times New Roman", serif; font-weight: 600; letter-spacing: 0; }
h1 { font-size: var(--fs-xxl); line-height: 1.15; margin: calc(var(--space) * 1.5) 0 calc(var(--space) * 1.5); }
/* Абзацы и блоки — с воздухом между ними (правка владельца 2026-10-12: на телефоне текст
   сливался). Строки ленты и поля карточки задают свои отступы классами и этим не задеты. */
p { margin: calc(var(--space) * 0.75) 0; }
section { margin: calc(var(--space) * 1.5) 0; }
/* Заголовок без сироты и без слога на переносе: строки выравниваются по длине,
   одно слово на последней строке не остаётся (ux-pass 19.10, чек-лист взгляда). */
h1, h2, h3 { text-wrap: balance; hyphens: manual; }
h2 { font-size: var(--fs-xl); line-height: 1.25; margin: calc(var(--space) * 1.5) 0 calc(var(--space) * 0.5); }
h3 { font-size: var(--fs-l); line-height: 1.3; }
ul:not([class]) > li { margin: calc(var(--space) * 0.5) 0; } /* только простые списки текста: у ленты строки стыкуются рамками */
/* Жирное внутри абзаца на тёмном фоне «светится» сильнее обычного текста — полужирный мягче. */
p b, li b { font-weight: 600; }
/* Рамочные блоки держат свои плотные отступы: общий отступ абзаца раздувал «Вечер отменён»
   и плашки вдвое (ревью 2026-10-12). */
:is(.warn, .stale, .status, .claim, .mine, .revoke) > p { margin: calc(var(--space) * 0.25) 0; }
/* Язык ссылок (S2-92, вариант D концепции 18.10 §4): активное — винный, остальное — текст.
   По умолчанию ссылка — в ПРОЗЕ: винная и подчёркнутая (WCAG 1.4.1: в сплошном тексте
   одного цвета мало). Навигация «куда перейти» — винная без подчёркивания: ОДНО
   контейнерное правило ниже, а не класс у каждой ссылки. Действия («Поправить», кнопки,
   «+») — винная заливка или рамка. Веса у навигации нет: «нажимается» несёт цвет. */
a { color: var(--wine); text-decoration: underline; text-underline-offset: 0.15em; }
:is(.top, .chips, .place__more, .place__addr, .soon, .event-head h1, .club, .club__addr, .blk__v, .trust__src, .trust__edit, .footer-links, .cities, .candidates, .sources__list) a {
  color: var(--wine); text-decoration: none;
}
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible { outline: 3px solid var(--wine); outline-offset: 2px; }
.muted { color: var(--muted); }
.faint { color: var(--faint); }
.small { font-size: var(--fs-s); } /* 15 px — минимум, мельче нет */
.brass { color: var(--brass); }
.nowrap { white-space: nowrap; }
hr { border: 0; border-top: 1px solid var(--line); margin: var(--space) 0; }

/* ---------- шапка страницы ---------- */
.top { display: flex; justify-content: space-between; align-items: baseline; gap: calc(var(--space) * 0.25) 1rem; padding: 0 0 var(--space); flex-wrap: wrap; }
/* Шапка ленты (S2-81, концепция §1.1): «Милонги — Город» слева, иконка профиля справа.
   Город — ссылка на /cities; пунктир — рамка, а не подчёркивание текста: знак «нажимается»
   у заголовка, который иначе ссылкой не читается. */
.top--feed { align-items: center; flex-wrap: nowrap; }
.top--feed h1 { margin: 0; min-width: 0; }
.top h1 a { position: relative; font-size: inherit; font-weight: inherit; border-bottom: 1px dotted var(--faint); }
/* Зона тапа города ≥ 44px по высоте — невидимой областью, а не отступом: padding сдвинул
   бы пунктир вниз от букв. */
.top h1 a::after { content: ""; position: absolute; inset: -0.6rem 0; }
.icon-btn { flex: none; display: grid; place-items: center; width: 2.75rem; height: 2.75rem; margin-right: -0.6rem; color: var(--wine); }
.icon-btn svg { width: 1.5rem; height: 1.5rem; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
/* Плавающий «+» — «Принести анонс» (S2-81): действие, поэтому винная заливка. Стоит
   у правого края КОЛОНКИ (на десктопе колонка 40rem по центру, а не у края окна),
   над безопасной зоной телефона. Страница с ним получает запас снизу, иначе «+»
   закрыл бы последнюю строку. */
.fab {
  position: fixed; z-index: 10; bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
  right: max(calc(1rem + env(safe-area-inset-right, 0px)), calc((100vw - 40rem) / 2));
  width: 3.5rem; height: 3.5rem; border-radius: 50%; display: grid; place-items: center;
  background: var(--wine-fill); color: var(--on-wine); text-decoration: none;
  box-shadow: 0 0.4rem 1rem var(--shadow);
}
/* «+» — линейная иконка, как профиль в шапке, а не глиф шрифта: глиф добавлял странице
   шестой кегль (32 px) мимо типошкалы (S2-99). */
.fab svg { width: 1.75rem; height: 1.75rem; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round;
}
/* Запас снизу — по размеру кнопки (3,5rem + её отступ), а не шаг ритма: от --space не зависит.
   Во встроенном режиме приложения (`?app=1`) «+» не рисуется вовсе — и запаса нет. */
body:has(> .fab) { padding-bottom: 6rem; }
/* Выбор города `/cities` (S2-81): список ссылок-навигации, строка — зона тапа. */
.cities { list-style: none; margin: calc(var(--space) * 0.5) 0 var(--space); padding: 0; }
.cities li { font-size: var(--fs-l); border-bottom: 1px solid var(--line); }
.cities a { display: block; padding: calc(var(--space) * 0.75) 0; }
/* Шапка, открывающая страницу («← Tangazo»), не липнет к краю экрана телефона (правка владельца 2026-10-12). */
body > .top:first-child { padding-top: calc(var(--space) * 1.5); }
.city { font-size: var(--fs-xl); margin: 0; }
.top a { font-size: var(--fs-s); }
/* «← назад» в шапке — ячейка 44 px по высоте: отступ внутрь и столько же наружу
   отрицательным полем, чтобы шапка не выросла и строка не сдвинулась (ux-pass 19.10). */
.top > a:not(.icon-btn) { padding-block: 0.65rem; margin-block: -0.65rem; }
.section { font-size: var(--fs-s); color: var(--muted); text-transform: none; margin: calc(var(--space) * 2.5) 0 calc(var(--space) * 0.5); }

/* ---------- строка ленты ---------- */
.feed { list-style: none; margin: 0; padding: 0; }
/* Ячейка в три строки (`S2-111`, концепция 27.10 §4, вариант Б владельца): время
   и название (до двух строк) со счётом «N идут» справа · где · кто и вход. Цель —
   8–10 милонг на экран 390 px; подписей полей нет, «Иду» в строке нет. */
.row { position: relative; border-top: 1px solid var(--line); padding: calc(var(--space) * 0.5) 0; display: grid; gap: 0; --row-label: 3.25rem; }
.row:last-child { border-bottom: 1px solid var(--line); }
.row > * { margin: 0; }
/* Колонка времени (`--row-label`) задаёт левый край: название и строки «где»
   и «кто» начинаются от одного края. Название — не больше двух строк, дальше «…».
   Вся ячейка — одна ссылка на вечер (`S2-92`, концепция 18.10 §4): ссылка
   заголовка растянута на ячейку невидимым `::after` от `.row`, а «N идут»
   лежит слоем выше (`z-index`). Винное в ячейке одно — «время + название»;
   время обычного веса, название полужирное. Крупный текст телефона: названию
   оставлено не меньше 12rem со временем, иначе «N идут» уходит строкой ниже, вправо. */
.row__head { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 0 0.75rem; font-size: var(--fs-l); font-weight: 600; line-height: 1.3; color: var(--wine); }
.row__head a { flex: 1 1 12rem; min-width: 0; display: grid; grid-template-columns: var(--row-label) minmax(0, 1fr); column-gap: 0.5rem; color: inherit; text-decoration: none; }
.row__head a::after { content: ""; position: absolute; inset: 0; }
.row__time { font-weight: 400; font-variant-numeric: tabular-nums; }
.row__title { font-weight: 600; overflow-wrap: anywhere; hyphens: manual; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; }
.row--cancelled .row__title { text-decoration-line: line-through; }
/* «N идут» — одной строкой справа от названия; тап — лист «Кто идёт». Тап-зона
   44px по высоте при любом корне — полями, погашенными таким же отрицательным полем
   (строку не сдвигает, ux-pass 19.10). Селектор с `>`: правило `.row__head a`
   (сетка ссылки вечера, винный цвет) иначе легло бы и на счёт. Вверх зона растёт ровно на верхний отступ
   строки — в соседний вечер не заходит; остаток — вниз, на правый край строки «где»
   своего же вечера (ревью `S2-111`). */
.row__head > .row__who { flex: none; display: block; margin-left: auto; position: relative; z-index: 1; padding: 0 0 0 0.5rem; padding-top: calc(var(--space) * 0.5); margin-top: calc(var(--space) * -0.5); padding-bottom: calc(44px - 1.3em - var(--space) * 0.5); margin-bottom: calc(var(--space) * 0.5 + 1.3em - 44px); color: var(--muted); text-decoration: none; font-size: var(--fs-s); font-weight: 400; line-height: 1.3; white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Строки «где» и «кто»: от края названия, одной строкой каждая, дальше «…»;
   полностью — на странице вечера. */
.row__line, .row__role { margin-left: calc(var(--row-label) + 0.5rem); font-size: var(--fs-s); line-height: 1.35; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.row__date { font-size: var(--fs-s); color: var(--muted); }
.row__state { font-weight: 600; color: var(--text); }
/* Строки «Ритма» (`rhythm.html`) — прежнего вида: голова строкой, поля подписью
   слева колонкой (`--row-label`), фраза «по расписанию» мелким `--faint`. Макрос
   `_event_row.html` этих классов с `S2-111` не рисует. */
.row__body .row__head { display: block; }
.row__body .row__title { display: inline; overflow: visible; }
.row__facts { display: grid; grid-template-columns: var(--row-label) minmax(0, 1fr); gap: calc(var(--space) * 0.25) 0.75rem; font-size: var(--fs-s); line-height: 1.35; }
.row__facts dt { color: var(--faint); }
.row__facts dd { margin: 0; color: var(--muted); hyphens: manual; }
.row__sched { font-size: var(--fs-s); color: var(--faint); }
/* Строки «Ритма» (`rhythm.html`) — прежнего вида: вся ячейка ссылкой, время
   и название одной строкой. Не лента вечеров — макрос `_event_row.html` их не рисует. */
.row > a { display: block; color: inherit; text-decoration: none; }
.row__body { display: grid; gap: calc(var(--space) * 0.25) 0; }
.row__body > * { margin: 0; }
.row__body .row__time { margin-right: 0.25rem; }

/* ---------- карточка вечера ---------- */
.state { font-size: var(--fs-s); font-weight: 600; margin: calc(var(--space) * 0.75) 0 0; }
.state--verified { color: var(--brass); }
.origin { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.25) 0 calc(var(--space) * 0.75); }
.origin a { color: var(--wine); }
.origin__status { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * -0.5) 0 calc(var(--space) * 0.75); font-style: italic; }
.when small { font-size: var(--fs-s); font-weight: 400; color: var(--muted); display: block; margin-top: calc(var(--space) * 0.25); }

.claim { background: var(--surface); border: 1px solid var(--line); padding: calc(var(--space) * 0.75) 1rem; margin: var(--space) 0; }
.claim__head { font-weight: 700; font-size: var(--fs-l); margin: 0; }
.claim__by { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.25) 0 calc(var(--space) * 0.75); }
.claim__by b { color: var(--text); font-weight: 600; }
.claim--confirmed .claim__head, .claim--disputed .claim__head { }
.stale { font-size: var(--fs-s); color: var(--muted); border: 1px dashed var(--line); padding: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0; }

.place { margin: var(--space) 0; }
.place__name { font-size: var(--fs-l); font-weight: 600; margin: 0; }
.place__addr { font-size: var(--fs-l); margin: calc(var(--space) * 0.25) 0 calc(var(--space) * 0.5); }
/* Страница клуба (`S2-84`): адрес — ссылка на маршрут, «›» как у строки клуба;
   ближайшие милонги — короткий список «день · время · название». */
.place__route-go { color: var(--faint); font-weight: 400; }
.place__way p { margin: calc(var(--space) * 0.25) 0 0; }
.soon { list-style: none; margin: 0; padding: 0; }
.soon li { padding: calc(var(--space) * 0.5) 0; border-bottom: 1px solid var(--line); }
/* Ссылки, стоящие отдельной строкой на страницах клуба и милонги (ближайшие вечера,
   адрес-маршрут, «Про эту площадку»), — зона нажатия 44 px. Строчная ссылка: отступ
   по вертикали растит область нажатия и не двигает строку (ux-pass 19.10). */
:is(.soon, .place__addr, .place__more) a { padding-block: 0.85rem; }
.soon__day { font-weight: 400; color: var(--muted); }
.soon__time { font-variant-numeric: tabular-nums; }
.soon__state { font-weight: 600; }
.soon__sched { font-size: var(--fs-s); color: var(--muted); }
/* Сетка со знаком — только когда знак есть (`S2-78`): без него первый абзац
   вставал в колонку 1,5rem и «Вечер отменён» читался по слогу в строке. */
.warn { font-size: var(--fs-s); padding: calc(var(--space) * 0.75) 0.75rem; border: 1px solid var(--text); margin: calc(var(--space) * 0.5) 0; }
.warn:has(> .sign) { display: grid; grid-template-columns: 1.5rem minmax(0, 1fr); gap: calc(var(--space) * 0.5) 0.5rem; }
.warn b { font-weight: 700; }
.warn .warn__head { font-size: var(--fs-l); font-weight: 700; margin: 0 0 calc(var(--space) * 0.25); }
.warn .sign { font-size: var(--fs-l); line-height: 1.2; }

.fields { list-style: none; margin: calc(var(--space) * 0.5) 0 0; padding: 0; border-top: 1px solid var(--line); }
.field { display: grid; grid-template-columns: 1fr auto; gap: calc(var(--space) * 0.25) 0.75rem; align-items: center; padding: calc(var(--space) * 0.75) 0; border-bottom: 1px solid var(--line); }
.field__label { font-size: var(--fs-s); color: var(--muted); margin: 0; grid-column: 1 / -1; }
.field__value { margin: 0; font-size: var(--fs-l); }
.field__value .unsure { color: var(--faint); font-size: var(--fs-s); }
.field__src { font-size: var(--fs-s); color: var(--faint); margin: 0; grid-column: 1 / -1; }
/* Пометка «не уверены» у своего поля и кнопки «верно»/«неверно» (`S2-24`): внутри .field — на всю ширину сетки */
.field-mark { grid-column: 1 / -1; margin: calc(var(--space) * 0.25) 0 calc(var(--space) * 0.5); }
.field-mark .actions { display: inline-flex; margin: calc(var(--space) * 0.25) 0.5rem calc(var(--space) * 0.25) 0; vertical-align: top; }
.field-mark details { display: inline-block; margin: calc(var(--space) * 0.25) 0; vertical-align: top; }
.field__acts { display: flex; flex-wrap: wrap; gap: calc(var(--space) * 0.5) 0.5rem; }
.legend { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.75) 0 calc(var(--space) * 0.25); }
.legend b { color: var(--text); font-weight: 600; }

.fresh { font-size: var(--fs-s); color: var(--muted); margin: var(--space) 0 calc(var(--space) * 0.25); }
/* Афиша вечера и лого серии (`S2-13`): вписаны целиком, без кропа (ADR-0017 п. 4). */
.poster { margin: calc(var(--space) * 1.5) 0 calc(var(--space) * 0.5); }
.poster img { display: block; width: 100%; height: auto; max-height: 70vh; object-fit: contain; border-radius: 8px; background: var(--surface); }
.poster figcaption, .logo figcaption { font-size: var(--fs-s); color: var(--faint); margin: calc(var(--space) * 0.5) 0 0; }
.poster figcaption a, .logo figcaption a { color: var(--faint); }
.logo { margin: calc(var(--space) * 1.5) 0 0; }
.logo img { display: block; width: 5rem; height: 5rem; object-fit: contain; border-radius: 8px; background: var(--surface); }
.fresh b { color: var(--text); font-weight: 600; }

/* ---------- кнопки ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; min-height: 2.75rem; min-width: 2.75rem;
  padding: 0 1rem; border-radius: 0.5rem; font: inherit; font-size: var(--fs-s); font-weight: 600; cursor: pointer;
  text-decoration: none; border: 1.5px solid var(--wine); color: var(--wine); background: transparent;
  white-space: normal; text-align: center;
}
form.inline { display: inline; margin: 0; }
.btn--secondary { border-color: var(--line); color: var(--text); }
.btn--primary { background: var(--wine-fill); border-color: var(--wine-fill); color: var(--on-wine); }
.btn--small { padding: 0 0.75rem; }
.btn--wide { width: 100%; box-sizing: border-box; }
.actions { display: flex; flex-wrap: wrap; gap: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0; }
.actions--spaced { margin-top: var(--space); } /* кнопка формы отдельно от полей (вместо inline-стилей, S2-81) */
.hint { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.25) 0 0; }
code { font: inherit; word-break: break-all; }

/* ---------- полоса «вы принесли» ---------- */
.mine { background: var(--surface); border-left: 4px solid var(--wine); padding: calc(var(--space) * 0.75) 1rem; margin: calc(var(--space) * 0.75) 0 0; }
.mine__head { font-weight: 700; font-size: var(--fs-l); margin: 0; }
.mine p { font-size: var(--fs-s); }
.mine .delta { font-size: var(--fs-m); margin: calc(var(--space) * 0.5) 0; }
.mine .delta b { font-weight: 700; }
.mine code { font: inherit; font-size: var(--fs-s); word-break: break-all; color: var(--text); }

/* ---------- форма подачи ---------- */
label { display: block; font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.75) 0 calc(var(--space) * 0.25); }
label b { color: var(--text); font-weight: 600; font-size: var(--fs-m); }
textarea, select, input[type=text], input[type=url], input[type=time], input[type=date], input[type=search] {
  width: 100%; box-sizing: border-box; font: inherit; font-size: var(--fs-l); color: var(--text); background: var(--surface);
  border: 1.5px solid var(--line); border-radius: 0.5rem; padding: calc(var(--space) * 0.75) 0.75rem; min-height: 2.75rem;
}
textarea { min-height: 9rem; resize: vertical; }
/* Поле, которое не правится (адрес опубликованной, опубликованная карточка
   `S2-101`): видно значение, но не похоже на приглашение ввести. */
input[type=text]:disabled { background: transparent; border-style: dashed; color: var(--muted); }
/* Подсказка в поле не должна читаться как введённый текст (правка владельца 2026-10-12):
   приглушённый цвет и курсив. `opacity: 1` — Firefox по умолчанию ещё и полупрозрачен. */
::placeholder { color: var(--faint); opacity: 1; font-style: italic; }
.missing { color: var(--faint); font-size: var(--fs-s); }
.toggle { display: grid; grid-template-columns: 3.25rem minmax(0, 1fr); gap: calc(var(--space) * 0.75) 0.75rem; align-items: start; margin: var(--space) 0; }
.toggle input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.toggle { position: relative; }
.toggle__box { width: 3.25rem; height: 1.9rem; border-radius: 1rem; border: 1.5px solid var(--wine); position: relative; box-sizing: border-box; margin-top: 0.15rem; }
.toggle__box::after { content: ""; position: absolute; top: 0.2rem; left: 0.2rem; width: 1.3rem; height: 1.3rem; border-radius: 50%; background: var(--wine); }
.toggle input:checked + .toggle__box, .toggle__box.on { background: var(--wine-fill); border-color: var(--wine-fill); }
.toggle input:checked + .toggle__box::after, .toggle__box.on::after { left: auto; right: 0.2rem; background: var(--on-wine); }
.toggle__text b { font-weight: 600; }
.status { background: var(--surface); border: 1px solid var(--line); padding: var(--space) 1rem; margin: var(--space) 0; }
.status--pending { border-left: 3px solid var(--pending); } /* S2-110: незаконченная подача над формой новой */
.status__head { font-size: var(--fs-l); font-weight: 600; margin: 0 0 calc(var(--space) * 0.25); }
/* Строка с галочкой или радио — ячейка не ниже 44 px: отступ внутри строки вместо поля
   снаружи, чтобы соседние строки не расходились сильнее прежнего (ux-pass 19.10). */
.checkrow { display: flex; gap: 0 0.75rem; align-items: start; min-height: 2.75rem; box-sizing: border-box; padding: calc(var(--space) * 0.5) 0; margin: 0; font-size: var(--fs-m); }
.checkrow input { width: 1.5rem; height: 1.5rem; margin: 0.05rem 0 0; flex: none; accent-color: var(--wine-fill); }
/* Карточки подачи многих милонг (`S2-101`): перечень свёрнут, строка — как
   `.field` (рамками, без плашек); открытая карточка — весом, а не цветом. */
.card-position { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.5) 0 0; }
.card-position b { color: var(--text); font-weight: 600; }
.cards { margin: calc(var(--space) * 0.5) 0 var(--space); }
.cards > summary { display: flex; align-items: center; min-height: 2.75rem; cursor: pointer; color: var(--wine); font-size: var(--fs-s); }
.cards__list { list-style: none; margin: calc(var(--space) * 0.25) 0 0; padding: 0; border-top: 1px solid var(--line); }
.cards__item { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 0.75rem; align-items: center; padding: calc(var(--space) * 0.25) 0; border-bottom: 1px solid var(--line); }
.cards__title { display: flex; align-items: center; min-height: 2.75rem; font-size: var(--fs-m); overflow-wrap: anywhere; }
.cards__item--open .cards__title { font-weight: 700; }
.cards__state { font-size: var(--fs-s); color: var(--muted); text-align: right; }
.cards__meta { grid-column: 1 / -1; margin: 0 0 calc(var(--space) * 0.25); font-size: var(--fs-s); color: var(--faint); font-variant-numeric: tabular-nums; }
.cards__undo { grid-column: 1 / -1; margin: 0 0 calc(var(--space) * 0.25); }
.bulk__item { margin: 0; padding: calc(var(--space) * 0.25) 0; border-bottom: 1px solid var(--line); }
/* Экран-список подачи (S2-108, концепция 27.10 §1): карточка, иконки слева, слово справа. */
.sub-card { border: 1px solid var(--line); border-left: 4px solid var(--line); border-radius: 0.7rem; padding: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0; background: var(--surface); min-width: 0; }
.sub-card--unpublished { border-left-color: var(--pending); }
.sub-card--past { background: transparent; color: var(--faint); }
.sub-card__title { display: block; margin: 0; font-size: var(--fs-l); font-weight: 600; line-height: 1.3; overflow-wrap: anywhere; }
a.sub-card__title { display: flex; align-items: center; min-height: 2.75rem; color: var(--wine); text-decoration: none; }
.sub-card__facts { display: grid; grid-template-columns: 3.5rem minmax(0, 1fr); gap: 0 0.75rem; margin: calc(var(--space) * 0.25) 0 0; font-size: var(--fs-s); }
.sub-card__facts dt { color: var(--faint); }
.sub-card__facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.miss { color: var(--pending); font-weight: 600; }
.sub-card__parts { margin: calc(var(--space) * 0.25) 0 0; font-size: var(--fs-s); color: var(--muted); }
.sub-card__note { margin: calc(var(--space) * 0.25) 0 0; font-size: var(--fs-s); color: var(--pending); font-weight: 600; }
.sub-card__foot { display: flex; justify-content: space-between; align-items: center; gap: calc(var(--space) * 0.25) 0.5rem; margin-top: calc(var(--space) * 0.5); }
.sub-card__why { font-size: var(--fs-s); color: var(--pending); }
.icons { display: flex; flex-wrap: wrap; align-items: center; gap: calc(var(--space) * 0.25) 0.5rem; min-width: 0; }
.icons form { margin: 0; }
.ic { flex: none; display: grid; place-items: center; width: 2.75rem; height: 2.75rem; box-sizing: border-box; padding: 0; border: 1px solid var(--line); border-radius: 0.6rem; background: var(--bg); color: var(--wine); cursor: pointer; list-style: none; }
.ic::-webkit-details-marker { display: none; }
.ic--main { background: var(--wine-fill); border-color: var(--wine-fill); color: var(--on-wine); }
.ic:disabled { color: var(--faint); opacity: 0.45; cursor: not-allowed; }
.ic svg { width: 1.25rem; height: 1.25rem; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.sub-card__revoke[open] { flex-basis: 100%; }
.st { font-size: var(--fs-s); font-weight: 600; white-space: nowrap; }
.st--unpublished { color: var(--pending); }
.st--published { color: var(--muted); }
.st--past { color: var(--faint); }
.confirm { background: var(--pending-bg); border-radius: 0.5rem; padding: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0 0; font-size: var(--fs-s); }
.confirm p { margin: 0 0 calc(var(--space) * 0.25); }
.toast { display: flex; justify-content: space-between; align-items: center; gap: calc(var(--space) * 0.25) 0.75rem; background: var(--text); color: var(--bg); border-radius: 0.6rem; padding: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0; font-size: var(--fs-s); }
.toast form { margin: 0; }
.toast button { min-height: 2.75rem; padding: 0 0.5rem; border: 0; background: transparent; color: var(--bg); font-weight: 600; text-decoration: underline; cursor: pointer; }
/* Поиск с кнопкой — одной строкой: поле тянется, кнопка рядом той же высоты. */
.search-row { display: flex; gap: 0 0.5rem; align-items: stretch; }
.search-row input { flex: 1 1 auto; min-width: 0; }
/* Раскрывашка «Ваш текст» под подачей — ячейка 44 px, треугольник браузера остаётся. */
summary.small { padding-block: 0.65rem; cursor: pointer; }
.checkrow.off { color: var(--muted); }
/* Группа радиокнопок формы обратной связи (`S2-52`) — без рамки браузера. */
fieldset.plain { border: 0; padding: 0; margin: calc(var(--space) * 0.75) 0 0; }
fieldset.plain legend { padding: 0; margin: 0 0 calc(var(--space) * 0.25); }
/* Часть милонги в форме подачи (`S2-95`): разделитель, как у блоков страницы, без рамки. */
fieldset.part { border-top: 1px solid var(--line); padding-top: calc(var(--space) * 0.5); }
/* Кнопка формы по умолчанию для Enter: вне экрана, но в форме (не `display:none`). */
.default-submit { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
/* Ловушка для ботов (`S2-52`, R-F2): вне экрана, но не `display:none` —
   такие поля боты распознают и пропускают. */
.trap { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
.checkbox { width: 1.5rem; height: 1.5rem; border: 1.5px solid var(--wine); border-radius: 0.3rem; flex: none; margin-top: 0.1rem; box-sizing: border-box; }
.checkbox.on { background: var(--wine-fill); border-color: var(--wine-fill); }

/* ---------- пустое состояние ---------- */
.quiet { padding: calc(var(--space) * 1.5) 0 calc(var(--space) * 0.5); }
.quiet h2 { font-size: var(--fs-xl); margin: 0 0 calc(var(--space) * 0.25); font-weight: 600; }
.invite { border: 1px solid var(--line); background: var(--surface); padding: var(--space) 1rem; margin: calc(var(--space) * 1.5) 0; }
.invite p { margin: 0 0 calc(var(--space) * 0.75); }
.invite .btn { margin-top: calc(var(--space) * 0.25); }
/* Возврат к подаче (S2-110): полоса над лентой вошедшего, рисует pending.js. Янтарь — «не опубликовано» в подаче */
.pending-strip { display: flex; align-items: center; column-gap: 0.5rem; border-left: 3px solid var(--pending); background: var(--surface); padding: calc(var(--space) * 0.5) 0 calc(var(--space) * 0.5) 0.75rem; margin: 0 0 var(--space); }
.pending-strip p { flex: 1; margin: 0; font-size: var(--fs-s); }
.pending-strip__hide { flex: none; display: grid; place-items: center; width: 2.75rem; height: 2.75rem; border: 0; background: none; color: var(--faint); cursor: pointer; }
.pending-strip__hide svg { width: 1.25rem; height: 1.25rem; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; }
.app-install__stores { display: flex; flex-wrap: wrap; gap: calc(var(--space) * 0.5) 0.5rem; margin: 0; } /* S3-09: кнопки магазинов в строку, переносятся целиком */

/* ---------- подвал ---------- */
footer { hyphens: manual; margin-top: calc(var(--space) * 2.5); padding-top: var(--space); border-top: 1px solid var(--line); font-size: var(--fs-s); color: var(--faint); }
/* Ячейка ссылки подвала — 44 px по высоте: строки идут вплотную, воздух между ними
   даёт сама ячейка (ux-pass 19.10). Цвет и вес — правилом навигации выше (вариант C). */
.footer-links { display: flex; flex-wrap: wrap; gap: 0 1.5rem; margin: 0; }
.footer-links a { display: inline-flex; align-items: center; min-height: 2.75rem; }
.footer-links a:last-child { white-space: nowrap; } /* подвал без переноса по слогам (hyphens у footer): слово целиком. Длинная первая ссылка на крупном шрифте переносится внутри себя — иначе горизонтальная прокрутка */

/* ---------- реквизиты владельца сайта: только на /about (S2-18) ---------- */
.owner { border-top: 1px solid var(--line); padding-top: calc(var(--space) * 0.75); }
.owner--todo { color: var(--text); }

/* ---------- служебное для листа макетов ---------- */
.sheet-label { font-size: var(--fs-s); color: var(--faint); border-bottom: 2px dashed var(--line); padding: calc(var(--space) * 2) 0 calc(var(--space) * 0.25); margin: 0 0 calc(var(--space) * 0.5); }

/* Увеличенный системный шрифт: когда ширина экрана меньше 19rem (телефон 390 px при шрифте ≥ ~135 %),
   время встаёт над названием, а не рядом — колонки в одну. Медиазапрос в rem срабатывает от размера шрифта. */
@media (max-width: 19rem) {
  .toggle { grid-template-columns: 1fr; }
  .field { grid-template-columns: 1fr; }
  .field__acts { justify-content: flex-start; }
}

/* ---------- постоянные страницы: вечер, милонга, площадка (S2-05) ----------
   Новых сущностей языка дизайна здесь нет: строка вечера, место, пометка
   и свежесть берут готовые классы выше. Добавлено ровно то, чему места
   в языке ещё не было, — список наблюдений (атрибуция, инвариант 10)
   и список частей вечера (ADR-0020). */
.rows { list-style: none; margin: 0; padding: 0; }
.upcoming h2, .sources h2, .attached h2, .trust h2, .place h2, .place__way h2 { font-size: var(--fs-l); font-weight: 600; margin: calc(var(--space) * 1.5) 0 calc(var(--space) * 0.25); }
.sources__list, .attached__list { list-style: none; margin: calc(var(--space) * 0.25) 0 0; padding: 0; font-size: var(--fs-s); }
.sources__list li, .attached__list li { padding: calc(var(--space) * 0.5) 0; border-bottom: 1px solid var(--line); }
.lead { font-size: var(--fs-l); margin: calc(var(--space) * 0.25) 0 calc(var(--space) * 0.75); }
.facts { margin: var(--space) 0; }
.facts p { font-size: var(--fs-m); margin: calc(var(--space) * 0.25) 0; }
.step { margin: var(--space) 0; font-size: var(--fs-s); }
/* Стареющая свежесть — «мягкий акцент» (F-04 §Уровни), а не красный флаг:
   данные могли и не измениться, и пугать ими человека у двери нечестно. */
.fresh--aging, .fresh--stale, .fresh--reported { color: var(--text); }
.fresh--aging b, .fresh--stale b { font-weight: 700; }

/* ---------- неделя на главной (`S2-04`) ---------- */
/* Заголовок дня ленты — только дата (S2-81, концепция 16.10 §1.2, макет v4): простой
   текст без полосы фона, без «Сегодня/Завтра», без «вы идёте» и без линии под строкой —
   линия остаётся только между строками вечеров (рамку сверху у первой строки дня снимает
   правило ниже). Липким заголовок не был и не стал. */
.day { margin: calc(var(--space) * 2) 0 calc(var(--space) * 0.25); padding: 0; }
/* Ничего неактивного не жирнее и не крупнее ссылки (концепция 18.10 §4): дата дня —
   кегль текста и 600, меньше строки вечера. */
.day__date { font-size: var(--fs-m); font-weight: 600; color: var(--text); }
.feed-day > .feed > .row:first-child { border-top: 0; } /* линии под заголовком дня нет — только между вечерами */
.section b { color: var(--text); font-weight: 600; }
.row__live { font-size: var(--fs-s); color: var(--text); font-weight: 600; }
.row__live--ended { color: var(--faint); font-weight: 400; }

.rhythm-foot { font-size: var(--fs-s); margin: calc(var(--space) * 1.5) 0 0; }

/* ---------- «Иду» страницы вечера (`S2-54`, `S2-111` — кнопка со словом) ---------- */
/* Кнопка со словом «Иду» (концепция 27.10 §4): контур винным, нажатая — залита
   винным (действие — винный, вариант C §0). Ни ✓, ни ●: они значат
   «проверено»/«подтверждено» (инвариант 8). Ширина постоянна (5,5rem): по ней
   лист «Кто идёт» выравнивается на всю ширину блока. */
.going-btn { box-sizing: border-box; width: 5.5rem; min-height: 44px; padding: 0; border: 1.5px solid var(--wine); border-radius: 999px; background: transparent; color: var(--wine); font: inherit; font-size: var(--fs-m); font-weight: 600; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.going-btn--on { background: var(--wine-fill); border-color: var(--wine-fill); color: var(--on-wine); }
.going__intro { font-size: var(--fs-s); color: var(--muted); background: var(--surface); border: 1px solid var(--line); border-radius: 0.75rem; padding: calc(var(--space) * 0.5) 0.75rem; margin: calc(var(--space) * 0.5) 0 0; }
.going__intro b { color: var(--text); font-weight: 600; }
.going { margin: calc(var(--space) * 0.5) 0 0; }
.going__bar { display: flex; flex-wrap: wrap; align-items: flex-start; gap: calc(var(--space) * 0.5) 0.75rem; }
.going__form { margin: 0; }
.going__hint { flex-basis: 100%; font-size: var(--fs-s); margin: calc(var(--space) * 0.25) 0 0; }
/* Стопка страницы вечера — `<summary>` листа «Кто идёт»: тап раскрывает
   имена или строку «Имена видят только те, кто идёт и показывает своё». */
.going__who { flex: 1 1 12rem; min-width: 0; }
.going__who > summary { display: inline-flex; align-items: center; gap: 0 0.5rem; min-height: 44px; cursor: pointer; list-style: none; color: var(--muted); font-variant-numeric: tabular-nums; }
.going__who > summary::-webkit-details-marker { display: none; }
.going__who--alone { display: inline-flex; align-items: center; gap: 0 0.5rem; min-height: 44px; margin: 0; color: var(--muted); flex: 0 1 auto; }
.going__count { font-size: var(--fs-m); }
.going__sheet { background: var(--surface); border: 1px solid var(--line); border-radius: 0.75rem; padding: calc(var(--space) * 0.5) 1rem; margin: calc(var(--space) * 0.25) 0 0; }
/* Лист — на всю ширину блока, а не под стопкой: рядом с кнопкой «Иду»
   сдвигается влево на её ширину (5,5rem, `.going-btn`) и зазор ряда. */
.going__form + .going__who .going__sheet { margin-left: calc(-5.5rem - 0.75rem); }
.going__sheet p { margin: calc(var(--space) * 0.25) 0; }
.going__sheet form { margin: calc(var(--space) * 0.5) 0 calc(var(--space) * 0.25); }
.going__stack { display: inline-flex; flex-shrink: 0; padding-left: 8px; }
/* Кружок 28px, перекрытие −8px; кольцо цвета фона разделяет соседей. */
.going__dot { width: 28px; height: 28px; margin-left: -8px; border-radius: 50%; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-s); font-weight: 700; line-height: 1; box-shadow: 0 0 0 2px var(--bg); }
.going__dot--grey { background: var(--line); border: 1.5px solid var(--faint); color: var(--text); }
/* Свой кружок темнее остальных (концепция §10 п. 1) — ставит только `going.js`. */
.going__dot--own { background: var(--muted); border-color: var(--muted); color: var(--bg); }
.going__dot--more { background: var(--surface); border: 1.5px solid var(--muted); color: var(--muted); font-size: var(--fs-s); width: auto; min-width: 28px; padding: 0 0.25rem; border-radius: 14px; }
.going__line { font-size: var(--fs-m); margin: 0; }
.going__locked { font-size: var(--fs-s); margin: calc(var(--space) * 0.25) 0 0; }

/* ---------- страница вечера (`S2-78`, `S2-83` — концепция 16.10 §2) ----------
   Шапка: «← Лента» и «Поделиться»; дата · время одной строкой (ссылка на .ics),
   название (ссылка на милонгу), клуб и короткий адрес одной строкой (ссылка
   на клуб), происхождение, «Иду». Факты — чипами, афиша миниатюрой справа.
   Подвал доверия — одна карточка. Навигационные ссылки — общим правилом `:is(...) a`. */
.top--event { align-items: center; flex-wrap: nowrap; }
.event-head { margin: calc(var(--space) * 0.5) 0 calc(var(--space) * 0.5); }
.event-head .when { font-size: var(--fs-l); font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1.3; margin: 0; }
.when__cal { display: inline-block; width: 1.05em; height: 1.05em; margin-left: 0.5rem; vertical-align: -0.12em; stroke: var(--faint); fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.event-head h1 { margin: calc(var(--space) * 0.5) 0 calc(var(--space) * 0.5); }
/* Клуб: вся строка — ссылка, «›» справа; название полужирным, адрес обычным. */
.club { font-size: var(--fs-m); line-height: 1.4; margin: 0; }
/* Блок «Где» (`S2-93`): название клуба — ссылка на клуб, адрес строкой ниже — на маршрут.
   Зона нажатия 44 px — у ссылки адреса и у «i» (ux-pass 19.10). */
.club, .club__addr { margin: 0; font-size: var(--fs-l); }
/* Ссылка, стоящая в строке одна (название, клуб, адрес, имя), — зона нажатия 44 px
   (ux-pass S2-93): строчная ссылка с отступом по вертикали — область пальца растёт,
   строка не сдвигается и длинный текст переносится как текст (зал и «i» — следом). */
:is(.event-head h1, .club, .club__addr, .blk__v) > a { padding-block: calc(var(--space) * 0.75); }
.trust__edit a { padding-block: calc(var(--space) * 0.75); }
/* Источник отдельной строкой списка бывает коротким («Ника») — ячейка 44 × 44. */
.sources__list a {
  display: inline-flex; align-items: center; min-height: 2.75rem; min-width: 2.75rem;
  max-width: 100%; box-sizing: border-box; overflow-wrap: anywhere;
}
.club__hall { color: var(--muted); margin: 0; }
p.club__hall { font-size: var(--fs-s); }
.event-head .origin { margin-top: calc(var(--space) * 0.5); }
.event-facts { display: grid; grid-template-columns: minmax(0, 1fr); gap: calc(var(--space) * 0.75) 0.75rem; align-items: start; margin: var(--space) 0; }
.event-facts--poster { grid-template-columns: minmax(0, 1fr) 6rem; }
.chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: calc(var(--space) * 0.5) 0.5rem; }
/* Длинное имя в чипе на крупном шрифте переносится внутри чипа, а не уводит страницу вбок (ux-pass 19.10). */
.chips > li { min-width: 0; max-width: 100%; }
.chip { overflow-wrap: anywhere; box-sizing: border-box; background: var(--surface); border: 1px solid var(--line); border-radius: 1rem; padding: calc(var(--space) * 0.25) 0.75rem; font-size: var(--fs-s); line-height: 1.35; }
.chip__note { color: var(--muted); }
.event-facts__note { font-size: var(--fs-s); margin: calc(var(--space) * 0.5) 0 0; }
.poster--thumb { margin: 0; }
.poster--thumb img { width: 6rem; max-height: 9rem; }
.trust { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: calc(var(--space) * 0.75) 1rem; margin: calc(var(--space) * 1.5) 0 var(--space); }
.trust .fresh { margin-top: 0; }
.trust .sources h2 { margin-top: calc(var(--space) * 0.75); }
.trust__edit { margin: calc(var(--space) * 0.5) 0 0; font-size: var(--fs-s); }
.trust__src { margin: calc(var(--space) * 0.25) 0 0; font-size: var(--fs-s); color: var(--muted); }

/* ---------- страница вечера блоками (`S2-93`, концепция 18.10 §5) ----------
   Блок — подпись мелко и значение; пустой блок не печатается (решает шаблон по
   данным). Иконок нет. Винное — только нажимаемое. */
.blocks { margin: var(--space) 0; }
.blk { margin: 0; padding: calc(var(--space) * 0.5) 0; border-bottom: 1px solid var(--line); }
.blk > p { margin: 0; }
.blk__k { font-size: var(--fs-s); color: var(--faint); }
.blk__v { font-size: var(--fs-l); }
/* Строка конца под временем блока «Когда» (`S2-91`): «до 03:00», «до последнего танцора». */
.when__end { color: var(--muted); }
.blk .origin { margin: calc(var(--space) * 0.25) 0 0; }
.blk .origin__status { margin: 0; }
.blk .going { margin: 0; }
/* «i» у адреса и организатора — на экран «Сведения и правки» к карточке поля. */
.info-i {
  display: inline-flex; align-items: center; justify-content: center; min-width: 2.75rem; min-height: 2.75rem;
  margin-left: 0.25rem; vertical-align: middle; color: var(--wine); text-decoration: none; font-weight: 600;
  margin-block: calc(var(--space) * -0.5); /* зона 44 px не раздувает строку адреса */
}
dialog:not([open]) { display: none; }

/* ---------- экран «Сведения и правки» `/e/<id>/info` (`S2-93`) ----------
   Карточка на поле: подпись · значение · мета · кнопки инлайн без обводки (винный текст). */
.info { display: grid; gap: calc(var(--space) * 0.5) 0; margin: var(--space) 0; }
.info-card { margin: 0; border: 1px solid var(--line); border-radius: 0.75rem; padding: calc(var(--space) * 0.5) 0.75rem; background: var(--surface); }
.info-card > p { margin: 0; }
.info-card__k { font-size: var(--fs-s); color: var(--faint); }
.info-card__v { font-size: var(--fs-l); }
.info-card .origin { margin: calc(var(--space) * 0.25) 0 0; }
.info-card .origin__status { margin: 0; }
.info-card__act { display: flex; flex-wrap: wrap; gap: 0 1rem; margin: calc(var(--space) * 0.25) 0 0; }
.info-card__act form { margin: 0; }
.info-card__btn {
  display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0; border: 0; background: none;
  font: inherit; color: var(--wine); text-decoration: none; cursor: pointer;
}
.info-card__btn--warn { font-weight: 600; }
.info-card__edit { border-top: 1px solid var(--line); margin: calc(var(--space) * 0.25) 0 0; }
.info-card .report { margin: calc(var(--space) * 0.25) 0 0; }
/* Лист «Кто идёт» ленты (`S2-92`): тап по стопке строки открывает `<dialog>`, список
   имён `going.js` берёт запросом от имени читателя (`/attendees`, взаимность —
   на сервере, §10.1). Отступы — у внутреннего блока: щелчок по самому `<dialog>`
   приходится только на подложку и закрывает лист. */
.who-dialog {
  width: min(28rem, calc(100vw - 2rem)); box-sizing: border-box; max-height: 85vh; overflow-y: auto;
  background: var(--surface); color: var(--text); border: 1px solid var(--line); border-radius: 0.75rem; padding: 0;
}
.who-dialog::backdrop { background: var(--scrim); }
.who-dialog__body { padding: var(--space) 1rem calc(var(--space) * 0.5); }
.who-dialog__title { font-weight: 600; margin: 0 0 calc(var(--space) * 0.5); font-variant-numeric: tabular-nums; }
.who-dialog__names { margin: 0; }
.who-dialog__note { font-size: var(--fs-s); color: var(--muted); margin: calc(var(--space) * 0.5) 0 0; }
.who-dialog__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 1rem; margin: calc(var(--space) * 0.5) 0 0; }
.who-dialog__actions a, .who-dialog__close {
  display: inline-flex; align-items: center; min-height: 44px; color: var(--wine); text-decoration: none;
}
.who-dialog__actions form { margin: 0; }
.who-dialog__close { padding: 0; border: 0; background: transparent; cursor: pointer; }
/* Общая жалоба подвала — одна ссылка «Сообщить об ошибке», раскрывается формой. */
.report > summary { display: inline-flex; align-items: center; min-height: 2.75rem; cursor: pointer; color: var(--wine); text-decoration: underline; text-underline-offset: 0.15em; }

/* Организатор одной строкой (`S2-85`, концепция 16.10 §10 п. 3): имя — кнопка
   меню поля, контакты — ссылки-действия без обводки и подчёркивания (винные:
   звонок и сообщение — действие, а не навигация), «добавить» — как они. */
.organizer__line { display: flex; flex-wrap: wrap; align-items: baseline; gap: calc(var(--space) * 0.25) 0.75rem; margin: 0; }
.organizer__label { color: var(--muted); }
.organizer__name { font-size: var(--fs-l); }
.organizer__contact, .organizer__add { text-decoration: none; font-weight: 600; }
.organizer .hint { margin: calc(var(--space) * 0.25) 0 0; }

/* Плашка согласия на Яндекс Метрику (`S2-119`): внизу экрана поверх «+»,
   пока не выбрано; две кнопки равного веса. Содержимое — колонкой ленты (40rem),
   запас под полосу жестов iPhone — высотой `::after`, а не отступом. */
.cookie-banner {
  position: fixed; z-index: 20; left: 0; right: 0; bottom: 0;
  padding: calc(var(--space) * 0.75) 1rem;
  background: var(--surface); border-top: 1px solid var(--line);
  box-shadow: 0 -0.4rem 1rem var(--shadow); font-size: var(--fs-s);
}
.cookie-banner::after { content: ""; display: block; height: env(safe-area-inset-bottom, 0px); }
.cookie-banner > * { max-width: 40rem; margin-inline: auto; }
.cookie-banner p { margin: 0 auto calc(var(--space) * 0.75); }
.cookie-banner__actions { display: flex; flex-wrap: wrap; gap: calc(var(--space) * 0.5) 0.75rem; margin: 0 auto; }
