/* ===========================================================
   Гвардия — дизайн-система (полевой микс v3+v2)
   Подключается поверх Bootstrap 5. Палитра и типографика зафиксированы
   по утверждённому макету mockups/final.
   =========================================================== */
:root{
  --side:#232a1f; --side2:#2c3527; --side-ink:#cfd8bd; --side-mut:#8a9578;
  --paper:#f7f6f2; --card:#ffffff; --line:#e2dfd6;
  --ink:#23281e; --mut:#77716a;
  --acc:#6b8f3d; --acc-dark:#516d2e; --acc-soft:#eef3e3;
  --red:#c8442c; --mark:#f4e9c8;
  --spec:#b0489b; --spec-soft:#f7ecf5;
  --bs-body-bg:var(--paper); --bs-body-color:var(--ink);
}
@font-face{font-family:'Tektur';src:local('Tektur')}
body{margin:0;background:var(--paper);color:var(--ink);
  font-family:'Manrope',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px}
.ff-disp{font-family:'Tektur','Manrope',sans-serif}
.mono{font-family:'JetBrains Mono','Cascadia Code',ui-monospace,monospace}
a{color:var(--acc-dark)}

/* ── оболочка: сайдбар + рабочая зона ── */
.shell{display:flex;min-height:100vh}
.side{width:206px;flex:0 0 206px;background:var(--side);color:var(--side-ink);
  padding:1rem .9rem;display:flex;flex-direction:column;gap:.15rem;
  /* панель не зависит от высоты данных: липкая, во весь экран, со своим скроллом */
  position:sticky;top:0;align-self:flex-start;height:100vh;overflow-y:auto;
  /* меню и его выпадашки — поверх контента (плитки дат, липкий заголовок таблицы) */
  z-index:40}
.side-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:.8rem}
.side .logo{font-family:'Tektur';font-weight:700;font-size:1.25rem;color:#fff;
  letter-spacing:.06em;text-decoration:none}
.side .logo em{font-style:normal;color:var(--acc)}
.side-collapse{background:none;border:none;color:var(--side-mut);cursor:pointer;padding:.25rem;
  border-radius:6px;display:flex;transition:transform .15s}
.side-collapse:hover{color:#fff;background:var(--side2)}
.side .ic{flex:0 0 18px}
.side a.nav{display:flex;align-items:center;gap:.55rem;color:var(--side-mut);text-decoration:none;
  padding:.5rem .6rem;border-radius:7px;font-weight:600}
.side a.nav.on{background:var(--side2);color:#fff}
.side a.nav:hover{color:#fff;background:var(--side2)}
.side .nav-top{margin-bottom:.2rem}
/* сворачиваемые группы меню */
.side .navgroup{margin-top:.2rem}
.side .grp{display:flex;align-items:center;gap:.2rem}
.side .grp-main{display:flex;align-items:center;gap:.55rem;flex:1;min-width:0;text-decoration:none;
  color:var(--side-mut);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;
  padding:.5rem .5rem;border-radius:7px}
.side .grp-main .lbl{flex:1}
.side .grp-main:hover{color:#fff;background:var(--side2)}
.side .navgroup.active .grp-main{color:var(--side-ink)}
.side .grp-toggle{background:none;border:none;color:var(--side-mut);cursor:pointer;padding:.35rem;border-radius:6px;font-family:inherit}
.side .grp-toggle:hover{color:#fff;background:var(--side2)}
.side .caret{transition:transform .15s;font-size:.8rem;display:inline-block}
.side .navgroup.open .caret{transform:rotate(90deg)}
.side .grp-items{display:none;flex-direction:column;gap:.15rem;padding-left:1.9rem}
.side .navgroup.open .grp-items{display:flex}
.side .sp{flex:1;min-height:.5rem}
.side .who{border-top:1px solid #3a4531;padding-top:.8rem;font-size:.82rem;color:var(--side-mut)}
.side .who b{color:var(--side-ink)}
.side .who a{color:var(--acc)}
.side .who-ic{display:none;color:var(--side-mut)}
.side .who-ic:hover{color:#fff}

/* ── свёрнутый режим: только иконки + всплывающие подменю ── */
@media (min-width:881px){
  html.side-collapsed .side{width:60px;flex-basis:60px;padding:1rem .5rem;overflow:visible} /* overflow:visible — чтобы всплывающие подменю не обрезались */
  html.side-collapsed .side .logo,
  html.side-collapsed .side .lbl,
  html.side-collapsed .side .caret,
  html.side-collapsed .side .who-full{display:none}
  html.side-collapsed .side-top{justify-content:center}
  html.side-collapsed .side-collapse{transform:rotate(180deg)}
  html.side-collapsed .side a.nav,
  html.side-collapsed .side .grp-main{justify-content:center;padding:.55rem}
  html.side-collapsed .side .grp-toggle{display:none}
  html.side-collapsed .side .grp{gap:0}
  html.side-collapsed .side .who{display:flex;justify-content:center;border-top:1px solid #3a4531}
  html.side-collapsed .side .who-ic{display:flex}
  /* всплывающее подменю группы при наведении */
  html.side-collapsed .side .navgroup{position:relative}
  html.side-collapsed .side .grp-items{display:none!important;position:absolute;left:100%;top:0;
    min-width:190px;background:var(--side2);border-radius:0 10px 10px 0;padding:.4rem;
    box-shadow:6px 6px 24px #0006;z-index:30;padding-left:.4rem}
  html.side-collapsed .side .navgroup:hover .grp-items{display:flex!important}
  html.side-collapsed .side .grp-items .nav{justify-content:flex-start;white-space:nowrap}
  html.side-collapsed .side .grp-items::before{content:"";position:absolute;left:-6px;top:0;width:6px;height:100%} /* мост для наведения */
}
.work{flex:1;min-width:0;padding:1rem 1.2rem 2rem}

/* ── панель дат: слайдер + шкала заполнения ── */
.datebar{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem;flex-wrap:wrap}
.datebar .title{font-family:'Tektur','Manrope',sans-serif;font-weight:500;font-size:1rem;color:var(--acc-dark);letter-spacing:.04em;min-width:120px}
.pad{background:var(--card);border:1px solid var(--line);border-radius:7px;width:34px;height:34px;
  font-family:'Tektur';font-size:1rem;color:var(--acc-dark);cursor:pointer}
.pad:hover{border-color:var(--acc);background:var(--acc-soft)}
.rng{display:flex;align-items:center;gap:.35rem;color:var(--mut)}
.rng input[type=date]{border:1px solid var(--line);border-radius:7px;padding:.3rem .45rem;
  font-family:'JetBrains Mono';font-size:.8rem;background:var(--card);color:var(--ink)}
.btn-today{background:none;border:none;color:var(--acc-dark);font-weight:800;cursor:pointer;text-decoration:underline}
.days{display:flex;gap:7px;overflow-x:auto;padding:4px 0 10px 4px;scroll-behavior:smooth;scrollbar-width:thin}
.day{flex:0 0 68px;box-sizing:border-box;position:relative;text-align:center;background:var(--card);border:1px solid var(--line);
  border-radius:8px;padding:.4rem 0 .5rem;cursor:pointer;overflow:hidden;text-decoration:none;color:var(--ink)}
.day:hover{border-color:var(--acc)}
.day .dw{font-size:.66rem;color:var(--mut);text-transform:uppercase;letter-spacing:.12em}
.day .dd{font-family:'Tektur';font-size:1.15rem;line-height:1.3}
.day .dm{font-size:.68rem;color:var(--mut);font-weight:600}
.day .dc{font-family:'JetBrains Mono';font-size:.78rem;color:var(--acc-dark);font-weight:700}
.day .fill{position:absolute;left:0;right:0;bottom:0;height:0;background:var(--acc-soft);
  border-top:2px solid var(--acc);z-index:0;transition:height .15s}
.day>span{position:relative;z-index:1;display:block}
/* выделение — через outline (не box-shadow), чтобы оно сосуществовало с жирными
   рамками closed/hascm и не перебивалось ими */
.day.sel{border-color:var(--acc-dark);outline:2px solid var(--acc-dark);outline-offset:1px}
.day.sel .fill{background:#d9e6c3}
.day.we .dd{color:var(--red)}
/* комментарий — жёлтая, закрыт — красная. Настоящая жирная рамка (2px, поверх
   заливки количества заказов — inset-тень пряталась под .fill; box-sizing:border-box
   не даёт сдвига). Закрытый день НЕ затемняем. closed после hascm → у закрытого с
   комментарием побеждает красная */
.day.hascm{border:2px solid #e6a700}
.day.closed{border:2px solid var(--red)} .day.closed .dc{color:var(--red)}
.day.past{opacity:.5} /* прошедшие даты приглушены — доступен только просмотр */
.day.past.sel{opacity:.8}
.day.today .dw{color:var(--acc-dark);font-weight:800}

/* ── штамп дня + переключатель вида ── */
.stamp{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;border:2px solid var(--ink);
  border-radius:10px;background:var(--card);padding:.65rem 1rem;margin-bottom:.8rem}

/* ── страница-список: шапка (даты/фильтр/сводка) закреплена, прокручивается только таблица ── */
.listwrap{display:flex;flex-direction:column}
.listhead{flex:0 0 auto}
.listbody{flex:1 1 auto}
.listfoot{flex:0 0 auto;padding-top:.5rem}
@media (min-width:881px){
  /* на списковых страницах рабочая зона фиксируется во весь экран и сама не
     прокручивается — скроллится только тело таблицы (.listbody). Всё это
     ограничено body.page-list, чтобы обычные страницы (формы, отчёты)
     по-прежнему прокручивались целиком. */
  body.page-list{overflow:hidden}
  body.page-list .work{height:100vh;overflow:hidden;display:flex;flex-direction:column;padding-bottom:.4rem}
  body.page-list .listwrap{flex:1 1 auto;min-height:0}
  body.page-list .listbody{min-height:0;overflow:auto;border:1px solid var(--line);border-radius:9px;background:var(--card)}
  body.page-list .listbody .sheet{border:none;overflow:visible;background:none;border-radius:0}
  body.page-list .footer{flex:0 0 auto;margin-top:.4rem}
  .listhead .stamp{margin-bottom:.6rem}
}
.stamp h1{font-family:'Tektur';font-size:1.25rem;margin:0;letter-spacing:.03em}
.stamp .sub{font-family:'JetBrains Mono';color:var(--mut)} .stamp .sub b{color:var(--acc-dark)}
.note{background:var(--mark);border-left:4px solid #d8b74a;padding:.3rem .6rem;border-radius:4px;font-weight:600;cursor:pointer}
.btn-a{background:var(--acc);color:#fff;border:none;border-radius:7px;padding:.5rem 1rem;font-weight:800}
.btn-a:hover{background:var(--acc-dark);color:#fff}
.btn-o{background:var(--card);border:1px solid var(--line);color:var(--ink);border-radius:7px;padding:.5rem 1rem;text-decoration:none;display:inline-block}
.btn-o:hover{border-color:var(--acc);color:var(--ink)}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--paper)}
.seg button{border:none;background:none;padding:.42rem .85rem;font-weight:700;color:var(--mut);cursor:pointer;font-family:'Tektur';letter-spacing:.03em}
.seg button.on{background:var(--side);color:#fff}

/* ── таблица заказов ── */
.sheet{background:var(--card);border:1px solid var(--line);border-radius:9px;overflow:auto}
table.z{width:100%;border-collapse:collapse;min-width:1080px;margin:0}
.z th{font-family:'Tektur';font-weight:500;font-size:.63rem;text-transform:uppercase;letter-spacing:.04em;
  color:var(--mut);text-align:left;padding:.45rem .5rem;border-bottom:2px solid var(--ink);
  white-space:nowrap;background:var(--paper);position:sticky;top:0;z-index:2}
.z td{padding:.38rem .5rem;border-bottom:1px solid var(--line);vertical-align:top;font-size:.85rem}
.z td.ico{text-align:center;font-size:1rem;white-space:nowrap} /* колонки-эмодзи (опов./тип карты) */
.z tbody tr{cursor:pointer}
.z tbody tr:hover td{background:var(--acc-soft)}
.z .n{color:var(--mut);font-family:'JetBrains Mono';text-align:right;width:2.2rem}
.z .tim{font-family:'JetBrains Mono';font-weight:700;font-size:.9rem;white-space:nowrap;
  border-left:4px solid var(--acc);background:var(--paper)}
.z .num{font-family:'JetBrains Mono';text-align:right}
.z .ph{font-family:'JetBrains Mono';white-space:nowrap}
.z .cli{font-weight:800;white-space:nowrap}
.z .place{font-family:'Tektur' !Important;font-weight:401;font-size:.78rem;color:var(--acc-dark);white-space:nowrap;max-width:220px;overflow:hidden;text-overflow:ellipsis}
.z .who{color:var(--mut);white-space:nowrap;font-size:.85rem}
.z .em{color:var(--mut);font-family:'JetBrains Mono';font-size:.82rem}
.z .ref{color:var(--ink);font-weight:600} /* судьи — основная информация, не приглушать */
/* Ширину не резервируем: колонка растёт по содержимому, но и лишнего не забирает.
   width:1% в авто-раскладке = «сожмись по содержимому» — иначе браузер раздавал этой
   колонке свободное место таблицы, и справа от состава судей висел зазор.
   max-width на внутреннем блоке ограничивает длинный состав (дальше — обрезка в 2 строки). */
/* width:1% — «сожмись по содержимому», чтобы колонка не забирала свободное место
   таблицы (иначе между судьями и «доп.прим.» зиял пустой кусок). min-width обязателен:
   состав судей переносится по словам, и без него колонка схлопывалась до самого
   длинного слова, а текст вставал столбиком. */
.z th.col-ref,.z td.ref{width:1%;min-width:10rem}
.z td.ref .rf{max-width:22rem}   /* состав судей не обрезаем; очень длинный — переносом */
/* единый шрифт по всем колонкам таблицы заказов (иерархия — весом и цветом,
   не гарнитурой). Перебивает поколоночные font-family выше по специфичности id. */
#tableView .z td{font-family:inherit}
.clip{max-width:190px;color:var(--ink)}
.clip>span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Строка уже растянута соседней ячейкой (например составом судей в две строки) —
   значит и длинный текст можно резать по ДВУМ строкам, а не по одной: место есть.
   Число строк ставит клиент в --lines по фактической высоте строки таблицы. */
.clip.clip-multi>span{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;
  -webkit-line-clamp:var(--lines,2);overflow:hidden;text-overflow:ellipsis;overflow-wrap:anywhere}
/* Метка обрезки одна — многоточие, которое рисует сам браузер. Стрелка ⤢ рядом с
   многоточием читалась как второй, противоречивый признак. */
.clip.has{cursor:zoom-in}
.clip.empty{color:var(--line)}
.z tfoot td{font-family:'JetBrains Mono';background:var(--paper);border-top:2px solid var(--ink);padding:.6rem .6rem}
.z tfoot b{color:var(--acc-dark)}
tr.spec td.tim{border-left-color:var(--spec)}
tr.spec:hover td{background:var(--spec-soft)}
.mark-spec{color:var(--spec);font-size:1.05rem;cursor:help}
.has-card{cursor:pointer;margin-left:.3rem;font-size:.95rem;text-decoration:none} /* 💳 у клиента с бонусной картой */
tr.deleted{opacity:.5;text-decoration:line-through}
/* удалённые заказы скрыты, пока не включён «глаз» */
.z tbody tr.deleted{display:none}
body.show-deleted .z tbody tr.deleted{display:table-row}
/* пиктограмма-глаз рядом с переключателем вида */
.eye-btn{border:1px solid var(--line);background:var(--paper);border-radius:8px;
  width:38px;height:34px;cursor:pointer;color:var(--mut);display:inline-flex;align-items:center;justify-content:center;position:relative}
.eye-btn:hover{color:var(--ink);border-color:var(--acc)}
.eye-btn.disabled{opacity:.3;pointer-events:none}
.eye-btn .ico-on{display:none} .eye-btn .ico-off{display:inline}
body.show-deleted .eye-btn{color:var(--acc-dark);border-color:var(--acc)}
body.show-deleted .eye-btn .ico-on{display:inline} body.show-deleted .eye-btn .ico-off{display:none}
.eye-btn .cnt{position:absolute;top:-6px;right:-6px;background:var(--red);color:#fff;
  font-size:.62rem;font-weight:700;border-radius:8px;padding:0 .3rem;line-height:1.4}

/* ── карточный вид (компактный — цель: ~8 карточек на экран) ── */
.log{display:flex;flex-direction:column;gap:5px}
.log.hide{display:none}
.orow{display:grid;grid-template-columns:82px 104px 1fr 1.4fr 200px auto;background:var(--card);
  border:1px solid var(--line);border-radius:8px;overflow:hidden;cursor:pointer;text-decoration:none;color:var(--ink);line-height:1.25}
#cardView{container-type:inline-size;container-name:cards}
.orow:hover{border-color:var(--acc);box-shadow:0 1px 6px #0001}
.orow.spec{border-left:4px solid var(--spec)}
/* удалённые заказы в карточном виде — скрыты, пока не включён «глаз» */
.orow.deleted{opacity:.5;text-decoration:line-through;display:none}
body.show-deleted .orow.deleted{display:grid}
/* компактность даёт уплотнение отступов/интерлиньяжа, а НЕ уменьшение шрифта —
   размеры шрифта как в исходной версии (иначе «начало игры» почти не читается) */
.cell{padding:.32rem .6rem;min-width:0}
.c-tim{background:var(--side);color:#fff;font-weight:700;font-size:1rem;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:.1rem}
.c-tim small{color:var(--side-mut);font-size:.66rem;font-weight:600}
.c-pl{display:flex;flex-direction:column;justify-content:center;border-right:1px dashed var(--line)}
.c-pl .pl{color:var(--acc-dark);font-family: Tektur} .c-pl .kol{font-size:.8rem;color:var(--ink)} /* чел. — обычный текст, не серый */
.c-cli .nm{font-weight:800}
.c-cli .ph{color:var(--mut);font-size:.85rem}
.c-cli .em{color:var(--mut);font-size:.8rem}
.c-cli .razm2{color:var(--acc-dark);font-size:.8rem;font-weight:600;margin-top:.1rem}
.c-cli .razm2 b{font-weight:600;color:var(--mut);font-size:.72rem;letter-spacing:.04em;margin-right:.3rem}
.c-det{font-size:.86rem;border-left:1px dashed var(--line)}
.c-det div{margin-bottom:.05rem}
.c-det b{font-weight:600;color:var(--mut);font-size:.72rem;letter-spacing:.04em;margin-right:.3rem} /* метки строчными (без uppercase) */
.c-det .hidden-note b{color:var(--spec)}
.c-who{font-size:.8rem;color:var(--mut);border-left:1px dashed var(--line);display:flex;flex-direction:column;justify-content:center;gap:.05rem}
.c-who .ref-line{color:var(--ink)} /* судьи — обычный текст (не жирный), но полноцветный */
/* единый шрифт в карточном виде заказа */
.orow .c-tim, .orow .c-pl .kol, .orow .c-cli .ph{font-family:inherit}
.sum{font-family:'JetBrains Mono';color:var(--mut);padding:.7rem .2rem}
.sum b{color:var(--acc-dark);font-size:1.05rem}
.legend{font-size:.8rem;color:var(--mut);margin:.6rem .1rem 0;display:flex;gap:1.2rem;flex-wrap:wrap}
.legend i{font-style:normal;display:inline-flex;align-items:center;gap:.35rem}
.dot{width:10px;height:10px;border-radius:2px;display:inline-block}

/* ── модальное окно (формы заказа/бонусов) ──
   Габариты уменьшены пропорционально: окно гарантированно помещается по высоте
   на экране 1920×1080 без прокрутки оверлея. Само окно — flex-колонка с
   ограничением по высоте; прокручивается только область полей (#modal-body),
   а панель действий (.form-actions) закреплена снизу — «Сохранить» всегда виден. */
.modal-ov{position:fixed;inset:0;background:#1a1e17cc;z-index:1080;display:flex;
  align-items:flex-start;justify-content:center;padding:2vh 1rem;overflow:auto}
.modal-ov[hidden]{display:none}
.modal-box{position:relative;background:var(--paper);border-radius:12px;box-shadow:0 20px 60px #0006;
  width:min(840px,95vw);max-height:96vh;display:flex;flex-direction:column;
  overflow:hidden;animation:modalin .14s ease}
@keyframes modalin{from{transform:translateY(-10px);opacity:.6}to{transform:none;opacity:1}}
.modal-x{position:absolute;top:.7rem;right:.7rem;width:30px;height:30px;border:none;border-radius:7px;
  background:var(--line);color:var(--ink);cursor:pointer;font-size:1rem;z-index:3}
.modal-x:hover{background:var(--red);color:#fff}
#modal-body{overflow-y:auto;overflow-x:hidden;min-height:0;padding:1rem 1.3rem}
/* заголовок-штамп в модалке не заезжает под кнопку «✕»: справа оставлен зазор */
.modal-box .stamp{margin-top:.1rem;margin-bottom:.7rem;margin-right:2.2rem;padding:.5rem .85rem}
.modal-box .stamp h1{font-size:1.05rem}
.modal-busy{padding:2rem;text-align:center;color:var(--mut)}
/* компактная сетка полей внутри модалки */
.modal-box form{max-width:none!important}
.modal-box .fld{gap:.15rem}
.modal-box .fld>span{font-size:.66rem}
.modal-box .fld input,.modal-box .fld select,.modal-box .fld textarea{padding:.35rem .5rem;font-size:.88rem}
/* закреплённая панель действий формы (Сохранить/Отмена) */
.modal-box .form-actions{position:sticky;bottom:0;background:var(--paper);
  padding:.6rem 0 .2rem;margin-top:.7rem;border-top:1px solid var(--line);z-index:2}
/* на телефоне модалка — во весь экран, чтобы гарантированно помещалась; сетка
   полей в одну колонку */
@media (max-width:880px){
  .modal-ov{padding:0}
  .modal-box{width:100vw;max-width:100vw;max-height:100dvh;height:100dvh;border-radius:0}
  #modal-body{padding:.8rem 1rem}
  /* потомок, а не прямой ребёнок: сетка заказа обёрнута в <fieldset> (блокировка
     прошлых дат), поэтому form>div её не доставал и окно не сжималось в 1 колонку */
  .modal-box form div[style*="grid-template-columns:1fr 1fr"]{grid-template-columns:1fr!important}
}

/* ── всплывающий полный текст ── */
/* overflow-wrap: длинное слово без пробелов (вставленный текст) иначе не переносится
   и уезжает за коробку подсказки — виден только кусок. max-height: очень длинный
   текст листаем внутри подсказки, а не растягиваем её на весь экран. */
/* всплывающее оповещение об изменениях в открытом дне */
.zk-toast{position:fixed;right:1rem;bottom:1rem;z-index:1200;max-width:320px;display:flex;gap:.5rem;
  align-items:baseline;background:var(--side);color:#fff;border-radius:10px;padding:.7rem .9rem;
  box-shadow:0 10px 34px #0005;font-size:.9rem;animation:zk-toast-in .18s ease-out}
.zk-toast b{font-family:'Tektur';font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--acc);white-space:nowrap}
.zk-toast span{flex:1;min-width:0;overflow-wrap:anywhere}
.zk-toast button{border:none;background:none;color:#fff9;cursor:pointer;font-size:.9rem;line-height:1;padding:0}
.zk-toast button:hover{color:#fff}
.zk-toast.out{opacity:0;transition:opacity .6s}
@keyframes zk-toast-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.pop{position:fixed;z-index:1090;max-width:340px;background:var(--side);color:#fff;border-radius:9px;
  padding:.7rem .85rem;box-shadow:0 8px 30px #0004;font-size:.9rem;line-height:1.4;display:none;
  overflow-wrap:anywhere;max-height:60vh;overflow-y:auto}
.pop.pinned{box-shadow:0 8px 30px #0006,0 0 0 2px var(--acc);cursor:default}
.pop.pinned::before{content:"закреплено · клик в стороне закроет";display:block;font-size:.62rem;
  color:var(--side-mut);margin-bottom:.35rem;letter-spacing:.02em}
.pop b{display:block;font-family:'Tektur';font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--acc);margin-bottom:.3rem}
.pop::after{content:"";position:absolute;top:-7px;left:20px;border:7px solid transparent;border-top:0;border-bottom-color:var(--side)}

/* ── форма входа ── */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--side)}
.login-card{background:var(--card);border-radius:14px;padding:2rem 2.2rem;width:min(360px,92vw);box-shadow:0 20px 60px #0005}
.login-card .logo{font-family:'Tektur';font-weight:700;font-size:1.8rem;text-align:center;color:var(--ink);letter-spacing:.05em;margin-bottom:1.2rem}
.login-card .logo em{font-style:normal;color:var(--acc)}
.login-card label{font-size:.78rem;text-transform:uppercase;letter-spacing:.06em;color:var(--mut);font-weight:700}
.login-card input{width:100%;border:1px solid var(--line);border-radius:8px;padding:.55rem .7rem;margin:.25rem 0 .9rem;font-size:1rem}
.login-card input:focus{outline:2px solid var(--acc);border-color:var(--acc)}
.login-card .alarm{color:var(--mut);text-align:center;font-size:.82rem;margin-top:.6rem}

/* ── автоподсказка клиента в форме заказа (#10) ── */
.ac-box{position:fixed;z-index:1200;background:var(--card);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 8px 30px #0003;max-height:260px;overflow:auto;max-width:380px}
.ac-box[hidden]{display:none}
.ac-item{display:flex;align-items:center;gap:.5rem;padding:.4rem .6rem;cursor:pointer;white-space:nowrap}
.ac-item:hover{background:var(--acc-soft)}
.ac-card{width:1.2rem;text-align:center;flex:0 0 1.2rem}
.ac-nm{font-weight:700}
.ac-ph{color:var(--mut);font-size:.85rem}

/* ── компактные поля фильтра (список карт и т.п.) ── */
.ff{display:flex;flex-direction:column;gap:.15rem}
.ff>span{font-size:.68rem;text-transform:uppercase;letter-spacing:.05em;color:var(--mut);font-weight:700}
.ff input,.ff select{border:1px solid var(--line);border-radius:7px;padding:.4rem .5rem;font-family:inherit}
.chk{display:flex;align-items:center;gap:.4rem;cursor:pointer}

/* ── общий низ страницы ── */
.footer{margin-top:1.4rem;padding-top:.8rem;border-top:1px solid var(--line);color:var(--mut);font-size:.82rem}

/* ── мобильная верхняя панель + выезжающий сайдбар (по умолчанию скрыты) ── */
.mtop{display:none}
.side-backdrop{display:none}

@media (max-width:880px){
  .shell{flex-direction:column}
  /* верхняя панель с гамбургером */
  .mtop{display:flex;align-items:center;gap:.7rem;position:sticky;top:0;z-index:50;
    background:var(--side);color:#fff;padding:.5rem .8rem}
  .mtop-burger{background:none;border:none;color:#fff;cursor:pointer;padding:.25rem;display:flex;border-radius:6px}
  .mtop-burger:hover{background:var(--side2)}
  .mtop .logo{font-family:'Tektur';font-weight:700;color:#fff;text-decoration:none;font-size:1.1rem;letter-spacing:.06em}
  .mtop .logo em{font-style:normal;color:var(--acc)}
  /* сайдбар превращается в выезжающую панель (как на десктопе, но off-canvas) */
  .side{position:fixed;top:0;left:0;height:100vh;width:min(260px,82vw);flex:none;
    transform:translateX(-100%);transition:transform .2s ease;z-index:60;overflow-y:auto}
  body.side-open .side{transform:none}
  .side-collapse{display:none} /* сворачивание в рейку — только для десктопа */
  .side-backdrop{display:block;position:fixed;inset:0;background:#0007;z-index:55;
    opacity:0;pointer-events:none;transition:opacity .2s}
  body.side-open .side-backdrop{opacity:1;pointer-events:auto}
  body.side-open{overflow:hidden} /* фон не скроллится, пока открыта панель */
  /* заказы: карточный вид вместо таблицы на узком экране (таблица заказов
     помечена .view-table-only; таблицу списка карт .sheet не трогаем — у неё
     своего карточного вида нет, прячем только оформление заказов) */
  .seg,.view-table-only{display:none!important}
  .log.hide{display:flex!important}
  .orow{grid-template-columns:76px 1fr}
  .c-pl{border-right:none} .c-det,.c-who{border-left:none;border-top:1px dashed var(--line);grid-column:1/-1}
  .c-tim{grid-row:1/3}
}
:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
@media (prefers-reduced-motion:reduce){*{transition:none!important}.days{scroll-behavior:auto}}

@media print{
  .side,.datebar,.seg,.stamp .btn-a,.stamp .btn-o,.legend,.footer{display:none!important}
  .work{padding:0} .sheet{overflow:visible;border:none} table.z{min-width:0}
  .z th{position:static}
}

/* ── статусы заказа: инлайн-контролы дня (бронь-переключатель + список статуса) ── */
.col-st{white-space:nowrap}
.br-tog{display:inline-flex;align-items:center;gap:.4rem;cursor:pointer;background:none;border:none;padding:0;font:inherit;--c:var(--mut)}
.br-tog .br-tk{width:2.1rem;height:1.15rem;border-radius:999px;background:var(--c);position:relative;transition:background .15s;flex:none}
.br-tog .br-kn{position:absolute;top:.13rem;left:.13rem;width:.9rem;height:.9rem;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px rgba(0,0,0,.3)}
.br-tog[aria-checked="true"] .br-kn{left:1.07rem}
.br-tog .br-bl{font-family:'Tektur','Manrope',sans-serif;font-weight:600;font-size:.66rem;letter-spacing:.02em;color:var(--c);position:relative;display:inline-block}
/* размерник резервирует ширину под самое длинное имя брони — переключение не «пляшет» */
.br-tog .br-cur{position:absolute;left:0;top:0;white-space:nowrap}
.br-tog .br-siz{visibility:hidden;white-space:nowrap}
.br-tog.busy{opacity:.5;pointer-events:none}
.br-tog:focus-visible{outline:2px solid var(--acc);outline-offset:2px;border-radius:999px}
.br-pill{display:inline-flex;align-items:center;font-family:'Tektur','Manrope',sans-serif;font-weight:600;font-size:.66rem;letter-spacing:.02em;--c:var(--mut);color:var(--c);background:color-mix(in srgb,var(--c) 13%,transparent);border:1px solid color-mix(in srgb,var(--c) 35%,transparent);border-radius:999px;padding:.14rem .55rem}
.day-sel{font-family:'Tektur','Manrope',sans-serif;font-weight:600;font-size:.66rem;letter-spacing:.02em;--c:var(--mut);color:var(--c);background-color:color-mix(in srgb,var(--c) 12%,var(--card));border:1px solid color-mix(in srgb,var(--c) 38%,transparent);border-radius:999px;padding:.2rem 1.4rem .2rem .55rem;cursor:pointer;appearance:none;background-repeat:no-repeat;background-position:right .5rem center;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='6'%3E%3Cpath d='M1 1l3.5 3.5L8 1' fill='none' stroke='%239593a0' stroke-width='1.4'/%3E%3C/svg%3E")}
.day-sel:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.day-sel:disabled{opacity:.55;cursor:default}
.day-sel option{color:var(--ink);background:var(--card);font-weight:600}
.st-saved{animation:stSaved .9s ease}
@keyframes stSaved{0%{box-shadow:0 0 0 2px #2c9457}100%{box-shadow:0 0 0 2px transparent}}
.c-st{display:flex;align-items:center;gap:.7rem;flex-wrap:wrap;margin-top:.35rem;padding-top:.45rem;border-top:1px dashed var(--line)}

/* правки после живого теста: карточка — статус во всю ширину (грид-футер); таблица — фикс. ширина колонки статуса, без «танца» при смене */
.c-st{grid-column:1/-1;margin-top:0;padding:.5rem .7rem;border-top:1px solid var(--line)}
th.col-st,td.col-st{width:7.6rem}
td.ctl-day .day-sel{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* таблица: бронь и статус — фиксированная ширина контрола (== размеру селектора), без «танца» */
th.col-st,td.col-st{width:6.6rem}
td.ctl-br .br-tog{width:6.4rem}
td.ctl-br .br-bl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
td.ctl-day .day-sel{width:6.4rem}

/* таблица: бронь — только переключатель без подписи, прижат вправо */
td.ctl-br{text-align:right}
td.ctl-br .br-bl{display:none}
td.ctl-br .br-tog{width:auto;margin-left:auto;gap:0}

/* статусы — последние колонки справа: ширина по содержимому (без пустот), бронь — слайдер по центру */
th.col-st,td.col-st{width:1%;white-space:nowrap;text-align:center}
td.ctl-br .br-tog{width:auto;margin:0;gap:0}
td.ctl-br .br-bl{display:none}
td.ctl-day .day-sel{width:6.4rem}

/* карточка: статусы — в правой колонке (под принял/ред/судья), а не футером снизу слева */
.c-st{grid-column:auto;margin-top:.5rem;padding:.45rem 0 0;border-top:1px dashed var(--line);gap:.45rem}

/* карточка: статусы — в блоке размещения/«чел» (c-pl), компактно в столбик */
.c-st{grid-column:auto;flex-direction:column;align-items:flex-start;gap:.3rem;margin-top:.4rem;padding:.4rem 0 0;border-top:1px dashed var(--line)}
.c-st .br-bl{display:none}
.c-st .day-sel{max-width:100%}

/* карточка: отдельный правый блок статусов (переключатель брони + статус дня) */
.c-stat{border-left:1px dashed var(--line);display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:.45rem;padding:.2rem .75rem;min-width:0}
.c-stat .br-tog{gap:.4rem}
.c-cli .nm,.c-cli .ph{overflow-wrap:anywhere}

/* ТОЛЬКО ДЕСКТОП: если контента мало (сайдбар съел ширину) — складываем карточку раньше,
   по ШИРИНЕ КОНТЕЙНЕРА, а не окна. Мобильную вёрстку (<=880px) это не трогает — она ниже,
   в @media, и осталась прежней. */
@media (min-width:881px){
@container cards (max-width:1000px){
  .orow{grid-template-columns:76px 1fr auto}
  .c-tim{grid-column:1;grid-row:1/-1}                                  /* время слева, во всю высоту */
  .c-cli{grid-column:2;grid-row:1}                                     /* клиент — первым */
  .c-pl{grid-column:2;grid-row:2;border-right:none;border-top:1px dashed var(--line);flex-direction:row;gap:.6rem;align-items:baseline}
  .c-det{grid-column:2;grid-row:3;border-left:none;border-top:1px dashed var(--line)}
  /* принял/ред/судья — служебные данные: в узкой карточке компактной строкой (мельче, в ряд) */
  .c-who{grid-column:2;grid-row:4;border-left:none;border-top:1px dashed var(--line);flex-direction:row;flex-wrap:wrap;gap:.02rem .7rem;font-size:.72rem}
  .c-stat{grid-column:3;grid-row:1/-1;flex-direction:column;justify-content:center;align-items:flex-start;gap:.5rem}
  .c-stat .br-bl{display:none}                                         /* бронь — только переключатель, статус в title */
}
}

/* «Лог изменений» — визуализация дельты между слепками состояния */
.lg-tbl td.lg-cell{padding:.5rem .6rem;vertical-align:top}
.lg-badge{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:.64rem;text-transform:uppercase;letter-spacing:.05em;
  padding:.1rem .45rem;border-radius:999px;border:1px solid var(--line);white-space:nowrap}
.lg-badge.chg{color:var(--acc-dark);border-color:var(--acc);background:var(--acc-soft)}
.lg-badge.base{color:#2c9457;border-color:#2c9457;background:#2c945714}
.lg-badge.ev{color:var(--mut)}
.lg-badge.nochg{color:var(--mut);border-style:dashed}
.lg-event{margin-left:.4rem;color:var(--ink)}
.lg-diff{list-style:none;margin:.4rem 0 0;padding:0;display:flex;flex-direction:column;gap:.2rem}
.lg-diff li{display:flex;flex-wrap:wrap;align-items:baseline;gap:.35rem;line-height:1.35}
.lg-k{font-family:'JetBrains Mono',monospace;font-size:.66rem;text-transform:uppercase;letter-spacing:.03em;color:var(--mut);min-width:8.5rem}
.lg-old{color:var(--red);text-decoration:line-through;text-decoration-color:#d6454577}
.lg-new{color:#2c9457;font-weight:600}
.lg-arr{color:var(--mut)}
.lg-empty{color:var(--mut);font-style:italic;text-decoration:none}
.lg-det{margin-top:.35rem}
.lg-det summary{cursor:pointer;font-family:'JetBrains Mono',monospace;font-size:.66rem;color:var(--mut)}
.lg-full{list-style:none;margin:.3rem 0 0;padding:.4rem .5rem;background:var(--paper);border-radius:7px;display:flex;flex-direction:column;gap:.15rem}
.lg-full li{display:flex;flex-wrap:wrap;gap:.35rem;line-height:1.3}
@media print{.lg-det summary{display:none}.lg-full{display:flex!important}}

/* ── судьи в списке заказов: текст + «+», без «дребезга» ──────────────────
   В ячейке только текст (главный первым, с короной) — ничего не появляется при
   наведении, поэтому строка не меняет высоту и цель не убегает из-под курсора. */
/* ширина по содержимому: «+» идёт сразу за текстом (никакой растяжки на всю ячейку) */
.rf{display:inline-flex;align-items:flex-start;gap:.25rem;min-width:0;max-width:100%}
.rf .rf-txt{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--ink)}                                  /* судьи — обычный текст, не приглушённый */
/* компактный (табличный) вид: перенос максимум на две строки, дальше — многоточие */
.rf .rf-clip{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.rf .rf-txt.has{cursor:pointer;border-bottom:1px dotted var(--line)}
.rf .rf-none{color:var(--mut)}
.rf-add{flex:none;border:1px dashed var(--line);background:var(--card);color:var(--acc-dark);border-radius:6px;
  width:1.3rem;height:1.3rem;cursor:pointer;font-size:.9rem;line-height:1;display:grid;place-items:center;padding:0}
.rf-add:hover{border-color:var(--acc);background:var(--acc-soft)}
/* выпадающий список: корона — ФИКСИРОВАННАЯ колонка (слот занят всегда),
   поэтому отметка/снятие судьи не меняет ширину строки */
.rf-pop{position:fixed;z-index:1100;background:var(--card);border:1px solid var(--line);border-radius:10px;
  box-shadow:0 8px 28px #0002;width:262px;padding:.5rem}
.rf-pop .rf-q{width:100%;border:1px solid var(--line);border-radius:7px;padding:.35rem .5rem;font:inherit;font-size:.82rem;margin-bottom:.35rem}
.rf-list{max-height:210px;overflow:auto}
.rf-item{display:grid;grid-template-columns:1.1rem 1fr 1.6rem;align-items:center;gap:.4rem;
  padding:.3rem .35rem;border-radius:6px;cursor:pointer;font-size:.85rem}
.rf-item:hover{background:var(--acc-soft)}
.rf-item.sel{background:#eef7f0}
.rf-tick{color:#2c9457;font-weight:700;text-align:center}
.rf-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rf-cr{text-align:center;line-height:1;visibility:hidden;opacity:.3;cursor:pointer}
.rf-item.sel .rf-cr{visibility:visible}
.rf-item.sel .rf-cr:hover{opacity:.75}
.rf-item.head .rf-cr{visibility:visible;opacity:1}
/* в карточках место есть — состав судей показываем ЦЕЛИКОМ, без обрезки и подсказки,
   и обычным текстом в потоке, чтобы он шёл сразу за меткой «судьи:» */
.rf .rf-full{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere}
.log .cell,.log .cell span{min-width:0;overflow-wrap:anywhere}
.c-who .rf{display:inline}
.c-who .rf .rf-txt{display:inline}
.c-who .rf .rf-add{display:inline-grid;vertical-align:middle;margin-left:.25rem}
.rf-foot{border-top:1px solid var(--line);margin-top:.35rem;padding-top:.35rem;font-size:.7rem;color:var(--mut)}
