:root{
  /* Пульт матч-дня: ночь «Газпром Арены», небесно-синий «Зенита»,
     пламя G-Drive. Синий держит структуру, пламя — только действия,
     поэтому кнопка «Отправить» видна на странице сразу. */
  --night:#0a1f3c; --night-2:#123054; --azure:#1e6fd9; --azure-soft:#e8f1fd;
  --flame:#e4501c; --flame-soft:#fdf0eb;
  --ink:#0d1524; --muted:#586274; --faint:#8a94a6;
  --paper:#eef2f7; --surface:#fff; --rule:#dfe5ee; --rule-soft:#edf1f6;
  --ok:#12744a; --ok-soft:#e6f4ed; --stop:#a82f26; --stop-soft:#fbeceb;

  /* совместимость: старые классы ссылаются на прежние имена */
  --navy:var(--night); --navy-2:var(--night-2);
  --orange:var(--flame); --orange-soft:var(--flame-soft);

  --ui:"Inter","SF Pro Text",-apple-system,"Segoe UI Variable Text","Segoe UI",
       system-ui,"Helvetica Neue",Arial,sans-serif;
  --display:"Inter Display","Inter","SF Pro Display",-apple-system,
            "Segoe UI Variable Display","Segoe UI",system-ui,sans-serif;
  --mono:ui-monospace,"SF Mono","JetBrains Mono","Cascadia Mono",Menlo,Consolas,monospace;

  --shadow:0 1px 2px rgba(10,31,60,.06), 0 8px 24px rgba(10,31,60,.06);
  --shadow-sm:0 1px 2px rgba(10,31,60,.05);
  --r:12px; --r-sm:8px;
}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);
  font:15px/1.55 var(--ui);-webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility}
a{color:var(--azure);text-underline-offset:3px;text-decoration-thickness:1px}
a:hover{color:var(--flame)}

/* Шапка — тёмная полоса пульта: синяя, с тонкой линией пламени снизу. */
/* Шапка едет со страницей: на длинных списках (участники, метрика, экраны)
   до меню приходилось прокручивать всё обратно наверх. */
header.top{background:var(--night);color:#fff;box-shadow:inset 0 -2px 0 var(--flame);
  position:sticky;top:0;z-index:30}
header.top .in{max-width:1240px;margin:0 auto;padding:0 28px;display:flex;
  align-items:center;gap:8px;flex-wrap:wrap;min-height:58px}
header.top .brand{font-family:var(--display);font-weight:700;letter-spacing:-.03em;
  font-size:17px;margin-right:20px}
header.top nav{display:flex;gap:2px;flex-wrap:wrap}
header.top nav a{color:#a8bcd8;text-decoration:none;padding:8px 13px;border-radius:var(--r-sm);
  font-size:14px;transition:background .15s ease,color .15s ease}
header.top nav a:hover{color:#fff;background:rgba(255,255,255,.07)}
header.top nav a.on{color:#fff;background:var(--azure);font-weight:600}
header.top .who{margin-left:auto;color:#8ba3c4;font-size:13px}
header.top .who a{color:#8ba3c4}

main{max-width:1240px;margin:0 auto;padding:34px 28px 90px}
h1{font-family:var(--display);font-size:30px;margin:0 0 6px;letter-spacing:-.035em;
  font-weight:700;line-height:1.15}
/* Заголовок раздела — надпись на тонкой линейке, как деление на табло. */
h2{font-family:var(--display);font-size:13px;margin:34px 0 14px;letter-spacing:.09em;
  font-weight:700;text-transform:uppercase;color:var(--muted);
  display:flex;align-items:center;gap:12px}
h2::after{content:"";flex:1;height:1px;background:var(--rule)}
p.sub{color:var(--muted);margin:0 0 24px;font-size:15px}

.card{background:var(--surface);border:1px solid var(--rule);border-radius:var(--r);
  padding:20px 22px;margin-bottom:16px;box-shadow:var(--shadow-sm)}

/* Табло: показатели матч-дня одним тёмным блоком, цифры моноширинные.
   Это единственное яркое место в панели — остальное намеренно тихое. */
.tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;
  margin-bottom:26px;background:var(--night-2);border:1px solid var(--night-2);
  border-radius:var(--r);overflow:hidden;box-shadow:var(--shadow)}
/* Ровно четыре в ряд: показателей восемь, и при «сколько влезет» последний
   оставался один в тёмной пустоте. */
@media(max-width:900px){.tiles{grid-template-columns:repeat(2,1fr)}}
@media(max-width:460px){.tiles{grid-template-columns:1fr}}
.tile{background:var(--night);padding:18px 20px 16px}
.tile b{display:block;font-family:var(--mono);font-size:30px;line-height:1.05;
  font-variant-numeric:tabular-nums;letter-spacing:-.03em;color:#fff;font-weight:600}
.tile span{display:block;margin-top:7px;font-size:10px;color:#8ba3c4;
  text-transform:uppercase;letter-spacing:.1em;font-weight:600;line-height:1.35}

table{width:100%;border-collapse:collapse;font-size:14px}
th{text-align:left;font-size:10px;letter-spacing:.09em;text-transform:uppercase;color:var(--faint);
  border-bottom:1px solid var(--rule);padding:0 16px 10px 0;white-space:nowrap;font-weight:700}
td{border-bottom:1px solid var(--rule-soft);padding:12px 16px 12px 0;vertical-align:top}
tbody tr:hover td,table tr:hover td{background:var(--azure-soft)}
tr:last-child td{border-bottom:none}
.scroll{overflow-x:auto}
.num{font-family:var(--mono);font-variant-numeric:tabular-nums}

label{display:block;font-size:11px;color:var(--muted);margin:0 0 6px;
  letter-spacing:.05em;text-transform:uppercase;font-weight:600}
input[type=text],input[type=number],input[type=password],input[type=date],select,textarea{
  width:100%;padding:10px 13px;border:1px solid var(--rule);border-radius:var(--r-sm);
  font:inherit;background:#fff;color:var(--ink);transition:border-color .15s ease,box-shadow .15s ease}
input:hover,select:hover,textarea:hover{border-color:#c3cddc}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--azure);
  box-shadow:0 0 0 3px rgba(30,111,217,.15)}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:18px}
.field{margin-bottom:2px}
.field .err{color:var(--stop);font-size:12px;margin-top:5px}

button,.btn{background:#fff;color:var(--ink);border:1px solid var(--rule);border-radius:var(--r-sm);
  padding:10px 17px;font:inherit;font-weight:600;font-size:14px;cursor:pointer;
  text-decoration:none;display:inline-block;
  transition:background .15s ease,border-color .15s ease,transform .06s ease}
button:hover,.btn:hover{background:var(--paper);border-color:#c3cddc}
button:active,.btn:active{transform:translateY(1px)}
button:focus-visible,.btn:focus-visible{outline:2px solid var(--azure);outline-offset:2px}
button.accent{background:var(--flame);border-color:var(--flame);color:#fff}
button.accent:hover{background:#c94316;border-color:#c94316}
button.danger{background:#fff;border-color:#e6bfbb;color:var(--stop)}
button.danger:hover{background:var(--stop-soft);border-color:var(--stop)}
button[disabled],.btn[disabled]{background:var(--rule-soft);border-color:var(--rule);
  color:var(--faint);cursor:not-allowed;box-shadow:none}
button[disabled]:hover{background:var(--rule-soft);border-color:var(--rule)}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition-duration:.01ms !important;animation-duration:.01ms !important}
}

.pill{display:inline-block;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;
  padding:4px 9px;border-radius:999px;background:var(--rule-soft);color:var(--muted)}
.pill.ok{background:var(--ok-soft);color:var(--ok)}
.pill.stop{background:var(--stop-soft);color:var(--stop)}

.note{background:var(--orange-soft);border-left:3px solid var(--orange);padding:12px 16px;
  border-radius:0 var(--r-sm) var(--r-sm) 0;margin-bottom:18px}
.note.ok{background:var(--ok-soft);border-left-color:var(--ok)}
.muted{color:var(--muted)}
.mono{font-family:ui-monospace,"SFMono-Regular",Menlo,Consolas,monospace;font-size:13px}
.row-actions{display:flex;gap:12px;align-items:end;flex-wrap:wrap}
.login-wrap{max-width:360px;margin:12vh auto}

/* ---------- редактор экранов ---------- */
.editor{display:grid;grid-template-columns:250px minmax(0,1fr);gap:22px;align-items:start}
@media(max-width:900px){.editor{grid-template-columns:1fr}}
.slist{background:var(--surface);border:1px solid var(--rule);border-radius:var(--r);
  padding:10px;position:sticky;top:calc(var(--head-h, 58px) + 20px);
  max-height:calc(100vh - var(--head-h, 58px) - 40px);overflow:auto;
  box-shadow:var(--shadow-sm)}
.slist .grp{font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--faint);
  padding:12px 10px 5px}
.slist a{display:block;padding:8px 11px;border-radius:var(--r-sm);color:var(--ink);
  text-decoration:none;font-size:14px;line-height:1.35;transition:background .15s ease}
.slist a:hover{background:var(--paper)}
.slist a.on{background:var(--navy);color:#fff}
.slist a .dot{color:var(--orange);font-weight:700}
.slist a.on .dot{color:#ffb59b}

/* окно диалога VK */
.vk{background:#eceef1;border:1px solid var(--rule);border-radius:var(--r);padding:20px}
.vk-head{display:flex;gap:10px;align-items:center;margin-bottom:14px;color:#626d7a;font-size:13px}
.vk-ava{width:34px;height:34px;border-radius:50%;background:var(--navy);color:#fff;
  display:grid;place-items:center;font-size:12px;font-weight:700}
.bubble{background:#fff;border-radius:14px;padding:0 0 4px;max-width:480px;
  box-shadow:0 1px 2px rgba(0,0,0,.07),0 6px 18px rgba(22,35,61,.06);overflow:hidden}
.bubble .pic{width:100%;background:#dfe3e8;min-height:120px;
  display:grid;place-items:center;color:#8a94a3;font-size:13px;text-align:center;padding:16px}
.bubble>img{width:100%;display:block;background:#dfe3e8}
.bubble .body{padding:11px 14px 6px;white-space:pre-wrap;word-break:break-word;
  font-size:15px;line-height:1.45;color:#000;min-height:24px}
.bubble .body[contenteditable]:hover{background:#fffbe9;outline:1px dashed #d9b400}
.bubble .body[contenteditable]:focus{background:#fff;outline:2px solid var(--orange)}
.kb{padding:6px 8px 10px;display:flex;flex-direction:column;gap:6px}
.kb-row{display:flex;gap:6px}
.kb b{flex:1;text-align:center;background:#e7edf3;border-radius:9px;padding:10px 8px;
  font-weight:450;font-size:14px;color:#2a5885;cursor:text;min-width:0;
  transition:background .15s ease}
.kb b:hover{background:#fffbe9;outline:1px dashed #d9b400}
.kb b:focus{outline:2px solid var(--orange);background:#fff}
.kb b.link::after{content:" ↗";opacity:.5}
.hint{color:var(--muted);font-size:13px;margin:10px 0 0}
.bar{position:sticky;bottom:0;background:var(--surface);border:1px solid var(--rule);
  border-top:3px solid var(--orange);border-radius:var(--r);padding:14px 18px;margin-top:20px;
  display:flex;gap:12px;align-items:center;flex-wrap:wrap;
  box-shadow:0 -4px 18px rgba(22,35,61,.06)}
.bar .sp{flex:1}
.chg{font-size:12px;color:var(--orange)}
details.raw{margin-top:14px}
details.raw summary{cursor:pointer;color:var(--muted);font-size:13px}
details.raw textarea{width:100%;min-height:150px;margin-top:8px;padding:12px;
  border:1px solid var(--rule);border-radius:var(--r-sm);font:13px/1.55 ui-monospace,Menlo,monospace}
.bubble .body[contenteditable]{cursor:text}
.bubble .body .var{background:#e8eefa;color:#2a5885;border-radius:4px;padding:0 5px;
  font-size:13px;white-space:nowrap;user-select:none}
.bubble .body .raw{background:#f2e6e6;color:#8a3a34;border-radius:4px;padding:0 5px;font-size:12px}
.bubble .body b{font-weight:700}
.bubble .body blockquote{margin:4px 0;padding-left:10px;border-left:3px solid #d3d9e0;color:#4a5561}
.modeswitch{display:flex;gap:6px;margin-bottom:10px}
.modeswitch button{background:#e2e6ec;color:#41485a;padding:6px 14px;font-size:13px;
  border-radius:999px;box-shadow:none;font-weight:500}
.modeswitch button.on{background:var(--navy);color:#fff}
.bubble .body.preview{background:#fafbfc}
.card.danger{border-color:#f0cdc9;background:#fdf8f7}


/* ---- переключатель мгновенного действия (гонка) ---- */
.toggle { display: inline-flex; align-items: center; gap: 12px; cursor: pointer; }
.toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.toggle .track {
  position: relative; width: 52px; height: 28px; flex: none;
  background: #c3c9d4; border-radius: 999px; transition: background .18s ease;
}
.toggle .track::after {
  content: ""; position: absolute; top: 3px; left: 3px; width: 22px; height: 22px;
  background: #fff; border-radius: 50%; transition: transform .18s ease;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .28);
}
.toggle input:checked + .track { background: #2f9e51; }
.toggle input:checked + .track::after { transform: translateX(24px); }
.toggle input:focus-visible + .track { outline: 2px solid var(--navy); outline-offset: 2px; }
.toggle .state { font-weight: 600; }
.toggle .state.on { color: #2f9e51; }
.toggle .state.off { color: var(--muted); }

/* кнопка-ссылка в таблицах (удаление участника) */
/* Кнопка-ссылка в таблицах (удаление участника). Специфичность важна:
   button.danger — это (0,1,1), и без такого же веса здесь кнопка получала
   фон и рамку обычной кнопки, превращаясь в нечитаемую тёмную плашку. */
button.linklike,.linklike{
  background:none;border:0;padding:0;font:inherit;font-weight:400;font-size:13px;
  cursor:pointer;text-decoration:underline;text-underline-offset:3px;color:var(--muted);
  box-shadow:none}
button.linklike:hover,.linklike:hover{background:none;color:var(--stop)}
button.linklike.danger,.linklike.danger{color:var(--stop);opacity:.75}
button.linklike.danger:hover{opacity:1}

/* ---- полоса шагов на карточке розыгрыша ---- */
.steps { display: flex; gap: 10px; list-style: none; padding: 0; margin: 0 0 18px; flex-wrap: wrap; }
.steps li {
  flex: 1; min-width: 170px; padding: 13px 16px; border-radius: var(--r);
  border: 1px solid var(--rule); background: #fff; box-shadow: var(--shadow-sm);
}
.steps li b { display: block; font-size: 13px; }
.steps li span { font-size: 13px; color: var(--muted); }
.steps li.done { border-color: #bfe4cd; background: #f4fbf7; }
.steps li.done b { color: #2f9e51; }
.steps li.wait { opacity: .55; }

/* редактор рассылки: макет слева, настройки справа */
.editor.side { grid-template-columns: minmax(0, 1fr) 300px; }
@media (max-width: 900px) { .editor.side { grid-template-columns: 1fr; } }

/* ---- мелочи оформления ---- */
.editor{gap:24px}
.slist .grp:first-child{padding-top:6px}
.tile:hover,.card:hover{box-shadow:var(--shadow)}
.tiles a{text-decoration:none;color:inherit}
form{margin:0}
h2:first-child{margin-top:0}
hr{border:0;border-top:1px solid var(--rule);margin:22px 0}
.login-wrap .card{padding:26px}
@media (max-width:640px){
  main{padding:22px 16px 60px}
  h1{font-size:23px}
  .card{padding:16px}
}

/* сообщения гонки на странице результатов: пузыри в ряд, кнопки не редактируются */
.race-msgs{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));
  margin-bottom:18px}
.race-msg-head{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px;
  font-size:13px}
.race-msg-head a{margin-left:auto;color:var(--navy);font-size:13px}
.race-msgs .bubble{max-width:none}
.race-msgs .kb b{cursor:default}
.race-msgs .kb b:hover{background:#e7edf3;outline:none}

/* замена картинки под редактором экрана: загрузка слева, снятие справа */
.media-edit{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap;
  margin-top:16px;padding-top:16px;border-top:1px solid var(--rule)}
.media-edit form{margin:0}
.media-edit .row-actions{flex:1;min-width:340px;padding:0;border:0;background:none}

/* плашка форматирования над пузырём */
.rt-bar{display:flex;gap:4px;align-items:center;margin-bottom:8px}
.rt-bar button{min-width:32px;height:30px;padding:0 8px;font-size:14px;line-height:1;
  background:var(--surface);border:1px solid var(--rule);border-radius:7px;color:var(--ink);
  cursor:pointer;transition:background .15s ease,border-color .15s ease}
.rt-bar button:hover{background:#f1f3f6}
.rt-bar button.on{background:var(--orange-soft);border-color:var(--orange);color:var(--orange)}
.rt-bar .rt-sep{width:1px;height:18px;background:var(--rule);margin:0 4px}
.rt-bar .rt-hint{color:var(--muted);font-size:12px;margin-left:auto;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media(max-width:700px){.rt-bar .rt-hint{display:none}}

/* строка действий под сообщением в списке матч-дня.
   Боевая отправка и прогон разведены: их легко перепутать, а цена ошибки разная. */
.send-row{display:flex;gap:28px;align-items:flex-start;flex-wrap:wrap;margin-top:14px;
  padding-top:14px;border-top:1px solid var(--rule)}
.send-row form{margin:0}
.send-real{display:flex;flex-direction:column;gap:6px}
.send-test{display:flex;flex-direction:column;gap:6px;padding-left:28px;
  border-left:1px solid var(--rule)}
/* это фраза, а не подпись поля: капсом читается как окрик */
.send-test label{font-size:12px;color:var(--muted);font-weight:600;
  text-transform:none;letter-spacing:0}
.send-test-row{display:flex;gap:6px}
.send-test-row input{width:250px}
.send-note{font-size:12px;color:var(--muted)}
@media (max-width:640px){
  .send-test{padding-left:0;border-left:0;border-top:1px solid var(--rule);padding-top:12px}
}

/* викторина */
.quiz-q.off{opacity:.6}
.quiz-head{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.quiz-text{margin:0 0 8px;font-size:15px}
.quiz-opts{margin:0 0 12px;padding-left:22px}
.quiz-opts li{margin:2px 0;color:var(--muted)}
.quiz-opts li.right{color:var(--ok);font-weight:600}
.quiz-opts li.right::after{content:" — верный";font-weight:400;font-size:12px;opacity:.8}
.quiz-react{width:100%;font-size:13px}
.quiz-react td:first-child{width:74px;vertical-align:top;color:var(--muted)}
.quiz-react td.ok{color:var(--ok)}
.quiz-react td.no{color:var(--stop)}
.quiz-form{display:flex;flex-direction:column;gap:6px;margin-top:12px}
.quiz-form label{font-size:12px;color:var(--muted);font-weight:600;margin-top:6px}
.quiz-form textarea,.quiz-form input[type=text]{width:100%}
.quiz-opt-row{display:flex;gap:8px;align-items:center}
.quiz-opt-row .quiz-num{margin:0;width:20px;flex:none;text-align:center;cursor:pointer}
.quiz-foot{display:flex;gap:16px;align-items:flex-end;flex-wrap:wrap;margin-top:14px}
.quiz-foot .sp{flex:1}
.quiz-check{display:flex;gap:6px;align-items:center;margin:0 0 8px;font-weight:400;
  color:var(--ink);font-size:13px}

/* «Править» в викторине — кнопка, раскрывающая форму */
.quiz-edit{margin-top:12px}
.quiz-edit>summary{display:inline-flex;align-items:center;gap:7px;cursor:pointer;
  padding:8px 14px;border:1px solid var(--rule);border-radius:7px;background:var(--surface);
  font-size:13px;font-weight:600;color:var(--ink);list-style:none;user-select:none;
  transition:background .15s ease,border-color .15s ease}
.quiz-edit>summary::-webkit-details-marker{display:none}
.quiz-edit>summary:hover{background:#f1f3f6;border-color:#c9d0da}
.quiz-edit>summary:focus-visible{outline:2px solid var(--orange);outline-offset:2px}
.quiz-edit>summary .chev{display:inline-block;font-size:11px;color:var(--muted);
  transition:transform .15s ease}
.quiz-edit[open]>summary{background:var(--orange-soft);border-color:var(--orange);
  color:var(--orange)}
.quiz-edit[open]>summary .chev{transform:rotate(90deg);color:var(--orange)}

/* подстановки в редакторе сообщения */
.var-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:8px 0;
  border-top:1px solid var(--rule)}
.var-row:first-of-type{border-top:0;padding-top:0}
.var-name{flex:none;background:#e8eefa;color:#2a5885;border-radius:5px;padding:3px 8px;
  font-size:13px;font-family:var(--mono,monospace)}
.var-row input{width:230px}
.var-personal{width:230px;color:var(--muted);font-size:13px;font-style:italic}
.var-note{flex:1;min-width:200px;color:var(--muted);font-size:13px}

/* поля с разметкой в викторине */
.rt-field{min-height:38px;padding:9px 12px;border:1px solid var(--rule);border-radius:7px;
  background:var(--surface);font-size:14px;line-height:1.45;white-space:pre-wrap;
  word-break:break-word}
.rt-field:hover{background:#fffbe9}
.rt-field:focus{outline:2px solid var(--orange);background:var(--surface)}
.rt-field b{font-weight:700}
.quiz-opt-row .rt-field{flex:1;min-width:0}
.quiz-text b,.quiz-react b{font-weight:700}
.quiz-text .var,.quiz-react .var,.rt-field .var{background:#e8eefa;color:#2a5885;
  border-radius:4px;padding:0 5px;font-size:12px}
.quiz-text .raw,.quiz-react .raw,.rt-field .raw{background:#f2e6e6;color:#8a3a34;
  border-radius:4px;padding:0 5px;font-size:12px}
.rt-field .raw.link,.quiz-react .raw.link{background:#e8f0e6;color:#3a6b34}

/* Начало текста рассылки в списке. Обрыв показываем затуханием — иначе
   непонятно, кончился текст или его просто обрезали. */
.camp-preview{position:relative;font-size:13px;color:var(--muted);white-space:pre-wrap;
  max-height:4.4em;overflow:hidden;line-height:1.45}
.camp-preview::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1.5em;
  background:linear-gradient(to bottom,rgba(255,255,255,0),var(--surface))}

/* Пустая заглушка картинки — узкой полосой: место под изображение занимать
   незачем, когда изображения нет. */
.bubble .pic.empty{min-height:0;padding:10px 14px;font-size:13px;
  background:var(--rule-soft);color:var(--faint)}

/* пояснение под полем формы */
.field-note{margin:5px 0 0;font-size:12px;color:var(--faint);line-height:1.4}

/* Выбор файла. Браузерное поле выглядит как из девяностых («Выберите файл ·
   Файл не выбран»), поэтому оформляем и само поле, и его кнопку. */
input[type=file]{
  width:100%;padding:7px 12px 7px 7px;border:1px dashed var(--rule);border-radius:var(--r-sm);
  background:var(--surface);color:var(--muted);font:inherit;font-size:13px;cursor:pointer;
  transition:border-color .15s ease,background .15s ease}
input[type=file]:hover{border-color:var(--azure);background:var(--azure-soft)}
input[type=file]:focus-visible{outline:2px solid var(--azure);outline-offset:2px}
input[type=file]::file-selector-button{
  margin-right:12px;padding:8px 15px;border:1px solid var(--rule);border-radius:6px;
  background:var(--paper);color:var(--ink);font:inherit;font-size:13px;font-weight:600;
  cursor:pointer;transition:background .15s ease,border-color .15s ease}
input[type=file]:hover::file-selector-button{background:#fff;border-color:var(--azure);
  color:var(--azure)}
input[type=file]::-webkit-file-upload-button{
  margin-right:12px;padding:8px 15px;border:1px solid var(--rule);border-radius:6px;
  background:var(--paper);color:var(--ink);font:inherit;font-size:13px;font-weight:600;
  cursor:pointer}

/* Выбор файла: свой контрол вместо браузерного.
   Родное поле рисует сам браузер и подписывает кнопку на своей локали —
   на английской системе выходило «Choose File · No file chosen». */
.filepick{display:flex;align-items:center;gap:12px;padding:8px;cursor:pointer;
  border:1px dashed var(--rule);border-radius:var(--r-sm);background:var(--surface);
  transition:border-color .15s ease,background .15s ease;
  /* это <label>, а подписи полей у нас капсом — здесь он ни к чему */
  text-transform:none;letter-spacing:0;font-weight:400;color:var(--ink);margin:0}
.filepick:hover,.filepick.over{border-color:var(--azure);background:var(--azure-soft)}
.filepick:focus-within{outline:2px solid var(--azure);outline-offset:2px}
.filepick input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.filepick-btn{flex:none;padding:8px 15px;border:1px solid var(--rule);border-radius:6px;
  background:var(--paper);color:var(--ink);font-size:13px;font-weight:600;line-height:1;
  transition:background .15s ease,border-color .15s ease,color .15s ease}
.filepick:hover .filepick-btn{background:#fff;border-color:var(--azure);color:var(--azure)}
.filepick-name{min-width:0;font-size:13px;color:var(--muted);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.filepick.chosen{border-style:solid;border-color:var(--ok)}
.filepick.chosen .filepick-name{color:var(--ink);font-weight:600}

/* Выбор картинки плитками. Было выпадающим списком с именами файлов вида
   «46416708_2025-05-25_16.01.33» — понять, что там за картинка, было нельзя. */
.picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(124px,1fr));gap:10px;
  max-height:340px;overflow-y:auto;padding:4px;margin-top:2px}
.pick{position:relative;display:flex;flex-direction:column;gap:6px;cursor:pointer;margin:0;
  padding:6px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--surface);
  text-transform:none;letter-spacing:0;font-weight:400;
  transition:border-color .15s ease,box-shadow .15s ease}
.pick:hover{border-color:var(--azure)}
.pick.on{border-color:var(--azure);box-shadow:0 0 0 2px rgba(30,111,217,.2)}
.pick input{position:absolute;opacity:0;width:0;height:0}
.pick:focus-within{outline:2px solid var(--azure);outline-offset:2px}
.pick img{width:100%;height:74px;object-fit:cover;border-radius:5px;background:var(--rule-soft);
  display:block}
.pick-none{height:74px;display:grid;place-items:center;border-radius:5px;
  background:var(--rule-soft);color:var(--faint);font-size:12px;text-align:center;padding:6px}
.pick-title{font-size:11px;line-height:1.3;color:var(--muted);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pick.on .pick-title{color:var(--ink);font-weight:600}

/* Свёрнутый список картинок: показываем, что выбрано, и открываем по кнопке. */
.picker-box{margin-top:2px}
.picker-box>summary{display:inline-flex;align-items:center;gap:9px;cursor:pointer;
  padding:9px 14px;border:1px solid var(--rule);border-radius:var(--r-sm);
  background:var(--surface);list-style:none;user-select:none;
  transition:background .15s ease,border-color .15s ease}
.picker-box>summary::-webkit-details-marker{display:none}
.picker-box>summary:hover{background:var(--paper);border-color:#c3cddc}
.picker-box>summary:focus-visible{outline:2px solid var(--azure);outline-offset:2px}
.picker-box[open]>summary{border-color:var(--azure);background:var(--azure-soft)}
.picker-box>summary .chev{font-size:11px;color:var(--muted);transition:transform .15s ease}
.picker-box[open]>summary .chev{transform:rotate(90deg);color:var(--azure)}
.picker-current{font-size:13px;font-weight:600;color:var(--ink)}
.picker-hint{font-size:12px;color:var(--faint)}

/* кнопка «крупно» на плитке */
.pick-zoom{position:absolute;top:9px;right:9px;width:24px;height:24px;padding:0;
  display:grid;place-items:center;font-size:12px;line-height:1;border-radius:5px;
  border:0;background:rgba(10,31,60,.62);color:#fff;opacity:0;cursor:pointer;
  transition:opacity .15s ease,background .15s ease}
.pick:hover .pick-zoom,.pick-zoom:focus-visible{opacity:1}
.pick-zoom:hover{background:var(--night)}

/* просмотр картинки крупно */
.lightbox{position:fixed;inset:0;z-index:50;display:grid;place-items:center;
  background:rgba(10,31,60,.82);padding:40px;cursor:zoom-out}
.lightbox[hidden]{display:none}
.lightbox figure{margin:0;max-width:min(1000px,92vw);text-align:center}
.lightbox img{max-width:100%;max-height:78vh;border-radius:var(--r);display:block;
  box-shadow:0 20px 60px rgba(0,0,0,.4)}
.lightbox figcaption{margin-top:14px;color:#dbe4f0;font-size:14px}

/* переключатели кнопок главного меню */
.menu-toggles{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px}
.menu-toggle{display:flex;align-items:center;gap:10px;margin:0;padding:10px 12px;
  border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--surface);
  cursor:pointer;text-transform:none;letter-spacing:0;font-weight:400;
  transition:border-color .15s ease,background .15s ease}
.menu-toggle:hover{border-color:var(--azure);background:var(--azure-soft)}
.menu-toggle:has(input:disabled){opacity:.55;cursor:not-allowed}
.menu-toggle input{width:16px;height:16px;flex:none;margin:0;accent-color:var(--azure)}
.menu-toggle-label{font-size:14px;color:var(--ink)}
.menu-toggle-btn{margin-left:auto;font-size:11px;color:var(--faint);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}
.menu-toggle.off{background:var(--paper);border-style:dashed}
.menu-toggle.off .menu-toggle-label{color:var(--muted)}

/* временная вкладка «Правки» — убрать вместе с ней */
.transcript{margin:0;white-space:pre-wrap;word-break:break-word;font-size:14px;
  line-height:1.55;max-height:60vh;overflow:auto;font-family:var(--ui)}
.task{border-left:3px solid var(--rule)}
.task.approved{border-left-color:var(--azure)}
.task.doing{border-left-color:var(--flame)}
.task.done{border-left-color:var(--ok)}
.task.rejected{border-left-color:var(--rule);opacity:.6}
.task-head{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap}
.task-detail{margin:8px 0 0;color:var(--muted);font-size:14px;white-space:pre-wrap}
.task-actions{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap;
  margin-top:14px;padding-top:14px;border-top:1px solid var(--rule)}
.task-actions .row-actions{padding:0;border:0;background:none;gap:8px}
.task-actions select{width:auto}

/* метрика нажатий */
.bar-line{display:block;height:8px;border-radius:4px;background:var(--azure);opacity:.65;
  min-width:2px}
.days{display:flex;gap:8px;align-items:flex-end;overflow-x:auto;padding-bottom:4px}
.day{display:flex;flex-direction:column;align-items:center;gap:5px;min-width:44px;flex:1}
.day-bar{width:100%;max-width:56px;min-height:3px;border-radius:4px 4px 0 0;
  background:var(--azure);opacity:.75;align-self:stretch}
.day:hover .day-bar{opacity:1}
.day-n{font-size:12px;color:var(--ink);order:-1}
.day-label{font-size:11px;color:var(--faint);white-space:nowrap}

/* страница заезда по QR — открывается с телефона куратора, поэтому крупно */
.scan-who{display:flex;gap:20px;align-items:center;justify-content:space-between;
  flex-wrap:wrap}
.scan-label{display:block;font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--faint);font-weight:600;margin-bottom:4px}
.scan-name{display:block;font-size:20px;letter-spacing:-.02em}
.scan-points{text-align:right}
.scan-points b{display:block;font-size:26px;line-height:1.1}
.scan-points span{font-size:12px;color:var(--muted)}
.scan-time{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.scan-time input{font-size:26px;text-align:center;padding:14px 8px;
  font-family:var(--mono);font-variant-numeric:tabular-nums}
.scan-go{width:100%;padding:16px;font-size:16px}
@media(min-width:700px){.scan-go{width:auto;padding:12px 28px}}

/* ---------------------------------------------------------------- телефон */
/* Кнопка меню. На широком экране её нет — там все пункты и так помещаются. */
.burger{display:none;margin-left:auto;width:40px;height:36px;padding:0;
  flex-direction:column;justify-content:center;gap:5px;align-items:center;
  background:rgba(255,255,255,.08);border:0;border-radius:var(--r-sm);cursor:pointer}
.burger span{display:block;width:18px;height:2px;border-radius:2px;background:#fff;
  transition:transform .18s ease,opacity .18s ease}
.burger[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

@media (max-width:900px){
  .burger{display:flex}
  header.top .in{padding:0 16px;gap:10px;min-height:52px}
  header.top nav{display:none;order:3;width:100%;flex-direction:column;gap:2px;
    padding:6px 0 12px;border-top:1px solid rgba(255,255,255,.12);margin-top:4px}
  header.top nav.open{display:flex}
  /* Один пункт (промоутер) — не прячем за бургер, он и так помещается. */
  header.top nav.solo{display:flex;flex-direction:row;width:auto;order:2;
    margin:0 0 0 auto;padding:0;border:0}
  header.top nav a{padding:11px 12px;font-size:15px;border-radius:var(--r-sm)}
  header.top .who{order:2;margin-left:0;font-size:12px}
  header.top .brand{margin-right:0;font-size:16px}

  main{padding:20px 16px 60px}
  h1{font-size:24px}
  h2{margin:26px 0 10px}
  p.sub{font-size:14px;margin-bottom:18px}
  .card{padding:16px;border-radius:10px}

  /* Таблицы остаются прокручиваемыми, но плотнее — влезает больше колонок,
     а у края появляется тень: видно, что список продолжается вправо. */
  table{font-size:13px}
  th{padding:0 10px 8px 0;font-size:10px}
  td{padding:10px 10px 10px 0}
  .scroll{position:relative;-webkit-overflow-scrolling:touch}
  .scroll::after{content:"";position:sticky;right:0;top:0;float:right;width:22px;
    height:100%;pointer-events:none;
    background:linear-gradient(to right,rgba(255,255,255,0),var(--surface))}

  /* Кнопки и поля — под палец, а не под курсор. */
  button,.btn{padding:12px 18px;font-size:14px}
  input[type=text],input[type=number],input[type=password],select,textarea{
    padding:12px 13px;font-size:16px}   /* 16px: меньше — iOS зумит страницу */
  .row-actions{gap:10px}
  .row-actions>div{min-width:100%}
  .grid{grid-template-columns:1fr;gap:14px}
  .tiles{grid-template-columns:repeat(2,1fr)}
}

@media (max-width:360px){
  .tiles{grid-template-columns:1fr}
  .tile b{font-size:26px}
  main{padding:16px 12px 48px}
  .card{padding:14px}
}

/* Таблицы карточками на телефоне: подписи столбцов подставляет editor.js
   из шапки таблицы, поэтому шаблоны не менялись. */
@media (max-width:700px){
  table.stackable, table.stackable tbody, table.stackable tr, table.stackable td{
    display:block;width:auto}
  table.stackable tr:first-child{display:none}       /* шапка не нужна: подписи в строках */
  table.stackable tr{border:1px solid var(--rule);border-radius:var(--r-sm);
    padding:10px 12px;margin-bottom:10px;background:var(--surface)}
  table.stackable tr:last-child{margin-bottom:0}
  table.stackable tr:hover td{background:none}
  table.stackable td{border:0;padding:5px 0;display:flex;gap:12px;
    align-items:baseline;justify-content:space-between}
  table.stackable td::before{content:attr(data-label);flex:none;
    font-size:10px;letter-spacing:.07em;text-transform:uppercase;color:var(--faint);
    font-weight:700;padding-top:2px}
  table.stackable td:empty{display:none}
  table.stackable td[data-label=""]{justify-content:flex-end}
  /* внутри карточек боковой прокрутки уже нет — убираем и подсказку о ней */
  .scroll:has(table.stackable){overflow-x:visible}
  .scroll:has(table.stackable)::after{display:none}
}

@media (max-width:700px){
  /* Длинные строки без пробелов — имена файлов, ссылки, номера вложений —
     иначе распирают карточку и появляется боковая прокрутка всей страницы. */
  table.stackable td,.card td,.card,.note,.task-detail{overflow-wrap:anywhere}
  table.stackable td{gap:10px}
  table.stackable td::before{max-width:42%}
}

/* Таблица «поле — значение» на телефоне: подпись сверху, значение под ней.
   В две колонки на 390 px значение получало треть ширины, и блок настроек
   меню сминался в столбик из обрезанных слов. */
@media (max-width:700px){
  table.info,table.info tbody,table.info tr,table.info td{display:block;width:auto}
  table.info tr{border-bottom:1px solid var(--rule-soft);padding:12px 0}
  table.info tr:first-child{padding-top:0}
  table.info tr:last-child{border-bottom:0;padding-bottom:0}
  table.info tr:hover td{background:none}
  table.info td{border:0;padding:0;width:auto !important}
  table.info td:first-child{font-size:10px;letter-spacing:.07em;text-transform:uppercase;
    color:var(--faint);font-weight:700;margin-bottom:6px}
  .menu-toggles{grid-template-columns:1fr}
  .menu-toggle-btn{max-width:none}
}

@media (max-width:700px){
  /* Поле «кому» и кнопка прогона в один ряд не помещались — кнопка ломалась
     пополам. Ставим друг под другом во всю ширину. */
  .send-row{gap:16px}
  .send-real,.send-test{width:100%}
  .send-test-row{flex-direction:column;align-items:stretch}
  .send-test-row input{width:100%}
  .send-test-row button,.send-real button,.send-real form{width:100%}
  .send-real button{width:100%}
  /* Не даём длинным подписям кнопок рвать слово посередине. */
  button,.btn{white-space:nowrap}
}

@media (max-width:900px){
  /* Список экранов на телефоне не липнет и не режется: он идёт первым блоком,
     под ним редактор. В прокручиваемом окошке половина пунктов была не видна. */
  .slist{position:static;max-height:none;overflow:visible}
}

@media (max-width:700px){
  /* Мелкие переключатели — под палец: 30–34 px по высоте на телефоне мало. */
  .modeswitch button{padding:9px 14px;font-size:13px}
  .rt-bar button{min-width:40px;height:40px;font-size:15px}
  .rt-bar{flex-wrap:wrap}
}

/* На сенсорных экранах наведения нет — кнопка «крупно» иначе не появится
   вовсе. Показываем её всегда и делаем крупнее, чтобы попасть пальцем. */
@media (hover:none){
  .pick-zoom{opacity:1;width:34px;height:34px;font-size:14px}
}

/* Карта рассылок на дашборде: весь план матч-дня одной лентой. Строка узкая,
   поэтому переключатель «авто» здесь без подписи-кнопки, а текст раскрывается
   на месте — уходить в карточку ради одной проверки не нужно. */
.mailmap td{vertical-align:top}
.mailmap .menu-toggles{grid-template-columns:1fr;min-width:104px}
.mailmap .menu-toggle{padding:6px 8px}
.when-form{display:flex;gap:4px;align-items:center}
.when-form input{padding:5px 6px;font-size:13px;width:auto;min-width:0}
.when-form input[name=when_day]{width:102px}
.when-form input[name=when]{width:56px}
.when-form button{padding:5px 9px;font-size:12px;flex:none}
.mailmap details summary{cursor:pointer;color:var(--azure);font-size:13px}
.mailmap .camp-text{white-space:pre-wrap;font-size:13px;line-height:1.45;
  margin-top:6px;max-width:46ch;color:var(--ink)}

@media (max-width:700px){
  /* Карточками строки раскладывает общий .stackable — здесь только ширина
     текста: в карточке он занимает её целиком, а не 46 знаков. */
  .mailmap .camp-text{max-width:none}
}

/* Сканер QR в кабинете промоутера. Камера телефона открывает ссылку в своём
   браузере, а вход промоутера живёт в этом — отсюда переход идёт в том же окне,
   и пароль посреди очереди уже не спросят. */
.scanbox{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.scanbox button{font-size:16px;padding:12px 22px}
.scanbox .muted{font-size:13px}

#scan-view{position:fixed;inset:0;z-index:50;background:#000;
  display:flex;align-items:center;justify-content:center}
/* display:flex по id перебивает браузерное [hidden]{display:none} — без этой
   строки чёрный экран камеры закрывал страницу всем и сразу. */
#scan-view[hidden]{display:none}
#scan-video{width:100%;height:100%;object-fit:cover}
/* Рамка-прицел: без неё непонятно, куда наводить и поймал ли сканер кадр. */
.scan-frame{position:absolute;width:min(70vw,280px);aspect-ratio:1;
  border:3px solid var(--flame);border-radius:16px;box-shadow:0 0 0 100vmax rgba(0,0,0,.45)}
.scan-hint{position:absolute;bottom:96px;left:0;right:0;text-align:center;
  color:#fff;font-size:15px;margin:0;text-shadow:0 1px 3px rgba(0,0,0,.6)}
#scan-close{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);
  padding:12px 26px;font-size:15px;background:#fff}
