:root{
  /* Бумага и чернила: фон страницы, основной текст, второстепенный текст,
     линии. Поверхности двух уровней: карточка светлее фона, панель разбора
     чуть темнее карточки. */
  --paper:#efe6d6; --ink:#3a2612; --muted:#7a6244; --line:#d8c8ad;
  --card:#fbf6ec; --panel:#f6efe2; --sunk:#e9e0cf;
  /* Верно и неверно: цвет текста и заливка под него. */
  --ok:#2e6b3f; --ok-bg:#e2ecdf;
  --no:#9b2c2c; --no-bg:#f2e2e2;
}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);font:17px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}
header{display:flex;gap:16px;align-items:center;flex-wrap:wrap;padding:14px 16px;border-bottom:1px solid var(--line)}
.brand{font-weight:700;text-decoration:none;color:var(--ink)}
nav a{margin-right:14px;color:var(--muted);text-decoration:none}
nav a:hover{color:var(--ink)}
main{max-width:720px;margin:0 auto;padding:20px 16px 40px}
h1{font-size:27px;line-height:1.15;margin:8px 0 16px}
h2{font-size:21px;margin:28px 0 10px}
.qh{font-size:16px;margin:0 0 8px;color:var(--muted);font-weight:600}
.qh a{color:var(--muted)}
.lead{color:var(--muted);margin:0 0 20px}
.cards{display:flex;flex-direction:column;gap:10px;margin:0 0 8px}
.card{display:block;padding:14px 16px;border:1px solid var(--line);border-radius:10px;text-decoration:none;color:var(--ink);background:var(--panel)}
.card b{display:block}.card span{color:var(--muted);font-size:15px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:8px}
.tile{display:block;text-align:center;padding:14px 6px;border:1px solid var(--line);border-radius:10px;text-decoration:none;color:var(--ink);background:var(--panel)}
.list{list-style:none;padding:0;margin:0}
.list li{padding:11px 0;border-bottom:1px solid var(--line)}
.list a{color:var(--ink)}
.n{color:var(--muted);font-size:14px;margin-left:6px}
.q{padding:20px 0;border-bottom:1px solid var(--line)}
.qt{font-size:18px;margin:0 0 12px}
.qi{width:100%;height:auto;border-radius:10px;display:block;margin:0 0 12px;cursor:zoom-in}
@media (max-width:752px){
  .qi{width:100vw;margin-left:-16px;margin-right:-16px;border-radius:0;max-width:none}
}
/* Разглядеть знак на полосе 1024 на 439, ужатой втрое, нельзя. Касание
   раскрывает картинку во весь экран, дальше пальцами. */
.zoom{position:fixed;inset:0;z-index:50;background:rgba(58,38,18,.94);display:flex;
  align-items:center;justify-content:center;padding:12px;overflow:auto}
.zoom img{max-width:none;width:auto;height:auto;border-radius:4px}
.zoom .close{position:fixed;top:12px;right:12px;width:44px;height:44px;border:0;border-radius:50%;
  background:var(--paper);color:var(--ink);font:600 20px/1 inherit;cursor:pointer}
.noimg{aspect-ratio:7/3;background:var(--sunk);border:1px dashed var(--line);display:flex;
  align-items:center;justify-content:center;color:var(--muted);font-size:15px}
/* На телефоне двадцать номеров в один ряд дают меньше пятнадцати точек на
   плашку, и двузначное число туда не влезает. Поэтому два ряда по десять,
   а где ширины хватает, разворачиваем в один ряд из двадцати. Колонки
   тянутся сами, так что строка всегда выровнена по краям. */
.nums{display:grid;grid-template-columns:repeat(10,1fr);gap:5px;margin:0 0 18px}
@media (min-width:640px){.nums{grid-template-columns:repeat(20,1fr);gap:4px}}
.nums button{min-height:36px;padding:7px 2px;border:1px solid var(--line);border-radius:7px;
  background:var(--card);font:inherit;font-size:13px;line-height:1.1;color:var(--ink);cursor:pointer;
  font-variant-numeric:tabular-nums}
.nums button:hover{border-color:var(--muted)}
/* Текущий номер обводим, а не заливаем: заливка затирала бы цвет
   состояния, и на своём же вопросе не видно, верно ли ты ответил. */
.nums button.on{border-color:var(--ink);box-shadow:inset 0 0 0 2px var(--ink);font-weight:700}
.nums button.ok{background:var(--ok-bg);border-color:var(--ok);color:var(--ok)}
.nums button.no{background:var(--no-bg);border-color:var(--no);color:var(--no)}
.nums button.seen{background:var(--sunk);color:var(--muted)}
.deck .q{display:none;border-bottom:0;padding-top:0}
.deck .q.active{display:block}
.answers{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}
.answers button{display:block;width:100%;text-align:left;padding:13px 14px;border:1px solid var(--line);border-radius:10px;background:var(--card);font:inherit;color:inherit;cursor:pointer}
.answers button:hover{border-color:var(--muted)}
.answers button.ok{border-color:var(--ok);background:var(--ok-bg);color:var(--ok)}
.answers button.no{border-color:var(--no);background:var(--no-bg);color:var(--no)}
.qnav{position:fixed;left:0;right:0;bottom:0;z-index:20;display:grid;grid-template-columns:1fr 1fr;
  gap:8px;padding:10px 16px calc(10px + env(safe-area-inset-bottom));margin:0;
  background:var(--paper);border-top:1px solid var(--line)}
.qnav button{padding:15px 10px;border:1px solid var(--line);border-radius:10px;
  background:var(--card);font:600 16px/1.2 inherit;color:var(--ink);cursor:pointer}
.qnav button:hover:not(:disabled){border-color:var(--muted)}
.qnav button:disabled{opacity:.4;cursor:default}
.qnav .nextq{background:var(--ink);color:#f4ead8;border-color:var(--ink)}
.qnav .nextq:disabled{background:var(--card);color:var(--ink);border-color:var(--line)}
.result{padding:10px 0 4px}
.result h2{font-size:22px;margin:0 0 6px;color:var(--ink);font-weight:700}
.score{font-size:17px;color:var(--muted);margin:0 0 16px}
.score b{font-size:30px;color:var(--ink)}
.result .miss{display:block;padding:11px 0;border-bottom:1px solid var(--line);color:var(--ink)}
.again{margin:14px 0 0;text-align:center}
.restart{border:0;background:none;color:var(--muted);font:inherit;text-decoration:underline;cursor:pointer}
.barspace{height:84px}
.tnav{font-size:15px;color:var(--muted);margin:0 0 22px}
.tnav a{color:var(--muted)}
.show{display:block;width:100%;margin-top:10px;padding:13px 14px;border:1px solid var(--line);
  border-radius:10px;background:transparent;font:inherit;color:var(--muted);cursor:pointer}
.show:hover{border-color:var(--muted);color:var(--ink)}
.q.done .show{display:none}
.expl{display:none;margin-top:14px;padding:14px;border-radius:10px;background:var(--panel)}
.q.done .expl{display:block}
.expl p{margin:0 0 8px}.expl p:last-child{margin:0}
.hint{margin-top:10px;font-size:15px;color:var(--muted)}
.hint img,.why img{vertical-align:middle}
.pager{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin:22px 0}
.pager a{display:block;width:100%;text-align:center;padding:14px 10px;border:1px solid var(--line);
  border-radius:10px;background:var(--card);text-decoration:none;color:var(--ink);font-weight:600}
.pager a:hover{border-color:var(--muted)}
.pager a.mid{background:transparent;font-weight:400;color:var(--muted)}
/* У переходов между билетами подписи длинные, и на телефоне три колонки
   режут их по краю. Там складываем блоки в столбик. */
@media (max-width:560px){
  .pager.wide{grid-template-columns:1fr}
  .pager.wide span{display:none}
}
.topics{font-size:15px;color:var(--muted)}
.signs{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}
.signs figure{margin:0;text-align:center}
.signs img{width:84px;height:84px;object-fit:contain}
.signs figcaption{font-size:14px;color:var(--muted)}
footer{max-width:720px;margin:0 auto;padding:0 16px 40px}
.btn{display:block;text-align:center;text-decoration:none;border-radius:10px;padding:16px;background:var(--ink);color:#f4ead8;font-weight:600}
footer p{color:var(--muted);font-size:13px;margin-top:16px}
/* Главная: что дальше. Это единственное решение, которое человек
   принимает на входе, поэтому карточка тёмная и стоит одна, а не в ряду
   разделов. */
.go{display:block;padding:16px;border:1px solid var(--ink);border-radius:10px;
  background:var(--ink);color:#f4ead8;text-decoration:none;margin:0 0 8px}
.go b{display:block;font-size:18px;margin-bottom:2px}
.go span{color:#cbb894;font-size:15px}
/* Плашка билета несёт состояние: не начат, начат, пройден, пройден с
   ошибками. Место под подпись держим всегда, иначе сетка прыгает, когда
   скрипт её заполнит. */
.tile b{display:block;font-weight:600}
.tile i{display:block;font-style:normal;font-size:13px;color:var(--muted);margin-top:3px;min-height:15px}
.tile.ok{border-color:var(--ok);background:var(--ok-bg)}
.tile.ok i{color:var(--ok)}
.tile.no{border-color:var(--no);background:var(--no-bg)}
.tile.no i{color:var(--no)}
.tile.part{border-color:var(--muted)}
/* Работа над ошибками. Карточка приезжает с чужой страницы, но показывается
   по тем же правилам, что и в билете. */
.errdeck .q{display:none;border-bottom:0;padding-top:0}
.errdeck .q.active{display:block}
.errcount{color:var(--muted);margin:0 0 16px}
.errcount b{color:var(--ink);font-weight:700;font-size:20px}
.q.fixed .qh::after{content:" · исправлено";color:var(--ok)}
.errdone h2{margin-top:0}
/* Браузер рисует выделение, фокус и каретку своим синим, который к
   бумаге отношения не имеет. Берём их в палитру. */
::selection{background:#d9c9a6;color:var(--ink)}
:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
html{caret-color:var(--ink)}
/* Человек мог попросить систему не анимировать: такое ставят при
   вестибулярных нарушениях. Плавную прокрутку тогда не делаем. */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *{transition-duration:.01ms!important;animation-duration:.01ms!important}
}
