/* ---------- Targeted purchases and receipts ---------- */
.primary-link,.secondary-link,.print-button{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:46px;padding:9px 15px;border-radius:12px;text-decoration:none;font-weight:750}.primary-link{background:var(--brand-dark);color:#fff}.secondary-link{border:1px solid var(--border);background:#fff;color:var(--ink)}.print-button{border:1px solid var(--border);background:#fff;color:var(--ink);cursor:pointer;font-family:inherit;font-size:inherit}.print-button:hover{background:var(--panel-hover)}
.expense-head{display:flex;align-items:end;justify-content:space-between;gap:18px;margin:6px 0 20px}.expense-head h1,.expense-form-shell h1,.expense-detail-head h1{margin:2px 0 5px;line-height:1.12}.expense-head p,.expense-form-shell header p,.expense-detail-head p{margin:0;color:var(--muted)}.expense-head-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}
.expense-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}.expense-summary article{padding:17px;border:1px solid var(--border);border-radius:16px;background:#fff}.expense-summary strong,.expense-summary span{display:block}.expense-summary strong{font:700 28px/1 var(--font-d)}.expense-summary span{margin-top:7px;color:var(--muted);font-size:12px}
/* Просмотр фотографии поверх страницы. Выход есть всегда: крестик, фон,
   клавиша Esc и жест «назад» — раньше снимок открывался голой картинкой в
   новой вкладке, из которой на телефоне выйти было нечем. */
.photo-viewer{position:fixed;inset:0;z-index:9998;display:flex;align-items:center;justify-content:center;
  padding:16px;background:rgba(20,23,28,.94)}
.photo-viewer[hidden]{display:none}
.photo-viewer img{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px}
.photo-viewer-close{position:absolute;top:calc(12px + env(safe-area-inset-top));right:12px;
  width:48px;height:48px;border:0;border-radius:50%;background:rgba(255,255,255,.16);color:#fff;
  font-size:30px;line-height:1;cursor:pointer}
.photo-viewer-close:hover{background:rgba(255,255,255,.28)}
body.is-viewing-photo{overflow:hidden}

.ticket-order{width:fit-content;margin:0 0 12px}
.ticket-order .view-switch-btn{display:inline-flex;align-items:center;text-decoration:none;font-size:13px}

/* Фотография в строке списка заявок. Колонка появляется только у строк,
   где вложение есть, — иначе у остальных зиял бы пустой отступ. */
/* ── Карточка заявки ─────────────────────────────────────────────────────
   Снимок квадратный и одного размера у всех карточек: вытянутая полоска
   96×195 выглядела скверно, а высота карточки скакала от длины описания.
   Теперь высота одинаковая, описание — ровно одна строка с многоточием. */
.ticket-card{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;
  align-items:center;padding:12px;border:1px solid var(--border);border-radius:16px;
  background:#fff;color:var(--ink);text-decoration:none}
.ticket-card.has-photo{grid-template-columns:88px minmax(0,1fr)}
.ticket-card:active{background:var(--panel-hover)}
.ticket-card-photo{display:block;width:88px;height:88px;overflow:hidden;
  border-radius:12px;background:#eee}
.ticket-card-photo img{width:100%;height:100%;object-fit:cover;display:block}
.ticket-card-body{display:grid;gap:2px;min-width:0}
.ticket-card-object{color:var(--brand-dark);font-size:11px;font-weight:800;
  letter-spacing:.04em;text-transform:uppercase;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ticket-card-number{font-size:16px;line-height:1.2}
.ticket-card-what{display:-webkit-box;color:var(--ink);font-size:13px;line-height:1.32;
  overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}
.ticket-card-meta{display:flex;align-items:center;gap:5px;min-width:0;color:var(--muted);font-size:12px}
.ticket-card-when{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ticket-card-assignee{display:inline-flex;align-items:center;gap:4px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ticket-card-assignee::before{content:"·";color:var(--border)}
.ticket-card-marks{display:flex;flex-wrap:wrap;gap:4px;margin-top:2px}
.object-recurring{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 8px}
.object-recurring .expense-status{margin:0}
.ticket-card-marks .expense-status{padding:3px 7px;font-size:10px}
@media (max-width: 380px){
  .ticket-card.has-photo{grid-template-columns:72px minmax(0,1fr)}
  .ticket-card-photo{width:72px;height:72px}
}
.expense-list{display:grid;gap:9px}.expense-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;padding:15px 17px;border:1px solid var(--border);border-radius:15px;background:#fff;color:var(--ink);text-decoration:none}.expense-row-main,.expense-row-side{display:flex;flex-direction:column}.expense-row-main{min-width:0}.expense-row-main small{color:var(--brand-dark);font-size:10px;font-weight:800;letter-spacing:.05em;text-transform:uppercase}.expense-row-main strong{overflow-wrap:anywhere;font-size:16px}.expense-row-main span{color:var(--muted);font-size:12px}.expense-row-next{width:fit-content;margin-top:8px;padding:4px 8px;border-radius:8px;background:var(--warn-bg);color:var(--warn);font-size:11px;line-height:1.25}.expense-row-side{align-items:flex-end;gap:6px;white-space:nowrap}
.expense-status{display:inline-flex;align-items:center;width:fit-content;padding:5px 8px;border-radius:999px;background:#eee;color:var(--muted);font-size:10px;font-weight:800}.status-requested{background:var(--warn-soft);color:var(--warn)}.status-funded{background:var(--accent-soft);color:var(--brand-dark)}.status-receipt_submitted{background:var(--work-soft);color:var(--work)}.status-needs_clarification{background:var(--warn-soft);color:var(--warn)}.status-verified{background:var(--ok-bg);color:var(--ok)}.status-new{background:var(--warn-soft);color:var(--warn)}.status-in_progress{background:var(--work-soft);color:var(--work)}.status-on_review{background:var(--warn-soft);color:var(--warn)}.status-done{background:var(--ok-bg);color:var(--ok)}.status-side{background:var(--plan-soft);color:var(--plan)}.status-routine{background:#e0f2fe;color:#0369a1}.status-critical{background:var(--crit-soft);color:var(--crit)}
.expense-empty{padding:48px 20px;border:1px dashed var(--border);border-radius:18px;text-align:center}.expense-empty strong,.expense-empty span{display:block}.expense-empty span{color:var(--muted)}.expense-form-shell{max-width:620px;margin:12px auto;padding:24px;border:1px solid var(--border);border-radius:20px;background:#fff}.expense-form{display:grid;gap:12px;margin-top:20px}.expense-form label{margin:0;color:var(--ink);font-weight:650}.expense-form textarea{width:100%;margin-top:4px;padding:11px 14px;border:1px solid var(--border);border-radius:10px}.expense-submit{width:100%;margin-top:5px}
.expense-detail-head{margin:10px 0 18px}.expense-detail-head .expense-status{margin-bottom:8px}.expense-money-card{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;overflow:hidden;border:1px solid var(--border);border-radius:17px;background:var(--border)}.expense-money-card div{padding:16px;background:#fff}.expense-money-card span,.expense-money-card strong{display:block}.expense-money-card span{color:var(--muted);font-size:11px}.expense-money-card strong{margin-top:4px;font-size:19px}.expense-difference strong{color:var(--brand-dark)}
.expense-note,.expense-action-card,.expense-receipts{margin-top:16px;padding:18px;border:1px solid var(--border);border-radius:17px;background:#fff}.expense-note p,.expense-action-card p{margin:5px 0 0;color:var(--muted)}.expense-action-card h2,.expense-receipts h2{margin:0 0 10px;font-size:19px}.expense-action-card summary{cursor:pointer;font:700 18px var(--font-d)}.expense-inline{display:flex;align-items:end;gap:10px;margin-top:14px}.expense-inline label{flex:1;margin:0}.expense-close{display:flex;gap:8px;margin-top:12px}.expense-close input{margin:0}
.expense-receipts{display:grid;gap:10px}.receipt-card{display:grid;grid-template-columns:86px minmax(0,1fr) auto;gap:12px;padding:12px 0;border-top:1px solid var(--border)}.receipt-photos{display:grid;grid-template-columns:repeat(2,1fr);gap:4px;width:86px;height:86px}.receipt-photos a:first-child:last-child{grid-column:1/-1}.receipt-photos img{width:100%;height:100%;border-radius:8px;object-fit:cover}.receipt-card>div{min-width:0}.receipt-card small,.receipt-card strong,.receipt-card span{display:block}.receipt-card small,.receipt-card p{color:var(--muted);font-size:11px}.receipt-card p{margin:5px 0 0}.receipt-card form{min-width:160px}.receipt-card form label{margin:0 0 6px}.receipt-review-actions{display:grid;gap:8px;min-width:190px}.receipt-review-actions form{display:grid;gap:6px}.receipt-review-actions textarea,.receipt-response textarea{width:100%;padding:9px;border:1px solid var(--border);border-radius:9px;font:inherit}.receipt-conversation,.receipt-response{grid-column:1/-1}.receipt-conversation{display:grid;gap:7px;padding:10px;border-radius:12px;background:var(--panel-2)}.receipt-message{max-width:78%;padding:9px 11px;border-radius:11px;background:#fff}.receipt-message.clarification_response{margin-left:auto;background:var(--panel-hover)}.receipt-message p{margin:2px 0 0;font-size:13px}.receipt-response{display:grid;gap:10px;padding:13px;border:1px solid #ecd39a;border-radius:12px;background:var(--warn-bg)}.receipt-response label{margin:0;color:var(--ink);font-weight:650}
.registry-summary{display:flex;align-items:baseline;gap:9px;margin-bottom:15px;padding:18px;border-radius:16px;background:var(--ink);color:#fff}.registry-summary strong{font:700 28px var(--font-d)}.registry-summary span{color:var(--line)}.registry-table{overflow-x:auto;border:1px solid var(--border);border-radius:15px;background:#fff}.registry-row{display:grid;grid-template-columns:100px 160px minmax(230px,1fr) 110px 90px;gap:10px;min-width:750px;padding:12px 14px;border-top:1px solid var(--border);font-size:13px}.registry-row:first-child{border-top:0}.registry-row span:nth-child(3){display:grid}.registry-row small{color:var(--muted)}.registry-head-row{background:var(--panel-2);color:var(--muted);font-size:11px;font-weight:800}
@media(max-width:620px){.expense-head{align-items:stretch;flex-direction:column}.expense-head-actions{justify-content:stretch}.expense-head-actions>*{flex:1}.expense-summary{gap:7px}.expense-summary article{padding:12px 10px}.expense-summary strong{font-size:23px}.expense-row{padding:13px}.expense-row-side>strong{font-size:13px}.expense-form-shell{padding:18px 14px}.expense-money-card{grid-template-columns:1fr 1fr}.expense-inline,.expense-close{align-items:stretch;flex-direction:column}.receipt-card{grid-template-columns:68px minmax(0,1fr)}.receipt-photos{width:68px;height:68px}.receipt-card form{grid-column:1/-1}}
@media print{.topbar,.expense-head-actions,.network-banner{display:none!important}.page{max-width:none;padding:0}.registry-table{overflow:visible}.registry-row{min-width:0}}

@font-face {
  font-family: "Onest";
  src: url("/static/fonts/onest-cyrillic-ext.woff2?v=143style-c") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: "Onest";
  src: url("/static/fonts/onest-cyrillic.woff2?v=143style-c") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: "Onest";
  src: url("/static/fonts/onest-latin-ext.woff2?v=143style-c") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Onest";
  src: url("/static/fonts/onest-latin.woff2?v=143style-c") format("woff2");
  font-weight: 400 700;
  font-style: normal;
  font-display: swap;
  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: "Unbounded";
  src: url("/static/fonts/unbounded-cyrillic-ext.woff2?v=143style-c") format("woff2");
  font-weight: 600 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
  font-family: "Unbounded";
  src: url("/static/fonts/unbounded-cyrillic.woff2?v=143style-c") format("woff2");
  font-weight: 600 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
  font-family: "Unbounded";
  src: url("/static/fonts/unbounded-latin-ext.woff2?v=143style-c") format("woff2");
  font-weight: 600 700;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Unbounded";
  src: url("/static/fonts/unbounded-latin.woff2?v=143style-c") format("woff2");
  font-weight: 600 700;
  font-style: normal;
  font-display: swap;
  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 {
  /* The app is light-only on purpose. Without this line a phone set to dark
     mode still repaints native controls — inputs, selects, scrollbars — dark,
     leaving dark fields on white cards. This pins them to the light set. */
  color-scheme: light;

  /* Style C · «Крупные плитки» (консилиум 21.09.2026, фаза 7). */
  --bg: #eef0f3;
  --panel: #ffffff;
  --panel-2: #f6f7f9;
  --ink: #14171c;
  --ink-2: #3d434b;
  --muted: #5b626c;
  --line: #e3e6eb;
  --accent: #0b5c53;
  --accent-ink: #ffffff;
  --accent-soft: #e3efec;
  --crit: #c0392b;
  --crit-soft: #f9e3e0;
  --warn: #a6730b;
  --warn-fill: #e0a622;
  --warn-soft: #fbf1d9;
  --new: #9a3a6f;
  --new-soft: #f3e1ec;
  --work: #1f6e8c;
  --work-soft: #dcecf3;
  --assigned: #5b626c;
  --assigned-soft: #e6e9ee;
  --review: #2f7a4f;
  --review-soft: #dff0e6;
  --plan: #5646a8;
  --plan-soft: #ece9f8;
  --done: #2f7a4f;
  --done-soft: #dff0e6;
  --font-d: "Unbounded", system-ui, sans-serif;
  --font-b: "Onest", system-ui, sans-serif;
  --r: 16px;
  --r-lg: 20px;
  --tap: 48px;
  --nav-h: 80px;

  /* Прежние имена остаются псевдонимами: на них держатся ~3600 строк ниже. */
  --brand: var(--accent);
  --brand-dark: #094a43;
  --border: var(--line);
  --panel-hover: var(--panel-2);
  --danger: var(--crit);
  --danger-bg: var(--crit-soft);
  --warn-bg: var(--warn-soft);
  --ok: var(--review);
  --ok-bg: var(--review-soft);
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

html {
  font-size: 16px;
}

body {
  margin: 0;
  font-family: var(--font-b);
  color: var(--ink);
  background: var(--bg);
  line-height: 1.5;
  padding-bottom: env(safe-area-inset-bottom);
}

/* Prevent overscroll rubber‑banding on mobile wrappers */
html, body { overflow-x: clip; overscroll-behavior: none; }
/* The document root must retain the browser's native scroll implementation.
   Applying -webkit-overflow-scrolling to body can detach fixed children from
   the visual viewport on iOS, leaving the bottom bar floating while scrolling.
   overscroll-behavior-y was X-only for a long time (Safari 16 added -y) —
   the elastic bounce at the bottom of a long page is the other way a fixed
   bottom bar visibly detaches on iOS, standalone PWA included; this removes
   the bounce itself rather than touching .bottom-nav's own positioning. */
body.has-bottom-nav .bottom-nav { position: fixed; bottom: 0; }
main.page { overscroll-behavior-y: contain; }

h1, h2, .brand, .material-quantity { font-family: var(--font-d); }

button:focus-visible, a:focus-visible, input:focus-visible, summary:focus-visible {
  outline: 3px solid rgba(11,92,83,.32);
  outline-offset: 2px;
}

/* ── Global select styling ── */
select {
  appearance: none;
  -webkit-appearance: none;
  min-height: 48px;
  padding: 10px 40px 10px 14px;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%235b626c' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") right 14px center no-repeat;
  font-family: inherit;
  font-size: 14px;
  color: var(--ink);
  cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
  width: 100%;
}
select { border-radius: 12px; }
select:hover { border-color: var(--brand); }
select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(11,92,83,.12); outline: none; }
select:disabled { opacity: .5; cursor: default; background-color: #f5f5f5; }

.network-banner {
  position: sticky;
  top: 0;
  z-index: 40;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 4px 12px;
  padding: 7px 16px;
  background: #2c3440;
  color: #fff;
  text-align: center;
  font-size: 13px;
}
.network-banner[hidden] { display: none; }
/* Кнопка проверки живёт на тёмной полосе, поэтому светлая и с рамкой:
   без своих правил она унаследовала бы тёмный текст на тёмном фоне. */
#network-retry {
  min-height: 32px;
  padding: 4px 12px;
  border: 1px solid rgba(255,255,255,.45);
  border-radius: 999px;
  background: transparent;
  color: #fff;
  font: inherit;
  font-weight: 700;
  cursor: pointer;
}
#network-retry:disabled { opacity: .5; cursor: default; }

a, button, input, select { touch-action: manipulation; }

/* ---------- Topbar ---------- */

.topbar {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 9px 16px;
  padding-top: calc(9px + env(safe-area-inset-top));
  border-bottom: 1px solid var(--border);
  background: var(--panel);
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--ink);
  text-decoration: none;
}
.brand img { display: block; width: 190px; height: auto; }
.brand-mark { font-weight: 800; font-size: 22px; letter-spacing: -0.02em; line-height: 1; color: var(--ink); }
.auth-brand .brand-mark { font-size: 30px; }

.topbar-user {
  max-width: 120px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13px;
  color: var(--muted);
  display: flex;
  align-items: center;
  gap: 6px;
  text-decoration: none;
}
.account-card { max-width: 460px; margin: 24px auto; }

.topbar-account { display: flex; align-items: center; gap: 4px; }
.logout-form { margin: 0; }
.topbar-action { display: grid; place-items: center; min-width: 44px; min-height: 44px; padding: 0; color: var(--muted); background: transparent; }
.topbar-account > a.topbar-action { border-radius: 10px; text-decoration: none; }
.topbar-action:active { color: var(--brand-dark); background: var(--panel-hover); }

/* ---------- Layout ---------- */

.page {
  max-width: 1100px;
  margin: 0 auto;
  padding: 16px;
  padding-left: max(16px, env(safe-area-inset-left));
  padding-right: max(16px, env(safe-area-inset-right));
}

.eyebrow { margin: 0 0 2px; color: var(--brand-dark); font-size: 12px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
.directory-head { display: flex; flex-wrap: wrap; align-items: end; justify-content: space-between; gap: 10px 16px; margin-bottom: 14px; }
.add-object-button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 44px; padding: 8px 13px; margin-left: auto; border-radius: 11px; background: var(--brand-dark); color: #fff; text-decoration: none; font-weight: 700; font-size: 13px; }
.directory-admin-actions { display: flex; align-items: center; gap: 6px; margin-left: auto; }
.archive-link { display: inline-flex; align-items: center; min-height: 44px; padding: 8px 10px; color: var(--muted); text-decoration: none; font-size: 13px; font-weight: 700; }
.directory-head h1, .object-hero h1 { margin: 0; line-height: 1.15; }
.view-switch { display: flex; padding: 3px; border: 1px solid var(--border); border-radius: 12px; background: #fff; }
.view-switch-btn { min-width: auto; min-height: 40px; padding: 7px 13px; border-radius: 9px; background: transparent; color: var(--muted); }
.view-switch-btn.is-active { background: var(--ink); color: #fff; }

.flash {
  padding: 12px 14px;
  border-radius: 10px;
  margin-bottom: 16px;
  font-size: 14px;
  transition: opacity 0.3s ease, transform 0.3s ease, margin 0.3s ease;
}
.flash.is-dismissing {
  opacity: 0;
  transform: translateY(-8px);
  margin-bottom: 0;
  pointer-events: none;
}

.flash-error {
  background: var(--danger-bg);
  color: var(--danger);
}

.flash-success {
  background: var(--ok-bg);
  color: var(--ok);
}

.error-card { max-width: 480px; margin: 12vh auto 0; padding: 30px 24px; border: 1px solid var(--border); border-radius: 20px; background: #fff; text-align: center; }
.error-code { display: inline-flex; padding: 5px 10px; border-radius: 999px; background: var(--panel-hover); color: var(--brand-dark); font-weight: 800; }
.error-card h1 { margin: 12px 0 6px; font-size: 25px; }
.error-card p { margin: 0 0 20px; color: var(--muted); }
.error-card a { display: inline-flex; align-items: center; justify-content: center; min-height: 48px; padding: 9px 16px; border-radius: 11px; background: var(--ink); color: #fff; text-decoration: none; font-weight: 700; }

.muted { color: var(--muted); }
.visit-access-note { font-size: 17px; line-height: 1.35; margin: 0 0 6px; }
.visit-access-note a { color: var(--brand-dark); text-decoration: underline; }

/* ---------- Icons ---------- */

.icon {
  flex-shrink: 0;
  vertical-align: -4px;
}

.icon-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

/* ---------- Forms & buttons (touch-first) ---------- */

form label {
  display: block;
  margin-top: 14px;
  font-size: 13px;
  color: var(--muted);
}

/* Obязательные поля отмечены только атрибутом required — на длинных формах,
   где обязательные и необязательные поля вперемешку, это незаметно, пока не
   попытаешься отправить форму. Звёздочка перед подписью видна сразу. */
label:has(> input[required])::before,
label:has(> textarea[required])::before,
label:has(> select[required])::before {
  content: "* ";
  color: var(--brand);
  font-weight: 700;
}

input, button { font: inherit; }

input:not([type]), input[type="text"], input[type="password"], input[type="number"], input[type="search"], input[type="tel"], input[type="url"], input[type="file"], input[type="email"], input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"], textarea, select {
  display: block;
  width: 100%;
  min-height: var(--tap);
  margin-top: 4px;
  padding: 10px 14px;
  font-size: 16px; /* prevents iOS auto-zoom on focus */
  border: 1px solid var(--border);
  border-radius: 10px;
  /* Именно background-color: сокращённый background стирает картинку со
     стрелкой, которую select рисует выше. */
  background-color: #fff;
}

input:focus, textarea:focus, select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(11,92,83,.12); outline: none; }
textarea { resize: vertical; font: inherit; }

button {
  cursor: pointer;
  border: none;
  border-radius: 10px;
  min-height: var(--tap);
  min-width: var(--tap);
  padding: 10px 18px;
  background: var(--brand-dark);
  color: #fff;
  font-weight: 600;
  font-size: 15px;
  transition: background-color .15s ease, transform .1s ease;
}

button:active { background: #073d37; transform: scale(.97); }

.text-button {
  background: transparent;
  color: var(--brand-dark);
  padding: 10px 12px;
}

.text-button:active { background: var(--panel-hover); }

.text-button.danger { color: var(--danger); }
.text-button.danger:active { background: var(--danger-bg); }

/* ---------- Login & registration ---------- */

.auth-page {
  min-height: 100dvh;
  background:
    radial-gradient(circle at 15% 0%, rgba(11,92,83,.14), transparent 34%),
    linear-gradient(180deg, var(--panel-2) 0%, var(--bg) 58%);
}

.auth-page::before {
  content: "";
  position: fixed;
  inset: auto -230px -280px auto;
  width: 620px;
  height: 760px;
  background: url("/static/brand/svp-rings.png?v=82") center / contain no-repeat;
  opacity: .035;
  pointer-events: none;
}

.auth-page .page { max-width: none; min-height: 100dvh; padding-top: max(28px, env(safe-area-inset-top)); }
.auth-page .flash { width: min(100%, 460px); margin-left: auto; margin-right: auto; }

.auth-shell { width: min(100%, 420px); margin: 0 auto; }
.auth-shell-wide { width: min(100%, 460px); }

.auth-brand { display: flex; align-items: center; justify-content: center; margin: 0 0 30px; }
.auth-brand img { display: block; width: min(78vw, 310px); height: auto; }
.auth-back { display: inline-flex; min-height: 44px; align-items: center; margin-bottom: 8px; color: var(--brand-dark); text-decoration: none; font-size: 14px; font-weight: 650; }

.login-card {
  margin: 0 auto;
  padding: 26px 22px 22px;
  border: 1px solid var(--border);
  border-radius: 22px;
  background: var(--panel);
  box-shadow: 0 18px 60px rgba(20,23,28,.08);
}

.auth-heading { margin-bottom: 22px; }
.auth-heading h1 { margin: 0 0 8px; font-size: 27px; line-height: 1.15; letter-spacing: -.02em; }
.auth-heading p { margin: 0; color: var(--muted); font-size: 14px; }
.auth-kicker { display: inline-flex; padding: 5px 9px; border-radius: 999px; color: var(--brand-dark); background: var(--panel-hover); font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: .05em; }
.auth-form label { margin: 14px 0 6px; color: var(--ink); font-size: 13px; font-weight: 650; }
.auth-form input { margin: 0; border-radius: 12px; background: #fbfbfb; }
.password-field { position: relative; }
.password-field input { padding-right: 88px; }
.password-toggle { position: absolute; top: 4px; right: 4px; min-width: auto; min-height: 44px; padding: 0 10px; background: transparent; color: var(--brand-dark); font-size: 12px; }
.password-toggle:active { background: var(--panel-hover); }
.auth-submit { width: 100%; margin-top: 22px; min-height: 52px; border-radius: 13px; background: var(--brand-dark); font-weight: 750; }
.auth-submit-link { display: flex; align-items: center; justify-content: center; color: #fff; text-decoration: none; }
.auth-remember { display: flex; align-items: center; gap: 8px; margin-top: 16px; cursor: pointer; font-size: 14px; color: var(--ink); }
.auth-remember input[type="checkbox"] { width: 18px; height: 18px; margin: 0; accent-color: var(--brand-dark); border-radius: 4px; cursor: pointer; }
.auth-switch { margin: 18px 0 0; color: var(--muted); text-align: center; font-size: 14px; }
.auth-switch a { color: var(--brand-dark); font-weight: 700; }
.auth-footnote { margin: 18px 0 0; color: var(--muted); text-align: center; font-size: 12px; }
.field-help { display: block; margin-top: 5px; color: var(--muted); font-size: 11px; }
.password-rules { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.password-rules span { padding: 4px 8px; border-radius: 999px; background: #f0f1f2; color: var(--muted); font-size: 11px; }
.password-rules span::before { content: "○ "; }
.password-rules span.is-valid { background: var(--ok-bg); color: var(--ok); }
.password-rules span.is-valid::before { content: "✓ "; }
.form-error { margin: 7px 0 0; color: var(--danger); font-size: 12px; }
.auth-disabled { text-align: center; margin: 0; }
.auth-lock { display: block; margin-bottom: 10px; font-size: 34px; }

/* ---------- Administrator invitations ---------- */

.admin-head { margin: 8px 0 18px; }
.admin-head h1 { margin: 0; font-size: 28px; }
.admin-head p { max-width: 560px; margin: 7px 0 0; color: var(--muted); font-size: 14px; }

.invite-result { position: relative; display: flex; flex-direction: column; gap: 7px; margin: 12px 0 18px; padding: 20px; overflow: hidden; border-radius: 18px; background: var(--ink); color: #fff; }
.invite-result::after { content: ""; position: absolute; right: -90px; bottom: -170px; width: 290px; height: 360px; background: url("/static/brand/svp-rings.png?v=82") center / contain no-repeat; opacity: .1; pointer-events: none; }
.invite-result span, .invite-result small { position: relative; z-index: 1; color: var(--line); font-size: 12px; }
.invite-result strong { position: relative; z-index: 1; font-family: var(--font-d); font-size: clamp(19px, 6vw, 29px); letter-spacing: .04em; overflow-wrap: anywhere; }
.copy-code { position: relative; z-index: 1; display: inline-flex; align-items: center; justify-content: center; gap: 7px; align-self: flex-start; margin-top: 4px; background: #fff; color: var(--ink); }
.copy-code:active { background: #f0eeec; }

.invite-create { margin-top: 0; }
.invite-form > label { font-weight: 600; color: var(--ink); }
.invite-options { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.invite-options label { font-weight: 600; color: var(--ink); }
.invite-options select { display: block; width: 100%; min-height: 48px; margin-top: 5px; padding: 9px 34px 9px 12px; border: 1px solid var(--border); border-radius: 12px; background-color: #fff; color: var(--ink); font: inherit; }
.invite-form > button { width: 100%; margin-top: 18px; background: var(--ink); }

.invite-list { display: flex; flex-direction: column; }
.invite-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px 12px; padding: 14px 0; border-top: 1px solid var(--border); }
.invite-row:first-child { border-top: 0; padding-top: 2px; }
.invite-row-main { min-width: 0; }
.invite-row-main strong, .invite-row-main span, .invite-row-main small { display: block; }
.invite-row-main strong { font-size: 14px; }
.invite-row-main span { margin-top: 3px; color: var(--muted); font-size: 12px; }
.invite-row-main small { margin-top: 3px; color: #968d87; font-size: 10px; }
.invite-row form { grid-column: 2; margin: 0; }
/* Было 34px — ниже пальца. Это «Приостановить», «Удалить», «Сохранить адрес»
   на графиках обслуживания и «Отключить» на приглашениях: действия редкие, но
   промах по «Удалить» дороже сэкономленных десяти пикселей. Остальное
   приложение держит --tap, держим и здесь. */
.invite-row .text-button { min-width: 0; min-height: var(--tap); padding: 5px 10px; font-size: 11px; }
.invite-status { align-self: start; padding: 4px 8px; border-radius: 999px; background: #eee; color: var(--muted); font-size: 10px; font-weight: 700; }
.invite-status.is-active { background: var(--ok-bg); color: var(--ok); }
.invite-row-main small.maintenance-link-warning { color: var(--danger); font-weight: 600; }
.maintenance-link-form { grid-column: 1 / -1; display: flex; gap: 8px; align-items: center; margin-top: 6px; }
.maintenance-link-form select { min-width: 0; flex: 1; }

/* ---------- Map + object list (mobile-first: fullscreen map + bottom sheet) ---------- */

.workspace {
  position: relative;
  height: calc(100dvh - 64px - env(safe-area-inset-top));
  margin: -16px;
  margin-top: 0;
}

.map-panel {
  position: absolute;
  inset: 0;
}

/* height:100% отсчитывается от ЗАДАННОЙ высоты родителя. У .map-panel задана
   только min-height, поэтому проценты разрешались в ноль: полотно карты имело
   размер 350x0 и выглядело серым прямоугольником, хотя карта была построена и
   метки на ней стояли. Растягиваем по родителю напрямую — он позиционирован. */
.map { position: absolute; inset: 0; width: 100%; height: 100%; }

.map-tools { position: absolute; z-index: 5; top: 14px; right: 14px; }
.map-tool { display: grid; place-items: center; width: 48px; height: 48px; padding: 0; border: 1px solid var(--border); border-radius: 14px; background: #fff; color: var(--brand-dark); box-shadow: 0 4px 16px rgba(20,23,28,.16); font-size: 26px; }
.map-tool.is-loading { animation: pulse 1s infinite alternate; }
@keyframes pulse { to { opacity: .45; } }

.map-fallback { position: absolute; inset: 0; z-index: 4; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 36px; background: linear-gradient(145deg, #f0f1f2, #fff); text-align: center; }
.map-fallback[hidden] { display: none; }
.map-fallback-icon { display: grid; place-items: center; width: 64px; height: 64px; margin-bottom: 14px; border-radius: 20px; background: var(--panel-hover); color: var(--brand-dark); font-size: 34px; }
.map-fallback p { max-width: 360px; margin: 8px 0 18px; color: var(--muted); font-size: 14px; }
.map-fallback button { background: var(--ink); }

.map-selection { position: absolute; z-index: 6; left: 14px; right: 14px; bottom: calc(32vh + 12px); padding: 14px 48px 14px 16px; border: 1px solid var(--border); border-radius: 16px; background: #fff; box-shadow: 0 10px 32px rgba(20,23,28,.2); }
.map-selection[hidden] { display: none; }
.map-selection strong { display: block; font-size: 16px; }
.map-selection p { margin: 3px 0; color: var(--muted); font-size: 13px; }
.map-selection > span { color: var(--brand-dark); font-size: 12px; font-weight: 700; }
.map-selection > div { display: flex; gap: 8px; margin-top: 12px; }
.map-selection a { display: flex; align-items: center; justify-content: center; min-height: 44px; flex: 1; border: 1px solid var(--border); border-radius: 11px; color: var(--ink); text-decoration: none; font-size: 14px; font-weight: 700; }
.map-selection .selection-route { border-color: var(--brand-dark); background: var(--brand-dark); color: #fff; }
.selection-close { position: absolute; top: 6px; right: 6px; min-width: 44px; min-height: 44px; padding: 0; background: transparent; color: var(--muted); font-size: 24px; }
.selection-photo { float: left; width: 62px; height: 62px; margin: 0 10px 8px 0; border-radius: 11px; object-fit: cover; }

.sheet {
  --sheet-height: 32vh;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 20;
  width: 100%;
  max-width: none;
  margin: 0;
  border: none;
  border-radius: 16px 16px 0 0;
  background: var(--bg);
  box-shadow: 0 -6px 24px rgba(20,23,28,0.16);
  padding: 6px 14px calc(12px + env(safe-area-inset-bottom));
  height: var(--sheet-height);
  max-height: calc(100dvh - 72px);
  display: flex;
  flex-direction: column;
  transition: height 0.25s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.sheet::backdrop { display: none; }

.sheet-handle {
  flex-shrink: 0;
  width: 40px;
  height: 24px;
  border-radius: 3px;
  background: transparent;
  margin: 0 auto 2px;
  cursor: pointer;
}

.sheet-handle::after { content: ""; display: block; width: 42px; height: 5px; margin: 9px auto; border-radius: 3px; background: #b9c0ca; }

.sheet-header {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 8px;
}

.result-count { margin: 0 2px; color: var(--muted); font-size: 12px; }

.sheet-header h2 { margin: 0; font-size: 16px; }

.search-box {
  position: relative;
  display: flex;
  align-items: center;
}

.search-box .icon {
  position: absolute;
  left: 12px;
  color: var(--muted);
  pointer-events: none;
}

.search-box input {
  padding-left: 38px;
  padding-right: 42px;
}

.search-clear { position: absolute; right: 4px; min-width: 44px; min-height: 44px; padding: 0; background: transparent; color: var(--muted); font-size: 24px; }
.search-clear[hidden] { display: none; }
.list-meta { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 32px; }
.quick-filters { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; scrollbar-width: none; }
.quick-filter { flex: 0 0 auto; min-width: auto; min-height: 44px; padding: 6px 11px; border: 1px solid var(--border); background: #fff; color: var(--muted); font-size: 12px; }
.quick-filter.is-active { border-color: var(--ink); background: var(--ink); color: #fff; }
.sort-button { min-width: auto; min-height: 44px; padding: 5px 9px; border: 1px solid var(--border); background: #fff; color: var(--muted); font-size: 11px; }
.sort-button.is-active { border-color: var(--brand); color: var(--brand-dark); background: var(--panel-hover); }

.object-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  overflow-y: auto;
  flex: 1;
  min-height: 0;
}

.object.is-active { background: var(--panel-hover); border-color: var(--brand); }

.object {
  display: flex;
  align-items: center;
  gap: 12px;
  min-height: var(--tap);
  padding: 10px 14px;
  border-radius: 10px;
  text-decoration: none;
  color: var(--ink);
  border: 1px solid transparent;
}

.object:active { background: var(--panel-hover); border-color: var(--border); }

/* dead — object-icon kept only as a reference point for the card cover placeholder */
.object-icon { display: none; }
.object-thumb { flex: 0 0 auto; width: 48px; height: 48px; border-radius: 11px; object-fit: cover; background: #eee; }
.favorite-mark { color: var(--brand); font-family: sans-serif; font-size: 13px; }

.object-body { min-width: 0; }
.object-body strong { display: block; font-size: 15px; }
.object-body span { display: block; font-size: 13px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.object-body small { display: block; margin-top: 2px; color: #93887f; font-size: 11px; }
.object-distance { flex-shrink: 0; color: var(--brand-dark); font-size: 12px; font-weight: 700; }
.object-chevron { margin-left: auto; color: var(--muted); font-size: 26px; }

.admin-nav { display: flex; align-items: center; gap: 4px; }
.admin-nav a { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; padding: 8px 10px; border-radius: 10px; color: var(--ink); text-decoration: none; font-size: 12px; font-weight: 700; }
.admin-nav a:hover { background: var(--panel-hover); }
.map-filters { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding-top: 4px; }
.map-filter-panel { border: 1px solid var(--border); border-radius: 10px; background: #fff; }
.map-filter-panel > summary { min-height: 44px; padding: 10px 12px; cursor: pointer; color: var(--brand-dark); font-size: 13px; font-weight: 700; }
.map-filter-panel .map-filters { padding: 0 10px 10px; }
.map-filters label { font-size: 12px; color: var(--muted); }
/* Единственные select в приложении, которые уходили из-под общего правила:
   40px не дотягивают до пальца, а 13px на iOS заставляют Safari зумить
   страницу при фокусе — и это экран поиска объекта, куда техник заходит
   первым делом. Остальные поля формы держат 16px именно поэтому. */
.map-filters select { min-height: var(--tap); margin-top: 3px; font-size: 16px; }
.map-filters .check-row, .map-filters button { grid-column: 1 / -1; }
.last-sync { color: var(--muted); white-space: nowrap; font-size: 12px; }
.user-list, .audit-table, .import-preview { display: grid; gap: 8px; }
.user-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px 16px; padding: 14px 0; border-bottom: 1px solid var(--border); }
.user-row:last-child { border-bottom: 0; }
.user-row.is-disabled { opacity: .58; }
.user-row > div:first-child { display: grid; gap: 3px; }
.user-row span, .user-row small { color: var(--muted); font-size: 13px; }
.user-manage { align-self: start; }
.user-manage > summary { display: inline-flex; align-items: center; min-height: 42px; padding: 8px 12px; border: 1px solid var(--border); border-radius: 10px; color: var(--ink); cursor: pointer; font-size: 12px; font-weight: 750; }
.user-manage[open] { grid-column: 1 / -1; }
.user-manage[open] > summary { margin-bottom: 10px; background: var(--panel-hover); }
.row-actions { display: grid; gap: 12px; padding: 12px; border: 1px solid var(--border); border-radius: 12px; background: var(--panel-2); }
.row-actions form { margin: 0; }
.role-form { display: flex; flex-wrap: wrap; align-items: end; gap: 8px; }
.role-form label { display: grid; flex: 1 1 180px; gap: 4px; color: var(--muted); font-size: 11px; font-weight: 700; }
.user-security-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding-top: 10px; border-top: 1px solid var(--border); }
.user-security-actions > strong { flex-basis: 100%; color: var(--muted); font-size: 11px; letter-spacing: .04em; text-transform: uppercase; }
.audit-table > div { display: grid; grid-template-columns: 130px 1fr 1fr 120px; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 13px; }
.password-result code { display: block; padding: 16px; margin: 16px 0; border-radius: 10px; background: #f4f1ed; font-size: 18px; word-break: break-all; }
.document-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.document-row a { display: grid; color: var(--ink); text-decoration: none; }
.document-row span { color: var(--muted); font-size: 12px; }

.notice-list { margin: 0 0 8px; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 8px; }
.notice-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 12px; padding: 10px 0; border-bottom: 1px solid var(--border); }
.notice-row p { margin: 0; flex-basis: 100%; }
.notice-row .muted { font-size: 12px; }
.notice-row form { margin: 0; }
.document-loading-overlay {
  position: fixed; inset: 0; z-index: 60;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  background: #fff;
}
.document-loading-overlay p { margin: 0; color: var(--muted); font-size: 14px; }
.document-group-title{margin:14px 0 4px;color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase}
.document-other-group{margin-top:10px}
.document-other-group>summary{min-height:var(--tap);cursor:pointer;color:var(--muted);font-weight:700}
.document-other-group[open]>summary{margin-bottom:4px;color:var(--ink)}
.document-open-hint{font-size:12px;margin-top:-4px}
.photo-edit summary, .contact-edit summary { cursor: pointer; color: var(--brand-dark); font-size: 12px; }
.photo-edit .inline-form, .contact-edit .inline-form { padding-top: 8px; }
.contact-edit { margin-left: auto; }
.material-update-form { flex-wrap: wrap; }
.material-update-form.stepper-form { flex-shrink: 1; min-width: 0; }
.material-reason { display: none; flex: 1 1 160px; min-width: 0; }
.material-save { display: none; }
.material-update-form.is-dirty .material-reason, .material-update-form.is-dirty .material-save { display: block; }
.pagination { display: flex; justify-content: space-between; gap: 12px; padding-top: 16px; }
.import-preview > div { display: grid; padding: 10px; border: 1px solid var(--border); border-radius: 8px; }
.import-preview .has-error { border-color: #b73729; color: #8f241b; }

@media (max-width: 720px) {
  .admin-nav span { display: none; }
  .admin-nav a { width: 42px; justify-content: center; padding: 0; }
  .user-row { display: grid; }
  .row-actions { justify-content: flex-start; }
  .audit-table > div { grid-template-columns: 1fr 1fr; }
  .map-filters { grid-template-columns: 1fr; }
  .map-filters > * { grid-column: 1 !important; }
  .form-grid, .coordinate-grid { grid-template-columns: 1fr; gap: 0; }
  .coordinate-grid .secondary-button { margin-top: 10px; }
  .object-body small, .user-row small, .last-sync { font-size: 12px; }
}

.list-skeleton { display: flex; flex-direction: column; gap: 8px; padding: 4px; }
.list-skeleton i { display: block; height: 66px; border-radius: 12px; background: linear-gradient(90deg, #eceeef 25%, #f7f8f8 45%, #eceeef 65%); background-size: 300% 100%; animation: shimmer 1.4s infinite; }
@keyframes shimmer { to { background-position: -150% 0; } }
.list-state {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 14px;
  text-align: center;
  color: var(--muted);
  font-size: 14px;
}
.list-state span { margin-top: 4px; }
.list-state button { margin-top: 12px; }

.list-state.list-error { color: var(--danger); }
.list-state .icon { flex-shrink: 0; }

/* ---------- Object passport page ---------- */

.back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: var(--tap);
  color: var(--brand-dark);
  text-decoration: none;
  font-size: 15px;
}

.object-hero { padding: 8px 0 4px; }
.archive-badge { display: inline-flex; margin: 0 0 6px; padding: 4px 8px; border-radius: 999px; background: var(--warn-bg); color: var(--warn); font-size: 11px; font-weight: 800; }
.unserviced-badge { display: inline-flex; margin: 0 0 6px; padding: 4px 8px; border-radius: 999px; background: var(--border); color: var(--muted); font-size: 11px; font-weight: 800; }
.object-address { display: flex; align-items: flex-start; gap: 8px; margin: 10px 0 4px; color: var(--muted); }
.object-address .icon { margin-top: 2px; color: var(--brand); }

.location-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 4px;
}

.location-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.chip-form { margin: 0; }
.chip-form button { font-family: inherit; }

.access-alert { margin-top: 14px; padding: 14px 16px; border-left: 4px solid var(--brand); border-radius: 0 12px 12px 0; background: var(--accent-soft); }
.access-alert strong { font-size: 13px; }
.access-alert p { margin: 4px 0 0; white-space: pre-wrap; font-size: 14px; }

.photo-gallery { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(220px, 72%); gap: 10px; margin-top: 14px; overflow-x: auto; scroll-snap-type: x mandatory; }
.photo-card { position: relative; margin: 0; overflow: hidden; border-radius: 14px; background: #fff; scroll-snap-align: start; border: 1px solid var(--border); }
.photo-card img { display: block; width: 100%; height: 160px; object-fit: cover; }
.photo-card figcaption { display: flex; flex-direction: column; padding: 9px 11px; font-size: 12px; }
.photo-card figcaption span { color: var(--muted); }
.photo-delete { position: absolute; top: 6px; right: 6px; width: 40px; height: 40px; min-width: 40px; min-height: 40px; padding: 0; border: 1px solid rgba(255,255,255,.7); border-radius: 50%; background: rgba(20,23,28,.78); font-size: 22px; }
.admin-add-card summary { display: flex; align-items: center; gap: 8px; min-height: 48px; cursor: pointer; color: var(--brand-dark); font-weight: 700; }
.check-row { display: flex !important; align-items: center; gap: 8px; margin: 4px 0 !important; color: var(--ink) !important; }
.check-row input { width: 20px !important; min-height: 20px !important; margin: 0 !important; }

.action-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 48px;
  padding: 8px 14px;
  border-radius: 20px;
  background: var(--panel);
  border: 1px solid var(--border);
  color: var(--ink);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
}

.action-chip.action-primary { background: var(--brand-dark); border-color: var(--brand-dark); color: #fff; }
.action-chip.action-primary .icon { color: #fff; }

.action-chip:active { background: var(--panel-hover); }
.action-chip .icon { color: var(--brand); }
.action-chip.is-favorite { background: var(--warn-bg); border-color: #ecd39a; }
.action-chip.is-favorite .icon { color: var(--warn-fill); }

.toast {
  position: fixed;
  left: 50%;
  bottom: calc(20px + env(safe-area-inset-bottom));
  transform: translate(-50%, 12px);
  background: var(--ink);
  color: #fff;
  padding: 10px 18px;
  border-radius: 20px;
  font-size: 14px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease;
  z-index: 50;
}

.toast.visible { opacity: 1; transform: translate(-50%, 0); }

.card {
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 16px;
  margin-top: 14px;
  background: var(--panel);
}

.card h2 {
  margin-top: 0;
  font-size: 16px;
  display: flex;
  align-items: center;
  gap: 8px;
}

.card h2 .icon { color: var(--brand); }

.contact-list { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 4px; }
.tel-link {
  display: flex;
  gap: 8px;
  min-height: var(--tap);
  align-items: center;
  padding: 8px 10px;
  border-radius: 10px;
  color: var(--ink);
  text-decoration: none;
}
.tel-link:active { background: var(--panel-hover); }
.tel-link .icon { color: var(--brand); }
.tel-link > span { min-width: 0; display: flex; flex-direction: column; }
.tel-link strong { font-size: 14px; }
.tel-link strong em { padding: 2px 5px; border-radius: 999px; background: var(--ok-bg); color: var(--ok); font-style: normal; font-size: 9px; }
.tel-link span span { color: var(--ink); font-size: 13px; }
.tel-link small { color: var(--muted); font-size: 11px; }
.contact-row form { margin: 0; }

.contact-row { display: flex; align-items: center; gap: 2px; }
.contact-row .tel-link { flex: 1; min-width: 0; }

.icon-copy-btn {
  flex-shrink: 0;
  background: transparent;
  border: none;
  padding: 0;
  min-width: var(--tap);
  min-height: var(--tap);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--muted);
  border-radius: 10px;
}

.icon-copy-btn:active { background: var(--panel-hover); color: var(--brand-dark); }

.icon-copy-btn.danger { color: var(--danger); }
.icon-copy-btn.danger:active { background: var(--danger-bg); color: var(--danger); }

/* ---------- Passport field cards (tap-to-edit) ---------- */

.passport-group { margin-top: 14px; }
.passport-group:first-child { margin-top: 0; }

.passport-group-title {
  margin: 0 0 6px 4px;
  font-size: 12px;
  font-weight: 700;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

.field-cards { display: flex; flex-direction: column; gap: 6px; }

.field-card {
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
}

.field-card summary {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: var(--tap);
  padding: 10px 12px;
  cursor: pointer;
  list-style: none;
}

.field-card summary::-webkit-details-marker { display: none; }

.field-card:not(.field-card-add) summary .icon:last-child {
  margin-left: auto;
  color: var(--muted);
  transition: transform 0.2s ease;
}

.field-card[open]:not(.field-card-add) summary .icon:last-child { transform: rotate(180deg); }

.field-card .field-name { font-weight: 600; font-size: 14px; flex-shrink: 0; }

.field-card .field-value {
  color: var(--muted);
  font-size: 14px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

.field-card-body {
  padding: 0 12px 12px;
  border-top: 1px solid var(--border);
}

.field-card-readonly { display: grid; grid-template-columns: minmax(110px, 38%) 1fr; gap: 12px; padding: 12px; }
.field-card-readonly .field-name { font-weight: 650; font-size: 14px; }
.field-card-readonly .field-value { color: var(--muted); font-size: 14px; white-space: normal; overflow-wrap: anywhere; }

.field-card-body .inline-form { margin-top: 10px; }

.field-card-actions { display: flex; gap: 8px; }
.field-card-actions button { flex: 1; }

.field-card-add { margin-top: 10px; }
.field-card-add summary { color: var(--brand-dark); font-weight: 600; }

/* ---------- Materials (stepper) ---------- */

.material-cards { display: flex; flex-direction: column; gap: 6px; }

.material-card {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
}

.material-info { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.material-info strong { font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.material-info span { font-size: 12px; }
.material-quantity { min-width: 62px; color: var(--ink); text-align: right; font-size: 20px; font-weight: 800; }

.change-log { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 10px; }
.change-log li { position: relative; padding: 0 0 10px 18px; border-bottom: 1px solid var(--border); }
.change-log li:last-child { padding-bottom: 0; border-bottom: 0; }
.change-log li::before { content: ""; position: absolute; left: 1px; top: 7px; width: 7px; height: 7px; border-radius: 50%; background: var(--brand); }
.change-log strong { display: block; font-size: 13px; }
.change-log span { display: block; margin-top: 3px; color: var(--muted); font-size: 11px; }

.stepper-form {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
}

.stepper-btn {
  width: 44px;
  height: 44px;
  min-width: 44px;
  min-height: 44px;
  padding: 0;
  border-radius: 8px;
  background: var(--panel);
  border: 1px solid var(--border);
  color: var(--brand-dark);
  display: flex;
  align-items: center;
  justify-content: center;
}

.stepper-btn:active { background: var(--panel-hover); }

.stepper-input {
  width: 56px;
  min-height: 44px;
  margin-top: 0;
  padding: 4px;
  text-align: center;
  font-size: 15px;
  border: 1px solid var(--border);
  border-radius: 8px;
}

.inline-form .input-narrow { width: 5em; }
.inline-form {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 10px;
}

.inline-form input { margin-top: 0; }

/* ---------- Object editor ---------- */
.object-editor { max-width: 760px; margin: 0 auto; }
.form-section h2 { margin-bottom: 12px; }
.form-section label { color: var(--ink); font-weight: 650; }
.form-grid, .coordinate-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.coordinate-grid { grid-template-columns: 1fr 1fr auto; align-items: end; }
.secondary-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: var(--tap);
  padding: 10px 18px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
  color: var(--brand-dark);
  font-weight: 600;
  font-size: 15px;
  text-decoration: none;
  cursor: pointer;
}
/* На телефоне карта в 320 точек занимала пол-экрана и выдавливала поля формы
   вниз, хотя адрес обычно набирают руками, а карта нужна только чтобы уточнить
   точку. Оставляем её видимой (в скрытом контейнере Яндекс-карта получает
   нулевой размер), но вдвое ниже. */
.editor-map { width: 100%; height: 320px; margin-top: 12px; overflow: hidden; border: 1px solid var(--border); border-radius: 14px; }
@media (max-width: 620px) { .editor-map { height: 180px; } }
.editor-map-fallback { margin-top: 12px; padding: 24px; border-radius: 14px; background: #f0f1f2; color: var(--muted); text-align: center; }
.editor-actions { position: sticky; bottom: 0; z-index: 8; display: flex; justify-content: flex-end; gap: 10px; margin-top: 14px; padding: 12px; border: 1px solid var(--border); border-radius: 14px 14px 0 0; background: rgba(255,255,255,.94); backdrop-filter: blur(10px); }
.editor-actions a { display: inline-flex; align-items: center; min-height: 48px; padding: 8px 14px; color: var(--muted); text-decoration: none; }
.danger-zone { margin: 22px 0; padding-top: 16px; border-top: 1px solid var(--border); }
.archive-button { width: 100%; border: 1px solid var(--warn); background: #fff; color: var(--warn); }
.duplicate-warning { padding: 14px 16px; border: 1px solid #ecd39a; border-radius: 14px; background: var(--warn-bg); color: #69420a; }
.duplicate-warning ul { margin: 8px 0; padding-left: 20px; }
.duplicate-warning a { color: inherit; font-weight: 700; }
.archive-list { display: flex; flex-direction: column; }
.archive-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 0; border-top: 1px solid var(--border); }
.archive-row:first-child { border-top: 0; }
.archive-row div { min-width: 0; }
.archive-row strong, .archive-row span { display: block; }
.archive-row span { color: var(--muted); font-size: 12px; }
.archive-row a { display: inline-flex; align-items: center; min-height: 44px; color: var(--brand-dark); font-weight: 700; text-decoration: none; }

/* ---------- Desktop enhancement ---------- */

@media (min-width: 860px) {
  .page { padding: 24px; }

  .inline-form { flex-direction: row; flex-wrap: wrap; align-items: center; }
  .inline-form input { flex: 1; min-width: 120px; }
}

@media (max-width: 859px) {
  .directory-head { align-items: center; }
  .object-hero h1 { font-size: 28px; }
  .card { background: #fff; box-shadow: 0 5px 20px rgba(20,23,28,.045); }
}

@media (max-width: 520px) {
  .topbar-user { display: none; }
  .brand img { width: 166px; }
  .invite-options { grid-template-columns: 1fr; gap: 0; }
  .directory-head .add-object-button { width: 44px; padding: 0; font-size: 0; }
  .form-grid, .coordinate-grid { grid-template-columns: 1fr; gap: 0; }
  .coordinate-grid .secondary-button { margin-top: 10px; }
}

@media (max-width: 420px) {
  .topbar-user { display: none; }
  .auth-page .page { padding-left: 14px; padding-right: 14px; }
  .login-card { padding: 24px 18px 20px; }
  .directory-head h1 { font-size: 25px; }
  .view-switch-btn { padding-left: 10px; padding-right: 10px; }
}

/* ---------- Directory experience v4.2 ---------- */

.directory-head {
  align-items: center;
  margin: 4px 0 14px;
}
.directory-title { min-width: 0; }
.directory-title h1 { font-size: clamp(28px, 7vw, 40px); letter-spacing: -.035em; }
.directory-title p { margin: 5px 0 0; color: var(--muted); font-size: 14px; }
.directory-admin-actions { flex-wrap: wrap; justify-content: flex-end; }

.view-switch {
  width: fit-content;
  margin: 0 0 14px;
  padding: 4px;
  border-radius: 14px;
  box-shadow: 0 4px 18px rgba(20,23,28,.06);
}
.view-switch-btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-height: 44px; padding: 8px 18px; }

.workspace {
  position: relative;
  height: auto;
  min-height: 0;
  margin: 0;
}
.directory-panel {
  position: static;
  width: 100%;
  min-width: 0;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: 20px;
  background: #fff;
  box-shadow: 0 12px 36px rgba(20,23,28,.055);
}
.sheet-header { gap: 10px; margin-bottom: 14px; }
.search-box input { min-height: 54px; margin: 0; border-radius: 14px; background: #f8f8f8; }
.list-meta { flex-wrap: wrap; }
.quick-filter { min-height: 44px; padding: 7px 14px; border-radius: 999px; }
.map-filter-panel { border-radius: 13px; background: var(--panel-2); }

.object-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; overflow: visible; }
.object {
  position: relative;
  display: grid;
  grid-template-columns: 112px minmax(0, 1fr);
  align-items: stretch;
  gap: 0;
  min-height: 132px;
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: 17px;
  background: #fff;
  box-shadow: 0 5px 18px rgba(20,23,28,.055);
  will-change: transform;
  transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
.object:active { transform: scale(.99); }
.object-cover { display: block; min-width: 0; background: #eee; }
.object-thumb { width: 100%; height: 100%; min-height: 132px; border-radius: 0; object-fit: cover; }
/* Stands in for a photo that has not been uploaded yet. It is a gap, not a
   feature: an embossed circle that grows on hover drew the eye away from the
   object's name and address, which are the only things on the card anyone
   actually reads. Flat, quiet, and it disappears the moment a cover exists. */
.object-cover-placeholder {
  display: grid;
  place-items: center;
  width: 100%;
  height: 100%;
  min-height: 132px;
  background: #f7f3f0;
  color: #c9b8ac;
  font-family: var(--font-d);
  font-size: 30px;
  letter-spacing: .04em;
}
.object-body { display: flex; flex-direction: column; min-width: 0; padding: 14px; }
.object-body small { order: 0; margin: 0 0 4px; color: var(--brand-dark); font-size: 10px; font-weight: 800; letter-spacing: .055em; text-transform: uppercase; }
.object-body strong { order: 1; overflow-wrap: anywhere; font-size: 17px; line-height: 1.15; }
/* Просроченные заявки на объекте — тем же приёмом, что и метка источника
   рядом, но в тревожном цвете: это не признак объекта, а долг по нему. */
.object-overdue { display: inline-flex; align-items: center; margin-left: 8px; padding: 2px 8px; border-radius: 999px; background: var(--danger-bg); color: var(--danger); font-size: 11px; font-weight: 700; }
.object-source { display: inline-flex; align-items: center; margin-left: 8px; padding: 2px 8px; border-radius: 999px; background: rgba(255, 220, 120, 0.18); color: #b25d00; font-size: 11px; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; }
.object-body > span:not(.object-card-action) { order: 2; display: -webkit-box; margin-top: 6px; overflow: hidden; color: var(--muted); font-size: 13px; line-height: 1.35; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.object-card-action { order: 3; display: inline-flex; align-items: center; gap: 6px; margin-top: auto; padding-top: 9px; color: var(--ink); font-size: 12px; font-weight: 750; }
.object-card-action b { color: var(--brand); font-size: 16px; }
.object-distance { position: absolute; top: 10px; right: 10px; padding: 4px 7px; border-radius: 999px; background: rgba(255,255,255,.92); box-shadow: 0 2px 8px rgba(20,23,28,.1); }
.object-chevron { margin-left: auto; color: var(--muted); font-size: 26px; }

.map-panel { position: relative; display: block; min-height: 520px; margin-bottom: 12px; overflow: hidden; border: 1px solid var(--border); border-radius: 20px; background: #eee; }
.map-selection { left: 12px; right: 12px; bottom: 12px; padding: 14px 44px 14px 14px; border-radius: 18px; }
.map-selection > div { flex-wrap: wrap; }
.map-selection a { flex: 1 1 92px; }

@media (max-width: 520px) {
  .page { padding: 12px; padding-left: max(12px, env(safe-area-inset-left)); padding-right: max(12px, env(safe-area-inset-right)); }
  .directory-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; }
  .directory-title p, .directory-head .archive-link { display: none; }
  .directory-admin-actions { margin: 0; }
  .directory-head .add-object-button { flex: 0 0 44px; margin: 0; border-radius: 13px; }
  .view-switch { width: 100%; }
  .view-switch-btn { flex: 1; }
  .directory-panel { padding: 10px; border-radius: 16px; }
  .list-meta { display: grid; grid-template-columns: 1fr auto; }
  .last-sync { display: none; }
  .object { grid-template-columns: 96px minmax(0, 1fr); min-height: 124px; }
  .object-thumb, .object-cover-placeholder { min-height: 124px; }
  .object-body { padding: 12px; }
  .object-body strong { font-size: 16px; }
  .map-panel { min-height: 40dvh; height: min(420px, 40dvh); border-radius: 16px; }
}

@media (max-width: 350px) {
  .directory-panel { padding: 8px; }
  .object { grid-template-columns: 82px minmax(0, 1fr); }
  .object-body { padding: 10px; }
  .object-card-action { font-size: 11px; }
  .sort-button { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
}

@media (min-width: 860px) {
  .map-panel { height: min(620px, 62vh); }
  .object-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .object { grid-template-columns: 106px minmax(0, 1fr); }
}

@media (max-width: 620px) {
  .expense-summary { grid-template-columns: 1fr 1fr; }
}

.expense-adjustment-history { margin-top: 12px; padding: 14px 16px; border: 1px solid var(--border); border-radius: 14px; background: #fff; }
.expense-adjustment-history > strong { display: block; margin-bottom: 6px; }
.expense-adjustment-history p { display: grid; grid-template-columns: 1fr auto; gap: 2px 12px; margin: 0; padding: 8px 0; border-top: 1px solid var(--border); }
.expense-adjustment-history p span { font-size: 13px; }.expense-adjustment-history p small { grid-column: 1 / -1; color: var(--muted); }
.receipt-edit { grid-column: 1 / -1; padding: 10px; border: 1px solid var(--border); border-radius: 11px; }
.receipt-edit summary { cursor: pointer; color: var(--brand-dark); font-weight: 700; }
.receipt-edit form { display: grid; grid-template-columns: 110px 150px 1fr; gap: 8px; margin-top: 8px; }
.receipt-edit textarea { grid-column: 1 / -1; width: 100%; padding: 9px; border: 1px solid var(--border); border-radius: 9px; font: inherit; }
.registry-filters { display: grid; grid-template-columns: repeat(5, minmax(120px, 1fr)) auto auto; align-items: end; gap: 8px; margin-bottom: 14px; padding: 12px; border: 1px solid var(--border); border-radius: 14px; background: #fff; }
.registry-filters label { margin: 0; }.registry-filters input,.registry-filters select { margin-top: 3px; }.registry-filters a { display: inline-flex; align-items: center; min-height: 48px; color: var(--muted); }
@media (max-width: 760px) { .registry-filters { grid-template-columns: 1fr 1fr; }.registry-filters label:nth-child(n+3) { grid-column: 1 / -1; }.receipt-edit form { grid-template-columns: 1fr; }.receipt-edit textarea { grid-column: 1; } }
@media print { .registry-filters { display: none !important; } }

.asset-search{display:grid;grid-template-columns:minmax(0,1fr) 220px auto;gap:8px;margin-bottom:16px}.asset-search input,.asset-search select{margin:0}.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:11px}.asset-card{display:grid;grid-template-columns:52px minmax(0,1fr);gap:12px;padding:15px;border:1px solid var(--border);border-radius:16px;background:#fff;color:var(--ink);text-decoration:none}.asset-symbol{display:grid;place-items:center;width:52px;height:52px;border-radius:14px;background:var(--panel-hover);color:var(--brand-dark)}.asset-card>span:last-child{display:grid;min-width:0}.asset-card small{color:var(--muted);font-size:10px}.asset-card strong{overflow-wrap:anywhere}.asset-card span span{color:var(--muted);font-size:12px}.asset-card em{margin-top:6px;color:var(--muted);font-size:12px;font-style:normal}.asset-status{display:inline-flex;width:fit-content;margin-top:7px;padding:4px 8px;border-radius:999px;background:#eee;color:var(--muted);font-size:10px;font-weight:800}.asset-status.status-warehouse{background:var(--ok-bg);color:var(--ok)}.asset-status.status-issued{background:var(--work-soft);color:var(--work)}.asset-status.status-service{background:var(--warn-soft);color:var(--warn)}.asset-detail-head{margin:10px 0 18px}.asset-detail-head h1{margin:6px 0 2px}.asset-detail-head p{margin:0;color:var(--muted)}.asset-facts{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;overflow:hidden;border:1px solid var(--border);border-radius:16px;background:var(--border)}.asset-facts div{padding:14px;background:#fff}.asset-facts span,.asset-facts strong{display:block}.asset-facts span{color:var(--muted);font-size:11px}.asset-history{margin-top:16px;padding:18px;border:1px solid var(--border);border-radius:17px;background:#fff}.asset-history h2{margin:0 0 8px}.asset-history article{padding:10px 0;border-top:1px solid var(--border)}.asset-history article strong,.asset-history article span{display:block}.asset-history article span{color:var(--muted);font-size:11px}.asset-history article p{margin:4px 0 0}
@media(max-width:620px){.asset-search{grid-template-columns:1fr}.asset-grid{grid-template-columns:1fr}.asset-facts{grid-template-columns:1fr 1fr}}

.notification-action{position:relative}.notification-action>span{position:absolute;top:1px;right:1px;min-width:17px;height:17px;padding:0 4px;border-radius:9px;background:var(--brand);color:#fff;font-size:10px;line-height:17px;text-align:center}.asset-head-actions,.inline-actions{display:flex;align-items:center;gap:8px}.asset-thumb{width:52px;height:52px;border-radius:14px;object-fit:cover}.asset-identity{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:18px;margin:10px 0 18px}.asset-identity .asset-detail-head{margin:0}.asset-photo{display:block;width:120px;height:120px;border-radius:18px;object-fit:cover}.asset-qr{display:grid;justify-items:center;color:var(--muted);font-size:10px}.asset-qr img{width:94px;height:94px}.notification-list{display:grid;gap:8px}.notification-item{display:grid;gap:3px;padding:15px 17px;border:1px solid var(--border);border-radius:14px;background:#fff;color:var(--ink);text-decoration:none}.notification-item.is-unread{border-left:4px solid var(--brand);background:var(--panel-hover)}.notification-item span,.notification-item small{color:var(--muted)}.notification-item small{font-size:11px}.overdue-card .asset-symbol{background:var(--warn-soft);color:#a33b17;font-weight:900}.role-form{display:flex;gap:6px}.role-form select{min-height:40px;margin:0}.role-form button{min-height:40px}
.custom-select{position:relative;margin:0}.custom-select>summary{display:flex;align-items:center;justify-content:space-between;min-height:48px;padding:10px 14px;border:1px solid var(--border);border-radius:12px;background:#fff;cursor:pointer;list-style:none}.custom-select>summary::-webkit-details-marker{display:none}.custom-select>summary:after{content:"⌄";font-size:18px}.custom-select[open]>summary{border-color:var(--brand);box-shadow:0 0 0 3px rgba(11,92,83,.12)}.custom-select>div{position:absolute;z-index:50;top:calc(100% + 6px);left:0;right:0;overflow:hidden;padding:6px;border:1px solid var(--border);border-radius:13px;background:#fff;box-shadow:0 14px 36px rgba(20,23,28,.18)}.custom-select label{display:block;margin:0;cursor:pointer}.custom-select input{position:absolute;opacity:0;pointer-events:none}.custom-select label span{display:block;padding:10px 12px;border-radius:8px}.custom-select label:hover span,.custom-select input:checked+span{background:var(--panel-hover);color:var(--brand-dark);font-weight:700}.import-steps{display:grid;gap:8px;padding-left:22px}.import-errors{margin:14px 0;padding:14px;border:1px solid #efb3a1;border-radius:12px;background:#fff3ef}.import-errors p{margin:5px 0}.qr-label-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.qr-label{display:grid;grid-template-columns:92px minmax(0,1fr);align-items:center;gap:10px;min-height:112px;padding:10px;border:1px dashed #888;background:#fff}.qr-label img{width:88px;height:88px}.qr-label strong,.qr-label span,.qr-label small{display:block;overflow-wrap:anywhere}.qr-label strong{font-size:16px}.qr-label span{font-size:12px}.qr-label small{color:var(--muted);font-size:9px}
@media(max-width:620px){.asset-head-actions{align-items:stretch;flex-direction:column}.asset-identity{grid-template-columns:84px minmax(0,1fr)}.asset-photo{width:84px;height:84px}.asset-qr{grid-column:1/-1;grid-template-columns:auto auto;justify-content:start;align-items:center;gap:8px}.asset-qr img{width:72px;height:72px}.role-form{flex-wrap:wrap}}
@media(max-width:620px){.qr-label-grid{grid-template-columns:1fr}.asset-head-actions{display:grid;grid-template-columns:1fr 1fr;width:100%}}
@media print{.asset-label-page .topbar,.asset-label-page .no-print,.asset-label-page .flash,.asset-label-page .notif-banner,.asset-label-page .bottom-nav{display:none!important}.asset-label-page .page{max-width:none;padding:0}.qr-label-grid{grid-template-columns:repeat(3,1fr);gap:4mm}.qr-label{break-inside:avoid;min-height:32mm;padding:3mm;border-color:#555}}
.expense-note-error{border-color:var(--danger);background:var(--danger-bg)}.expense-note-error strong{color:var(--danger)}.expense-note-error form{margin-top:10px}

.topbar-menu{position:relative}.topbar-menu>summary{list-style:none;cursor:pointer}.topbar-menu>summary::-webkit-details-marker{display:none}.topbar-menu-panel{position:absolute;z-index:60;top:calc(100% + 8px);right:0;display:grid;min-width:230px;padding:10px;border:1px solid var(--border);border-radius:14px;background:#fff;box-shadow:0 14px 40px rgba(20,23,28,.18)}.topbar-menu-panel>strong{padding:8px 10px;color:var(--muted);font-size:12px}.topbar-menu-panel>a,.topbar-menu-panel button{display:flex;align-items:center;gap:8px;width:100%;min-height:44px;padding:8px 10px;border-radius:9px;color:var(--ink);text-align:left;text-decoration:none;font-size:13px}.topbar-menu-panel>a:hover{background:var(--panel-hover)}.topbar-menu-panel form{margin:3px 0 0;padding-top:3px;border-top:1px solid var(--border)}.topbar-menu-panel form button{color:var(--danger)}

/* file-field: стилизованный input[type=file] */
.file-field{display:grid;gap:4px;margin:0}.file-field input[type=file]{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;pointer-events:none}.file-field-ui{display:flex;align-items:center;gap:10px;min-height:48px;padding:0 14px;border:1px solid var(--border);border-radius:12px;background:#fff;cursor:pointer;transition:border-color .15s,box-shadow .15s}.file-field-ui:hover{border-color:var(--brand)}.file-field input[type=file]:focus-visible+.file-field-ui,.file-field input[type=file]:focus+.file-field-ui{border-color:var(--brand);box-shadow:0 0 0 3px rgba(11,92,83,.12)}.file-field-button{display:inline-flex;align-items:center;padding:0 16px;min-height:34px;border-radius:9px;background:var(--brand);color:#fff;font-size:14px;font-weight:700;white-space:nowrap}.file-field-value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:13px;min-width:0}.file-field-label{display:block;font-size:13px;font-weight:700;margin-bottom:2px}.file-field small.field-help{grid-column:1/-1;margin-top:2px}

/* task-steps: шаговый индикатор */
.task-steps{display:flex;gap:0;margin:12px 0 0;padding:0;list-style:none}.task-steps li{display:flex;flex-direction:column;align-items:center;flex:1;position:relative;text-align:center;min-width:0}.task-steps li+li:before{content:"";position:absolute;top:16px;left:-50%;right:50%;height:3px;background:var(--line);z-index:0}.task-steps li.is-done+li:before,.task-steps li.is-done:before{background:var(--brand)}.task-step-dot{position:relative;z-index:1;display:block;width:32px;height:32px;border-radius:50%;border:3px solid var(--line);background:#fff;transition:background .15s,border-color .15s}.task-steps li.is-done .task-step-dot{background:var(--brand);border-color:var(--brand)}.task-steps li.is-current .task-step-dot{border-color:var(--brand);background:#fff;box-shadow:0 0 0 4px rgba(11,92,83,.14)}.task-step-label{display:block;margin-top:6px;font-size:12px;font-weight:700;color:var(--muted);white-space:nowrap}.task-steps li.is-done .task-step-label{color:var(--brand-dark)}.task-steps li.is-current .task-step-label{color:var(--brand)}.task-step-time{display:block;font-size:10px;color:var(--muted);margin-top:2px}.task-status-card .ticket-primary-action{margin-top:10px}.task-status-card .ticket-primary-action button{width:100%}.task-side-states{margin-top:10px;padding:10px;border:1px solid var(--border);border-radius:12px;background:#fff}.task-side-states summary{cursor:pointer;font-size:13px;color:var(--muted);font-weight:700}.task-side-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-top:8px}.task-side-buttons form{margin:0}.task-side-buttons button{width:100%;min-height:40px;font-size:13px}.status-side{background:var(--panel-hover);color:var(--muted);font-size:12px;font-weight:700}

/* === Анимации шагов статуса (фишка #2) === */

/* Шаг появляется с подскоком */
@keyframes step-bounce {
  0% { transform: scale(0); }
  50% { transform: scale(1.2); }
  70% { transform: scale(0.9); }
  100% { transform: scale(1); }
}

/* Линия между шагами заполняется слева */
@keyframes step-line-fill {
  from { background-position: 100% 0; }
  to { background-position: 0 0; }
}

/* Пульсация текущего шага */
@keyframes step-current-pulse {
  0%, 100% { box-shadow: 0 0 0 4px rgba(11,92,83,.14); }
  50% { box-shadow: 0 0 0 8px rgba(11,92,83,.08); }
}

/* Анимация появления бейджа статуса */
@keyframes status-pop {
  0% { transform: scale(0.8); opacity: 0; }
  60% { transform: scale(1.05); }
  100% { transform: scale(1); opacity: 1; }
}

/* Рисование галочки */
@keyframes checkmark-draw {
  to { stroke-dashoffset: 0; }
}

/* Вспышка на кнопке при клике */
@keyframes button-ripple {
  to { transform: scale(4); opacity: 0; }
}

/* Появление карточки статуса */
@keyframes card-slide-in {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Применяем анимации — только при .animate-status (после перехода статуса) */

/* Карточка хода работы при загрузке */
.task-status-card {
  animation: card-slide-in 0.35s ease-out both;
}

/* Каждый шаг появляется последовательно — только при смене статуса */
.task-steps.animate-status li {
  animation: card-slide-in 0.3s ease-out both;
}
.task-steps.animate-status li:nth-child(1) { animation-delay: 0.05s; }
.task-steps.animate-status li:nth-child(2) { animation-delay: 0.12s; }
.task-steps.animate-status li:nth-child(3) { animation-delay: 0.19s; }
.task-steps.animate-status li:nth-child(4) { animation-delay: 0.26s; }

/* Точка выполненного шага — подскок, только при смене статуса */
.task-steps.animate-status li.is-done .task-step-dot {
  animation: step-bounce 0.4s ease-out both;
}
.task-steps.animate-status li.is-done:nth-child(1) .task-step-dot { animation-delay: 0.1s; }
.task-steps.animate-status li.is-done:nth-child(2) .task-step-dot { animation-delay: 0.2s; }
.task-steps.animate-status li.is-done:nth-child(3) .task-step-dot { animation-delay: 0.3s; }
.task-steps.animate-status li.is-done:nth-child(4) .task-step-dot { animation-delay: 0.4s; }

/* Линия между шагами — анимированное заполнение */
.task-steps li+li:before {
  background: linear-gradient(to right, var(--brand) 50%, var(--line) 50%);
  background-size: 200% 100%;
  background-position: 100% 0;
  transition: none;
}
.task-steps li.is-done+li:before,
.task-steps li.is-done:before {
  background-position: 0 0;
  animation: step-line-fill 0.4s ease-out both;
}

/* Текущий шаг — пульсация */
.task-steps li.is-current .task-step-dot {
  animation: step-current-pulse 2s ease-in-out infinite;
}

/* Галочка внутри точки выполненного шага */
.task-step-dot-check {
  display: none;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 16px;
  height: 16px;
}
.task-steps li.is-done .task-step-dot-check {
  display: block;
}
.task-step-dot-check svg {
  display: block;
  width: 16px;
  height: 16px;
}
.task-step-dot-check .checkmark-path {
  stroke: #fff;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
  fill: none;
  stroke-dasharray: 20;
  stroke-dashoffset: 20;
  animation: checkmark-draw 0.3s ease-out 0.3s forwards;
}

/* Бейдж статуса — появление */
.expense-detail-head .expense-status {
  animation: status-pop 0.3s ease-out both;
}

/* Кнопка "Взять в работу" — акцент */
.ticket-primary-action button {
  position: relative;
  overflow: hidden;
}
.ticket-primary-action button::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: rgba(255,255,255,.4);
  transform: translate(-50%, -50%) scale(0);
  pointer-events: none;
}
.ticket-primary-action button:active::after {
  animation: button-ripple 0.4s ease-out;
}

/* Бейдж "Критично" — пульсация */
.status-critical {
  animation: step-current-pulse 2s ease-in-out infinite;
}

/* ai-reco: блок рекомендации ИИ */
.ai-reco{border:1px solid var(--brand);border-left:4px solid var(--brand);background:linear-gradient(135deg,#fff 0%,var(--panel-2) 100%)}.ai-reco-tools{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}.ai-reco-tool{display:inline-flex;padding:4px 10px;border:1px solid var(--border);border-radius:999px;background:#fff;font-size:12px;font-weight:700;color:var(--brand-dark)}.ai-reco .field-help{margin-top:8px}

.tehzor-attachments{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:8px;margin-top:10px}.tehzor-attachments img{display:block;width:100%;height:104px;border-radius:11px;object-fit:cover;background:var(--panel-hover)}

.expense-summary a.is-active article{border-color:var(--brand);box-shadow:0 0 0 3px rgba(11,92,83,.12)}
.status-critical{background:var(--danger-bg);color:var(--danger)}
.status-recommended{background:var(--ok-bg);color:var(--ok)}
.ticket-primary-action{margin-top:16px}.ticket-primary-action button{width:100%}
.expense-note a,.expense-detail-head a,.archive-row a{color:var(--brand-dark);text-decoration-color:rgba(11,92,83,.4);text-underline-offset:2px}
.expense-summary a{color:inherit;text-decoration:none}.expense-summary a article{transition:border-color .15s,box-shadow .15s}
.muted a{color:var(--brand-dark)}
.expense-note a[href^="tel:"]{white-space:nowrap}
.status-routine{background:#eef1f5;color:#4a5568}
.object-tickets{display:grid;gap:8px;margin-top:10px}.object-tickets a{display:grid;gap:3px;padding:12px 14px;border:1px solid var(--border);border-radius:13px;color:var(--ink);text-decoration:none}.object-tickets a:hover{background:var(--panel-hover)}.object-tickets strong{overflow-wrap:anywhere;font-size:15px}.object-tickets span{color:var(--muted);font-size:12px}
.draft-blanks{margin-top:8px;padding:9px 12px;border-radius:11px;background:var(--danger-bg);color:var(--danger);font-size:13px;font-weight:700}

/* Columns follow however many cells a row actually has: the fixed repeat(6)
   this used to carry left two empty tracks on every four-column table. */
.admin-table{display:grid;gap:6px;margin-top:12px;overflow-x:auto}.admin-table-row{display:grid;grid-template-columns:minmax(140px,2fr);grid-auto-flow:column;grid-auto-columns:minmax(64px,1fr);align-items:center;gap:10px;padding:11px 13px;border:1px solid var(--border);border-radius:12px;background:#fff}.admin-table-row>div{min-width:0;overflow-wrap:anywhere;font-size:14px}.admin-table-row strong{display:block;font-size:15px}.admin-table-row span{display:block;color:var(--muted);font-size:12px}.admin-table-header{border:0;background:transparent;padding:0 13px;color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase}
@media(max-width:720px){.admin-table-row{grid-template-columns:1fr 1fr;grid-auto-flow:row;gap:4px 10px}.admin-table-header{display:none}.admin-table-row>div:not(:first-child):before{content:attr(data-label) ": ";color:var(--muted);font-size:12px}.admin-table-row>div:first-child{grid-column:1/-1;margin-bottom:4px}}

/* ---------- Bottom navigation (phone) ---------- */

.topbar-sections { display: flex; align-items: center; gap: 4px; }
.bottom-nav a { position: relative; display: grid; justify-items: center; align-content: center; gap: 3px; min-height: 52px; padding: 4px 2px; border-radius: 12px; color: var(--muted); text-decoration: none; }
.bottom-nav a span { font-size: 10px; font-weight: 700; }
.bottom-nav a.is-active { color: var(--brand-dark); background: var(--panel-hover); }
.bottom-nav a:active { background: var(--panel-hover); }
.bottom-nav a i { position: absolute; top: 2px; right: calc(50% - 23px); min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--brand); color: #fff; font: 700 9px/16px var(--font-d); font-style: normal; text-align: center; }
/* Object marker — the bar's edge runs around it instead of behind it.
   The circle is filled with the bar's own colour and wrapped in a ring of the
   page background. That ring breaks the bar's straight top border, so the
   border reads as detouring around the circle — a notch. The previous version
   was a transparent outline floating over the page, which is why the content
   underneath showed through it. */
.nav-object-marker {
  display: flex !important;
  align-items: center;
  justify-content: center;
  position: relative;
  top: -20px;
  z-index: 5;
  margin: 0 10px;
  background: none !important;
}
.nav-object-marker::before {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid var(--border);
  box-shadow: 0 0 0 5px var(--bg);
  z-index: 0;
  transition: border-color .15s, background .15s;
}
.nav-object-marker.is-active::before {
  border-color: var(--brand);
}
.nav-object-marker:active::before {
  background: var(--panel-hover);
}
.nav-object-marker.is-active svg {
  color: var(--brand-dark);
}
.nav-object-marker svg {
  position: relative;
  z-index: 1;
  color: var(--brand);
  width: 24px; height: 24px;
}
body.has-bottom-nav { padding-bottom: calc(90px + env(safe-area-inset-bottom)); }
@media (max-width: 899px) { .topbar-sections { display: none; } .brand img { width: 150px; } }
@media (min-width: 900px) { .bottom-nav { display: none; } body.has-bottom-nav { padding-bottom: env(safe-area-inset-bottom); } }

/* ---------- Forecast accuracy ---------- */

.prediction-rate-forecast { margin: 0 0 12px; color: var(--muted); font-size: 14px; }
.prediction-rate-buttons { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin: 0; }
/* Outlined, not solid: three filled buttons here would shout louder than
   «Отправить официальный ответ», which is the page's real primary action. All
   three look identical on purpose — a prettier «Точно» would bias the answer. */
.prediction-rate-buttons button { width: 100%; min-height: 54px; padding: 8px 4px; border: 1.5px solid var(--brand); background: #fff; color: var(--brand-dark); font-size: 15px; }
.prediction-rate-buttons button:active { background: var(--panel-hover); }
.prediction-rate-done { margin: 0 0 4px !important; color: var(--ink) !important; }
.prediction-rate-change { margin-top: 14px; }
.prediction-rate-change > summary { color: var(--muted); font: 650 13px var(--font-d); cursor: pointer; }
.prediction-rate-change > form { margin-top: 8px; }
.prediction-rate .expense-form input[type="text"] { width: 100%; min-height: 48px; margin-top: 4px; padding: 10px 13px; border: 1px solid var(--border); border-radius: 10px; font: inherit; }

/* ---------- Collapsible intake recommendation ---------- */

.ai-reco > summary { display: flex; align-items: center; gap: 8px; list-style: none; cursor: pointer; }
.ai-reco > summary::-webkit-details-marker { display: none; }
.ai-reco > summary::after { content: "▾"; margin-left: auto; color: var(--muted); }
.ai-reco[open] > summary::after { content: "▴"; }
.ai-reco-count { color: var(--muted); font-size: 12px; font-weight: 650; }
.ai-reco-forecast { margin: 10px 0 0; }

/* ---------- Time correction next to the measurement ---------- */

.task-time-fix { margin-top: 12px; }
.task-time-fix > summary { color: var(--muted); font: 650 13px var(--font-d); cursor: pointer; }
.task-time-fix input { width: 100%; min-height: 46px; margin-top: 4px; padding: 9px 12px; border: 1px solid var(--border); border-radius: 10px; font: inherit; }

/* ---------- A Tehzor photo that did not arrive ---------- */

.tehzor-attachment.is-broken { display: grid; place-items: center; min-height: 104px; padding: 10px; border: 1px dashed var(--border); border-radius: 11px; background: var(--bg); color: var(--muted); font-size: 12px; text-align: center; text-decoration: none; }

/* ---------- Analytics ---------- */

.stat-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 9px; margin: 14px 0; }
.stat-tile { display: grid; gap: 2px; padding: 15px 17px; border: 1px solid var(--border); border-radius: 15px; background: #fff; }
.stat-tile strong { font: 700 28px var(--font-d); }
.stat-tile span { color: var(--muted); font-size: 12px; }
.stat-tile.is-warn { border-color: #ecd39a; background: var(--warn-bg); }
.stat-tile.is-warn strong { color: var(--warn); }
.stat-tile.is-alarm { border-color: #c5ddd8; background: var(--danger-bg); }
.stat-tile.is-alarm strong { color: var(--danger); }

.analytics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 12px; }
.chart-card { margin-top: 12px; padding: 18px; border: 1px solid var(--border); border-radius: 17px; background: #fff; }
.analytics-grid .chart-card { margin-top: 0; }
.chart-card h2 { margin: 0 0 12px; font-size: 18px; }
.chart-card > p.muted { margin: 12px 0 0; font-size: 13px; }

.donut-block { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.donut { flex: 0 0 138px; width: 138px; height: 138px; transform: rotate(-90deg); }
.donut-total { transform: rotate(90deg); transform-origin: 21px 21px; fill: var(--ink); font: 700 7px var(--font-d); text-anchor: middle; }
.donut-legend { flex: 1 1 170px; display: grid; gap: 7px; margin: 0; padding: 0; list-style: none; }
.donut-legend li { display: grid; grid-template-columns: 11px minmax(0, 1fr) auto auto; align-items: center; gap: 8px; font-size: 13px; }
.donut-dot { width: 11px; height: 11px; border-radius: 50%; }
.donut-legend strong { font-size: 14px; }
.donut-legend em { min-width: 38px; color: var(--muted); font-size: 12px; font-style: normal; text-align: right; }

.week-bars { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; align-items: end; gap: 6px; height: 168px; }
.week-bar { display: grid; grid-template-rows: 18px minmax(0, 1fr) 18px; justify-items: center; height: 100%; }
.week-bar-count { color: var(--muted); font-size: 11px; font-weight: 700; }
.week-bar-fill { align-self: end; width: 100%; min-height: 2px; border-radius: 7px 7px 0 0; background: var(--brand); }
.week-bar-label { color: var(--muted); font-size: 10px; }

.object-bars { display: grid; gap: 4px; }
.object-bar { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 12px; padding: 10px 12px; border-radius: 12px; color: var(--ink); text-decoration: none; }
.object-bar:hover { background: var(--panel-hover); }
.object-bar-name { overflow-wrap: anywhere; font-size: 14px; font-weight: 700; }
.object-bar-value { font-size: 14px; font-weight: 700; white-space: nowrap; }
.object-bar-value em { color: var(--muted); font-size: 12px; font-style: normal; font-weight: 600; }
.object-bar-track { grid-column: 1 / -1; height: 8px; border-radius: 5px; background: var(--panel-2); }
.object-bar-fill { display: block; height: 100%; min-width: 4px; border-radius: 5px; background: var(--brand); }
.object-bar-note { grid-column: 1 / -1; color: var(--muted); font-size: 11px; }

.miss-head { margin: 18px 0 8px; font-size: 15px; }
.miss-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.miss-list li { padding: 11px 13px; border: 1px solid var(--border); border-radius: 12px; }
.miss-list li > span { margin-left: 8px; color: var(--muted); font-size: 12px; }
.miss-list li p { margin: 5px 0 0; font-size: 13px; }

/* ── Analytics extras ── */
.analytics-subhead { margin: 18px 0 10px; font-size: 14px; font-weight: 600; }
.analytics-subhead:first-of-type { margin-top: 0; }

.mini-bars { display: grid; gap: 6px; margin: 0; }
.mini-bar { display: grid; grid-template-columns: 90px 1fr 40px; align-items: center; gap: 8px; font-size: 13px; }
.mini-bar-label { color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mini-bar-track { height: 22px; border-radius: 11px; background: var(--panel-2); overflow: hidden; }
.mini-bar-fill { display: block; height: 100%; border-radius: 11px; background: var(--brand); min-width: 4px; }
.mini-bar-value { font-weight: 700; text-align: right; }

/* ── KPI tiles ── */
.kpi-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 9px; margin: 14px 0; }
.kpi-tile { display: grid; gap: 2px; padding: 16px 17px; border: 1px solid var(--border); border-radius: 15px; background: #fff; align-content: start; }
.kpi-tile strong { font: 700 28px var(--font-d); margin-top: 2px; }
.kpi-tile > span:last-child { color: var(--muted); font-size: 12px; }
.kpi-tile.is-warn { border-color: #ecd39a; background: var(--warn-bg); }
.kpi-tile.is-warn strong { color: var(--warn); }
.kpi-tile.is-alarm { border-color: #c5ddd8; background: var(--danger-bg); }
.kpi-tile.is-alarm strong { color: var(--danger); }
.kpi-icon { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 10px; color: #fff; }
.kpi-icon-total { background: var(--work); }
.kpi-icon-progress { background: var(--warn); }
.kpi-icon-done { background: var(--review); }
.kpi-icon-time { background: #5b4b9e; }
.kpi-icon-overdue { background: var(--crit); }
.kpi-icon-ai { background: var(--muted); }

/* ── Employee load bars ── */
.tech-bars { display: grid; gap: 6px; margin-top: 12px; }
.tech-bar-row { display: grid; grid-template-columns: 36px 1fr 45px; grid-template-rows: auto auto; gap: 2px 10px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 13px; background: #fff; }
.tech-avatar { grid-row: 1 / 3; display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; background: var(--brand); color: #fff; font-weight: 800; font-size: 15px; }
.tech-bar-info { min-width: 0; }
.tech-bar-name { display: block; overflow-wrap: anywhere; font-size: 14px; }
.tech-bar-meta { display: block; color: var(--muted); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tech-bar-meta .low-data { color: var(--warn); font-style: normal; }
.tech-bar-track { grid-column: 1 / -1; height: 8px; border-radius: 5px; background: var(--panel-2); }
.tech-bar-fill { display: block; height: 100%; min-width: 4px; border-radius: 5px; background: var(--brand); }
.tech-bar-value { grid-column: 3; grid-row: 1; align-self: center; font-weight: 700; font-size: 15px; text-align: right; }

/* ── Stacked time chart ── */
.stacked-week-chart { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; align-items: end; gap: 5px; height: 170px; margin-top: 10px; }
.stacked-week-col { display: grid; grid-template-rows: 18px 1fr 18px; justify-items: center; height: 100%; }
.stacked-week-meta strong { color: var(--muted); font-size: 11px; font-weight: 700; }
.stacked-week-bars { align-self: end; display: flex; flex-direction: column-reverse; width: 100%; min-height: 2px; border-radius: 6px 6px 0 0; overflow: hidden; }
.stacked-bar { width: 100%; }
.work-bar { background: var(--brand-dark); }
.travel-bar { background: var(--warn); }
.empty-bar { background: var(--panel-2); }
.stacked-week-label { color: var(--muted); font-size: 10px; white-space: nowrap; }
.stacked-legend { display: flex; gap: 14px; margin: 10px 0 0; font-size: 12px; color: var(--muted); }
.legend-dot { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 5px; vertical-align: middle; }

.time-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 9px; margin-top: 14px; }
.time-summary-stat { padding: 12px; border-radius: 12px; background: var(--panel-2); text-align: center; }
.time-summary-stat strong { display: block; font: 700 22px var(--font-d); }
.time-summary-stat span { display: block; color: var(--muted); font-size: 11px; margin-top: 3px; }

/* ── Empty state ── */
.empty-state { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 36px 20px; color: var(--muted); text-align: center; }
.empty-state p { margin: 0; }

/* ── File preview (фишка #4) ── */
.file-preview {
  display: flex; align-items: center; gap: 10px;
  margin-top: 8px; padding: 6px;
  border: 1px solid var(--border); border-radius: 10px;
  background: var(--panel-2);
}
.file-preview[hidden] { display: none; }
.file-preview img {
  width: 56px; height: 56px; border-radius: 8px;
  object-fit: cover;
}
.file-preview-clear {
  margin-left: auto;
  width: 28px; height: 28px; border: none; border-radius: 50%;
  background: #eee; color: var(--muted); font-size: 18px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background 0.15s;
}
.file-preview-clear:hover { background: #ddd; color: var(--ink); }

/* ── Upload progress overlay (фишка #4) ── */
.upload-progress {
  position: fixed; inset: 0; z-index: 10000;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,253,251,0.92);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.upload-progress[hidden] { display: none; }
.upload-progress-inner {
  text-align: center; padding: 32px;
}
.upload-progress-spin {
  width: 40px; height: 40px; margin: 0 auto 16px;
  border: 3px solid var(--line); border-top-color: var(--brand-dark, var(--ink));
  border-radius: 50%;
  animation: upload-spin 0.7s linear infinite;
}
@keyframes upload-spin {
  to { transform: rotate(360deg); }
}
.upload-progress-inner strong {
  display: block; font-size: 17px; margin-bottom: 4px;
}
.upload-progress-inner span {
  display: block; color: var(--muted); font-size: 13px; margin-bottom: 16px;
}
.upload-progress-track {
  width: 180px; height: 4px; margin: 0 auto;
  border-radius: 4px; background: var(--line); overflow: hidden;
}
.upload-progress-bar {
  height: 100%; width: 0%;
  border-radius: 4px; background: var(--brand-dark, var(--ink));
  transition: width 0.3s ease;
}

/* ── Push notification banner (фишка #1) ─────────────────────────────────── */
.push-banner {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin: 0 0 16px; padding: 12px 16px;
  border-radius: 14px; background: var(--work-soft); color: var(--work);
  font-size: 14px;
}
.push-banner span { flex: 1; }
.push-btn { flex-shrink: 0; min-height: 38px; padding: 7px 14px; font-size: 13px; }
.push-btn.is-active { opacity: 0.6; cursor: default; }

/* ── Pull-to-refresh indicator (фишка #6) ────────────────────────────────── */
.pull-indicator {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 12px 0 4px; font-size: 14px; color: var(--muted);
  pointer-events: none; user-select: none;
  will-change: transform, opacity;
  transition: opacity 0.15s ease, transform 0.15s ease;
}
.pull-indicator[hidden] { display: none; }
.pull-indicator.is-refreshing { opacity: 1 !important; }
.pull-indicator-spinner {
  width: 20px; height: 20px;
  border: 2px solid #b9c0ca; border-top-color: var(--brand-dark, var(--ink));
  border-radius: 50%;
  animation: pull-spin 0.6s linear infinite;
}
@keyframes pull-spin {
  to { transform: rotate(360deg); }
}

/* Toggle slider for notification settings */
.toggle-row{display:flex;align-items:center;gap:12px;margin:10px 0;cursor:pointer}.toggle-row input[type=checkbox]{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;pointer-events:none}.toggle-slider{position:relative;display:block;width:44px;height:26px;border-radius:13px;background:#b9c0ca;transition:background .15s;flex-shrink:0}.toggle-slider:after{content:'';position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;transition:transform .15s}.toggle-row input:checked+.toggle-slider{background:var(--brand)}.toggle-row input:checked+.toggle-slider:after{transform:translateX(18px)}.toggle-row input:focus-visible+.toggle-slider{box-shadow:0 0 0 3px rgba(11,92,83,.18)}.account-card h2{margin-bottom:0}.account-card .toggle-row+.muted{margin-top:4px;font-size:12px}
#notif-categories{margin-top:6px;padding-left:4px;border-left:2px solid var(--border)}
.birthday-form{display:flex;flex-wrap:wrap;align-items:end;gap:12px;margin:10px 0}
.birthday-form label{display:grid;gap:4px;font-size:11px;color:var(--muted);font-weight:800}
.birthday-form select{min-height:42px;padding:8px 10px;border:1px solid var(--border);border-radius:10px}
.birthday-form .toggle-row{margin:0}
.birthday-upcoming-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}
.birthday-upcoming-list li{display:flex;justify-content:space-between;gap:10px;padding:10px 12px;border-radius:12px;background:var(--panel-2);font-size:13px}
.birthday-upcoming-list span{color:var(--muted);font-size:12px}
#notif-categories .toggle-row{margin:6px 0 6px 12px}
#notif-categories.is-disabled{opacity:.45;pointer-events:none}
#ticketList { will-change: transform; transition: transform 0.1s ease; }

/* ══════════════════════════════════════════════════════════════
   ANALYTICS — NEW LAYOUT (admin_analytics.html redesign)
   ══════════════════════════════════════════════════════════════ */

/* ── Back link ── */
.back-link { display: inline-flex; align-items: center; gap: 4px; margin-bottom: 6px; color: var(--muted); font-size: 13px; text-decoration: none; }
.back-link:hover { color: var(--ink); }

/* ── Header ── */
.admin-head h1 { margin: 0 0 4px; font-size: 24px; }
.analytics-subtitle { margin: 0; color: var(--muted); font-size: 13px; line-height: 1.5; }

/* ── KPI grid ── */
.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; margin: 16px 0; }
.kpi-card { display: flex; align-items: flex-start; gap: 12px; padding: 16px; border: 1px solid var(--border); border-radius: 15px; background: #fff; }
.kpi-card.kpi-card-total { border-color: #d0d9e8; }
.kpi-card.kpi-card-ok { border-color: #b5d6c0; }
.kpi-card.kpi-card-warn { border-color: #ecd39a; background: var(--warn-bg); }
.kpi-card.kpi-card-alarm { border-color: #c5ddd8; background: var(--danger-bg); }
.kpi-icon { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 36px; height: 36px; border-radius: 10px; color: #fff; }
.kpi-card-total .kpi-icon { background: var(--work); }
.kpi-card-warn .kpi-icon { background: var(--warn); }
.kpi-card-ok .kpi-icon { background: var(--review); }
.kpi-card-alarm .kpi-icon { background: var(--crit); }
.kpi-card:not(.kpi-card-total):not(.kpi-card-warn):not(.kpi-card-ok):not(.kpi-card-alarm) .kpi-icon { background: var(--muted); }
.kpi-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.kpi-value { font: 700 28px var(--font-d); line-height: 1; }
.kpi-value small { font-size: 14px; color: var(--muted); }
.kpi-label { color: var(--muted); font-size: 12px; line-height: 1.3; }

/* ── Analytics pair (two columns) ── */
.analytics-pair { display: flex; flex-wrap: wrap; gap: 12px; margin: 12px 0; }
.analytics-pair > .chart-card { flex: 1 1 320px; min-width: 0; margin-top: 0; }

/* ── Time stats block ── */
.time-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 9px; }
.time-stat-item { padding: 12px 14px; border: 1px solid var(--border); border-radius: 12px; background: var(--panel-2); }
.time-stat-value { display: block; font: 700 22px var(--font-d); line-height: 1; }
.time-stat-value small { font-size: 12px; color: var(--muted); }
.time-stat-label { display: block; color: var(--muted); font-size: 11px; margin-top: 3px; }

/* ── Employee tech cards grid ── */
.tech-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 10px; }
.tech-card { padding: 16px; border: 1px solid var(--border); border-radius: 15px; background: #fff; }
.tech-card-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.tech-card-avatar { width: 40px; height: 40px; border-radius: 50%; background: var(--brand, var(--ink)); color: #fff; font: 700 16px var(--font-d); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.tech-card-info { min-width: 0; }
.tech-card-name { display: block; font-size: 15px; overflow-wrap: anywhere; }
.tech-card-role { display: block; color: var(--muted); font-size: 11px; }

.tech-card-metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; margin-bottom: 10px; }
.tech-metric { text-align: center; }
.tech-metric-value { display: block; font: 700 18px var(--font-d); line-height: 1; }
.tech-metric-value small { font-size: 11px; color: var(--muted); }
.tech-metric-pct { color: var(--brand); }
.tech-metric-label { display: block; color: var(--muted); font-size: 10px; margin-top: 2px; }

.tech-card-times { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; font-size: 12px; color: var(--muted); }
.tech-card-times strong { color: var(--ink); }
.tech-card-bar { margin-top: 8px; }
.tech-card-bar-track { height: 6px; border-radius: 3px; background: var(--panel-2); overflow: hidden; }
.tech-card-bar-fill { height: 100%; min-width: 4px; border-radius: 3px; background: var(--brand); transition: width 0.4s ease; }
.tech-card-bar-label { display: block; margin-top: 3px; color: var(--muted); font-size: 10px; text-align: right; }

/* ── Dual bar chart (new + completed) ── */
.dual-bars { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; align-items: end; gap: 5px; height: 180px; margin: 10px 0; }
.dual-bar-col { display: grid; grid-template-rows: 18px 1fr 18px; justify-items: center; height: 100%; }
.dual-bars-inner { align-self: end; display: flex; flex-direction: column-reverse; gap: 2px; width: 100%; min-height: 2px; }
.dual-bar { width: 100%; min-height: 2px; border-radius: 4px 4px 0 0; }
.new-bar { background: var(--brand); }
.done-bar { background: var(--brand-dark); }
.dual-bar-label { color: var(--muted); font-size: 10px; white-space: nowrap; }
.dual-legend { display: flex; gap: 14px; margin: 8px 0 0; font-size: 12px; color: var(--muted); }
.legend-swatch { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 5px; vertical-align: middle; }

/* ── Object ranking rows ── */
.object-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 3px 12px; padding: 10px 12px; border-radius: 12px; color: var(--ink); text-decoration: none; }
.object-row:hover { background: var(--panel-hover); }
.object-row-name { overflow-wrap: anywhere; font-size: 14px; font-weight: 700; }
.object-row-value { font-size: 14px; font-weight: 700; white-space: nowrap; }
.object-row-value em { color: var(--muted); font-size: 12px; font-style: normal; font-weight: 600; }
.object-row-track { grid-column: 1 / -1; height: 8px; border-radius: 5px; background: var(--panel-2); }
.object-row-fill { display: block; height: 100%; min-width: 4px; border-radius: 5px; background: var(--brand); }

/* ── AI metrics bar ── */
.ai-metrics-bar { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 16px; }
.ai-metric-item { padding: 10px 14px; border: 1px solid var(--border); border-radius: 12px; background: var(--panel-2); text-align: center; }
.ai-metric-item strong { display: block; font: 700 24px var(--font-d); }
.ai-metric-item span { display: block; color: var(--muted); font-size: 11px; margin-top: 2px; }

/* ── Chart card h2 with icon ── */
.chart-card h2 { display: flex; align-items: center; gap: 6px; }

/* ── Muted text ── */
p.muted { color: var(--muted); font-size: 13px; }

/* ── Responsive: smaller screens ── */
@media (max-width: 600px) {
  .kpi-grid { grid-template-columns: repeat(2, 1fr); gap: 8px; }
  .kpi-card { padding: 12px; gap: 8px; }
  .kpi-value { font-size: 22px; }
  .tech-grid { grid-template-columns: 1fr; }
  .tech-card-metrics { grid-template-columns: repeat(2, 1fr); }
  .analytics-pair > .chart-card { flex-basis: 100%; }
  .time-stats { grid-template-columns: repeat(2, 1fr); }
  .admin-head h1 { font-size: 20px; }
}

/* Administrator Today: operational supervision rather than personal work. */
.admin-control-head p{max-width:560px}
.admin-control-focus{background:linear-gradient(135deg,#202834,#40556c)}
.admin-control-focus.is-clear{background:linear-gradient(135deg,#173c2d,#287b57)}
.admin-control-focus .work-focus-glow{animation:none;background:radial-gradient(circle,rgba(115,157,200,.42),transparent 67%)}
.admin-control-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:9px;margin-top:11px}
.admin-control-metrics>a{position:relative;display:grid;grid-template-columns:42px 1fr;grid-template-rows:auto auto;align-items:center;column-gap:10px;min-height:76px;padding:11px;border:1px solid var(--border);border-radius:18px;background:#fff;color:var(--ink);text-decoration:none}
.admin-control-metrics>a>span{grid-row:1/3;display:grid;place-items:center;width:42px;height:42px;border-radius:14px;background:var(--panel-2);color:#566475}
.admin-control-metrics>a>span.tone-alert{background:var(--accent-soft);color:var(--brand)}
.admin-control-metrics>a>span.tone-work{background:var(--work-soft);color:var(--work)}
.admin-control-metrics>a>span.tone-review{background:var(--warn-soft);color:var(--warn)}
.admin-control-metrics>a>span.tone-help{background:var(--plan-soft);color:var(--plan)}
.admin-control-metrics strong{align-self:end;font:700 20px var(--font-d)}
.admin-control-metrics small{align-self:start;color:var(--muted);font-size:10px;font-weight:750}
.admin-control-metrics em{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.admin-control-columns{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.admin-control-list{display:grid;gap:7px}
/* Было grid с жёсткими колонками «42px | 1fr | auto» — то есть сетка
   предполагала ровно три ребёнка: иконку, текст и стрелку. Четыре
   строки на /today иконку не выводят (просьбы о помощи, расходы,
   заявки на проверку), и текст у них попадал в первую колонку —
   42 пикселя. Замерено в браузере на 390px: «Проверить отчёт о
   выполнении» требует 151px, имя «Задохин Александр» — 94px, оба
   схлопывались до многоточия почти сразу. Баг ровно того же рода,
   что и у карточки заявки с неподгрузившимся фото.
   Flex не считает детей: две их или три — текст всё равно получает
   всё оставшееся место. */
.admin-control-row{display:flex;align-items:center;gap:10px;min-height:70px;padding:10px 12px;border:1px solid var(--border);border-radius:16px;background:#fff;color:var(--ink);text-decoration:none}
.admin-control-row>div{flex:1 1 auto;min-width:0}
.admin-control-row>.admin-control-row-icon{flex:0 0 42px}
.admin-control-row>svg{flex:0 0 auto}
.admin-control-row.is-critical{border-color:#edc2b3;background:#fff9f6}
.admin-control-row-icon,.admin-tech-avatar{display:grid;place-items:center;width:42px;height:42px;border-radius:14px;background:var(--accent-soft);color:var(--brand)}
.admin-tech-avatar{background:linear-gradient(145deg,#2c3745,#60758a);color:#fff;font:700 14px var(--font-d)}
.admin-control-row>div{display:grid;gap:2px;min-width:0}
.admin-control-row small,.admin-control-row p{overflow:hidden;margin:0;color:var(--muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}
/* Две строки вместо одной. Замерено в браузере на 390px: строка ППР
   «№91 · ППР - Отопление и тепловые системы - Проверка давления…» требует
   2257px при доступном 261px — видно 12% текста, и полезное («что делать»)
   стоит в самом конце, то есть не видно никогда. У техника на «Сегодня»
   таких строк два десятка подряд, и все начинаются одинаково. */
.admin-control-row strong{display:-webkit-box;overflow:hidden;font-size:12px;line-height:1.3;
  -webkit-box-orient:vertical;-webkit-line-clamp:2}
.admin-control-row>.icon{color:var(--muted)}
.admin-control-empty{display:flex;align-items:center;gap:11px;min-height:70px;padding:12px;border:1px solid #c8e2d4;border-radius:16px;background:#f7fcf9}
.admin-control-empty>span{display:grid;place-items:center;width:42px;height:42px;border-radius:14px;background:#e6f5ed;color:var(--ok);font-weight:900}
.admin-control-empty>div{display:grid;gap:2px}.admin-control-empty small{color:var(--muted);font-size:10px}
.admin-control-footer{max-width:720px}
.ui-bottom-sheet.is-sheet-fallback{position:fixed;z-index:90;right:0;bottom:0;left:0;max-height:85vh;overflow-y:auto}
.topbar-menu-panel>strong small{display:block;margin-top:3px;color:var(--muted);font-size:9px;font-weight:650}
@media(max-width:700px){
  .admin-control-metrics{display:flex;margin-inline:-16px;padding:0 16px 4px;overflow-x:auto;scroll-snap-type:x proximity;scrollbar-width:none}
  .admin-control-metrics::-webkit-scrollbar{display:none}
  .admin-control-metrics>a{flex:0 0 142px;scroll-snap-align:start}
  .admin-control-columns{grid-template-columns:1fr}
}

/*
 * UI TripleD interaction patterns, adapted for Jinja and vanilla JS.
 * Copyright (c) 2026 uitripled — MIT; see /THIRD_PARTY_NOTICES.md.
 */
[data-ui-tabs]{position:relative;isolation:isolate}
[data-ui-tabs] .ui-tabs-indicator{position:absolute;z-index:-1;left:0;top:0;width:var(--ui-tab-width,0);height:44px;border-radius:999px;background:var(--ink);transform:translateX(var(--ui-tab-x,0));transition:width .28s cubic-bezier(.2,.8,.2,1),transform .28s cubic-bezier(.2,.8,.2,1);pointer-events:none}
[data-ui-tabs] a,[data-ui-tabs] button{position:relative;z-index:1}
.section-tabs[data-ui-tabs] a.is-active{background:transparent}
[data-ui-stagger]>*{transform:translateY(10px)}
[data-ui-stagger].is-ui-visible>*{transform:none;transition:transform .38s cubic-bezier(.2,.8,.2,1)}
[data-ui-stagger].is-ui-visible>*:nth-child(2){transition-delay:.05s}
[data-ui-stagger].is-ui-visible>*:nth-child(3){transition-delay:.1s}
[data-ui-stagger].is-ui-visible>*:nth-child(4){transition-delay:.15s}
[data-ui-stagger].is-ui-visible>*:nth-child(5){transition-delay:.2s}
[data-ui-stagger].is-ui-visible>*:nth-child(n+6){transition-delay:.25s}
.notification-toolbar{margin-bottom:12px}
.notification-toolbar button{display:inline-flex;align-items:center;gap:7px;flex:none;min-height:44px;padding:8px 15px;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--ink);font:800 12px inherit;cursor:pointer}
.notification-toolbar button.is-active{border-color:transparent;background:transparent;color:#fff}
.notification-toolbar button span{display:grid;place-items:center;min-width:20px;height:20px;padding:0 5px;border-radius:99px;background:var(--panel-2);color:var(--ink);font-size:10px}
.notification-item{grid-template-columns:40px minmax(0,1fr) 22px;align-items:center;gap:11px;padding:13px 14px;transition:border-color .2s,box-shadow .2s,transform .2s}
.notification-item:hover{border-color:#d8c8be;box-shadow:0 8px 22px rgba(20,23,28,.08);transform:translateY(-1px)}
.notification-item.is-unread{border-left:1px solid var(--border);background:linear-gradient(105deg,#fff7f2,#fff 62%)}
/* Цвет плитки задаётся переменными, а не прямыми значениями: непрочитанное
   раньше перекрашивалось в оранжевый через !important и стирало тип события
   ровно у тех строк, где он нужнее всего. Теперь «новое» усиливает свой же
   оттенок, а не подменяет его. */
.notification-symbol{--nsym-bg:var(--panel-2);--nsym-ink:var(--muted);display:grid;place-items:center;width:40px;height:40px;border-radius:13px;background:var(--nsym-bg);color:var(--nsym-ink)!important}
.notification-symbol.tone-ticket{--nsym-bg:#e8f0fb;--nsym-ink:#2f6ab0}
.notification-symbol.tone-done{--nsym-bg:#e6f4ec;--nsym-ink:#2c7a51}
.notification-symbol.tone-alert{--nsym-bg:#fdeee6;--nsym-ink:var(--brand-dark)}
.notification-symbol.tone-money{--nsym-bg:#eaf3ea;--nsym-ink:#3f7d3f}
.notification-symbol.tone-asset{--nsym-bg:#efeafa;--nsym-ink:#5a49a8}
.notification-symbol.tone-help{--nsym-bg:#ffe9d9;--nsym-ink:#c2571b}
.notification-symbol.tone-people{--nsym-bg:#fdf0da;--nsym-ink:#9a6b16}
.notification-symbol.tone-digest{--nsym-bg:#eceff2;--nsym-ink:#4d5b68}
/* Сбой фоновой задачи или упавший сайт — единственный тип, который
   должен выделяться в ленте сам по себе. */
.notification-symbol.tone-danger{--nsym-bg:var(--danger-bg);--nsym-ink:var(--danger)}
.notification-item.is-unread .notification-symbol{box-shadow:inset 0 0 0 2px currentColor;animation:ui-bell-arrive .55s cubic-bezier(.2,.85,.25,1.2) both}
.notification-item.is-unread .notification-symbol:not([class*="tone-"]){--nsym-bg:#ffe4d8;--nsym-ink:var(--brand)}
.notification-copy{display:grid;gap:3px;min-width:0}
.notification-title{display:flex;align-items:center;gap:7px;color:var(--ink)!important}
.notification-title em{padding:3px 6px;border-radius:99px;background:var(--brand);color:#fff;font-size:9px;font-style:normal;font-weight:850}
.notification-arrow{color:var(--muted)!important}
.notification-filter-empty{display:grid;justify-items:center;gap:4px;padding:38px 20px;border:1px dashed var(--border);border-radius:17px;background:#fff;text-align:center}
.notification-filter-empty span{color:var(--muted);font-size:12px}
@keyframes ui-bell-arrive{0%{opacity:0;transform:scale(.65) rotate(-14deg)}65%{transform:scale(1.08) rotate(7deg)}100%{opacity:1;transform:none}}
@media(max-width:700px){.notification-head{align-items:flex-start}.notification-toolbar{margin-inline:-16px;padding:0 16px 4px;overflow-x:auto}.notification-item{min-height:72px;border-radius:16px}.notification-item:hover{transform:none}.section-tabs[data-ui-tabs] .ui-tabs-indicator{height:48px}}
@media(prefers-reduced-motion:reduce){[data-ui-tabs] .ui-tabs-indicator,[data-ui-stagger].is-ui-visible>*,.notification-item,.notification-item.is-unread .notification-symbol{animation:none!important;transition:none!important;transform:none!important}[data-ui-stagger]>*{opacity:1}}

.wizard-progress{display:grid;grid-template-columns:repeat(4,1fr);max-width:760px;margin:0 auto 14px;padding:5px;border:1px solid var(--border);border-radius:16px;background:#fff}
.wizard-progress button{position:relative;display:grid;justify-items:center;gap:4px;min-height:58px;padding:7px 4px;border:0;border-radius:12px;background:transparent;color:var(--muted);font:inherit;cursor:pointer}
.wizard-progress button span{display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:var(--panel-2);font-size:11px;font-weight:850;transition:transform .25s,background .25s,color .25s}
.wizard-progress button strong{font-size:10px}
.wizard-progress button.is-active{background:var(--accent-soft);color:var(--brand-dark)}
.wizard-progress button.is-active span{background:var(--brand);color:#fff;transform:scale(1.08)}
.wizard-progress button.is-done span{background:var(--ok);color:#fff}
.wizard-review{min-height:300px;background:linear-gradient(145deg,#fff,var(--panel-2))}
.wizard-review h2{margin:5px 0 15px;font-size:24px}
.wizard-review dl{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:0}
.wizard-review dl div{padding:12px;border:1px solid var(--border);border-radius:12px;background:#fff}
.wizard-review dt{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase}
.wizard-review dd{margin:3px 0 0;overflow-wrap:anywhere;font-size:13px;font-weight:700}
.wizard-review p{margin:14px 0 0;color:var(--muted);font-size:12px}
.ui-bottom-sheet{width:min(520px,calc(100% - 24px));margin:auto auto 0;padding:9px 20px calc(20px + env(safe-area-inset-bottom));border:0;border-radius:24px 24px 0 0;background:#fff;color:var(--ink);box-shadow:0 -18px 50px rgba(20,23,28,.2);transform:translateY(105%);opacity:0;transition:transform .34s cubic-bezier(.2,.8,.2,1),opacity .2s}
.ui-bottom-sheet[open]{transform:none;opacity:1}
.ui-bottom-sheet::backdrop{background:rgba(20,23,28,.48);backdrop-filter:blur(2px)}
.ui-bottom-sheet-handle{width:42px;height:5px;margin:0 auto 18px;border-radius:9px;background:#b9c0ca}
.ui-bottom-sheet-icon{display:grid;place-items:center;width:48px;height:48px;border-radius:15px;background:var(--accent-soft);color:var(--brand)}
.ui-bottom-sheet h2{margin:13px 0 5px}.ui-bottom-sheet p{margin:0;color:var(--muted)}.ui-bottom-sheet p strong{color:var(--ink)}
.ui-bottom-sheet-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:20px}.ui-bottom-sheet-actions button{min-height:50px}
body:has(.ui-bottom-sheet[open]){overflow:hidden}
@media(max-width:700px){.object-wizard .form-section{min-height:calc(100dvh - 310px);padding:17px}.wizard-progress{position:sticky;z-index:7;top:65px;margin-inline:-4px;box-shadow:0 7px 18px rgba(20,23,28,.07)}.wizard-progress button strong{font-size:9px}.wizard-review dl{grid-template-columns:1fr}.object-wizard .editor-actions{justify-content:stretch}.object-wizard .editor-actions>a{display:none}.object-wizard .editor-actions button{flex:1}.object-wizard .editor-actions .wizard-back{flex:0 0 94px}}
@media(prefers-reduced-motion:reduce){.wizard-progress button span,.ui-bottom-sheet{transition:none!important}}

/* Calm motion layer: feedback explains state; navigation itself does not jump. */
.ui-route-progress{position:fixed;z-index:10000;top:0;left:0;width:0;height:3px;background:linear-gradient(90deg,var(--brand),#4f9a8f);box-shadow:0 1px 7px rgba(11,92,83,.42);opacity:0;pointer-events:none}
.ui-route-loading .ui-route-progress{width:76%;opacity:1;transition:width .8s cubic-bezier(.15,.8,.2,1),opacity .12s}
.icon{transition:transform .25s cubic-bezier(.2,.8,.2,1),color .2s,stroke-width .2s}
.topbar-action{border-radius:12px;transition:color .2s,background .2s,transform .2s}
.topbar-action.is-active{color:var(--brand-dark);background:var(--accent-soft)}.topbar-action.is-active .icon{transform:scale(1.06)}
.topbar-action:hover{color:var(--brand-dark);background:var(--accent-soft);transform:translateY(-1px)}
.topbar-action:hover .icon{transform:scale(1.12)}
.topbar-menu[open]>summary .icon{transform:rotate(90deg)}
.notification-action:has(>span) .icon{animation:ui-bell-nudge 3.8s ease-in-out infinite;transform-origin:50% 15%}
@keyframes ui-bell-nudge{0%,84%,100%{transform:rotate(0)}88%{transform:rotate(12deg)}92%{transform:rotate(-10deg)}96%{transform:rotate(7deg)}}
.notification-action>span,.bottom-nav a i{animation:ui-badge-in .42s cubic-bezier(.2,.9,.25,1.25) both}
@keyframes ui-badge-in{from{opacity:0;transform:scale(.45)}to{opacity:1;transform:none}}
.bottom-nav a:active{opacity:.68;transform:none}
.bottom-nav a:active .icon{transform:none}
.nav-object-marker::before{transition:background .25s,border-color .25s,transform .28s cubic-bezier(.2,.9,.25,1.2),box-shadow .25s}
.nav-object-marker.is-active::before{background:linear-gradient(145deg,#fff,var(--accent-soft));border-color:var(--brand);box-shadow:0 0 0 5px var(--bg),0 8px 20px rgba(11,92,83,.2);transform:translate(-50%,-50%) scale(1.06)}
.nav-object-marker.is-active .icon{color:var(--brand);transform:translateY(-1px) scale(1.08)}
.today-panel,.dash-panel,.ticket-card,.expense-row,.object,.notification-item{transition:transform .22s cubic-bezier(.2,.8,.2,1),box-shadow .22s,border-color .22s}
.today-panel:hover,.dash-panel:hover,.ticket-card:hover,.expense-row:hover,.object:hover{border-color:var(--line);box-shadow:0 10px 26px rgba(20,23,28,.08);transform:translateY(-2px)}
.today-row .icon,.ticket-card .icon,.expense-row .icon{transition:transform .22s}
.today-row:hover .icon,.ticket-card:hover .icon,.expense-row:hover .icon{transform:translateX(3px)}
.today-panel-icon .icon,.dash-panel-icon .icon,.dash-kpi>span .icon{transform-origin:center}
.today-panel:hover .today-panel-icon .icon,.dash-panel:hover .dash-panel-icon .icon,.dash-kpi:hover>span .icon{animation:ui-icon-pop .38s cubic-bezier(.2,.9,.25,1.2)}
@keyframes ui-icon-pop{50%{transform:scale(1.2) rotate(-5deg)}}
.today-next-action::before{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 20%,rgba(255,255,255,.13) 45%,transparent 70%);transform:translateX(-110%);transition:transform .7s ease}
.today-next-action:hover::before{transform:translateX(110%)}
.today-next-action:hover>i .icon{transform:translateX(3px)}
button,.bottom-nav a,.topbar-action,.today-next-action,.today-row,.ticket-card,.expense-row,.object{position:relative}
@media(max-width:899px){.today-panel:hover,.dash-panel:hover,.ticket-card:hover,.expense-row:hover,.object:hover{transform:none;box-shadow:none}.topbar-action:hover{transform:none}.today-next-action:hover::before{transform:translateX(-110%)}}
@media(prefers-reduced-motion:reduce){.notification-action:has(>span) .icon,.notification-action>span,.bottom-nav a i,.today-panel:hover .today-panel-icon .icon,.dash-panel:hover .dash-panel-icon .icon,.dash-kpi:hover>span .icon{animation:none!important}.ui-route-progress{display:none}.icon,.topbar-action,.bottom-nav a,.bottom-nav a::after,.nav-object-marker::before,.today-panel,.dash-panel,.ticket-card,.expense-row,.object,.notification-item{transition:none!important}}

/* Service Plus 2.0: task-first mobile workspace. */
.bottom-nav-v2 a span,.bottom-nav-v2 button span{font-size:10px;font-weight:750}
.bottom-nav-v2 a i,.bottom-nav-v2 button i{position:absolute;top:1px;right:calc(50% - 26px);min-width:17px;height:17px;padding:0 4px;border-radius:9px;background:var(--brand);color:#fff;font:700 9px/17px var(--font-d);font-style:normal;text-align:center}
.bottom-nav-v2 a:active,.bottom-nav-v2 button:active{opacity:.68;transform:none}
.app-more-sheet{padding-inline:16px}.app-more-sheet>header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.app-more-sheet h2{margin:2px 0 0}.sheet-close-icon{display:grid;place-items:center;width:44px;height:44px;padding:0;border:0;border-radius:14px;background:var(--panel-2);color:var(--ink)}
.more-menu-grid{display:grid;gap:7px}.more-menu-grid>details{border:1px solid var(--border);border-radius:16px;background:#fff;overflow:hidden}.more-menu-grid>details>summary{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:11px;min-height:64px;padding:9px 11px;cursor:pointer;list-style:none}.more-menu-grid>details>summary::-webkit-details-marker{display:none}.more-menu-grid>details>summary>span{display:grid;place-items:center;width:44px;height:44px;border-radius:13px;background:var(--accent-soft);color:var(--brand)}.more-menu-grid>details>summary>div{display:grid;gap:2px}.more-menu-grid>details>summary strong{font-size:14px}.more-menu-grid>details>summary small{color:var(--muted);font-size:11px}.more-menu-grid>details>summary>.icon{color:var(--muted);transition:transform .15s}.more-menu-grid>details[open]>summary>.icon{transform:rotate(180deg)}.more-menu-group{display:grid;padding:0 11px 10px 66px}.more-menu-group a{padding:10px 0;border-top:1px solid var(--border);color:var(--ink);font-size:14px;text-decoration:none}.more-menu-grid>a{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:11px;min-height:64px;padding:9px 11px;border:1px solid var(--border);border-radius:16px;background:#fff;color:var(--ink);text-decoration:none}.more-menu-grid>a>span{display:grid;place-items:center;width:44px;height:44px;border-radius:13px;background:var(--accent-soft);color:var(--brand)}.more-menu-grid>a>div{display:grid;gap:2px}.more-menu-grid>a strong{font-size:14px}.more-menu-grid>a small{color:var(--muted);font-size:11px}.more-menu-grid>a>.icon{color:var(--muted)}
.more-sheet-account{display:grid;grid-template-columns:1fr auto;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.more-sheet-account>a,.more-sheet-account button{display:flex;align-items:center;justify-content:center;gap:7px;min-height:46px;padding:8px 12px;border:0;border-radius:13px;background:var(--panel-2);color:var(--ink);font:700 11px var(--font-d);text-decoration:none}.more-sheet-account form{margin:0}.more-sheet-account button{width:100%;color:var(--danger)}

/* Service Plus mobile navigation v2: the bottom bar is the only global phone
   navigation. Desktop keeps its compact top-right menu. */
@media(max-width:899px){.topbar-account{display:none}.topbar-menu{display:none}}

.today-v2{background:var(--bg)}.today-v2 .page{max-width:1100px}.today-v2-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:4px 0 18px}.today-v2-head h1{margin:3px 0;font-size:30px}.today-v2-head p{margin:0;color:var(--muted)}.today-v2-avatar{position:relative;display:grid;place-items:center;flex:0 0 48px;width:48px;height:48px;border-radius:17px;background:linear-gradient(145deg,var(--ink),#2c3440);color:#fff;font:700 18px var(--font-d);text-decoration:none;box-shadow:0 9px 22px rgba(20,23,28,.17)}.today-v2-avatar i{position:absolute;right:-4px;top:-4px;display:grid;place-items:center;min-width:20px;height:20px;padding:0 4px;border:3px solid var(--bg);border-radius:12px;background:var(--brand);font:700 9px var(--font-d);font-style:normal}
.work-focus-card{position:relative;isolation:isolate;overflow:hidden;padding:20px;border-radius:24px;background:linear-gradient(135deg,var(--ink),#2c3440);color:#fff;box-shadow:0 16px 38px rgba(20,23,28,.2)}.work-focus-card.is-queue{background:linear-gradient(135deg,#3b241c,#c94419)}.work-focus-card.is-clear{background:linear-gradient(135deg,#173c2d,#287b57)}.work-focus-glow{position:absolute;z-index:-1;right:-65px;top:-80px;width:230px;height:230px;border-radius:50%;background:radial-gradient(circle,rgba(255,111,61,.55),transparent 66%);animation:work-glow-float 5s ease-in-out infinite}.work-focus-card>header{display:flex;align-items:center;justify-content:space-between;gap:10px}.work-live{display:flex;align-items:center;gap:7px;color:#ffd5c5;font-size:10px;font-weight:850;letter-spacing:.08em;text-transform:uppercase}.work-live>i{width:8px;height:8px;border-radius:50%;background:#ff7447;box-shadow:0 0 0 5px rgba(255,116,71,.14);animation:work-live-pulse 2s ease-out infinite}.work-state{padding:6px 9px;border:1px solid rgba(255,255,255,.2);border-radius:99px;background:rgba(255,255,255,.1);font-size:10px;font-weight:800}.work-focus-object{display:flex;align-items:center;gap:10px;margin-top:20px}.work-focus-object>span{display:grid;place-items:center;width:40px;height:40px;border-radius:13px;background:rgba(255,255,255,.12)}.work-focus-object div{display:grid;gap:1px}.work-focus-object small{color:#cfc5bf;font-size:10px}.work-focus-object strong{font-size:14px}.work-focus-card h2{max-width:780px;margin:14px 0 0;color:#fff;font-size:22px;line-height:1.25}.work-focus-card>p{max-width:600px;margin:8px 0 0;color:#eaded8}.work-focus-actions{display:flex;align-items:center;gap:8px;margin-top:20px}.work-focus-actions>a{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:48px;padding:9px 14px;border:1px solid rgba(255,255,255,.16);border-radius:14px;background:rgba(255,255,255,.08);color:#fff;font-size:12px;font-weight:800;text-decoration:none}.work-focus-actions .work-open{padding-inline:18px;border-color:#fff;background:#fff;color:var(--ink)}.work-open:hover .icon{transform:translateX(3px)}
@keyframes work-glow-float{50%{transform:translate(-18px,15px) scale(1.08)}}@keyframes work-live-pulse{70%{box-shadow:0 0 0 10px rgba(255,116,71,0)}}
.today-quick-actions{display:grid;grid-template-columns:repeat(4,1fr);gap:9px;margin-top:11px}.today-quick-actions>a{display:grid;grid-template-columns:42px minmax(0,1fr);grid-template-rows:auto auto;align-items:center;column-gap:10px;min-height:72px;padding:11px;border:1px solid var(--border);border-radius:18px;background:#fff;color:var(--ink);text-decoration:none}.today-quick-actions>a>span{grid-row:1/3;display:grid;place-items:center;width:42px;height:42px;border-radius:14px;background:var(--accent-soft);color:var(--brand);transition:transform .25s}.today-quick-actions strong{align-self:end;font-size:13px}/* Было 9px — самый мелкий текст во всём приложении, и именно им подписаны
   быстрые действия («0 запросов», «Запросить целевой перевод»). На телефоне
   в руке это не читается, а ноль в «0 запросов» ещё и упирался в край
   карточки. Остальные вторичные подписи держат 10-11px. */
.today-quick-actions small{align-self:start;color:var(--muted);font-size:11px;line-height:1.25}.today-quick-actions>a:hover>span{transform:scale(1.08) rotate(-4deg)}
.today-v2-section{margin-top:23px}.today-v2-section>header{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:10px}.today-v2-section h2{margin:2px 0 0;font-size:21px}/* Ссылки в шапке секции лежат во вложенном div, поэтому селектор `header>a`
   не совпадал ни с чем — «Маршрут» и «Все заявки →» просто текли инлайном
   и рвались посреди фразы («Все» / «заявки →»). Раскладываем колонкой
   по правому краю и запрещаем перенос внутри подписи. */
/* Хвост списка объектов. */
.object-load-rest>summary{display:flex;align-items:center;justify-content:center;min-height:var(--tap);border-radius:13px;background:var(--panel-2);color:var(--brand-dark);font-size:12px;font-weight:800;cursor:pointer;list-style:none}
.object-load-rest>summary::-webkit-details-marker{display:none}
/* Детализация метки по объектам — под тапом. */
.tag-stats-breakdown>summary{display:flex;align-items:center;min-height:34px;color:var(--muted);font-size:11px;font-weight:800;cursor:pointer;list-style:none}
.tag-stats-breakdown>summary::-webkit-details-marker{display:none}
.tag-stats-breakdown>summary::after{content:'›';margin-left:6px;font-size:15px;line-height:1}
.tag-stats-breakdown[open]>summary::after{content:'⌄'}
/* Раскрываемый подраздел аналитики. Заголовок и одно число в свёрнутом
   виде: этого хватает, чтобы понять, стоит ли открывать. */
.quality-detail{margin-top:12px;border:1px solid var(--border);border-radius:14px;background:#fdfcfb}
.quality-detail>summary{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:var(--tap);padding:0 13px;cursor:pointer;list-style:none}
.quality-detail>summary::-webkit-details-marker{display:none}
.quality-detail>summary h3{margin:0;font-size:14px}
.quality-detail>summary>span{flex:none;padding:4px 9px;border-radius:999px;background:var(--panel-2);color:var(--muted);font-size:11px;font-weight:800;white-space:nowrap}
.quality-detail[open]>summary{border-bottom:1px solid var(--border)}
.quality-detail>*:not(summary){padding:0 13px}
.quality-detail>summary+*{padding-top:12px}
.quality-detail>*:last-child{padding-bottom:13px}
/* Подсказка «здесь уже покупали» в форме заявки на покупку. */
.bought-before{display:grid;gap:7px;padding:11px 12px;border:1px solid var(--border);border-radius:13px;background:var(--panel-2)}
.bought-before-title{color:var(--muted);font-size:11px;font-weight:800}
.bought-before-chips{display:flex;flex-wrap:wrap;gap:6px}
.bought-before-chip{display:inline-flex;align-items:center;gap:5px;min-height:34px;padding:5px 11px;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--ink);font-size:12px;font-weight:700;cursor:pointer;text-align:left}
.bought-before-chip small{color:var(--muted);font-size:10px;font-weight:800}
/* Сколько раз это уже брали на объект. Отметка появляется со второй
   покупки — на первой она была бы шумом. */
.consumable-repeat{display:inline-block;margin-top:4px;padding:1px 8px;border-radius:999px;background:#f3efec;color:var(--muted);font-size:10px;font-weight:800}
/* Что человек написал в заявке, если модель прочитала из чека другое. */
.consumable-said{display:block;margin-top:3px;color:var(--muted);font-size:11px;font-style:italic}
/* История расходников на карточке объекта. */
.consumable-total{margin:0 0 10px;color:var(--muted);font-size:12px}
.consumable-list{display:grid;gap:7px;margin:0;padding:0;list-style:none}
.consumable-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--border);border-radius:13px;background:#fff}
.consumable-row>div:first-child{min-width:0}
.consumable-row strong{display:block;font-size:14px}
.consumable-row small{display:block;margin-top:2px;color:var(--muted);font-size:11px}
.consumable-side{display:flex;align-items:center;gap:9px;flex:none}
.consumable-price{font-size:14px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.consumable-link{color:var(--brand-dark);font-size:11px;font-weight:800;text-decoration:none;white-space:nowrap}
/* Машинное чтение помечено, потому что модель ошибается, и человек должен
   видеть, чему верить, не открывая чек. */
.consumable-row.is-machine-read{border-left:3px solid #b48ead}
.consumable-badge{display:inline-block;margin-top:5px;padding:2px 8px;border-radius:999px;background:var(--plan-soft);color:var(--plan);font-size:10px;font-style:normal;font-weight:800}
@media(max-width:700px){.consumable-row{flex-direction:column;gap:7px}.consumable-side{width:100%;justify-content:space-between}}
/* «Ещё N на Контроле →» — выход из укороченного списка «Требует внимания». */
.attention-more{display:flex;align-items:center;justify-content:center;min-height:var(--tap);margin-top:4px;border-radius:14px;background:var(--panel-2);color:var(--brand-dark);font-size:12px;font-weight:800;text-decoration:none}
/* Строка-группа плановых работ: тот же ряд, что и у заявки, но ведёт не
   в карточку, а в отфильтрованный список ППР по объекту. */
.admin-control-row.is-routine-group .admin-control-row-icon{background:#eef2f6;color:#4d5b68}
.routine-group-overdue{display:inline-block;margin-top:4px;padding:2px 8px;border-radius:999px;background:#fdeae4;color:var(--brand-dark);font-size:11px;font-style:normal;font-weight:800}
.today-v2-section>header .section-actions{display:flex;align-items:center;gap:10px;margin-left:auto}
.today-v2-section>header a:not(.action-chip){display:inline-flex;align-items:center;min-height:40px;color:var(--brand-dark);font-size:11px;font-weight:800;white-space:nowrap;text-decoration:none}.next-work-rail{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}.next-work-card{position:relative;display:grid;gap:5px;min-width:0;padding:14px 42px 14px 15px;border:1px solid var(--border);border-radius:18px;background:#fff;color:var(--ink);text-decoration:none}.next-work-card>span{display:flex;align-items:center;justify-content:space-between;gap:8px}.next-work-card small{overflow:hidden;color:var(--brand-dark);font-size:9px;font-weight:850;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}.next-work-card em{padding:4px 6px;border-radius:7px;background:var(--danger-bg);color:var(--danger);font-size:8px;font-style:normal;font-weight:850}.next-work-card>strong{font-size:17px}.next-work-card p{display:-webkit-box;overflow:hidden;margin:0;color:var(--muted);font-size:11px;line-height:1.35;-webkit-box-orient:vertical;-webkit-line-clamp:2}.next-work-card>i{position:absolute;right:13px;top:50%;display:grid;place-items:center;width:27px;height:27px;border-radius:10px;background:var(--panel-2);color:var(--muted);transform:translateY(-50%)}.next-work-card:hover>i .icon{transform:translateX(2px)}.next-work-card.is-critical{border-color:#efc4b6;background:linear-gradient(145deg,#fff,var(--panel-2))}
.day-status-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:9px}.day-status-card{display:grid;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:11px;min-height:86px;padding:13px;border:1px solid var(--border);border-radius:18px;background:#fff;color:var(--ink);text-decoration:none}.day-status-card>div{display:grid;gap:2px}.day-status-card small{color:var(--muted);font-size:10px;font-weight:700}.day-status-card strong{font-size:14px}.day-status-card p{margin:0;color:var(--muted);font-size:10px}.day-status-icon{display:grid;place-items:center;width:48px;height:48px;border-radius:15px;background:var(--accent-soft);color:var(--brand)}.day-status-icon.tone-work{background:var(--work-soft);color:var(--work)}.day-status-icon.tone-receipt{background:var(--warn-soft);color:var(--warn)}.day-status-icon.tone-team{background:var(--plan-soft);color:var(--plan)}.day-status-card.needs-action{border-color:#e9c49c;background:var(--panel-2)}.day-status-card>.icon{color:var(--muted)}
@media(max-width:700px){body.has-bottom-nav{padding-bottom:calc(92px + env(safe-area-inset-bottom))}.bottom-nav-v2{min-height:calc(74px + env(safe-area-inset-bottom))}.today-v2 .page{padding-top:14px}.today-v2-head{align-items:flex-start}.today-v2-head h1{font-size:25px}.today-v2-head p{font-size:12px}.work-focus-card{padding:17px;border-radius:21px}.work-focus-card h2{font-size:19px}.work-focus-actions{display:grid;grid-template-columns:1fr auto}.work-focus-actions>a{padding-inline:12px}.today-quick-actions{display:flex;margin-inline:-16px;padding:0 16px 4px;overflow-x:auto;scrollbar-width:none}.today-quick-actions::-webkit-scrollbar{display:none}.today-quick-actions>a{flex:0 0 150px}.next-work-rail{display:flex;margin-inline:-16px;padding:0 16px 5px;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none}.next-work-rail::-webkit-scrollbar{display:none}.next-work-card{flex:0 0 82%;scroll-snap-align:start}.day-status-grid{grid-template-columns:1fr}.app-more-sheet{width:100%}.more-menu-grid>a{min-height:62px}}
@media(prefers-reduced-motion:reduce){.work-focus-glow,.work-live>i{animation:none!important}.today-quick-actions>a>span{transition:none}}

/* Unified Team workspace and mobile-first weekly timesheet. */
.section-tabs{display:flex;gap:7px;margin:0 0 16px;overflow-x:auto;scrollbar-width:none}.section-tabs::-webkit-scrollbar{display:none}.section-tabs a{display:inline-flex;align-items:center;justify-content:center;flex:none;min-height:44px;padding:8px 14px;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--ink);font-size:12px;font-weight:800;text-decoration:none}.section-tabs a.is-active{border-color:var(--ink);background:var(--ink);color:#fff}
.timesheet-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}.timesheet-summary article{display:grid;gap:2px;padding:12px;border:1px solid var(--border);border-radius:14px;background:#fff}.timesheet-summary strong{font-size:20px}.timesheet-summary span{color:var(--muted);font-size:10px}.timesheet-summary .is-warning{border-color:#e8c88c;background:var(--warn-soft)}.timesheet-week-nav{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:10px 0}.timesheet-week-nav .secondary-button{min-width:48px;padding:0}.timesheet-list{display:grid;gap:12px}.timesheet-person>header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
/* Имя и день недели — в одну строку. Карточка складывалась из трёх
   ярусов (имя, «График», поле дня) и занимала ~130px на человека,
   то есть около 1800px на четырнадцать сотрудников ради одного
   значения в день. Настройка графика — отдельным элементом сетки во
   всю ширину, чтобы её форма разворачивалась нормально. */
.timesheet-person{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:12px}
.timesheet-person>header{grid-column:1;grid-row:1}
.timesheet-days{grid-column:2;grid-row:1}
.timesheet-schedule{grid-column:1/-1}
.timesheet-schedule>summary{min-height:26px;color:var(--muted);font-size:11px;font-weight:700;cursor:pointer}.timesheet-person>header div{display:grid}.timesheet-person>header span{color:var(--muted);font-size:11px}.timesheet-person>header summary{min-height:44px;cursor:pointer;font-size:12px;font-weight:800}.schedule-form{display:grid;gap:8px;min-width:280px;padding:12px;border:1px solid var(--border);border-radius:14px;background:#fff}.schedule-form label,.timesheet-entry-form label{display:grid;gap:4px;color:var(--muted);font-size:11px}.schedule-form input,.schedule-form select,.timesheet-entry-form input,.timesheet-entry-form select,.timesheet-entry-form textarea{margin:0;min-height:44px}.timesheet-days{display:grid;grid-template-columns:repeat(7,minmax(80px,1fr));gap:6px;margin-top:12px;overflow-x:auto}.timesheet-day{border:1px solid var(--border);border-radius:12px;background:#fff}.timesheet-day.is-today{border-color:var(--brand)}.timesheet-day.is-absence{background:#fff7f3}.timesheet-day>summary{display:grid;gap:5px;min-height:72px;padding:9px;cursor:pointer;list-style:none}.timesheet-day>summary span{display:flex;justify-content:space-between;font-size:11px}.timesheet-day>summary small{color:var(--muted)}.timesheet-day>summary strong{font-size:11px}.timesheet-entry-form{display:grid;gap:8px;width:260px;padding:10px;border-top:1px solid var(--border)}
@media(max-width:700px){.team-tabs{margin-inline:-16px;padding:0 16px 4px}.team-tabs a{min-height:48px}.timesheet-summary{display:flex;margin-inline:-16px;padding:0 16px 4px;overflow-x:auto}.timesheet-summary article{flex:0 0 112px}.timesheet-person{padding:8px 12px}.timesheet-person>header{display:grid}.timesheet-schedule,.timesheet-schedule>summary{width:100%}.schedule-form{box-sizing:border-box;min-width:0}.timesheet-days{grid-template-columns:auto;margin-top:0;overflow:visible}.timesheet-day{border-radius:999px;background:#f7f4f2}.timesheet-day.is-today{border-color:var(--border);background:#ece5df}.timesheet-day>summary{display:flex;align-items:center;gap:8px;min-height:38px;padding:6px 12px;white-space:nowrap}.timesheet-day>summary>span{display:flex;align-items:baseline;gap:4px;color:var(--muted);font-size:11px}.timesheet-day>summary>strong{font-size:13px}.timesheet-day>summary span{gap:10px}.timesheet-entry-form{box-sizing:border-box;width:100%}}

.timesheet-date-strip{display:none}.timesheet-editor-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.timesheet-editor-head button{display:none}.timesheet-quick-status{display:flex;flex-wrap:wrap;gap:6px}.timesheet-quick-status button{width:auto;min-height:40px;padding:7px 10px;border:1px solid var(--border);border-radius:10px;background:#fff;color:var(--ink);font-size:11px}.timesheet-shift-fields{display:grid;grid-template-columns:1fr 1fr;gap:8px}.timesheet-day.has-overtime{border-color:#d9a94f;background:var(--warn-soft)}.timesheet-editor-backdrop{display:none}
@media(max-width:700px){
  .timesheet-date-strip{display:flex;gap:7px;margin:0 -16px 14px;padding:2px 16px 5px;overflow-x:auto;scrollbar-width:none}.timesheet-date-strip::-webkit-scrollbar{display:none}.timesheet-date-strip button{display:grid;place-items:center;flex:1 0 46px;min-width:46px;min-height:58px;padding:5px;border:1px solid var(--border);border-radius:14px;background:#fff;color:var(--muted)}.timesheet-date-strip button span{font-size:10px}.timesheet-date-strip button strong{font-size:16px}.timesheet-date-strip button.is-active{border-color:var(--ink);background:var(--ink);color:#fff}
  .timesheet-day{display:none}.timesheet-day.is-mobile-selected{display:block}.timesheet-day>summary span small{display:none}.timesheet-day>summary strong{font-size:13px}.timesheet-day[open]{position:static}.timesheet-day[open]>.timesheet-entry-form{position:fixed;z-index:81;right:0;bottom:0;left:0;max-height:min(82vh,720px);padding:16px 16px calc(18px + env(safe-area-inset-bottom,0px));overflow-y:auto;border:0;border-radius:20px 20px 0 0;background:#fff;box-shadow:0 -14px 44px rgba(24,18,14,.22)}.timesheet-editor-head button{display:grid;place-items:center;width:44px;min-height:44px;padding:0;border:0;border-radius:50%;background:var(--panel-hover);color:var(--ink);font-size:24px}.timesheet-editor-backdrop{position:fixed;z-index:80;inset:0;display:block;width:100%;height:100%;border:0;background:rgba(20,15,12,.4)}.timesheet-editor-backdrop[hidden]{display:none}.is-editing-timesheet{overflow:hidden}.timesheet-quick-status{display:grid;grid-template-columns:1fr 1fr}.timesheet-quick-status button{min-height:48px}.timesheet-entry-form>button:last-child{position:sticky;bottom:0;min-height:52px}.timesheet-shift-fields input{width:100%}
}

/* Living workflow: one calm entrance, a directional active state, and motion
   that follows progress instead of decorating the whole card. */
@keyframes workflow-reveal{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}
@keyframes workflow-current-breathe{0%,100%{box-shadow:0 0 0 7px rgba(11,92,83,.12),0 4px 12px rgba(11,92,83,.16)}50%{box-shadow:0 0 0 13px rgba(11,92,83,.035),0 7px 18px rgba(11,92,83,.2)}}
@keyframes workflow-glint{0%{transform:translate(-130%,-130%)}45%,100%{transform:translate(120%,120%)}}
@keyframes workflow-check-in{0%{opacity:0;transform:translate(-50%,-50%) scale(.3) rotate(-20deg)}70%{transform:translate(-50%,-50%) scale(1.12) rotate(3deg)}100%{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(0)}}
.task-status-card{overflow:hidden;background:linear-gradient(145deg,#fff 0%,#fff 72%,var(--panel-2) 100%)}
.task-steps{position:relative;isolation:isolate;padding-top:3px}
.task-steps::before,.task-steps::after{content:"";position:absolute;z-index:-1;top:20px;left:12.5%;height:4px;border-radius:99px}
.task-steps::before{right:12.5%;background:var(--line)}
.task-steps::after{width:0;background:linear-gradient(90deg,var(--ok),#29a26f 70%,var(--brand));box-shadow:0 1px 5px rgba(20,137,91,.2);transform-origin:left;transition:width .65s cubic-bezier(.2,.75,.25,1)}.task-steps.workflow-progress-2::after{width:25%}.task-steps.workflow-progress-3::after{width:50%}.task-steps.workflow-progress-4::after{width:75%}
.task-steps li::before,.task-steps li+li::before{display:none}
.task-steps li{animation:workflow-reveal .38s ease-out both}
.task-steps li:nth-child(2){animation-delay:.07s}.task-steps li:nth-child(3){animation-delay:.14s}.task-steps li:nth-child(4){animation-delay:.21s}
.task-steps .task-step-dot{width:40px;height:40px;margin-bottom:8px;border:4px solid var(--line);background:#fff;box-sizing:border-box;transition:transform .3s ease,background .3s ease,border-color .3s ease}
.task-steps li.is-done .task-step-dot{border-color:var(--brand);background:var(--ok);box-shadow:0 4px 10px rgba(20,137,91,.18)}
.task-steps li.is-current .task-step-dot{position:relative;overflow:hidden;border-color:var(--brand);background:var(--brand);transform:scale(1.12);animation:workflow-current-breathe 2.2s ease-in-out infinite}
.task-steps li.is-current .task-step-dot::after{content:"";position:absolute;inset:-50%;background:linear-gradient(135deg,transparent 42%,rgba(255,255,255,.42) 50%,transparent 58%);animation:workflow-glint 2.8s ease-in-out infinite}
.task-steps li.is-done .task-step-dot-check{animation:workflow-check-in .42s cubic-bezier(.2,.9,.25,1.25) both}
.task-steps .task-step-label{font-size:12px;transition:color .25s ease,transform .25s ease}.task-steps li.is-current .task-step-label{transform:translateY(1px);color:var(--brand);font-weight:850}.task-steps .task-step-time{font-size:10px}
@media(prefers-reduced-motion:reduce){.task-status-card,.task-steps li,.task-steps li.is-current .task-step-dot,.task-steps li.is-current .task-step-dot::after,.task-steps li.is-done .task-step-dot-check{animation:none!important}.task-steps::after{transition:none}}

/* Personal Today workspace: actions first, bounded lists second. */
.today-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:14px}.today-head h1{margin:2px 0}.today-head p{margin:0;color:var(--muted)}.today-object-link{display:inline-flex;align-items:center;gap:7px;min-height:44px;color:var(--brand-dark);font-size:12px;font-weight:800;text-decoration:none}.today-next-action{position:relative;display:grid;gap:3px;margin-bottom:14px;padding:18px 54px 18px 18px;border-radius:18px;background:linear-gradient(135deg,var(--ink),#49372b);color:#fff;text-decoration:none;box-shadow:0 12px 28px rgba(20,23,28,.17);overflow:hidden}.today-next-action::after{content:"";position:absolute;right:-24px;bottom:-40px;width:120px;height:120px;border-radius:50%;background:rgba(11,92,83,.22)}.today-next-action>span{color:#f2ae91;font-size:10px;font-weight:850;letter-spacing:.08em;text-transform:uppercase}.today-next-action>strong{font:700 20px var(--font-d)}.today-next-action>small{color:var(--line);font-size:12px}.today-next-action>i{position:absolute;z-index:1;right:18px;top:50%;display:grid;place-items:center;width:36px;height:36px;border-radius:50%;background:var(--brand);transform:translateY(-50%)}.today-next-action.is-new{background:linear-gradient(135deg,#563324,var(--brand-dark))}.today-clear{display:flex;align-items:center;gap:12px;margin-bottom:14px;padding:16px;border:1px solid #b9ddca;border-radius:17px;background:#f5fcf8}.today-clear>span{display:grid;place-items:center;width:38px;height:38px;border-radius:50%;background:var(--ok);color:#fff;font-weight:900}.today-clear div{display:grid;gap:2px}.today-clear small{color:var(--muted)}.today-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.today-panel{padding:15px 16px;border:1px solid var(--border);border-radius:17px;background:#fff}.today-panel>header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.today-panel>header>div{display:flex;align-items:center;gap:8px}.today-panel h2{margin:0;font-size:15px}.today-panel>header>strong{display:grid;place-items:center;min-width:26px;height:26px;border-radius:99px;background:var(--panel-hover);color:var(--brand-dark);font-size:12px}.today-panel>header>a,.today-panel>a:last-child{color:var(--brand-dark);font-size:11px;font-weight:750;text-decoration:none}.today-panel-icon{display:grid;place-items:center;width:32px;height:32px;border-radius:10px;background:var(--accent-soft);color:var(--brand)}.today-row{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:54px;padding:9px 2px;border-top:1px solid var(--border);color:var(--ink);text-decoration:none}.today-row>span{display:grid;gap:2px;min-width:0}.today-row strong{overflow:hidden;text-overflow:ellipsis;font-size:13px;white-space:nowrap}.today-row small{overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:10px;white-space:nowrap}.today-row em{padding:5px 7px;border-radius:7px;background:var(--danger-bg);color:var(--danger);font-size:9px;font-style:normal;font-weight:850}.today-panel-empty{display:grid;gap:3px;padding:12px 2px;color:var(--muted)}.today-panel-empty strong{color:var(--ink);font-size:13px}.today-panel-empty span{font-size:11px}.today-shift-hours{display:grid;gap:2px;padding:10px 0}.today-shift-hours strong{font:700 24px var(--font-d)}.today-shift-hours span{color:var(--muted);font-size:11px}.today-shift-state{display:block;padding:12px 0;color:var(--brand-dark)}.today-attention{border-color:#edc17d;background:#fffbf3}.today-receipts{border-color:#c5ddd8;background:var(--panel-2)}
@media(max-width:700px){.today-head{align-items:flex-start}.today-object-link{padding:0 10px;border:1px solid var(--border);border-radius:12px;background:#fff}.today-object-link svg{display:none}.today-next-action{margin-inline:-2px}.today-grid{grid-template-columns:1fr}.today-panel{padding:14px 15px}.today-shift{order:-2}.today-attention{order:-1}}

/* ══════════════════════════════════════════════════════════════
   ANALYTICS DASHBOARD V2 — scoped to avoid leaking into the app
   ══════════════════════════════════════════════════════════════ */
.analytics-page .page{max-width:1240px}.analytics-shell{display:grid;gap:14px}.analytics-hero{position:relative;display:flex;justify-content:space-between;gap:24px;align-items:flex-end;padding:24px 26px;border:1px solid #c5ddd8;border-radius:22px;background:radial-gradient(circle at 92% 5%,rgba(11,92,83,.16),transparent 35%),linear-gradient(135deg,#fff 0%,var(--panel-2) 100%);overflow:hidden}.analytics-hero h1{margin:2px 0 7px;font-size:clamp(27px,4vw,42px)}.analytics-hero p{max-width:680px;margin:0;color:var(--muted);line-height:1.5}.analytics-eyebrow{color:var(--brand-dark);font-size:11px;font-weight:800;letter-spacing:.12em;text-transform:uppercase}.analytics-freshness{display:flex;align-items:center;gap:8px;flex:0 0 auto;padding:9px 12px;border:1px solid var(--line);border-radius:999px;background:rgba(255,255,255,.82);color:var(--muted);font-size:12px}.analytics-live-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 4px rgba(31,122,77,.12)}
.analytics-tabs{display:flex;gap:7px;padding:5px;border:1px solid var(--border);border-radius:15px;background:#fff;overflow-x:auto;scrollbar-width:none}.analytics-tab{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:43px;padding:8px 15px;border-radius:11px;color:var(--muted);font-size:13px;font-weight:800;text-decoration:none;white-space:nowrap}.analytics-tab:hover{background:var(--panel-hover);color:var(--ink)}.analytics-tab.is-active{background:var(--ink);color:#fff;box-shadow:0 5px 14px rgba(20,23,28,.16)}
.dash-kpis{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:9px}.dash-kpi{display:flex;align-items:center;gap:10px;min-height:92px;padding:14px;border:1px solid var(--border);border-radius:16px;background:#fff}.dash-kpi>span{display:flex;align-items:center;justify-content:center;flex:0 0 36px;width:36px;height:36px;border-radius:11px;background:var(--panel-2);color:var(--muted)}.dash-kpi strong{display:block;font:700 25px var(--font-d);line-height:1}.dash-kpi strong small{font-size:12px;color:var(--muted)}.dash-kpi p{margin:5px 0 0;color:var(--muted);font-size:11px;line-height:1.25}.tone-brand>span,.dash-panel-icon.tone-brand{background:var(--accent-soft);color:var(--brand)}.tone-blue>span,.dash-panel-icon.tone-blue{background:var(--work-soft);color:var(--work)}.tone-ok>span,.dash-panel-icon.tone-ok{background:var(--review-soft);color:var(--ok)}.tone-warn>span,.dash-panel-icon.tone-warn{background:var(--warn-bg);color:var(--warn)}.tone-danger>span,.dash-panel-icon.tone-danger{background:var(--danger-bg);color:var(--danger)}.tone-help>span,.dash-panel-icon.tone-help{background:var(--plan-soft);color:var(--plan)}.dash-kpi.tone-danger{border-color:#c5ddd8;background:#fff9f8}.dash-kpi.tone-warn{border-color:#ead2a3;background:#fffcf5}.dash-kpi.tone-help{border-color:#d8cbea;background:#fdfbff}
.dash-grid{display:grid;gap:12px}.dash-grid-two{grid-template-columns:repeat(2,minmax(0,1fr))}.dash-panel{padding:19px;border:1px solid var(--border);border-radius:19px;background:#fff;box-shadow:0 7px 24px rgba(20,23,28,.035)}.dash-panel-head{margin-bottom:14px}.dash-panel-head>div{display:flex;align-items:center;gap:8px}.dash-panel-head h2{margin:0;font-size:18px}.dash-panel-head p{margin:5px 0 0;color:var(--muted);font-size:12px}.dash-panel-head-row{display:flex;align-items:center;justify-content:space-between}.dash-panel-icon{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:10px}.dash-count{display:grid;place-items:center;min-width:30px;height:30px;padding:0 8px;border-radius:999px;background:var(--danger-bg);color:var(--danger);font:700 13px var(--font-d)}
.dash-donut-figure{display:flex;align-items:center;justify-content:center;gap:24px;margin:5px 0 0}.dash-donut{flex:0 0 180px;width:180px;height:180px;overflow:visible;transform:rotate(-90deg)}.dash-donut-track,.dash-donut-segment{fill:none;stroke-width:5.3}.dash-donut-track{stroke:#f1eeeb}.dash-donut-segment{transition:stroke-width .2s ease}.dash-donut-segment:hover{stroke-width:6.5}.dash-donut-total,.dash-donut-caption{transform:rotate(90deg);transform-origin:21px 21px;text-anchor:middle;fill:var(--ink)}.dash-donut-total{font:700 6.5px var(--font-d)}.dash-donut-caption{font:600 2.6px var(--font-b);fill:var(--muted)}.dash-legend{display:grid;gap:8px;min-width:190px;margin:0;padding:0;list-style:none}.dash-legend li{display:grid;grid-template-columns:11px minmax(0,1fr) auto auto;align-items:center;gap:8px;font-size:12px}.dash-legend-dot{width:10px;height:10px;border-radius:50%}.dash-legend strong{font:700 14px var(--font-d)}.dash-legend em{min-width:35px;color:var(--muted);font-size:11px;font-style:normal;text-align:right}.dash-empty{display:grid;justify-items:center;gap:7px;padding:28px;color:var(--muted);text-align:center}.dash-empty strong{color:var(--ink)}.dash-empty p{margin:0;font-size:12px}
.attention-list{display:grid;gap:7px}.attention-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(120px,auto) minmax(160px,auto);gap:12px;align-items:center;padding:11px 13px;border:1px solid transparent;border-radius:13px;color:var(--ink);text-decoration:none}.attention-row:hover{border-color:var(--border);background:var(--panel-hover)}.attention-main{min-width:0}.attention-main strong{display:block;overflow-wrap:anywhere;font-size:13px}.attention-main p{margin:3px 0 0;color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.attention-assignee{font-size:12px}.attention-tags{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:5px}.dash-chip{display:inline-flex;padding:5px 8px;border-radius:999px;background:var(--panel-2);color:var(--muted);font-size:10px;font-weight:800}.dash-chip.tone-danger{background:var(--danger-bg);color:var(--danger)}.dash-chip.tone-warn{background:var(--warn-bg);color:var(--warn)}.dash-chip.tone-help{background:var(--plan-soft);color:var(--plan)}.dash-chip.tone-blue{background:var(--work-soft);color:var(--work)}
.dash-section-head{display:flex;justify-content:space-between;align-items:end;gap:20px;margin-top:7px;padding:0 3px}.dash-section-head h2{margin:3px 0 0;font-size:22px}.dash-section-head p{max-width:520px;margin:0;color:var(--muted);font-size:12px;line-height:1.5;text-align:right}.live-people-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:11px}.live-person{position:relative;padding:9px 13px;border:1px solid var(--border);border-top:4px solid #c7c1bc;border-radius:17px;background:#fff;overflow:hidden}
/* Свёрнутой строке хватает компактного аватара: 38px он занимал, пока
   был шапкой развёрнутой карточки. */
.live-person>summary .live-avatar{flex:0 0 32px;width:32px;height:32px;font-size:13px}.live-person.tone-work{border-top-color:var(--ok)}.live-person.tone-route{border-top-color:var(--work)}.live-person.tone-danger{border-top-color:var(--danger)}.live-person.tone-help{border-top-color:var(--plan)}.live-person header{display:flex;align-items:center;gap:10px}
/* Свёрнутая строка сотрудника. Треугольник-маркер убран: строка и так
   читается как кликабельная, а он ломал выравнивание аватара. */
.live-person>summary{display:flex;align-items:center;gap:10px;min-height:var(--tap);cursor:pointer;list-style:none}
.live-person>summary::-webkit-details-marker{display:none}
.live-person>summary strong{display:block;font-size:14px}
.live-person>summary small{display:block;color:var(--muted);font-size:11px}
.live-summary-counts{display:flex;align-items:center;gap:6px;margin-left:auto}
.live-summary-counts b{min-width:22px;padding:3px 7px;border-radius:999px;background:var(--panel-2);color:var(--ink);font-size:11px;font-weight:800;text-align:center}
.live-summary-counts em{padding:3px 7px;border-radius:999px;background:var(--danger-bg);color:var(--danger);font-size:11px;font-style:normal;font-weight:800}
.live-person>summary .live-state{margin-left:0}
.live-person[open]>summary{margin-bottom:10px}
.live-avatar{display:grid;place-items:center;flex:0 0 38px;width:38px;height:38px;border-radius:50%;background:var(--ink);color:#fff;font:700 15px var(--font-d)}.live-person header>div{min-width:0}.live-person header strong{display:block;overflow-wrap:anywhere;font-size:14px}.live-person header small{color:var(--muted);font-size:10px}.live-state{margin-left:auto;padding:6px 8px;border-radius:999px;background:var(--panel-2);color:var(--muted);font-size:10px;font-weight:800;white-space:nowrap}.tone-work .live-state{background:var(--review-soft);color:var(--ok)}.tone-route .live-state{background:var(--work-soft);color:var(--work)}.tone-danger .live-state{background:var(--danger-bg);color:var(--danger)}.tone-help .live-state{background:var(--plan-soft);color:var(--plan)}.live-ticket-list{display:grid;gap:6px;margin-top:12px}.live-ticket{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;padding:10px;border-radius:12px;background:var(--panel-2);color:var(--ink);text-decoration:none}.live-ticket:hover{background:var(--panel-hover)}.live-ticket strong{font-size:12px}.live-ticket p{margin:3px 0 0;color:var(--muted);font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-ticket-side{display:grid;justify-items:end;align-content:center;gap:2px;color:var(--muted);font-size:10px}.live-ticket-side span{color:var(--ink);font-weight:800}.live-ticket-side em{color:var(--plan);font-style:normal;font-weight:800}.live-idle{display:flex;align-items:center;gap:9px;min-height:58px;margin-top:11px;padding:12px;border-radius:12px;background:var(--panel-2);color:var(--muted);font-size:11px}.live-person footer{display:flex;gap:12px;margin-top:10px;color:var(--muted);font-size:10px}.live-person footer .is-danger{margin-left:auto;color:var(--danger);font-weight:800}
.dash-funnel{display:grid;gap:7px;margin:0;padding:0;list-style:none}.dash-funnel li{display:flex;justify-content:center}.funnel-shape{display:flex;justify-content:space-between;align-items:center;gap:12px;min-width:40%;padding:10px 15px;border-radius:9px;background:linear-gradient(90deg,var(--brand),#ff8b61);color:#fff;font-size:12px;transition:width .35s ease}.dash-funnel li:nth-child(2) .funnel-shape{background:linear-gradient(90deg,var(--warn),#d89a35)}.dash-funnel li:nth-child(3) .funnel-shape{background:linear-gradient(90deg,var(--work),#7494c2)}.dash-funnel li:nth-child(4) .funnel-shape{background:linear-gradient(90deg,var(--review),#4aa074)}.funnel-shape span{display:flex;flex-direction:column;gap:2px}.funnel-shape em{color:rgba(255,255,255,.78);font-size:10px;font-style:normal;font-weight:700}.funnel-shape strong{display:flex;flex-direction:column;align-items:flex-end;gap:2px;font:700 15px var(--font-d)}.funnel-shape strong small{color:rgba(255,255,255,.78);font-size:10px;font-weight:700}
.dynamics-toggle{display:flex;gap:4px;padding:3px;border:1px solid var(--border);border-radius:11px;background:var(--panel-2)}.dynamics-toggle button{min-height:34px;padding:6px 13px;border:0;border-radius:8px;background:transparent;color:var(--muted);font:800 12px var(--font-b);cursor:pointer}.dynamics-toggle button.is-active{background:var(--ink);color:#fff}.dynamics-view+.dynamics-view{margin-top:0}
.week-chart{margin:0}.week-chart-plot{display:grid;grid-template-columns:repeat(8,minmax(50px,1fr));gap:8px;height:230px;overflow-x:auto}.week-col{display:grid;grid-template-rows:24px 1fr 22px;min-width:50px;text-align:center}.week-values{display:flex;justify-content:space-around;color:var(--muted);font-size:10px}.week-bars{display:flex;align-items:end;justify-content:center;gap:4px;border-bottom:1px solid var(--border);background:repeating-linear-gradient(to top,transparent 0,transparent 39px,#f3f0ed 40px)}.week-bars i{display:block;width:min(18px,36%);min-height:2px;border-radius:5px 5px 0 0}.week-new{background:linear-gradient(#ff9a73,var(--brand))}.week-done{background:linear-gradient(#58a57c,var(--ok))}.week-col small{padding-top:5px;color:var(--muted)}.week-chart figcaption{display:flex;justify-content:center;gap:18px;margin-top:10px;color:var(--muted);font-size:11px}.week-chart figcaption span{display:flex;align-items:center;gap:6px}.week-chart figcaption i{display:inline-block;width:10px;height:10px;border-radius:3px}.legend-new{background:var(--brand)}.legend-done{background:var(--ok)}
.quality-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}.quality-stat{padding:14px;border:1px solid var(--border);border-radius:13px;background:var(--panel-2);text-align:center}.quality-stat strong{display:block;font:700 22px var(--font-d)}.quality-stat small{font-size:11px;color:var(--muted)}.quality-stat span{display:block;margin-top:4px;color:var(--muted);font-size:10px}.quality-stat.is-danger{border-color:#c5ddd8;background:var(--danger-bg);color:var(--danger)}.quality-donut{max-width:600px;margin:0 auto}.quality-misses{margin-top:12px}.quality-misses h3{margin:0 0 9px;font-size:14px}
.people-load-list{display:grid;gap:8px}.people-load-row{padding:11px;border-radius:14px}
.people-load-row>summary{display:grid;grid-template-columns:minmax(180px,1.1fr) minmax(180px,2fr) auto;gap:14px;align-items:center;min-height:var(--tap);cursor:pointer;list-style:none}
.people-load-row>summary::-webkit-details-marker{display:none}
.people-load-row[open]>summary{margin-bottom:9px}.people-load-row:hover{background:var(--panel-2)}.people-load-name{display:flex;align-items:center;gap:9px}.people-load-name strong,.people-load-name small{display:block}.people-load-name strong{font-size:13px}.people-load-name small{color:var(--muted);font-size:10px}.people-load-bar,.object-load-track{height:9px;border-radius:999px;background:var(--panel-2);overflow:hidden}.people-load-fill,.object-load-fill{display:block;height:100%;min-width:3px;border-radius:999px;background:linear-gradient(90deg,var(--brand),#4f9a8f)}.people-load-numbers{text-align:right}.people-load-numbers strong{display:block;font:700 17px var(--font-d)}.people-load-numbers span{color:var(--muted);font-size:11px}.people-load-row dl{grid-column:1/-1;display:flex;justify-content:flex-end;gap:8px;margin:0}.people-load-row dl div{display:flex;gap:4px;padding:5px 9px;border-radius:8px;background:#f5f3f1;font-size:11px}.people-load-row dt{color:var(--muted)}.people-load-row dd{margin:0;font-weight:800}.people-load-row dd small{font-size:8px}.object-load-list{display:grid;gap:7px}.object-load-row{display:grid;gap:7px;padding:11px 12px;border-radius:13px;color:var(--ink);text-decoration:none}.object-load-row:hover{background:var(--panel-hover)}.object-load-head{display:flex;justify-content:space-between;gap:12px}.object-load-head strong{font-size:13px;overflow-wrap:anywhere}.object-load-head span{color:var(--muted);font-size:11px;white-space:nowrap}.object-load-meta{display:flex;flex-wrap:wrap;gap:10px;color:var(--muted);font-size:11px}.object-load-meta em{color:var(--danger);font-style:normal;font-weight:800}
.tag-stats-list{display:grid;gap:14px}.tag-stats-row{padding:11px 12px;border-radius:13px}.tag-stats-row:hover{background:var(--panel-2)}.tag-stats-head{display:flex;justify-content:space-between;gap:12px;margin-bottom:6px;color:inherit;text-decoration:none}.tag-stats-head strong{font-size:13px}.tag-stats-head:hover strong{color:var(--brand-dark)}.tag-stats-head span{color:var(--muted);font:700 13px var(--font-d)}.tag-stats-track{height:9px;border-radius:999px;background:var(--panel-2);overflow:hidden}.tag-stats-fill{display:block;height:100%;min-width:3px;border-radius:999px;background:linear-gradient(90deg,var(--brand),#4f9a8f)}.tag-stats-objects{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}a.dash-chip{text-decoration:none;cursor:pointer}a.dash-chip:hover{background:var(--line);color:var(--ink)}.tag-stats-subtags{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px}.tag-stats-subtags small{color:var(--muted);font-size:10px;font-weight:800}
@media (max-width:980px){.dash-kpis{grid-template-columns:repeat(3,1fr)}.quality-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:700px){.analytics-hero{align-items:flex-start;flex-direction:column;padding:19px}.analytics-freshness{align-self:flex-start}.dash-grid-two{grid-template-columns:1fr}.dash-kpis{grid-template-columns:repeat(2,1fr)}.dash-donut-figure{flex-direction:column;gap:12px}.dash-donut{width:160px;height:160px;flex-basis:160px}.dash-legend{width:100%;min-width:0}.attention-row{grid-template-columns:1fr}.attention-assignee{color:var(--muted)}.attention-tags{justify-content:flex-start}.dash-section-head{align-items:flex-start;flex-direction:column;gap:6px}.dash-section-head p{text-align:left}.live-people-grid{grid-template-columns:1fr}.quality-grid{grid-template-columns:repeat(2,1fr)}.people-load-row{padding:8px 11px}.people-load-row>summary{grid-template-columns:minmax(0,1fr) auto;gap:7px}.people-load-row>summary .live-avatar{flex:0 0 30px;width:30px;height:30px;font-size:13px}.people-load-row>summary .people-load-numbers strong{font-size:15px}.people-load-bar{grid-column:1/-1;grid-row:2}.people-load-row dl{justify-content:flex-start;overflow-x:auto}.analytics-page .page{padding-bottom:100px}}
@media (max-width:380px){.dash-kpis{grid-template-columns:1fr}.dash-kpi{min-height:74px}.quality-grid{grid-template-columns:1fr}.live-person{padding:9px 12px}.live-person header{align-items:flex-start;flex-wrap:wrap}.live-state{margin-left:48px}.live-ticket{grid-template-columns:1fr}.live-ticket-side{justify-items:start}.analytics-tab{padding-inline:11px}}

/* Analytics controls, comparisons and management summary. Kept after the
   dashboard block so these refinements override the original compact cards. */
.analytics-filters{display:grid;grid-template-columns:repeat(4,minmax(130px,1fr)) auto auto;gap:8px;align-items:end;padding:12px;border:1px solid var(--border);border-radius:16px;background:#fff}.analytics-filters label{display:grid;gap:4px}.analytics-filters label>span{color:var(--muted);font-size:10px;font-weight:800}.analytics-filters select{width:100%;min-height:42px;padding:8px 30px 8px 10px;border:1px solid var(--border);border-radius:10px;background-color:var(--panel-2);color:var(--ink);font:600 12px var(--font-b)}.analytics-filter-button,.management-ai-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:42px;padding:8px 13px;border:0;border-radius:10px;background:var(--ink);color:#fff;font:800 12px var(--font-b);cursor:pointer}.analytics-filter-reset{display:inline-flex;align-items:center;min-height:42px;color:var(--muted);font-size:11px;text-decoration:none}
.management-summary{padding:18px 20px;border:1px solid #c5ddd8;border-radius:19px;background:linear-gradient(135deg,var(--panel-2),#fff)}.management-summary-head{display:flex;align-items:center;justify-content:space-between;gap:15px}.management-summary-head>div{display:flex;align-items:center;gap:9px}.management-summary h2{margin:2px 0 0;font-size:18px}.management-ai-button{background:linear-gradient(135deg,var(--brand-dark),var(--brand))}.management-ai-button:disabled{opacity:.6;cursor:wait}.management-summary-list{display:grid;gap:7px;margin:14px 0 0;padding:0;list-style:none}.management-summary-list li{display:flex;align-items:flex-start;gap:9px;padding:9px 11px;border-radius:11px;background:rgba(255,255,255,.8);font-size:12px}.management-summary-list li>span{flex:0 0 8px;width:8px;height:8px;margin-top:4px;border-radius:50%;background:var(--muted)}.management-summary-list li.tone-danger>span{background:var(--danger)}.management-summary-list li.tone-warn>span{background:var(--warn)}.management-summary-list li.tone-ok>span{background:var(--ok)}.management-summary-list li.tone-help>span{background:var(--plan)}.management-summary-list p{margin:0;line-height:1.45}.management-summary-note{margin:10px 0 0;color:var(--muted);font-size:10px}
.analytics-page a.dash-kpi{color:var(--ink);text-decoration:none}.analytics-page a.dash-kpi:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(20,23,28,.07)}.kpi-compare{display:block;margin-top:5px;color:var(--muted);font-size:9px;font-style:normal;font-weight:800}.kpi-compare.is-up{color:var(--ok)}.kpi-compare.is-down{color:var(--danger)}.analytics-detail-hero{align-items:center}.analytics-detail-hero .analytics-freshness strong{font:700 17px var(--font-d);color:var(--ink)}
@media (max-width:980px){.analytics-filters{grid-template-columns:repeat(2,minmax(130px,1fr)) auto}.analytics-filter-reset{grid-column:auto}}
@media (max-width:700px){.analytics-filters{grid-template-columns:1fr 1fr}.analytics-filter-button{grid-column:1/-1}.management-summary-head{align-items:flex-start;flex-direction:column}}
@media (max-width:380px){.analytics-filters{grid-template-columns:1fr}.analytics-filter-button{grid-column:auto}}

/* Monthly two-series line chart. SVG stays crisp on retina screens and uses
   the same semantic orange/green palette as the rest of the dashboard. */
.dynamics-panel{overflow:hidden}.line-chart-note{margin:0 0 12px;color:var(--muted);font-size:11px}.line-chart-legend{display:flex;flex-wrap:wrap;gap:12px;color:var(--muted);font-size:11px}.line-chart-legend span{display:flex;align-items:center;gap:6px}.line-chart-legend i{display:inline-block;width:20px;height:4px;border-radius:999px}.line-chart-legend .is-received{background:var(--brand)}.line-chart-legend .is-resolved{background:var(--ok)}.line-chart-scroll{overflow-x:auto;scrollbar-width:thin}.monthly-line-chart{min-width:780px;margin:0}.monthly-line-chart svg{display:block;width:100%;height:auto;overflow:visible}.monthly-line-chart figcaption{margin:4px 0 0;color:var(--muted);font-size:10px;text-align:center}.line-grid{stroke:#ebe7e3;stroke-width:1;stroke-dasharray:4 5}.line-guide{stroke:var(--panel-2);stroke-width:1;opacity:.42}.line-axis-value{fill:var(--muted);font:600 10px var(--font-b);text-anchor:end}.line-area.is-received{fill:url(#received-area-gradient)}.line-area.is-resolved{fill:url(#resolved-area-gradient)}.line-series{fill:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round}.line-series.is-received{stroke:var(--brand)}.line-series.is-resolved{stroke:var(--ok)}.line-point{stroke:#fff;stroke-width:3;transition:r .15s ease}.line-point:hover{r:7}.line-point.is-received{fill:var(--brand)}.line-point.is-resolved{fill:var(--ok)}.line-point-value{font:800 10px var(--font-d);text-anchor:middle}.line-point-value.is-received{fill:var(--brand-dark)}.line-point-value.is-resolved{fill:var(--ok)}.line-month-label{fill:var(--ink);font:700 11px var(--font-b);text-anchor:middle}.line-year-label{fill:var(--muted);font:600 9px var(--font-b);text-anchor:middle}
@media (max-width:700px){.dynamics-panel .dash-panel-head-row{align-items:flex-start;flex-direction:column}.monthly-line-chart{min-width:760px}}

/* Analytics must fit the viewport; only the intentionally wide SVG scrolls. */
.analytics-page .analytics-shell,.analytics-page .dash-panel,.analytics-page .management-summary{min-width:0}
.analytics-page .dash-panel-head h2,.analytics-page .dash-section-head h2{overflow-wrap:anywhere}
.analytics-page .analytics-freshness{max-width:100%;white-space:normal}
@media (max-width:700px){
  .analytics-page .page{width:100%;min-width:0;padding-inline:12px}
  .analytics-page .analytics-hero{width:100%;box-sizing:border-box}
  .analytics-page .analytics-filters{grid-template-columns:1fr;min-width:0}
  .analytics-page .analytics-filter-button,.analytics-page .analytics-filter-reset{grid-column:auto;width:100%;box-sizing:border-box}
  .analytics-page .analytics-filter-reset{justify-content:center}
  .analytics-page .dash-panel{padding:15px}
  .analytics-page .dash-panel-head-row{gap:10px}
  .analytics-page .dash-panel-head h2{font-size:16px}
  .analytics-page .dash-panel-head p{overflow-wrap:anywhere}
  .analytics-page .week-chart-plot{grid-template-columns:repeat(8,50px);overflow-x:auto}
  .analytics-page .chart-details-table{width:100%;overflow-x:auto}
  .analytics-page .chart-details-row{grid-template-columns:minmax(105px,1fr) 82px 96px;min-width:300px}
}


/* ── Styled file input ── */
.file-field { position: relative; display: block; margin-top: 14px; }
.file-field-label { display: block; margin-bottom: 4px; font-weight: 600; color: var(--ink); font-size: 13px; }
.file-field input[type="file"] {
  position: absolute;
  inset: 0;
  opacity: 0;
  z-index: 2;
  cursor: pointer;
  min-height: 100%;
}
.file-field-ui {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 11px 14px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--panel-2);
}
.file-field-button {
  flex-shrink: 0;
  min-height: 40px;
  padding: 6px 16px;
  border-radius: 8px;
  background: var(--ink);
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  display: flex;
  align-items: center;
}
.file-field-value {
  color: var(--muted);
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.file-field input[type="file"]:focus-visible + .file-field-ui {
  outline: 3px solid rgba(11,92,83,.32);
  outline-offset: 2px;
}
.file-preview {
  position: relative;
  display: inline-block;
  margin-top: 10px;
}
.file-preview img {
  display: block;
  max-width: 100%;
  max-height: 200px;
  border-radius: 12px;
  border: 1px solid var(--border);
}
.file-preview-clear {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 40px;
  height: 40px;
  min-width: 40px;
  min-height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(20,23,28,.7);
  color: #fff;
  font-size: 22px;
  cursor: pointer;
  line-height: 1;
}
.file-preview-clear:active { background: rgba(20,23,28,.9); }

/* ── Animated task steps ── */
.task-steps { display: flex; gap: 0; margin: 10px 0 0; padding: 0; list-style: none; counter-reset: step; }
.task-steps li { flex: 1; position: relative; text-align: center; counter-increment: step; }
.task-steps li::before {
  content: "";
  position: absolute;
  top: 16px;
  left: calc(-50% + 16px);
  right: calc(50% + 16px);
  height: 3px;
  background: var(--border);
  border-radius: 2px;
}
.task-steps li:first-child::before { display: none; }
.task-steps li.is-done::before { background: var(--ok); }
.task-steps li.is-current::before { background: linear-gradient(90deg, var(--ok) 0%, var(--brand) 100%); }
.task-step-dot {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  margin: 0 auto 6px;
  border-radius: 50%;
  background: var(--border);
  color: #fff;
  font-size: 11px;
  font-weight: 800;
  transition: background 0.3s ease, transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.task-steps li.is-done .task-step-dot { background: var(--ok); }
.task-steps li.is-current .task-step-dot {
  background: var(--brand);
  transform: scale(1.1);
  box-shadow: 0 0 0 4px rgba(11,92,83,.18);
}
.task-step-dot-check svg { display: block; width: 16px; height: 16px; stroke: #fff; stroke-width: 3; fill: none; }
.checkmark-path { stroke: currentColor; stroke-dasharray: 18; stroke-dashoffset: 18; transition: stroke-dashoffset 0.35s ease 0.1s; }
.task-steps li.is-done .checkmark-path { stroke-dashoffset: 0; }
.task-step-label { display: block; font-size: 10px; font-weight: 650; color: var(--muted); }
.task-steps li.is-done .task-step-label { color: var(--ok); }
.task-steps li.is-current .task-step-label { color: var(--brand-dark); font-weight: 700; }
.task-step-time { display: block; font-size: 9px; color: var(--muted); margin-top: 2px; }

/* ── Status changed animation ── */
.animate-status .task-step-dot { animation: step-pop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); }
@keyframes step-pop {
  0% { transform: scale(1); }
  50% { transform: scale(1.25); }
  100% { transform: scale(1); }
}

/* ── Notification permission banner ── */
/* Icon, text and two buttons never fit one row on a phone: the buttons did not
   shrink and ran off the right edge, so «Не сейчас» was half off-screen. They
   wrap onto their own full-width row instead. */
.notif-banner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 12px;
  padding: 12px 16px;
  margin-bottom: 14px;
  border-radius: 14px;
  background: linear-gradient(135deg, var(--accent-soft) 0%, var(--panel-2) 100%);
  border: 1px solid rgba(11,92,83,.2);
  font-size: 13px;
}
.notif-banner-actions { display: flex; flex: 0 0 auto; gap: 8px; margin-left: auto; }
@media (max-width: 560px) {
  .notif-banner-actions { flex: 1 1 100%; margin-left: 0; }
  .notif-banner-actions button { flex: 1; }
}
.notif-banner-icon {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background: var(--brand);
  color: #fff;
  font-size: 20px;
}
.notif-banner-icon { flex: 0 0 40px; }
.notif-banner p { flex: 1 1 140px; min-width: 0; margin: 0; color: var(--ink); }
.notif-banner button {
  flex-shrink: 0;
  min-width: auto;
  /* Тот же размер, что и у всех кнопок: своё значение здесь оставляло две
     кнопки на 4 точки ниже соседних, и ряд выглядел неровным. */
  min-height: var(--tap);
  padding: 10px 16px;
  border-radius: 12px;
  background: var(--brand-dark);
  color: #fff;
  font-size: 14px;
  font-weight: 700;
}
.notif-banner .secondary-button {
  background: transparent;
  border: 1px solid var(--border);
  color: var(--muted);
}
.notif-banner.is-dismissing {
  opacity: 0;
  transform: translateY(-10px);
  margin-bottom: 0;
  max-height: 0;
  overflow: hidden;
  will-change: transform, opacity;
  transition: opacity 0.25s ease, transform 0.25s ease, margin 0.25s ease, max-height 0.25s ease;
}

/* ── Report submission status ── */
.upload-progress {
  position: fixed;
  right: max(16px, env(safe-area-inset-right));
  bottom: calc(72px + env(safe-area-inset-bottom));
  left: max(16px, env(safe-area-inset-left));
  z-index: 100;
  display: flex;
  justify-content: center;
  pointer-events: none;
}
.upload-progress-inner {
  display: flex;
  align-items: center;
  gap: 12px;
  width: min(100%, 440px);
  padding: 14px 16px;
  border: 1px solid var(--border);
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 12px 30px rgba(20,23,28,.18);
}
.upload-progress-spin {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  margin: 0;
  border: 3px solid var(--border);
  border-top-color: var(--brand);
  border-radius: 50%;
  animation: upload-spin 0.7s linear infinite;
}
@keyframes upload-spin { to { transform: rotate(360deg); } }
.upload-progress-inner strong { display: block; margin-bottom: 3px; font-size: 14px; }
.upload-progress-inner span { display: block; color: var(--muted); font-size: 12px; line-height: 1.35; }
@media (min-width: 901px) {
  .upload-progress { bottom: 24px; left: auto; }
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ── Side task state buttons as chips ── */
.task-side-buttons { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.task-side-buttons form { margin: 0; }
.task-side-buttons button { min-height: 44px; padding: 6px 14px; font-size: 12px; }

/* ── Prediction rate card refinements ── */
.prediction-rate { margin-top: 16px; }
.prediction-rate h2 { margin: 0 0 6px; font-size: 17px; }
.prediction-rate-forecast { color: var(--muted); font-size: 13px; margin: 0 0 12px; }
.prediction-rate-buttons { display: flex; gap: 8px; flex-wrap: wrap; }
.prediction-rate-buttons button { flex: 1; min-width: 80px; }
.prediction-rate-done { font-size: 14px; margin: 0 0 8px; color: var(--ok); }
.prediction-rate-change { margin-top: 10px; }
.prediction-rate-change summary { cursor: pointer; color: var(--brand-dark); font-size: 12px; font-weight: 600; }
.prediction-rate-change .prediction-rate-buttons { margin-top: 8px; }

/* ── AI recommendation card ── */
.ai-reco { margin-top: 16px; }
.ai-reco summary { cursor: pointer; font-weight: 600; }
.ai-reco-count { font-weight: 400; color: var(--muted); font-size: 12px; }
.ai-reco-forecast { font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.ai-reco-tools { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0; }
.ai-reco-tool {
  display: inline-block;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--panel-hover);
  color: var(--brand-dark);
  font-size: 11px;
  font-weight: 600;
}

/* ── Task time fix ── */
.task-time-fix { margin-top: 10px; }
.task-time-fix summary { cursor: pointer; color: var(--brand-dark); font-size: 12px; font-weight: 600; }
.task-time-fix .expense-form { margin-top: 8px; }

/* ── Ticket primary action buttons ── */
.ticket-primary-action { margin-top: 12px; }
.ticket-primary-action button { width: 100%; min-height: 50px; border-radius: 12px; font-size: 16px; font-weight: 700; }

/* ── Task status card ── */
.task-status-card { margin-top: 16px; }
.task-status-card > strong { display: block; margin-bottom: 4px; font-size: 14px; }

/* ---------- «Нужна помощь» ---------- */

.help-call-banner {
  display: grid;
  gap: 2px;
  margin: 12px 0;
  padding: 14px 17px;
  border: 1px solid #ecd39a;
  border-left: 4px solid var(--warn);
  border-radius: 15px;
  background: var(--warn-bg);
  color: var(--ink);
  text-decoration: none;
}
.help-call-banner strong { font-size: 15px; }
.help-call-banner span { color: var(--muted); font-size: 12px; }

.status-help { background: var(--warn-bg); color: var(--warn); }

.help-card {
  margin-top: 16px;
  padding: 17px;
  border: 1px solid #ecd39a;
  border-left: 4px solid var(--warn);
  border-radius: 17px;
  background: var(--warn-bg);
}
.help-card.is-joined { border-color: #9ccdb1; border-left-color: var(--ok); background: var(--ok-bg); }
.help-card > strong { display: block; font-size: 17px; }
.help-card p { margin: 6px 0 0; }
.help-card-note { font-size: 15px; font-style: italic; }
.help-card .muted { font-size: 12px; }
.help-card form { margin-top: 12px; }
.help-card.is-joined form button { width: 100%; }

.task-helpers { margin: 6px 0 0; font-size: 13px; }

.task-help-ask { margin-top: 10px; padding: 10px; border: 1px solid var(--border); border-radius: 12px; background: #fff; }
.task-help-ask > summary { color: var(--warn); font: 700 13px var(--font-d); cursor: pointer; }
.task-help-ask input[type="text"] { width: 100%; min-height: 46px; margin-top: 4px; padding: 9px 12px; border: 1px solid var(--border); border-radius: 10px; font: inherit; }

.help-pending { margin-top: 10px; padding: 12px 14px; border: 1px solid #ecd39a; border-radius: 12px; background: var(--warn-bg); }
.help-pending > strong { display: block; font-size: 14px; }
.help-pending p { margin: 5px 0 0; font-size: 13px; }
.help-pending form { margin-top: 10px; }

/* ---------- Chart colours that used to live in style= attributes ----------
   The policy allows no inline style attributes, so every one of them was being
   dropped and the charts rendered colourless. Fixed colours belong here; the
   per-row numbers (widths, heights) are emitted in a nonced <style> block at
   the bottom of admin_analytics.html. */

.legend-swatch.is-new { background: var(--brand); }
.legend-swatch.is-done, .legend-dot.is-work { background: var(--brand-dark); }
.legend-dot.is-travel { background: var(--warn); }
.stacked-bar.empty-bar { height: 100%; }
.admin-empty-note { padding: 24px; color: var(--muted); text-align: center; }
.list-cut-note { margin-top: 12px; padding: 11px 14px; border: 1px dashed var(--border); border-radius: 12px; text-align: center; }

/* ---------- Tap targets ----------
   Measured at 320px: phone links in an object card were 125x19 and the brand
   link in the top bar 150x7. The people using this wear gloves and stand on a
   site; 44px is the smallest thing a thumb hits reliably. */
.expense-note a[href^="tel:"],
.object-contacts a[href^="tel:"] {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 4px 0;
}
.brand { min-height: 44px; }

/* ---------- Tap targets ----------
   The logo is a very wide, very short image (420x20), so the link around it was
   about nine pixels tall — impossible to hit on a phone. Phone numbers inside a
   card were 125x19 for the same reason: they are inline text. Both are real
   targets on an object's card, and a technician is often wearing gloves. */

.brand { min-height: 44px; }
.expense-note a[href^="tel:"] {
  display: inline-block;
  min-height: 44px;
  padding: 12px 0;
  white-space: nowrap;
}

/* ── Единый размер кнопок ────────────────────────────────────────────────
   Кнопки набирались по месту и разошлись: где 32 точки высотой, где 46, где
   с сокращённой подписью. Здесь один размер для всего, что нажимается, и
   подписи не сокращаются — их просто хватает места написать целиком. */
.secondary-button,.primary-link,.secondary-link,.add-object-button,.text-button,
.view-switch-btn,.quick-filter,.sort-button,.asset-scope a{
  /* Один размер на всё, что нажимается, и это уже существующий токен --tap
     (48 точек) — иначе половина кнопок осталась бы 44, как было. */
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  min-height:var(--tap);padding:10px 16px;border-radius:12px;
  font-size:14px;font-weight:700;line-height:1.2;white-space:nowrap;
  text-decoration:none;cursor:pointer}
.secondary-button,.secondary-link,.quick-filter,.sort-button,.asset-scope a{
  border:1px solid var(--border);background:#fff;color:var(--ink)}
.quick-filter.is-active,.sort-button.is-active,.asset-scope a.is-active{
  border-color:var(--ink);background:var(--ink);color:#fff}
.secondary-button:hover,.quick-filter:hover,.asset-scope a:hover{background:var(--panel-hover)}

/* Ряды ссылок-кнопок: одинаковый отступ, перенос по ширине экрана. */
.list-links{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 14px}

/* Заголовок раздела и кнопка действия — на одной линии, по центру по высоте. */
.directory-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 14px}
.directory-title{margin:0;line-height:1.15;font-size:26px}
.add-object-button{flex:0 0 auto;width:var(--tap);min-width:var(--tap);padding:0;
  background:var(--brand-dark);color:#fff;border:0}

/* Фильтры объектов: одна полоса, ничего не выпадает и не расползается. */
.list-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:auto;margin-bottom:8px}
.quick-filters{display:flex;flex-wrap:wrap;gap:8px;overflow:visible;padding:0;margin-bottom:8px}

/* Группы теперь свёрнуты по умолчанию, и заголовок стал единственным
   способом добраться до содержимого — значит, он обязан выглядеть
   нажимаемым. Раньше он был просто жирной строкой над уже открытым
   списком. */
.asset-type-group{margin-bottom:10px;border:1px solid var(--border);border-radius:14px;background:#fff}
.asset-type-group>summary{min-height:var(--tap);cursor:pointer;display:flex;align-items:center;gap:8px;
  padding:0 13px;font-weight:700;color:var(--ink);list-style:none}
.asset-type-group>summary::-webkit-details-marker{display:none}
.asset-type-group>summary::after{content:'›';margin-left:auto;color:var(--muted);font-size:19px;line-height:1}
.asset-type-group[open]>summary{border-bottom:1px solid var(--border)}
.asset-type-group[open]>summary::after{content:'⌄'}
.asset-type-group>.asset-grid{padding:11px 13px}
.asset-type-group>summary span{display:inline-flex;align-items:center;justify-content:center;
  min-width:22px;height:22px;padding:0 6px;border-radius:999px;
  background:var(--panel-hover);color:var(--muted);font-size:12px;font-weight:600}

/* Быстрый фильтр инструмента — теми же кнопками, а не голыми ссылками. */
.asset-scope{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px}
.asset-scope a span{display:inline-flex;align-items:center;justify-content:center;
  min-width:22px;height:22px;padding:0 6px;border-radius:999px;
  background:var(--panel-hover);color:var(--muted);font-size:12px}
.asset-scope a.is-active span{background:rgba(255,255,255,.2);color:#fff}
.asset-scope .asset-scope-alert{border-color:var(--brand);color:var(--brand-dark)}

/* Fixed-элемент с transform становится отдельным containing block. На iOS это
   приводит к рывкам панели во время инерционной прокрутки. Нижняя навигация
   остаётся в нативном fixed-слое; верхняя служебная полоса может композититься. */
.topbar,.network-banner{transform:translateZ(0);backface-visibility:hidden}
.bottom-nav{transform:none;backface-visibility:visible}

/* Обложка объекта во всю ширину карточки. */
.object-cover-hero{margin:14px 0 0;overflow:hidden;border-radius:16px;background:#eee}
.object-cover-hero img{display:block;width:100%;height:auto;max-height:260px;object-fit:cover}

/* ППР, свёрнутые по объектам. Плановые заявки человек ищет по принципу «куда
   я сегодня еду», а не «что горит», — поэтому сначала объект, потом список. */
.object-group-list{display:flex;flex-direction:column;gap:8px;margin:12px 0}
.object-group{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:14px 16px;min-height:52px;border:1px solid var(--line);border-radius:14px;
  background:#fff;color:inherit;text-decoration:none}
.object-group:active{background:#f4f4f7}
.object-group-name{font-weight:600;line-height:1.3;flex:1 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.object-group-count{flex:none;min-width:30px;padding:2px 9px;border-radius:999px;
  background:#f0f0f4;color:#555;font-size:14px;font-weight:600;text-align:center}
.object-scope{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0}
.object-scope strong{font-size:16px;line-height:1.3}

/* Снимки официального ответа: их до шести. Полоса плиток, а не столбец в
   полную ширину — иначе отчёт с шестью фотографиями занимает три экрана. */
.report-photos{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.report-photos img{display:block;width:96px;height:96px;object-fit:cover;border-radius:10px}
.similar-tickets-list{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}
.similar-tickets-list li{display:flex;flex-direction:column}
.similar-tickets-list a{font-weight:600}
.similar-tickets-list .muted{font-size:13px}
.file-preview{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.file-preview img{display:block;width:76px;height:76px;object-fit:cover;border-radius:10px}

/* Выезд на объект: один жест на все заявки адреса вместо пяти одинаковых. */
.work-filter-trigger,.work-filter-sheet,.work-filter-backdrop,.object-filter-trigger,.object-filter-backdrop,.object-picker-trigger,.object-picker-sheet,.object-picker-backdrop{display:none}
.object-filter-sheet[hidden]{display:block}
.object-filter-sheet-head{display:none}
@media(max-width:700px){
  .ticket-filter-strip{display:none}
  .work-tabs{display:none}
  .work-filter-trigger{display:inline-flex;margin:0 0 12px}
  .work-filter-backdrop:not([hidden]){display:block;position:fixed;z-index:70;inset:0;background:rgba(31,24,20,.42)}
  .work-filter-sheet:not([hidden]){display:flex;position:fixed;z-index:71;right:0;bottom:0;left:0;max-height:82vh;padding:16px 16px calc(20px + env(safe-area-inset-bottom));border-radius:22px 22px 0 0;background:#fff;box-shadow:0 -16px 40px rgba(20,23,28,.2);flex-direction:column;gap:14px;overflow:auto}
  .work-filter-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
  .work-filter-sheet-options{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .work-filter-sheet-options a{display:flex;align-items:center;justify-content:space-between;min-height:48px;padding:10px 12px;border:1px solid #e5dfdb;border-radius:13px;color:var(--ink);text-decoration:none}
  .work-filter-sheet-options a[aria-current="page"]{border-color:var(--brand);background:#fff1eb;color:var(--brand-dark)}
  .object-picker-trigger{display:inline-flex;margin:0 0 12px}
  .object-picker-backdrop:not([hidden]){display:block;position:fixed;z-index:70;inset:0;background:rgba(31,24,20,.42)}
  .object-picker-sheet:not([hidden]){display:flex;position:fixed;z-index:71;right:0;bottom:0;left:0;max-height:82vh;padding:16px 16px calc(20px + env(safe-area-inset-bottom));border-radius:22px 22px 0 0;background:#fff;box-shadow:0 -16px 40px rgba(20,23,28,.2);flex-direction:column;gap:14px;overflow:auto}
  .object-picker-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
  .object-picker-sheet .object-group-list{margin:0}
  body.has-work-filter-sheet,body.has-object-filter-sheet,body.has-object-picker-sheet{overflow:hidden}
  .object-filter-sheet[hidden]{display:none}
  .object-filter-trigger{display:inline-flex}
  .object-filter-backdrop:not([hidden]){display:block;position:fixed;z-index:70;inset:0;background:rgba(31,24,20,.42)}
  .object-filter-sheet:not([hidden]){display:flex;position:fixed;z-index:71;right:0;bottom:0;left:0;max-height:82vh;padding:16px 16px calc(20px + env(safe-area-inset-bottom));border-radius:22px 22px 0 0;background:#fff;box-shadow:0 -16px 40px rgba(20,23,28,.2);flex-direction:column;gap:14px;overflow:auto}
  .object-filter-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
  .object-filter-sheet .quick-filters{display:grid;grid-template-columns:repeat(3,1fr)}
  .object-filter-sheet .map-filters{display:grid;gap:12px}
}
.trip-panel{margin:0 0 14px;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:#fafafc}

.trip-state{margin:0 0 10px;font-size:15px;line-height:1.4}
.trip-actions{display:flex;flex-wrap:wrap;gap:8px}
.trip-actions form{margin:0}
.trip-actions button{width:auto;min-height:44px;padding:0 16px}
.trip-mode .mobile-work-heading p{display:none}
.trip-mode .object-scope{align-items:flex-start;flex-direction:column;gap:8px}
.trip-mode .object-scope strong{font-size:18px}
@media(max-width:700px){
  .trip-mode{padding-bottom:86px}
  .trip-mode .trip-panel{padding:12px;border-color:#e8d8cf;background:var(--panel-2)}
  /* Держится ровно над нижним меню. Раньше здесь стояло
     var(--bottom-nav-height, 66px) — переменная не задана нигде, так что
     всегда работали запасные 66px, а меню в этом же media-запросе выше:
     calc(74px + env(safe-area-inset-bottom)), на iPhone с домашней полосой
     около 108px. Панель с z-index 42 ложилась поверх меню (z-index 40) и
     перекрывала иконки вместе с нажатиями по ним. Нижний отступ убран:
     полоса выреза теперь и так под меню, а не под этой панелью. */
  .trip-mode .trip-sticky-action{position:fixed;z-index:42;right:0;bottom:calc(74px + env(safe-area-inset-bottom, 0px));left:0;padding:10px 16px;background:rgba(255,255,255,.96);box-shadow:0 -8px 24px rgba(20,23,28,.12);backdrop-filter:blur(10px)}
  .trip-mode .trip-sticky-action form:first-child{flex:1 1 100%}
  .trip-mode .trip-sticky-action form:first-child button{width:100%;min-height:52px}
  .trip-mode .ticket-pick{border-radius:15px;background:#fff}
  .trip-mode .ticket-pick-box{min-height:48px;padding:8px 12px}
}

/* Выбор заявок на выезде: взять три из пяти, а не всё подряд. */
.ticket-pick{display:flex;align-items:stretch;gap:10px}
.ticket-pick .ticket-card{flex:1;min-width:0}
.ticket-pick-box{flex:none;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:4px;min-width:52px;padding:0 6px;border:1px solid var(--line);
  border-radius:14px;background:#fff;font-size:11px;color:#777;cursor:pointer}
.ticket-pick-box input{width:22px;height:22px;accent-color:#c8511b}

/* ---------- Mobile UX safety pass ---------- */

/* Белый текст на исходном var(--accent) не проходил контраст для обычного текста.
   Основные кнопки используют уже существующий тёмный оттенок бренда. */
.file-field-button{background:var(--brand-dark)}
button:disabled,[aria-busy="true"] button{cursor:wait;opacity:.62;transform:none}

/* Предупреждение о сети идёт после шапки и остаётся в потоке. Когда обе полосы
   были sticky с top:0, поздняя перекрывала шапку и её элементы управления. */
.network-banner{position:relative}
#network-retry{min-height:var(--tap);min-width:var(--tap)}

/* Реальные управляющие элементы должны иметь общую зону касания. */
.topbar-action,.brand,.selection-close,.search-clear,.photo-viewer-close,
.archive-row a,.trip-actions button{
  min-width:var(--tap);min-height:var(--tap)
}

/* Нижняя навигация на телефоне занимала тот же край, к которому была приклеена
   панель редактора. Оставляем действия видимыми, но выше системной навигации. */
@media(max-width:899px){
  .editor-actions{bottom:calc(77px + env(safe-area-inset-bottom))}
}

.field-error{display:block;margin-top:5px;color:var(--danger);font-size:13px;font-weight:700}
.field-error[hidden]{display:none}
.field-error.is-info{color:var(--muted);font-weight:500}
.file-field input[aria-invalid="true"]+.file-field-ui{border-color:var(--danger);box-shadow:0 0 0 3px rgba(198,47,26,.12)}

/* Это неопределённое состояние, а не выдуманный процент загруженных байтов. */
.upload-progress-bar.is-indeterminate{width:38%;animation:upload-indeterminate 1.15s ease-in-out infinite}
@keyframes upload-indeterminate{
  0%{transform:translateX(-120%)}
  100%{transform:translateX(300%)}
}

/* Служебная история объекта нужна администратору, но не должна выглядеть
   главным содержимым карточки при каждом обычном открытии. */
.object-admin-history>summary{min-height:var(--tap);cursor:pointer;color:var(--muted);font-weight:700}
.object-admin-history[open]>summary{margin-bottom:12px;color:var(--ink)}
.object-tickets-details>summary{display:flex;align-items:center;gap:8px;min-height:var(--tap);margin-top:0;cursor:pointer;font-size:16px;font-weight:700;color:var(--ink)}
.object-tickets-details>summary .icon{color:var(--brand)}
.object-tickets-details[open]>summary{margin-bottom:2px}
.expense-adjustment-history>summary{min-height:var(--tap);padding:12px 0;cursor:pointer;font-weight:700}

/* В мобильном просмотре Edge у свёрнутых действий заявки и расхода фактическая
   зона summary оставалась высотой только 14–24 px. Вся строка раскрытия должна
   быть полноценной touch-зоной, а не только высотой текста. */
.expense-action-card>summary,.task-time-fix>summary,.task-help-ask>summary,
.task-side-states>summary,.ai-reco>summary,.task-attempts>summary{
  display:flex;align-items:center;min-height:var(--tap)
}

/* ---------- Mobile workflow redesign ---------- */

/* Карточка объекта: один главный сценарий (маршрут), остальные команды — в
   компактном меню. На телефоне пять одинаковых чипов скрывали главное действие. */
.object-actions-more{position:relative}
.object-actions-more>summary{list-style:none}
.object-actions-more>summary::-webkit-details-marker{display:none}
.object-actions-more[open]>summary{border-color:var(--brand-dark);background:var(--panel-hover)}
.object-actions-menu{position:absolute;z-index:35;top:calc(100% + 8px);right:0;display:grid;min-width:245px;padding:7px;border:1px solid var(--border);border-radius:15px;background:#fff;box-shadow:0 18px 42px rgba(20,23,28,.18)}
.object-actions-menu form{margin:0}
.object-actions-menu a,.object-actions-menu button{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:10px 12px;border:0;border-radius:10px;background:transparent;color:var(--ink);font:650 14px var(--font-b);text-align:left;text-decoration:none;cursor:pointer}
.object-actions-menu a:active,.object-actions-menu button:active{background:var(--panel-hover)}
.object-actions-menu .is-favorite{color:var(--warn)}
.asset-next-action{border-color:#ecd39a;background:linear-gradient(135deg,var(--panel-2),#fff7e9)}
.asset-next-action>span{display:block;margin-bottom:4px;color:var(--warn);font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase}
.chart-details{margin-top:14px;border-top:1px solid var(--border)}
.chart-details>summary{min-height:44px;padding:12px 0;cursor:pointer;color:var(--brand-dark);font-size:12px;font-weight:750}
.chart-details-table{overflow-x:auto;border:1px solid var(--border);border-radius:10px;background:#fff}
.chart-details-row{display:grid;grid-template-columns:minmax(130px,1fr) 100px 120px;gap:8px;align-items:center;padding:9px 12px;border-top:1px solid var(--border);font-size:12px}
.chart-details-row:first-child{border-top:0}.chart-details-row strong{text-align:right}.chart-details-head{background:var(--panel-2);color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase}.chart-details-head span:not(:first-child){text-align:right}
.object-section-nav{display:flex;gap:7px;margin:14px 0 2px;overflow-x:auto;scrollbar-width:none}
.object-section-nav::-webkit-scrollbar{display:none}
.object-section-nav a{display:inline-flex;align-items:center;gap:6px;flex:none;min-height:40px;padding:8px 12px;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--ink);font-size:12px;font-weight:750;text-decoration:none}
.object-section-nav a span{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--panel-hover);color:var(--brand-dark);font-size:10px}
.object-anchor-section{scroll-margin-top:74px}

/* У заявки всегда виден ответ на вопрос «что дальше»: этапная кнопка либо
   переход к отчёту. Сама форма получает отдельную визуальную роль рабочего шага. */
.ticket-next-action,.expense-next-action{display:flex;text-decoration:none}
.ticket-next-action{align-items:center;justify-content:center;width:100%;min-height:52px;margin-top:12px;border-radius:13px;background:var(--brand-dark);color:#fff;font-weight:800}
.report-workspace{border-color:#c5ddd8;box-shadow:0 10px 30px rgba(112,56,31,.08);scroll-margin-top:76px}
.report-workspace-head{margin:-18px -18px 2px;padding:17px 18px 15px;border-radius:16px 16px 0 0;background:linear-gradient(135deg,var(--accent-soft),#fff)}
.report-workspace-head>span{color:var(--brand-dark);font-size:10px;font-weight:850;letter-spacing:.08em;text-transform:uppercase}
.report-workspace-head h2{margin:3px 0 2px}
.report-workspace-head p{margin:0;color:var(--muted);font-size:13px}
.report-submit-bar{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}

/* Расход: перед цифрами показываем одно актуальное действие, а не заставляем
   искать нужную форму среди финансовой истории. */
.expense-next-action{flex-direction:column;margin:0 0 14px;padding:15px 17px;border-radius:16px;background:linear-gradient(135deg,var(--ink),#463428);color:#fff;box-shadow:0 10px 24px rgba(20,23,28,.14)}
.expense-next-action span{color:#f1b296;font-size:10px;font-weight:850;letter-spacing:.08em;text-transform:uppercase}
.expense-next-action strong{margin-top:2px;font:700 18px var(--font-d)}
.expense-next-action small{color:var(--line);font-size:12px}
.expense-receipt-action{scroll-margin-top:76px;border-color:#c5ddd8}

@media(max-width:620px){
  .ticket-mobile-hero,.expense-mobile-hero{margin:3px 0 14px;padding:14px 15px;border:1px solid var(--border);border-radius:18px;background:#fff}
  .ticket-mobile-hero h1,.expense-mobile-hero h1{font-size:23px;line-height:1.16}
  .ticket-mobile-hero p,.expense-mobile-hero p{font-size:12px;line-height:1.4}
  .location-actions{display:grid;grid-template-columns:minmax(0,1fr) auto}
  .location-actions>.action-primary{justify-content:center}
  .object-actions-more>summary{justify-content:center;min-width:92px}
  .object-section-nav{margin-inline:-2px}
  .report-submit-bar{grid-template-columns:1fr}
  .report-submit-bar button{width:100%;min-height:52px}
  .report-submit-bar .secondary-button{min-height:48px}
  .expense-money-card div{padding:13px}
  .expense-money-card strong{font-size:17px}
}

/* ── Final visual consistency layer ───────────────────────────────────────
   Historical CSS stays intact above; these rules standardise only shared states
   so a later component change does not create another visual dialect. */
:where(a,button,input,select,textarea,summary):focus-visible{
  outline:3px solid rgba(198,81,27,.58);
  outline-offset:3px;
}
:where(.card,.dash-panel,.expense-row,.ticket-card,.asset-card,.object){
  transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease;
}
:where(.expense-row,.ticket-card,.asset-card,.object):hover{
  border-color:#d8c6bb;
  box-shadow:0 8px 22px rgba(20,23,28,.08);
}
:where(.secondary-button,.secondary-link,.quick-filter,.sort-button,.asset-scope a,.view-switch-btn):active{
  transform:translateY(1px);
}
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}

/* ---------- Mobile work queue ----------
   The technician scans for place, problem and next action. On a phone the
   counters live behind the «Фильтры» button, not as a visible strip — see
   .work-filter-trigger/.ticket-filter-strip{display:none} above. */
.mobile-work-heading p{margin:5px 0 0;color:var(--muted);font-size:14px}

@media(max-width:620px){
  .mobile-work-heading{margin-bottom:12px}
  .mobile-work-heading h1{font-size:27px;line-height:1.08}
  .mobile-work-heading .eyebrow{font-size:10px;letter-spacing:.08em}
  .ticket-card{border-radius:17px;padding:14px;box-shadow:none}
  .ticket-card-body{gap:4px}
  .ticket-card-object{font-size:12px;font-weight:700}
  .ticket-card-what{font-size:15px;line-height:1.34;font-weight:700}
  .ticket-card-meta{align-items:center;margin-top:3px}
  .ticket-card-number{margin-left:auto;color:var(--muted);font-size:11px;font-weight:700}
  .bottom-nav a:first-child span{font-weight:700}
}

/* ---------- Mobile completion pass ---------- */
.page .ticket-next-action{color:#fff}
.admin-primary-action{width:auto}
.analytics-filter-panel>summary{display:none}
@media(min-width:701px){.analytics-filter-panel:not([open])>.analytics-filters{display:grid}}
.asset-admin-menu{position:relative}
.asset-admin-menu>summary{list-style:none}
.asset-admin-menu>summary::-webkit-details-marker{display:none}
.asset-admin-menu>div{position:absolute;z-index:30;top:calc(100% + 7px);right:0;display:grid;min-width:230px;padding:7px;border:1px solid var(--border);border-radius:14px;background:#fff;box-shadow:0 16px 36px rgba(20,23,28,.16)}
.asset-admin-menu>div a{display:flex;align-items:center;min-height:48px;padding:9px 12px;border-radius:9px;color:var(--ink);font-weight:700;text-decoration:none}
.asset-admin-menu>div a:hover{background:var(--panel-hover)}
.review-batch-list{display:grid;gap:12px}
.review-batch-card{padding:16px;border:1px solid var(--border);border-radius:16px;background:#fff}
.review-batch-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.review-batch-head span{display:block;color:var(--muted);font-size:12px;margin-top:2px}
.review-batch-flag{padding:5px 9px;border-radius:999px;background:var(--warn-bg);color:var(--warn);font-size:11px;font-weight:800;white-space:nowrap}
.review-batch-text{margin:8px 0 0;color:var(--muted);font-size:13px}
.review-batch-form{display:flex;flex-wrap:wrap;align-items:end;gap:10px;margin-top:10px}
.review-batch-form label{display:grid;gap:4px;font-size:11px;color:var(--muted);font-weight:800}
.review-batch-form input[type="number"]{width:90px;min-height:42px;padding:8px 10px;border:1px solid var(--border);border-radius:10px}
.review-batch-actions{display:flex;flex-wrap:wrap;gap:8px}
.mobile-form-group{display:grid;gap:12px;margin:0;padding:0;border:0}
.mobile-form-group legend{margin-bottom:2px;font:700 17px var(--font-d)}
.field-hint{margin:-6px 0 0;padding:7px 11px;border-radius:10px;background:var(--accent-soft);color:var(--brand-dark);font-size:12px;font-weight:700;cursor:pointer}
.field-hint:hover{background:#ffe4d5}

@media(max-width:620px){
  .mobile-focus-form.has-bottom-nav{padding-bottom:0}
  .mobile-focus-form .bottom-nav{display:none}
  .mobile-focus-form .page{padding-bottom:24px}
  .mobile-focus-form .editor-actions{bottom:0;margin-inline:-4px;padding-bottom:calc(12px + env(safe-area-inset-bottom))}
  .admin-head{display:flex;align-items:stretch;flex-direction:column;gap:12px}
  .admin-primary-action{width:100%;min-height:52px}
  .analytics-filters select,.analytics-filter-button,.analytics-filter-reset,
  .analytics-tab,.user-manage>summary,.role-form select,.role-form button,
  .registry-filters input,.registry-filters select,.registry-filters button,
  .object-section-nav a{min-height:48px}
  .registry-filters input[type="date"]{display:block;width:100%;min-width:0;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:#fff;color:var(--ink);font:inherit}
  .expense-form input[type="date"],.receipt-edit input[type="date"]{display:block;width:100%;min-height:48px;padding:10px 12px;border:1px solid var(--border);border-radius:10px;background:#fff;color:var(--ink);font:inherit}
  .account-card{margin:12px auto}
  .account-card:first-of-type{padding-block:18px}
  .expense-difference span{max-width:130px;line-height:1.25}
  .ticket-next-action{position:relative;z-index:1}
  .ai-reco{border-color:#ecd39a}
  .expense-filter-summary{display:flex;gap:8px;margin:0 -16px 14px;padding:2px 16px 6px;overflow-x:auto;scrollbar-width:none}
  .expense-filter-summary::-webkit-scrollbar{display:none}
  .expense-filter-summary>a{display:block;flex:none;color:inherit;text-decoration:none}
  .expense-filter-summary article{display:flex;align-items:center;gap:6px;min-height:48px;padding:0 14px;border:1px solid var(--border);border-radius:999px;background:#fff;box-shadow:none}
  .expense-filter-summary article strong,.expense-filter-summary article span{font-size:13px;white-space:nowrap}
  .expense-filter-summary>a.is-active article{border-color:var(--ink);background:var(--ink);color:#fff}
  .analytics-filter-panel{margin:0 0 10px}
  .analytics-filter-panel>summary{display:flex;align-items:center;gap:8px;min-height:48px;padding:10px 12px;border:1px solid var(--border);border-radius:13px;background:#fff;list-style:none;font-size:13px;font-weight:800;cursor:pointer}
  .analytics-filter-panel>summary::-webkit-details-marker{display:none}
  .analytics-filter-panel>summary span{margin-left:auto;color:var(--muted);font-size:11px;font-weight:600}
  .analytics-filter-panel[open]>summary{border-radius:13px 13px 0 0}
  .analytics-filter-panel .analytics-filters{border-top:0;border-radius:0 0 13px 13px}
  .asset-head-actions{display:grid;grid-template-columns:1fr 1fr;width:100%}
  .asset-head-actions>*{min-width:0}
  .asset-admin-menu>summary{width:100%}
  .asset-admin-menu>div{left:0;right:auto;min-width:min(260px,calc(100vw - 32px))}
  .mobile-form-group{gap:10px;padding:15px;border:1px solid var(--border);border-radius:15px;background:#fff}
  .mobile-form-group+.mobile-form-group{margin-top:4px}
  .mobile-focus-form .expense-form-shell{padding:0;border:0;background:transparent;box-shadow:none}
  .mobile-focus-form .expense-form-shell>header{padding:0 2px}
}

/* Экран «Здоровье системы». Первый блок — вердикт: зелёная страница должна
   читаться за секунду, не листая. */
.health-section{margin:0 0 14px;padding:13px 14px;border:1px solid var(--border);border-radius:14px;background:var(--panel)}
.health-section h2{display:flex;align-items:center;gap:7px;margin:0 0 9px;font-size:14px}
.health-section.is-bad{border-color:var(--danger);background:var(--danger-bg)}
.health-section.is-ok{border-color:var(--ok);background:var(--ok-bg)}
.health-rows{display:grid;gap:8px;margin:0;padding:0;list-style:none}
.health-rows li{display:flex;align-items:flex-start;gap:9px}
.health-rows small{display:block;color:var(--muted);font-size:11px}
.health-dot{flex:none;margin-top:5px;width:9px;height:9px;border-radius:50%;background:var(--ok)}
.health-dot.bad{background:var(--danger)}
.health-list{margin:0;padding-left:18px;display:grid;gap:4px;font-size:13px}
.health-bar{display:block;width:100%;height:8px;border:0;border-radius:999px;background:var(--border);overflow:hidden;margin:6px 0 10px;-webkit-appearance:none;appearance:none}
.health-bar::-webkit-progress-bar{background:var(--border);border-radius:999px}
.health-bar::-webkit-progress-value{background:var(--ok);border-radius:999px}
.health-bar::-moz-progress-bar{background:var(--ok);border-radius:999px}
.health-bar.bad::-webkit-progress-value{background:var(--danger)}
.health-bar.bad::-moz-progress-bar{background:var(--danger)}

/* Экран проверки отчёта перед отправкой: подсказка, не преграда. */
.precheck-card{padding:14px;border:1px solid var(--warn);border-radius:14px;background:var(--warn-bg)}
.precheck-card h2{display:flex;align-items:center;gap:7px;margin:0 0 9px;font-size:14px}
.precheck-gaps{margin:0 0 12px;padding:0;list-style:none;display:grid;gap:6px}
.precheck-gaps li{padding:8px 11px;border:1px solid var(--warn);border-radius:11px;background:var(--panel);font-size:13px;font-weight:700}
.precheck-actions{display:grid;gap:8px;margin-top:10px}

/* История объекта: одна лента заявок, ППР и покупок. */
.history-month{margin:0 0 16px}
.history-month h2{margin:0 0 8px;font-size:13px;color:var(--muted)}
.history-rows{margin:0;padding:0;list-style:none;display:grid;gap:7px}
.history-row{display:flex;gap:10px;align-items:flex-start;padding:9px 12px;border:1px solid var(--border);border-radius:12px;background:var(--panel)}
.history-row small{display:block;color:var(--muted);font-size:11px;margin-top:2px}
.history-row a{color:inherit;text-decoration:none}
.history-dot{flex:none;display:grid;place-items:center;width:26px;height:26px;border-radius:9px;background:var(--bg);color:var(--muted)}
.history-row.is-fault .history-dot{color:var(--brand)}
.history-row.is-routine .history-dot{color:var(--ok)}
/* Блок «на этом объекте» в карточке заявки. */
.object-context-title{margin:9px 0 4px;font-size:11px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.03em}

/* Привязка покупки к заявке Техзора. */
.expense-linked-ticket{margin:6px 0 0;padding:7px 11px;border:1px solid var(--border);border-radius:11px;background:var(--bg);font-size:12px}
.expense-linked-ticket a{font-weight:800}

/* Явное исключение «покупка вне заявки» на форме денег. */
.expense-no-ticket{display:flex;gap:8px;align-items:flex-start;font-size:12px;color:var(--muted);font-weight:700}
.expense-no-ticket input{margin-top:2px}

/* Предупреждение о рецидиве/дубле на карточке заявки. */
.related-warning{margin:0 0 12px;padding:10px 13px;border:1px solid var(--warn);border-radius:12px;background:var(--warn-bg);display:grid;gap:6px}
.related-warning p{margin:0;font-size:13px;display:flex;gap:7px;align-items:baseline}
.related-warning a{font-weight:800}

/* Оборудование объекта: карточка единицы и привязки. */
.equipment-kpis{margin-bottom:14px}
.equipment-photo img{max-width:220px;border-radius:11px;display:block;margin-bottom:10px}
.equipment-passport{margin:0;display:grid;gap:6px;font-size:13px}
.equipment-passport div{display:flex;gap:8px}
.equipment-passport dt{color:var(--muted);min-width:130px}
.equipment-passport dd{margin:0;font-weight:700}
.equipment-warranty{color:var(--ok);font-style:normal;font-weight:800}
.equipment-warranty-badge{display:flex;gap:6px;align-items:center;margin:6px 0 0;padding:6px 10px;border:1px solid var(--ok);border-radius:10px;background:var(--ok-bg);font-size:12px;font-weight:700}
.equipment-hint{display:flex;gap:10px;align-items:center;flex-wrap:wrap;font-size:13px;font-weight:700}
.equipment-pick summary{cursor:pointer;font-size:12px;margin-top:6px}
.equipment-link-list{list-style:none;margin:0 0 10px;padding:0;display:grid;gap:6px;font-size:13px}
.equipment-link-list label{display:flex;gap:8px;align-items:baseline}
.maintenance-equipment-link{margin-top:4px}

/* ── ППР: пообъектный каталог — телефон как основной сценарий ── */
.ppr-open-catalog{display:inline-flex;text-decoration:none}
.ppr-objects{display:flex;flex-direction:column;margin-top:4px}
.ppr-object-row{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:var(--tap);padding:13px 2px;border-top:1px solid var(--border);color:inherit;text-decoration:none}
.ppr-object-row:first-child{border-top:0}
.ppr-object-row strong{font-size:14px}
.ppr-object-row small{display:block;margin-top:3px;color:var(--muted);font-size:12px}
.ppr-object-row:active{background:var(--panel-hover)}
.ppr-object-title{margin:10px 0 6px;font-size:18px}
.ppr-chips{display:flex;gap:8px;margin:4px 0 12px;padding-bottom:4px;overflow-x:auto;-webkit-overflow-scrolling:touch}
.ppr-chips a{flex:none;display:inline-flex;align-items:center;min-height:36px;padding:6px 13px;border:1px solid var(--border);border-radius:999px;background:var(--panel);color:inherit;font-size:12px;text-decoration:none;white-space:nowrap}
.ppr-chips a.is-active{border-color:var(--brand);background:var(--brand);color:#fff}
.ppr-enable-group{margin-top:8px;border:1px solid var(--border);border-radius:12px;padding:4px 12px}
.ppr-enable-group summary{display:flex;align-items:center;gap:8px;min-height:var(--tap);cursor:pointer;font-weight:700;font-size:14px}
.ppr-enable-group summary .text-button{margin-left:auto}
.ppr-enable-group .checkbox-label{display:flex;gap:10px;align-items:center;min-height:var(--tap);margin:0;font-size:13px}
.ppr-enable-group input[type="checkbox"]{width:20px;height:20px;flex:none}
/* Строка планирования: на широком экране — колонки таблицы (работа ·
   план · факты · действия), на телефоне те же блоки стопкой. Один markup,
   раскладку решает CSS — дублировать разметку под два экрана нельзя. */
.ppr-plan-head{display:none;gap:14px;padding:0 2px 6px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em}
.ppr-plan-row{display:grid;gap:10px 14px;padding:14px 2px;border-top:1px solid var(--border)}
.ppr-plan-row:first-child{border-top:0}
.ppr-plan-row.is-off{opacity:.62}
.ppr-plan-work strong{display:block;font-size:14px}
.ppr-plan-work small{display:block;margin-top:2px;color:var(--muted);font-size:11px}
.ppr-plan-work small.ppr-plan-note{color:var(--warn)}
.ppr-plan-inline{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.ppr-plan-inline select{min-height:36px;max-width:100%}
.ppr-plan-edit{display:flex;flex-wrap:wrap;align-items:end;gap:8px;margin:0}
.ppr-plan-edit label{margin:0;color:var(--muted);font-size:11px}
.ppr-plan-edit input{min-height:40px;margin-top:3px}
.ppr-plan-edit input[type="number"]{width:88px}
.ppr-plan-edit input[type="date"]{width:150px}
.ppr-plan-edit .secondary-button{min-height:40px;padding:8px 14px;font-size:12px}
.ppr-plan-facts small{display:block;color:var(--muted);font-size:11px}
.ppr-plan-facts small.maintenance-link-warning{color:var(--danger)}
.ppr-plan-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.ppr-plan-actions form{margin:0}
@media(min-width:900px){
  .ppr-plan-head{display:grid;grid-template-columns:minmax(0,2.1fr) 300px minmax(0,1fr) 190px}
  .ppr-plan-row{grid-template-columns:minmax(0,2.1fr) 300px minmax(0,1fr) 190px;align-items:start}
  .ppr-plan-actions{justify-content:flex-end}
}
@media(max-width:899px){
  /* Телефон: план — крупные поля во всю ширину, действия — кнопками. */
  .ppr-plan-edit{align-items:stretch}
  .ppr-plan-edit label{flex:1;min-width:130px}
  .ppr-plan-edit input{width:100%;min-height:var(--tap)}
  .ppr-plan-edit input[type="number"],.ppr-plan-edit input[type="date"]{width:100%}
  .ppr-plan-edit .secondary-button{width:100%;min-height:var(--tap);font-size:13px}
  .ppr-plan-actions{gap:10px}
  .ppr-plan-actions form{flex:1 1 140px}
  .ppr-plan-actions .text-button{width:100%;min-height:var(--tap);padding:10px;font-size:13px}
  .ppr-plan-inline{flex-direction:column;align-items:stretch}
  .ppr-plan-inline select{min-height:var(--tap)}
  .ppr-plan-inline .text-button{min-height:var(--tap);width:100%}
}

/* Меню разделов на широком экране: та же шторка, но по центру — на
   десктопе нижняя панель скрыта, и это единственный вход в графики
   обслуживания, аналитику, табель и здоровье системы. */
@media(min-width:900px){
  .ui-bottom-sheet.app-more-sheet{margin:auto;width:min(560px,calc(100% - 48px));padding:20px 24px 24px;border-radius:22px;box-shadow:0 26px 64px rgba(20,23,28,.26);transform:translateY(14px) scale(.985)}
  .ui-bottom-sheet.app-more-sheet[open]{transform:none}
  .app-more-sheet .ui-bottom-sheet-handle{display:none}
}
.ppr-object-open{display:inline-flex;align-items:center;gap:4px;flex:none;padding:6px 12px;border:1px solid var(--border);border-radius:999px;color:var(--brand-dark);font-size:12px;font-weight:700}
.ppr-plan-object{color:var(--brand-dark)!important;font-weight:700}

/* Визиты (модель v2, этап 4) */
.visit-item.is-done{opacity:.85}
.visit-item-photo{max-width:160px;border-radius:8px;display:block;margin-top:.5rem}
/* form label задаёт display:block и тем самым перебивает атрибут hidden:
   «Причина» оставалась на экране при норме, хотя JS её прятал. */
.visit-item-details label[hidden]{display:none}
.visit-result{display:flex;gap:1rem;flex-wrap:wrap;border:0;padding:0}
.visit-item-actions{margin-top:.5rem}
.visit-result .is-active{outline:2px solid var(--accent,#2b6cb0)}
.visit-item header input[type=checkbox]{margin-right:.5rem}
.visit-bulk{display:flex;gap:.75rem;align-items:center;flex-wrap:wrap;margin-bottom:.75rem}

/* Визиты: табличный режим (консилиум №10) */
.visit-table-head{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;flex-wrap:wrap}
.visit-table-toolbar{display:flex;gap:.75rem;align-items:center;flex-wrap:wrap;margin:.5rem 0}
.visit-table-toolbar kbd{font-size:.8em;opacity:.7;margin-left:.35rem}
.visit-table-wrap{overflow-x:auto}
.visit-table{width:100%;border-collapse:collapse;font-size:.95rem}
.visit-table th,.visit-table td{padding:.45rem .5rem;border-bottom:1px solid var(--border,#e5e5e5);vertical-align:top;text-align:left}
.visit-row:focus{outline:2px solid var(--accent,#2b6cb0);outline-offset:-2px}
.visit-row.is-done{opacity:.7}
.visit-row.is-defect .visit-row-title{border-left:3px solid #c0392b;padding-left:.4rem}
.visit-row.is-skipped .visit-row-title{border-left:3px solid #999;padding-left:.4rem}
.visit-cell-result label{display:block;text-align:center;cursor:pointer;padding:.3rem;border-radius:6px}
.visit-cell-result input{margin:0 0 .15rem}
.visit-cell-result label:has(input:checked){background:var(--panel-hover,#eef)}
.visit-cell-photo{min-width:9rem}
.visit-cell-photo.is-over{background:var(--panel-hover,#eef)}
.visit-cell-photo input[type=file]{width:100%;font-size:.8rem}
.visit-table-thumb{max-width:80px}
.visit-table input[type=text]{width:100%}

/* Плановое обслуживание: три экрана, таблица с панелью правки (03.09.2026) */
.mt-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}
.mt-nav{display:flex;gap:6px}
.mt-nav a{display:inline-flex;align-items:center;min-height:36px;padding:6px 14px;border:1px solid var(--border);border-radius:999px;color:inherit;text-decoration:none;font-size:13px}
.mt-nav a.is-active{background:var(--brand);border-color:var(--brand);color:#fff}
.mt-alerts p{margin:4px 0;font-size:13px}
.mt-toolbar{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.mt-toolbar .secondary-button{display:inline-flex;align-items:center;gap:6px;text-decoration:none}
.mt-details{margin-bottom:12px}
.mt-details[hidden]{display:none}
.mt-panel-form label:has(> input[required])::before,.mt-panel-form label:has(> select[required])::before{content:none}
.mt-details>summary{cursor:pointer;font-weight:700;min-height:var(--tap);display:flex;align-items:center;gap:8px}
.mt-table-wrap{overflow-x:auto}
.mt-table{width:100%;border-collapse:collapse;font-size:14px}
.mt-table th{text-align:left;padding:6px 8px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border);white-space:nowrap}
.mt-table td{padding:10px 8px;border-bottom:1px solid var(--border);vertical-align:top}
.mt-table .num{text-align:right;white-space:nowrap}
.mt-table input[type=checkbox]{width:20px;height:20px;margin:0}
.mt-row{cursor:pointer}
.mt-row:hover,.mt-row.is-open{background:rgba(0,0,0,.03)}
.mt-row.is-off{opacity:.6}
.mt-row.has-warning td.mt-work{border-left:3px solid var(--danger)}
.mt-row-link{color:inherit;text-decoration:none;font-weight:700}
.mt-chevron{color:var(--muted);white-space:nowrap}
.mt-edit-link{font-size:12px;white-space:nowrap}
.mt-badge{display:inline-block;padding:1px 8px;border-radius:999px;background:var(--panel-hover,#eee);font-size:11px;white-space:nowrap}
.mt-units{line-height:1.5}
.mt-panel td{background:rgba(0,0,0,.03);padding:12px 14px}
.mt-child+.mt-child{margin-top:12px;padding-top:12px;border-top:1px dashed var(--border)}
.mt-child h4{margin:0 0 6px;font-size:13px}
.mt-panel-form{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:flex-end}
.mt-panel-form label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}
.mt-panel-form label.mt-wide{flex:1 1 100%}
.mt-panel-form input,.mt-panel-form select,.mt-panel-form textarea{min-height:36px;font-size:14px}
.mt-panel-actions{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;margin-top:8px}
.mt-inline{display:flex;gap:6px;align-items:center;margin:0}
.mt-inline select{min-height:36px;max-width:220px}
.mt-bulk{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 10px;padding:8px 10px;border:1px solid var(--border);border-radius:12px;font-size:13px}
.mt-bulk label{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--muted)}
.mt-bulk.has-selection{border-color:var(--brand)}
.mt-bulk-count{font-weight:700}
.checkbox-label.is-muted{opacity:.55}
@media (max-width:640px){
  .mt-works th:nth-child(3),.mt-works td.num{display:none}
  .mt-works th:nth-child(5),.mt-works tr.mt-row td:nth-child(5){display:none}
  .mt-objects th:nth-child(2),.mt-objects tr.mt-row td:nth-child(2){display:none}
}
.mt-program h2{display:flex;align-items:baseline;gap:10px;margin:0 0 8px;font-size:17px}
.mt-program-add{margin:10px 0 0}

/* Деньги заявки: наличные и счета одной суммой. Итог крупнее списка —
   в разговоре спрашивают именно его. */
.ticket-money-total { margin: 6px 0 10px; font-size: 15px; }
.ticket-money-total b { font-size: 17px; }
.ticket-money .similar-tickets-list { margin-top: 4px; }

/* КП (offers): реестр, карточка, продажа в блоке денег заявки */
.offers-filters{grid-template-columns:repeat(6,minmax(110px,1fr)) auto auto}
.offers-row{grid-template-columns:32px 120px minmax(220px,1fr) 100px 100px 110px 100px 130px;min-width:960px}
.offers-row span:nth-child(2),.offers-row span:nth-child(3),.offers-row span:nth-child(6),.offers-row span:nth-child(8){display:grid}
.offers-row input[type=checkbox]{margin:0;width:18px;height:18px}
.offers-row.is-rejected{color:var(--muted)}.offers-total-row{background:var(--panel-2);font-weight:800}
.offers-bulk .expense-inline label{flex:0 1 220px}.offers-bulk button[disabled]{opacity:.5}
.offer-links{margin-top:6px}.offer-facts{display:grid;gap:6px;margin:10px 0 0}.offer-facts div{display:grid;grid-template-columns:160px minmax(0,1fr);gap:8px}.offer-facts dt{color:var(--muted);font-size:12px}.offer-facts dd{margin:0}.offer-facts dd small{display:block;color:var(--muted)}
.offer-totals{justify-items:end;margin-top:12px}.offer-totals div{grid-template-columns:auto auto;justify-content:end}
.offer-item-row{grid-template-columns:36px minmax(220px,1fr) 60px 80px 110px 120px;min-width:700px}.offer-item-row span:nth-child(2){display:grid}
.offer-action-forms form{margin:0}.offer-items-table{margin-top:10px}
.ticket-margin{display:flex;flex-wrap:wrap;gap:4px 6px;margin:10px 0 0;padding-top:10px;border-top:1px solid var(--border)}.ticket-margin small{flex-basis:100%;font-size:11px}
@media(max-width:620px){.offers-filters{grid-template-columns:1fr 1fr}.offer-facts div{grid-template-columns:1fr}.offer-totals{justify-items:start}}
@media print{.no-print,.bottom-nav,.flash,.notif-banner,.offer-journal,.offer-payment,.offer-actions,.ticket-money{display:none!important}.offer-head h1{font-size:22px}.offer-items-table{overflow:visible}.offer-item-row{min-width:0}}

/* offer-form: форма КП (этап 2). Цены позиций всегда без НДС. */
.offer-ai-import{display:grid;grid-template-columns:minmax(0,1fr) minmax(280px,420px);gap:12px 18px;align-items:end;margin:20px 0 4px;padding:18px 0;border-block:1px solid var(--border)}
.offer-ai-import h2,.offer-ai-import>p{grid-column:1/-1;margin:0}.offer-ai-import h2{font-size:17px}.offer-ai-import .file-field{width:100%;max-width:420px}.offer-ai-import .file-field-ui{min-height:46px}.offer-ai-import .file-field-button{flex:0 0 auto}.offer-ai-run{min-width:214px}.offer-ai-spinner{display:none;width:18px;height:18px;flex:0 0 18px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:offer-ai-spin .7s linear infinite}.offer-ai-run.is-loading .offer-ai-spinner{display:block}@keyframes offer-ai-spin{to{transform:rotate(360deg)}}
.offer-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-bottom:18px}
.offer-form-grid label{margin:0}
.offer-form-grid .offer-form-wide{grid-column:1/-1}
.offer-items-title{margin:18px 0 8px;font-size:17px}
.offer-items-scroll{overflow-x:auto;border:1px solid var(--border);border-radius:14px;background:#fff}
.offer-form-table{width:100%;min-width:720px;border-collapse:collapse}
.offer-form-table th{padding:10px 8px;border-bottom:1px solid var(--border);color:var(--muted);font-size:11px;text-align:left}
.offer-form-table td{padding:6px 8px;border-bottom:1px solid var(--border);vertical-align:middle}
.offer-form-table tr:last-child td{border-bottom:0}
.offer-form-table input,.offer-form-table select{min-height:40px;margin:0}
.offer-form-table .col-kind{width:130px}.offer-form-table .col-unit{width:96px}
.offer-form-table .col-qty{width:96px}.offer-form-table .col-price{width:140px}
.offer-form-table .col-sum{width:120px;text-align:right;font-variant-numeric:tabular-nums}
.object-ticket-links{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 4px}
.offer-form-table .price-source{display:block;margin-top:2px;font-size:11px;line-height:1.2;color:var(--muted)}.offer-form-table .price-source.is-estimate{color:var(--danger);font-weight:600}
.offer-form-table .col-drop{width:48px}
.offer-row-drop{min-height:40px;padding:0 12px;font-size:18px;line-height:1}
.offer-form-total{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;margin:16px 0;overflow:hidden;border:1px solid var(--border);border-radius:14px;background:var(--border)}
.offer-form-total div{padding:13px;background:#fff}
.offer-form-total span{display:block;color:var(--muted);font-size:11px}
.offer-form-total strong{display:block;font-size:17px;font-variant-numeric:tabular-nums}
.offer-form-total small{grid-column:1/-1;padding:8px 13px;background:#fff}
@media(max-width:620px){.offer-ai-import,.offer-form-grid{grid-template-columns:1fr}.offer-ai-import .file-field{max-width:none}.offer-form-total{grid-template-columns:1fr}}

/* Подпись у перенесённых КП, где цены на бланке уже включают НДС. */
.offer-vat-note{margin:0 0 10px;padding:9px 12px;border-radius:10px;background:var(--work-soft);color:var(--work);font-size:12.5px}

/* Первый экран реестра КП: панель, чипы, плитки, группы. */
.offers-toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:11px}
.offers-toolbar .offers-search{flex:1 1 260px}
.offers-controls{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:0 0 12px}
.offers-search{flex:1 1 240px;min-width:0;margin:0}
.offers-group-switch{display:flex;align-items:center;gap:8px;flex-wrap:wrap;color:var(--muted);font-size:12.5px}
.offers-group-option{color:var(--muted);text-decoration:none;font-weight:700;padding:5px 9px;border:1px solid var(--border);border-radius:9px}
.offers-group-option.is-active{background:var(--panel-hover);border-color:var(--brand);color:var(--brand-dark)}
.offers-chips{display:flex;gap:7px;flex-wrap:wrap;align-items:center;margin-bottom:12px;font-size:12px}
.offers-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;border:1px solid var(--border);background:#fff;color:var(--ink);text-decoration:none;font-weight:600}
.offers-chip:hover{border-color:var(--brand);background:var(--panel-hover)}
.offers-chips-clear{color:var(--brand-dark);font-weight:700;font-size:12px}
.offers-filters-details{margin-bottom:14px}
.offers-filters-details>summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:6px;padding:8px 12px;border:1px solid var(--border);border-radius:10px;background:#fff;font-size:13px;font-weight:700;color:var(--muted)}
.offers-filters-details>summary::-webkit-details-marker{display:none}
.offers-filters-details>summary::after{content:"⌄"}
.offers-filters-details[open]>summary{margin-bottom:10px;border-color:var(--brand);color:var(--brand-dark)}
.offers-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;margin-bottom:16px;overflow:hidden;border:1px solid var(--border);border-radius:16px;background:var(--border)}
.offers-tiles div{display:flex;flex-direction:column;gap:2px;padding:14px 16px;background:#fff}
.offers-tiles span{color:var(--muted);font-size:11px}
.offers-tiles strong{font-size:19px;font-variant-numeric:tabular-nums}
.offers-tiles small{color:var(--muted);font-size:11px}
.offers-tiles .is-alarm{background:var(--danger-bg)}
.offers-tiles .is-alarm strong{color:var(--danger)}
.offers-row.offers-group{background:var(--panel-hover);font-weight:700}
.offers-row.offers-group strong{font-size:13.5px}
@media(max-width:620px){.offers-tiles{grid-template-columns:1fr}}

.offer-form textarea{width:100%;min-height:74px;padding:11px 13px;border:1px solid var(--border);
  border-radius:12px;background:#fff;color:var(--ink);font:inherit;font-size:14px;resize:vertical}
.offer-form textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(11,92,83,.12);outline:none}

/* Карточка КП: строка прохождения и деньги блоком (макет 07.09.2026). */
.offer-progress{display:flex;flex-wrap:wrap;gap:0;margin:0 0 16px;padding:0;list-style:none}
.offer-progress li{display:flex;flex-direction:column;gap:1px;padding:8px 13px;border:1px solid var(--border);background:#fff;color:var(--faint,#9a8c7e);font-size:12.5px;font-weight:700}
.offer-progress li:first-child{border-radius:11px 0 0 11px}
.offer-progress li:last-child{border-radius:0 11px 11px 0}
.offer-progress li+li{border-left:0}
.offer-progress li small{font-size:10.5px;font-weight:600;opacity:.85}
.offer-progress .is-done{background:var(--ok-bg);border-color:var(--ok-bg);color:var(--ok)}
.offer-progress .is-now{background:var(--brand-dark);border-color:var(--brand-dark);color:#fff}
.offer-progress .is-stop{background:var(--danger-bg);border-color:var(--danger-bg);color:var(--danger)}
.offer-progress .is-next{color:var(--muted);opacity:.7}
.offer-mail-note{margin:-8px 0 16px;color:var(--info,var(--work));font-size:12.5px}
.offer-money-card{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--border);border-radius:15px;background:var(--border)}
.offer-money-card div{padding:14px 16px;background:#fff}
.offer-money-card span{display:block;color:var(--muted);font-size:11px}
.offer-money-card strong{display:block;margin-top:3px;font-size:18px;font-variant-numeric:tabular-nums}
.offer-journal>summary{cursor:pointer;list-style:none}
.offer-journal>summary::-webkit-details-marker{display:none}
.offer-journal>summary::after{content:"⌄";float:right;color:var(--muted)}
@media(max-width:620px){.offer-money-card{grid-template-columns:1fr}.offer-progress li{flex:1 1 100%;border-radius:0!important;border-left:1px solid var(--border)!important;border-bottom:0}.offer-progress li:last-child{border-bottom:1px solid var(--border)}}

/* Стадии работ по КП: управление у админа, заметка технику в заявке. */
.offer-stage .stage-late{color:var(--danger);font-weight:700}
.ticket-stage-notes{display:grid;gap:8px;margin:0 0 14px}
.ticket-stage{display:grid;gap:2px;margin:0;padding:11px 14px;border-radius:13px;background:var(--warn-bg);color:var(--warn)}
.ticket-stage strong{font-size:14px}
.ticket-stage span{font-size:12px;opacity:.9}
.ticket-stage.is-ready{background:var(--ok-bg);color:var(--ok)}
.ticket-stage.is-late{background:var(--danger-bg);color:var(--danger)}

/* Реестр КП списком, а не таблицей на 960 px: тема — главное, что читают. */
.offers-list{display:grid;gap:8px}
.offers-group-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin:14px 0 2px;font-size:14px}
.offers-group-title:first-child{margin-top:0}
.offers-group-title small{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums;font-weight:600}
.offer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;padding:14px 16px;border:1px solid var(--border);border-radius:15px;background:#fff;color:var(--ink);text-decoration:none}
.offer-row:hover{border-color:var(--brand);background:var(--panel-hover)}
.offer-row-main{display:grid;gap:2px;min-width:0}
.offer-row-no{color:var(--brand-dark);font-size:11px;font-weight:800;letter-spacing:.03em}
.offer-row-main strong{font-size:15px;overflow-wrap:anywhere}
.offer-row-meta{color:var(--muted);font-size:12px;overflow-wrap:anywhere}
.offer-row-side{display:grid;justify-items:end;align-content:start;gap:3px;white-space:nowrap}
.offer-row-side b{font-size:16px;font-variant-numeric:tabular-nums}
.offer-row-side small{color:var(--muted);font-size:11px;font-variant-numeric:tabular-nums}
.offer-pill{margin-top:3px;padding:3px 9px;border-radius:999px;background:#efece9;color:var(--muted);font-size:10.5px;font-weight:800}
.offer-pill-formed{background:var(--work-soft);color:var(--work)}
.offer-pill-rejected{background:var(--danger-bg);color:var(--danger)}
.offer-row.is-rejected{opacity:.72}
.offers-list-total{margin:14px 0 0;padding-top:12px;border-top:1px solid var(--border);color:var(--muted);font-size:13px}
.offers-list-total strong{color:var(--ink);font-variant-numeric:tabular-nums}
/* Фильтры: подпись над полем, поля одной высоты, а не вжатые в строку. */
.offers-filters{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;align-items:end}
.offers-filters label{display:grid;gap:4px;margin:0;color:var(--muted);font-size:12px;font-weight:700}
.offers-filters select,.offers-filters input{margin:0;min-height:44px}
.offers-filters button{min-height:44px}
.offers-filters>a{align-self:center;color:var(--brand-dark);font-size:13px;font-weight:700}
@media(max-width:620px){.offer-row{grid-template-columns:1fr}.offer-row-side{justify-items:start}}

/* Замок позиций и архив: действие рядом с тем, к чему относится. */
.offer-lock{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px;padding:10px 13px;border-radius:11px;background:var(--panel-hover);color:var(--muted);font-size:13px}
.offer-lock form{margin:0}
.offer-draft-actions{margin-bottom:12px}
.offer-archive-hint{margin:0 0 8px;padding:9px 12px;border-radius:11px;background:var(--warn-bg);color:var(--warn);font-size:13px}

/* Поле «скопировать одним нажатием» и сворачиваемый блок КП на объекте. */
.copy-field{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.copy-field input{flex:1 1 260px;min-width:0;margin:0;min-height:44px;font-family:inherit}
.copy-field button{min-height:44px;white-space:nowrap}
.object-offers>summary{cursor:pointer;list-style:none;display:flex;align-items:baseline;gap:8px}
.object-offers>summary::-webkit-details-marker{display:none}
.object-offers>summary::after{content:"⌄";color:var(--muted)}
.object-offers>summary h2{margin:0}

/* --- Поля дат ---------------------------------------------------------------
   Нативное поле даты в Chrome и Safari выглядит чужим: своя иконка, своя
   высота, на iOS оно ещё и не сжимается. Приводим к тому же виду, что у
   остальных полей, и рисуем свой значок календаря. Кликом открывается
   выбор даты по всему полю, а не только по иконке. */
input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 42px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%235b626c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 2v4'/%3E%3Cpath d='M16 2v4'/%3E%3Crect width='18' height='18' x='3' y='4' rx='2'/%3E%3Cpath d='M3 10h18'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 13px center;
  color: var(--ink);
  cursor: pointer;
}
input[type="time"], input[type="datetime-local"] {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%235b626c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E");
}
input[type="date"]:hover, input[type="time"]:hover,
input[type="datetime-local"]:hover, input[type="month"]:hover { border-color: var(--brand); }
/* Родная иконка Chrome прячется, но остаётся кликабельной поверх поля —
   иначе выбор даты пришлось бы открывать с клавиатуры. */
input[type="date"]::-webkit-calendar-picker-indicator,
input[type="time"]::-webkit-calendar-picker-indicator,
input[type="datetime-local"]::-webkit-calendar-picker-indicator,
input[type="month"]::-webkit-calendar-picker-indicator {
  position: absolute;
  right: 0;
  width: 42px;
  height: 100%;
  margin: 0;
  padding: 0;
  opacity: 0;
  cursor: pointer;
}
input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] { position: relative; }
/* Safari на iOS не даёт полю сжаться и валит вёрстку в узких колонках. */
input[type="date"]::-webkit-date-and-time-value { text-align: left; min-height: 22px; }
input[type="date"]::-webkit-datetime-edit,
input[type="datetime-local"]::-webkit-datetime-edit { padding: 0; }
/* Пустое поле даты в Chrome показывает «дд.мм.гггг» тем же цветом, что и
   заполненное; приглушаем, чтобы не путалось с настоящим значением. */
input[type="date"]:not(:focus):invalid::-webkit-datetime-edit { color: var(--muted); }

/* Порядок списка значками: активное поле показывает направление, неактивное — ↕. */
.offers-sort{display:inline-flex;gap:6px}
.offers-sort-option{display:inline-flex;align-items:center;gap:6px;padding:7px 11px;border:1px solid var(--border);border-radius:10px;background:#fff;color:var(--muted);font-size:12.5px;font-weight:700;text-decoration:none;white-space:nowrap}
.offers-sort-option:hover{border-color:var(--brand);background:var(--panel-hover)}
/* Стрелок нет в наборе var(--font-b): при font-display:swap глиф подменяется
   запасным шрифтом уже после загрузки, ширина кнопки меняется, и панель
   с гибким полем поиска перевёрстывается — это и выглядит как тряска.
   Свой системный шрифт и фиксированная ширина убирают сдвиг в принципе. */
.offers-sort-option b{display:inline-block;width:1em;font:400 13px/1 system-ui,"Segoe UI Symbol","Noto Sans Symbols 2",sans-serif;text-align:center}
.offers-sort-option.is-active{border-color:var(--brand);background:var(--panel-hover);color:var(--brand-dark)}

.offer-form-table .col-cost{width:120px}
.offer-form-table td:nth-child(5) input{text-align:right}

.offer-head-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}

/* Пара кнопок документов на карточке КП: одна форма, одна высота. */
.offer-head-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:12px 0 0}
.offer-doc-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:44px;padding:0 16px;border:1px solid var(--border);border-radius:12px;
  background:#fff;color:var(--ink);font-size:13.5px;font-weight:700;text-decoration:none}
.offer-doc-button .icon{color:var(--brand-dark)}
.offer-doc-button:hover{border-color:var(--brand);background:var(--panel-hover)}
.offer-doc-button.is-primary{border-color:var(--brand-dark);background:var(--brand-dark);color:#fff}
.offer-doc-button.is-primary .icon{color:#fff}
.offer-doc-button.is-primary:hover{background:var(--brand);border-color:var(--brand)}
@media(max-width:620px){.offer-head-actions{display:grid;grid-template-columns:1fr 1fr}}

.offer-doc-button.is-quiet{color:var(--muted);font-weight:600}
.offer-doc-button.is-quiet .icon{color:var(--muted)}
@media(max-width:620px){.offer-head-actions{grid-template-columns:1fr 1fr}.offer-doc-button.is-quiet{grid-column:1/-1}}

/* domflow: lists */
.status-priority-emergency{background:#c0392b;color:#fff}
.status-priority-urgent{background:#fdf1d6;color:#a6730b}
.status-priority-planned{background:var(--surface-2,#eef0f3);color:var(--muted,#6b7280)}
.status-assigned{background:#e6e8ec;color:#5b626c}
.status-cancelled{background:#eceef1;color:#8a8f98;text-decoration:line-through}
.ticket-card.is-mine{box-shadow:inset 3px 0 0 var(--brand,var(--accent))}
.ticket-card.is-overdue .ticket-card-when{color:#c0392b;font-weight:600}
.ticket-card-marks{display:flex;flex-wrap:wrap;gap:4px}
.ticket-card-assignee{color:var(--muted,#6b7280)}
.ticket-new-button{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;padding:10px 16px;border-radius:12px;background:var(--brand,var(--accent));color:#fff;font-weight:700;text-decoration:none;white-space:nowrap}
.ticket-new-button .icon{color:#fff}
.admin-counters a.is-danger article strong{color:#c0392b}
.admin-counters a.is-warn article strong{color:#a6730b}
.admin-quick-actions .today-quick-placeholder{opacity:.6}
.admin-team-table{width:100%;border-collapse:collapse;font-size:.95rem}
.admin-team-table th,.admin-team-table td{padding:8px 6px;text-align:left;border-bottom:1px solid var(--line,#e5e7eb)}
.admin-team-table th:not(:first-child),.admin-team-table td:not(:first-child){text-align:center;width:6.5em}
.admin-team-table .admin-tech-avatar{display:inline-flex;width:26px;height:26px;border-radius:50%;align-items:center;justify-content:center;background:var(--surface-2,#eef0f3);margin-right:6px;font-weight:700;font-size:.8rem}

/* domflow: ticket card */
.status-assigned{background:#e8ebef;color:#4a5568}
.status-cancelled{background:#ececec;color:#6b6f76;text-decoration:line-through}
.status-priority-emergency{background:var(--danger-bg);color:var(--danger)}
.status-priority-urgent{background:var(--warn-soft);color:var(--warn)}
.status-priority-planned{background:var(--work-soft);color:var(--work)}
.status-repeat{background:var(--plan-soft);color:var(--plan)}
.ticket-facts p{margin:4px 0}
.ticket-cause-form{margin:6px 0}
.ticket-photo-stage{margin:10px 0 4px;font-size:12px;font-weight:700;color:var(--muted)}
.ticket-priority-pick{border:1px solid var(--border);border-radius:12px;padding:8px 12px;margin:0}
.ticket-priority-pick legend{font-size:13px;font-weight:700;color:var(--muted);padding:0 4px}
.ticket-priority-pick .check-row{min-height:44px}
.ticket-affected-list .check-row{min-height:44px}
.ticket-history .history-row small{display:block;color:var(--muted)}
.ticket-repeat-form{margin:8px 0}
.ticket-return{margin-top:10px}
.ticket-cancel summary{color:var(--danger)}

/* domflow: rooms board */
/* Шахматка дома (консилиум №2, 23.09.2026): плитки без рамок лежат на фоне
   страницы, заливка только по состоянию, вторая строка — текст состояния,
   кружок-счётчик и инициалы. Этаж — строка с фиксированными колонками. */
/* body.board-page — чтобы блок стиля C ниже не перекрасил просрочку в красный (п. 3) */
body.board-page{--bs-emergency:#c0392b;--bs-overdue:#e0a622;--bs-new:#9a3a6f;--bs-in_progress:#1f6e8c;--bs-assigned:#5b626c;--bs-on_review:#2f7a4f;--bs-ppr:#5646a8;--bs-empty:#d3d8de}
.board-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:14px}
.board-head p{margin:4px 0 0;color:var(--muted)}
.board-tools{display:grid;gap:10px;margin-bottom:12px}
.board-counters{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}
.board-counter{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 14px;border:0;border-radius:12px;background:var(--panel);color:var(--ink);font:700 13px/1 inherit;font-family:inherit;cursor:pointer;white-space:nowrap}
.board-counter b{font-size:15px;font-family:var(--font-d)}
.board-counter.is-zero{color:var(--muted);opacity:.55}
.board-counter[data-counter="emergency"]:not(.is-zero){background:var(--bs-emergency);color:#fff}
.board-page .board-counter[data-counter="overdue"]:not(.is-zero){background:var(--bs-overdue);color:var(--ink)}
.board-counter[data-counter="new"]:not(.is-zero){background:var(--new-soft);color:var(--bs-new)}
.board-counter[data-counter="in_progress"]:not(.is-zero){background:var(--work-soft);color:var(--bs-in_progress)}
.board-counter[data-counter="assigned"]:not(.is-zero){background:var(--assigned-soft);color:var(--bs-assigned)}
.board-counter[data-counter="on_review"]:not(.is-zero){background:var(--review-soft);color:var(--bs-on_review)}
.board-counter[data-counter="ppr"]:not(.is-zero){background:var(--plan-soft);color:var(--bs-ppr)}
.board-counter-x{display:none;margin-left:2px;font-style:normal;font-size:17px;line-height:1}
.board-counter[aria-pressed="true"]{outline:3px solid var(--ink);outline-offset:-3px;opacity:1}
.board-counter[aria-pressed="true"] .board-counter-x{display:inline}
.board-counter-quiet{padding:0 8px;color:var(--muted);font-size:13px;font-weight:700;white-space:nowrap}
.board-counter-quiet b{font-size:15px;font-family:var(--font-d)}
.board-tools-row{display:flex;align-items:center;gap:8px}
.board-search{display:flex;align-items:center;gap:8px;flex:1 1 220px;max-width:420px;min-height:44px;padding:0 14px;border-radius:14px;background:var(--panel);border:1px solid var(--border);color:var(--muted)}
.board-search:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft,rgba(11,94,84,.15))}
.board-search input,.board-search input[type="search"]{width:100%;box-shadow:none;border-radius:0;min-height:44px;margin:0;padding:0;border:0;background:transparent;color:var(--ink);font:500 15px inherit;font-family:inherit;outline:none}
.board-mine{flex:none;min-height:44px;padding:0 18px;border:0;border-radius:14px;background:var(--panel);color:var(--ink);font:700 14px inherit;font-family:inherit;cursor:pointer}
.board-mine[aria-pressed="true"]{background:var(--ink);color:#fff}
.board-floorbar{display:none}
.board-floor-chip{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:6px;flex:0 0 auto;min-width:56px;min-height:44px;padding:0 12px;border-radius:14px;background:var(--panel);color:var(--ink);font-weight:700;font-size:14px;text-decoration:none;white-space:nowrap}
.board-floor-chip b{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--bs-empty);color:var(--ink);font-size:11px;line-height:1}
.board-floor-chip[data-state="emergency"] b{background:var(--bs-emergency);color:#fff}
.board-floor-chip[data-state="overdue"] b{background:var(--bs-overdue);color:var(--ink)}
.board-floor-chip[data-state="new"] b{background:var(--new-soft);color:var(--bs-new)}
.board-floor-chip[data-state="in_progress"] b{background:var(--work-soft);color:var(--bs-in_progress)}
.board-floor-chip[data-state="assigned"] b{background:var(--assigned-soft);color:var(--bs-assigned)}
.board-floor-chip[data-state="on_review"] b{background:var(--review-soft);color:var(--bs-on_review)}
.board-floor-chip[data-state="ppr"] b{background:var(--plan-soft);color:var(--bs-ppr)}
.board-floor-chip[aria-current="true"]{background:var(--accent);color:#fff}
.board-floor-chip[hidden]{display:none}
.board-nothing{margin:8px 0;padding:14px;border:1px dashed var(--border);border-radius:14px;color:var(--muted);text-align:center}
.board-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start}
/* сетка дома: этажи — строки одной таблицы с фиксированными колонками */
.board{display:grid;gap:18px}
.board-floor{display:grid;grid-template-columns:minmax(0,1fr);gap:6px 14px;scroll-margin-top:130px}
.board-floor[hidden]{display:none}
.board-floor-head{display:flex;align-items:baseline;gap:8px;min-width:0}
.board-floor-head h2{margin:0;font-size:15px;color:var(--ink);white-space:nowrap}
.board-floor-head small{color:var(--muted);font-size:11px;font-weight:600}
.board-cells{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.board-tile{position:relative;display:flex;flex-direction:column;gap:2px;min-height:82px;padding:12px 12px 10px;border:0;border-radius:16px;background:#fff;color:var(--ink);font:inherit;font-family:inherit;text-align:left;cursor:pointer;-webkit-hyphens:auto;hyphens:auto;transition:opacity .15s,transform .1s}
.board-tile:active{transform:scale(.98)}
.board-tile[aria-current="true"]{outline:3px solid var(--ink);outline-offset:2px}
.board-tile.is-dimmed,.board-tile.is-foreign{opacity:.22;pointer-events:none}
.board-tile-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-weight:700;font-size:14px;line-height:1.2;overflow-wrap:anywhere}
.board-tile-no{color:var(--muted);font-size:11px;font-weight:700;line-height:1.3}
.board-tile-line{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-top:auto;padding-top:6px;font-size:12px;font-weight:700;line-height:1.2}
.board-tile-state{color:var(--c,var(--muted))}
.board-tile-n{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--c,var(--muted));color:#fff;font-size:11px;line-height:1}
.board-tile-who{color:var(--muted);font-size:11px;letter-spacing:.03em}
.board-tile-line i{color:var(--muted);font-style:normal;font-weight:600}
.board-tile-line i[data-state="symptom"]::before{content:"";display:inline-block;width:7px;height:7px;margin-right:4px;border-radius:50%;background:var(--bs-emergency);vertical-align:1px}
.board-tile[data-state="new"]{--c:var(--bs-new);background:var(--new-soft)}
.board-tile[data-state="in_progress"]{--c:var(--bs-in_progress);background:var(--work-soft)}
.board-tile[data-state="assigned"]{--c:var(--bs-assigned);background:var(--assigned-soft)}
.board-tile[data-state="on_review"]{--c:var(--bs-on_review);background:var(--review-soft)}
.board-tile[data-state="ppr"]{--c:var(--bs-ppr);background:var(--plan-soft)}
.board-page .board-tile[data-state="overdue"]{--c:var(--ink);background:var(--bs-overdue);color:var(--ink)}
.board-tile[data-state="overdue"] .board-tile-no,.board-tile[data-state="overdue"] .board-tile-who,.board-tile[data-state="overdue"] .board-tile-line i{color:var(--ink)}
.board-tile[data-state="overdue"] .board-tile-line i[data-state="symptom"]::before{background:var(--ink)}
.board-tile[data-state="emergency"]{--c:#fff;background:var(--bs-emergency);color:#fff}
.board-tile[data-state="emergency"] .board-tile-no,.board-tile[data-state="emergency"] .board-tile-who,.board-tile[data-state="emergency"] .board-tile-line i{color:rgba(255,255,255,.85)}
.board-tile[data-state="emergency"] .board-tile-n{background:rgba(255,255,255,.25);color:#fff}
.board-tile[data-state="emergency"] .board-tile-line i[data-state="symptom"]::before{background:#fff}
/* панель помещения: aside на десктопе, шторка на телефоне; шапка и подвал липкие */
.board-aside{--pad:18px;display:none;position:sticky;top:calc(72px + env(safe-area-inset-top,0px));max-height:calc(100dvh - 90px);overflow-y:auto;padding:0 var(--pad);border-radius:20px;background:var(--panel)}
.board-sheet{--pad:16px;max-height:88dvh;overflow-y:auto;padding:9px var(--pad) 0}
.board-panel-body{display:flex;flex-direction:column;gap:4px;padding-bottom:16px}
.board-panel-head{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin:0 calc(var(--pad) * -1) 6px;padding:14px var(--pad) 10px;background:var(--panel);border-bottom:1px solid var(--line)}
.board-panel-head-text{display:flex;flex-direction:column;align-items:flex-start;gap:4px;min-width:0}
.board-panel-head h2{margin:0;font-size:20px;line-height:1.15;outline:none;overflow-wrap:anywhere}
.board-panel-close{flex:none}
.board-state-pill,.board-row-dot,.board-row-state{--c:var(--bs-empty)}
.board-state-pill{display:inline-flex;align-items:center;min-height:26px;padding:0 10px;border-radius:999px;background:var(--c);color:#fff;font-size:12px;font-weight:800;white-space:nowrap}
.board-state-pill[data-state="empty"]{background:#e6e9ee;color:var(--muted)}
.board-state-pill[data-state="overdue"]{color:var(--ink)}
.board-state-pill[data-state="emergency"],.board-row-dot[data-state="emergency"],.board-row-state[data-state="emergency"]{--c:var(--bs-emergency)}
.board-state-pill[data-state="overdue"],.board-row-dot[data-state="overdue"],.board-row-state[data-state="overdue"]{--c:var(--bs-overdue)}
.board-state-pill[data-state="new"],.board-row-dot[data-state="new"],.board-row-state[data-state="new"]{--c:var(--bs-new)}
.board-state-pill[data-state="in_progress"],.board-row-dot[data-state="in_progress"],.board-row-state[data-state="in_progress"]{--c:var(--bs-in_progress)}
.board-state-pill[data-state="assigned"],.board-row-dot[data-state="assigned"],.board-row-state[data-state="assigned"]{--c:var(--bs-assigned)}
.board-state-pill[data-state="on_review"],.board-row-dot[data-state="on_review"],.board-row-state[data-state="on_review"]{--c:var(--bs-on_review)}
.board-state-pill[data-state="ppr"],.board-row-dot[data-state="ppr"],.board-row-state[data-state="ppr"]{--c:var(--bs-ppr)}
.board-row-dot[data-state="linked"]{--c:#e6e9ee}
.board-row-state{color:var(--c);font-weight:700}
.board-row-state[data-state="overdue"]{color:var(--warn)}
.board-row-elapsed{color:var(--bs-emergency);font-weight:700}
.board-panel-h{margin:14px 0 6px;font-size:13px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.board-panel-list{margin:0;padding:0;list-style:none;display:grid;gap:6px}
.board-panel-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;min-height:52px;padding:8px 10px;border:1px solid var(--border);border-radius:12px;color:var(--ink);text-decoration:none}
.board-panel-row:active{background:var(--panel-hover)}
.board-row-dot{display:inline-block;width:12px;height:12px;border-radius:50%;background:var(--c)}
.board-row-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.board-row-main strong{font-size:14px;line-height:1.25;overflow-wrap:anywhere}
.board-row-main small{color:var(--muted);font-size:12px}
.board-row-meta{display:flex;flex-wrap:wrap;gap:2px 8px}
.board-chip{display:inline-flex;align-items:center;gap:6px;margin-top:2px;color:var(--ink);font-size:12px;font-weight:600}
.board-chip b{display:inline-grid;place-items:center;min-width:22px;height:22px;padding:0 5px;border-radius:11px;background:var(--assigned-soft);color:var(--bs-assigned);font-size:10px;letter-spacing:.03em}
.board-chip.is-none{color:var(--muted)}
.board-panel-empty{margin:0;padding:12px;border:1px dashed var(--border);border-radius:12px;color:var(--muted);font-size:13px;text-align:center}
.board-panel-foot{position:sticky;bottom:0;z-index:2;margin:12px calc(var(--pad) * -1) -16px;padding:10px var(--pad) calc(12px + env(safe-area-inset-bottom,0px));background:var(--panel);border-top:1px solid var(--line)}
.board-panel-new{display:flex;justify-content:center;width:100%;min-height:48px;box-sizing:border-box}
@media (min-width: 900px){
  /* колонка панели — только пока панель открыта (класс ставит JS, :has — страховка) */
  .board-layout.is-panel-open,.board-layout:has(> .board-aside:not([hidden])){grid-template-columns:minmax(0,1fr) 360px}
  .board-aside{display:block}.board-aside[hidden]{display:none}
  .board-floor{grid-template-columns:120px minmax(0,1fr)}
  .board-floor-head{flex-direction:column;align-items:flex-start;gap:2px;padding-top:12px}
  .board-cells{grid-template-columns:repeat(3,minmax(0,1fr))}
  .board-tile{min-height:88px;padding:14px 14px 12px}
}
@media (min-width: 1100px){
  .board-cells{grid-template-columns:repeat(4,minmax(0,1fr))}
  .board-layout.is-panel-open .board-cells,.board-layout:has(> .board-aside:not([hidden])) .board-cells{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width: 899px){
  /* телефон: шапка в одну строку с именем дома, поиск сразу под ней,
     счётчики — одна прокручиваемая строка; первая плитка выше сгиба */
  .board-head{flex-direction:column;align-items:flex-start;margin:4px 0 8px}
  .board-head .eyebrow{margin:0;font-size:15px;font-weight:800;letter-spacing:0;text-transform:none;color:var(--ink)}
  .board-head h1{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
  .board-head p,.board-head .board-head-rooms{display:none}
  .board-tools{gap:6px;margin-bottom:4px}
  .board-tools-row{order:-1}
  .board-counters{flex-wrap:nowrap;overflow-x:auto;margin:0 -16px;padding:0 32px 0 16px;scrollbar-width:none;-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 40px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 40px),transparent)}
  .board-counters::-webkit-scrollbar{display:none}
  .board-counter{flex:none}
  .board-counter.is-zero{display:none}
  .board-counter-quiet{flex:none}
  .board-search{max-width:none}
  .board-floorbar{position:sticky;top:60px;z-index:5;display:flex;gap:8px;overflow-x:auto;margin:0 -16px 6px;padding:6px 16px;background:var(--bg);scrollbar-width:none}
  .board-floorbar::-webkit-scrollbar{display:none}
  .board-floor-head{position:sticky;top:116px;z-index:4;margin:0 -4px;padding:6px 4px;background:var(--bg)}
  .board-tile{padding:11px 11px 9px;border-radius:14px}
}
@media (max-width: 480px){
  .board-tile-name{font-size:13px}
  .board-tile-line{font-size:11px}
}

/* ══════════════════════════════════════════════════════════════
   domflow: style C · «Крупные плитки» (фаза 7, 23.09.2026).
   Слой поверх прежних правил: токены выше, здесь — формы и шрифты.
   ══════════════════════════════════════════════════════════════ */
body{font-family:var(--font-b);font-size:15px;line-height:1.45;background:var(--bg)}
h1,h2,h3,.brand,.material-quantity{font-family:var(--font-d);font-weight:700}
h1{letter-spacing:-.01em;line-height:1.1}
strong,b{font-weight:700}
/* шапка */
.topbar{min-height:60px;padding:8px 16px;padding-top:calc(8px + env(safe-area-inset-top));border-bottom:0;background:var(--panel)}
.brand{min-height:44px;gap:10px}
.brand-mark{display:inline-flex;align-items:center;gap:10px;font-family:var(--font-d);font-weight:700;font-size:14px;letter-spacing:0;line-height:1;color:var(--ink)}
.brand-mark::before{content:"";flex:none;width:28px;height:28px;border-radius:9px;background:var(--accent)}
.auth-brand .brand-mark{font-size:20px}.auth-brand .brand-mark::before{width:40px;height:40px;border-radius:12px}
.topbar-action{border-radius:12px}
.topbar-action.is-active,.topbar-action:hover{color:var(--accent);background:var(--accent-soft)}
.eyebrow{color:var(--muted)}
/* плитки-карточки */
.card,.expense-note,.expense-action-card,.expense-receipts,.expense-form-shell,.login-card,.dash-panel,.today-panel,.more-menu-grid>details,.expense-summary article,.wizard-review dl div,.form-section,.admin-control-row,.object-tickets a,.dash-kpi{border-color:transparent;border-width:0;border-radius:var(--r-lg);background:var(--panel)}
.card{padding:18px;margin-top:12px}
.card h2{font-size:16px}.card h2 .icon{color:var(--accent)}
.expense-money-card{border:0;background:var(--line);border-radius:var(--r-lg)}
.receipt-conversation{background:var(--panel-2)}
/* пилюли статусов */
.expense-status{border-radius:8px;padding:4px 8px;font-size:11px;font-weight:700;line-height:1.25;letter-spacing:0;background:var(--assigned-soft);color:var(--assigned)}
.status-new{background:var(--new-soft);color:var(--new)}
.status-assigned{background:var(--assigned-soft);color:var(--assigned)}
.status-in_progress{background:var(--work-soft);color:var(--work)}
.status-on_review{background:var(--review-soft);color:var(--review)}
.status-done,.status-verified,.status-recommended{background:var(--done-soft);color:var(--done)}
.status-cancelled{background:var(--assigned-soft);color:var(--assigned);text-decoration:line-through}
.status-priority-emergency{background:var(--crit);color:#fff}
.status-priority-urgent{background:var(--warn-fill);color:var(--ink)}
.status-priority-planned{background:var(--assigned-soft);color:var(--assigned)}
.status-routine,.status-side,.status-repeat{background:var(--plan-soft);color:var(--plan)}
.status-critical{background:var(--crit-soft);color:var(--crit)}
.status-requested,.status-needs_clarification,.status-help{background:var(--warn-soft);color:var(--warn)}
.status-funded{background:var(--accent-soft);color:var(--accent)}
.status-receipt_submitted{background:var(--work-soft);color:var(--work)}
.ticket-card-marks .expense-status{padding:3px 7px;font-size:10px}
/* кнопки */
button{border-radius:var(--r);min-height:var(--tap);background:var(--accent);color:#fff;font-weight:700;font-size:15px}
button:active{background:var(--brand-dark)}
.secondary-button,.secondary-link,.print-button,.quick-filter,.sort-button,.asset-scope a,.view-switch-btn{min-height:var(--tap);border:0;border-radius:var(--r);background:var(--panel-2);color:var(--ink);font-weight:700}
.secondary-button:hover,.quick-filter:hover,.asset-scope a:hover,.print-button:hover{background:var(--line)}
.quick-filter.is-active,.sort-button.is-active,.asset-scope a.is-active{background:var(--ink);color:#fff}
.primary-link,.ticket-new-button,.action-chip.action-primary,.auth-submit{min-height:var(--tap);border:0;border-radius:var(--r);background:var(--accent);color:#fff;font-weight:700}
.ticket-new-button{padding:0 18px}
.action-chip{min-height:44px;padding:0 14px;border:0;border-radius:12px;background:var(--panel-2);color:var(--ink);font-weight:700}
.action-chip .icon{color:var(--accent)}.action-chip.action-primary .icon{color:#fff}
.action-chip.is-favorite{background:var(--warn-soft)}.action-chip.is-favorite .icon{color:var(--warn)}
.text-button{background:transparent;color:var(--accent);font-weight:700}
.text-button.danger,.secondary-button.danger{color:var(--crit)}
button:disabled,[aria-busy="true"] button{background:#b9c0ca;color:#fff}
/* поля */
input:not([type]),input[type="text"],input[type="password"],input[type="number"],input[type="search"],input[type="tel"],input[type="url"],input[type="file"],input[type="email"],input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"],textarea{border:1px solid var(--line);border-radius:12px;font-family:var(--font-b)}
select{border:1px solid var(--line);border-radius:12px;font-family:var(--font-b);font-size:16px}
input:focus,textarea:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(11,92,83,.16)}
label{font-weight:700}
/* нижняя навигация: плитки */
.bottom-nav{position:fixed;left:0;right:0;bottom:0;z-index:40;display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:6px;min-height:0;padding:10px 16px calc(14px + env(safe-area-inset-bottom));border-top:0;background:var(--bg);box-shadow:none;backdrop-filter:none}
.bottom-nav-v2,.bottom-nav-v2.is-admin{grid-template-columns:none;min-height:0;padding:10px 16px calc(14px + env(safe-area-inset-bottom))}
.bottom-nav a,.bottom-nav button{position:relative;isolation:auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-width:0;min-height:56px;padding:6px 4px;border:0;border-radius:var(--r);background:var(--panel);color:var(--ink);font:700 11px/1.2 var(--font-b);text-decoration:none;cursor:pointer;transition:background .2s,color .2s}
.bottom-nav a span,.bottom-nav button span{font-size:11px;font-weight:700;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bottom-nav a::after,.bottom-nav button::after{display:none}
.bottom-nav a .icon,.bottom-nav button .icon{color:currentColor;transform:none}
.bottom-nav a.is-active,.bottom-nav button.is-active,.bottom-nav a.is-route-target{background:var(--accent);color:#fff}
.bottom-nav a.is-active .icon,.bottom-nav button.is-active .icon{color:#fff;stroke-width:2;transform:none}
.bottom-nav a:active,.bottom-nav button:active{opacity:.8;transform:none}
.bottom-nav a i,.bottom-nav button i{position:absolute;top:6px;right:calc(50% - 26px);min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--crit);color:#fff;font:700 10px/18px var(--font-b);font-style:normal;text-align:center}
.bottom-nav a.is-active i,.bottom-nav button.is-active i{background:#fff;color:var(--accent)}
body.has-bottom-nav{padding-bottom:calc(var(--nav-h) + 12px + env(safe-area-inset-bottom))}
@media (min-width:900px){.bottom-nav{display:none}body.has-bottom-nav{padding-bottom:env(safe-area-inset-bottom)}}
/* шторки */
.ui-bottom-sheet{border-radius:var(--r-lg) var(--r-lg) 0 0;background:var(--panel);box-shadow:0 -18px 50px rgba(20,23,28,.2)}
.ui-bottom-sheet-handle{width:44px;height:5px;margin:4px auto 16px;border-radius:3px;background:#b9c0ca}
.ui-bottom-sheet-icon{background:var(--accent-soft);color:var(--accent)}
.ui-bottom-sheet::backdrop{background:rgba(20,23,28,.4)}
.sheet{border-radius:var(--r-lg) var(--r-lg) 0 0;background:var(--panel);box-shadow:0 -8px 30px rgba(20,23,28,.2)}
.sheet-handle::after{width:44px;background:#b9c0ca}
.sheet-close-icon,.board-sheet-close,.board-aside-close{background:var(--panel-2);color:var(--ink)}
.more-menu-grid>details>summary,.more-menu-grid>a{min-height:56px}
/* герой карточки: белая плитка, пилюли, крупный заголовок, серая мета */
.expense-detail-head,.ticket-mobile-hero,.expense-mobile-hero{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:4px 0 12px;padding:18px;border:0;border-radius:var(--r-lg);background:var(--panel)}
.expense-detail-head .expense-status{margin:0;animation:none}
.expense-detail-head h1,.ticket-mobile-hero h1,.expense-mobile-hero h1{flex-basis:100%;margin:8px 0 0;font-family:var(--font-d);font-size:22px;line-height:1.15;overflow-wrap:anywhere}
.expense-detail-head p,.ticket-mobile-hero p,.expense-mobile-hero p{flex-basis:100%;margin:0;color:var(--muted);font-size:13px;font-weight:500;line-height:1.4}
.expense-detail-head a{color:var(--accent);text-decoration-color:rgba(11,92,83,.4)}
.back-link{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;margin-bottom:8px;border-radius:14px;background:var(--panel);color:var(--ink);font-weight:700;font-size:13px;text-decoration:none}
/* списки: белые плитки с цветной кромкой по состоянию */
.expense-list,.history-rows,.object-tickets,.admin-control-list{gap:12px}
.ticket-card,.expense-row,.history-row,.object-tickets a,.board-panel-row,.admin-control-row,.notification-item{border:0;border-radius:var(--r);background:var(--panel);color:var(--ink)}
.ticket-card{padding:14px;box-shadow:inset 4px 0 0 transparent}
.ticket-card.is-mine{box-shadow:inset 4px 0 0 var(--accent)}
.ticket-card.is-overdue{box-shadow:inset 4px 0 0 var(--crit)}
.ticket-card.is-overdue .ticket-card-when{color:var(--crit);font-weight:700}
.ticket-card:hover,.expense-row:hover,.object:hover,.today-panel:hover,.dash-panel:hover{border-color:transparent;box-shadow:0 10px 26px rgba(20,23,28,.08)}
.ticket-card.is-mine:hover{box-shadow:inset 4px 0 0 var(--accent),0 10px 26px rgba(20,23,28,.08)}
.ticket-card.is-overdue:hover{box-shadow:inset 4px 0 0 var(--crit),0 10px 26px rgba(20,23,28,.08)}
.ticket-card-object,.expense-row-main small{color:var(--accent)}
.ticket-card-number{font-family:var(--font-b);font-weight:700}
.ticket-card-assignee::before{color:var(--line)}
.history-row{padding:12px 14px;border-radius:14px}
.history-dot{background:var(--panel-2)}
.history-row.is-fault .history-dot{color:var(--crit)}
.history-row.is-routine .history-dot{color:var(--plan)}
.expense-row-next{background:var(--warn-soft);color:var(--warn)}
.expense-empty,.board-nothing,.board-panel-empty{border-color:var(--line)}
/* счётчики обзора: крупные числа в дисплейном шрифте */
.expense-summary{gap:10px}
.expense-summary article{padding:16px 18px;border:2px solid transparent;border-radius:var(--r-lg)}
.expense-summary strong,.registry-summary strong,.dash-kpi strong{font-family:var(--font-d);font-weight:700}
.admin-counters article strong{font:700 26px/1 var(--font-d);font-variant-numeric:tabular-nums;color:var(--ink)}
.admin-counters article span{margin-top:8px;color:var(--ink);font-size:13px;font-weight:700}
.admin-counters a.is-danger article{border-color:var(--crit)}.admin-counters a.is-danger article strong{color:var(--crit)}
.admin-counters a.is-warn article{border-color:var(--warn-fill)}.admin-counters a.is-warn article strong{color:var(--warn)}
.expense-summary a.is-active article{border-color:var(--accent);box-shadow:none}
.registry-summary{border-radius:var(--r-lg)}
.today-v2-avatar,.admin-tech-avatar,.tech-card-avatar{background:var(--accent);color:#fff;font-family:var(--font-d)}
.work-focus-card{background:var(--ink);box-shadow:none;border-radius:var(--r-lg)}
.today-next-action{border-radius:var(--r-lg)}
.today-quick-actions a,.admin-quick-actions a{border:0;border-radius:var(--r);background:var(--panel)}
/* шахматка: те же токены, что и у пилюль */
.board-page{--bs-emergency:var(--crit);--bs-overdue:var(--crit);--bs-new:var(--new);--bs-in_progress:var(--work);--bs-assigned:var(--assigned);--bs-on_review:var(--review);--bs-ppr:var(--plan);--bs-linked:var(--assigned);--bs-empty:#c9ced4}
.board-counter{font-family:var(--font-b)}.board-counter b{font-family:var(--font-d);font-size:14px}
.board-counter[data-counter="overdue"]{background:var(--crit-soft)}
.board-tile[data-state="overdue"]{background:var(--crit-soft)}
.board-tile[data-state="emergency"] .board-tile-sub{color:var(--crit-soft)}
.board-search{border:0}
.board-aside{border:0;border-radius:var(--r-lg)}
.board-panel-row{border:0;background:var(--panel-2)}
.board-floor-chip{font-family:var(--font-d);font-size:13px}
.board-floor-chip.is-active,.board-floor-chip[aria-current="true"]{background:var(--accent);color:#fff}
/* вход */
.auth-shell{padding-top:24px}
.login-card{padding:24px;border:0;border-radius:var(--r-lg)}
.password-toggle{background:transparent;color:var(--accent);font-weight:700}
/* печать: бренд — чернила, не акцент */
@media print{.report-brand,.brand-mark{color:var(--ink)}.brand-mark::before{display:none}.bottom-nav{display:none!important}}
@media (prefers-reduced-motion:reduce){.bottom-nav a,.bottom-nav button{transition:none!important}}

/* Предупреждения, которые не должны исчезать сами (flash-warning/flash-info гаснут через JS). */
.flash-warning, .flash-info { background: var(--warn-bg); color: var(--warn); }
.inline-warning { padding: 10px 12px; border-radius: 10px; background: var(--warn-bg); color: var(--warn); font-size: 14px; }
.team-away { display: block; color: var(--warn); font-size: 12px; font-weight: 700; }
.team-disabled { display: block; color: var(--danger); font-size: 12px; font-weight: 700; }
.team-handover { display: inline-flex; margin-top: 4px; font-size: 12px; font-weight: 700; }
/* ---------- план этажа (t2ops) ---------- */
.plan-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:10px}
.plan-layout{align-items:stretch}
.plan-stage{position:relative;height:calc(100dvh - 210px - env(safe-area-inset-bottom,0px));min-height:360px;border:1px solid var(--border);border-radius:18px;background:#fff;overflow:hidden;touch-action:none;user-select:none;-webkit-user-select:none}
.plan-stage canvas{display:block;width:100%;height:100%;cursor:grab}
.plan-stage canvas.is-drag{cursor:grabbing}
.plan-scen{position:absolute;top:10px;left:10px;right:64px;display:flex;gap:6px;overflow-x:auto;scrollbar-width:none}
.plan-scen::-webkit-scrollbar{display:none}
.plan-scen button,.plan-zoom button,.plan-layers summary{min-height:38px;padding:0 12px;border:1px solid var(--border);border-radius:999px;background:rgba(255,255,255,.94);color:var(--ink);font:inherit;font-size:13px;font-weight:700;white-space:nowrap;cursor:pointer}
.plan-scen button[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:#fff}
.plan-zoom{position:absolute;top:10px;right:10px;display:flex;flex-direction:column;gap:6px}
.plan-zoom button{display:grid;place-items:center;width:42px;height:42px;padding:0;font-size:20px}
.plan-layers{position:absolute;left:10px;bottom:10px;max-width:calc(100% - 20px)}
.plan-layers summary{display:inline-flex;align-items:center;gap:6px;list-style:none}
.plan-layers summary::-webkit-details-marker{display:none}
.plan-layer-list{position:absolute;left:0;bottom:46px;width:min(320px,calc(100vw - 52px));max-height:min(60dvh,460px);overflow-y:auto;padding:8px 12px;border:1px solid var(--border);border-radius:14px;background:#fff;box-shadow:0 8px 28px rgba(20,24,30,.14)}
.plan-layer-list fieldset{margin:0 0 6px;padding:0;border:0}
.plan-layer-list legend{padding:6px 0 2px;color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em}
.plan-layer-list label{display:flex;align-items:center;gap:8px;min-height:36px;margin:0;font-size:13px}
.plan-swatch{flex:none;display:inline-block;width:12px;height:12px;border-radius:3px}
.plan-legend{position:absolute;right:10px;bottom:10px;display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px 10px;max-width:55%;margin:0;padding:6px 10px;border-radius:12px;background:rgba(255,255,255,.9);list-style:none;font-size:11px;color:var(--muted)}
.plan-legend li{display:inline-flex;align-items:center;gap:5px}
.plan-legend li::before{content:"";width:10px;height:10px;border-radius:3px;background:var(--bs-empty)}
.plan-legend li.plan-legend-tip{flex-basis:100%;justify-content:flex-end;font-style:italic}
.plan-legend li.plan-legend-tip::before{display:none}
.plan-legend li[data-state="emergency"]::before{background:var(--bs-emergency)}
.plan-legend li[data-state="overdue"]::before{background:var(--bs-overdue)}
.plan-legend li[data-state="new"]::before{background:var(--bs-new)}
.plan-legend li[data-state="in_progress"]::before{background:var(--bs-in_progress)}
.plan-legend li[data-state="assigned"]::before{background:var(--bs-assigned)}
.plan-legend li[data-state="on_review"]::before{background:var(--bs-on_review)}
.plan-legend li[data-state="ppr"]::before{background:var(--bs-ppr)}
.plan-status,.plan-zoomhint{position:absolute;left:50%;transform:translateX(-50%);margin:0;padding:6px 12px;border-radius:999px;background:rgba(29,34,40,.82);color:#fff;font-size:12px;pointer-events:none;white-space:nowrap}
.plan-status{top:50%}
.plan-status[hidden],.plan-zoomhint[hidden]{display:none}
.plan-zoomhint{top:58px}
.plan-pick{position:absolute;z-index:3;display:grid;gap:2px;width:min(280px,calc(100% - 16px));padding:6px;border:1px solid var(--border);border-radius:14px;background:#fff;box-shadow:0 8px 28px rgba(20,24,30,.16)}
.plan-pick[hidden]{display:none}
.plan-pick-h{margin:2px 6px 4px;color:var(--muted);font-size:11px;font-weight:800}
.plan-pick button,.plan-pick a{display:flex;align-items:center;gap:8px;min-height:44px;padding:4px 8px;border:0;border-radius:10px;background:none;color:var(--ink);font:inherit;font-size:13px;text-align:left;cursor:pointer;text-decoration:none}
.plan-pick button:hover,.plan-pick a:hover{background:var(--panel-hover)}
.plan-pick span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plan-point-note{display:flex;align-items:center;gap:6px;margin:0 0 12px;padding:8px 10px;border-radius:10px;background:var(--panel-hover);font-size:14px}
.plan-kv{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:4px 0 0;font-size:13px}
.plan-kv dt{color:var(--muted)}
.plan-kv dd{margin:0;overflow-wrap:anywhere}
.plan-check{display:block;color:var(--warn);font-size:12px}
.plan-power{margin-top:8px;font-size:13px}
.plan-power summary{min-height:36px;cursor:pointer;font-weight:700}
.plan-power ul{margin:4px 0 0;padding-left:18px}
.plan-power small{color:var(--muted)}
.plan-el-list .board-panel-row{grid-template-columns:minmax(0,1fr) auto}
.plan-hint{margin:8px 0 0;color:var(--muted);font-size:12px}
@media (max-width: 899px){
  .plan-head{flex-direction:row;flex-wrap:wrap;align-items:flex-end;gap:8px 12px;margin:0 0 10px;text-align:left}
  .plan-head>div:first-child{flex:1 1 auto;min-width:0}
  .plan-head h1{font-size:20px}
  .plan-head-actions{gap:6px}
  .plan-head-actions .action-chip{min-height:36px;padding:0 12px;font-size:13px}
  /* высоту на телефоне ставит plan.js — до нижнего меню */
  .plan-stage{height:calc(100dvh - 190px - env(safe-area-inset-bottom,0px));margin:0 -16px;border-radius:0;border-left:0;border-right:0}
  .plan-scen{right:10px;gap:4px}
  .plan-scen button{min-height:36px;padding:0 10px;font-size:12px}
  .plan-zoom{top:auto;bottom:10px;flex-direction:row}
  .plan-zoom button{width:40px;height:40px}
  .plan-legend{display:none}
}
.ppr-add{margin-top:10px}
.ppr-add summary{display:inline-flex;align-items:center;gap:6px;min-height:44px;font-weight:750;cursor:pointer}
.ppr-starter{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px;padding:0;list-style:none}
/* Приёмка этажа: цвета статусов замечаний — те же в акте (acceptance_act.STATUS_COLORS) */
body{--acc-open:#c0392b;--acc-fixed:#e0a622;--acc-accepted:#2f7a4f;--acc-moved:#6e757d}
.plan-head-actions{display:flex;flex-wrap:wrap;gap:8px}
.plan-acc-bar{display:flex;align-items:center;gap:8px 10px;margin:0 0 10px;padding:6px 8px 6px 12px;border-radius:12px;background:var(--plan-soft,#eef1f5);font-size:13px}
.plan-acc-bar.is-mode{background:#e9f4ee;box-shadow:inset 3px 0 0 var(--acc-accepted)}
.plan-acc-label{display:inline-flex;align-items:center;gap:5px;flex:none;color:var(--muted);font-weight:700}
.plan-acc-bar.is-mode .plan-acc-label{color:var(--acc-accepted)}
.plan-acc-links{display:flex;gap:6px;min-width:0;overflow-x:auto;scrollbar-width:none}
.plan-acc-links::-webkit-scrollbar{display:none}
.plan-acc-link{flex:none;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:5px 10px;border-radius:999px;background:#fff;color:var(--ink);font-weight:700;text-decoration:none}
.plan-acc-link:hover{background:var(--panel-hover)}
.plan-acc-tip{min-width:0;color:var(--muted);font-size:12px}
.plan-acc-exit{display:inline-flex;align-items:center;gap:4px;flex:none;margin-left:auto;padding:5px 10px;border-radius:999px;color:var(--ink);font-weight:700;text-decoration:none}
.plan-acc-exit:hover{background:#fff}
@media (max-width: 899px){.plan-acc-tip{display:none}.plan-acc-bar.is-mode .plan-acc-link{flex:0 1 auto;min-width:0}}
.plan-legend li.plan-legend-acc::before{border-radius:50%}
.plan-legend li.plan-legend-acc[data-status="open"]::before,.acc-num[data-status="open"]{background:var(--acc-open)}
.plan-legend li.plan-legend-acc[data-status="fixed"]::before,.acc-num[data-status="fixed"]{background:var(--acc-fixed)}
.plan-legend li.plan-legend-acc[data-status="accepted"]::before,.acc-num[data-status="accepted"]{background:var(--acc-accepted)}
.plan-legend li.plan-legend-acc[data-status="moved"]::before,.acc-num[data-status="moved"]{background:var(--acc-moved)}
.acc-num{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 6px;border-radius:13px;color:#fff;font-size:13px;flex-shrink:0}
.acc-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}
.acc-list li{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px}
.acc-counts,.acc-filter{display:flex;flex-wrap:wrap;gap:6px}
.acc-filter{margin:0 0 12px}
.acc-filter a{padding:4px 10px;border-radius:14px;border:1px solid var(--line,#d3d8de);font-size:13px;text-decoration:none;color:inherit}
.acc-filter a[aria-current="page"]{border-color:currentColor;font-weight:700}
.acc-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;background:var(--panel-hover,#f1f3f5);font-size:12px;--dot:var(--acc-moved)}
.acc-chip::before{content:"";flex:none;width:8px;height:8px;border-radius:50%;background:var(--dot)}
.acc-chip[data-status="open"]{--dot:var(--acc-open)}
.acc-chip[data-status="fixed"]{--dot:var(--acc-fixed)}
.acc-chip[data-status="accepted"]{--dot:var(--acc-accepted)}
.acc-filter a.acc-chip{background:none;font-size:13px}
.acc-list li>a:first-child{color:var(--ink);text-decoration:none}
.acc-list li>a:first-child:hover strong{text-decoration:underline}
.acc-summary-h{margin:14px 0 4px;font-size:15px}
.acc-summary td:first-child{width:100%;min-width:9em}
.acc-summary th:not(:first-child){font-size:12px;line-height:1.2}
/* Звёздочка обязательного поля у файлового поля — у подписи, а не отдельной строкой над ней */
.file-field:has(> input[required])::before{content:none}
.file-field:has(> input[required]) .file-field-label::before{content:"* ";color:var(--brand);font-weight:700}
.acc-remarks{display:grid;gap:2px;margin:0;padding:0;list-style:none}
.acc-remarks a{display:flex;gap:10px;align-items:flex-start;padding:8px 4px;border-bottom:1px solid var(--line,#e5e8ec);text-decoration:none;color:inherit}
.acc-remarks a>span{display:grid;gap:2px;min-width:0}
.acc-summary{width:100%;border-collapse:collapse;font-size:13px;margin-bottom:12px}
.acc-summary th,.acc-summary td{padding:4px 6px;border-bottom:1px solid var(--line,#e5e8ec);text-align:right}
.acc-summary th:first-child,.acc-summary td:first-child{text-align:left}
.acc-actions{display:grid;gap:12px}
.acc-returned{padding:6px 10px;border-left:4px solid var(--acc-open);background:rgba(192,57,43,.07)}
/* План: поиск, линии щита, расшифровка отделки, QR-наклейки */
.plan-search{position:absolute;top:56px;left:10px;z-index:2;width:min(300px,calc(100% - 74px))}
.plan-search input{width:100%;min-height:40px;padding:0 14px;border:1px solid var(--border);border-radius:999px;background:rgba(255,255,255,.96);color:var(--ink);font:inherit;font-size:15px}
.plan-search-results{max-height:min(50dvh,360px);overflow-y:auto;margin:6px 0 0;padding:6px;border:1px solid var(--border);border-radius:14px;background:#fff;box-shadow:0 8px 28px rgba(20,24,30,.16);list-style:none}
.plan-search-results[hidden]{display:none}
.plan-search-results button{display:grid;width:100%;min-height:44px;padding:4px 8px;border:0;border-radius:10px;background:none;color:var(--ink);font:inherit;text-align:left;cursor:pointer}
.plan-search-results button:hover,.plan-search-results button:focus-visible{background:var(--panel-hover)}
.plan-search-results strong,.plan-search-results small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plan-search-results strong{font-size:14px}
.plan-search-results small{color:var(--muted);font-size:12px}
.plan-search-none{padding:8px;color:var(--muted);font-size:13px}
.plan-lines{margin:4px 0 0;padding:0;list-style:none;font-size:13px}
.plan-lines>li{border-bottom:1px solid var(--border)}
.plan-lines summary{min-height:40px;padding:8px 0;cursor:pointer}
.plan-lines summary small,.plan-line-spec{color:var(--muted)}
.plan-line-spec{margin:0 0 6px;font-size:12px}
.plan-chips{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px}
.plan-chip{display:inline-flex;align-items:center;min-height:32px;padding:0 10px;border:1px solid var(--border);border-radius:999px;color:var(--ink);font-size:13px;font-weight:700;text-decoration:none}
a.plan-chip:hover{background:var(--panel-hover)}
.plan-ref{margin:4px 0 0;padding-left:18px}
.plan-ref li{margin:0 0 6px}
.qr-label svg.plan-qr{width:88px;height:88px}
.plan-qr-form fieldset{margin:0 0 10px;padding:0;border:0}
@media (max-width: 899px){
  .plan-search{top:54px;width:calc(100% - 20px)}
}
.plan-sub{margin:10px 0 2px;color:var(--muted);font-size:12px;font-weight:700}
.plan-warn{margin:8px 0 0;padding:8px 10px;border-radius:10px;background:var(--warn-soft);color:var(--warn);font-size:12px}
