
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(fonts/inter-400-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(fonts/inter-400-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(fonts/inter-500-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(fonts/inter-500-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(fonts/inter-600-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(fonts/inter-600-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(fonts/inter-700-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(fonts/inter-700-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Oswald';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(fonts/oswald-500-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Oswald';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(fonts/oswald-500-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Oswald';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(fonts/oswald-600-cyrillic.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: 'Oswald';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(fonts/oswald-600-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


:root{--ink:#101119;--panel:#181A24;--panel2:#1F2230;--line:#2C3040;--warm:#FFB454;--rose:#FF6B7A;
  --mint:#4ED4A0;--blue:#8AA2FF;--text:#E9EBF3;--dim:#9AA0B8;--mute:#8A90A8;--r:12px;
  /* Край того, на что нажимают. Прежний --line давал 1,3:1 к фону карточки
     при норме 3:1 — форма из восьми полей была видна только по намёку.
     Замер после: 3,3:1 в тёмной, 3,2:1 в светлой. */
  --edge:#646B85;
  /* Шкала: до этого в файле жили 25 кеглей и 14 скруглений, каждый раз
     заново придуманных. Новое пишем только этими значениями. */
  --t1:.6875rem;--t2:.75rem;--t3:.8125rem;--t4:.875rem;--t5:1rem;--t6:1.1875rem;--t7:1.625rem;
  --r1:8px;--r2:12px;--r3:16px;
  --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:24px}
/* Светлое оформление. Тёплый акцент остаётся тем же, но текстовые его версии
   затемнены — на белом #FFB454 не читается. */
body.light{
  --ink:#F4F6FA; --panel:#FFFFFF; --panel2:#EDF0F6; --line:#DBE0EA;
  /* Замер на второй заливке: было 4,32:1 у зелёного и 4,55:1 у тёплого
     при норме 4,5 — этим набраны суммы «получено» и подписи в деньгах.
     Стало 5,78:1 и 5,39:1. */
  --warm:#8A5600; --rose:#B62F42; --mint:#0E6A4B; --blue:#3A55C0;
  /* Край полей и кнопок: #8891A6 давал 2,92:1 на фоне страницы и 2,77:1
     на второй заливке при норме 3:1. Стало 3,51 и 3,33. */
  --edge:#7A8398;
  --text:#171A24; --dim:#565C71; --mute:#5C6276;
}
/* именно background-color, а не background: сокращённая запись обнуляет
   background-image, а им нарисована стрелка списка — в светлом оформлении
   список становился неотличим от обычного поля */
body.light input,body.light select,body.light textarea{background-color:#FFFFFF}
/* Было: тёмно-коричневый текст на светло-оранжевом — заказчик: «коричневый
   с чёрным не сочетаются». Стало: белым по насыщенному тёплому. */
body.light .btn.primary{background:#A85F00;border-color:#8F5000;color:#FFFFFF}
body.light .btn.primary:hover{background:#8F5000;border-color:#7A4400}
body.light .modal{background:rgba(24,28,40,.42)}
body.light .modal-box{box-shadow:0 24px 60px rgba(30,40,70,.22)}
body.light .kv{border-bottom-color:rgba(0,0,0,.09)}
body.light .side-foot{border-top-color:var(--line)}
body.light .ev-dot.tone-soon{background:#F1F4FA}
body.light .chk .box.on{color:#FFFFFF}
/* Настоящие галочки в формах рисуются через input[type=checkbox]:checked+.box —
   у него светлого переопределения не было, и в светлой теме галочка выходила
   почти чёрной на зелёном (заказчик: «чёрный с зелёным не сочетаются»). */
body.light .chk input[type="checkbox"]:checked + .box{color:#FFFFFF}
/* Тёмный глиф на тёплой заливке в светлой теме нечитаем — делаем белым (было ~2,85:1). */
body.light .q-n,body.light .lp-num{color:#fff}
body.light .pick input:checked+span,body.light .pick input:checked+span::after{color:#fff}
body.light .auth-wrap{background:radial-gradient(900px 460px at 50% -10%,rgba(255,180,84,.3),transparent 70%),var(--ink)}
body.light .mark .name{color:#12151E}
body.light .mark-sub{color:#8A5A00}
body.light .banner{color:#7A4C00}
body.light nav.menu button.on{box-shadow:inset 2px 0 0 #E09A2C}
body.light .day.today{border-color:rgba(224,154,44,.75)}
body.light .pill.warm{color:#7A4C00;background:rgba(255,180,84,.24);border-color:rgba(196,134,28,.5)}
body.light .side-card.me{border-color:rgba(224,154,44,.7);box-shadow:0 0 0 1px rgba(224,154,44,.18) inset}
.theme-fab{position:fixed;top:16px;right:16px;z-index:55;width:44px;height:40px;
  display:flex;align-items:center;justify-content:center;font-size:1.0625rem;line-height:1}
/* В светлой теме --warm тёмно-коричневый: заливка им нечитаема.
   Всё, что залито тёплым, держим фирменным оранжевым в обеих темах. */
/* Тёплая заливка — только у главного действия. Выбранный вид показываем
   так же, как в тёмной теме: спокойный фон и тёплая черта снизу. Иначе
   на «Датах» тёплым горели три разные вещи разом. */
body.light .seg button.on{background:#FFFFFF;color:#1A1D26}
body.light .ava{background:#FFB454;color:#32200A}
.bell{position:relative;flex:none;width:38px;height:38px;padding:0;display:flex;align-items:center;justify-content:center;font-size:.875rem}
.badge{position:absolute;top:-7px;right:-7px;min-width:19px;height:19px;padding:0 5px;border-radius:99px;
  /* Белое на розовом давало 2,75 к 1 — цифра читалась пятном. Берём
     тёмно-вишнёвый фон, на нём белая цифра держит норму. */
  background:#B3122A;color:#fff;font-size:.6875rem;font-weight:700;
  display:flex;align-items:center;justify-content:center;border:2px solid var(--panel)}
.notif{display:flex;gap:10px;align-items:flex-start;padding:11px 0;border-bottom:1px solid var(--line);cursor:pointer}
.notif:last-child{border-bottom:none}
.notif .dot{width:8px;height:8px;border-radius:50%;background:var(--warm);flex:none;margin-top:6px}
.notif.read .dot{background:transparent;border:1px solid var(--line)}
.notif .t{font-weight:600;font-size:.8438rem}
.notif .b{font-size:.7812rem;color:var(--dim);margin-top:2px}
.notif .w{font-size:.6875rem;color:var(--mute);margin-top:3px}

/* сет-лист длинный — не центрируем его по вертикали, иначе ломается прокрутка */
#jamScreen{align-items:flex-start;padding-top:30px;padding-bottom:60px}

.faq-q{padding:9px 0;border-bottom:1px solid var(--line);cursor:pointer;font-size:.8438rem;font-weight:600}
.faq-q:before{content:"\25B8  ";color:var(--warm)}
.faq-a{display:none;padding:0 0 10px 14px;font-size:.8125rem;color:var(--dim);line-height:1.65}
.faq-a.open{display:block}
.faq-q.open:before{content:"\25BE  "}

/* сет-лист джема: таблица с колонками по ролям — как на портале */
.filter-row{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.filter-btn{padding:7px 14px;border-radius:9px;border:1px solid var(--line);background:var(--panel2);
  color:var(--dim);font-size:.8125rem;font-weight:500}
.filter-btn.on{border-color:var(--warm);background:rgba(255,180,84,.12);color:var(--warm)}
/* Поиск по сет-листу и «Отметить все» стоят парой: рост у них один
   (поле и .btn — по 40, на телефоне по 44), ширину не задаём в разметке —
   инлайн сильнее медиа-запроса, и на телефоне ряд рассыпался бы. */
.sl-find{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.sl-find input[type=search]{max-width:280px}
@media(max-width:620px){
  /* На телефоне пара не помещается в строку: ставим друг под другом
     во всю ширину — иначе поле 280 и кнопка 176 читаются ступенькой. */
  .sl-find input[type=search],.sl-find .btn{flex:1 1 100%;max-width:none}
}
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.sl-table{border-collapse:collapse;width:100%;min-width:820px;font-size:.8125rem}
.sl-table th{text-align:left;padding:8px 10px;border-bottom:2px solid var(--line);color:var(--mute);
  font-weight:600;font-size:.7188rem;white-space:nowrap;letter-spacing:.04em;text-transform:uppercase}
.sl-table td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
/* Галочка отбора стояла в углу ячейки и не совпадала по высоте со строкой:
   заказчик увидел это первым. Своя колонка, ровно по центру. */
.sl-table th.pick-cell,.sl-table td.pick-cell{width:38px;text-align:center;padding:0;vertical-align:top}
/* Заказчик: «нажимаю — галочка не ставится». Квадрат 19×19 стоял посреди
   ячейки высотой в полторы сотни точек: промахнуться легче, чем попасть.
   Нажимаемой делаем ВСЮ ячейку — метка растягивается на неё целиком. */
/* height:100% у метки внутри ячейки таблицы не работает — ячейке высоту
   задают соседи. Растягиваем метку абсолютно: тогда нажимаемой становится
   вся колонка, от верха строки до низа. */
.sl-table td.pick-cell{position:relative}
.sl-table td.pick-cell .chk{position:absolute;inset:0;display:flex;
  align-items:flex-start;justify-content:center;padding:12px 8px;border-bottom:0;cursor:pointer}
.sl-table th.pick-cell .chk{display:flex;align-items:center;justify-content:center;
  width:100%;min-height:40px;padding:8px;border-bottom:0;cursor:pointer}
.sl-table td.pick-cell:hover .box,.sl-table th.pick-cell:hover .box{border-color:var(--warm)}
.sl-table .pick-cell .chk input[type=checkbox]{width:100%;height:100%;left:0;top:0}
/* Цвет здесь значит ровно одно. Раньше тёплым были залиты и утверждённые
   строки, и заполненные ячейки, и «состав собран», и мои фишки — таблица
   выглядела сплошным кремом, и понять по цвету было нечего.
     зелёный — готово: номер утверждён, состав собран
     тёплый  — про меня: где играю я
     серый   — обычное состояние
     блёклое — отклонён */
.sl-table tr.row-approved td:first-child{box-shadow:inset 3px 0 0 var(--mint)}
.sl-table tr.row-rejected{opacity:.5}
.sl-table tr.row-rejected .track-title{text-decoration:line-through}
.sl-table tr[draggable=true]{cursor:grab}
/* Подсветка строки — только там, где есть мышь. Айфон после нажатия
   держит строку «наведённой», и серый фон залипал на последней нажатой. */
@media(hover:hover){ .sl-table tbody tr:hover td{background:rgba(127,127,127,.06)} }
.sl-table td.cell-empty{background:rgba(127,127,127,.05)}
.sl-table td.cell-filled{background:transparent}
.sl-table td.cell-core{background:rgba(78,212,160,.06)}
.num-cell{text-align:center;font-weight:700;color:var(--dim);font-size:.9375rem;white-space:nowrap}
.drag-handle{cursor:grab;color:var(--mute)}
.track-cell{min-width:170px}
.track-title{font-weight:600;color:var(--text)}
.track-artist{font-size:.75rem;color:var(--dim)}
/* Комментарий автора («играет хасбенд», «клавиши сыграю сама») — это его
   слова, а не метка сервиса. Тёплый цвет читался как предупреждение,
   поэтому даём курсив, свой шрифт и приглушённый цвет. */
/* Комментарий автора теперь живёт в облачке у названия и строкой
   не выводится; правило оставлено для печати, где облачка нет. */
/* Имя в ячейке — кнопка: открывает карточку участника. */
.cell-open{background:none;border:none;padding:0;margin:0;color:inherit;font:inherit;
  cursor:pointer;text-align:left}
.cell-open:hover{text-decoration:underline}
/* Подпись партии («вторая гитара») — что человек играет, а не кто он.
   Свой цвет: не серый как служебное и не как имя. */
/* Подпись партии («вторая гитара») переносится по словам: с nowrap она
   растягивала колонку с 123 до 205 точек — на портале Jagger перенос разрешён. */
/* «Ритм», «Лид.гитара» — уточнение партии. Синим это был четвёртый цвет
   в таблице, где уже есть серый, зелёный и тёплый. Отделяем не цветом,
   а начертанием: приглушённый курсив. */
.cell-label{font-size:.6562rem;color:var(--mute);font-style:italic;
  white-space:normal;overflow-wrap:break-word}
/* Карандаш вместо кнопки «Изменить»: место в строке дорогое. */
.pen{background:none;border:none;padding:0 0 0 4px;margin:0;font-size:.75rem;cursor:pointer;line-height:1}
.pen:hover{filter:brightness(1.25)}
/* Облачко комментария рядом с названием номера. */
.tip.tip-bubble{width:auto;height:auto;min-width:17px;border:none;background:none;
  font-size:.8125rem;color:var(--warm);margin-left:4px}
.tip.tip-bubble:hover{color:var(--warm)}
.track-proposer{font-size:.6875rem;color:var(--mute);margin-top:3px}
.track-note{font-size:.7188rem;color:var(--rose);margin-top:3px}
/* «Состав собран» — это готовность, значит зелёный и тихий: раньше
   ярко-оранжевая плашка перетягивала внимание с названия номера. */
.core-badge{display:inline-block;font-size:.625rem;font-weight:600;color:var(--mint);
  background:rgba(78,212,160,.12);border:1px solid rgba(78,212,160,.35);
  padding:1px 7px;border-radius:10px;margin-top:3px}
/* В светлой теме зелёный на светло-зелёной заливке давал 4,2:1 — ниже нормы.
   Замер в браузере: с этим цветом 5,6:1. */
body.light .core-badge{color:#0E6A4B}
.cell-name{display:inline-flex;align-items:center;gap:4px;background:var(--panel2);border:1px solid var(--line);
  border-radius:7px;padding:2px 7px;margin:2px 3px 2px 0;font-size:.75rem}
/* настоящее имя рядом со сценическим — подсказка, а не заголовок */
.cell-real{color:var(--mute);font-size:.6875rem}
/* расшифровка цветов под фильтрами сет-листа */
.lg-bar,.lg-dim,.lg-warm,.lg-core{display:inline-block;width:10px;height:10px;border-radius:3px;
  vertical-align:-1px;margin-right:4px}
.lg-bar{background:var(--mint)}
.lg-dim{background:var(--line);opacity:.6}
.lg-warm{background:transparent;border:1.5px solid var(--warm)}
.lg-core{background:rgba(78,212,160,.18);border:1px solid rgba(78,212,160,.45)}
.cell-name.mine{border-color:rgba(255,180,84,.55);color:var(--warm)}
/* Красный крестик у каждого имени превращал таблицу в крапинку.
   Он тихий, а красным становится, когда до него дотянулись. */
.cell-x{background:none;border:none;color:var(--mute);font-size:.75rem;padding:0;cursor:pointer;line-height:1;
  transition:color .12s}
.cell-x:hover,.cell-x:focus-visible{color:var(--rose)}
/* Плюсиков в таблице по семь на строку — это самое частое, что видно,
   и самое неважное. Тёплыми они кричали громче имён и составов.
   Держим тихими, тёплый показываем только под курсором. */
.cell-add{display:inline-flex;align-items:center;justify-content:center;width:23px;height:23px;border-radius:6px;
  border:1px dashed var(--edge);background:transparent;color:var(--mute);font-size:.875rem;
  cursor:pointer;margin:2px 0;padding:0;transition:color .12s,border-color .12s,background .12s}
.cell-add:hover,.cell-add:focus-visible{border-color:rgba(255,180,84,.6);
  background:rgba(255,180,84,.12);color:var(--warm)}
/* Стрелки порядка у ведущего. Перетаскивание оставлено для мыши, но
   на тач-экране событий drag не бывает — там работают только они. */
.ord{display:inline-flex;flex-direction:column;gap:2px;margin-left:6px;vertical-align:middle}
.ord-b{background:var(--panel2);border:1px solid var(--line);color:var(--dim);
  border-radius:5px;width:24px;height:15px;line-height:1;font-size:.5625rem;padding:0;cursor:pointer}
.ord-b:hover{border-color:var(--warm);color:var(--warm)}
@media(hover:none){.drag-handle{display:none}}
.ord-b[disabled]{opacity:.3;cursor:default}
.ord-b[disabled]:hover{border-color:var(--line);color:var(--dim)}
.cell-dash{color:var(--mute)}
/* Заказчик: «в одну строку и утвердить, и отклонить». Столбиком они
   растягивали строку номера втрое; в ряд помещаются, если разрешить
   перенос и снять nowrap у ячейки. */
/* Метка состояния и «Удалить» стоят в одну строку — колонке нужно
   место под обе: 131 + 6 + 63 не влезали в 200 и переносились. */
.status-cell{min-width:240px;white-space:normal}
.status-cell > .pill,.status-cell > .pill-btn{margin-bottom:6px}
.admin-acts{display:inline-flex;flex-wrap:wrap;gap:4px;margin-top:0;vertical-align:middle}
/* .btn.sm объявлена ниже по файлу и при равной силе побеждала — поэтому
   здесь тот же вес плюс класс: иначе кнопки оставались 31 точку. */
.admin-acts .btn.sm,.status-cell .btn.sm{font-size:.6875rem;padding:0 8px;height:26px}
.track-input-row{padding:10px;border:1px solid var(--line);border-radius:10px;margin-bottom:8px;background:var(--panel2)}
/* Печать отдельным листом (printSheet): на экране лист скрыт, на бумаге —
   только он. Убирается при следующем нажатии, а не по afterprint: айфон
   присылает afterprint сразу и потом перерисовывает лист при смене
   масштаба — прежде в перерисованный лист уходила сама страница. */
#printSheet{display:none}
@media print{
  /* Прячем всё, что лежит в body рядом с листом: оболочку, окна, всплывашки.
     :not(#printSheet) даёт правилу вес id — сильнее любого .shell.on. */
  body.print-sheet > :not(#printSheet){display:none!important}
  body.print-sheet{margin:0!important;padding:0!important;background:#fff!important}
  body.print-sheet #printSheet{display:block!important;color:#000}
  .side,#themeFab,.filter-row,.cell-add,.cell-x,.admin-acts,.btn,.drag-handle,
  #jamForms,#jrText,#jamFaq,#jamRulesCard,#jamWhoCard,
  .banner,#jamHint,.hint,.page-sub{display:none!important}
  body{background:#fff!important;color:#000!important}
  .card{border:none!important;background:#fff!important;box-shadow:none!important}
  .sl-table{min-width:0;width:100%}
  .sl-table th{background:#eee!important;color:#000!important;border:1px solid #000!important}
  .sl-table td{border:1px solid #000!important;color:#000!important;background:#fff!important}
  .cell-name{background:#fff!important;border:1px solid #555!important;color:#000!important}
  .track-title,.num-cell{color:#000!important;font-weight:700}
  .pill{color:#000!important;background:#ddd!important;border-color:#999!important}
  .track-artist,.track-proposer,.track-note,.cell-dash{color:#333!important}
  /* на бумаге облачко не наведёшь — показываем комментарий текстом */
  .tip.tip-bubble{display:block!important;color:#333!important;font-size:.6875rem!important;margin:2px 0 0!important}
  .tip.tip-bubble::before{content:attr(data-t)}
  .tip.tip-bubble::after{display:none!important}
  .tip.tip-bubble .ico{display:none!important}
  .core-badge{background:#ddd!important;color:#000!important}
  .sl-table tr.row-approved td{border-top:2px solid #d39e00!important;border-bottom:2px solid #d39e00!important}
  .table-scroll{overflow:visible!important}

  /* Заказчик: «при печати лишняя первая страница и текст „Состав"
     с плюсиками». В лист уезжала вся обвязка страницы — шапка сущности,
     переключатель вкладок, поиск, отбор и полоса массовых действий.
     Печатаем только сам сет-лист. */
  .topbar,.mob-top,.tabs,.tabs-row,.tabs-sel,.seg,.plan-bar,#slBulk,
  .pick-cell,.ord,.sl-st .task-st-menu,.pen,.mn-b,.chk,
  input,select,textarea,.find-res,.eyebrow.no-print{display:none!important}
  /* Отступы страницы съедали лист и давали пустую первую страницу. */
  #main{padding:0!important;margin:0!important}
  .shell,.shell.on{display:block!important;grid-template-columns:none!important}
  .card{margin:0!important;padding:0!important}
  @page{margin:10mm}

  /* Лист «Сет-лист» собирается из одних утверждённых (printApproved),
     поэтому прятать чужие строки печатью больше не нужно. Кружок «?»
     у заголовка на бумаге ни к чему. */
  #printSheet .tip-btn,#printSheet .sl-closed{display:none!important}
  /* В листе «Сет-лист» только утверждённые — колонка «Статус» там пустая по смыслу. */
  #printSheet .status-cell,#printSheet .st-col{display:none!important}
}
/* Лист «Сет-лист» (printApproved) — своя таблица для бумаги: ширины колонок
   заданы, имена обычным текстом, строка номера не рвётся между страницами. */
#printSheet .slp,.doc-paper .slp{width:100%;border-collapse:collapse;table-layout:fixed;
  font-size:.75rem;line-height:1.3;color:#000}
#printSheet .slp th,.doc-paper .slp th{font:600 .6875rem/1.2 Inter,Arial,sans-serif;text-transform:uppercase;
  letter-spacing:.04em;text-align:left;background:#eee;border:1px solid #999;padding:4px 5px;
  -webkit-print-color-adjust:exact;print-color-adjust:exact}
#printSheet .slp td,.doc-paper .slp td{border:1px solid #999;padding:4px 5px;vertical-align:top;overflow-wrap:break-word}
#printSheet .slp thead,.doc-paper .slp thead{display:table-header-group}
#printSheet .slp tr,.doc-paper .slp tr{break-inside:avoid;page-break-inside:avoid}
#printSheet .slp .slp-n,.doc-paper .slp .slp-n{text-align:center;font-weight:700;font-size:.875rem}
#printSheet .slp .slp-t b,.doc-paper .slp .slp-t b{font-size:.8125rem}
#printSheet .slp .slp-a,.doc-paper .slp .slp-a{color:#444;font-size:.6875rem}
#printSheet .slp .slp-c,.doc-paper .slp .slp-c{color:#555;font-style:italic;font-size:.6875rem;margin-top:2px}
#printSheet .slp .slp-p+.slp-p,.doc-paper .slp .slp-p+.slp-p{margin-top:3px}
#printSheet .slp .slp-st,#printSheet .slp .slp-lbl,.doc-paper .slp .slp-st,.doc-paper .slp .slp-lbl{color:#555;font-size:.625rem}
#printSheet .slp .slp-lbl,.doc-paper .slp .slp-lbl{font-style:italic}
/* 1004: окно листа на телефоне (docView) — белый лист в обеих темах,
   таблица листается вбок внутри него, страница не уезжает. */
.doc-acts{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 8px}
.doc-hint{margin:0 0 12px}
.doc-paper{background:#fff;color:#000;border:1px solid var(--line);border-radius:10px;
  padding:14px;overflow-x:auto;-webkit-overflow-scrolling:touch}
.doc-paper .slp{min-width:620px}
/* у th своя тусклая краска из общей таблицы — на белом листе она не читается */
.doc-paper .slp th{color:#333}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--ink);color:var(--text);font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-size:.875rem;line-height:1.5;-webkit-font-smoothing:antialiased}
button,input,select,textarea{font-family:inherit;font-size:.875rem;color:inherit}
button{cursor:pointer}
:focus-visible{outline:2px solid var(--warm);outline-offset:2px}
/* Значок пункта меню — приглушённый и одного тона; у выбранного пункта
   он перекрашивается вместе с текстом. Разноцветные эмодзи рябили:
   зелёная галка у «Задач» читалась как «всё выполнено». */
nav.menu .mi{filter:grayscale(1);opacity:.72;transition:filter .12s,opacity .12s;
  width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 18px}
nav.menu button.on .mi,nav.menu button:hover .mi{filter:none;opacity:1}
/* линейные значки красятся цветом пункта — поэтому им ни серости, ни прозрачности */
nav.menu .mi svg{width:18px;height:18px;display:block}
/* Значок нарисован в currentColor, поэтому цвет ему задаётся одной строкой.
   В покое — тот же серый, что и подпись пункта; при наведении и у выбранного
   пункта — тёплый: заказчик просил, чтобы он тогда был цветным. */
nav.menu .mi:has(svg){filter:none;opacity:1}
nav.menu button.on .mi svg,nav.menu button:hover .mi svg{color:var(--warm)}

.eyebrow{font-size:.6875rem;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);font-weight:600}
/* Название карточки было мельче и бледнее её содержимого: 11px прописными
   против 14px текста. Заголовок карточки — отдельное дело от мелкой подписи. */
.card > .eyebrow:first-child{font-size:.8125rem;letter-spacing:.04em;color:var(--dim);font-weight:700}
/* Счётчик в заголовке — кружок ростом с «?», а не полноразмерная метка:
   обычная метка наезжала на соседний значок и ломала строку. */
.eyebrow .pill{display:inline-flex;align-items:center;justify-content:center;
  min-width:16px;height:16px;padding:0 4px;font-size:.6562rem;font-weight:700;
  letter-spacing:0;border-radius:999px;vertical-align:middle;line-height:1;
  color:var(--dim);background:var(--panel2);border:1px solid var(--line);
  margin:0 3px;position:relative;top:-1px}
.eyebrow .pill.warm{color:var(--warm);border-color:rgba(255,180,84,.45)}
.eyebrow .pill.mint{color:var(--mint);border-color:rgba(78,212,160,.45)}
/* Флекс на заголовке делать нельзя: текст становится отдельным элементом
   строки, и на узком экране заголовок разъезжается на три строки.
   Достаточно, чтобы счётчик был маленьким и стоял по центру строки. */
/* Кружок «?» рядом с заголовком: подсказку читают один раз, поэтому она
   не занимает места, но всегда под рукой. */
/* Подсказка при наведении: пояснение не занимает места в форме,
   но всегда под рукой. На телефоне открывается по нажатию. */
.tip{position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:15px;height:15px;margin-left:5px;border-radius:50%;border:1px solid var(--line);
  background:var(--panel2);color:var(--mute);font-size:.625rem;font-weight:700;cursor:help;
  vertical-align:middle;line-height:1;user-select:none}
.tip:hover{border-color:var(--warm);color:var(--warm)}
/* Кружок съезжал на пиксель вниз в надзаголовках и заголовках разделов.
   vertical-align:middle равняет середину значка по середине СТРОЧНОЙ буквы,
   а там всё набрано прописными — их середина выше на (cap−x)/2 ≈ 0.1em.
   Правим только эти два места: в подписях полей текст обычный, и там
   middle как раз верен. Замер: было +1px, стало 0. */
.eyebrow .tip,.page .tip{top:-.1em}
/* Подсказка висела внутри окна с прокруткой и обрезалась его краем —
   текст был виден наполовину. Держим её в верхнем слое экрана, координаты
   ставит tipMove() при наведении. */
/* text-transform и letter-spacing наследовались от .eyebrow, и подсказка
   выходила капсом вразрядку — читать её было тяжело. */
.tip::after{content:attr(data-t);text-transform:none;letter-spacing:0;
  font-weight:400;font-family:Inter,system-ui,sans-serif;color:var(--text);
  position:fixed;left:var(--tx,50%);top:var(--ty,0);
  transform:translate(-50%,-100%);width:max-content;max-width:min(300px,calc(100vw - 48px));padding:9px 11px;
  background:var(--panel2);border:1px solid var(--line);border-radius:9px;
  font-size:.7812rem;line-height:1.5;
  text-align:left;white-space:normal;opacity:0;visibility:hidden;transition:opacity .12s;
  box-shadow:0 12px 34px rgba(0,0,0,.5);z-index:60;pointer-events:none}
.tip:hover::after,.tip:focus::after{opacity:1;visibility:visible}
/* если места сверху нет — показываем под значком */
.tip.tip-down::after{transform:translate(-50%,0)}

/* Тёплым было покрашено семь разных смыслов сразу. Ссылка — синяя,
   тёплый остаётся за главным действием и за «вас ждут». */
/* У <button> текст по умолчанию по центру. Пока название влезало в строку,
   это было не видно; двухстрочное («Музыка из фильмов, мультфильмов и игр»)
   встало посередине колонки. inherit — чтобы ссылка вела себя как текст вокруг. */
.link-btn{background:none;border:0;padding:0;margin:0;color:var(--blue);cursor:pointer;
  font:inherit;text-align:inherit;text-decoration:underline;text-underline-offset:2px}

code{background:var(--panel2);border:1px solid var(--line);border-radius:5px;
  padding:1px 5px;font-size:.75rem;font-family:ui-monospace,Menlo,Consolas,monospace}
.display{font-family:Oswald,sans-serif;font-weight:600;letter-spacing:.02em;text-transform:uppercase}

.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;
  background:radial-gradient(900px 460px at 50% -10%,rgba(255,180,84,.16),transparent 70%),var(--ink)}
.auth{width:100%;max-width:400px}

/* ---------- СТАРТОВАЯ СТРАНИЦА ----------
   Первое, что видит человек с улицы: чем это ему поможет, и рядом —
   вход с регистрацией, чтобы не искать кнопку. */
.lp{display:block;align-items:stretch;padding:0;overflow-x:hidden}
/* справа всегда держим место под уголок с переключателем оформления —
   он висит поверх страницы и иначе накрывает кнопку «Войти» */
.lp-top{max-width:1180px;margin:0 auto;padding:20px 70px 20px 24px;display:flex;align-items:center;
  justify-content:space-between;gap:16px;flex-wrap:wrap}
.lp-top .mark .name{font-size:1.625rem}
.lp-top .mark-sub{margin:0 0 0 8px;font-size:.6875rem}
.lp-nav{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.lp-nav a{color:var(--dim);text-decoration:none;font-size:.8438rem}
.lp-nav a:hover{color:var(--text)}

/* Снимки сервиса на витрине: три экрана в ряд, на телефоне — один
   под другим. Показываем настоящие страницы, а не рисунки. */
.lp-shots{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;max-width:1180px;margin:0 auto}
.lp-shots figure{margin:0}
.lp-shots img{width:100%;height:auto;border-radius:12px;border:1px solid var(--line);display:block}
.lp-shots figcaption{font-size:.7812rem;color:var(--dim);margin-top:8px;line-height:1.5}
.lp-hero{max-width:1180px;margin:0 auto;padding:26px 24px 40px;display:grid;
  grid-template-columns:minmax(0,1.15fr) minmax(0,400px);gap:44px;align-items:start}
.lp-h1{font-family:Oswald,sans-serif;font-size:clamp(30px,4.4vw,52px);line-height:1.06;
  font-weight:600;margin:10px 0 16px;letter-spacing:.005em}
.lp-lead{color:var(--dim);font-size:1rem;line-height:1.65;margin:0 0 18px;max-width:560px}
.lp-lead b{color:var(--text)}
.lp-ticks{list-style:none;padding:0;margin:0 0 24px;display:grid;gap:9px}
.lp-ticks li{position:relative;padding-left:26px;color:var(--dim);font-size:.9062rem;line-height:1.5}
.lp-ticks li::before{content:"✓";position:absolute;left:0;top:0;color:var(--warm);font-weight:700}
.lp-cta{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.lp-note{color:var(--mute);font-size:.7812rem}
.lp-auth{max-width:400px;margin:0;position:sticky;top:20px}


.lp-sec{max-width:1180px;margin:0 auto;padding:14px 24px 52px}
.lp-h2{font-family:Oswald,sans-serif;text-transform:uppercase;letter-spacing:.03em;
  font-size:clamp(21px,2.6vw,30px);font-weight:600;margin:0 0 20px}

.lp-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.lp-step{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:22px;position:relative}
.lp-step h3{font-size:1.0312rem;margin:12px 0 8px}
.lp-step p{color:var(--dim);font-size:.875rem;line-height:1.6;margin:0}
.lp-num{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;
  border-radius:50%;background:var(--warm);color:#241703;font-weight:700;font-size:.9375rem}


.lp-plans{display:flex;gap:14px;flex-wrap:wrap;margin-top:18px}
.lp-plan{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px 24px;
  min-width:170px}
.lp-plan .p-n{color:var(--mute);font-size:.6875rem;letter-spacing:.14em;text-transform:uppercase}
.lp-plan .p-v{font-family:Oswald,sans-serif;font-size:1.875rem;font-weight:600;margin:6px 0 2px}
.lp-plan .p-d{color:var(--dim);font-size:.7812rem}

.lp-foot{max-width:1180px;margin:0 auto;padding:26px 24px 44px;border-top:1px solid var(--line);
  color:var(--mute);font-size:.7812rem;text-align:center;line-height:1.9}
.lp-foot a{color:var(--mute);text-decoration:none}
.lp-foot a:hover{color:var(--dim)}

/* Экраны бывают всякие: от узкого телефона до широкого монитора.
   Ломаем макет по содержимому, а не по «модным» размерам устройств. */

/* широкий монитор: не растягиваем текст в бесконечную строку */
@media(min-width:1500px){
  .lp-top,.lp-hero,.lp-sec,.lp-foot{max-width:1320px}
}

/* планшет в альбомной и узкий ноутбук: две колонки ещё держатся,
   но кабинет сужаем, чтобы заголовок не переносился по слогам */
@media(max-width:1180px){
  .lp-hero{grid-template-columns:minmax(0,1fr) minmax(0,340px);gap:32px}
}

/* планшет книжной: кабинет уезжает под текст */
@media(max-width:980px){
  .lp-hero{grid-template-columns:minmax(0,1fr);gap:28px;padding-bottom:32px}
  .lp-auth{position:static;max-width:520px}
  .lp-steps{grid-template-columns:repeat(2,minmax(0,1fr))}
  .lp-sec{padding-left:20px;padding-right:20px}
  .lp-hero,.lp-foot{padding-left:20px;padding-right:20px}
  .lp-top{padding-left:20px}
}

/* большой телефон и маленький планшет */
@media(max-width:720px){
  .lp-top{padding-top:16px;padding-bottom:14px}
  .lp-top .mark .name{font-size:1.375rem}
  .lp-top .mark-sub{font-size:.625rem}
  .lp-nav{gap:14px}
  .lp-nav a{font-size:.7812rem}
  .lp-steps{grid-template-columns:minmax(0,1fr)}
  .lp-lead{font-size:.9375rem}
  .lp-ticks li{font-size:.875rem}
  .lp-sec{padding-bottom:38px}
  /* нарисованную карточку даты на узком не сжимаем до нечитаемого,
     а даём прокрутить вбок — так видно, что внутри */
  .lp-svg{min-width:620px}
}

/* телефон */
@media(max-width:560px){
  /* Прячем только пункты меню. Кнопка входа остаётся: вернувшийся клиент
     не должен прокручивать весь первый экран, чтобы найти форму.
     Пишем через .lp-nav — у .btn правило display стоит ниже по файлу
     и при равной силе побеждало бы оно. */
  .lp-nav a{display:none}
  .lp-nav .lp-enter{display:inline-flex}
  .lp-top{gap:10px}
  .lp-auth{max-width:none}
  .lp-plans{gap:10px}
  .lp-plan{flex:1 1 140px;min-width:0;padding:16px 18px}
  .lp-plan .p-v{font-size:1.5625rem}
  .lp-cta .btn{width:100%}
  .lp-note{width:100%}
  .lp-sec,.lp-hero,.lp-foot{padding-left:16px;padding-right:16px}
  .lp-top{padding-left:16px}
  .lp-card,.lp-step{padding:18px}
  .lp-foot{font-size:.75rem}
}

/* очень узкий (iPhone SE и подобные) */
@media(max-width:380px){
  .lp-h1{font-size:1.625rem}
  .lp-top .mark .name{font-size:1.25rem}
  .lp-plan{flex:1 1 100%}
}

/* низкий экран в альбомной ориентации: липкий кабинет только мешает */
@media(max-height:620px){
  .lp-auth{position:static}
}
.mark{display:flex;align-items:center;gap:10px}
.mark .dot{width:9px;height:9px;border-radius:50%;background:var(--warm);box-shadow:0 0 16px var(--warm)}
.mark .name{font-family:Oswald,sans-serif;font-size:2.125rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;line-height:1}
.mark-sub{font-family:Oswald,sans-serif;font-size:.8125rem;letter-spacing:.22em;text-transform:uppercase;color:var(--warm);margin:0 0 12px 19px}

/* знак в шапке бокового меню */
.brand{display:flex;align-items:center;gap:9px;padding:0 4px 12px;border-bottom:1px solid var(--line);margin-bottom:2px}
.brand img{width:30px;height:30px;border-radius:8px;flex:none}
.brand .b1{font-family:Oswald,sans-serif;font-size:.9375rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;line-height:1}
.brand .b2{font-family:Oswald,sans-serif;font-size:.6562rem;letter-spacing:.2em;text-transform:uppercase;color:var(--warm);margin-top:3px;line-height:1}
.auth-sub{color:var(--dim);margin-bottom:22px;font-size:.8438rem}
.card+.card{margin-top:14px}
/* внутри сетки карточки стоят рядом, а не друг под другом — отступ там лишний
   и опускал правую колонку на 14 точек ниже левой на каждом таком экране */
.grid>.card+.card{margin-top:0}
/* кружок под фотографию: кликается, при наведении подсвечивается */
/* строка сущности в переключателе */
.sp-row{display:flex;align-items:center;gap:12px;width:100%;margin-bottom:8px;padding:11px 12px;
  background:var(--panel2);border:1px solid var(--line);border-radius:11px;color:var(--text);
  cursor:pointer;font:inherit}
.sp-row:hover{border-color:var(--mute)}
/* Длинное описание в списках режем двумя строками: иначе один многословный
   артист занимает пол-окна, а соседние строки читаются как одна каша. */
.clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35}
.sp-row.on{border-color:var(--warm)}
/* карточка тарифа: одинаковая высота, видно, что на неё жмут */
.plan-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  min-height:74px;padding:12px 8px;background:var(--panel2);border:1px solid var(--line);
  border-radius:11px;color:var(--text);cursor:pointer;font:inherit;text-align:center}
.plan-btn:hover{border-color:var(--warm)}
.plan-btn .display{font-family:Oswald,sans-serif;font-size:1.125rem;line-height:1}
/* версия сервиса — тихо, в углу */
/* Прозрачность поверх приглушённого цвета роняла контраст до 2,7:1.
   Приглушать надо самим цветом — тогда и норма держится. */
.ver{position:fixed;right:10px;bottom:8px;z-index:6;background:var(--ink);padding:2px 6px;border-radius:6px;font-size:.6562rem;color:var(--mute);
  pointer-events:none;z-index:5;letter-spacing:.04em}
/* На телефоне уголок с версией ложился поверх полосы прокрутки таблиц.
   Метка нужна для проверки сборки, поэтому не прячем, а сдвигаем в поток. */
@media(max-width:820px){
  .ver{position:static;display:block;text-align:center;margin:14px auto 22px;width:max-content}
}
.photo-pick{cursor:pointer;overflow:hidden;position:relative;transition:box-shadow .15s}
.photo-pick:hover{box-shadow:0 0 0 2px var(--warm)}
.card-open{cursor:pointer;transition:border-color .15s}
.card-open:hover{border-color:var(--warm)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:18px}
.field{margin-bottom:14px}
.field label{display:block;font-size:.75rem;color:var(--dim);margin-bottom:6px}
input,select,textarea{width:100%;background:var(--ink);border:1px solid var(--edge);border-radius:9px;
  padding:10px 12px;color:var(--text);box-sizing:border-box;line-height:1.35}
/* Поля той же высоты, что и кнопки: ряд из кнопки и поля был лесенкой. */
input:not([type=checkbox]):not([type=radio]),select{height:40px}
table input:not([type=checkbox]),table select{height:33px;padding:5px 9px;font-size:.8125rem}
/* Подсказку в пустом поле браузер красит своим серым — он не из нашей палитры
   и читается как уже вписанное значение. Задаём свой цвет явно. */
input::placeholder,textarea::placeholder{color:var(--mute);opacity:1}
/* Список рисуется системой и потому выходил другого роста и с чужой стрелкой.
   Убираем системный вид и рисуем свою — тогда список ровно как поле ввода. */
select{appearance:none;-webkit-appearance:none;-moz-appearance:none;
  padding-right:34px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--dim) 50%),
                   linear-gradient(135deg,var(--dim) 50%,transparent 50%);
  background-position:calc(100% - 17px) calc(50% + 1px), calc(100% - 12px) calc(50% + 1px);
  background-size:5px 5px, 5px 5px;
  background-repeat:no-repeat}
select:hover{border-color:var(--mute)}
select option{background:var(--panel);color:var(--text)}
textarea{height:auto;min-height:84px}
input:focus,select:focus,textarea:focus{border-color:var(--blue);outline:none}
.btn{background:var(--panel2);border:1px solid var(--edge);border-radius:9px;color:var(--text);font-weight:500;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;height:40px;padding:0 14px;line-height:1;
  text-decoration:none;box-sizing:border-box;vertical-align:middle}
.btn{transition:background .12s,border-color .12s,transform .06s}
.btn:hover{border-color:var(--mute)}
.btn:active{transform:translateY(1px)}
.seg button,nav.menu button,.tabs button{transition:background .12s,color .12s}
.seg button:active,.tabs button:active{transform:translateY(1px)}
.btn.primary{background:var(--warm);border-color:var(--warm);color:#241703;font-weight:600}
.btn.ghost{background:transparent}
/* Кнопка-переключатель в ряду обычных кнопок: «Я играю» в шапке сет-листа.
   Тёплая заливка тут не годится — она за главным действием; берём тот же
   тихий вид, что у отборов (.filter-btn.on). */
.btn.on{border-color:var(--warm);background:rgba(255,180,84,.12);color:var(--warm)}
.btn.sm{height:32px;padding:0 11px;font-size:.7812rem}
.btn.full{width:100%;display:flex}
.btn.danger{color:var(--rose)}
/* решение, о котором нельзя не заметить: чёрный список */
/* Состояние, а не действие: без рамки, тише — чтобы не путалось с кнопкой. */
.pill.state{border-color:transparent;background:transparent;color:var(--mute);padding-left:0}
/* Названия сторон переносим только по разделителю, а не посреди слова. */
.side-line{overflow-wrap:normal;word-break:keep-all}
/* «В прошлый раз»: .kv расталкивал пару по краям (замер: 424–506 точек
   пустоты), и выводы начинались в трёх разных местах. Дата — своей
   колонкой, выводы — единым левым краем. */
/* Значение в «Коротко о дате» — обычным цветом; карандаш при наведении.
   Шесть синих подчёркиваний подряд читались как ссылки наружу. */
.task-st{display:inline-flex;align-items:center;gap:5px;flex-wrap:wrap}
.task-st-menu{display:inline-flex;gap:5px;flex-wrap:wrap}
.card-open:focus-visible,.kan-card:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.dup-row{border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:12px;background:var(--panel2)}
.dup-why{font-size:.7188rem;letter-spacing:.06em;text-transform:uppercase;color:var(--warm);
  font-weight:700;margin-bottom:10px}
.dup-pair{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.dup-side{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px}
@media(max-width:620px){ .dup-pair{grid-template-columns:minmax(0,1fr)} }
.res-other{margin-top:5px;font-size:.75rem;color:var(--mute);display:flex;flex-direction:column;gap:2px}
.res-other b{color:var(--dim)}
.past-row{display:grid;grid-template-columns:minmax(200px,280px) 1fr;gap:16px;
  align-items:start;padding:8px 0;border-bottom:1px solid var(--line)}
.past-row:last-child{border-bottom:none}
@media(max-width:620px){ .past-row{grid-template-columns:minmax(0,1fr);gap:4px} }
/* В строке отбора четыре элемента шли тремя высотами (42/40/32).
   У .seg своя рамка, поэтому кнопкам внутри даём 38 — внешняя станет 40. */
.list-filters .seg{height:40px;vertical-align:middle}
.list-filters .seg button{height:38px;line-height:2.375rem}
/* Высота как у соседних вкладок: 32 против 41 читалось как чужая кнопка,
   да и пальцем в неё попадали хуже. */
/* Ряд вкладок листается вбок, и «＋ ещё» оказывалась за краем: на новой
   дате скрыто пять вкладок, а вернуть их нечем. Липнет к правому краю. */
.tab-add{background:var(--panel);border:1px dashed var(--line);color:var(--mute);border-radius:8px;
  padding:0 10px;height:41px;font:inherit;font-size:.7812rem;cursor:pointer;margin-left:6px;white-space:nowrap;
  align-self:center;position:sticky;right:0;z-index:2;box-shadow:-10px 0 12px var(--panel)}
.tab-add:hover{color:var(--text);border-color:var(--edge,var(--line))}
.sheet-poster{display:block;max-width:220px;max-height:150px;width:auto;height:auto;
  border-radius:8px;border:1px solid var(--line);margin:0 0 10px}
@media print{ .sheet-poster{max-width:150px;max-height:110px} }
/* Рамка обнимает саму картинку: при width:100% вертикальная афиша
   (штатный случай) сжималась внутри коробки и по бокам оставались поля. */
.poster-wrap{margin-top:10px;border-radius:10px;overflow:hidden;border:1px solid var(--line);
  background:var(--panel2);width:max-content;max-width:100%}
.poster-img{display:block;max-width:100%;max-height:420px;width:auto;height:auto;cursor:zoom-in}
/* Пустая афиша держит место, и файл можно бросить мышью. */
.poster-drop{margin-top:10px;border:1px dashed var(--line);border-radius:10px;min-height:180px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  color:var(--mute);font-size:.8438rem;text-align:center;padding:16px;transition:.15s}
.poster-drop.over{border-color:var(--warm);color:var(--text);background:var(--panel2)}
/* Кружок «?», который открывает окно (у обычного .tip окна нет). */
/* Договорённости, взаиморасчёт и билеты — рядом, а не простынёй.
   На узком экране встают друг под друга. */
/* На телефоне полоса вставала столбиком 195×203 посреди экрана и
   накрывала форму: ширина считалась по содержимому, а номер сборки
   в <b> не переносится. Делаем полосой во всю ширину. */
@media(max-width:620px){
  .newbuild{left:8px;right:8px;transform:none;width:auto;max-width:none;
    justify-content:space-between;font-size:.7812rem;padding:10px 12px}
  .newbuild b{white-space:nowrap}
}
/* Где я: раздел крупно, сущность рядом мелко. */
.mt-where{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.15;overflow:hidden}
.mt-where b{font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mt-where i{font-style:normal;font-size:.6875rem;color:var(--mute);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Колокольчик и тема есть в верхней полосе — в ящике они дублировались. */
@media(max-width:900px){ .side-only{display:none} }
/* Заказчик: «условия и билеты — одинакового размера облачками».
   Поэтому здесь stretch, а не start: карточки равняются по высоте. */
.deal-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  gap:14px;align-items:stretch;margin-bottom:14px}
.deal-row > .card{margin:0}
.settle-line{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;padding:12px 14px}
.settle-txt{flex:1 1 240px;min-width:0;font-size:var(--t5)}
@media(max-width:820px){ .deal-row{grid-template-columns:minmax(0,1fr)} }
.tip-btn{width:18px;height:18px;border-radius:50%;border:1px solid var(--edge);
  background:var(--panel2);color:var(--mute);font-size:.6875rem;line-height:1;cursor:pointer;
  padding:0;margin-left:6px;position:relative;top:-.1em;vertical-align:middle}
.tip-btn:hover{color:var(--text);border-color:var(--mute)}
.tip-btn::after{content:"";position:absolute;inset:-11px}
.perk-list{margin:8px 0 4px;padding-left:20px;display:flex;flex-direction:column;gap:8px;color:var(--dim);font-size:.875rem;line-height:1.5}
.perk-list b{color:var(--text)}
.btn.danger-solid{border-color:var(--rose);color:var(--rose);background:rgba(255,107,122,.10);font-weight:600}
.btn.danger-solid:hover{background:rgba(255,107,122,.18);border-color:var(--rose)}
/* Прозрачность поверх тёплой заливки давала грязно-коричневый прямоугольник —
   похоже на сбой, а не на запрет. Задаём цвета явно. */
.btn[disabled],.btn[disabled]:hover{background:var(--panel2);border-color:var(--line);
  color:var(--mute);cursor:default;opacity:1;box-shadow:none;transform:none}
/* Переключатель видов: одна рамка, кнопки одной высоты, без эмодзи в две строки */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--panel2);flex:none}
/* Внутри 38, а не 40: у .seg своя рамка в 1px с каждой стороны, и внешняя
   высота должна совпасть с кнопкой рядом — 40. Иначе переключатель на два
   пикселя выше соседних кнопок, и ряд читается как неровный. */
.seg button{background:none;border:none;color:var(--dim);font:inherit;font-size:.8125rem;font-weight:500;
  padding:0 15px;height:38px;line-height:2.375rem;cursor:pointer;white-space:nowrap}
.seg button+button{border-left:1px solid var(--line)}
.seg button:hover{color:var(--text)}
/* Тёплая заливка остаётся только за главным действием. Выбранное состояние
   показываем рамкой и плотностью: раньше на экране «Задачи» тёплыми были
   одновременно вид, отбор и кнопка «Новая задача». */
.seg button.on{background:var(--panel);color:var(--text);font-weight:600;
  box-shadow:inset 0 -2px 0 var(--warm)}
/* всё, что стоит в шапке рядом с переключателем, той же высоты */
.topbar .btn,.topbar .btn.sm{height:40px;padding:0 15px;font-size:.8125rem}
.tabs2{display:flex;gap:4px;background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:3px;margin-bottom:16px}
.tabs2 button{flex:1;background:none;border:none;padding:8px;border-radius:8px;color:var(--dim);font-size:.8438rem;
  transition:background .12s,color .12s}
/* 124: активная вкладка входа отличалась почти неразличимо, а это первый
   экран сервиса. Добавляем тёплую черту и жирный текст. */
.tabs2 button.on{background:var(--panel);color:var(--text);font-weight:650;
  box-shadow:inset 0 -2px 0 var(--warm)}
.msg{font-size:.7812rem;margin-top:10px;min-height:16px}
.msg.err{color:var(--rose)}
.msg.ok{color:var(--mint)}
.hint{font-size:.7812rem;color:var(--mute);margin-top:14px;text-align:center}

.shell{display:none;min-height:100vh;grid-template-columns:238px 1fr}
.shell.on{display:grid}
/* Страницы по публичной ссылке (лист дня, райдер, страница клуба) рисуются
   в тот же #main, а он лежит ВНУТРИ .shell — при display:none у оболочки
   человек видел белый лист. Показываем оболочку одной колонкой, без меню. */
.shell.bare{display:block}
.shell.bare > .side{display:none}
.side{background:var(--panel);border-right:1px solid var(--line);padding:16px 12px;display:flex;flex-direction:column;gap:14px;
  position:sticky;top:0;height:100vh;overflow:hidden}
.ws{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px;text-align:left;width:100%;color:var(--text)}
.ws:hover{border-color:var(--mute)}
.ws .lbl{font-size:.6562rem;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);font-weight:600}
.ws .nm{font-weight:600;font-size:.8438rem;margin-top:3px;display:flex;justify-content:space-between;gap:6px;align-items:center}
.ws .nm>span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
/* padding-bottom: без него последний пункт («Помощь») обрезался посередине
   на невысоких окнах, и раздел просто не находили */
/* Ссылка на другие приложения — в самом низу меню, отдельно от пунктов:
   это уход с сайта, а не раздел сервиса. */
/* 1040: значок в тексте растёт вместе с текстом — в метках, надзаголовках
   и строках связи смайлики заменены значками сайта. В кнопках — 15 точек. */
.ico{width:1.15em;height:1.15em;flex:none;vertical-align:-.18em}
.btn .ico{width:15px;height:15px;vertical-align:middle}
.theme-fab .ico,.lp-theme .ico,#themeJam .ico,#themeBtn .ico{width:17px;height:17px}
/* новое в чате даты — тёплым, как раньше цветной смайлик */
.ev-dot .t .ico,.cal-row-t .ico,.span-name .ico{color:var(--warm)}
.btn .ico{margin-right:-1px}
.menu-out{display:flex;align-items:center;gap:10px;margin-top:10px;padding:9px 10px;
  border-top:1px solid var(--line);color:var(--mute);font-size:.7812rem;text-decoration:none}
.menu-out:hover{color:var(--warm)}
nav.menu{display:flex;flex-direction:column;gap:2px;overflow-y:auto;min-height:0;flex:1;padding-bottom:14px;
  /* у краёв прокрутки строка не обрубается, а растворяется — сразу видно,
     что список продолжается за границей */
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 18px,#000 calc(100% - 22px),transparent 100%);
  mask-image:linear-gradient(180deg,transparent 0,#000 18px,#000 calc(100% - 22px),transparent 100%)}
.menu-group{display:flex;flex-direction:column;gap:2px}
.menu-group+.menu-group{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}

nav.menu button{display:flex;align-items:center;gap:10px;background:none;border:none;border-radius:9px;padding:9px 10px;text-align:left;color:var(--dim);font-size:.8438rem;width:100%}
nav.menu button:hover{background:var(--panel2);color:var(--text)}
nav.menu button.on{background:var(--panel2);color:var(--text);font-weight:600;box-shadow:inset 2px 0 0 var(--warm)}
.side-foot{margin-top:auto;border-top:1px solid var(--line);padding-top:12px}

/* Разделы меню сворачиваются по одному: у кого-то полтора десятка пунктов,
   а работает он каждый день с двумя. Заголовок раздела — кнопка. */
.menu-title{display:flex;align-items:center;gap:6px;width:100%;background:none;border:none;
  cursor:pointer;text-align:left;font:inherit;font-size:.625rem;letter-spacing:.14em;
  text-transform:uppercase;color:var(--mute);font-weight:600;padding:4px 10px 6px;border-radius:7px}
.menu-title:hover{color:var(--text);background:var(--panel2)}
.menu-title .arw{margin-left:auto;font-size:.6875rem;transition:transform .15s}
.menu-group.fold .menu-title .arw{transform:rotate(-90deg)}
.menu-group.fold .menu-items{display:none}
.menu-title .cnt{font-size:.6875rem;letter-spacing:0}
/* цифра у пункта меню: сколько непрочитанного в чате, сколько задач висит */
.menu-items .cnt{margin-left:auto;min-width:18px;height:18px;padding:0 5px;border-radius:99px;
  display:inline-flex;align-items:center;justify-content:center;font-size:.6562rem;font-weight:700;
  background:var(--panel2);color:var(--dim)}
.menu-items .cnt.warm{background:var(--warm);color:#241703}
.menu-items .cnt.rose{background:var(--rose);color:#2A0A0E}
/* «Вас ждут» — тот же красный, что у колокольчика: это один и тот же
   сигнал, и цвет должен быть один. В светлой теме тёплая заливка
   (#9A6000) с тёмной цифрой читалась как коричневое пятно — цифры
   в ней было не разобрать. */
.menu-items .cnt.alert{background:var(--rose);color:#2A0A0E}
body.light .menu-items .cnt.alert{color:#fff}
body.light .menu-items .cnt.warm{color:#fff}
body.light .menu-items .cnt.rose{color:#fff}
/* ---- чат команды и обсуждение задачи ---- */
.chat-card{display:flex;flex-direction:column}
.chat-scroll{max-height:min(58vh,520px);overflow-y:auto;display:flex;flex-direction:column;gap:8px;
  padding:4px 2px 8px}
.msg-row{display:flex;gap:8px;align-items:flex-end}
.msg-row.mine{justify-content:flex-end}
.msg-ava{flex:0 0 auto;width:30px;height:30px;border-radius:50%;overflow:hidden;
  background:var(--panel2);display:flex;align-items:center;justify-content:center;
  font-size:.6875rem;font-weight:700;color:var(--dim)}
.msg-ava img{width:100%;height:100%;object-fit:cover;display:block}
.msg-bubble{display:inline-block;max-width:min(78%,560px);background:var(--panel2);
  border:1px solid var(--line);border-radius:12px;padding:7px 11px 5px;position:relative}
.msg-row.mine .msg-bubble{background:rgba(255,180,84,.13);border-color:rgba(255,180,84,.35)}
.msg-who{display:block;font-size:.7188rem;font-weight:600;color:var(--warm);margin-bottom:2px}
.msg-text{display:block;font-size:.8438rem;line-height:1.45;word-break:break-word}
.msg-time{display:block;font-size:.6562rem;color:var(--mute);margin-top:3px;text-align:right}
.chat-send{display:flex;gap:8px;align-items:flex-end;border-top:1px solid var(--line);padding-top:10px}
/* Приход и расход в карточке даты: две широкие колонки, на узком экране
   друг под другом. Раньше это была .grid.g2 внутри правой половины экрана —
   на строку оставалось меньше трети ширины. */
/* Свёрнутая карточка: виден только заголовок. Нажимается он же. */
/* Метки в заголовке («период», название сущности) не переносились и при
   длинных значениях наезжали на само название — заказчик прислал снимок
   «СВОД ЗА ПЕРИОД». Разрешаем перенос, стрелка сворачивания остаётся
   справа на первой строке. */
.card > .eyebrow.fold-h{cursor:pointer;user-select:none;display:flex;align-items:center;
  gap:6px;flex-wrap:wrap;row-gap:4px}
.card > .eyebrow.fold-h .pill{max-width:100%;overflow:hidden;text-overflow:ellipsis}
.card > .eyebrow.fold-h::after{content:"▾";margin-left:auto;font-size:.875rem;opacity:1;
  transition:transform .15s}
.card.fold > .eyebrow.fold-h::after{transform:rotate(-90deg)}
/* !important обязателен: у части блоков display задан прямо в разметке,
   а встроенный стиль сильнее любого правила из таблицы. */
.card.fold > *{display:none!important}
.card.fold > .eyebrow.fold-h{display:flex!important}
.card.fold{padding-top:14px;padding-bottom:14px}
/* Карточка даты в первом экране: то, что покупают, видно за две секунды. */
.lp-right{display:flex;flex-direction:column;gap:14px}
.lp-mini{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;
  box-shadow:0 18px 40px rgba(0,0,0,.25)}
.lp-mini-h{display:flex;justify-content:space-between;align-items:center;font-size:.7812rem;
  color:var(--dim);padding-bottom:10px;border-bottom:1px solid var(--line)}
.lp-mini-ok{color:var(--mint);font-weight:600}
.lp-mini-r{display:flex;justify-content:space-between;gap:10px;padding:7px 0;font-size:.8125rem;
  border-bottom:1px solid var(--line)}
.lp-mini-r b{color:var(--mute);font-weight:500;font-size:.6875rem;text-transform:uppercase;letter-spacing:.08em}
.lp-mini-t{display:flex;gap:6px;flex-wrap:wrap;padding-top:10px}
.lp-mini-t span{font-size:.6875rem;color:var(--dim);border:1px solid var(--line);
  border-radius:99px;padding:3px 9px}

/* Доказательства на витрине: обещания против живых чисел. */

/* Сезонная строка на витрине. */

/* Выступление прошло, а итогов нет: тёплая пунктирная рамка. Не красная —
   это не ошибка, а «допишите, пока помните». */
/* Деньги календарём: семь дней плюс колонка недельного итога.
   Цвет значит одно: зелёное пришло, красное ушло, тёплое ещё предстоит. */
/* Итог недели — не восьмой день: отделяем его полосой и другим фоном,
   иначе колонка читается как ещё одна дата (заказчик так и прочитал). */
.mc-head{display:grid;grid-template-columns:repeat(7,minmax(0,1fr)) 18px 124px;gap:6px;
  font-size:.6562rem;letter-spacing:.1em;color:var(--mute);margin-bottom:6px}
.mc-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr)) 18px 124px;gap:6px;margin-bottom:6px}
/* Неделя без колонки итога: семь дней. Класс, а не стиль в разметке, —
   иначе правило для телефона (два дня в ряд) перебить его не может. */
.mc-row-7{grid-template-columns:repeat(7,minmax(0,1fr))}
.mc-gap{border-right:1px solid var(--line);margin:2px 8px}
.mc-wh{text-align:right;color:var(--warm)}
.mc-day{border:1px solid var(--line);border-radius:10px;padding:6px 8px;min-height:74px;
  background:var(--panel);display:flex;flex-direction:column;gap:2px}
.mc-day.off{background:transparent;border-color:transparent}
.mc-day.has{cursor:pointer}
.mc-day.has:hover{border-color:var(--edge)}
.mc-day.now{border-color:var(--warm)}
.mc-n{font-size:.7188rem;color:var(--mute);font-variant-numeric:tabular-nums}
.mc-v{font-size:.75rem;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mc-v.in{color:var(--mint)} .mc-v.out{color:var(--rose)} .mc-v.plan{color:var(--warm);font-size:.6875rem}
/* День в окне: одно событие — одна строка, подробности разворачиваются */
.day-grp{border-bottom:1px solid var(--line)}
.day-grp:last-child{border-bottom:0}
.day-head{display:flex;width:100%;gap:12px;align-items:center;justify-content:space-between;
  background:none;border:0;color:var(--text);text-align:left;padding:10px 0;cursor:pointer;font:inherit}
.day-head .arw{display:inline-block;margin-left:8px;font-size:.625rem;color:var(--mute);transition:transform .15s}
.day-grp.open .day-head .arw{transform:rotate(180deg)}
.day-body{display:none;padding:0 0 10px 0}
.day-grp.open .day-body{display:block}
/* за что именно этот день — чтобы не открывать окно ради названия */
.mc-who{font-size:.6562rem;color:var(--mute);margin-top:auto;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.mc-week{border:0;border-radius:10px;padding:6px 10px;background:var(--panel2);
  display:flex;flex-direction:column;justify-content:center;align-items:flex-end;gap:2px;font-size:.75rem}
@media (max-width:820px){
  .mc-head{display:none}
  .mc-row,.mc-row-7{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mc-day.off{display:none}
  /* Месяц из 31 дня — это 16 рядов по два, почти все пустые: около 1200
     точек прокрутки ради нескольких дней с движением денег. На телефоне
     день без денег сворачиваем в тонкую строку. */
  .mc-row,.mc-row-7{align-items:start}
  .mc-day:not(.has):not(.now){min-height:0;padding:3px 8px;opacity:.55}
  .mc-day:not(.has):not(.now) .mc-v,.mc-day:not(.has):not(.now) .mc-who{display:none}
  .mc-gap{display:none}
  /* свод за период был на 4 точки шире своего места — крайняя цифра
     обрезалась на волосок, а на узких телефонах сильнее */
  .mc-week{grid-column:1/-1;align-items:flex-start;
    border-left:3px solid var(--warm);border-radius:8px}
  .mc-wdays{font-size:.6562rem;color:var(--mute)}
  .mc-week::before{content:"Итог недели";font-size:.6562rem;letter-spacing:.08em;
    text-transform:uppercase;color:var(--mute)}
}
/* Лист «День концерта»: две колонки на широком экране, одна на телефоне.
   При печати уходит всё лишнее — на бумаге нужен только лист. */
.sheet-head{margin:10px 0 14px}
.sheet-t{font-family:Oswald,sans-serif;font-size:1.375rem;text-transform:uppercase;letter-spacing:.01em}
.sheet-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px}
@media (max-width:820px){ .sheet-cols{grid-template-columns:minmax(0,1fr);gap:14px} }
@media print{
  body{background:#fff;color:#000}
  nav.menu,.topbar,.tabs,.ver,.no-print,.plan-bar,.banner,.sides{display:none!important}
  #main{margin:0;padding:0}
  .card.sheet{border:0;box-shadow:none;padding:0}
  .sheet-cols{grid-template-columns:1fr 1fr;gap:18px}
  .kv{break-inside:avoid}
}
/* Деньги даты одной таблицей — точно по рисунку заказчика от 12.08:
   строки без линеек, черта только после «Приход общий» и «Расход общий»,
   ИТОГ прописными и крупно. */
.mn-tab{display:grid;grid-template-columns:1fr auto auto auto;gap:0 22px;
  align-items:baseline;font-variant-numeric:tabular-nums;margin-top:10px}
.mn-tab > div{padding:6px 0;text-align:right}
.mn-tab .mn-n{text-align:left;padding-left:16px}
.mn-tab .mn-h{color:var(--mute);font-size:.6875rem;text-transform:uppercase;
  letter-spacing:.08em;padding:0 0 2px}
.mn-tab .mn-sec{grid-column:1/-1;text-align:left;
  font-family:Oswald,sans-serif;text-transform:uppercase;letter-spacing:.04em;
  color:var(--dim);padding:16px 0 4px}
.mn-tab .mn-tot{font-weight:600;padding-top:8px}
.mn-tab .mn-tot-k{text-align:left}
.mn-tab .mn-line{grid-column:1/-1;height:1px;background:var(--line);padding:0;margin:8px 0 0}
.mn-tab .mn-fin{font-family:Oswald,sans-serif;font-size:1.1875rem;text-transform:uppercase;
  letter-spacing:.03em;padding-top:12px}
/* Факт отделён вертикальной чертой — так просил заказчик. */
.mn-tab .mn-f{border-left:1px solid var(--line);padding-left:22px}
.mn-tab .mn-act{white-space:nowrap;padding-left:10px}
/* Кнопки строки маленькие: раньше это были .btn sm, и они распирали
   колонку, сдвигая цифры факта относительно итогов. */
.mn-b{width:26px;height:26px;padding:0;line-height:1;font-size:.75rem;
  background:none;border:1px solid var(--line);border-radius:7px;color:var(--dim);
  cursor:pointer;margin-left:4px}
.mn-b:hover{border-color:var(--mute);color:var(--text)}
.mn-b-x:hover{border-color:var(--rose);color:var(--rose)}
@media(max-width:620px){
  .mn-tab{grid-template-columns:1fr auto auto;gap:0 12px}
  .mn-tab .mn-act{grid-column:1/-1;text-align:right;padding-top:0}
}
/* Раздел «Чаты»: список слева, переписка справа */
.chat-wrap{display:grid;grid-template-columns:270px minmax(0,1fr);gap:14px;align-items:start}
/* Кнопка возврата к списку переписок: видна только на телефоне.
   Объявляем ДО телефонного блока — при равной силе побеждает то,
   что ниже по файлу, и раньше она пряталась всегда. */
/* Кнопки во всю ширину, идущие подряд, слипались в одну деталь:
   заказчик прислал снимок, где «Вход в сервис ▾» и «Сохранить» читались
   как одна кнопка. Зазор между любыми соседними широкими кнопками. */
.btn.full + .btn.full{margin-top:8px}
.btn.full + .page-sub + .btn.full{margin-top:8px}
/* Между кнопками может стоять свёрнутый блок (display:none) — тогда они
   уже не соседи, и правило выше не срабатывает. В окнах отступ даём всем. */
.modal-box > .btn.full{margin-top:10px}
.ch-back{display:none}
.chat-side{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px}
.ch-row{display:block;width:100%;text-align:left;background:none;border:1px solid transparent;
  border-radius:9px;padding:8px 10px;cursor:pointer;color:var(--text);margin-bottom:2px}
.ch-row:hover{background:var(--panel2)}
.ch-row.on{background:var(--panel2);border-color:var(--line)}
.ch-row .ch-t{display:block;font-weight:600;font-size:.8438rem;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.ch-row .ch-s{display:block;color:var(--mute);font-size:.7188rem;margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Полоса «отвечаете на…» / «правите…» над полем ввода */
.ch-bar{display:flex;align-items:center;gap:8px;font-size:.7812rem;color:var(--dim);
  background:var(--panel2);border:1px solid var(--line);border-radius:9px;
  padding:6px 8px;margin-top:8px}
/* Цитата внутри сообщения */
.msg-quote{display:block;font-size:.75rem;color:var(--dim);border-left:2px solid var(--warm);
  padding:2px 0 2px 8px;margin-bottom:4px;opacity:.9;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.msg-quote b{color:var(--warm);margin-right:5px}
@media(max-width:900px){
  .chat-wrap{grid-template-columns:minmax(0,1fr)}
  /* Список переписок вставал над разговором и занимал до тысячи точек:
     чтобы прочитать сообщение, надо было пролистать весь список.
     На телефоне показываем что-то одно. */
  .chat-wrap.show-talk .chat-side{display:none}
  .chat-wrap.show-list .chat-card{display:none}
  .ch-back{display:inline-flex}
}
.chat-send textarea{flex:1;height:auto;min-height:41px;max-height:160px;resize:none;margin:0}
/* в таблицах поля мельче — там строка и так тесная */
table input,table select{height:33px;padding:6px 10px}
table select{padding-right:30px;background-position:calc(100% - 15px) calc(50% + 1px), calc(100% - 10px) calc(50% + 1px)}
@media(max-width:820px){ .chat-scroll{max-height:52vh} .msg-bubble{max-width:88%} }
/* ---- доска задач ---- */
.kanban{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;align-items:start}
.kan-col{background:var(--panel);border:1px solid var(--line);border-radius:13px;padding:12px}
.kan-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.kan-n{margin-left:auto;color:var(--mute);font-size:.75rem}
.kan-body{display:flex;flex-direction:column;gap:8px;min-height:40px}
.kan-card{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:11px 12px;
  cursor:pointer;transition:border-color .12s}
.kan-card:hover{border-color:var(--warm)}
@media(max-width:1100px){ .kanban{grid-template-columns:repeat(2,minmax(0,1fr))} }
@media(max-width:640px){ .kanban{grid-template-columns:minmax(0,1fr)} }

/* ---- метка-переключатель: нажал и поменял, без окна правки ---- */
/* Рамка `--line` на карточке давала 1,2:1 — метка-кнопка не читалась
   как кнопка вовсе. Берём тот же край, что у обычных кнопок. */
.pill-btn{display:inline-flex;align-items:center;height:20px;padding:0 9px;border-radius:99px;
  font-size:.6875rem;font-weight:600;letter-spacing:.01em;cursor:pointer;
  border:1px solid var(--edge,var(--mute));background:var(--panel2);color:var(--dim);
  transition:filter .12s,border-color .12s}
.pill-btn:hover{filter:brightness(1.25)}
/* На телефоне наведения нет, и нажимаемая метка выглядела точно как
   обычная подпись — по ним и жали наугад. Даём постоянный признак. */
.pill-btn::after{content:"⌄";margin-left:5px;font-size:.5625rem;opacity:.75}
.pill-btn:active{transform:translateY(1px)}
/* Цвет берём из палитры, а не числом: в светлой теме #4ED4A0 на белом
   давал 1,7:1 — подсвеченная метка была нечитаема (проверка сборки 70). */
.pill-btn.mint{background:rgba(78,212,160,.16);border-color:rgba(78,212,160,.4);color:var(--mint)}
.pill-btn.warm{background:rgba(255,180,84,.16);border-color:rgba(255,180,84,.42);color:var(--warm)}
.pill-btn.rose{background:rgba(255,107,122,.14);border-color:rgba(255,107,122,.4);color:var(--rose)}
/* ---- массовые действия в списке дат ---- */
.ev-pick,#pickAll{width:16px;height:16px;accent-color:var(--warm);cursor:pointer}
tr.row-on td{background:rgba(255,180,84,.07)}
.bulk-bar{border-color:rgba(255,180,84,.35);
  background:linear-gradient(90deg,rgba(255,180,84,.07),transparent)}
.bulk-bar .divider{margin:12px 0}
.menu-items{display:flex;flex-direction:column;gap:2px}
.main{padding:22px 26px 60px;min-width:0}
.topbar{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:18px}
h1.page{font-family:Oswald,sans-serif;font-size:1.625rem;font-weight:600;margin:2px 0;text-transform:uppercase;letter-spacing:.02em}
.page-sub{color:var(--dim);font-size:.8125rem;max-width:640px}
.pill{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);background:var(--panel2);border-radius:999px;padding:3px 10px;font-size:.7188rem;color:var(--dim);white-space:nowrap}
.pill.warm{border-color:rgba(255,180,84,.4);color:var(--warm);background:rgba(255,180,84,.1)}
.pill.mint{border-color:rgba(78,212,160,.4);color:var(--mint);background:rgba(78,212,160,.1)}
.pill.rose{border-color:rgba(255,107,122,.4);color:var(--rose);background:rgba(255,107,122,.1)}
.pill.blue{border-color:rgba(110,139,255,.4);color:var(--blue);background:rgba(110,139,255,.1)}
.divider{height:1px;background:var(--line);margin:14px 0}
.grid{display:grid;gap:14px;align-items:start}
/* Карточка сразу после сетки прилипала к ней вплотную: правило .card+.card
   не срабатывает, потому что перед ней не карточка, а сама сетка. */
.grid+.card,.grid+.grid,.card+.grid{margin-top:14px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
table{width:100%;border-collapse:collapse}
th{text-align:left;font-size:.6875rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);font-weight:600;padding:8px 10px;border-bottom:1px solid var(--line)}
td{padding:10px;border-bottom:1px solid var(--line);vertical-align:middle}
tr:last-child td{border-bottom:none}
.empty{color:var(--mute);text-align:center;padding:24px 10px;font-size:.8438rem}
/* Три состояния рисовались одинаково: «Загружаю…», «Пусто» и текст ошибки
   было не отличить. Загрузка — полосы по форме будущего содержимого,
   ошибка — розовая полоса слева. */
.skel{display:block;height:12px;border-radius:6px;margin:8px 0;
  background:linear-gradient(90deg,var(--panel2),var(--line),var(--panel2));
  background-size:200% 100%;animation:skel 1.2s linear infinite}
@keyframes skel{0%{background-position:200% 0}100%{background-position:-200% 0}}
.err-box{border-left:3px solid var(--rose);background:rgba(255,107,122,.08);
  border-radius:8px;padding:10px 12px;color:var(--text);font-size:.8438rem}
@media (prefers-reduced-motion:reduce){.skel{animation:none}}
/* Одиннадцать вкладок в строку не помещались, и «Итоги» уезжали во вторую —
   черта, отделяющая личное, оставалась в первой и теряла смысл. Полоса
   листается вбок на любой ширине, как уже сделано на телефоне. */
.tabs{display:flex;gap:4px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;
  border-bottom:1px solid var(--line);margin-bottom:16px}
.tabs::-webkit-scrollbar{display:none}
.tabs button{flex:none}
.tabs button{background:none;border:none;padding:9px 12px;color:var(--dim);font-size:.8438rem;border-bottom:2px solid transparent}
.tabs button.on{color:var(--text);font-weight:600;border-bottom-color:var(--warm)}
/* Кружок всегда квадратный. В карточке-колонке (правило «ровные ряды
   в списках») фотография оказывалась единственным элементом строки, и flex
   растягивал её по высоте: 34 на 143 точки. height тут не спасает — размер
   считает flex, поэтому ставим потолок. */
.ava{width:34px;height:34px;max-height:34px;border-radius:9px;background:var(--panel2);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex:none}
.modal{display:none;position:fixed;inset:0;background:rgba(6,7,11,.78);z-index:60;padding:24px 16px;overflow:auto}
.modal.on{display:flex;align-items:flex-start;justify-content:center}
/* высокие окна (карточка человека, состав смены) не должны обрезаться экраном */
.modal-box{background:var(--panel);border:1px solid var(--line);border-radius:16px;width:100%;max-width:560px;margin:auto;padding:20px;box-shadow:0 30px 80px rgba(0,0,0,.55);
  max-height:88vh;max-height:88dvh;overflow-y:auto;overscroll-behavior:contain}
.modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
.modal-head h3{margin:0;font-family:Oswald,sans-serif;font-size:1.1875rem;text-transform:uppercase;letter-spacing:.03em}
.x{background:none;border:1px solid var(--line);border-radius:8px;color:var(--dim);padding:5px 9px;line-height:1}
.banner{background:linear-gradient(90deg,rgba(255,180,84,.13),transparent);border:1px solid rgba(255,180,84,.28);border-radius:10px;padding:10px 14px;font-size:.7812rem;color:var(--warm);margin-bottom:16px}
/* Красная полоса: срок кончается на днях. Тёплая — «скоро», красная — «пора». */
.banner.err{background:linear-gradient(90deg,rgba(255,107,122,.13),transparent);
  border-color:rgba(255,107,122,.32);color:var(--rose)}
.banner .link-btn{color:inherit}
.type-card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px;text-align:left;color:var(--text);width:100%}
.type-card:hover{border-color:var(--warm)}
/* артисту сервис бесплатен — его карточка выделена спокойным зелёным краем */
.type-card.type-free{border-color:color-mix(in srgb,var(--mint) 55%,transparent)}
.type-card .ic{font-size:1.5rem}
.type-card .n{font-family:Oswald,sans-serif;font-size:1.0625rem;text-transform:uppercase;letter-spacing:.03em;margin-top:6px}
.type-card .d{color:var(--dim);font-size:.7812rem;margin-top:4px}
.mob-top{display:none}

/* календарь */
/* сетка недели и дня */
.span-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px}
.span-grid.one{grid-template-columns:1fr}
.span-col{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:8px;
  display:flex;flex-direction:column;gap:6px;min-height:150px}
.span-col.today{border-color:rgba(255,180,84,.45)}
.span-head{display:flex;align-items:baseline;gap:6px;padding:2px 4px 6px;border-bottom:1px solid var(--line)}
.span-dow{font-size:.6562rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);font-weight:600}
.span-num{font-family:Oswald,sans-serif;font-size:1.1875rem}
.span-mon{font-size:.7188rem;color:var(--mute)}
.span-body{display:flex;flex-direction:column;gap:6px;flex:1}
.span-ev{display:flex;align-items:flex-start;gap:8px;text-align:left;width:100%;
  background:var(--panel2);border:1px solid var(--line);border-left-width:3px;border-radius:9px;
  padding:8px 9px;color:var(--text);font-size:.7812rem;cursor:pointer}
.span-ev:hover{border-color:var(--mute)}
/* День, на который тянут дату, и сама перетаскиваемая дата */
.day.drop-on,.span-col.drop-on{outline:2px dashed var(--warm);outline-offset:-2px;
  background:rgba(255,180,84,.08)}
.ev-dot.drag,.span-ev.drag{cursor:grab}
.ev-dot.drag:active,.span-ev.drag:active{cursor:grabbing}
.span-t{font-family:Oswald,sans-serif;font-size:.8125rem;color:inherit;flex:none;min-width:38px}
.span-add{margin-top:auto;background:none;border:1px dashed var(--line);border-radius:9px;padding:7px;
  color:var(--mute);font-size:.75rem;cursor:pointer;width:100%}
.span-add:hover{color:var(--text);border-color:var(--mute)}
.span-ev.tone-done{border-left-color:var(--mint)}
.span-ev.tone-soon{border-left-color:var(--mute)}
.cal-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}
/* На телефоне заголовок сжимался соседями до 35 пикселей и ломался
   на две строки: «АВГУС / Т 2026». Замер на 375px до правки — ровно так.
   Не даём его сжимать и переносить. */
.cal-title{font-family:Oswald,sans-serif;font-size:1.1875rem;text-transform:uppercase;letter-spacing:.03em;
  min-width:190px;flex:0 0 auto;white-space:nowrap}
.cal{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px}
/* Список дат под сеткой — только на телефоне: в ячейке 46px название
   не поместится, а знать, что за дата, нужно. */
.cal-list{display:none;margin-top:14px}
.cal-row-wrap{display:flex;align-items:stretch;gap:6px}
.cal-row-wrap .cal-row{flex:1;min-width:0}
.cal-row{display:flex;gap:10px;align-items:flex-start;width:100%;text-align:left;
  background:var(--panel);border:1px solid var(--line);border-radius:10px;
  padding:10px 12px;margin-bottom:8px;color:var(--text);cursor:pointer}
.cal-row-d{flex:0 0 54px;display:flex;flex-direction:column;line-height:1.25}
.cal-row-d b{font-size:.875rem}
.cal-row-d span{font-size:.6875rem;color:var(--mute);text-transform:uppercase}
.cal-row-t{flex:1;min-width:0;font-size:.8438rem;font-weight:600}
.cal-row-s{display:block;font-size:.7188rem;color:var(--mute);font-weight:400;margin-top:2px}
.cal .dow{font-size:.6562rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);text-align:center;padding:4px 0;font-weight:600}
.day{background:var(--panel);border:1px solid var(--line);border-radius:10px;min-height:92px;padding:6px;text-align:left;color:var(--text);display:flex;flex-direction:column;gap:4px;transition:border-color .15s}
.day:hover{border-color:var(--mute)}
/* Дни соседнего месяца раньше гасились прозрачностью .35 — контраст числа
   падал до 1,9:1, первая неделя выглядела дыркой в сетке. Гасим фоном,
   а не прозрачностью: сами даты в этих днях должны оставаться читаемыми. */
.day.off{background:var(--ink)}
.day.off .num{color:var(--mute)}
.day.off .ev-dot{opacity:.8}
.day .num{font-family:Oswald,sans-serif;font-size:.875rem;color:var(--dim)}
.day.today{border-color:rgba(255,180,84,.45)}
.day.today .num{color:var(--warm)}
.ev-dot{border-radius:7px;padding:4px 6px;font-size:.6875rem;line-height:1.25;border:1px solid var(--line);background:var(--panel2);overflow:hidden;cursor:pointer;text-align:left;width:100%;color:var(--text)}
.ev-dot .t{font-weight:600;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Черновик и согласование человек не различает — они и подписаны одинаково.
   Раньше в сетке они были разных цветов, а в легенде под сеткой стояли три
   метки: синий цвет не был расшифрован нигде. Красим одинаково. */
/* Виды дат в календаре. Серый — ещё не решено, синий — подтверждено
   и впереди, зелёный — проведено, красный — отменено, тёплый — ждут
   вашего ответа (единственное, где от человека что-то требуется). */
.ev-dot.tone-soon{border-color:var(--line);background:var(--panel2)}
.ev-dot.tone-done{border-color:rgba(78,212,160,.45);background:rgba(78,212,160,.12)}
.ev-dot.tone-wait,.span-ev.tone-wait{border-color:var(--warm);background:rgba(255,180,84,.16);
  box-shadow:inset 3px 0 0 var(--warm)}
/* Ключи легенды: квадратик того же цвета, что и в сетке. */
.tone-key{display:inline-flex;align-items:center;gap:6px;font-size:.7188rem;color:var(--dim)}
.tone-key::before{content:"";width:11px;height:11px;border-radius:3px;border:1px solid var(--line);
  background:var(--panel2)}
.tone-key.tone-done::before{border-color:rgba(78,212,160,.55);background:rgba(78,212,160,.22)}
.tone-key.tone-wait::before{border-color:var(--warm);background:rgba(255,180,84,.3)}
.legend{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
/* поиск по всему сервису — в боковой панели над меню */
/* глазок «показать пароль» внутри поля */
.pass-wrap{position:relative;display:block}
.pass-wrap input{padding-right:44px}
.pass-eye{position:absolute;right:4px;top:50%;transform:translateY(-50%);
  width:34px;height:34px;background:none;border:0;cursor:pointer;font-size:.9375rem;
  color:var(--dim);border-radius:8px;line-height:1}
.pass-eye:hover{background:var(--panel2)}
.pass-eye:focus-visible{outline:2px solid var(--warm);outline-offset:1px}
/* строка «с чего начать» на первом экране */
.step{display:flex;align-items:center;gap:10px;background:var(--panel2);
  border:1px solid var(--line);border-radius:10px;padding:10px 12px}
/* крестик «этот совет мне не нужен» — тихий, розовеет при наведении */
.step-x{width:28px;height:28px;flex:0 0 28px;border:0;background:none;color:var(--mute);
  font-size:.8125rem;line-height:1;border-radius:8px;cursor:pointer;margin-left:4px}
.step-x:hover{background:var(--panel);color:var(--rose)}
@media(hover:none){.step-x{width:36px;height:36px;flex:0 0 36px}}
.step.done{opacity:.6}
.step .mark{flex:none;width:22px;height:22px;border-radius:99px;display:grid;place-items:center;
  background:var(--panel);border:1px solid var(--line);font-size:.75rem;color:var(--mute)}
.step.done .mark{background:var(--mint);border-color:var(--mint);color:var(--ink);font-weight:700}
/* свёрнутые правила и вопросы на публичной странице джема */
/* display у самого summary менять нельзя: браузер перестаёт считать его
   шапкой, и свёрнутая карточка занимает столько же места, сколько раскрытая.
   Выравнивание делаем обёрткой внутри. */
.rd-tabs{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:10px}
/* Галочка отбора у карточки контрагента. Своя, а не системная: общее правило
   для input задаёт ширину 100% и рамку, и настоящая галочка превращалась
   в огромный прямоугольник (грабли 12.0–12.8). */
.pick{position:relative;display:inline-flex;flex:none;cursor:pointer;width:19px;height:19px}
.pick input{position:absolute;inset:0;width:19px;height:19px;opacity:0;margin:0;padding:0;cursor:pointer}
.pick span{width:19px;height:19px;border:1.5px solid var(--line);border-radius:6px;background:var(--panel);
  display:flex;align-items:center;justify-content:center;font-size:.75rem;color:#241703;transition:.12s}
.pick input:checked+span{background:var(--warm);border-color:var(--warm)}
.pick input:checked+span::after{content:"✓"}
.pick input:focus-visible+span{outline:2px solid var(--blue);outline-offset:2px}
.rd-pick{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px;margin-bottom:12px}
.rd-role{margin:12px 0 4px;font:600 .6875rem/1 Oswald,sans-serif;text-transform:uppercase;
  letter-spacing:.12em;color:var(--warm)}
.rd-role:first-child{margin-top:2px}
/* Черта в ряду вкладок: слева общее, справа своё */
.tabs-cut{width:1px;align-self:stretch;background:var(--line);margin:0 10px}
/* Замок на самих вкладках «Заметки» и «Итоги» — линейный значок сайта
   в цвете подписи вкладки (сборка 890; прежде один эмодзи 🔒 перед ними). */
.tabs button .tab-lock{display:inline-flex;vertical-align:-2px;margin-right:5px}
.tabs button .tab-lock .ico{width:13px;height:13px}
@media(max-width:720px){.tabs-cut{display:none}}
.jam-rules>summary{list-style:none;cursor:pointer;display:block}
.jam-rules>summary::-webkit-details-marker{display:none}
.jam-rules>summary::marker{content:""}
.jam-rules>summary>.sum-in{display:flex;align-items:center;gap:10px;min-width:0}
/* блок «отмечается само» внутри карточки — без своей рамки и отступов */
.auto-line{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:10px;font-size:.7812rem}
/* «Вышла новая сборка» — внизу по центру, поверх всего. */
.newbuild{position:fixed;left:50%;bottom:calc(18px + env(safe-area-inset-bottom));transform:translateX(-50%);z-index:120;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;max-width:calc(100vw - 24px);
  width:max-content;
  padding:11px 14px;border-radius:12px;border:1px solid var(--warm);
  background:var(--panel2);color:var(--text);font-size:.8125rem;
  box-shadow:0 12px 34px rgba(0,0,0,.35)}
/* Два вопроса, которые путали: номер слева, «сейчас так», кнопка, пример. */
.q-box{display:flex;gap:12px;padding:12px;margin-top:10px;border:1px solid var(--line);
  border-radius:10px;background:var(--panel2)}
.q-n{flex:none;width:24px;height:24px;border-radius:50%;background:var(--warm);color:#241703;
  font:700 .8125rem/1.5rem Inter,system-ui,sans-serif;text-align:center}
.q-t{font-weight:600;font-size:.875rem}
.q-now{font-size:.7812rem;color:var(--dim);margin-top:3px}
/* Технический и бытовой райдер — два столбца, между ними черта. */
/* Общий райдер коллектива — не такой, как остальные: его никто не пишет
   целиком, он складывается из частей музыкантов. Отделяем синей полосой
   и меткой, а не заливкой: тёплая значила бы «от вас чего-то ждут»,
   зелёная — «готово», и оба смысла тут неверны. */
.card.rd-band{box-shadow:inset 3px 0 0 var(--blue)}
.rd-band .rd-part{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.rd-band .rd-part .pill{font-size:.6875rem}
.rd-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
@media(max-width:620px){.rd-acts .btn.sm{padding:0 10px;gap:5px}}
/* Свободные вечера клуба: артист сразу видит, куда можно проситься.
   Занятые дни показываем приглушённо, но не прячем — иначе непонятно,
   что список вообще про календарь. */
.free-days{display:flex;gap:6px;flex-wrap:wrap;max-height:150px;overflow:auto;padding:2px}
.free-days .fd{background:var(--panel2);border:1px solid var(--edge);border-radius:8px;
  color:var(--text);font:inherit;font-size:.75rem;padding:6px 9px;cursor:pointer;white-space:nowrap}
.free-days .fd.busy{opacity:.35;cursor:default;text-decoration:line-through}
.free-days .fd.on{background:var(--warm);border-color:var(--warm);color:#fff;font-weight:600}
body.light .free-days .fd.on{background:#A85F00;border-color:#A85F00}
.rd-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0}
.rd-split .rd-col{min-width:0;padding:0 18px}
.rd-split .rd-col:first-child{padding-left:0;border-right:1px solid var(--line)}
.rd-split .rd-col:last-child{padding-right:0}
@media(max-width:820px){
  .rd-split{grid-template-columns:minmax(0,1fr);gap:18px}
  .rd-split .rd-col{padding:0}
  .rd-split .rd-col:first-child{border-right:0;border-bottom:1px solid var(--line);padding-bottom:18px}
}
/* выбор значка роли: готовые вместо ручного ввода эмодзи */
.ico-pick{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:6px;
  max-height:210px;overflow-y:auto}
.ico-pick .ico{width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;
  font-size:1.125rem;border:1px solid var(--line);background:var(--panel2);color:var(--text);
  border-radius:10px;cursor:pointer;padding:0}
.ico-pick .ico:hover{border-color:var(--warm)}
.ico-pick .ico.on{border-color:var(--warm);box-shadow:inset 0 0 0 1px var(--warm)}
.jam-rules>summary .jam-more{margin-left:auto;font-size:0;color:var(--mute);white-space:nowrap}
.jam-rules>summary .jam-more::before{font-size:.75rem;content:"Развернуть"}
.jam-rules[open]>summary .jam-more::before{content:"Свернуть"}
.jam-rules[open]>summary .jam-more::after{content:" ▴"}
.jam-rules:not([open])>summary .jam-more::after{content:" ▾"}
.jam-rules>summary:focus-visible{outline:2px solid var(--warm);outline-offset:3px;border-radius:8px}
/* переписка сторон внутри даты */
.talk-box{max-height:420px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;margin-top:10px}
.talk-row{background:var(--panel2);border:1px solid var(--line);border-radius:11px;padding:9px 12px}
.talk-row.mine{border-color:rgba(255,180,84,.4);background:rgba(255,180,84,.07)}
.talk-who{font-size:.7188rem;color:var(--mute);display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.talk-when{margin-left:auto;font-variant-numeric:tabular-nums}
.talk-body{margin-top:4px;font-size:.8438rem;line-height:1.5;white-space:pre-wrap;word-break:break-word}
/* ---------- общий проход по оформлению (фазы 6-8) ---------- */

/* 120: числа в столбик. Суммы были прижаты вправо, но цифры разной ширины,
   и «180 000 ₽» не совпадало разрядами с «40 000 ₽». */
.display,.kv .v,table td,.pill,.badge,.cnt,.money,.num{font-variant-numeric:tabular-nums}
/* Счётчик в заголовке карточки наследовал приглушённый цвет надзаголовка
   и давал 3,5:1. Свой цвет — читается и не спорит с названием. */
.eyebrow .cnt,.menu-title .cnt{color:var(--dim)}

/* 121: пояснения тянулись на всю ширину — до 150 знаков в строку,
   глаз терял начало следующей. */
.page-sub,.banner,.empty,.hint,.lockbox,.perk-list{max-width:74ch}

/* 122: самый мелкий текст на экране был у кнопки сворачивания раздела меню,
   по которой надо и попадать, и читать её. */
.menu-title{font-size:.6875rem!important;color:var(--dim)!important}

/* 115: пунктирные разделители читались как «черновик». */
.kv{border-bottom:1px solid var(--line)!important}

/* 117: метка и кнопка выглядели одинаково, и на «подтвердил» жали. */
.pill{cursor:default}
/* Сообщество — карточка внутри карточки: слева данные и кнопки,
   справа подписка со сроком (заказчик, сборка 631). */
.vk-grp{border:1px solid var(--line);border-radius:var(--r2,10px);background:var(--panel2);
  padding:14px;margin-bottom:12px}
.vk-grp-in{gap:14px;align-items:stretch}
.vk-grp-pay{border-left:1px solid var(--line);padding-left:14px}
@media(max-width:900px){ .vk-grp-pay{border-left:0;border-top:1px solid var(--line);
  padding-left:0;padding-top:12px} }
/* Две колонки «Публикации ВК» — одного роста и с одинаковыми карточками. */
/* Список в окне-вопросе: длинный перечень постов не должен растягивать
   окно на весь экран — он прокручивается внутри себя. */
.ask-list{max-height:min(46vh,360px);overflow-y:auto;margin-bottom:10px}
.pub-cols{align-items:stretch}
/* Заказчик: «план постов обрезается на середине, хотя облачко идёт до низа».
   Список жил с фиксированной высотой (56vh) и прокручивался внутри, пока
   сама карточка была растянута под соседнюю колонку. Теперь список
   заполняет карточку целиком, а прокрутка появляется, только когда постов
   и правда больше, чем помещается. */
.pub-cols > div > .card{display:flex;flex-direction:column}
#vkPlanList .vk-scroll{max-height:none;flex:1 1 auto;min-height:0}
/* Очередь постов: узкий список слева, пост справа. */
@media(min-width:901px){ .pub-30{grid-template-columns:minmax(0,30%) minmax(0,1fr)} }
/* Открытый пункт подсвечен — видно, что именно смотришь справа. */
.vk-plan.on{border-color:var(--warm);box-shadow:inset 3px 0 0 var(--warm)}
.vk-grp2{font:600 .6875rem/1 Inter,sans-serif;letter-spacing:.1em;text-transform:uppercase;
  color:var(--mute);margin:14px 0 8px}
.pub-cols > div{display:flex;flex-direction:column;gap:14px}
/* Правило «карточка тянется на всю колонку» писалось, когда справа была
   ОДНА карточка. С сборки 769 черновик разделён на шесть, и flex:1
   растягивал каждую: под «Фото к посту» зияла пустота в пол-экрана
   (заказчик: «уменьшить размер облачка»). Тянется только список постов
   слева — ему это и нужно. */
.pub-cols > div > .card{flex:0 0 auto;margin:0}
#vkPlanList > .card{flex:1 1 auto;min-height:0}
/* Заказчик: «кручу список постов вниз до бесконечности и не вижу, что
   справа». На широком экране левая колонка липнет к верху и листается
   ВНУТРИ себя: пост справа при этом всё время на виду. */
@media(min-width:901px){
  .pub-30 > div:first-child{position:sticky;top:14px;align-self:start;
    max-height:calc(100vh - 28px)}
  #vkPlanList > .card{max-height:calc(100vh - 28px)}
  #vkPlanList .vk-scroll{overflow-y:auto;max-height:none}
}
/* Ряд кнопок плана: одна строка, на узком экране листается вбок.
   Заказчик: «все кнопки сделать в один ряд». */
/* Колонка стала узкой (30 %), и один ряд туда не влезает: кнопки
   переносятся, чтобы все были на виду, а не уезжали за край. */
.vk-bar{display:flex;gap:8px;align-items:center;margin:0 0 10px;flex-wrap:wrap}
.vk-bar > *{flex:0 0 auto}
/* Подзаголовок внутри формы: длинный список полей делится на шаги,
   иначе читается сплошным полотном (заказчик, сборка 617). */
.fsec{font:600 .6875rem/1 Inter,sans-serif;letter-spacing:.12em;text-transform:uppercase;
  color:var(--mute);margin:16px 0 8px;padding-top:12px;border-top:1px solid var(--line)}
.card > .eyebrow + .fsec{margin-top:10px;padding-top:0;border-top:0}
/* Заказчик: «облачко сделать общего размера, а то одно меньше, одно больше».
   В строке плана меток четыре — задаём им один рост и одну высоту значка. */
.vk-plan .pill{height:24px;padding:0 10px;box-sizing:border-box}
.vk-plan .pill .ico{width:14px;height:14px}
.pill-btn{cursor:pointer}

/* 125+123: в светлом карточка почти не отделялась от фона, а поле ввода
   сливалось с карточкой — форма из восьми полей была белым листом. */
body.light .card{box-shadow:0 1px 2px rgba(20,30,60,.06)}
body.light input,body.light select,body.light textarea{background-color:#F7F9FC}
body.light input:focus,body.light select:focus,body.light textarea:focus{background-color:#FFFFFF}

/* 130: пустая таблица высотой в строку, а под ней полэкрана воздуха —
   это читалось как «сервис не загрузился». */
.empty{min-height:96px;display:flex;flex-direction:column;justify-content:center}

/* 133: шесть разных наведений сводим к двум. */
.card-open:hover,.kan-card:hover,.type-card:hover,.plan-btn:hover,.day:hover,
.sp-row:hover,.ws:hover{border-color:var(--warm)}

/* 141: «Удалить дату» стояла вплотную к справочной строке. */

/* 137: уголок с версией лежал поверх содержимого. */
.main{padding-bottom:34px}

/* 139: числа дней слева, подписи дней недели по центру — сетка перекошена. */
.cal .dow{text-align:left!important;padding-left:6px}

/* 157: у полей фокус выглядел иначе, чем у всего остального: правило для
   полей перебивало общую тёплую обводку, и человек терял ритм формы. */
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid var(--warm);outline-offset:1px;border-color:var(--blue)}

/* 155: у крестика не было названия и он был мельче цели попадания. */
.x{min-width:32px;min-height:32px}

/* 156: обход клавиатурой начинался с меню — пятнадцать нажатий до содержимого. */
.skip{position:absolute;left:-9999px;top:0;z-index:99;background:var(--warm);color:var(--ink);
  padding:10px 16px;border-radius:0 0 10px 0;font-weight:650;text-decoration:none}
.skip:focus{left:0}

/* 149: на телефоне двадцать целей были меньше 44 точек, причём самые частые. */
@media(max-width:900px){
  .btn{height:44px;padding:0 16px}
  .btn.sm{height:40px;padding:0 13px}
  .topbar .btn,.topbar .btn.sm{height:44px}
  .seg button{height:42px;line-height:2.625rem}
  .mob-top .btn.sm{width:44px!important;height:44px}
  .x{min-width:40px;min-height:40px}
  input:not([type=checkbox]):not([type=radio]),select{height:44px}
  /* Поле мельче 16px — и Safari на айфоне сам увеличивает страницу,
     когда в него встаёшь. Обратно её приходится сводить пальцами. */
  input:not([type=checkbox]):not([type=radio]),select,textarea{font-size:max(16px,1rem)}
  table input:not([type=checkbox]),table select{font-size:max(16px,1rem);height:40px}
  /* Отбор в «Датах» и «Деньгах»: 38px отменяли общее правило 44. */
  .list-filters select,.list-filters input{height:44px}
  /* В ящике меню общее .btn{padding:0 16px} съедало значок: на колокольчик
     оставалось шесть точек ширины. */
  .side .bell,nav.menu .bell{width:44px;height:44px;padding:0;flex:none}
  /* Кружок «?» — на телефоне это кнопка: подсказка открывается нажатием. */
  /* Кружок «?» остаётся 20 точек, но нажимается как 44: под ним
     невидимый запас. Туда убраны почти все пояснения сервиса. */
  .tip{width:20px;height:20px;font-size:.75rem}
  .tip::before{content:"";position:absolute;inset:-12px;border-radius:50%}
  /* Фильтры сет-листа — то, чем музыкант пользуется первым делом. */
  .filter-btn{padding:11px 15px}
  /* Плюсик «встать на роль» — основное действие музыканта в джеме. */
  .cell-add{width:34px;height:34px}
  .cell-x{padding:7px;font-size:.875rem}
  .pen{padding:6px;font-size:.9375rem}
  /* Подчёркнутые значения в «Коротко о дате» и ссылки «нет: райдер ·
     документы» — это кнопки высотой 19 точек. Область нажатия
     расширяем невидимым слоем, чтобы строки не разъехались. */
  .link-btn{position:relative}
  .link-btn::after{content:"";position:absolute;inset:-11px -4px}
  .span-add{padding:11px 7px}
  /* Названия дат списком под сеткой — до 900 включительно: в ячейке
     70–100 точек название всё равно режется до «🎤 Дж…». */
  .cal-list{display:block}

  /* ---- Партия 22–29, 36: попадание пальцем ----
     Норма 40 точек. Где вид менять нельзя, добавляем невидимый запас
     области нажатия через ::before — приём из правки 67–87. */

  /* 22. Карандаш и крестик у строк: деньги, проходки, программа, мерч.
     Зазор 4 точки между «изменить» и «удалить» — на тач-экране это
     промах, который стирает запись о деньгах. Разводим на 12. */
  .mn-b{width:40px;height:40px;font-size:.9375rem}
  .mn-b-x{margin-left:12px}

  /* Задачи: колонка состояния на широком экране 230 точек, на телефоне
     карточка и так во всю ширину — переключатели помещаются */
  .task-st{min-width:0}

  /* 23. Метки-переключатели: промах здесь МЕНЯЕТ данные, а не открывает окно */
  .pill-btn{height:40px;padding:0 14px;position:relative}
  .pill-btn::before{content:"";position:absolute;inset:-4px -2px}

  /* 24. Джем: крестик роли и имя участника */
  .cell-x{padding:9px;font-size:.9375rem}
  /* НО в самой таблице сет-листа плотность важнее: правило «не меньше 40
     точек» раздуло фишку имени с 22 до 59, и на экран влезало два номера
     вместо четырёх. Цель нажатия здесь — сам текст имени, как на портале
     Jagger; промах ничего не меняет, открывается соседняя карточка. */
  .sl-table .cell-open{padding:2px 0}
  .sl-table .cell-open::before{content:none}
  .sl-table .cell-x{padding:0 2px;font-size:.75rem;min-width:0}
  .sl-table .cell-name{padding:3px 7px}
  .sl-table .pen{padding:2px;font-size:.8125rem}
  /* Ячейке роли нужна ширина, иначе «Лена Крылова» переносится на две
     строки и строка растёт. На портале Jagger min-width:112 — берём так же:
     лист чуть шире, зато номеров на экране больше. */
  .sl-table td[data-role]{min-width:118px}
  .sl-table .cell-name{max-width:100%}
  /* Длинные имена («Наталия Чупрынина») всё равно переносятся — делаем
     перенос плотным: две строки занимают 28 точек вместо 39. */
  .sl-table .cell-open{line-height:1.15}
  /* Запас области нажатия вешаем на САМИ кнопки. Раньше он стоял
     на оболочке .cell-name и ложился поверх её кнопок: на телефоне
     нельзя было ни открыть карточку участника, ни уйти с роли. */
  .cell-name{padding:4px 8px}
  .cell-open{position:relative;padding:8px 2px}
  .cell-open::before{content:"";position:absolute;inset:-6px -6px}
  .cell-x{position:relative;padding:9px 11px;font-size:.9375rem;min-width:40px}
  .cell-x::before{content:"";position:absolute;inset:-4px -4px}

  /* 25. «Правила джема» и «Как пользоваться» — полоска была 18 точек */
  .jam-rules>summary>.sum-in{min-height:44px;padding:2px 0}

  /* 26. Экран входа: переключатель «Вход · Регистрация» и глазок пароля */
  .tabs2 button{min-height:44px}
  .pass-eye{width:44px;height:44px;font-size:1.0625rem}
  .pass-wrap input{padding-right:52px}

  /* 27. Полоска, которой сворачивается карточка */
  .card > .eyebrow.fold-h{min-height:44px}
  .card > .eyebrow.fold-h::after{font-size:.875rem}

  /* 28. Кружочки оборудования в райдере, значки должности, галочки в «Постах ВК» */
  .vk-chips button{min-height:36px;padding:0 12px}
  .ico-pick{grid-template-columns:repeat(auto-fill,minmax(44px,1fr))}
  .ico-pick .ico{width:44px;height:44px;font-size:1.25rem}
  .vk-item input[type=checkbox]{width:22px;height:22px;flex:none;margin:0}

  /* 2. Галочка даты в списке: вид прежний, нажимается как 40 точек */
  table.mob-cards td .pick::before{content:"";position:absolute;inset:-11px}

  /* 29. Галочка «пришёл» в проходках: нажимается вся ячейка */
  table.mob-cards td .chk{min-height:44px}

  /* Телефон и телеграм на листе «День концерта» — обычные ссылки, а не
     кнопки, и запас нажатия им никто не дал: 16 точек по буквам. Вечером
     в темноте по такой строке не попасть. */
  .sheet .kv a{position:relative;display:inline-block;padding:6px 2px}
  .sheet .kv a::before{content:"";position:absolute;inset:-6px -6px}

  /* 36. Страница джема: 24 точки полей с каждой стороны — 13 % экрана */
  .auth-wrap{padding:24px 12px}
}

/* 146: в карточке даты на телефоне полтора экрана уходило на управление. */
@media(max-width:620px){
  .sides{grid-template-columns:minmax(0,1fr)}
  /* flex-wrap из базового правила отменял прокрутку: вкладки вставали
     в три ряда и съедали 120 точек до содержимого карточки. */
  .tabs{overflow-x:auto;-webkit-overflow-scrolling:touch;position:relative;
    flex-wrap:nowrap;scrollbar-width:none}
  .tabs::-webkit-scrollbar{display:none}
  .tabs button{white-space:nowrap;flex:none}
  /* Правый край растворяется — так видно, что вкладки продолжаются
     (тот же приём, что у бокового меню). */
  .tabs{-webkit-mask-image:linear-gradient(90deg,#000 90%,transparent);
    mask-image:linear-gradient(90deg,#000 90%,transparent);
    /* липнет под шапкой (63 точки): иначе при прокрутке содержимого
       вкладки уезжают, и вернуться к соседней нечем */
    position:sticky;top:62px;z-index:20;background:var(--ink)}
  .chat-send{flex-direction:column;align-items:stretch}
  .chat-send .btn{width:100%}
}

/* размеры аватарки: крупная в шапке карточки, мелкая в списках выбора */
.ava-lg{width:52px;height:52px;max-height:52px;font-size:1.0625rem;border-radius:14px;flex:none}
.ava-sm{width:30px;height:30px;max-height:30px;font-size:.7188rem;flex:none}
.ava img{border-radius:inherit}
.find-res{display:none;position:absolute;left:0;right:0;top:40px;z-index:30;
  background:var(--panel2);border:1px solid var(--line);border-radius:11px;
  box-shadow:0 14px 34px rgba(0,0,0,.4);max-height:60vh;overflow:auto;padding:5px}
.find-res.on{display:block}
.find-res.up{top:auto;bottom:100%;margin-bottom:4px}
@media(max-width:900px){ .find-res{max-height:min(46vh,180px)} }

.find-row{display:block;width:100%;text-align:left;background:none;border:0;
  border-radius:8px;padding:7px 9px;cursor:pointer;color:var(--text);font:inherit}
.find-row:hover,.find-row:focus-visible{background:var(--panel)}
.find-row .fn{display:block;font-size:.8125rem;font-weight:600;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.find-row .fs{display:block;font-size:.7188rem;color:var(--mute)}
.find-empty{padding:12px 10px;font-size:.8125rem;color:var(--mute)}
/* пункт чек-листа, который сервис отмечает сам: нажимать его незачем */
.chk.auto .box{cursor:default;opacity:.9}
.chk.auto .who{color:var(--mute);font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em}
/* полоса отбора над списком дат */
.list-filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:-4px 0 10px}
/* Отрицательный отступ сверху был рассчитан на строку под заголовком раздела.
   Когда над отбором оказалась карточка («В кассе сейчас»), он подтянул строку
   вплотную — кнопки читались как наехавшие. Та же грабля, что в 16.3:
   правило «.card + .card» не срабатывает, если сосед другого вида. */
.card+.list-filters,.grid+.list-filters{margin-top:14px}
.list-filters+.card,.list-filters+.grid{margin-top:14px}
.list-filters select,.list-filters input{height:40px;width:auto;flex:0 1 auto}
@media(max-width:620px){
  .list-filters{gap:6px}
  .list-filters .seg{width:100%}
  /* height обязателен и здесь: правило 44px из блока 900 стоит выше
     по файлу, а при равной силе побеждает нижнее. */
  .list-filters select,.list-filters input{flex:1 1 100%;max-width:none!important;height:44px}
  /* В «Деньгах» четыре поля отбора во всю ширину съедали пол-экрана
     до самих цифр. Ставим по два в ряд: два дня и два списка. */
  /* min-width:0 обязателен: иначе список не сжимается уже самого длинного
     названия контрагента и занимает целую строку. */
  .mn-filters input[type=date],.mn-filters select{flex:1 1 calc(50% - 4px);min-width:0}
  /* То же в «Датах»: до первой даты уходило около 550 точек — почти весь
     первый экран. Списки по два в ряд, поиск строкой во всю ширину. */
  .list-filters select{flex:1 1 calc(50% - 4px);min-width:0}
  /* «Все контрагенты» не помещались в 123 точки и обрезались до
     «Все контрагент» — в «Деньгах» этот список пускаем во всю ширину. */
  .mn-filters select{flex:1 1 100%}
  .list-filters input[type=search]{flex:1 1 100%}
  /* Три плашки стояли столбиком по 120 точек — на экране помещалась
     одна, а человек заходит сюда ради всех трёх сразу. Собираем каждую
     в две строки: подпись и число рядом. Отступы у чисел заданы прямо
     в разметке, поэтому здесь !important. */
  .mn-tiles{gap:8px}
  .mn-tiles .card{padding:10px 12px;display:grid;column-gap:10px;
    grid-template-columns:auto 1fr;grid-template-areas:"e n" "s s";align-items:baseline}
  .mn-tiles .eyebrow{grid-area:e;margin:0}
  .mn-tiles .display{grid-area:n;margin-top:0!important;text-align:right}
  .mn-tiles .page-sub{grid-area:s;margin-top:2px!important}
  /* Таблица → карточки. Тот же приём, что у сет-листа джема: разметка
     не меняется, название колонки печатается из data-l перед значением.
     Иначе «Разница» и кнопки уезжают за правый край, а числа рвутся
     на четыре строки. */
  table.mob-cards{display:block;min-width:0}
  table.mob-cards thead{display:none}
  table.mob-cards tbody,table.mob-cards tfoot,table.mob-cards tr,table.mob-cards td{display:block;width:auto}
  table.mob-cards tr{border:1px solid var(--line);border-radius:12px;background:var(--panel);
    padding:8px 10px;margin-bottom:8px}
  table.mob-cards td{border:none;padding:4px 0;position:relative;min-height:20px}
  table.mob-cards td[data-l]{padding-left:92px}
  table.mob-cards td[data-l]::before{content:attr(data-l);position:absolute;left:0;top:5px;
    width:86px;color:var(--mute);font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em}
  table.mob-cards td[data-l=""]{padding-left:0}
  table.mob-cards td[data-l=""]::before{content:none}
  table.mob-cards td:empty{display:none}
  /* Галочка отбора и дата — одной строкой: иначе квадратик занимает
     отдельную строку в каждой карточке. */
  table.mob-cards td:has(>.ev-pick){position:absolute;right:10px;width:auto;padding:0}
  table.mob-cards tr:has(.ev-pick){position:relative}
}
.row-past{opacity:.5}

/* карточка события */
.sides{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:16px}
.side-card{flex:1;min-width:190px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:11px 13px}
.side-card .r{font-size:.6562rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);font-weight:600}
.side-card .n{font-weight:600;margin-top:3px}
.side-card .s{font-size:.75rem;color:var(--dim);margin-top:2px}
.side-card.me{border-color:rgba(255,180,84,.45);box-shadow:0 0 0 1px rgba(255,180,84,.15) inset}
.lockbox{border:1px dashed var(--line);border-radius:10px;padding:14px;color:var(--mute);font-size:.8125rem;text-align:center}
.chk{position:relative;display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
/* Настоящая галочка попадала под общее правило для полей ввода — ширина 100 %,
   отступы, рамка — и рисовалась огромным прямоугольником. Прячем её,
   состояние показывает соседний квадратик. */
.chk input[type=checkbox]{position:absolute;width:19px;height:19px;margin:0;padding:0;
  opacity:0;cursor:pointer;z-index:1}
.chk input[type=checkbox]:checked+.box{background:var(--mint);border-color:var(--mint);color:#0B2018;font-weight:700}
.chk input[type=checkbox]:checked+.box::after{content:"✓"}
.chk input[type=checkbox]:focus-visible+.box{outline:2px solid var(--warm);outline-offset:2px}
.chk:last-child{border-bottom:none}
.chk .box{width:19px;height:19px;border-radius:6px;border:1px solid var(--line);background:var(--ink);display:flex;align-items:center;justify-content:center;font-size:.75rem;color:var(--ink);cursor:pointer;flex:none}
.chk .box.on{background:var(--mint);border-color:var(--mint);color:#0B2018;font-weight:700}
.chk .t{font-size:.8438rem}
.chk .who{margin-left:auto;font-size:.7188rem;color:var(--mute);white-space:nowrap}
.chk .x{min-width:34px;margin-left:8px;padding:2px 7px;font-size:.6875rem}
.kv{display:flex;justify-content:space-between;gap:12px;padding:7px 0;border-bottom:1px dashed rgba(255,255,255,.07);font-size:.8125rem}
.kv:last-child{border-bottom:none}
.kv .k{color:var(--mute)}
.kv .v{text-align:right;font-weight:500}
.rider-ok{color:var(--mint)}
.rider-no{color:var(--rose)}
.rider-maybe{color:var(--warm)}
/* полоса о подписке */
.plan-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;border-radius:11px;
  padding:11px 14px;margin-bottom:16px;font-size:.8125rem;line-height:1.5}
.plan-bar.soon{border:1px solid rgba(255,180,84,.4);background:rgba(255,180,84,.10);color:var(--text)}
.plan-bar.over{border:1px solid rgba(255,107,122,.45);background:rgba(255,107,122,.12);color:var(--text)}
.plan-bar.demo{border:1px solid rgba(110,139,255,.45);background:rgba(110,139,255,.11);color:var(--text)}
/* всплывающая строка: своя, а не окно браузера */
.toast{position:fixed;left:50%;bottom:calc(26px + env(safe-area-inset-bottom));transform:translateX(-50%) translateY(16px);
  max-width:min(520px,calc(100vw - 32px));background:var(--panel2);color:var(--text);
  border:1px solid var(--line);border-left:3px solid var(--warm);
  box-shadow:0 10px 30px rgba(0,0,0,.35);border-radius:11px;padding:11px 16px;
  font-size:.875rem;line-height:1.4;opacity:0;pointer-events:none;z-index:80;
  transition:opacity .18s,transform .18s}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{border-left-color:var(--mint)}
.toast.err{border-left-color:var(--rose)}
/* Пока открыто окно, всплывающая строка встаёт СВЕРХУ: снизу она ложилась
   ровно на кнопку «Сохранить» и закрывала её целиком (замер: 44 из 44). */
body.modal-on .toast{bottom:auto;top:calc(14px + env(safe-area-inset-top));z-index:70}
@media(prefers-reduced-motion:reduce){.toast{transition:none}}
.plan-bar .btn{margin-left:auto;flex:none}
.bar{height:5px;background:var(--panel2);border-radius:99px;margin-top:4px;overflow:hidden}
.bar>i{display:block;height:100%;background:var(--warm);border-radius:99px}
/* Ближайшие даты — компактные карточки в ряд. Раньше каждая занимала
   полосу во всю ширину и несла в основном воздух. */
/* auto-fit, а не auto-fill: когда дат две, они растягиваются на всю
   ширину и встают одним рядом, а не жмутся к левому краю. */
.dash-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:10px;margin-top:10px;align-items:stretch}
/* «.card+.card{margin-top:14px}» сдвигал вторую и третью карточки вниз:
   в ряду они получались на 14 точек ниже первой. Зазор держит сама сетка. */
.dash-grid>.card{margin:0}
.dash-card{display:flex;flex-direction:column;gap:6px;text-align:left;padding:12px 13px}
/* джем открывается своей страницей, поэтому карточка бывает ссылкой —
   но выглядеть должна как карточка, а не как подчёркнутый синий текст */
a.dash-card,a.dash-card:hover{color:var(--text);text-decoration:none}
.dc-top{display:flex;align-items:center;gap:8px;justify-content:space-between}
.dc-date{font-family:Oswald,sans-serif;font-size:1.0625rem;font-weight:600;
  font-variant-numeric:tabular-nums;color:var(--text);white-space:nowrap}
.dc-date i{font-style:normal;font-size:.6875rem;text-transform:uppercase;
  letter-spacing:.08em;color:var(--mute);margin-left:3px}
.dc-title{font-size:.9062rem;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden}
.dc-sub{font-size:.75rem;color:var(--mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dc-bar{margin-top:2px}
.dc-miss{display:flex;gap:4px;flex-wrap:wrap}
.dc-miss .pill{font-size:.6562rem;padding:1px 7px}
@media(max-width:560px){ .dash-grid{grid-template-columns:minmax(0,1fr)} }
.bar i{display:block;height:100%}

/* пост-ассистент ВКонтакте */
.vk-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:16px;border-bottom:1px solid var(--line);padding-bottom:10px}
.vk-tabs button{background:none;border:1px solid transparent;color:var(--dim);font:inherit;font-size:.8125rem;
  padding:7px 13px;border-radius:9px;cursor:pointer}
.vk-tabs button:hover{color:var(--text);background:var(--panel2)}
.vk-tabs button.on{background:var(--panel2);border-color:var(--line);color:var(--warm)}
.vk-modes{display:flex;gap:6px;flex-wrap:wrap}
.vk-modes button{flex:1;min-width:120px;background:var(--panel2);border:1px solid var(--line);color:var(--dim);
  font:inherit;font-size:.7812rem;padding:8px 10px;border-radius:9px;cursor:pointer}
.vk-modes button.on{border-color:var(--warm);color:var(--warm)}
.vk-chips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.vk-chips button{background:var(--panel2);border:1px solid var(--line);color:var(--dim);font:inherit;
  font-size:.75rem;padding:5px 10px;border-radius:999px;cursor:pointer}
.vk-chips button.on{border-color:var(--warm);color:var(--warm)}
.vk-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border:1px solid var(--line);
  border-radius:10px;margin-bottom:6px;cursor:pointer;background:var(--panel2)}
.vk-item.sel{border-color:var(--warm)}
.vk-ava{width:36px;height:36px;border-radius:50%;background:var(--panel);border:1px solid var(--line);
  display:flex;align-items:center;justify-content:center;font-size:.75rem;color:var(--dim);
  flex-shrink:0;overflow:hidden}
.vk-ava img{width:100%;height:100%;object-fit:cover}
.vk-preview{white-space:pre-wrap;line-height:1.65;font-size:.8438rem;background:var(--panel2);
  border:1px solid var(--line);border-radius:10px;padding:12px;margin-top:10px}
.vk-mini{white-space:pre-wrap;font-size:.75rem;color:var(--dim);background:var(--panel2);
  border-radius:8px;padding:8px;margin-top:6px}
.vk-thumbs{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0}
.vk-thumb{position:relative;width:62px;height:62px;border-radius:8px;overflow:hidden;border:1px solid var(--line)}
.vk-thumb img{width:100%;height:100%;object-fit:cover;display:block}
/* «1-е» — фото, которое уйдёт в ближайший пост: дальше очередь идёт по кругу */
.gal-first{position:absolute;left:3px;bottom:3px;background:var(--warm);color:#fff;
  font-size:.5938rem;padding:1px 5px;border-radius:6px;font-weight:600}
body.light .gal-first{color:#fff}
.vk-thumb button{position:absolute;top:2px;right:2px;width:18px;height:18px;border-radius:50%;
  border:none;background:rgba(0,0,0,.65);color:#fff;font-size:.6875rem;line-height:1;cursor:pointer;padding:0}
.vk-check{display:flex;align-items:flex-start;gap:8px;font-size:.8125rem;cursor:pointer}
.vk-check input{width:16px;height:16px;accent-color:var(--warm);flex-shrink:0;margin-top:2px}
.vk-plan{border:1px solid var(--line);border-radius:10px;padding:11px;margin-bottom:8px;background:var(--panel2)}
/* длинные списки не растягивают страницу, а прокручиваются внутри карточки */
.vk-scroll{max-height:min(56vh,560px);overflow-y:auto;overscroll-behavior:contain;
  padding-right:6px;margin-right:-6px}
.vk-scroll::-webkit-scrollbar{width:8px}
.vk-scroll::-webkit-scrollbar-track{background:transparent}
.vk-scroll::-webkit-scrollbar-thumb{background:var(--line);border-radius:99px}
.vk-scroll::-webkit-scrollbar-thumb:hover{background:var(--mute)}
@media(max-width:900px){ .vk-scroll{max-height:min(64vh,520px)} }

@media(max-width:900px){
  .shell.on{grid-template-columns:minmax(0,1fr)}
  .side{display:none}
  /* Высоту ящика задаёт inset (top:0 и bottom:0), а НЕ 100dvh: на Android
     панель браузера то появляется, то исчезает, и dvh обновляется
     с задержкой — низ с профилем и тарифом уезжал под панель, и заказчик
     не мог до него добраться. Плюс запас под системную полосу и прокрутка
     на случай низкого экрана. */
  .side.open{display:flex;position:fixed;inset:0 auto 0 0;width:250px;z-index:50;
    height:auto;max-height:none;overflow-y:auto;
    padding-bottom:calc(14px + env(safe-area-inset-bottom))}
  /* затемнение позади ящика: раньше открытое меню нечем было закрыть */
  /* Затемнение — отдельный слой, а не псевдоэлемент панели: раньше нажатие
     по нему приходило внутрь меню, и «ткнуть мимо» не срабатывало. */
  .side-veil{display:none}
  .side-veil.on{display:block;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:49;border:0}
  .mob-top{display:flex;align-items:center;gap:10px;margin-bottom:14px}
  .main{padding:16px;padding-bottom:calc(28px + env(safe-area-inset-bottom))}
  .g2,.g3{grid-template-columns:minmax(0,1fr)}
  .cal{gap:4px}.day{min-height:64px;padding:4px;border-radius:8px}
  .seg{width:100%}.seg button{flex:1;padding:0 6px;font-size:.7812rem}
  .span-grid{grid-template-columns:minmax(0,1fr)}.span-col{min-height:0}
  .ev-dot{font-size:.625rem;padding:2px 4px}
  .cal-title{min-width:0;flex:1;font-size:1rem}
}

/* ================= ТЕЛЕФОН: календарь =================
   Эти правила обязаны стоять ПОСЛЕ базовых: у .cal-list и .ev-dot .t
   такая же сила селектора, и при равной силе побеждает то, что ниже.
   Первая попытка лежала выше базовых — и не срабатывала вовсе. */
@media(max-width:560px){
  /* Месяц: в ячейке 46px название не помещается никогда — оставляем точку,
     а сами названия идут списком под сеткой. */
  .cal-list{display:block}
  .cal{gap:4px}
  .day{min-height:56px;padding:4px 3px}
  /* Обнуляем и у видов статуса: у них два класса, и одиночный .ev-dot
     их не перебивает — плашка так и осталась бы серым прямоугольником. */
  .ev-dot,.ev-dot.tone-soon,.ev-dot.tone-done,.ev-dot.tone-wait,
  body.light .ev-dot.tone-soon{
    padding:0;border:none;background:none;box-shadow:none;opacity:1;
    width:100%;display:flex;justify-content:center;text-decoration:none}
  .ev-dot .t{display:none}
  /* Кружок 9 точек нажимать нечем, а промах по нему открывал «Новую дату».
     Даты открывают из списка под сеткой, поэтому точка — просто метка. */
  .ev-dot{pointer-events:none}
  .ev-dot::before{content:"";width:9px;height:9px;border-radius:50%;background:var(--dim)}
  .ev-dot.tone-done::before{background:var(--mint)}
  .ev-dot.tone-wait::before{background:var(--warm);box-shadow:0 0 0 3px rgba(255,180,84,.28)}
  .legend{display:none}
  /* Заголовок месяца занимает свою строку: иначе соседи сжимали его
     до 35 пикселей и «АВГУСТ 2026» ломался пополам. */
  .cal-head{flex-wrap:wrap;gap:8px}
  /* Название месяца занимало строку целиком, а стрелки и «Сегодня»
     уезжали под него — справа от названия пустовало полэкрана.
     Пусть встаёт в общий ряд: «← Август 2026 → Сегодня». */
  .cal-title{flex:0 1 auto;order:0;font-size:1.125rem;min-width:0;text-align:left}
  .cal-head .pill{margin-left:0!important}
}

/* ================= ТЕЛЕФОН: пальцем, а не мышкой =================
   Всё, что ниже, — про экран до 560px. Стоит в самом конце таблицы стилей:
   у половины правил такая же сила селектора, как у базовых, и при равной
   силе побеждает то, что ниже по файлу. */
@media(max-width:560px){

  /* 2. Верхняя строка (☰, название сущности, колокольчик) остаётся
     на месте при прокрутке — иначе до меню надо мотать список наверх. */
  .mob-top{position:sticky;top:0;z-index:30;background:var(--ink);
    margin:-16px -16px 12px;padding:9px 16px;
    border-bottom:1px solid var(--line)}

  /* 3. Окна снизу, во всю ширину: так до кнопок достаёт большой палец,
     и не теряются 32 пикселя по бокам. 100dvh — потому что адресная
     строка Safari то появляется, то исчезает, и vh считает её неверно. */
  .modal{padding:0}
  .modal-box{max-width:none;border-radius:16px 16px 0 0;margin:auto 0 0;
    padding:18px 16px calc(18px + env(safe-area-inset-bottom));
    max-height:92dvh}
  .side{height:100dvh}
  /* Шапка окна с крестиком остаётся на месте при прокрутке. В высоких
     формах («+ Приход», «Новая дата») содержимое длиннее экрана, и ✕
     уезжал вверх — закрыть окно, передумав, было нечем. */
  .modal-box{padding-top:0}
  .modal-head{position:sticky;top:0;z-index:2;background:var(--panel);
    margin:0 -16px 12px;padding:14px 16px 10px;border-bottom:1px solid var(--line)}
  /* Крестик закрепили ещё в 67–87, а главное действие нет — до «Сохранить»
     каждый раз мотали («Доход» — 1174 точки при видимых 745). Кнопка
     во всю ширину внутри окна прилипает к низу. */
  /* Липкая кнопка «Сохранить» больше не липкая. Она висела над формой
     и накрывала то поле, что оказывалось под ней: заказчик трижды
     присылал снимки, где за ней прятались «Заметка» с сообщением
     об ошибке и «Стороны» с площадкой. Кнопка стоит в конце формы,
     как везде; до неё просто доскроллить. */
  .modal-box{padding-bottom:calc(18px + env(safe-area-inset-bottom))}

  /* 4. Мелкие значки — под палец. Видимая часть остаётся прежней,
     растёт область нажатия. */
  .pick{width:22px;height:22px}
  .pick span{width:22px;height:22px}
  .pick input{inset:-9px;width:40px;height:40px}
  .chk .box{width:22px;height:22px}
  .vk-thumb button{width:26px;height:26px}
  nav.menu button{min-height:44px}
  /* Заголовок группы («🎸 Музыкант») — это кнопка сворачивания,
     а высота у неё была 17 точек. */
  .menu-title{min-height:40px;padding:6px 0}
  /* Таблицы «Денег» не забирают прокрутку себе: палец, попавший
     в такую таблицу, листал её вместо страницы. */
  .vk-scroll{max-height:none;overflow-y:visible}

  /* 5. Ничего мельче 11 пикселей: на телефоне это уже не читается. */
  .menu-title .arw{font-size:.6875rem}
  .menu-title .cnt{font-size:.6875rem}
  .core-badge{font-size:.6875rem}
  .brand .b2{font-size:.625rem;letter-spacing:.16em}

  /* 6. Ряд вкладок листается вбок и не режется по краю. */
  .tabs{overflow-x:auto;-webkit-overflow-scrolling:touch;flex-wrap:nowrap;
    scrollbar-width:none}
  .tabs::-webkit-scrollbar{display:none}
  .tabs button{padding:11px 13px;white-space:nowrap}
}

/* Облачко комментария у номера — 17×13 точек, пальцем не попасть.
   Вид не трогаем, расширяем область нажатия невидимым слоем.
   Только screen: при печати этот же ::before печатает текст
   комментария (см. блок @media print), и content:"" стёр бы его. */
@media screen and (max-width:900px){
  .tip.tip-bubble{position:relative}
  .tip.tip-bubble::before{content:"";position:absolute;inset:-14px}
}

/* «Коротко о дате»: семь значений подряд, каждое — кнопка. Строка была
   20 точек, шаг 35, и невидимые запасы соседей упирались друг в друга:
   нажатие чуть ниже «Статуса» открывало «Стороны». Разводим до 44. */
/* Свёрнутая полоса массовых действий: видна только первая строка */
/* !important обязателен: у этих строк display задан прямо в разметке,
   а встроенный стиль сильнее любого правила из таблицы (грабли 128–130). */
.bulk-bar.bulk-short > *:not(:first-child){display:none!important}
.list-more-b{display:none}
@media(max-width:620px){
  .list-more-b{display:inline-flex}
  .list-more{display:none;width:100%}
  .list-more.on{display:flex;gap:6px;flex-wrap:wrap;width:100%}
}
/* Плашки «Деньги в пути» на «Ближайшем» — кнопки: ведут в «Деньги»
   и открывают список должников. Вид как у обычного блока, но нажимается. */
.g-pic{margin:10px 0 2px;padding:10px;background:var(--panel2);border-radius:12px;overflow-x:auto}
/* Строка долга: название · сумма · кнопки — в один ряд. Кнопки справа
   на том же уровне, а не под суммой. Заказчик: «расширить окно и справа
   от строчки сделать плюсик частью/полностью». */
.debt-row{display:grid;grid-template-columns:1fr auto auto;gap:14px;align-items:center;
  padding:11px 0;border-bottom:1px solid var(--line)}
.debt-name{min-width:0}
.debt-sum{white-space:nowrap;text-align:right}
/* «+ часть» и «Получили» обе меняют деньги, а стояли в шести точках:
   промах закрывал весь долг целиком. По сервису норма 12–14. */
.debt-act{display:flex;gap:14px;flex:none}
.cash-big{font:inherit;font-family:Oswald,sans-serif;font-size:1.5rem;font-weight:700;
  font-variant-numeric:tabular-nums;padding:0;text-decoration:none}
button.cash-big{cursor:pointer;border:0;background:none}
button.cash-big:hover{text-decoration:underline}
@media(max-width:620px){
  .debt-row{grid-template-columns:1fr auto}
  .debt-act{grid-column:1/-1;justify-content:flex-end}
}
.dash-money{background:none;border:0;padding:0;margin:0;text-align:left;cursor:pointer;font:inherit;color:inherit;width:100%}
.dash-money:disabled{cursor:default;opacity:1}
.dash-money:not(:disabled):hover .eyebrow{color:var(--warm)}
.btn.sides-toggle,.sides-short{display:none}
/* Строка имён сторон — это кнопка, но выглядеть должна строкой: снимаем
   всё, что браузер рисует у <button>. Область нажатия держим 40 точек —
   правило проекта для тач-экрана. */
.sides-short{width:100%;background:none;border:0;padding:0;font:inherit;
  color:var(--dim);text-align:left;cursor:pointer}
.sides-car{color:var(--mute);margin-left:2px}
@media(max-width:620px){
  .btn.sides-toggle{display:flex;margin-bottom:6px}
  .sides-short{display:flex;align-items:center;min-height:40px;margin:0 0 10px}
  .sides{display:none}
  .sides.on{display:grid}
}
@media(max-width:900px){
}

/* 5. Вечером дату открывают ради «Дня концерта», а он седьмой в ряду
   из одиннадцати вкладок: тащить вбок 680 точек. На телефоне ставим
   его вторым — сразу после «Общего». */

/* Проходка одной строкой. Правила стоят В КОНЦЕ файла: общее
   table.mob-cards tr{display:block} объявлено ниже блока «до 900»,
   и при равной силе побеждало оно — строка так и оставалась в пять строк. */
@media(max-width:900px){
  table.gs-table tr{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 10px}
  table.gs-table td{padding:0}
  table.gs-table td[data-l]{padding-left:0}
  table.gs-table td[data-l]::before{content:none}
  /* 1040: колонки «пришёл» больше нет — имя теперь первая ячейка */
  table.gs-table td:nth-child(1){flex:1;min-width:0}
  table.gs-table td.gs-act{margin-left:auto}
}

/* ============ ТЕЛЕФОН: сет-лист остаётся таблицей ============
   Заказчик сравнил с порталом Jagger и попросил сделать так же: там
   сет-лист на телефоне НЕ разворачивается в карточки, а остаётся
   таблицей с прокруткой вбок — видно сразу несколько ролей, и лист
   короткий. Прежний вариант «каждая строка карточкой» давал простыню:
   один номер занимал целый экран.

   Чего в Jagger нет и что мы добавляем: название номера прилипает
   слева при прокрутке вбок — иначе, уехав к «Клавишам», человек уже
   не помнит, чей это состав. Ровно из-за этого мы когда-то и ушли
   в карточки; липкая колонка решает это, не растягивая лист. */
@media(max-width:700px){
  /* прокрутка вбок во всю ширину экрана, без полей карточки */
  .table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;
    margin:0 -12px;padding:0 12px}
  .sl-table{min-width:640px;font-size:.7812rem}
  .sl-table th{padding:7px 8px;font-size:.6875rem;white-space:nowrap;
    position:sticky;top:0;z-index:3;background:var(--panel)}
  .sl-table td{padding:7px 8px}

  /* Номер — узкой колонкой; ухватку ⠿ прячем, тянуть пальцем нечем,
     для порядка есть стрелки ▲▾. */
  .num-cell{width:34px;padding:7px 4px!important;font-size:.8125rem}
  .num-cell .drag-handle{display:none}
  /* Пальцем в кнопку 30×24 попасть трудно, а промах по ▲ вместо ▾ двигает
     номер в обратную сторону — это правка данных, а не показа. Держим тот
     же запас, что у прочих кнопок.
     Прежде размер стоял в двух местах: 40×40 в @media(hover:none) и 30×24
     здесь. Оба правила одной силы, побеждало то, что ниже, — и на телефоне
     кнопка оставалась 30×24 при шрифте 14px. Источник правды один. */
  .num-cell .ord{gap:6px}
  .ord-b{width:40px;height:40px;font-size:.875rem}

  /* Название прилипает слева: при прокрутке вбок видно, чей это состав. */
  .sl-table .track-cell{position:sticky;left:0;z-index:2;background:var(--panel);
    min-width:118px;max-width:132px;
    box-shadow:6px 0 8px -6px rgba(0,0,0,.28);
    /* Safari на айфоне иногда рисовал фишки соседней колонки ПОВЕРХ
       липкой (снимок заказчика 11.09). Свой слой держит её сверху. */
    transform:translateZ(0)}
  /* Закрепляется сам заголовок «Трек» (класс track-cell), а не «второй
     по счёту»: у ведущего первой идёт колонка галочек, вторым оказывался
     «#», и над названиями при прокрутке висел «#». */
  .sl-table thead th.track-cell{top:0;z-index:5;background:var(--panel2)}
  /* Липкая колонка обязана быть сплошной в любом состоянии строки.
     Подсветка «tr:hover td» сильнее по весу и заменяла сплошной фон
     полупрозрачным — сквозь название просвечивали фишки соседних
     колонок (снимок заказчика 11.09, 23:09). Подсветку кладём слоем
     поверх сплошного цвета. */
  .sl-table tbody tr td.track-cell,
  .sl-table tbody tr:hover td.track-cell{background-color:var(--panel)}
  .sl-table tbody tr:hover td.track-cell{
    background-image:linear-gradient(rgba(127,127,127,.06),rgba(127,127,127,.06))}
  .track-title{font-size:.8125rem;line-height:1.25}
  .track-artist,.track-proposer{font-size:.6562rem}

  /* Фишка с именем компактнее, но нажимаемая. */
  .cell-name{padding:3px 7px;font-size:.7188rem;margin:2px 3px 2px 0}
  .cell-add{width:26px;height:26px;font-size:.875rem}
  .cell-label{font-size:.625rem}

  /* Строка статуса и кнопки модерации — своей колонкой, не растягивают лист. */
  /* «Утвердить» и «Отклонить» должны стоять в ряд и на телефоне.
     У ячейки ещё 10 точек отступа с каждой стороны, поэтому 180 не хватало:
     доступно было 160 при нужных 168. Даём 200 и делаем кнопки компактнее. */
  .status-cell{min-width:176px}   /* метка и крестик в одну строку */
  .admin-acts .btn.sm{font-size:.6562rem;padding:0 6px}
  .admin-acts{display:flex;gap:4px;flex-wrap:wrap}
  .admin-acts .btn{padding:0 8px;height:28px;font-size:.7188rem}

  /* Редкое действие в первый экран не пускаем. */
  .sl-rare{display:none}

  /* Строка была 150 точек: «состав собран» шёл плашкой на две строки,
     плюс служебное «добавил такой-то». На телефоне это лишнее —
     метка становится строчкой, кто добавил, прячется (видно в карточке). */
  .core-badge{display:inline;padding:0;border:none;background:none;
    font-size:.6562rem;color:var(--mint);white-space:nowrap}
  .track-proposer{display:none}
  /* Карандаш теперь при названии и на телефоне нужен — прятать его нельзя.
     Пальцу даём запас: сама иконка мелкая. */
  .track-cell .pen{padding:6px;font-size:.875rem;position:relative}
  .track-cell .pen::after{content:"";position:absolute;inset:-8px}
  /* Отбор и стрелки — в одну узкую колонку, без лишнего воздуха. */
  .sl-table td:first-child{width:26px;padding:6px 2px!important}
  .sl-table .pick{transform:scale(.9)}
}

/* Колонки вкладки «Общее» держат зазор сами (gap:14). Правило
   «.card+.card{margin-top:14}» добавляло второй отступ, и справа
   получалось 28 против 14 слева. */
.ev-main .ev-col > *{margin:0}

/* Вкладка «Общее»: на телефоне колонки схлопываются одна за другой,
   и проходки оказались бы раньше плана дня. Раскрываем обёртки
   и задаём порядок карточек по смыслу. display:contents с !important —
   у обёрток display задан прямо в разметке, а встроенный стиль сильнее. */
@media (max-width:820px){
  .ev-main .ev-col{display:contents!important}
  /* Порядок задал заказчик (сборка 859): сводка о мероприятии, задачи
     (с 860-й — одна карточка вместе с готовностью), партнёры и спонсоры,
     проходки, история. У «Партнёров» места в этом списке не было — без
     order они вставали первыми (order:0). */
  .ev-day{order:1} .ev-ready{order:2}
  .ev-part{order:3} .ev-guests{order:4} .ev-main .past-card{order:5}
  /* при display:contents карточки становятся ячейками сетки, но в DOM
     остаются внутри обёртки — селектор «> .card» по ней не сработает.
     Свои отступы снимаем, зазор держит сама сетка. */
  .ev-main .ev-col > *{margin:0!important}
}

/* Афиша: на телефоне зона перетаскивания не нужна — там нечем перетаскивать.
   Остаётся кнопка, блок с 210 точек сжимается до 56. */
@media (max-width:900px){
  .poster-drop{min-height:0;padding:12px}
  .poster-drop .drop-hint{display:none}
}

/* Задачи: содержимое ячеек разной высоты (у одной две строки, у другой одна),
   а ячейки равнялись по середине — ряд читался «лесенкой». Равняем по верху,
   как в списке дат, и метке «как идёт» даём тот же отступ, что и тексту. */
.tasks-tbl td{vertical-align:top}
.tasks-tbl td .task-st{margin-top:2px}

/* Отбор и порядок в задачах — одной строкой, на телефоне по два в ряд. */
.task-tools{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px;align-items:center}
/* Пять кнопок отбора рвались так, что «Все» уходила на свою строку.
   На телефоне ужимаем поля и зазор — пять кнопок встают в один ряд. */
@media (max-width:620px){
  .task-chips{display:flex;gap:5px;flex-wrap:wrap;width:100%}
  .task-chips .btn{padding-left:9px;padding-right:9px;flex:0 1 auto}
  .task-chips .btn .pill{margin-left:3px;padding:0 4px}
}
.task-tools select{width:auto;min-width:0;max-width:230px;flex:0 1 auto}
@media(max-width:620px){ .task-tools select{flex:1 1 46%;max-width:none} }

/* Ряд «Дата · Начало · Статус». Ширины стояли прямо в разметке
   (1fr .8fr 1.4fr), но у поля даты своя большая наименьшая ширина —
   она съедала место, и списку статуса оставалось 61 точка из 390.
   На телефоне ставим их друг под другом. */
.row-dts{display:grid;gap:12px;grid-template-columns:1fr .8fr 1.4fr}
@media(max-width:640px){ .row-dts{grid-template-columns:minmax(0,1fr)} }
/* Три даты одной строкой, но с переносом: у datetime-local своя наименьшая
   ширина, и на узкой колонке кабинета три равных столбца её не вмещают. */
.row-dates{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr))}
@media(max-width:620px){ .row-dates{grid-template-columns:minmax(0,1fr)} }
@media(max-width:900px){
  /* липкая кнопка «Сохранить» накрывала последнюю строку пояснения */
  .modal-box{padding-bottom:76px}
}

/* Ряд вкладок даты и кнопка «＋ ещё». Кнопка была липкой ВНУТРИ полосы
   прокрутки и накрывала соседние вкладки: на телефоне читалось
   «Тайминг + ещё⊙Состав». Теперь она стоит рядом с полосой, а не над ней. */
.tabs-row{display:flex;align-items:stretch;gap:6px;min-width:0}
.tabs-row .tabs{flex:1;min-width:0}
.tabs-row .tab-add{position:static !important;flex:none;align-self:center}
.tab-add{background:var(--panel2);border:1px solid var(--line);border-radius:9px;
  padding:7px 10px;color:var(--dim);font-size:.8125rem;white-space:nowrap}
.tab-add:hover{border-color:var(--warm);color:var(--warm)}
/* Подсказка по нажатию — то же, что при наведении. */
.tip.tap::after{opacity:1;visibility:visible}

/* Safari на айфоне центрирует значение в полях даты и времени — рядом
   с подписями, набранными слева, это читалось как «поле не на месте».
   Равняем по левому краю, как во всех остальных полях. */
/* Поля даты и времени на айфоне имеют СВОЮ наименьшую ширину: `width:100%`
   её не пересиливает, и поле вылезает за правый край окна — заказчик прислал
   это дважды. Лечится снятием собственного вида плюс `min-width:0`.
   Выбор значения при этом остаётся родным — его рисует сам браузер. */
input[type=date],input[type=time],input[type=datetime-local]{
  text-align:left;min-width:0;max-width:100%;display:block;
  -webkit-appearance:none;appearance:none}
/* Пока афиша грузится, на её месте видна не пустая рамка, а полоска. */
.poster-wrap{background:var(--panel2);border-radius:11px;min-height:80px}

/* Выходные — суббота и воскресенье — заметны во всех календарях.
   Заказчик: «везде выделять выходные». Отделяем ТОЛЬКО фоном ячейки:
   тёплый в сервисе значит «от вас чего-то ждут», и им набрано одно
   «сегодня». Раньше тёплыми были и числа выходных, и дни недели в шапке —
   сегодняшняя суббота отличалась от соседней только рамкой. */
.cal .day.wknd{background:var(--panel2)}
.mc-day.wknd{background:var(--panel2)}
.span-col.wknd{background:var(--panel2)}
/* карточка даты в выходном столбце — светлее самого столбца; «ждут ответа» свою тёплую заливку сохраняет */
.span-col.wknd .span-ev:not(.tone-wait){background:var(--panel)}
.mc-wd{color:var(--mute);font-size:.75rem;text-transform:uppercase;letter-spacing:.06em}
/* «Сегодня» — единственное тёплое место календаря */
.span-col.today .span-num{color:var(--warm)}
.mc-day.now .mc-n{color:var(--warm);font-weight:700}

/* «Где я участвую»: имя сущности сверху, под ним подписанные строки —
   без подписей три значения в ряд читались как набор слов. */
.pl-row{padding:10px 0;border-bottom:1px solid var(--line)}
.pl-row:last-child{border-bottom:0}
.pl-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.pl-line{display:flex;gap:10px;align-items:baseline;font-size:.8125rem;margin-top:3px}
.pl-lab{color:var(--mute);font-size:.7188rem;min-width:130px;flex:none}
@media(max-width:560px){ .pl-lab{min-width:104px} }

/* Переключатель состояния номера в сет-листе: колонка узкая,
   поэтому раскрытые состояния встают столбиком под текущим. */
.sl-st{display:inline-flex;flex-direction:column;align-items:flex-start;gap:4px}
.sl-st .task-st-menu{display:flex;flex-direction:column;gap:4px}
.status-cell .admin-acts{margin-top:6px}

/* Ухватка порядка: она одна и тянет строку. Делаем её заметнее и крупнее
   под палец — раньше строка ехала от нажатия в любом месте. */
.drag-handle{display:inline-block;padding:2px 4px;border-radius:6px;
  cursor:grab;touch-action:none;user-select:none}
.drag-handle:hover{background:var(--panel2);color:var(--text)}
.drag-handle:active{cursor:grabbing}

/* Состояние номера и «Удалить» — в одну строку. Заказчик: «кнопку
   „Удалить" можно правее, чтобы не делать две строчки». Раскрытые
   состояния при этом уходят вниз под саму метку, а не расталкивают
   кнопку. Флекс кладём в обёртку, а не на <td>: display:flex на ячейке
   ломает колонки таблицы (грабля сборки 359). */
.st-wrap{display:flex;align-items:flex-start;gap:6px;flex-wrap:wrap}
.status-cell > .st-wrap > .pill,.status-cell > .st-wrap > .pill-btn{margin-bottom:0}

/* Метка состояния и «Удалить» — одного роста и с одинаковыми
   скруглениями. Заказчик: «сделать размеры одинаковые». Метка была
   20 точек и капсулой, кнопка — 26 и со скруглением 9: рядом это
   читалось как два разных элемента. */
.status-cell .pill-btn,.status-cell .btn.sm{height:26px;font-size:.6875rem;
  border-radius:9px;padding:0 10px;box-sizing:border-box}
.status-cell .pill-btn{font-weight:600}
/* Заказчик: «кнопку „Удалить" можно просто крестиком». Квадратная, одного
   роста с меткой состояния; надпись ушла в подсказку. */
.status-cell .btn.sm.sl-del{width:26px;padding:0;font-size:.8125rem;line-height:1;flex:none}
/* Строка выбора музыканта: имя слева, инструмент справа. Кнопкой .btn
   это выглядело рвано — у неё содержимое по центру, и длинное имя
   переносилось посередине, а роли улетали вправо. */
/* «Где» и «Вы в этом джеме» — одной строкой, двумя карточками; ниже так же
   «чего не хватает» и «что это за сервис». На узком экране встают друг
   под друга. */
.jam-head{display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.jam-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:14px;margin-bottom:14px;align-items:stretch}
.jam-row > *{margin:0;max-width:none}   /* у .banner своя ширина в 74ch — в ряду её снимаем */
/* Полоса режима концерта — во всю ширину: при 74ch её текст занимал две
   строки (заказчик: «можно на полную строчку, чтобы одну длинную»). */
.banner.wide{max-width:none}
@media(max-width:820px){ .jam-row{grid-template-columns:minmax(0,1fr)} }
@media(max-width:700px){ .jam-head{gap:10px} .jam-head>div{min-width:0} }
.hp-row{display:flex;align-items:baseline;gap:12px;width:100%;margin-bottom:6px;
  background:var(--panel2);border:1px solid var(--line);border-radius:10px;
  padding:9px 12px;min-height:40px;cursor:pointer;text-align:left;font:inherit;color:var(--text)}
.hp-row:hover{border-color:var(--warm)}
.hp-name{flex:1;min-width:0;font-weight:600;font-size:.8438rem}
.hp-role{flex:0 0 auto;max-width:45%;text-align:right;color:var(--dim);font-size:.75rem}
/* Колонка сузилась — «Удалить» больше не занимает места словом. */
.status-cell{min-width:190px}

/* Кнопки черновика поста: все одного роста, в один ряд, «Опубликовать»
   прижата вправо. Раньше «Удалить» и «Опубликовать» были другого размера
   и переносились второй строкой. */
/* Карточка черновика узкая (450 точек), а кнопок пять — в одну строку
   они не влезают физически. Поэтому не «прижимаем» ничего вправо,
   а даём им растягиваться: ряды заполняются ровно, все одного роста. */
.vk-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:12px}
.vk-acts .btn{height:32px;flex:1 1 130px;justify-content:center;white-space:nowrap}

/* --- Телефон: ряд вкладок даты становится списком ---------------------
   Восемь вкладок в ленту не влезают: 889 точек при видимых 266.
   Список занимает одну строку, ничего не листается и видно, где ты.
   Правило стоит в конце таблицы: при равной силе побеждает то, что ниже. */
.tabs-sel{display:none}
@media (max-width:620px){
  /* Нижний отступ жил у самой ленты (.tabs{margin-bottom:16px}). Спрятали
     ленту — и содержимое встало вплотную к списку: зазор был ровно 0,
     карточка «Готовность» налезала на выпадающий список. Отступ
     переезжает на всю строку. */
  .tabs-row{margin-bottom:16px}
  .tabs-row .tabs{display:none !important}
  .page-head + .tabs{display:none !important}
  .tabs-sel + .tabs{display:none !important}
  .tabs-sel{display:block;flex:1;min-width:0;width:100%;height:40px;margin-bottom:12px}
  .tabs-row .tabs-sel{margin-bottom:0}
  .tabs-row .tab-add{position:static !important}
}

/* --- Телефон: шапка карточки даты --------------------------------------
   199 точек до первой карточки: кнопка «Назад» 44, надзаголовок, имя даты
   в две строки 78 и рядом со статусом его же пересказ («Все согласны,
   дата занята»). Пересказ на телефоне лишний — статус написан рядом. */
@media (max-width:620px){
  #main > .topbar > div > .page{font-size:1.25rem;line-height:1.2}
  #main > .topbar .pill.state{display:none}
  #main > .topbar .btn.sm.ghost{height:32px}
}

/* Заказчик отметил главную кнопку витрины: две кнопки во всю ширину
   в десяти точках друг от друга читаются как одна деталь. */
@media (max-width:620px){
  .lp-cta{gap:14px}
  .lp-cta .lp-note{margin-top:2px}
}

/* --- Телефон: статус и кнопки даты в одну строку -----------------------
   Заказчик: «надо стараться, чтобы все объекты были в одну линию, чтобы
   не было пустого места из-за того, что переносится строчка». Статус
   стоял один на строке, а «Повторить» и «Изменить» уезжали на следующую —
   справа от статуса оставалась пустота во весь экран.
   `display:contents` у обёрток делает их детей ячейками одной строки:
   «Назад», надзаголовок и название занимают строку целиком, а статус
   и кнопки становятся соседями и переносятся только если правда не влезли. */
@media (max-width:620px){
  /* `justify-content:space-between` из общего правила .topbar на узком
     экране растаскивал строку по краям: между статусом и «Повторить»
     зияли 72 точки. Прижимаем к левому краю — переносится только то,
     что правда не влезло, и без дыр. */
  #main > .topbar{display:flex;flex-wrap:wrap;align-items:center;
    justify-content:flex-start;gap:6px}
  /* `!important` обязателен: у обёртки кнопок `display:flex` задан прямо
     в разметке, а встроенный стиль сильнее правила из таблицы. Без него
     кнопки остались бы одним блоком и при длинном статусе переносились
     обе разом (грабли 128–130 и 222–225 — уже третий раз). */
  #main > .topbar > div{display:contents !important}
  #main > .topbar > div > .btn.sm.ghost,
  #main > .topbar > div > .eyebrow,
  #main > .topbar > div > .page{flex:0 0 100%}
  #main > .topbar .ev-status{margin-top:0 !important}
  /* Десяти точек не хватало, чтобы всё встало в строку: замер 353 при
     доступных 343. Ужимаем поля кнопок и зазор — становится 337.
     Обёртка кнопок тоже `display:contents`, поэтому при длинном статусе
     («Черновик / согласование», 183) переносится ОДНА кнопка, а не обе:
     пустого места справа не остаётся. */
  #main > .topbar .ev-acts .btn{padding-left:9px;padding-right:9px}
}

/* Строка «← период → Сегодня» в календаре денег: с зазором 8 не хватало
   одной точки, и кнопка уезжала на строку ниже. */
@media (max-width:620px){
  .mn-nav{gap:6px !important}
}

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

/* Длинные таблицы на телефоне: показываем первые пять строк, остальное
   по кнопке. `tfoot` («Всего по проектам») не прячем — итог нужен всегда. */
/* `.btn` объявлен ниже по файлу со своим display, поэтому одиночного
   `.mob-only` мало — нужен селектор той же силы или выше. Эти грабли
   в файле уже четвёртые. */
.mob-only,.btn.mob-only{display:none}
/* Короткая и полная подпись одной кнопки: на телефоне длинные названия
   не дают трём кнопкам встать в строку. */
.t-mob{display:none}
@media(max-width:620px){.t-mob{display:inline}.t-wide{display:none}
  /* Слово важнее значка: без него три кнопки встают в строку. */
  .btn.hide-ico-mob svg{display:none}}
@media (max-width:620px){
  .mob-only,.btn.mob-only{display:flex}
  table.mob-cut tbody tr:nth-child(n+6){display:none}
}

/* Разрушительная кнопка не должна стоять вплотную к соседней: на телефоне
   промах по «Перенести» удалял дату, промах по «Сохранить» — карточку
   контрагента, промах по карандашу — уточнение должности (а на них
   держится состав джема). Отступ задан в разметке инлайном, поэтому
   `!important`. */
@media (max-width:620px){
  .ev-row-acts .btn.danger{margin-left:18px !important}
  /* Одного `margin-top` мало: обе кнопки — inline-flex и стоят на ОДНОЙ
     строке, отступ сверху их не разводит. Делаем «Убрать из списка»
     блочной — она уходит на свою строку под «Сохранить». */
  .ct-del{display:flex !important;width:max-content;margin-top:16px !important}
  .role-del{margin-left:14px}
}

/* Ряд вкладок даты липнет под верхней полосой: карточка длиной 2000 точек,
   и чтобы сменить вкладку, приходилось мотать вверх до самого начала. */
@media (max-width:620px){
  .tabs-row{position:sticky;top:63px;z-index:20;background:var(--ink);
    padding:8px 0 8px;margin-bottom:8px}
}

/* Строка «Что ещё нужно сделать» + сторона + «+».
   На компьютере как было: поле растягивается, список до 160.
   На телефоне строка неразрывная — иначе кнопка «+» уходила на свою
   строку и съедала целый ряд ради одного значка. Список ужимается до
   содержимого, поле забирает остаток. */
.chk-add{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.chk-add #chkNew{flex:1 1 200px;min-width:0}
.chk-add .btn{flex:none}
@media (max-width:620px){
  .chk-add{flex-wrap:nowrap}
  .chk-add #chkNew{flex:1 1 60px}
}

/* Строка новой проходки: имя · сколько с ним · убрать — одним рядом
   и на компьютере, и на телефоне. «От кого» убрано 03.10 (заказчик:
   «от кого не надо»), и вторая строка на телефоне больше не нужна.
   Над строками подписи колонок той же сетки. */
.gs-row,.gs-head{display:grid;grid-template-columns:minmax(0,1fr) 64px 36px;
  gap:6px;align-items:center;margin-bottom:6px}
.gs-row .gs-x{padding:0;width:36px}
.gs-head{margin-bottom:4px;font-size:.75rem;color:var(--mute)}
.gs-head span:nth-child(2){grid-column:2 / 4}
/* Окно одной проходки: имя и «сколько с ним» рядом, число узкое. */
.gs-edit{display:grid;grid-template-columns:minmax(0,1fr) 120px;gap:10px;align-items:end}
@media (max-width:620px){
  .gs-row,.gs-head{grid-template-columns:minmax(0,1fr) 62px 40px;column-gap:8px}
  .gs-row{margin-bottom:8px}
  .gs-row .gs-x{width:40px}
  .gs-edit{grid-template-columns:minmax(0,1fr) 104px}
}

/* Описание сущности из каталога в списке контрагентов — не длиннее двух
   строк. Заказчик: «на стартовой странице очень много текста, сократить
   максимум две строчки». Целиком оно есть в карточке контрагента. */
.ct-sub{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35}
/* Окно «как добавить»: путь кнопкой, под ним строка, что он даёт. */
.way-list{display:flex;flex-direction:column;gap:2px}
.way-list .btn.full{margin-top:10px;justify-content:flex-start;text-align:left}
.way-note{font-size:.7812rem;color:var(--dim);padding:0 2px 4px}
/* Новости: пункты списком, с отступом под маркер. */
.news-list{margin:10px 0 0;padding-left:18px;color:var(--dim);font-size:.8125rem;line-height:1.6}
.news-list li{margin-bottom:7px}
.news-list li::marker{color:var(--warm)}
/* Шапка карточки человека: лицо, имя и «написать» одной строкой.
   Кнопка стояла отдельной строкой над фотографией и на неё налезала. */
/* Стрелки периода в «Деньгах»: середина — название отрезка и возврат
   к текущему, по краям шаг назад и вперёд тем же размером. */
.mn-nav button:first-child,.mn-nav button:last-child{min-width:38px;font-size:.9375rem}
.mn-nav button:nth-child(2){font-variant-numeric:tabular-nums}
@media(max-width:620px){.mn-nav{width:100%}.mn-nav button:nth-child(2){flex:1}}
/* Материалы: строка списка и строка ввода — ссылка, что это, кто снимал. */
.md-row{display:flex;gap:8px;align-items:center;padding:7px 0;border-bottom:1px solid var(--line)}
.md-row:last-of-type{border-bottom:0}
.md-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
.md-x{flex:0 0 auto}
.md-new input{flex:1;min-width:0}
.md-new input:nth-child(2){flex:.8}
.md-new input:nth-child(3){flex:.7}
@media(max-width:620px){.md-new{flex-wrap:wrap}.md-new input{flex:1 1 100%}}
/* Крутящийся кружок «идёт работа»: без него человек не понимал,
   принял сервер публикацию или нет. */
.spin{display:inline-block;width:14px;height:14px;border-radius:50%;flex:0 0 auto;
  border:2px solid var(--line);border-top-color:var(--warm);animation:spin .8s linear infinite}
.btn .spin{width:13px;height:13px;margin-right:2px;vertical-align:-2px}
@keyframes spin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.spin{animation-duration:2.4s}}
.pn-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.pn-head .ava{width:54px;height:54px;max-height:54px;flex:0 0 auto;font-size:1.125rem}
/* Имя · Фамилия · Как объявлять: на телефоне первые два в ряд,
   псевдоним во всю ширину — так короче, чем три поля столбиком. */
@media(max-width:620px){
  .row-name{grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important}
  .row-name .field:last-child{grid-column:1 / -1}
}
/* Главная фотография помечена, у остальных — звёздочка «сделать главной». */
.vk-thumb.gal-main{outline:2px solid var(--warm);outline-offset:1px}
.gal-set{position:absolute;left:4px;bottom:4px;width:24px;height:24px;border-radius:50%;
  border:0;background:rgba(0,0,0,.55);color:#fff;font-size:.8125rem;line-height:1;cursor:pointer}
.gal-set:hover{background:var(--warm);color:#fff}
.ph-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}
.ph-grid img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:var(--r1);display:block;border:1px solid var(--line)}
/* Публичная страница райдера: заголовок блока — это содержимое, а не
   служебная подпись, поэтому обычный жирный текст, а не .eyebrow. */
.rd-head{font-weight:700;font-size:.9375rem;color:var(--text);margin:14px 0 6px;
  padding-bottom:5px;border-bottom:1px solid var(--line)}
.rd-logo{width:64px;height:64px;border-radius:var(--r2);object-fit:cover;
  border:1px solid var(--line);flex:0 0 auto}
@media(max-width:620px){.rd-logo{width:52px;height:52px}}

/* Кружок «?» раздела, когда заголовок спрятан как повтор липкой полосы. */
.head-tip{margin-top:2px}

/* ---------- ссылки ----------
   Заказчик: «чтоб не были просто синим подчёркнутым некрасивым шрифтом —
   пусть цвет меняют при наведении». В покое ссылка набрана цветом текста
   вокруг, с тихой чертой; под курсором становится синей, и черта — в цвет.
   Цвет, заданный в самой ссылке (суммы, «расход» розовым), инлайновый
   и сильнее — он остаётся: там цвет несёт смысл. */
.link-btn,
#main a:not(.btn):not(.dash-card),
.modal-box a:not(.btn){
  color:inherit;
  text-decoration:none;
  text-underline-offset:3px;
  transition:color .12s ease;
}
/* Черта появляется только под курсором — тогда видно, что нажимается,
   а в покое строка читается как обычный текст. */
.link-btn:hover, .link-btn:focus-visible,
#main a:not(.btn):not(.dash-card):hover,
#main a:not(.btn):not(.dash-card):focus-visible,
.modal-box a:not(.btn):hover,
.modal-box a:not(.btn):focus-visible{
  color:var(--blue);
  text-decoration:underline;
  text-decoration-thickness:1px;
}

/* Имя стороны на дате — заголовок плашки, а не строка текста:
   заказчик просил «пожирнее и чуть побольше, как было раньше». */
.side-card .n{font-size:.9688rem;font-weight:700;line-height:1.3}

/* Реферальные карточки лежат в обёртке #refBox без класса, поэтому правила
   «.card + .card» и «.card + .grid» между ними и соседями не срабатывали:
   зазор был ровно 0 и карточки слипались. */
#refBox{display:block;margin:14px 0}

/* ---------- ровные ряды в списках ----------
   Карточки контрагентов и людей были разной высоты: у одного есть
   описание, у другого нет, и ряд выходил рваным. В сетке карточка
   растягивается на высоту ряда, а её содержимое прижимается кверху. */
.grid.g2 > .card.card-open,
.grid.g3 > .card.card-open{ align-self:stretch; display:flex; flex-direction:column }
.grid.g2 > .card.card-open > *:first-child,
.grid.g3 > .card.card-open > *:first-child{ flex:1 }

/* Строка «Оформление» с кнопкой правки справа. На узком экране список
   сжимался до 60 точек и название шаблона было не прочесть — там строка
   переносится, а кнопка встаёт под ней. */
@media(max-width:620px){
  .tpl-row{flex-wrap:wrap}
  .tpl-row select{min-width:180px}
  .tpl-row #vkEditBtn{margin-left:0}
}

/* ── Кнопки-выбор: «Кем я работаю», «Что я играю» ──────────────────
   Раньше это были строки .chk с чертой снизу — квадратик сверху, подпись
   под ним и подчёркивание. Заказчик: «красивые кнопки сделать».
   Отмеченное показываем зелёным: это «включено», а не «вас ждут»
   (тёплый в сервисе значит другое). */
.pick-chip{position:relative;display:inline-flex;margin:0}
.pick-chip input[type=checkbox]{position:absolute;left:0;top:0;width:100%;height:100%;
  margin:0;padding:0;opacity:0;cursor:pointer;z-index:1}
.pick-chip .ch-in{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;
  border:1px solid var(--edge);border-radius:999px;background:transparent;
  font-size:.8125rem;line-height:1;color:var(--dim);white-space:nowrap;
  /* color в переходе не участвует: он берётся из переменной темы, и при
     смене оформления браузер оставлял анимированное значение прежним —
     в светлой теме подпись оставалась светлой (замер 2,59:1). */
  transition:border-color .12s,background .12s}
.pick-chip:hover .ch-in{color:var(--text)}
.pick-chip .dot{flex:none;width:17px;height:17px;border-radius:50%;
  border:1.5px solid var(--edge);display:inline-flex;align-items:center;justify-content:center;
  font-size:.625rem;font-weight:700;line-height:1;color:transparent;
  transition:background .12s,border-color .12s}
.pick-chip input:checked + .ch-in{border-color:var(--mint);background:var(--panel2);color:var(--text);font-weight:600}
/* Глиф поверх --mint нельзя задавать одним цветом: в тёмной теме зелёный
   светлый, в светлой тёмный. Белая галочка давала 1,87:1 (норма 4,5). */
.pick-chip input:checked + .ch-in .dot{background:var(--mint);border-color:var(--mint);color:#0B2018}
body.light .pick-chip input:checked + .ch-in .dot{color:#FFFFFF}
.pick-chip input:checked + .ch-in .dot::after{content:"✓"}
.pick-chip input:focus-visible + .ch-in{outline:2px solid var(--blue);outline-offset:2px}
.chips-row{display:flex;gap:8px;flex-wrap:wrap}
@media(max-width:900px){
  /* палец: не меньше 40 точек */
  .pick-chip .ch-in{height:40px;padding:0 15px;font-size:.8438rem}
}

/* Шапка «Дат» (11.09.2026). Заказчик: «уменьшить количество верхних кнопок».
   Вид (месяц · неделя · день · список) и «это место / все мои» стали
   двумя списками, «Расписание» убрано. На компьютере — одна строка,
   на телефоне — списки в первой строке, кнопки во второй. */
.dates-ctl{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.dates-sels,.dates-btns{display:flex;align-items:center;gap:8px}
.dates-sel{width:auto;max-width:230px;min-width:0}
.head-tip-slot{display:inline-flex;align-items:center}
.head-tip-slot:empty{display:none}
@media (max-width:620px){
  /* Обёртка .dates-ctl — прямой ребёнок .topbar и на телефоне
     становится display:contents (правило выше), поэтому строки
     задаются её детям. */
  #main > .topbar .dates-sels,
  #main > .topbar .dates-btns{flex:0 0 100%}
  /* Вид («Месяц», «Неделя») короткий — ему ширину по содержимому,
     а остаток отдаём названию рабочего места: при равных долях
     «Демо-агентство» обрезалось до «Демо-агентс». */
  .dates-sels .dates-sel{flex:1 1 0;max-width:none}
  .dates-sels .dates-sel:first-child{flex:0 0 auto;width:auto}
  .dates-btns .btn{flex:1 1 0;min-width:0}
  /* «дат в месяце: N» на телефоне лишняя: даты перечислены под сеткой. */
  .cal-head > .pill{display:none}
}

/* Окно «Что печатаем»: у кнопки две строки — название и пояснение. */
.btn.full.pr-opt{height:auto;min-height:56px;padding:10px 14px;flex-direction:column;
  align-items:flex-start;justify-content:center;gap:3px;text-align:left;white-space:normal}
.btn.full.pr-opt + .btn.full.pr-opt{margin-top:10px}
.btn.full.pr-opt b{font-size:.875rem}
.btn.full.pr-opt span{font-size:.75rem;font-weight:400;color:var(--dim);line-height:1.35}

/* Сет-лист на телефоне (11.09.2026). Заказчик: «очень нагромождённый
   дизайн в телефоне, ничего не понятно». Пять кнопок отбора вставали
   в три строки — там отбор одним списком; стрелки ▲▼ у каждого номера
   показываются только в режиме «Поменять порядок». */
.sl-fsel{display:none}
.sl-order-bar{display:none}
.eyebrow .sl-closed{text-transform:none;letter-spacing:0;margin-left:6px;vertical-align:middle}
@media (max-width:700px){
  #slWrap .filter-row{display:none}
  .sl-fsel{display:block;width:100%;margin-top:12px}
}
@media (max-width:700px),(hover:none){
  #slWrap:not(.sl-order) .ord{display:none}
  #slWrap.sl-order .sl-order-bar{display:flex;flex-wrap:nowrap;align-items:center;gap:10px}
  .sl-order-bar > span{flex:1 1 auto;min-width:0}
  .sl-order-bar > .btn{flex:none}
}

/* Сет-лист на телефоне: закреплённая колонка «Трек» (11.09.2026).
   Заказчик прислал снимки: при прокрутке вбок слева от названия
   видны обрывки имён («Эл», «Се»), а в одной строке фишки налезли
   на название. Полоса прокрутки держала слева внутренний отступ
   12 точек: липкая колонка встаёт ПОСЛЕ отступа, а содержимое
   уезжает до самого края — в полоску и просвечивал «Вокал».
   Отступ заменён прозрачной рамкой: рамка не прокручивается,
   просвечивать нечему, а без прокрутки всё стоит как прежде. */
@media(max-width:700px){
  #slWrap .table-scroll{padding-left:0;border-left:12px solid transparent;
    -webkit-overflow-scrolling:auto}
  /* Внутри прокручиваемых ячеек не оставляем «приподнятых» элементов:
     на айфоне именно они иногда рисовались поверх липкой колонки.
     Запас нажатия крестика — полями с отрицательным отступом:
     размер фишки прежний, а попасть по-прежнему можно. */
  .sl-table .cell-open{position:static}
  .sl-table .cell-x{position:static;padding:4px 5px;margin:-4px -3px}
  .sl-table .cell-x::before{content:none}
}
/* Палец, чуть задержавшийся на таблице при прокрутке вбок, выделял
   имена синим и вызывал лупу. В таблице сет-листа выделять нечего:
   имя открывает карточку участника. */
@media(hover:none){
  .sl-table{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
}

/* «Задачи» на вкладке «Общее» (сборка 860): задачи команды стоят в одном
   списке с пунктами даты и выглядят так же — квадратик, название, кто,
   крестик. Квадратик у задачи — кнопка: ей нужен свой сброс и запас
   нажатия до 40 точек (строка целиком не нажимается — название открывает
   саму задачу). Отменённую приглушаем цветом, а не прозрачностью. */
.chk-task .box{appearance:none;-webkit-appearance:none;padding:0;line-height:1;
  position:relative;font-size:.75rem}
.chk-task .box::before{content:"";position:absolute;inset:-10px}
.chk-sub{display:block;margin-top:2px;font-size:.7188rem;color:var(--mute)}
.chk-sub.late{color:var(--rose)}
.chk-task.off .box{color:var(--mute)}
.chk-task.off .t .link-btn{color:var(--mute);text-decoration:line-through}

/* Форма подачи треков на телефоне (сборка 861): свёрнута — над сет-листом
   одна кнопка «＋ Добавить трек», раскрыта — поля на том же месте.
   Раньше форма стояла под всем сет-листом, в 4,6 экрана от верха. */
.jam-add:not(.open){padding:0;border:0;background:none;box-shadow:none}
.jam-add:not(.open) .jam-add-body{display:none}
.jam-add.open .jam-add-go{display:none}

/* ───────── Проверка 12.09: партия правок по списку из 134 пунктов ─────────
   Правила для телефона и общие правки вида — здесь, в самом конце: при равной
   силе побеждает то, что ниже по файлу (грабля 67–87). */

/* 27: строка списка дат открывает дату целиком — показываем, что она нажимается */
table.mob-cards tr.ev-row{cursor:pointer}
@media(hover:hover){ table.mob-cards tr.ev-row:hover td{background:rgba(127,127,127,.05)} }
/* 33: на узком компьютере у «Перенести» остаётся значок — иначе кнопка
   и корзина уезжали за край таблицы (1024 точки) */
/* 104: на телефоне полоса действий с отмеченными стоит у нижнего края:
   отметил дату внизу списка — полоса видна сразу, а не за тысячу точек выше */
@media(max-width:620px){
  .bulk-bar{position:fixed;left:8px;right:8px;bottom:calc(8px + env(safe-area-inset-bottom));
    z-index:60;margin:0!important;max-height:72vh;overflow:auto;
    box-shadow:0 10px 30px rgba(0,0,0,.38)}
  #slBulk{position:fixed;left:8px;right:8px;bottom:calc(8px + env(safe-area-inset-bottom));
    z-index:60;margin:0!important;box-shadow:0 10px 30px rgba(0,0,0,.38)}
  body.bulk-on #main{padding-bottom:170px}
}
/* 75: кружок выбора фотографии (профиль, настройки места, профиль музыканта)
   задуман 62×62, а общий потолок .ava{max-height:34px} сплющивал его
   в «таблетку» 62×34 и уменьшал фото профиля вдвое */
.ava.photo-pick{width:62px;height:62px;max-height:62px;min-width:62px;font-size:1.125rem;border-radius:14px}
/* 24: «итогов нет» на телефоне — тонкий тёплый ободок вокруг точки.
   Раньше правило с тремя классами (.tone-done.nores) возвращало точке
   рамку толщиной 3 точки пунктиром — выглядело как сбой */
@media(max-width:560px){
}
/* 86: печать сет-листа. Лист A4 уже 900 точек, и телефонные правила
   кружка «?» (20×20, запас нажатия position:absolute) действовали и на
   бумаге: текст комментария ложился поверх названия номера. На бумаге
   комментарий — обычная строка текста, а таблица сжимается до листа. */
@media print{
  .tip.tip-bubble{position:static!important;width:auto!important;height:auto!important;
    border:0!important;background:none!important;border-radius:0!important}
  .tip.tip-bubble::before{position:static!important;inset:auto!important}
  .sl-table{width:100%!important;min-width:0!important;font-size:.6562rem!important}
  .sl-table th,.sl-table td,.sl-table .cell-name,.sl-table .cell-label{white-space:normal!important;
    word-break:break-word}
  .sl-table .track-cell{position:static!important;min-width:0!important}
  .sl-table th,.sl-table td{padding:4px 5px!important}
}
/* 45: «Назад» — маленькая стрелка в строке вида и дня, а не широкая кнопка
   на своей строке; стороны — одной строкой на любом экране */
.ev-crumb{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ev-back{width:32px;height:32px;flex:none;border-radius:8px;border:1px solid var(--edge,var(--line));
  background:var(--panel);color:var(--text);font-size:.9375rem;line-height:1;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;position:relative}
.ev-back::before{content:"";position:absolute;inset:-6px}
.ev-back:hover{border-color:var(--warm);color:var(--warm)}
.sides-short{display:flex;align-items:center;min-height:36px;margin:0 0 10px;flex-wrap:wrap;gap:4px}
.sides:not(.on){display:none}
/* 46: ряд вкладок не влез — список, как на телефоне */
.tabs-row.tabs-over .tabs{display:none!important}
.tabs-row.tabs-over .tabs-sel{display:block;flex:1;min-width:0;width:auto;height:40px;margin:0}
/* 52: телефон в листе дня не рвётся посреди номера */
a[href^="tel:"]{white-space:nowrap}
@media print{ a[href^="tel:"]{white-space:nowrap} }
/* 56: короткие поля (время, числа итогов) на телефоне — по два в ряд,
   а не по одному: четыре поля занимали 380 точек */
@media(max-width:900px){ .grid.g2.g2k{grid-template-columns:repeat(2,minmax(0,1fr))} }

/* ===== Проверка 12.09, партия 2: даты ===== */
/* 25: метка статуса того же цвета, что точка в месяце и полоска в неделе */
.pill.past{border-style:dashed;color:var(--mute)}
.pill-btn.blue{background:rgba(110,139,255,.14);border-color:rgba(110,139,255,.4);color:var(--blue)}
.pill-btn.past{background:var(--panel2);border-style:dashed;color:var(--mute)}
.tip.tip-pre::after{white-space:pre-line}
/* 31: план дня — время узкой колонкой, текст всегда от одного края */
.kv.plan{justify-content:flex-start}
.kv.plan .k{flex:0 0 46px}
.kv.plan .v{flex:1 1 auto;min-width:0;text-align:left}
/* 35: карточка недели — время над названием, стороны одной строкой */
.span-ev{flex-direction:column;align-items:stretch;gap:2px;min-width:0}
.span-t{min-width:0;font-size:.7812rem}
.span-name{display:block;font-weight:600;overflow-wrap:anywhere;line-height:1.3}
.span-sides{display:block;color:var(--mute);font-size:.7188rem;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
@media (max-width:900px){
  /* пустой день — тонкая строка, а не карточка в сто точек */
  .span-col.empty{flex-direction:row;align-items:center;gap:10px;padding:4px 6px 4px 10px;min-height:0}
  .span-col.empty .span-head{border-bottom:none;padding:0;flex:1 1 auto;min-width:0}
  .span-col.empty .span-body{flex:0 0 auto}
  .span-col.empty .span-add{width:auto;margin:0;padding:0 12px;min-height:36px}
}
/* 31: на бумаге день был чёрным прямоугольником — в печати светлые цвета */
@media print{
  :root,body,body.light{--ink:#fff!important;--panel:#fff!important;--panel2:#fff!important;
    --text:#111!important;--dim:#333!important;--mute:#555!important;--line:#bbb!important}
  .span-col,.span-ev{background:#fff!important;box-shadow:none!important}
  .span-add,.legend,.dates-ctl{display:none!important}
}
/* 38: на 320 точках строка списков была 325 при месте 288 — у flex-элемента
   min-width:auto не даёт ему стать уже содержимого. Разрешаем сжиматься. */
@media (max-width:620px){
  #main > .topbar .dates-sels,#main > .topbar .dates-btns{min-width:0}
}

/* ===== Проверка 12.09, партия 3: деньги, контрагенты, команда ===== */
@media (max-width:620px){
  /* «Обороты»: имя и число дат в первой строке, три суммы — во второй */
  table.mn-ct tr{display:flex!important;flex-wrap:wrap;align-items:flex-start;gap:6px 10px}
  table.mn-ct td{padding:0!important;min-height:0}
  table.mn-ct td:nth-child(1){order:1;flex:1 0 calc(100% - 70px);min-width:0}
  table.mn-ct td:nth-child(2){order:2;color:var(--mute);font-size:.75rem;padding-left:0!important}
  table.mn-ct td:nth-child(2)::before{content:"дат: "!important;position:static!important}
  table.mn-ct td:nth-child(n+3){order:3;flex:1 1 0;min-width:0;padding-left:0!important}
  table.mn-ct td:nth-child(n+3)::before{position:static!important;display:block;margin-bottom:2px}
  /* 70: «Свод за период» — отступ под заголовком раздела, строки без лишнего ряда */
  .mn-tab .mn-sec{padding-top:18px}
  /* 990: только в «Своде» — там в колонке одно «переименовать статью»,
     а оно есть в «Источниках и статьях». Правило было общим и прятало
     карандаш, крестик и «✓ Получили» у денег даты: на телефоне строку
     денег нельзя было ни поправить, ни отметить. */
  .mn-tab.mn-sv .mn-act{display:none}
}
/* 71: отбор «Денег» на телефоне — список «с кем» и порядок в один ряд */
@media (max-width:900px){
  .mn-filters select{flex:1 1 calc(50% - 4px)!important;min-width:0}
}
/* 77: что нужно для джема — отмечено в самих подписях */
/* 78: подсказки «Enter — отправить», «наведите» — только там, где есть мышь */
@media (hover:none){ .desk-only{display:none!important} }

/* ===== Проверка 12.09, партия 4: джем ===== */
/* 90: номер выступления — в закреплённой ячейке «Трек» */
.tr-no{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:22px;
  margin-right:7px;padding:0 5px;border-radius:6px;font-family:Oswald,sans-serif;font-weight:600;
  font-size:.8125rem;color:var(--dim);background:var(--panel2);vertical-align:1px;
  font-variant-numeric:tabular-nums}
button.tr-no{border:1px solid var(--edge,var(--line));cursor:pointer;color:var(--text)}
button.tr-no:hover,button.tr-no:focus-visible{border-color:var(--warm);color:var(--warm)}
@media (hover:none){ button.tr-no{min-width:32px;height:32px;font-size:.875rem} }
/* «Трек» закреплён и на компьютере: на 1024 точках «Клавиши», «Доп.»
   и «Статус» уходили за край, и было не понять, чей это состав */
@media (min-width:701px){
  .sl-table .track-cell{position:sticky;left:0;z-index:2;background:var(--panel);
    box-shadow:6px 0 8px -6px rgba(0,0,0,.22)}
  .sl-table thead th.track-cell{z-index:5;background:var(--panel2)}
  .sl-table tbody tr td.track-cell,.sl-table tbody tr:hover td.track-cell{background-color:var(--panel)}
}
/* колонка порядка у ведущего — на телефоне только в режиме «поменять порядок» */
@media (max-width:700px){ #slWrap:not(.sl-order) .sl-table .num-cell{display:none} }
/* 99: стрелки одинаковые и крупнее на компьютере */
@media (min-width:701px){ .ord-b{width:28px;height:24px;font-size:.6875rem} }
/* 88: крестик «снять с роли» отодвинут от имени; на телефоне запас нажатия
   полями, без «приподнятых» элементов (правило 857) */
.sl-table .cell-x{margin-left:6px}
@media (max-width:700px){ .sl-table .cell-x{padding:7px 8px;margin:-7px -6px -7px 4px} }
/* 89: «+» на телефоне — вид прежний 26×26, нажимается 40×40 */
.cell-add > span{pointer-events:none}
@media (max-width:700px),(hover:none){
  .sl-table .cell-add{width:40px;height:40px;margin:-6px -7px;border:none;background:none;padding:0}
  .sl-table .cell-add > span{display:inline-flex;align-items:center;justify-content:center;
    width:26px;height:26px;border:1px dashed var(--edge);border-radius:6px}
  .sl-table .cell-add:hover,.sl-table .cell-add:focus-visible{background:none}
  .sl-table .cell-add:hover > span,.sl-table .cell-add:focus-visible > span{
    border-color:rgba(255,180,84,.6);color:var(--warm)}
}
/* 90: копия строки заголовков под верхней полосой */
#slHeadFloat{box-shadow:0 6px 10px -8px rgba(0,0,0,.45)}
#slHeadFloat .sl-table{margin:0;border-collapse:collapse}
#slHeadFloat th{background:var(--panel2)!important;border-bottom:2px solid var(--line)}
@media print{ #slHeadFloat{display:none!important} .sl-table .num-cell{display:none!important} }

/* ===== Проверка 12.09, партия 5: общее ===== */
/* 106: «Удалить» стояло в 4 точках от «Изменить» — промах по карандашу
   удалял строку денег или должность */
.btn.role-del{margin-left:12px}
/* 114: у переключателя рабочих мест и в окне «Рабочие места» стояли белые
   «3» и «18» без значка — значок непрочитанного был только внутри меню.
   Тот же красный кружок везде, где стоит .cnt.alert. */
.cnt.alert{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;
  padding:0 5px;border-radius:99px;font-size:.6875rem;font-weight:700;line-height:1;
  background:var(--rose);color:#2A0A0E;letter-spacing:0}
body.light .cnt.alert{color:#fff}
.ws .cnt.alert{margin-left:6px}
.sp-row .cnt.alert{margin-left:8px}
/* 110: переключатель темы на витрине и на странице джема — в шапке */
.lp-theme{width:40px;padding:0;justify-content:center}
.jam-top{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.jam-top #themeJam{width:40px;padding:0;justify-content:center;flex:none}
/* 115: на компьютере в кабинете версия — под профилем в меню, а не уголком
   поверх содержимого; на витрине и публичных страницах уголок остаётся.
   Кнопка «Закрыть меню» на компьютере не нужна: её ловил Tab, а внизу
   слева висела светлая полоска 16×6. */
.ver-side{display:none}
.side-veil:not(.on){display:none}
@media (min-width:821px){
  .shell.on ~ .ver{display:none}
  .ver-side{display:block;width:100%;margin-top:8px;padding:4px 6px;background:none;border:0;
    color:var(--mute);font-size:.6562rem;letter-spacing:.04em;text-align:center;cursor:pointer}
  .ver-side:hover{color:var(--dim)}
}

/* ===== Проверка 12.09, партия 6: оформление ===== */
/* 127: пустой квадратик выбора сливался с карточкой — край 1,32:1 при норме 3:1.
   Обводим цветом края полей: 3,0–3,6:1 в обеих темах. */
.chk .box{border-color:var(--edge)}
.pick span{border-color:var(--edge)}
/* 132: полосы прокрутки ряда вкладок, меню и переключателей срезали рамку
   фокуса — от неё оставались две черты. Рамку рисуем внутри кнопки. */
.seg button:focus-visible,nav.menu button:focus-visible,.tabs button:focus-visible,
.vk-tabs button:focus-visible{outline-offset:-2px}
/* 133: смысловые подписи — не мельче 12 точек. Дни недели, «нет: …»,
   подписи сторон, заголовки таблиц, подпись партии в сет-листе, «кто»
   у пункта задач. На вечере и при плохом свете 10,5 точки не прочитать. */
.cal .dow,.span-dow,.mc-wdays,.mc-wd,.mc-n,.span-mon{font-size:.75rem}
.side-card .r{font-size:.75rem}
th,.sl-table th{font-size:.75rem}
.cell-label{font-size:.75rem}
.dc-miss .pill{font-size:.75rem}
.chk .who{font-size:.75rem}

/* ===== Проверка 12.09, партия 7: новичок и первый экран ===== */
/* 21: строка задачи на «Ближайшем» — кнопка: открывает задачу. Название
   основным цветом, под ним дата-мероприятие; справа коротко «12.08 · кто». */
.dash-task{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;width:100%;
  padding:8px 0;background:none;border:0;border-bottom:1px dashed var(--line);color:var(--text);
  font:inherit;font-size:.8125rem;text-align:left;cursor:pointer}
.dash-task:last-child{border-bottom:0}
.dash-task:hover .dt-main b{text-decoration:underline;text-decoration-color:var(--edge)}
.dt-main{flex:1;min-width:0}
.dt-main b{font-weight:600}
.dt-ev{display:block;color:var(--mute);font-size:.75rem;margin-top:1px}
.dt-when{flex:none;max-width:46%;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 5: заголовок экрана «Что заводим?» */
.fs-title{font-family:Oswald,sans-serif;font-weight:600;font-size:1.375rem;text-transform:uppercase;
  letter-spacing:.02em;margin:18px 0 0;color:var(--text)}
/* 9: цены — два ряда одинаковых карточек: подписка на сервис и, отдельно, посты ВК */
.lp-plans{display:block}
.lp-plan-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:14px;margin-top:14px}
.lp-plan-row .lp-plan{min-width:0;flex:none}
.lp-plan-h{font-family:Oswald,sans-serif;font-weight:600;font-size:1.0625rem;text-transform:uppercase;
  letter-spacing:.02em;margin:26px 0 0;color:var(--text)}
@media (max-width:560px){ .lp-plan-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px} }
/* 15: полоса показа — одна строка текста и кнопки справа */
.plan-bar.demo .pb-t{flex:1 1 220px;min-width:0}
.plan-bar.demo .pb-b{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
@media (max-width:620px){
  .plan-bar.demo{padding:8px 10px;gap:8px;margin-bottom:12px}
  .plan-bar.demo .pb-b{margin-left:0}
}
/* 17: снимок витрины во весь экран */
.lp-shots img{cursor:zoom-in}
.lp-zoom{position:fixed;inset:0;z-index:120;background:rgba(8,9,14,.9);overflow:auto;
  display:flex;align-items:flex-start;justify-content:flex-start;padding:56px 12px 24px;
  -webkit-overflow-scrolling:touch}
.lp-zoom-in{margin:auto}
.lp-zoom-in img{display:block;width:auto;max-width:min(1280px,94vw);max-height:none;border-radius:10px;
  border:1px solid rgba(255,255,255,.18)}
.lp-zoom-x{position:fixed;top:10px;right:12px;min-width:40px;min-height:40px;background:rgba(20,22,32,.9);
  color:#E9EBF3;border-color:rgba(255,255,255,.3);z-index:121}
/* на телефоне снимок шире экрана — листается пальцем, подписи читаются */
@media (max-width:700px){ .lp-zoom-in img{max-width:none;width:900px} }
/* Места с закончившейся подпиской — своей свёрнутой группой внизу окна
   «Рабочие места» и «Куда войти» (заказчик: «как-то скрывать»). Заголовок
   группы выглядит как подпись других групп, а работает как кнопка. */
.sp-exp-t{display:flex;align-items:center;gap:6px;width:100%;min-height:2.5rem;margin:.875rem 0 .375rem;
  padding:0;background:none;border:0;cursor:pointer;text-align:left;font-family:inherit}
.sp-exp-t:hover{color:var(--text)}
.sp-exp-t:focus-visible{outline:2px solid var(--warm);outline-offset:2px;border-radius:6px}
.sp-exp-ar{margin-left:auto;font-size:.8125rem;letter-spacing:0}
.sp-row.exp .sp-n{color:var(--dim)}
/* 881: сет-лист на компьютере — колонки ролей поровну. Заказчик: «почему
   в ПК-версии так много места для вокала?» Таблица раскладывалась сама
   и отдавала свободное место колонке с самой длинной строкой: у вокала
   в строке по три-четыре имени, и на 1728 точках «Вокал» был 424 против
   141 у «Клавиш» — там имя переносилось на три строки. Теперь служебные
   колонки своей ширины, а роли делят остаток поровну. Наименьшую ширину
   таблицы задаёт сама страница (--sl-min: по 116 на роль), дальше она
   листается вбок с закреплённым «Треком». Телефон и печать не трогаем —
   там раскладка своя. */
@media screen and (min-width:701px){
  .sl-table{table-layout:fixed;min-width:var(--sl-min,820px)}
  .sl-table th.pick-cell{width:38px}
  .sl-table th.num-cell{width:72px}
  .sl-table th.track-cell{width:190px;min-width:0}
  .sl-table th.st-col{width:190px}
  /* узкая колонка: фишка не шире ячейки, длинное слово переносится,
     а не вылезает в соседнюю колонку. Подпись партии («вторая гитара»)
     уходит под имя: в одну строку с ней имя сжималось до буквы в строке. */
  .sl-table .cell-name{max-width:100%;flex-wrap:wrap}
  .sl-table .cell-open,.sl-table .cell-real,.sl-table .track-title{overflow-wrap:anywhere}
}
/* 882: у «Дат» один список вместо двух — «Все мои» стали личным
   календарём. На телефоне список вида, кружок «?» и обе кнопки встают
   одной строкой, если помещаются (от 360 точек): заказчик просил «чтобы
   все объекты были в одну линию, без пустоты из-за переноса». На совсем
   узком экране кнопки уходят второй строкой и растягиваются, как раньше.
   Поля кнопок ужаты с 15 до 10, зазоры с 8 до 4–6: на 375 не хватало
   пяти точек, на 360 (частая ширина у Андроида) — ещё восьми. */
@media (max-width:620px){
  #main > .topbar .dates-sels{flex:0 0 auto;gap:4px}
  #main > .topbar .dates-btns{flex:1 1 auto;min-width:0;gap:6px}
  #main > .topbar .dates-btns .btn{flex:1 1 auto;padding:0 10px}
}

/* 886: вопросы «да / нет» и «впишите» — без жирного шрифта. Заголовком
   раньше становилась вся первая строка вопроса, и объяснение («Она уйдёт
   в „Корзину"…») шло крупным жирным абзацем. Заказчик: «шрифт поправить
   на не жирный». Вопрос — обычным начертанием, крупнее текста; объяснение —
   обычный текст читаемого размера. У вопроса с крестиком (каталог) заголовок
   в строке .modal-head — ему снимаем плакатный Oswald и прописные. */
.modal-box .ask-h{font-size:1.1875rem;font-weight:400;line-height:1.35;margin:0 0 12px;
  color:var(--text);letter-spacing:0;text-wrap:balance}
.modal-head h3.ask-h{font-family:inherit;text-transform:none;margin:0}
.modal-box .ask-t{font-size:.9375rem;max-width:none}

/* 887: «Настройки» → «Серии джемов». Строка серии — название, где обычно
   проходит и сколько впереди, ссылка полем и три кнопки. На широком экране
   кнопки справа от текста, на узком — строкой под ним. */
.jser-row{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;
  padding:12px 0;border-bottom:1px solid var(--line)}
.jser-row:last-of-type{border-bottom:0}
.jser-main{flex:1 1 240px;min-width:0;display:grid;gap:4px}
.jser-main b{font-weight:600;overflow-wrap:anywhere}
.jser-main input{font-size:.75rem;margin-top:4px}
.jser-acts{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
@media (max-width:620px){
  .jser-acts{flex:1 1 100%}
}

/* Группы в чате: во вкладке «Чат» у даты разговоры — кнопками в ряд,
   на телефоне — списком (групп по песням бывает десяток). */
.talk-pills{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 12px}
.talk-pills .btn.talk-off{color:var(--dim)}
.talk-sel-row{display:none;gap:8px;align-items:center;margin:10px 0 12px}
.talk-sel-row .talk-sel{flex:1;min-width:0;margin:0}
.grp-head{display:flex;justify-content:space-between;align-items:center;gap:8px 12px;
  flex-wrap:wrap;margin:0 0 8px}
.grp-name{min-width:0;overflow-wrap:anywhere}
.grp-name span{color:var(--mute);font-size:.8125rem}
.grp-acts{display:flex;gap:6px;flex-wrap:wrap}
.grp-presets{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:10px}
.grp-presets select{flex:1 1 200px;min-width:0;width:auto;max-width:360px;margin:0}
/* строка «Группы» на странице джема — во всю ширину карточки «Вы в этом джеме» */
.jam-grp-slot{flex:1 0 100%}
.jam-grp-slot:empty{display:none}
.jam-grp{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:4px;
  padding-top:10px;border-top:1px solid var(--line)}
.jam-grp .eyebrow{margin:0 4px 0 0}
.jam-grp-hint{color:var(--mute);font-size:.8125rem}
@media (max-width:620px){
  .talk-pills{display:none}
  .talk-sel-row{display:flex}
}

/* Шапка даты на совсем узком экране (320). Заказчик: «Повторить» и
   «Изменить» — в один ряд, кнопки поменьше, если не влезает. Статус 103,
   «Повторить» 88, «Изменить» 104 и два зазора — 307 при доступных 288.
   Карандаш у «Изменить» на таком экране прячем, поля кнопок ужимаем. */
@media (max-width:350px){
  #main > .topbar .ev-acts .btn{padding-left:8px;padding-right:8px}
  #main > .topbar .ev-acts .btn svg{display:none}
}

/* Партнёры и спонсоры (15.09). Заказчик: «уменьшить в мобильной версии,
   объекты кнопок перенести» — на снимке ✏️ и ✕ стояли отдельной строкой
   под каждым партнёром. На телефоне кнопки встают в строку названия,
   третьей колонки нет, подписи «Кто» нет, поля меньше. */
.pt-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.pt-name{min-width:0;overflow-wrap:anywhere}
.pt-link{font-weight:700}
.pt-acts-in{display:none;flex:none;gap:6px}
.pt-acts-td{text-align:right;white-space:nowrap}
.pt-from,.pt-win{display:block;font-size:.7188rem;color:var(--mute);margin-top:2px}
.pt-win{color:var(--dim)}
/* Победители — раскрывающийся список с галочками (15.09): кнопками
   на 35 участников выходило полтора экрана. Закрытый — строка ростом
   с поле ввода, открытый — поиск и список с прокруткой. */
.pt-win-dd{position:relative}
.pt-win-btn{display:flex;align-items:center;gap:8px;width:100%;height:40px;padding:0 34px 0 12px;
  background-color:var(--ink);border:1px solid var(--edge);border-radius:9px;color:var(--text);
  text-align:left;font-size:.875rem;line-height:1.2;
  /* та же стрелка, что у списков выбора: два треугольника фоном */
  background-image:linear-gradient(45deg,transparent 50%,var(--dim) 50%),
                   linear-gradient(135deg,var(--dim) 50%,transparent 50%);
  background-position:calc(100% - 17px) calc(50% + 1px), calc(100% - 12px) calc(50% + 1px);
  background-size:5px 5px, 5px 5px;background-repeat:no-repeat}
body.light .pt-win-btn{background-color:#FFFFFF}
.pt-win-btn:hover{border-color:var(--mute)}
.pt-win-btn:focus-visible{border-color:var(--blue);outline:none}
.pt-win-val{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pt-win-ph{color:var(--mute)}
#ptWinN{flex:none;display:inline-flex}
#ptWinN:empty{display:none}
.pt-win-dd.open .pt-win-btn{border-color:var(--blue);border-radius:9px 9px 0 0;
  background-image:linear-gradient(135deg,transparent 50%,var(--dim) 50%),
                   linear-gradient(45deg,var(--dim) 50%,transparent 50%);
  background-position:calc(100% - 17px) calc(50% - 2px), calc(100% - 12px) calc(50% - 2px)}
.pt-win-panel{display:none;border:1px solid var(--blue);border-top:none;border-radius:0 0 9px 9px;
  background:var(--panel);padding:8px}
.pt-win-dd.open .pt-win-panel{display:block}
.pt-win-panel input[type=search]{margin:0 0 6px}
.pt-win-list{max-height:min(46vh,300px);overflow-y:auto;overscroll-behavior:contain}
.pt-win-t{margin:10px 6px 2px;font-size:.6875rem;color:var(--mute);text-transform:uppercase;letter-spacing:.08em}
.pt-win-list > .pt-win-t:first-child{margin-top:4px}
/* .field label (0,1,1) делал строку блоком: квадратик вставал над именем,
   а имя мелким серым — сила здесь 0,2,1 */
.pt-win-list label.chk{display:flex;align-items:center;gap:10px;margin:0;border-bottom:none;
  padding:0 6px;min-height:40px;border-radius:7px;cursor:pointer;font-size:inherit;color:var(--text)}
.pt-win-list label.chk:hover{background:var(--panel2)}
.pt-win-list .chk .t{font-size:.875rem;line-height:1.3;overflow-wrap:anywhere;padding:6px 0}
.pt-win-empty{margin:6px}
.pt-win-new{display:block;width:100%;min-height:40px;margin-top:6px;padding:0 10px;text-align:left;
  background:transparent;border:1px dashed var(--edge);border-radius:7px;color:var(--text)}
.pt-win-new:hover,.pt-win-new:focus-visible{border-color:var(--blue);outline:none}
.pt-win-foot{display:flex;justify-content:flex-end;margin-top:8px}
@media(max-width:900px){
  /* ростом с поле ввода на телефоне: 44 точки и шрифт не мельче 16 */
  .pt-win-btn{height:44px;font-size:max(16px,1rem)}
  .pt-win-list label.chk{min-height:44px}
}
@media (max-width:620px){
  #partBox table.mob-cards tr{padding:6px 10px;margin-bottom:6px}
  #partBox table.mob-cards td{padding:2px 0}
  #partBox table.mob-cards td[data-l]{padding-left:74px}
  #partBox table.mob-cards td[data-l]::before{width:70px}
  #partBox table.mob-cards td[data-l=""]{padding-left:0}
  #partBox .pt-acts-td{display:none}
  #partBox .pt-acts-in{display:inline-flex}
}

/* Приглашённые участники / Шоукейс — под сет-листом на странице джема (15.09) */
.sc-card{margin-top:14px}
.sc-row{padding:10px 0;border-top:1px solid var(--line)}
.sc-card > .eyebrow + .sc-row{border-top:none;padding-top:6px}
.sc-head{display:flex;justify-content:space-between;align-items:flex-start;gap:8px 12px}
.sc-name{flex:1 1 auto;font-size:1rem;min-width:0;overflow-wrap:anywhere}
.sc-acts{flex:none;display:inline-flex;gap:6px;align-items:center}
.sc-link{display:inline-block;max-width:100%;margin-top:4px;font-size:.875rem;color:var(--blue);
  text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}
.sc-link:hover,.sc-link:focus-visible{text-decoration:underline}
.sc-press{margin-top:6px;white-space:pre-wrap;line-height:1.6;color:var(--dim);font-size:.875rem;overflow-wrap:anywhere}
.sc-press.cut{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.sc-more{margin-top:4px;font-size:.8125rem}
.sc-terms{margin-top:8px;font-size:.8125rem;color:var(--text);background:var(--panel2);border-radius:9px;padding:8px 10px}
.sc-terms svg{width:14px;height:14px;vertical-align:-2px}
.sc-form{margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}

/* Закрыть участие в джемах (15.09): полоса у закрытого, строка в карточке
   участника у ведущего, список в «Настройках» */
.jb-bar{margin-top:8px;padding:9px 12px;border-radius:9px;border:1px solid var(--rose);
  background:rgba(255,107,122,.08);color:var(--text);font-size:.875rem;line-height:1.5}
.jb-bar svg{width:15px;height:15px;vertical-align:-2px;color:var(--rose)}
.jb-state{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.8125rem;margin-top:10px}
.jb-state > svg{width:14px;height:14px;color:var(--rose);flex:none}
.jb-row{display:flex;justify-content:space-between;align-items:center;gap:8px 12px;flex-wrap:wrap;
  padding:8px 0;border-top:1px solid var(--line)}
.jb-main{display:flex;flex-direction:column;gap:2px;min-width:0}

/* Верхняя полоса (☰, раздел, колокольчик) липнет на всём телефонном виде —
   до 900, а не только до 560. Ряд вкладок даты с 620 и уже липнет
   с отступом 63 точки ПОД неё; между 561 и 620 полоса уезжала, и ряд
   «Общее ▾ · ＋ ещё» висел посреди экрана поверх содержимого (снимок
   заказчика 15.09). Отступы липких рядов считаются от высоты полосы,
   значит полоса обязана липнуть везде, где липнут они. */
@media(max-width:900px){
  .mob-top{position:sticky;top:0;z-index:30;background:var(--ink);
    margin:-16px -16px 12px;padding:9px 16px;
    border-bottom:1px solid var(--line)}
}

/* «Партнёры с других дат» (15.09): даты своими блоками, партнёры галочками. */
.ptp-list{margin-top:10px;max-height:min(56vh,440px);overflow-y:auto;overscroll-behavior:contain}
.ptp-date{padding:10px 0;border-top:1px solid var(--line)}
.ptp-date:first-child{border-top:0}
.ptp-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:2px}
.ptp-day{color:var(--mute);font-size:.75rem;white-space:nowrap}
.ptp-list .chk.ptp-row{min-height:40px;padding:6px 0;border-bottom:0}
.ptp-row.ptp-have{display:flex;justify-content:space-between;align-items:center;gap:10px;
  min-height:40px;padding:6px 0 6px 29px;color:var(--dim)}
.ptp-gives{color:var(--dim)}
.ptp-list .t{min-width:0;overflow-wrap:anywhere}

/* Строки денег между сторонами даты (15.09): другая сторона видит строку,
   где «кому / от кого» — она, и отвечает «дошло». Блок ответа — тёплой
   рамкой (от вас ждут), текст обычным цветом: его читают, а не только
   замечают. */
.peer-box{margin:12px 0 4px;padding:10px 14px;border:1px solid rgba(255,180,84,.38);
  border-radius:10px;background:var(--panel2)}
.peer-h{color:var(--warm);font-weight:600;font-size:.8125rem;margin-bottom:2px}
.peer-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:8px 14px;padding:9px 0;border-top:1px solid var(--line)}
.peer-h + .peer-row{border-top:0}
.peer-t{flex:1 1 260px;min-width:0;font-size:.8438rem;line-height:1.45;overflow-wrap:anywhere}
.peer-a{display:flex;gap:8px;flex-wrap:wrap}
.peer-st{display:block;font-size:.7188rem;color:var(--mute);margin-top:2px}
.peer-st.ok{color:var(--mint)}
.peer-st.no{color:var(--rose)}
.peer-st.warn{color:var(--warm)}
.peer-hint{margin-top:8px;color:var(--warm)}
@media(max-width:620px){
  .peer-a{width:100%}
  .peer-a .btn{flex:1 1 auto}
}

/* Шоукейс (15.09): зазор снизу — как у всех карточек. Раньше отступ был
   только сверху, и «Вы в этом джеме» прилипала к шоукейсу вплотную (замер: 0). */
.sc-card{margin-bottom:14px}
/* Фотографии участника шоукейса — маленькими копиями под названием */
.sc-photos{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.sc-ph{display:block;width:64px;height:64px;flex:none;border-radius:8px;overflow:hidden;
  border:1px solid var(--line);background:var(--panel2)}
.sc-ph img{width:100%;height:100%;object-fit:cover;display:block}
.sc-ph:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
#scPhBox .vk-thumbs{margin:0 0 8px}
@media(max-width:620px){ .sc-ph{width:56px;height:56px} }

/* Итоги вечера на замке (сборка 914): записанное видно, но поля не правятся,
   пока не нажали «Изменить». Рамку снимаем, фон тихий — поле читается
   как готовое значение, а не как приглашение что-то вписать. */
.res-lock input[readonly],.res-lock input[readonly]:focus{background:var(--panel2);
  border-color:transparent;cursor:default}
.res-lock input[type=number]{-moz-appearance:textfield;appearance:textfield}
.res-lock input[type=number]::-webkit-inner-spin-button,
.res-lock input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
/* галочка на замке выключена — пусть и выглядит выключенной, иначе её жмут
   и решают, что она сломана; текст приглушаем цветом, а не прозрачностью */
.res-lock .chk{cursor:default}
.res-lock .chk input[type=checkbox]:disabled{cursor:default}
.res-lock .chk input[type=checkbox]:disabled+.box{opacity:.55}
.res-lock .chk > span:last-child{color:var(--dim)}
.rs-note{min-height:6.875rem}
.rs-note-view{padding:10px 12px;border-radius:9px;background:var(--panel2);font-size:.875rem;
  line-height:1.45;min-height:40px;white-space:pre-wrap;overflow-wrap:anywhere}
.res-acts{display:flex;flex-wrap:wrap;align-items:center;gap:8px}

/* Точка безубыточности (15.09): цена и вместимость правятся прямо
   в карточке. Два коротких числа стоят рядом и на телефоне — поле
   во всю ширину ради «500» только растягивает карточку. */
.be-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;
  max-width:26rem;margin-top:10px}

/* «Персонал» (15.09): имя своего человека ведёт в его карточку.
   На телефоне наведения нет, поэтому рядом тихая стрелка — видно,
   что строка открывается. Лицо нажимается так же, как имя. */
.crew-nm{font-weight:700}
.crew-go{margin-left:4px;color:var(--mute);font-weight:400}
.crew-nm:hover .crew-go,.crew-nm:focus-visible .crew-go{color:inherit}
.crew-ava-go{display:flex;flex:none;cursor:pointer;border-radius:50%}

/* 920: пояснение над формой входа — пришли по ссылке на дату */
.auth-note{margin:0 0 14px;padding:10px 12px;border-radius:10px;
  background:var(--panel2);color:var(--text);font-size:.8438rem;line-height:1.45}

/* 923: кнопка-выбор с длинным названием («Да, это «Клуб …» · Санкт-Петербург»)
   переносится на вторую строку — высота кнопки фиксирована, и строки
   налезали друг на друга. Такой кнопке высота по содержимому. */
.btn.btn-wrap{height:auto;min-height:44px;padding:10px 14px;line-height:1.35;
  white-space:normal;text-align:left;justify-content:flex-start}

/* 931: карточка контрагента. Заказчик: «в шапке всё сделать в единую
   строку» — кнопки стояли в трёх местах. Теперь «Назад» и все действия
   одной строкой, под ней лицо, имя, что играет и связь. На телефоне
   у кнопок остаются значки, название — в подсказке. */
.ct-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.ct-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto;justify-content:flex-end}
.ct-head{display:flex;gap:14px;align-items:flex-start;margin-bottom:18px}
.ct-head-t{flex:1;min-width:0}
.ct-prof{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin-top:8px}
.ct-links{font-size:.7812rem;color:var(--mute)}
.ct-bio{font-size:.8125rem;color:var(--dim);margin-top:6px;max-width:70ch;line-height:1.5}
/* рабочие места человека, состав группы, кто ведёт площадку */
.place-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}
.place-row{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:8px 10px;
  background:var(--panel2);border:1px solid var(--line);border-radius:10px;color:var(--text);
  font:inherit;text-align:left;cursor:pointer}
button.place-row:hover,button.place-row:focus-visible{border-color:var(--mute)}
.place-row.off{cursor:default}
.place-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.place-t b{font-weight:650;overflow-wrap:anywhere}
.place-t span{font-size:.75rem;color:var(--mute)}
.place-go{color:var(--mute);font-size:1.125rem;flex:none}
@media(max-width:620px){
  .ct-bar .ct-t{display:none}
}
/* 931: рабочие места человека в его карточке «Команды» — строкой меток */
.pn-places{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin:-4px 0 14px}
.pn-places-l{font-size:.75rem;color:var(--mute)}
.pill-link{display:inline-flex;align-items:center;gap:4px;min-height:28px;padding:2px 10px;
  border:1px solid var(--line);border-radius:99px;background:var(--panel2);color:var(--text);
  font:inherit;font-size:.7812rem;cursor:pointer}
.pill-link span{color:var(--mute)}
.pill-link:hover,.pill-link:focus-visible{border-color:var(--mute)}
@media(max-width:900px){ .pill-link{min-height:36px} }
/* 936: отклонённые заявки — даты, где вы ответили «не согласен».
   Видны только в отборе «Отклонённые»: бледные и зачёркнутые, как «прошло»,
   чтобы не спорить с живыми датами. */
.ev-dot.tone-nope{border-color:var(--line);background:var(--panel2);opacity:.55;text-decoration:line-through}
.span-ev.tone-nope{border-left-color:var(--mute);opacity:.6;text-decoration:line-through}
.tone-key.tone-nope::before{opacity:.5}
.dates-note{font-size:.8125rem;color:var(--dim);margin:-2px 0 12px}
/* Отбор включён — у списка тёплая черта снизу, как у выбранного вида:
   иначе легко забыть, что часть дат сейчас спрятана. */
.dates-sel.on{box-shadow:inset 0 -2px 0 var(--warm)}
@media(max-width:560px){
  .ev-dot.tone-nope{padding:0;border:none;background:none;box-shadow:none;opacity:1;
    width:100%;display:flex;justify-content:center;text-decoration:none}
  .ev-dot.tone-nope::before{background:var(--mute);opacity:.6}
}
/* 936: передать рабочее место — выбор человека строками, выбранный
   помечен чертой слева, как открытый пункт в списках сервиса */
.dz-btns{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}
.spt-list{display:flex;flex-direction:column;gap:6px;max-height:min(40vh,320px);overflow-y:auto;padding:2px}
.place-row.spt-row.on{border-color:var(--warm);box-shadow:inset 3px 0 0 var(--warm)}
.spt-row .place-go{color:var(--warm)}
/* Дата другого рабочего места на первом экране «Личного»: строка тихая,
   это справка, а не действие. Тёплым не красим — тёплое значит «вас ждут». */
.dc-where{margin-top:2px;font-style:italic}
/* Под сводом за период: слева справочник, справа заведение строки.
   Наверху кнопки «＋ Доход» и «＋ Расход» заказчик не замечал. */
.mn-foot{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.mn-foot-add{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
@media(max-width:560px){ .mn-foot-add{margin-left:0;width:100%} }
/* 961: план — справочная цифра. Заказчик: «план сделать меньше шрифтом,
   чтобы меньше акцента на себя привлекал». Мельче и тише факта во всех
   строках, итогах и в ИТОГЕ — глаз идёт к тому, что реально прошло.
   Ссылка внутри наследует размер (у .link-btn font:inherit). */
.mn-tab .mn-p{color:var(--mute);font-size:.75rem;font-weight:400}
.mn-tab .mn-fin.mn-p{font-size:.9375rem;letter-spacing:.02em}
/* Красная «Убрать строку» в окне строки денег — отдельной строкой ниже
   «Сохранить», чтобы промах не удалял. */
.modal-box > .btn.mn-del{margin-top:16px}
/* 961: «Обороты по контрагентам» на телефоне. Три суммы с основой 0
   помещались в первую строку рядом с именем — нулевой ширины, и «Доход»,
   «Расход», «Разница» ложились друг на друга и вылезали за карточку.
   Разрыв строки — пустым ::after во всю ширину, как было у «Своих статей»:
   имя и число дат сверху, три суммы поровну снизу. */
@media (max-width:620px){
  table.mn-ct tr::after{content:"";order:3;flex:0 0 100%;height:0}
  table.mn-ct td:nth-child(n+3){order:4}
}
/* 963: окно «Срок приёма заявок» — быстрые сроки в ряд, «Убрать срок»
   отдельной строкой под «Сохранить», чтобы промах не снимал срок. */
.jd-quick{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.modal-box > .btn.jd-clear{margin-top:16px}

/* ===== 967: отказ от даты и цвета рабочих мест в «Личном» =====
   Правила стоят в самом конце: у .ev-dot.tone-*, .span-col.wknd .span-ev
   и телефонного сброса точек такая же или близкая сила селектора.
   973: палитра из семи цветов, человек выбирает сам (легенда под календарём).
   Синий и фиолетовый разведены: на снимке заказчика в светлой теме они
   сливались (#3A55C0 и #6B3FD0 — всего 34° по оттенку). */
:root{
  --ws1:#6FA8FF;--ws1-t:rgba(111,168,255,.22); /* синий */
  --ws2:#C08CFF;--ws2-t:rgba(192,140,255,.22); /* фиолетовый */
  --ws3:#3CCFC8;--ws3-t:rgba(60,207,200,.2); /* бирюзовый */
  --ws4:#F07AC6;--ws4-t:rgba(240,122,198,.2); /* малиновый */
  --ws5:#B9C65A;--ws5-t:rgba(185,198,90,.2); /* оливковый */
  --ws6:#F08C6E;--ws6-t:rgba(240,140,110,.2); /* кирпичный */
  --ws7:#9AA9CC;--ws7-t:rgba(154,169,204,.2); /* серо-синий */
}
body.light{
  --ws1:#1F66C9;--ws1-t:rgba(31,102,201,.18);
  --ws2:#7E3CC4;--ws2-t:rgba(126,60,196,.18);
  --ws3:#0A7F7A;--ws3-t:rgba(10,127,122,.18);
  --ws4:#B8367F;--ws4-t:rgba(184,54,127,.18);
  --ws5:#6A7A10;--ws5-t:rgba(106,122,16,.2);
  --ws6:#B2462A;--ws6-t:rgba(178,70,42,.18);
  --ws7:#55627F;--ws7-t:rgba(85,98,127,.2);
}
/* месяц: плашка цветом места, состояние — полоской слева.
   .cal впереди обязателен: body.light .ev-dot.tone-soon (0,3,1) сильнее
   трёх классов и в светлой теме красил плашку прежним серым. */
.cal .ev-dot.ws.ws-1{background:var(--ws1-t);border-color:var(--ws1)}
.cal .ev-dot.ws.ws-2{background:var(--ws2-t);border-color:var(--ws2)}
.cal .ev-dot.ws.ws-3{background:var(--ws3-t);border-color:var(--ws3)}
.cal .ev-dot.ws.ws-4{background:var(--ws4-t);border-color:var(--ws4)}
.cal .ev-dot.ws.ws-5{background:var(--ws5-t);border-color:var(--ws5)}
.cal .ev-dot.ws.ws-6{background:var(--ws6-t);border-color:var(--ws6)}
.cal .ev-dot.ws.ws-7{background:var(--ws7-t);border-color:var(--ws7)}
.ev-dot.ws.tone-soon{box-shadow:none}
.ev-dot.ws.tone-done{box-shadow:inset 3px 0 0 var(--mint)}
.ev-dot.ws.tone-wait{box-shadow:inset 3px 0 0 var(--warm)}
/* неделя и день: полоска слева у них и так говорит о состоянии */
.span-col .span-ev.ws.ws-1{background:var(--ws1-t);border-top-color:var(--ws1);border-right-color:var(--ws1);border-bottom-color:var(--ws1)}
.span-col .span-ev.ws.ws-2{background:var(--ws2-t);border-top-color:var(--ws2);border-right-color:var(--ws2);border-bottom-color:var(--ws2)}
.span-col .span-ev.ws.ws-3{background:var(--ws3-t);border-top-color:var(--ws3);border-right-color:var(--ws3);border-bottom-color:var(--ws3)}
.span-col .span-ev.ws.ws-4{background:var(--ws4-t);border-top-color:var(--ws4);border-right-color:var(--ws4);border-bottom-color:var(--ws4)}
.span-col .span-ev.ws.ws-5{background:var(--ws5-t);border-top-color:var(--ws5);border-right-color:var(--ws5);border-bottom-color:var(--ws5)}
.span-col .span-ev.ws.ws-6{background:var(--ws6-t);border-top-color:var(--ws6);border-right-color:var(--ws6);border-bottom-color:var(--ws6)}
.span-col .span-ev.ws.ws-7{background:var(--ws7-t);border-top-color:var(--ws7);border-right-color:var(--ws7);border-bottom-color:var(--ws7)}
/* строка под сеткой (телефон) — тем же цветом, состояние написано словами */
.cal-row.ws.ws-1{background:var(--ws1-t);border-color:var(--ws1)}
.cal-row.ws.ws-2{background:var(--ws2-t);border-color:var(--ws2)}
.cal-row.ws.ws-3{background:var(--ws3-t);border-color:var(--ws3)}
.cal-row.ws.ws-4{background:var(--ws4-t);border-color:var(--ws4)}
.cal-row.ws.ws-5{background:var(--ws5-t);border-color:var(--ws5)}
.cal-row.ws.ws-6{background:var(--ws6-t);border-color:var(--ws6)}
.cal-row.ws.ws-7{background:var(--ws7-t);border-color:var(--ws7)}
/* список и окно дня: квадратик цвета места перед названием */
.ws-dot{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:6px;vertical-align:0;flex:none}
.ws-dot.ws-1{background:var(--ws1)}
.ws-dot.ws-2{background:var(--ws2)}
.ws-dot.ws-3{background:var(--ws3)}
.ws-dot.ws-4{background:var(--ws4)}
.ws-dot.ws-5{background:var(--ws5)}
.ws-dot.ws-6{background:var(--ws6)}
.ws-dot.ws-7{background:var(--ws7)}
/* легенда: рабочие места (кнопки — сменить цвет) и состояние полосками */
.ws-legend{align-items:center;margin-top:8px}
.ws-cap{font-size:.7188rem;color:var(--mute)}
.ws-key{display:inline-flex;align-items:center;gap:6px;font-size:.7188rem;color:var(--dim)}
.ws-key::before{content:"";width:11px;height:11px;border-radius:3px;border:1px solid var(--line)}
button.ws-key{background:none;border:0;padding:4px 2px;cursor:pointer;font:inherit;font-size:.7188rem;color:var(--dim);position:relative}
button.ws-key:hover,button.ws-key:focus-visible{color:var(--text)}
.ws-key.ws-1::before{background:var(--ws1-t);border-color:var(--ws1)}
.ws-key.ws-2::before{background:var(--ws2-t);border-color:var(--ws2)}
.ws-key.ws-3::before{background:var(--ws3-t);border-color:var(--ws3)}
.ws-key.ws-4::before{background:var(--ws4-t);border-color:var(--ws4)}
.ws-key.ws-5::before{background:var(--ws5-t);border-color:var(--ws5)}
.ws-key.ws-6::before{background:var(--ws6-t);border-color:var(--ws6)}
.ws-key.ws-7::before{background:var(--ws7-t);border-color:var(--ws7)}
.ws-edit{font-size:.7188rem}
.tone-key.stripe::before{background:var(--panel2);border-color:var(--line)}
.tone-key.stripe.tone-done::before{box-shadow:inset 3px 0 0 var(--mint)}
.tone-key.stripe.tone-wait::before{box-shadow:inset 3px 0 0 var(--warm)}
/* 973: окно «Цвета рабочих мест» — ряд квадратиков на каждое место */
.ws-row{padding:10px 0;border-top:1px solid var(--line)}
.ws-row-h{display:flex;align-items:center;gap:8px;justify-content:space-between;margin-bottom:8px;font-size:.875rem;font-weight:600}
.ws-sws{display:flex;flex-wrap:wrap;gap:6px}
.ws-sw{width:40px;height:40px;border-radius:9px;border:2px solid transparent;cursor:pointer;padding:0;
  display:inline-flex;align-items:center;justify-content:center;font-size:.875rem;font-weight:700;color:var(--text)}
.ws-sw.ws-1{background:var(--ws1-t);border-color:var(--ws1)}
.ws-sw.ws-2{background:var(--ws2-t);border-color:var(--ws2)}
.ws-sw.ws-3{background:var(--ws3-t);border-color:var(--ws3)}
.ws-sw.ws-4{background:var(--ws4-t);border-color:var(--ws4)}
.ws-sw.ws-5{background:var(--ws5-t);border-color:var(--ws5)}
.ws-sw.ws-6{background:var(--ws6-t);border-color:var(--ws6)}
.ws-sw.ws-7{background:var(--ws7-t);border-color:var(--ws7)}
.ws-sw.on{box-shadow:0 0 0 2px var(--panel),0 0 0 4px var(--text)}
.ws-sw:focus-visible{outline:2px solid var(--warm);outline-offset:2px}
/* 974: свой цвет из палитры. Элемент несёт в стиле четыре значения
   (рамка и заливка для тёмной и светлой темы) — тема выбирает своё. */
.ws-x{--wsc:var(--wsc-d);--wsc-t:var(--wsc-td)}
body.light .ws-x{--wsc:var(--wsc-l);--wsc-t:var(--wsc-tl)}
.cal .ev-dot.ws.ws-x{background:var(--wsc-t);border-color:var(--wsc)}
.span-col .span-ev.ws.ws-x{background:var(--wsc-t);border-top-color:var(--wsc);border-right-color:var(--wsc);border-bottom-color:var(--wsc)}
.cal-row.ws.ws-x{background:var(--wsc-t);border-color:var(--wsc)}
.ws-dot.ws-x{background:var(--wsc)}
.ws-key.ws-x::before{background:var(--wsc-t);border-color:var(--wsc)}
.ws-sw.ws-x{background:var(--wsc-t);border-color:var(--wsc)}
/* восьмой квадратик — радуга: открывает обычную палитру телефона или компьютера */
.ws-sws{display:grid;grid-template-columns:repeat(8,minmax(0,40px));gap:6px}
.ws-sw{width:100%}
.ws-sw.ws-pick{position:relative;overflow:hidden;border-color:var(--edge,var(--line));
  background:conic-gradient(#ff5b5b,#ffd23f,#5bd66b,#3fd2ff,#6a6bff,#ff5bd9,#ff5b5b)}
.ws-sw.ws-pick.ws-x{background:var(--wsc-t);border-color:var(--wsc)}
.ws-sw.ws-pick input{position:absolute;inset:0;width:100%;height:100%;min-height:0;margin:0;padding:0;
  border:0;opacity:0;cursor:pointer}
.ws-pick-i{position:relative;pointer-events:none}
/* отказанные даты: строка под календарём и окно со списком */
.dates-note.decl-note{margin:12px 0 0}
.decl-row{display:flex;align-items:center;gap:10px;padding:10px 0;border-top:1px solid var(--line)}
.decl-t{flex:1;min-width:0;font-size:.875rem}
.decl-s{font-size:.75rem;color:var(--mute);margin-top:2px}
.decl-b{display:flex;gap:8px;flex:none}
@media(max-width:560px){
  /* телефон: в ячейке месяца точка — цветом места, кольцо — состояние */
  .cal .day .ev-dot.ws{background:none;border:none;box-shadow:none}
  .day .ev-dot.ws.ws-1::before{background:var(--ws1)}
  .day .ev-dot.ws.ws-2::before{background:var(--ws2)}
  .day .ev-dot.ws.ws-3::before{background:var(--ws3)}
  .day .ev-dot.ws.ws-4::before{background:var(--ws4)}
  .day .ev-dot.ws.ws-5::before{background:var(--ws5)}
  .day .ev-dot.ws.ws-6::before{background:var(--ws6)}
  .day .ev-dot.ws.ws-7::before{background:var(--ws7)}
  .day .ev-dot.ws.ws-x::before{background:var(--wsc)}
  .day .ev-dot.ws.tone-done::before{box-shadow:0 0 0 3px rgba(78,212,160,.35)}
  .day .ev-dot.ws.tone-wait::before{box-shadow:0 0 0 3px rgba(255,180,84,.4)}
  /* легенда состояния на телефоне скрыта (есть «?»), а цвета мест —
     единственное, чем точки различаются, поэтому их легенду оставляем */
  .legend.ws-legend{display:flex}
  button.ws-key{min-height:40px}
  .decl-row{flex-wrap:wrap}
  .decl-b{width:100%}
  .decl-b .btn{flex:1}
}

/* ===== Карточка даты на телефоне: вариант А (сборка 979) =====
   Заказчик: «в мобильной версии хочу простоты — сейчас кнопочное
   нагромождение»; из макета выбран вариант А. Кнопки шапки даты — в «⋯»
   верхней полосы, разделы — строкой из трёх главных и «Ещё», «Сводка»
   без кнопок, остальные разделы «Общего» — одним списком строк.
   На компьютере не меняется ничего: всё новое скрыто до 620 точек. */
.ev-seg,.sv-row,.sec-sub,.sec-bar,.ev-decl-m{display:none}
/* меню «⋯» и «Разделы даты» — строки на всю ширину */
.sh-sub{color:var(--mute);font-size:.8125rem;margin:-2px 0 6px}
.sh-list{display:flex;flex-direction:column}
.sh-item{display:flex;align-items:center;gap:14px;width:100%;min-height:52px;background:none;border:0;
  border-top:1px solid var(--line);color:var(--text);font:inherit;font-size:.9375rem;text-align:left;
  padding:0 2px;cursor:pointer}
.sh-item:first-child{border-top:0}
.sh-item svg{width:20px;height:20px;flex:0 0 20px;color:var(--dim)}
.sh-item .sh-sp{flex:0 0 20px}
.sh-item .sh-t{flex:1 1 auto;min-width:0}
.sh-item .sh-s{color:var(--mute);font-size:.8125rem}
.sh-item .sh-r{margin-left:auto;color:var(--mute);font-size:.8125rem}
.sh-item.on{font-weight:600}
.sh-item.danger,.sh-item.danger svg{color:var(--rose)}
.sh-sep{height:12px}
.sh-sep + .sh-item{border-top:1px solid var(--line)}
@media(hover:hover){ .sh-item:hover{background:var(--panel2)} }
.sh-item:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
/* «кто отвечает» у пункта — нажимается, меняет сторону */
.chk .who-btn{background:none;border:0;font:inherit;font-size:.7188rem;color:var(--mute);cursor:pointer;
  padding:8px 6px;margin:-8px -2px -8px auto;border-radius:6px;white-space:nowrap}
.chk .who-btn:hover{color:var(--text)}
.chk .who-btn .who-car{margin-left:3px;font-size:.625rem}

@media (max-width:900px){
  /* действия даты живут в «⋯» верхней полосы — там же, где название даты.
     В разметке .ev-acts стоит рядом с шапкой, а не внутри неё. */
  #main > .ev-acts,#main > .topbar .ev-acts{display:none!important}
  .ev-decl-m{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px}
  .mob-top .mt-more{font-size:1.25rem;letter-spacing:1px;line-height:1}
}

@media (max-width:620px){
  /* шапка даты пустеет: название и день — в полосе сверху, действия — в «⋯» */
  #main > .topbar.ev-top{display:none}
  /* стороны — строкой в «Сводке»; у участника коллектива «Сводки» нет */
  .sides-short.m-hide{display:none!important}
  .sides.m-hide:not(.moved){display:none!important}
  /* разделы: три главных и «Ещё» вместо списка и «＋ ещё» */
  .ev-tabs-row .tabs-sel,.ev-tabs-row .tab-add{display:none!important}
  .ev-seg{display:flex!important;flex:1 1 auto;min-width:0;width:100%}
  .ev-seg button{flex:1 1 auto;min-width:0;padding:0 6px;height:42px;line-height:2.625rem;
    font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .ev-seg .seg-n{display:inline-block;min-width:18px;height:18px;line-height:18px;padding:0 5px;
    border-radius:9px;background:var(--line);color:var(--text);font-size:.6875rem;font-weight:600;
    margin-left:4px;vertical-align:1px;text-align:center}
  .ev-seg .cnt.alert{margin-left:4px;vertical-align:1px}

  /* «Сводка»: строки вместо кнопок, порядок как в макете */
  .ev-day-body{display:flex;flex-direction:column}
  .ev-day-body > .edb-btns,.ev-day-body > .edb-poster,.ev-day-body > .edb-plan.empty{display:none!important}
  .ev-day-body > .edb-sides,.ev-day-body > .sides{order:1}
  .ev-day-body > .edb-plan,.ev-day-body > .edb-timerow{order:2}
  .ev-day-body > .edb-posterrow{order:3}
  .ev-day-body > .edb-sheet{order:4}
  .ev-day-body > .sides.on{display:grid;margin:2px 0 10px}
  .ev-day-body > .edb-plan{border-top:1px solid var(--line);margin-top:0!important;padding-top:2px}
  .sv-row{display:flex;align-items:center;gap:12px;width:100%;text-align:left;background:none;border:0;
    border-top:1px solid var(--line);padding:10px 0;min-height:56px;color:var(--text);font:inherit;cursor:pointer}
  .ev-day-body > .edb-sides{margin-top:10px}
  .sv-row .sv-l{flex:0 0 72px;color:var(--mute);font-size:.8125rem}
  .sv-row .sv-v{flex:1 1 auto;min-width:0;font-size:.9375rem;line-height:1.3}
  .sv-row .sv-v b{display:block;font-weight:600}
  .sv-row .sv-one{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:.875rem}
  .sv-row .sv-s{display:block;color:var(--mute);font-size:.8125rem;margin-top:2px}
  .sv-row .sv-car{flex:0 0 auto;color:var(--mute);font-size:1.25rem;line-height:1}
  .sv-row .sv-ph{flex:0 0 44px;height:44px;border:1.5px dashed var(--edge);border-radius:10px;
    display:flex;align-items:center;justify-content:center;color:var(--mute);overflow:hidden}
  .sv-row .sv-thumb{border:1px solid var(--line)}
  .sv-row .sv-thumb img{width:100%;height:100%;object-fit:cover;display:block}
  .sv-row .sv-ic{flex:0 0 44px;height:44px;border-radius:10px;background:var(--panel2);
    display:flex;align-items:center;justify-content:center;color:var(--dim)}
  .sv-row .sv-ph svg,.sv-row .sv-ic svg{width:20px;height:20px}

  /* Задачи, партнёры, проходки, история — одним списком строк.
     Сетка «Общего» держала зазор 14 между всеми карточками; убираем его,
     а после «Сводки» отступ даём сами. */
  .ev-main.ev-list-a{row-gap:0!important}
  .ev-main.ev-list-a .ev-col > .ev-day{margin-bottom:14px!important}
  .ev-main .card.ev-sec{border-radius:0;border-top-width:0;box-shadow:none;padding:2px 16px}
  .ev-main .card.ev-sec:not(.fold){padding-bottom:16px}
  .ev-main .card.ev-sec.ev-sec-first{border-radius:var(--r) var(--r) 0 0;border-top-width:1px}
  .ev-main .card.ev-sec.ev-sec-last{border-radius:0 0 var(--r) var(--r)}
  .ev-main .card.ev-sec > .eyebrow.fold-h{position:relative;min-height:60px;padding:10px 32px 10px 0;
    text-transform:none;letter-spacing:0;font-size:1rem;font-weight:600;color:var(--text);row-gap:2px}
  .ev-main .card.ev-sec.fold.has-bar > .eyebrow.fold-h{padding-right:98px}
  .ev-main .card.ev-sec > .eyebrow.fold-h::after{position:absolute;right:0;top:50%;margin:0;
    content:"⌄";font-size:1.25rem;color:var(--mute);transform:translateY(-62%)}
  .ev-main .card.ev-sec.fold > .eyebrow.fold-h::after{content:"›";transform:translateY(-50%)}
  .ev-main .card.ev-sec.fold > .eyebrow .tip{display:none}
  .ev-main .card.ev-sec.fold .sec-sub{display:block;flex-basis:100%;font-size:.8125rem;font-weight:400;
    color:var(--mute);line-height:1.35}
  .ev-main .card.ev-sec.fold .sec-bar{display:block;position:absolute;right:32px;top:50%;
    transform:translateY(-50%);width:56px;height:6px;border-radius:3px;background:var(--line);overflow:hidden}
  .ev-main .card.ev-sec.fold .sec-bar i{display:block;height:100%}
  /* внутри раскрытых «Задач»: без лишних подсказок, поле и «+» */
  .ev-ready .chk-empty-hint,.ev-ready .lead-wrap{display:none}
  .ev-ready .chk-add select{display:none}
}
@media (max-width:360px){
  .ev-seg button{font-size:.8125rem;padding:0 4px}
}

/* ================= «Сводка» в «Деньгах» и выплаты людям (сборка 981) =================
   Та же таблица, что «Сводная» у площадки: дни столбцами, доход, люди по
   должностям, начислено · выдано · долг, прибыль. Цвет — только смысл:
   зелёный пришло/выдано, розовый расход, тёплый — долг, который ждут. */
.sv-nav{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:8px 0 12px}
.sv-nav .sv-lbl{font-family:Oswald,sans-serif;text-transform:uppercase;letter-spacing:.02em;font-size:1rem;
  font-weight:600;white-space:nowrap}
.sv-nav .sv-sp{flex:1 1 auto}
.sv-sum{display:flex;gap:22px;flex-wrap:wrap;align-items:baseline;padding:12px 14px;border-radius:10px;
  background:var(--panel2);margin-bottom:14px;font-size:.875rem;color:var(--dim)}
.sv-sum b{font-family:Oswald,sans-serif;font-size:1.25rem;font-weight:600;margin-left:6px;color:var(--text)}
.sv-sum b.in{color:var(--mint)} .sv-sum b.out{color:var(--rose)}
.sv-sum .sv-sum-owe{margin-left:auto;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.sv-sum .sv-sum-owe b{color:var(--warm)}
.sv-go{font-weight:650}
.sv-scroll{overflow-x:auto}
.sv-wk{width:100%;min-width:900px;border-collapse:separate;border-spacing:0;table-layout:fixed;
  font-size:.8125rem;font-variant-numeric:tabular-nums}
.sv-wk.sv-m{min-width:640px}
.sv-wk col.c0{width:180px} .sv-wk col.cw{width:104px}
.sv-wk th,.sv-wk td{padding:6px 8px;border-bottom:1px solid var(--line);text-align:right;white-space:nowrap;
  font-size:.8125rem;color:var(--text);font-weight:400;overflow:hidden;text-overflow:ellipsis}
.sv-wk th:first-child,.sv-wk td:first-child{text-align:left;white-space:normal}
.sv-wk thead th{vertical-align:bottom;border-bottom:2px solid var(--line);padding-top:4px;color:var(--mute)}
.sv-wk thead th.sm{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;text-align:center}
.sv-hd{background:none;border:0;padding:4px 0;font:inherit;font-weight:600;font-size:.75rem;text-transform:uppercase;
  letter-spacing:.06em;color:var(--mute);cursor:pointer;min-height:28px}
.sv-hd:hover,.sv-hd:focus-visible{color:var(--blue);text-decoration:underline}
.sv-wk thead th.now .sv-hd{color:var(--warm)}
/* 983: дню в шапке остаётся ~50 точек, а прописные с разрядкой от шапки таблицы
   резали «Концерт выходного дня» посреди буквы. Обычный регистр, две строки
   с переносом по слогам и многоточием; полное название — при наведении. */
.sv-prog{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;
  font-size:.6875rem;line-height:1.25;color:var(--dim);font-weight:500;white-space:normal;
  text-transform:none;letter-spacing:0;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto;margin-top:2px}
/* дню в шапке — на шесть точек больше места: «Блюзовый» и «Открытый» встают целиком */
.sv-wk thead th:not(:first-child){padding-left:3px;padding-right:5px}
.sv-wk .w{background:var(--panel2)}
.sv-wk .sm{border-left:2px solid var(--line)}
.sv-wk tr.sv-sec td{font-family:Oswald,sans-serif;font-size:.9375rem;text-transform:uppercase;letter-spacing:.03em;
  font-weight:600;padding-top:16px;border-bottom:2px solid var(--line);color:var(--text)}
.sv-wk tr.sv-sec td.lbl{font-family:Inter,system-ui,sans-serif;font-size:.6875rem;letter-spacing:.04em;color:var(--mute);
  font-weight:600;vertical-align:bottom;text-align:right}
.sv-wk tr.sv-grp td{font-size:.6875rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);font-weight:600;
  padding-top:12px}
.sv-wk tr.sv-role td{font-size:.6875rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);font-weight:600;
  padding:8px 8px 3px;border-bottom:0}
.sv-wk td.nm{padding-left:14px}
.sv-wk td.nm .link-btn{font-weight:500;text-align:left}
.sv-wk td.z{color:var(--mute)}
.sv-wk td.paid{color:var(--mint)}
.sv-wk td.b{font-weight:600}
.sv-wk td.oweo{color:var(--warm)}
.sv-owe{background:none;border:0;padding:4px 0;font:inherit;color:var(--warm);font-weight:650;cursor:pointer;min-height:28px}
.sv-owe:hover,.sv-owe:focus-visible{text-decoration:underline}
.sv-later{background:none;border:0;padding:4px 0;font:inherit;font-size:.75rem;color:var(--mute);cursor:pointer;
  min-height:28px}
.sv-later:hover,.sv-later:focus-visible{color:var(--warm);text-decoration:underline}
.sv-wk tr.sv-tot td{font-weight:700;border-top:1px solid var(--line)}
.sv-wk tr.sv-tot.in td:not(:first-child){color:var(--mint)}
.sv-wk tr.sv-tot.out td:not(:first-child){color:var(--rose)}
.sv-wk tr.sv-tot td.owe{color:var(--warm)!important}
.sv-wk tr.sv-profit td{font-family:Oswald,sans-serif;font-size:1rem;font-weight:600;border-bottom:0;
  padding-top:12px;padding-bottom:10px}
.sv-wk tr.sv-profit td.neg{color:var(--rose)}
.sv-wk tr.sv-profit td.big{font-size:1.125rem;text-align:right}
.sv-wk tr.sv-profit td.big small{font-family:Inter,system-ui,sans-serif;font-size:.75rem;color:var(--mute);font-weight:500}

/* телефон: дни списком */
.sv-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:4px 0 10px}
.sv-tiles div{background:var(--panel2);border-radius:10px;padding:9px 10px}
.sv-tiles span{display:block;color:var(--mute);font-size:.6875rem;text-transform:uppercase;letter-spacing:.08em;font-weight:600}
.sv-tiles b{display:block;font-family:Oswald,sans-serif;font-size:1.0625rem;font-weight:600;margin-top:3px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sv-tiles b.in{color:var(--mint)} .sv-tiles b.out{color:var(--rose)}
.sv-owebar{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:1px solid var(--warm);
  background:transparent;border-radius:10px;padding:10px 12px;font:inherit;color:var(--text);margin-bottom:10px;cursor:pointer}
.sv-owebar .t{flex:1 1 auto;min-width:0;font-size:.8125rem;color:var(--dim)}
.sv-owebar .t b{display:block;color:var(--warm);font-family:Oswald,sans-serif;font-size:1.125rem;font-weight:600}
.sv-owebar .go{color:var(--warm);font-weight:650;font-size:.875rem;white-space:nowrap}
.sv-d{display:flex;gap:10px;align-items:flex-start;width:100%;text-align:left;background:none;border:0;
  border-top:1px solid var(--line);padding:10px 2px;font:inherit;color:var(--text);cursor:pointer;min-height:44px}
.sv-d .dd{flex:0 0 46px;font-weight:700;font-size:.8125rem;line-height:1.25;text-transform:uppercase}
.sv-d .dd small{display:block;font-weight:500;color:var(--mute);font-size:.6875rem;text-transform:none}
.sv-d .mid{flex:1 1 auto;min-width:0;font-size:.8125rem;line-height:1.35}
.sv-d .mid .pr{display:block;color:var(--text);font-weight:600;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis}
.sv-d .mid .ln{display:block;color:var(--mute);font-size:.75rem}
.sv-d .rt{flex:0 0 auto;text-align:right;font-family:Oswald,sans-serif;font-size:1rem;font-weight:600;white-space:nowrap}
.sv-d .rt.neg{color:var(--rose)}
.sv-d .rt small{display:block;font-family:Inter,system-ui,sans-serif;font-size:.6875rem;color:var(--mute);font-weight:500}
.sv-d.z .dd,.sv-d.z .mid{color:var(--mute)}
.sv-d.w .dd{color:var(--dim)}
.sv-d .ch{color:var(--mute);font-size:1rem;line-height:1.3;flex:0 0 auto}
.sv-open{background:var(--panel2);border-radius:10px;padding:8px 10px;margin:0 0 10px;font-size:.8125rem}
.sv-open .r{display:flex;justify-content:space-between;gap:8px;padding:4px 0}
.sv-open .r span:first-child{min-width:0;overflow-wrap:anywhere}
.sv-open .r span:last-child{white-space:nowrap;flex:0 0 auto}
.sv-open .r small{color:var(--mute)}
.sv-open .h{font-size:.6875rem;letter-spacing:.08em;text-transform:uppercase;color:var(--mute);font-weight:600;margin-top:6px}
.sv-open .sv-ok{color:var(--mint)} .sv-open .sv-w{color:var(--warm)}
.sv-open-b{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 2px}

/* «Закрыть день» */
.dc-inc{display:grid;grid-template-columns:minmax(0,1fr) 140px;gap:4px 12px;align-items:center;
  padding:6px 0;border-bottom:1px solid var(--line)}
.dc-inc label{font-size:.875rem}
.dc-inc input{text-align:right}
.dc-inc .dc-hint{grid-column:1/-1;font-size:.75rem;color:var(--mute)}
.dc-note{margin-top:8px}
.dc-p{display:flex;align-items:center;gap:10px;padding:6px 0;border-bottom:1px solid var(--line)}
.dc-p .chk{flex:1 1 auto;min-width:0;border-bottom:0;padding:0}
.dc-p .dc-nm{flex:1 1 auto;min-width:0;font-size:.875rem;line-height:1.25}
.dc-p .dc-nm small{display:block;color:var(--mute);font-size:.75rem}
.dc-p .dc-nm small.dc-paid{color:var(--mint)}
.dc-p > input{flex:0 0 120px;width:120px;text-align:right}
.dc-free .dc-nm{display:flex;flex-direction:column;gap:6px}
.dc-foot{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:14px 0 10px;
  font-size:.8125rem;color:var(--dim)}
.dc-foot b{color:var(--text)}
.dc-foot small{color:var(--mute)}

/* «Кому выдать» и «Выдать» */
.st-total{display:flex;align-items:baseline;gap:10px;margin:4px 0 12px;padding:10px 12px;border-radius:10px;
  background:var(--panel2)}
.st-total b{font-family:Oswald,sans-serif;font-size:1.5rem;font-weight:600;color:var(--warm)}
.st-total span{color:var(--mute);font-size:.8125rem}
.st-grp{font-size:.6875rem;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);font-weight:600;margin:14px 0 2px}
.st-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
.st-row .k{flex:1 1 auto;min-width:0;font-size:.875rem}
.st-row .k b{font-weight:600}
.st-row .k small{display:block;color:var(--mute);font-size:.75rem;margin-top:1px;overflow-wrap:anywhere}
.st-row .k .peer-st{margin-top:3px}
.st-row .v{flex:0 0 auto;text-align:right;font-weight:650;white-space:nowrap}
.st-row .v.w{color:var(--warm)} .st-row .v.m{color:var(--dim)}
.st-row .btn{flex:0 0 auto}
.st-bk{margin-top:10px}
.st-b{display:flex;justify-content:space-between;gap:10px;padding:6px 0;font-size:.875rem;border-bottom:1px dashed var(--line)}
.st-b span:first-child{color:var(--dim);min-width:0}
.st-b span:last-child{white-space:nowrap}
.st-b.l span{color:var(--mute)}
.st-b small{color:var(--mute)}

/* сотрудник: «Мне должны» и «Подтвердите» */
.ow-pay{margin:0 0 14px}
.ow-big{font-family:Oswald,sans-serif;font-size:1.75rem;font-weight:600;color:var(--warm);line-height:1.1;margin-top:6px}
.ow-org{margin-top:12px;border-top:1px solid var(--line);padding-top:10px}
.ow-h{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;font-weight:650;font-size:.9375rem}
.ow-h small{display:block;font-weight:500;color:var(--mute);font-size:.75rem;margin-top:1px}
.ow-h b{color:var(--warm);white-space:nowrap;font-family:Oswald,sans-serif;font-size:1.0625rem;font-weight:600}
.ow-r{display:flex;justify-content:space-between;gap:10px;padding:5px 0 5px 10px;font-size:.8125rem;color:var(--dim);
  border-left:2px solid var(--line);margin-top:4px}
.ow-r span:first-child{min-width:0}
.ow-r span:last-child{color:var(--text);white-space:nowrap;font-variant-numeric:tabular-nums}
.ow-r.f{border-left-color:transparent;color:var(--mute);font-size:.75rem}
.ow-r small{color:var(--mute)}

@media(max-width:620px){
  .dc-inc{grid-template-columns:minmax(0,1fr) 120px}
  .dc-p > input{flex-basis:104px;width:104px}
  .sv-nav .sv-sp{display:none}
  .sv-nav .btn.primary{width:100%}
  .st-row{flex-wrap:wrap}
  .st-row .k{flex-basis:calc(100% - 110px)}
}

/* 987: «Сводка» — прибыль по прошедшим дням, расход будущих отдельно */
.sv-sum small.sv-lat{margin-left:6px;font-size:.75rem;color:var(--mute)}
.sv-sum .sv-later-t{color:var(--mute)}
.sv-sum .sv-later-t b{color:var(--dim)}
.sv-later-p{margin:-4px 0 12px;font-size:.8125rem}
/* прибыль дня — тем же размером, что остальные числа: «−15 000» не влезало */
.sv-wk tr.sv-profit td:not(:first-child):not(.big){font-size:.875rem}

/* 988: просмотр фото поста */
.vk-thumb img.vk-zoom{cursor:zoom-in}
.vk-thumb img.vk-zoom:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.vk-view{display:flex;align-items:center;justify-content:center;background:var(--panel2);border-radius:10px;
  min-height:200px;overflow:hidden}
.vk-view img{display:block;max-width:100%;max-height:min(70vh,760px);width:auto;height:auto;object-fit:contain}
.vk-view-nav{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}
.vk-view-nav .page-sub{margin:0 0 0 auto}

/* 994: лицо и имя участника поста открывают его карточку */
.vk-ava-btn{padding:0;font-family:inherit;color:var(--dim);cursor:pointer;
  transition:border-color .12s ease}
.vk-ava-btn:hover{border-color:var(--blue)}
.vk-ava-btn:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.vk-item .vk-who{line-height:inherit}
@media(max-width:900px){
  /* запас нажатия у имени меньше обычного: ниже в строке метки, и нажатие
     по ним должно по-прежнему отмечать человека, а не открывать карточку */
  .vk-item .vk-who::after{inset:-6px -4px}
}
/* кнопки ролей в карточке, которую ведёт сам человек: видно, но не нажимается */
.pick-chip input:disabled{cursor:default}
.pick-chip input:disabled + .ch-in{opacity:.7}

/* 996: на телефоне .vk-scroll «течёт» без своей прокрутки (правило 205–212),
   а у двух списков в окнах высота задана прямо в разметке — и список
   вылезал из рамки поверх «Создать группу» и строки ошибки. В окне такой
   список прокручивается сам; без заданной высоты он и так тянется целиком. */
@media(max-width:560px){
  .modal-box .vk-scroll{overflow-y:auto}
}
/* 996: строка «новые сообщения — в Telegram» под полем чата */
.ch-tg{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:8px;padding:8px 10px;
  border:1px solid var(--line);border-radius:10px;background:var(--panel2);font-size:.8125rem;color:var(--dim)}
.ch-tg > span{flex:1 1 180px;min-width:0}
.ch-tg-x{margin-left:auto;background:none;border:0;color:var(--mute);cursor:pointer;
  width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px}
.ch-tg-x:hover{color:var(--text);background:var(--panel)}
.ch-tg-x:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
@media(max-width:900px){.ch-tg-x{width:40px;height:40px}}
.ch-tg.ok{border-color:var(--mint);color:var(--text)}
/* окно получает фокус само (на телефоне — вместо поля), рамка вокруг всего окна не нужна */
#modalBox:focus{outline:none}

/* 1005: «похоже, это такой-то со входом» в строке «Команды» */
.pn-same{font-size:.8125rem;color:var(--text);background:var(--panel2);border:1px solid var(--line);
  border-radius:8px;padding:6px 10px;margin-top:8px;line-height:1.4}

/* 1008: окно не прокручивается вбок — что бы внутри ни оказалось шире.
   Широкие таблицы в окнах листаются в своей обёртке (.doc-paper,
   .table-scroll), а не всем окном. */
.modal-box{overflow-x:hidden}

/* ---------- 1010: «Администрирование» — пульт (вариант А) ----------
   Первым экраном — что требует действий, четыре цифры и пять разделов.
   Цвет края у кнопок и полей — --edge (3:1), смысловые цвета — токенами. */
.pult-top{align-items:center}
/* ширина задана явно: иначе обёртка считала свою ширину по полю без подсказки,
   и «＋ Пригласить» уезжал под поиск, а подсказка обрезалась */
.pult-search{position:relative;display:flex;align-items:center;flex:0 1 auto;width:360px;min-width:220px}
.pult-pt .pult-search{width:420px}
.pult-search input{padding-left:36px}
.pult-sico{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--mute);
  pointer-events:none;display:flex;z-index:1}
.pult-sico svg{width:16px;height:16px}
.pult-search .find-res{top:calc(100% + 4px)}
.pult-fh{font-size:var(--t1);letter-spacing:.1em;text-transform:uppercase;color:var(--mute);
  font-weight:600;padding:8px 9px 4px}
.find-row.pult-fall{color:var(--blue);font-size:var(--t3)}
.pult-tools{display:flex;gap:10px;align-items:center;flex-wrap:nowrap}
.pult-crumb{background:none;border:0;padding:0;margin:0 0 4px;font:inherit;font-size:var(--t3);
  color:var(--blue);cursor:pointer;display:inline-flex;align-items:center;min-height:24px}
.pult-crumb:hover{text-decoration:underline}
.pult-crumb:focus-visible{outline:2px solid var(--blue);outline-offset:2px;border-radius:4px}

/* «Требует внимания» */
.card.pult-attn{border-color:var(--warm)}
.pult-rows{margin-top:4px}
.pult-ar{display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--line)}
.pult-ar.last{border-bottom:0}
.pult-ar-main{flex:1;min-width:0;display:flex;align-items:center;gap:14px;padding:12px 0;
  background:none;border:0;font:inherit;color:inherit;text-align:left;cursor:pointer}
.pult-ar-main:focus-visible,.pult-pr-main:focus-visible,.pult-sec:focus-visible{outline:2px solid var(--blue);
  outline-offset:2px;border-radius:8px}
.pult-ai{flex:none;width:36px;height:36px;border-radius:50%;display:grid;place-items:center;background:var(--panel2)}
.pult-ai svg{width:18px;height:18px}
.pult-ai.rose{color:var(--rose)} .pult-ai.warm{color:var(--warm)}
.pult-am{flex:1;min-width:0;display:block}
.pult-am b{display:block;font-weight:600;font-size:var(--t4)}
.pult-am > span{display:block;color:var(--mute);font-size:var(--t2);margin-top:2px}
.pult-chev{display:none;flex:none;color:var(--mute)}
.pult-chev svg{width:18px;height:18px;display:block}
.pult-ar-go{flex:none}
.pult-ar-x{flex:none;width:32px;height:32px;border:0;background:none;color:var(--mute);border-radius:8px;
  cursor:pointer;font:inherit;font-size:var(--t4);display:inline-flex;align-items:center;justify-content:center}
.pult-ar-x:hover{color:var(--rose);background:var(--panel2)}
.pult-ar-x:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.pult-ok{display:flex;align-items:flex-start;gap:8px;color:var(--mint);font-size:var(--t3);padding-top:12px}
.pult-calm .pult-ok{padding-top:0}
.pult-ok svg{width:16px;height:16px;flex:none;margin-top:2px}
.pult-hid{background:none;border:0;padding:0;margin-top:10px;font:inherit;font-size:var(--t2);color:var(--mute);
  cursor:pointer;min-height:24px}
.pult-hid:hover{color:var(--text);text-decoration:underline}
.pult-hlist{display:flex;flex-direction:column}
.pult-hrow{display:flex;align-items:center;gap:12px;padding:10px 0;border-top:1px solid var(--line)}
.pult-hrow:first-child{border-top:0}

/* четыре цифры */
.pult-nums{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:14px}
.pult-nums > .card{margin:0;padding:14px 16px}
.pult-num .display{font-size:1.5rem;margin-top:4px}
.pult-num .page-sub{font-size:var(--t2);margin-top:2px}
.pult-short{display:none}

/* пять разделов: плитки на компьютере, список на телефоне */
.pult-tiles{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px;margin-top:14px}
.pult-tiles > .card{margin:0}
.card.pult-tile{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:16px;width:100%;
  font:inherit;color:inherit;text-align:left;cursor:pointer}
.card.pult-tile:hover{border-color:var(--edge)}
.card.pult-tile:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.pult-tile > svg{width:22px;height:22px;color:var(--warm)}
.pult-tile > b{font-size:var(--t5);font-weight:600}
.pult-tile > span{color:var(--mute);font-size:var(--t2);line-height:1.35}
.pult-tile > .pult-tag{margin-top:2px}
.card.pult-secs{display:none;margin-top:14px;padding:4px 16px}
.pult-sec{display:flex;align-items:center;gap:12px;width:100%;min-height:56px;padding:10px 0;border:0;
  border-bottom:1px solid var(--line);background:none;font:inherit;color:inherit;text-align:left;cursor:pointer}
.pult-sec:last-child{border-bottom:0}
.pult-sec > svg:first-child{width:20px;height:20px;color:var(--warm);flex:none}
.pult-sec .pult-chev{display:block}
.pult-sec .pill{flex:none}

/* отбор */
.pult-chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px}
.pult-chip{height:32px;padding:0 12px;border-radius:999px;border:1px solid var(--edge);background:var(--panel);
  font:inherit;font-size:var(--t3);color:var(--dim);display:inline-flex;align-items:center;gap:6px;cursor:pointer}
.pult-chip i{font-style:normal;color:var(--mute)}
.pult-chip.warn i{color:var(--warm);font-weight:600}
.pult-chip.on{border-color:var(--warm);color:var(--text);font-weight:600}
.pult-chip:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.pult-chips-sel{display:none}
.banner.pult-note{margin:0 0 14px}

/* строки людей и мест */
.card.pult-list{padding:4px 18px}
.pult-pr{display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--line)}
.pult-pr:last-of-type{border-bottom:0}
.pult-pr-main{flex:1;min-width:0;display:flex;align-items:center;gap:12px;padding:10px 0;
  background:none;border:0;font:inherit;color:inherit;text-align:left;cursor:pointer}
.pult-pm{flex:1;min-width:0;display:block}
.pult-pn{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pult-pn b{font-weight:600}
.pult-ps{display:block;color:var(--mute);font-size:var(--t2);margin-top:2px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.pult-pr-open,.pult-pr-more{flex:none}
.pult-list .pult-more{margin:10px 0}
.pult-sr{position:relative;padding-left:12px}
.pult-sr::before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:2px;background:var(--line)}
.pult-pl-paid::before{background:var(--mint)} .pult-pl-trial::before{background:var(--warm)}
.pult-pl-soon::before,.pult-pl-over::before{background:var(--rose)} .pult-pl-free::before{background:var(--blue)}
.pult-sp-st{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:2px;text-align:right;
  font-size:var(--t2);max-width:45%}
.pult-sp-plan{color:var(--mute)}
.pult-sp-plan.ok{color:var(--mint)} .pult-sp-plan.warn{color:var(--warm)} .pult-sp-plan.bad{color:var(--rose)}
.pult-sp-vk{color:var(--mute)}
.pult-legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px;color:var(--mute);font-size:var(--t2)}
.pult-dot{display:inline-block;width:9px;height:9px;border-radius:3px;margin-right:5px;vertical-align:middle}
.pult-dot.paid{background:var(--mint)} .pult-dot.trial{background:var(--warm)}
.pult-dot.over{background:var(--rose)} .pult-dot.free{background:var(--blue)}
.pult-plan-btns{display:flex;gap:8px;flex-wrap:wrap}
.card.pult-tbl{padding:6px 6px 2px;overflow-x:auto}
.pult-tbl .pult-ps{white-space:normal}
.dup-acts{display:flex;justify-content:flex-end;margin-top:10px}
.dup-off{opacity:1;background:var(--panel)}
.dup-off .dup-why{color:var(--mute)}

@media(max-width:1199px){ .pult-tiles{grid-template-columns:repeat(3,minmax(0,1fr))} }
@media(max-width:620px){
  .pult-top{gap:0}
  /* на телефоне обёртки шапки — display:contents (правило карточки даты),
     поэтому поле и кнопка — ячейки самой шапки: поле во всю строку,
     кнопка — следующей строкой во всю ширину */
  .pult-tools .pult-search{flex:1 1 100%;width:auto;min-width:0}
  .pult-pt .pult-search{flex:1 1 200px;width:auto}
  .pult-tools > .btn{flex:1 1 auto}
  .pult-ps{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .pult-sec .pill{font-size:var(--t1);padding:2px 8px}
  .pult-crumb{min-height:40px;margin:0}
  .pult-ar{gap:4px}
  .pult-ar-main{gap:12px;padding:11px 0}
  .pult-ar-go{display:none}
  .pult-ar .pult-chev{display:block}
  .pult-ar-x{width:40px;height:40px}
  .pult-long{display:none}
  .pult-short{display:inline}
  .pult-nums{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .pult-nums > .card{padding:12px 14px}
  .pult-num .display{font-size:1.25rem}
  .pult-tiles{display:none}
  .card.pult-secs{display:block}
  .pult-chips{display:none}
  .pult-chips-sel{display:block;margin:0 0 14px}
  .card.pult-list{padding:4px 14px}
  .pult-pr-open{display:none}
  .pult-pr-more{width:40px;height:40px;padding:0}
  .pult-sr .pult-pr-main{flex-wrap:wrap;row-gap:4px}
  .pult-sp-st{max-width:none;width:100%;align-items:flex-start;text-align:left}
  .dup-acts{justify-content:stretch}
  .dup-acts .btn{flex:1 1 auto}
}

/* ===== «Лист дня» (02.10) ===== */
/* Экран: афиша слева от названия, на телефоне — над ним. Участники:
   название артиста, под ним строка «группа · 4 музыканта · выход 21:00»,
   ниже поимённо. Телефон и телеграм — каждый своей строкой: точка-
   разделитель на узком экране повисала в конце строки. */
.sheet-head.has-poster{display:flex;gap:16px;align-items:flex-start}
.sheet-head.has-poster .sheet-poster{flex:none;max-width:180px;max-height:250px;margin:0;cursor:zoom-in}
.sheet-ht{flex:1 1 auto;min-width:0}
.sh-art + .sh-art{margin-top:10px}
.sh-sec + .sh-sec{margin-top:14px}
.sheet .sh-sec > .eyebrow{margin:0 0 6px}
.sh-m{display:block;color:var(--mute);font-size:.7188rem;font-weight:400}
.sh-mem .k{padding-left:12px}
.sh-team{color:var(--mute);font-size:.7812rem;padding:6px 0 4px 12px}
.sheet .kv .v a.sh-c{display:block}
@media (max-width:820px){
  /* одна колонка: сперва план и участники, связь — после персонала */
  .sheet-cols > .sh-col{display:contents}
  .sh-plan{order:1} .sh-arts{order:2} .sh-crew{order:3} .sh-con{order:4} .sh-gst{order:5} .sh-rd{order:6}
  .sh-sec + .sh-sec{margin-top:0}
}
@media (max-width:620px){
  .sheet-head.has-poster{flex-direction:column;gap:10px}
  .sheet-head.has-poster .sheet-poster{max-width:100%;max-height:240px}
}
/* Бумага: и в печати (#printSheet), и в окне «Печать и PDF» (.doc-paper)
   фон белый — пишем чёрным в любой теме. */
.dsh{color:#000;font:400 .8125rem/1.45 Inter,Arial,sans-serif}
.dsh-top{display:flex;gap:16px;align-items:flex-start;margin-bottom:4px}
.dsh-tt{flex:1 1 auto;min-width:0}
.dsh-eb{font:600 .6875rem/1.3 Inter,Arial,sans-serif;text-transform:uppercase;letter-spacing:.08em;color:#555}
.dsh-h{font:700 1.375rem/1.15 Oswald,Arial,sans-serif;text-transform:uppercase;margin:2px 0 6px;color:#000;
  overflow-wrap:anywhere}
.dsh-sub{color:#333;margin-top:1px}
.dsh-poster{flex:none;display:block;max-width:42mm;max-height:58mm;width:auto;height:auto;border:1px solid #ccc}
.dsh-sec{margin-top:14px}
.dsh-st{font:600 .6875rem/1.3 Inter,Arial,sans-serif;text-transform:uppercase;letter-spacing:.08em;color:#333;
  border-bottom:1.5px solid #333;padding-bottom:3px;break-after:avoid;page-break-after:avoid}
.dsh-row{display:flex;gap:10px;padding:4px 0;border-bottom:1px solid #ccc;
  break-inside:avoid;page-break-inside:avoid}
.dsh-row.nl{border-bottom:0}
.dsh-k{flex:0 0 var(--kw,32%);min-width:0;font-weight:500;overflow-wrap:anywhere}
/* отступ — внутри колонки имени: так правая колонка у всех строк с одного края */
.dsh-row.ind .dsh-k{padding-left:14px}
.dsh-v{flex:1 1 auto;min-width:0;overflow-wrap:anywhere;color:#111}
.dsh-m{color:#555;font-size:.6875rem;font-weight:400}
/* имя артиста — основным цветом: у .kv .k он приглушённый */
.sh-art .kv .k b{color:var(--text)}
.sh-mem .k{color:var(--text)}
/* имя человека в «Персонале» — тоже основным цветом, как у участников */
.sh-crew .kv .k{color:var(--text)}

/* Цифры пульта — кнопки (02.10): нажатие ведёт в раздел. Вид прежний. */
button.card.pult-num{display:block;width:100%;text-align:left;font:inherit;color:inherit;cursor:pointer}
button.card.pult-num > span{display:block}
button.card.pult-num:hover{border-color:var(--edge)}
button.card.pult-num:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

/* «Команда» даты (1025): «Музыканты» и «Персонал» друг под другом слева,
   «Со стороны» справа. Кнопки строки на телефоне — отдельной строкой,
   чтобы не промахнуться пальцем (так на утверждённой картинке). */
.cw-col{display:grid;gap:14px;align-content:start}
.cw-col > .card{margin:0}
.cw-sub{margin:8px 0}
.cw-row{align-items:center}
.cw-body{flex:1;min-width:0;display:block}
.cw-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cw-core{display:inline-flex;align-items:center;gap:4px;font-size:.75rem;color:var(--mute)}
.cw-core svg{width:13px;height:13px}
.cw-pills{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px}
.cw-line{display:block;color:var(--mute);font-size:.75rem;margin-top:3px}
.cw-fee{color:var(--warm)}
.cw-acts{display:flex;gap:6px;flex:none;align-self:center;flex-wrap:wrap;justify-content:flex-end}
.cw-art{font-weight:700;margin:12px 0 6px;display:flex;align-items:center;gap:6px}
.cw-art:first-child{margin-top:0}
.cw-none{color:var(--mute);font-size:.8125rem;margin-bottom:6px}
.cw-btns{display:flex;gap:8px;flex-wrap:wrap}
.sw-list{position:static!important;box-shadow:none!important;max-height:none!important}
.sw-h{text-align:left!important}
@media(max-width:620px){
  .cw-row{flex-wrap:wrap}
  .cw-row .cw-acts{flex-basis:100%;justify-content:flex-end;padding-top:8px}
}
/* «Взять из заведённых» галочками (1025) */
.tf-row{padding:9px 10px;cursor:pointer}
.tf-txt{display:flex;flex-direction:column;min-width:0}
.tf-txt .fn{font-weight:600}
.tf-txt .fs{color:var(--mute);font-size:.75rem}
/* окно концерта у музыканта (1025) */
.sh-pills{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.sh-links{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px}
/* чат проекта и чат концерта (1025) */
.ch-auto{margin-bottom:4px}
.talk-crew{padding:12px;border:1px solid var(--line);border-radius:10px;background:var(--panel2);margin:10px 0 12px}

/* 1032: справа в шапке карточки человека — «Основной состав» и «Написать».
   Заказчик: «галочка „Основной состав" важная — её наверх вправо». */
.pn-head{flex-wrap:wrap}
/* своё имя класса: .pn-acts уже занят строкой кнопок в карточках «Команды» */
.pn-hacts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;margin-left:auto}
.pn-core{display:inline-flex;align-items:center;gap:6px}
@media(max-width:620px){
  .pn-hacts{flex:1 0 100%}
}

/* 1032: строка «Команды» даты нажимается целиком — открывает человека */
.cw-row.cw-go{cursor:pointer}
@media(hover:hover){
  .cw-row.cw-go:hover{border-color:var(--edge)}
  .cw-row.cw-go:hover .crew-go{color:var(--text)}
}
.cw-row.cw-go:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

.pl-row.pl-go{cursor:pointer}
@media (hover:hover){ .pl-row.pl-go:hover{border-color:var(--edge)} .pl-row.pl-go:hover .crew-go{color:var(--text)} }
.pl-row.pl-go:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

/* 1040: «Задачи одной строкой» — поле и «+», под ними «кто» и «срок».
   Сторона — пункт даты (видят все стороны), человек из команды — задача
   команды, тогда появляется срок. На телефоне «кто» и «срок» показываются,
   как только начали печатать: пустая карточка остаётся короткой. */
.chk-new .chk-more{display:flex;gap:6px;margin-top:6px;align-items:center;flex-wrap:wrap}
.chk-new .chk-more #chkWho{flex:1 1 180px;max-width:280px;min-width:0}
.chk-new .chk-more #chkDue{flex:0 1 170px;width:auto}
.chk-new .chk-more #chkDue[hidden]{display:none}
@media (max-width:620px){
  .ev-ready .chk-new .chk-more{display:none}
  .ev-ready .chk-new.typed .chk-more{display:flex}
  .chk-new .chk-more #chkWho{flex:1 1 140px;max-width:none}
  .chk-new .chk-more #chkDue{flex:1 1 140px}
}
/* 1040: время начала в окне «Изменить» — только строкой и ссылкой в «Тайминг» */
.ed-time{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-height:40px}

/* 1040: цифра непрочитанных переписок на кнопке меню ☰ — на телефоне меню
   спрятано, и о новых сообщениях не было видно ничего. */
.mob-top .mt-menu{position:relative;overflow:visible}
.mob-top .mt-menu .badge{top:-6px;right:-6px}

/* 1044: шапка переписки — кнопки одной строкой, «Убрать» значком (заказчик).
   На телефоне: «← Все переписки» и действия сверху, название строкой ниже. */
.ch-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.ch-head .ch-title{flex:1 1 auto;min-width:0;margin:0;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.ch-head .ch-acts{display:flex;gap:6px;margin-left:auto;flex-wrap:nowrap}
.btn.ch-sq{width:32px;padding:0;justify-content:center}
@media(max-width:900px){
  .ch-head .ch-back{order:1}
  .ch-head .ch-acts{order:2}
  .ch-head .ch-title{order:3;flex-basis:100%}
  .btn.ch-sq{width:40px}
}
@media(max-width:620px){
  /* три действия рядом с «← Все переписки» в строку не входят — только значки */
  .ch-acts.many .ch-tx{display:none}
  .ch-acts.many .btn{width:40px;padding:0;justify-content:center}
}

/* 04.10: сообщение нажимается, как в Телеграме (заказчик: «дать возможность
   на облако нажимать — отвечать, репостить, реагировать»). Облако — кнопка:
   видно по курсору и по рамке; на тач-экране долгое нажатие не выделяет
   текст — копирует пункт меню. */
.msg-bubble{cursor:pointer;-webkit-tap-highlight-color:transparent;transition:box-shadow .15s}
.msg-bubble:focus{outline:none}
.msg-bubble:focus-visible,.msg-bubble.mm-on{box-shadow:0 0 0 2px var(--warm)}
.msg-bubble.flash{box-shadow:0 0 0 3px var(--warm)}
@media(hover:none){
  .msg-bubble{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;touch-action:pan-y}
}
.msg-fwd{display:flex;align-items:center;gap:5px;font-size:.7188rem;color:var(--dim);margin-bottom:3px}
.msg-fwd b{font-weight:600;color:var(--text)}
.msg-fwd .ico{width:13px;height:13px}
/* реакции под текстом: смайлик и сколько; своя — тёплой рамкой */
.msg-reacts{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.msg-reacts[hidden]{display:none}
.rx{display:inline-flex;align-items:center;gap:4px;height:26px;padding:0 8px;border-radius:99px;
  border:1px solid var(--line);background:var(--panel);color:var(--text);font:inherit;
  font-size:.875rem;line-height:1;cursor:pointer}
.rx span{font-size:.6875rem;font-weight:600;color:var(--dim);font-variant-numeric:tabular-nums}
.rx:hover{border-color:var(--edge)}
.rx.mine{border-color:var(--warm);background:rgba(255,180,84,.16)}
.rx.mine span{color:var(--text)}
@media(hover:none){ .rx{height:32px;padding:0 10px} }
/* меню сообщения: на компьютере у самого облака, на телефоне — снизу */
.mm-back{position:fixed;inset:0;z-index:75;background:transparent}
.mm{position:fixed;left:0;top:0;width:264px;max-height:min(80vh,560px);overflow-y:auto;
  background:var(--panel);border:1px solid var(--edge);border-radius:14px;
  box-shadow:0 14px 36px rgba(0,0,0,.38);padding:8px;display:flex;flex-direction:column;gap:6px}
.mm.fwd{width:320px}
.mm-prev{display:none}
.mm-rx{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:2px}
.mm-rx button{height:36px;border:0;background:none;border-radius:9px;font-size:1.25rem;line-height:1;
  cursor:pointer;padding:0}
.mm-rx button:hover{background:var(--panel2)}
.mm-rx button.on{background:var(--panel2);box-shadow:inset 0 0 0 1.5px var(--warm)}
.mm-who{font-size:.75rem;color:var(--dim);padding:2px 6px;line-height:1.4}
.mm-list{display:flex;flex-direction:column;border-top:1px solid var(--line);padding-top:4px}
.mm-list button{display:flex;align-items:center;gap:10px;min-height:40px;padding:0 10px;border:0;
  background:none;border-radius:9px;color:var(--text);font:inherit;font-size:.875rem;text-align:left;cursor:pointer}
.mm-list button:hover,.mm-list button:focus-visible{background:var(--panel2);outline:none}
.mm-list button .ico{width:17px;height:17px;color:var(--dim)}
.mm-list button.danger,.mm-list button.danger .ico{color:var(--rose)}
.mm-head{display:flex;align-items:center;gap:8px}
.mm-q{display:flex;flex-direction:column;gap:4px;padding:6px 6px 8px;font-size:.875rem}
.mm-q span{color:var(--dim);font-size:.8125rem}
.mm input[type=search]{margin:0;height:40px}
.mm-fwd{height:min(300px,46vh);overflow-y:auto;display:flex;flex-direction:column}
.mm-fwd button{display:flex;align-items:center;gap:10px;padding:8px 10px;border:0;background:none;border-radius:9px;
  color:var(--text);font:inherit;text-align:left;cursor:pointer;flex:0 0 auto}
.mm-fwd button:hover,.mm-fwd button:focus-visible{background:var(--panel2);outline:none}
.mm-fwd button .ico{width:17px;height:17px;color:var(--dim)}
.mm-fwd button span{display:flex;flex-direction:column;min-width:0}
.mm-fwd button b{font-weight:600;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mm-fwd button small{color:var(--mute);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mm-fwd .empty{margin:auto 0}
/* закреплённое — полосой над перепиской */
.ch-pin{display:flex;align-items:center;gap:4px;border:1px solid var(--line);border-left:3px solid var(--warm);
  border-radius:9px;background:var(--panel2);margin-bottom:8px}
.ch-pin-go{flex:1;min-width:0;display:flex;align-items:center;gap:8px;border:0;background:none;color:var(--text);
  font:inherit;font-size:.8125rem;text-align:left;padding:8px 10px;cursor:pointer}
.ch-pin-go span{display:flex;flex-direction:column;min-width:0;line-height:1.3}
.ch-pin-go b{color:var(--warm);font-weight:600;font-size:.6875rem}
.ch-pin-go i{font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ch-pin-go .ico{width:16px;height:16px;color:var(--warm)}
.ch-pin-x{border:0;background:none;color:var(--mute);cursor:pointer;width:36px;height:36px;font-size:.875rem;flex:0 0 36px}
.ch-pin-x:hover{color:var(--rose)}
@media(max-width:620px){
  .mm-back{background:rgba(6,7,11,.55)}
  .mm,.mm.fwd{left:8px;right:8px;top:auto;bottom:calc(8px + env(safe-area-inset-bottom));width:auto;
    max-height:calc(100dvh - 24px);border-radius:16px}
  .mm-prev{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
    font-size:.8125rem;color:var(--dim);padding:4px 8px 8px;border-bottom:1px solid var(--line);line-height:1.4}
  .mm-rx button{height:46px;font-size:1.5rem}
  .mm-list button{min-height:48px;font-size:1rem}
  .mm-list button .ico{width:20px;height:20px}
  .mm-fwd button{min-height:52px}
  .mm input[type=search]{height:44px;font-size:max(16px,1rem)}
  .ch-pin-x{width:44px;height:44px;flex-basis:44px}
}

/* ===== 1048: «Команда» строками — вариант А =====
   Заказчик выбрал по картинкам 04.10. Строка на человека: лицо, имя, метки
   в одну линию, ставка и связь; кнопок нет — нажатие открывает карточку.
   Две должности — одна строка в группе первой. Строки идут через тонкую
   черту от края до края карточки группы. Группы во всю ширину: прежние
   «группы из одного по две в ряд» были нужны карточкам, строкам — нет. */
.team-groups{display:grid;gap:14px}
.team-groups > .card{margin:0}
.pn-list{margin:12px -18px -6px}
.pn-row{display:grid;grid-template-columns:36px minmax(0,1fr) auto 16px;
  grid-template-areas:"ava nm fee go" "ava tg tg go";column-gap:12px;align-items:center;
  align-content:center;min-height:64px;padding:10px 18px;border-top:1px solid var(--line);box-sizing:border-box}
.pn-list > .pn-row:last-child{border-radius:0 0 calc(var(--r) - 1px) calc(var(--r) - 1px)}
.pn-row .pn-ava{grid-area:ava;width:36px;height:36px;max-height:36px;border-radius:50%;
  object-fit:cover;border:1px solid var(--line);box-sizing:border-box}
.pn-row .pn-nm{grid-area:nm;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pn-row .pn-stage{color:var(--mute);font-weight:400}
.pn-row .pn-tg{grid-area:tg;display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin-top:5px;min-width:0}
.pn-row .pn-tg .pill{padding:2px 8px;font-size:.6875rem}
.pn-row .pn-was{font-size:.6875rem;color:var(--mute);white-space:nowrap}
.pn-row .pn-fee{grid-area:fee;justify-self:end;display:inline-flex;align-items:center;gap:5px;max-width:42vw;
  font-size:.75rem;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pn-row .pn-con{grid-area:con;display:none;align-items:center;gap:5px;min-width:0;
  font-size:.75rem;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* многоточие у длинной ставки и связи: во flex-блоке его даёт только вложенный элемент */
.pn-row .pn-fee > span,.pn-row .pn-con > span{min-width:0;overflow:hidden;text-overflow:ellipsis}
.pn-row .pn-fee .ico,.pn-row .pn-con .ico{flex:none}
.pn-row .pn-arw{grid-area:go;justify-self:end;display:inline-flex;align-items:center;
  color:var(--mute);font-size:1.125rem;line-height:1}
.pn-row.pn-go{cursor:pointer}
@media (hover:hover){
  .pn-row.pn-go:hover{background:var(--panel2)}
  .pn-row.pn-go:hover .pn-arw{color:var(--text)}
}
.pn-row.pn-go:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
/* Широкий экран: всё в одну линию — имя, метки, ставка, связь. Колонки
   долями, а не по содержимому: сетка у всех строк одна, и ставки встают
   ровным столбцом. Уже 1100 точек (с меню слева) — две линии, как на телефоне. */
/* 04.10: название группы даты в шапке переписки — кнопка в карточку даты.
   Выглядит как заголовок (наследует надзаголовок), отличается значком
   календаря и «›»; под курсором синеет, как ссылки сервиса. */
.ch-title .ch-ev{display:inline-flex;align-items:center;gap:6px;min-width:0;max-width:100%;padding:0;margin:0;
  border:0;background:none;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;
  text-align:left;cursor:pointer}
.ch-title .ch-ev > span:first-of-type{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ch-title .ch-ev .ico{flex:none}
.ch-title .ch-ev .ch-ev-go{flex:none;color:var(--mute);font-size:1rem;line-height:1}
@media (hover:hover){
  .ch-title .ch-ev:hover{color:var(--blue)}
  .ch-title .ch-ev:hover .ch-ev-go{color:var(--blue)}
}
.ch-title .ch-ev:focus-visible{outline:2px solid var(--blue);outline-offset:2px;border-radius:4px}
@media (hover:none){ .ch-title .ch-ev{min-height:40px} }
@media (min-width:1100px){
  .pn-row{grid-template-columns:36px minmax(150px,1.1fr) minmax(0,2fr) minmax(0,1fr) minmax(0,1.2fr) 16px;
    grid-template-areas:"ava nm tg fee con go";min-height:52px;padding:8px 18px}
  .pn-row .pn-tg{margin-top:0}
  .pn-row .pn-fee{justify-self:start;max-width:100%}
  .pn-row .pn-con{display:inline-flex}
}
/* 1050: «Взять райдер» — галочки блоков по ролям, чтобы взять только свою
   часть. Метка — кнопка: на телефоне под палец (40 точек). */
.rd-blocks{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.rd-blocks label.btn{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-weight:500}
.rd-blocks input[type=checkbox]{width:16px;height:16px;margin:0;accent-color:var(--warm)}
.rd-blocks .rd-n{color:var(--mute);font-weight:400}
.rd-took{display:block;margin-top:6px;color:var(--mint);font-size:.8125rem}
.rd-took:empty{display:none}
.rd-took svg{width:14px;height:14px;vertical-align:-2px}
@media(hover:none){.rd-blocks label.btn{height:40px}}
/* 05.10: «Получили / Оплатили» — галочкой-кнопкой рядом с карандашом */
.mn-b.mn-b-ok{color:var(--warm);border-color:var(--warm);margin-right:6px}
.mn-b.mn-b-ok svg{width:14px;height:14px}
.mn-b.mn-b-ok:hover{background-color:var(--warm);color:var(--ink)}
@media(hover:none){.mn-b.mn-b-ok{margin-right:12px}}
/* 05.10: замок-подсказка («видите только вы» — при наведении или нажатии):
   без кружка, цветом текста рядом; в заголовке раздела — мельче заголовка */
.tip.tip-bubble.tip-lock{color:inherit;margin:0 3px 0 0;min-width:0;font-size:inherit;cursor:help}
.tip.tip-bubble.tip-lock:hover{color:var(--warm)}
h1.page .tip.tip-lock{margin:0 0 0 6px;color:var(--dim)}
h1.page .tip.tip-lock .ico{width:.62em;height:.62em}
.pill .tip.tip-lock{margin:0}
/* 05.10, заказчик: «в личном, если проведено, делать событие тускло-серым —
   чтоб не отвлекало». Прошедший вечер (tone-done / tone-wait) — серая плашка
   и приглушённый текст вместо цвета рабочего места; полоска слева (итоги
   записаны или нет) остаётся. Селекторы той же силы, что .cal .ev-dot.ws.ws-N,
   и стоят ниже — поэтому перебивают. */
.cal .ev-dot.ws.tone-done,.cal .ev-dot.ws.tone-wait{background:var(--panel2);border-color:var(--line);color:var(--mute)}
.cal .ev-dot.ws.tone-done .t,.cal .ev-dot.ws.tone-wait .t{color:var(--mute);font-weight:500}
.span-col .span-ev.ws.tone-done,.span-col .span-ev.ws.tone-wait{background:var(--panel2);
  border-top-color:var(--line);border-right-color:var(--line);border-bottom-color:var(--line);color:var(--mute)}
.span-col .span-ev.ws.tone-done .span-name,.span-col .span-ev.ws.tone-wait .span-name{color:var(--mute);font-weight:500}
@media(max-width:560px){
  .day .ev-dot.ws.tone-done::before,.day .ev-dot.ws.tone-wait::before{background:var(--mute)}
}
/* 05.10, заказчик: «во всех календарях сегодняшнюю дату квадратик обводить
   жёлтым пожирней — не видно». Рамка цветом «сегодня» в две точки: вторая —
   тенью внутрь, чтобы сетка не сдвигалась. «Даты» (месяц, неделя, день)
   и календарь «Денег». */
.day.today,.span-col.today,.mc-day.now{border-color:var(--warm);box-shadow:inset 0 0 0 1px var(--warm)}
.day.today:hover{border-color:var(--warm)}
body.light .day.today{border-color:var(--warm)}
/* 05.10, заказчик: «в обычных календарях рабочих мест прошедшие события —
   тусклыми, будущие — жёлтыми, чтоб видеть; сейчас событий не видно». Было:
   впереди — серая плашка на серой ячейке. Стало: впереди — тёплая плашка;
   прошедшее — серое с полоской слева (зелёная — итоги записаны, тёплая — нет),
   как в «Личном». В «Личном» будущие по-прежнему цветом места: правила .ws
   сильнее, а здесь, где сила сравнялась бы, стоит :not(.ws). */
.ev-dot.tone-soon{border-color:var(--warm);background:rgba(255,180,84,.16)}
body.light .ev-dot.tone-soon{background:rgba(224,154,44,.14)}
.ev-dot.tone-done,.ev-dot.tone-wait{border-color:var(--line);background:var(--panel2);color:var(--mute)}
.ev-dot.tone-done .t,.ev-dot.tone-wait .t{color:var(--mute);font-weight:500}
.ev-dot.tone-done{box-shadow:inset 3px 0 0 var(--mint)}
.ev-dot.tone-wait{box-shadow:inset 3px 0 0 var(--warm)}
.span-col .span-ev.tone-soon:not(.ws),.span-col.wknd .span-ev.tone-soon:not(.ws){border-color:var(--warm);background:rgba(255,180,84,.16)}
body.light .span-col .span-ev.tone-soon:not(.ws){background:rgba(224,154,44,.14)}
.span-col .span-ev.tone-done:not(.ws),.span-col .span-ev.tone-wait:not(.ws),
.span-col.wknd .span-ev.tone-wait:not(.ws){border-color:var(--line);background:var(--panel2);color:var(--mute);box-shadow:none}
.span-col .span-ev.tone-done:not(.ws){border-left-color:var(--mint)}
.span-col .span-ev.tone-wait:not(.ws){border-left-color:var(--warm)}
.span-col .span-ev.tone-done:not(.ws) .span-name,.span-col .span-ev.tone-wait:not(.ws) .span-name{color:var(--mute);font-weight:500}
.tone-key.tone-soon::before{border-color:var(--warm);background:rgba(255,180,84,.3)}
.tone-key.tone-done::before,.tone-key.tone-wait::before{background:var(--panel2);border-color:var(--line)}
.tone-key.tone-done::before{box-shadow:inset 3px 0 0 var(--mint)}
.tone-key.tone-wait::before{box-shadow:inset 3px 0 0 var(--warm)}
@media(max-width:560px){
  /* телефон: в ячейке месяца точка, а не плашка — правила выше её не красят.
     Сброс повторён после них (той же силы, что и они). Заодно чинит серую
     полосу под точкой прошедшего в «Личном» (1058). */
  .ev-dot.tone-soon,.ev-dot.tone-done,.ev-dot.tone-wait,body.light .ev-dot.tone-soon,
  .cal .day .ev-dot.ws.tone-done,.cal .day .ev-dot.ws.tone-wait{background:none;border:none;box-shadow:none}
  .day .ev-dot.tone-soon::before{background:var(--warm)}
  .day .ev-dot.tone-done::before,.day .ev-dot.tone-wait::before{background:var(--mute)}
  .day .ev-dot.tone-done::before{box-shadow:0 0 0 3px rgba(78,212,160,.35)}
  .day .ev-dot.tone-wait::before{box-shadow:0 0 0 3px rgba(255,180,84,.4)}
}
/* в «Личном» будущее — цветом места, а не тёплым: образец «Впереди» прежний */
.tone-key.stripe.tone-soon::before{background:var(--panel2);border-color:var(--line)}
/* 05.10: окно «Участники» чата — строка на человека, нажатие — профиль */
.rp-row{display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:6px 2px;
  background:none;border:0;border-bottom:1px solid var(--line);color:var(--text);text-align:left;cursor:pointer;font:inherit}
.rp-row:last-of-type{border-bottom:0}
.rp-row:hover{color:var(--warm)}
/* 05.10, заказчик: «Команда события — облачка в строчку, пустое скрывать».
   Человек — строка, как в «Команде» (1048): фото, имя, ставка; ниже роль,
   время, «от кого», связь; кнопки справа (на телефоне — своей линией). */
.cw-list{margin:12px -18px 0}
.cw-art + .cw-list{margin-top:6px}
.cw-r{display:grid;grid-template-columns:36px minmax(0,1fr) auto auto;
  grid-template-areas:"ava nm fee acts" "ava tg tg acts";column-gap:12px;row-gap:3px;
  align-items:center;min-height:58px;padding:8px 18px;border-top:1px solid var(--line);box-sizing:border-box}
.cw-r .cw-ava{grid-area:ava;width:36px;height:36px;border-radius:50%;overflow:hidden;display:flex;
  align-items:center;justify-content:center;background:var(--panel2);border:1px solid var(--line);
  font-size:.75rem;font-weight:600;color:var(--dim);box-sizing:border-box}
.cw-r .cw-ava img{width:100%;height:100%;object-fit:cover;display:block}
.cw-r .cw-nm{grid-area:nm;display:flex;align-items:center;gap:4px;min-width:0}
.cw-r .cw-nm b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cw-r .cw-nm .tip-bubble{color:var(--dim)}
.cw-r .cw-fee2{grid-area:fee;display:inline-flex;align-items:center;gap:5px;font-size:.8125rem;color:var(--warm);white-space:nowrap}
.cw-r .cw-fee2 .tip-lock{color:var(--dim)}
.cw-r .cw-tg{grid-area:tg;display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;min-width:0}
.cw-r .cw-tg .pill{padding:2px 8px;font-size:.6875rem}
.cw-r .cw-con{display:inline-flex;align-items:center;gap:5px;min-width:0;max-width:100%;font-size:.75rem;color:var(--dim)}
.cw-r .cw-con > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cw-r .cw-con .ico{flex:none}
.cw-r .cw-acts2{grid-area:acts;display:flex;gap:6px;align-items:center;justify-content:flex-end}
.cw-r .cw-acts2 .danger{margin-left:6px}
.cw-r.cw-go{cursor:pointer}
@media (hover:hover){ .cw-r.cw-go:hover{background-color:var(--panel2)} }
.cw-r.cw-go:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
@media (max-width:620px){
  .cw-r{grid-template-columns:36px minmax(0,1fr) auto;grid-template-areas:"ava nm fee" "ava tg tg" "acts acts acts"}
  .cw-r .cw-acts2{padding-top:6px}
  .cw-tx{display:none}
}
/* 05.10: имя человека ссылкой в профиль — цветом текста, синее с чертой под курсором */
.who-link{background:none;border:0;padding:0;margin:0;font:inherit;color:inherit;cursor:pointer;text-align:left;letter-spacing:inherit}
@media (hover:hover){ .who-link:hover{color:var(--blue);text-decoration:underline} }
.who-link:focus-visible{outline:2px solid var(--blue);outline-offset:2px;border-radius:3px}
span.who-link{cursor:pointer}
@media (hover:hover){ span.who-link:hover{color:var(--blue);text-decoration:underline} }
/* 05.10: «Уведомления выключены» — строка на «Ближайшем» и под полем
   сообщения (вид — как у строки Telegram), шаги «как включить» в окне */
.dash-push{margin:0 0 16px}
.push-ask .pa-t{display:flex;align-items:center;gap:8px;flex:1 1 200px;min-width:0;color:var(--text)}
.push-ask .pa-t .ico{flex:none;color:var(--dim)}
.ph-steps{list-style:none;margin:4px 0 12px;padding:0;display:grid;gap:12px}
.ph-steps li{display:flex;gap:10px;align-items:flex-start;font-size:.875rem;line-height:1.55;color:var(--text)}
.ph-n{flex:none;width:24px;height:24px;margin-top:1px;border-radius:50%;background:var(--panel2);
  border:1px solid var(--edge);color:var(--text);font-weight:600;font-size:.8125rem;
  display:inline-flex;align-items:center;justify-content:center}
.ui-chip{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;vertical-align:baseline;
  background:var(--panel2);border:1px solid var(--edge);border-radius:6px;padding:0 6px;font-size:.8125rem;line-height:1.6}
.ui-chip .ico{width:14px;height:14px}
.rp-deaf{margin-left:auto;display:inline-flex;color:var(--mute)}
.rp-deaf .ico{width:16px;height:16px}
.ph-steps .nw{white-space:nowrap}
/* на телефоне строка «Уведомления выключены»: текст и «✕» — первой строкой,
   кнопка — под ними (иначе «✕» уезжал вниз один и строка вырастала вдвое) */
@media(max-width:560px){
  .push-ask .pa-t{order:1;flex:1 1 calc(100% - 56px)}
  .push-ask .ch-tg-x{order:2;margin-left:0}
  .push-ask > .btn{order:3}
}
