﻿/* FEC — оформление.
   Инлайновых стилей нет: CSP работает без unsafe-inline.
   Единственный скрипт — app.js, только клавиатура в модальных окнах;
   всё остальное держится на :target, <details> и :has().

   Цвета текста и границ подобраны замером (WCAG 2.1), а не на глаз:
   каждый токен проходит 4.5:1 на самом тёмном фоне, где он встречается. */

:root{
  --bg:#14171b; --panel:#1b1f25; --panel-raised:#232830; --panel-hover:#282e37;

  /* Структурные линии (не несут смысла в одиночку) */
  --border:#2c323c; --border-light:#394150;
  /* Границы элементов управления — 3:1 к фону, WCAG 1.4.11 */
  --border-control:#63718b;

  /* Текст: 4.5:1 и выше на bg / panel / raised / hover */
  --text:#eceff3;        /* 14.3:1 на panel */
  --text-dim:#aab3c0;    /* 8.0:1  на panel */
  --text-faint:#8d95a3;  /* 5.5:1  на panel, 4.9:1 на raised */

  /* Акценты: насыщенные — для заливок и линий */
  --amber:#e8a23d; --blue:#4c9fe8; --green:#4fae7c; --red:#e2604f;
  /* Осветлённые — для текста поверх полупрозрачной заливки того же цвета */
  --amber-soft:#eeb35d; --blue-soft:#68b0ee; --green-soft:#69bf92; --red-soft:#ee8271;

  --view-max:1360px;
  --ease:cubic-bezier(.2,.8,.3,1);
  /* Одно семейство на весь текст: иерархию держат насыщенность и размер.
     Manrope — тёплый геометрический гротеск с полной кириллицей.
     Моноширинный отдельно — для номеров, дат и всего, что должно
     выстраиваться в колонку. */
  --font-display:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-body:'Manrope',system-ui,-apple-system,'Segoe UI',sans-serif;
  --font-mono:'JetBrains Mono',ui-monospace,Consolas,monospace;
}
*{box-sizing:border-box;}
html,body{margin:0;padding:0;background:var(--bg);color:var(--text);font-family:var(--font-body);min-height:100vh;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}
body.modal-open{overflow:hidden;}
a{color:inherit;}
button,input,select{font-family:var(--font-body);}
button{cursor:pointer;}
:focus-visible{outline:2px solid var(--blue);outline-offset:2px;border-radius:3px;}
[inert]{pointer-events:none;}
.ico{flex-shrink:0;vertical-align:-.18em;}

/* Видно только экранному диктору */
.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}

/* Заголовки не оставляют одно слово на последней строке, описания — тоже.
   Крупный текст набирается с лёгким отрицательным трекингом. */
h1,h2,h3,h4{text-wrap:balance;margin:0;}
.page-title,.card-title,.edit-title,.modal-title,.error-title,.login-title,.setup-title{
  text-wrap:balance;letter-spacing:-.015em;}
.page-sub,.modal-text,.error-text,.hint-line,.doc-hint,.search-hint,.login-hint,.empty-state{text-wrap:pretty;}

/* Ссылка «к содержимому»: первая в порядке обхода, видна только с клавиатуры */
.skip-link{position:absolute;left:12px;top:-60px;z-index:300;background:var(--amber);color:#1b1306;
  padding:11px 18px;border-radius:0 0 9px 9px;font-size:13px;font-weight:700;text-decoration:none;
  transition:top .18s var(--ease);}
.skip-link:focus{top:0;}

/* ------------------------------------------------------------ шапка */
.topbar{display:flex;align-items:center;justify-content:space-between;padding:16px 32px;border-bottom:1px solid var(--border);background:linear-gradient(180deg,#181c22,#14171b);flex-wrap:wrap;gap:12px;}
.brand{display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-size:21px;letter-spacing:-.01em;font-weight:800;text-decoration:none;color:var(--text);transition:opacity .15s;}
.brand:hover{opacity:.82;}
.brand-mark{width:30px;height:30px;border:2px solid var(--amber);border-radius:7px;display:flex;align-items:center;justify-content:center;color:var(--amber);font-family:var(--font-mono);font-size:13px;font-weight:700;flex-shrink:0;}
.brand-sub{font-family:var(--font-mono);font-size:11px;color:var(--text-faint);margin-left:4px;font-weight:400;}
.nav-links{display:flex;gap:6px;background:var(--panel);padding:5px;border-radius:11px;border:1px solid var(--border);flex-wrap:wrap;}
.nav-links a{display:flex;align-items:center;gap:7px;padding:9px 16px;border-radius:7px;font-size:13px;font-weight:600;text-decoration:none;color:var(--text-dim);transition:color .15s,background .15s;}
.nav-links a .ico{opacity:.65;transition:opacity .15s;}
.nav-links a.active{background:var(--panel-raised);color:var(--text);box-shadow:0 0 0 1px var(--border-light);}
.nav-links a.active .ico{opacity:1;color:var(--amber);}
.nav-links a:hover{color:var(--text);background:var(--panel-hover);}
.nav-links a:hover .ico{opacity:1;}
.user-box{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--text-dim);flex-wrap:wrap;}
.user-box b{color:var(--text);}
.role-tag{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase;background:var(--panel-raised);padding:4px 9px;border-radius:12px;color:var(--amber);border:1px solid var(--border);}
.logout-link{display:inline-flex;align-items:center;gap:6px;color:var(--text-faint);text-decoration:none;font-size:12px;transition:color .15s;}
.logout-link:hover{color:var(--text);}

.view{padding:26px 32px 64px;max-width:var(--view-max);margin:0 auto;}

/* ------------------------------------------------------------ заголовки страниц */
.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:20px;}
.page-title{display:flex;align-items:center;gap:11px;font-family:var(--font-display);font-size:22px;font-weight:800;margin:0;}
.page-title .ico{color:var(--amber);}
.page-sub{font-size:12px;color:var(--text-faint);margin-top:5px;}

/* ------------------------------------------------------------ сообщения */
.flash-region{display:flex;flex-direction:column;gap:9px;}
.flash-region:not(:empty){margin-bottom:18px;}
.flash{display:flex;align-items:flex-start;gap:11px;padding:13px 17px;border-radius:10px;font-size:13px;font-weight:500;animation:flash-in .3s var(--ease);}
.flash .ico{margin-top:1px;}
.flash-ok{background:rgba(79,174,124,.12);color:var(--green-soft);border:1px solid rgba(79,174,124,.32);}
.flash-error{background:rgba(226,96,79,.12);color:var(--red-soft);border:1px solid rgba(226,96,79,.32);}
@keyframes flash-in{from{opacity:0;transform:translateY(-8px);}to{opacity:1;transform:none;}}

/* ------------------------------------------------------------ поиск */
.search-form{display:flex;gap:10px;position:relative;align-items:stretch;}
.search-icon{position:absolute;left:18px;top:50%;transform:translateY(-50%);color:var(--text-faint);display:flex;pointer-events:none;z-index:1;transition:color .18s;}
.search-form:focus-within .search-icon{color:var(--blue);}
.search-panel input[type=text]{flex:1;min-width:0;background:var(--panel);border:1px solid var(--border-control);color:var(--text);padding:17px 20px 17px 50px;border-radius:12px;font-size:16px;font-family:var(--font-mono);outline:none;transition:border-color .16s,box-shadow .16s,background .16s;}
.search-panel input::placeholder{color:var(--text-faint);}
.search-panel input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(76,159,232,.14);background:var(--panel-raised);}
.search-btn{display:inline-flex;align-items:center;gap:8px;background:var(--blue);color:#0c1c2b;border:none;padding:0 28px;border-radius:12px;font-weight:700;font-size:14px;transition:filter .15s,transform .1s;}
.search-btn:hover{filter:brightness(1.08);}
.search-btn:active{transform:scale(.96);}
.search-hint{font-size:12px;color:var(--text-faint);margin-top:10px;padding-left:2px;}
.results-head{display:flex;justify-content:space-between;align-items:center;margin:26px 0 12px;font-size:13px;color:var(--text-dim);gap:12px;flex-wrap:wrap;}

.results-list{display:flex;flex-direction:column;gap:8px;margin-bottom:20px;}
.result-row{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:15px 18px;display:flex;justify-content:space-between;align-items:center;gap:16px;text-decoration:none;color:var(--text);
  transition:background .16s,border-color .16s,transform .16s,box-shadow .16s;}
.result-row:hover{background:var(--panel-hover);border-color:var(--border-light);transform:translateX(4px);box-shadow:-3px 0 0 0 var(--amber);}
.result-row:active{transform:translateX(4px) scale(.995);}
/* Поиск — основное и самое частое действие в приложении, поэтому список
   появляется целиком одним коротким проявлением. Пошаговый вылет строк
   здесь был бы задержкой на каждом запросе, а не подсказкой. */
.results-list{animation:rise .22s var(--ease);}
@keyframes rise{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}

.result-main{min-width:0;display:flex;flex-direction:column;}
.result-side{display:flex;align-items:center;gap:14px;flex-shrink:0;}
.result-serial{font-family:var(--font-mono);font-weight:700;font-size:14px;display:block;}
.result-addr{font-size:13px;color:var(--text-dim);margin-top:3px;display:block;}
.result-model{font-size:12px;color:var(--text-faint);display:block;}
.status-chip{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:5px 12px;border-radius:20px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;}
.status-chip .ico{opacity:.9;}
.status-progress{background:rgba(76,159,232,.12);color:var(--blue-soft);}
.status-done{background:rgba(79,174,124,.12);color:var(--green-soft);}
.status-pending{background:rgba(232,162,61,.12);color:var(--amber-soft);}
.status-service{background:rgba(79,174,124,.12);color:var(--green-soft);}

.empty-state{padding:48px 20px;text-align:center;color:var(--text-faint);font-size:14px;}
.empty-state .ico{color:var(--border-light);margin-bottom:14px;}
.empty-state strong{display:block;color:var(--text-dim);font-family:var(--font-display);font-size:17px;font-weight:700;margin-bottom:7px;}

/* ---------------------------------------- последние завершённые карточки */
.recent-block{margin-top:30px;transition:opacity .26s var(--ease),transform .26s var(--ease),max-height .32s var(--ease);max-height:5000px;}
/* Как только в поле поиска появился первый символ — блок уходит.
   :placeholder-shown ложно, когда в поле что-то есть. JavaScript не нужен. */
.search-page:has(.search-form input:not(:placeholder-shown)) .recent-block{
  opacity:0;transform:translateY(-10px);max-height:0;overflow:hidden;margin:0;pointer-events:none;
}
.block-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px;flex-wrap:wrap;}
.block-title{display:flex;align-items:center;gap:8px;font-family:var(--font-display);font-size:12px;letter-spacing:.07em;text-transform:uppercase;color:var(--text-dim);margin:0;font-weight:700;}
.block-note{font-size:11px;color:var(--text-faint);}

.recent-card{background:var(--panel);border:1px solid var(--border);border-radius:12px;margin-bottom:10px;overflow:hidden;transition:border-color .18s,box-shadow .18s;}
.recent-card[open]{border-color:var(--border-light);box-shadow:0 6px 22px rgba(0,0,0,.24);}
.recent-card:hover{border-color:var(--border-light);}
.recent-head{display:flex;align-items:center;gap:14px;padding:16px 18px;cursor:pointer;list-style:none;transition:background .15s;}
.recent-head::-webkit-details-marker{display:none;}
.recent-head:hover{background:var(--panel-hover);}
.recent-chevron{color:var(--text-faint);display:flex;flex-shrink:0;transition:transform .24s var(--ease),color .18s;}
.recent-card[open] .recent-chevron{transform:rotate(90deg);color:var(--green);}
.recent-main{flex:1;min-width:0;}
.recent-serial{font-family:var(--font-mono);font-weight:700;font-size:14px;display:block;}
.recent-addr{font-size:13px;color:var(--text-dim);margin-top:3px;display:block;}
.recent-side{display:flex;align-items:center;gap:14px;flex-shrink:0;}
.recent-model{font-size:12px;color:var(--text-faint);}
.recent-body{padding:4px 22px 22px;border-top:1px solid var(--border);animation:reveal .3s var(--ease);}
.recent-meta{font-size:13px;color:var(--text-dim);padding:16px 0 20px;}
.recent-actions{display:flex;gap:10px;margin-top:22px;flex-wrap:wrap;}
@keyframes reveal{from{opacity:0;transform:translateY(-8px);}to{opacity:1;transform:none;}}

/* ------------------------------------------------------------ карточка лифта */
.elevator-card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:30px 34px;}
.card-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:26px;flex-wrap:wrap;gap:14px;padding-bottom:22px;border-bottom:1px solid var(--border);}
.card-title{display:flex;align-items:center;gap:11px;font-family:var(--font-display);font-size:27px;font-weight:800;margin:0;}
.card-title .ico{color:var(--amber);}
.card-meta{font-size:13px;color:var(--text-dim);margin-top:9px;line-height:1.75;}
.card-meta b{color:var(--text);font-weight:500;}
.card-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.card-footer{margin-top:24px;padding-top:16px;border-top:1px solid var(--border);font-size:11px;color:var(--text-faint);font-family:var(--font-mono);}
.btn-secondary{display:inline-flex;align-items:center;gap:7px;background:var(--panel-raised);border:1px solid var(--border-light);color:var(--text-dim);border-radius:8px;padding:9px 15px;font-size:12px;text-decoration:none;transition:color .15s,border-color .15s,background .15s,transform .1s;}
.btn-secondary:hover{color:var(--text);border-color:var(--border-control);background:var(--panel-hover);}
.btn-secondary:active{transform:scale(.96);}

/* Шахта. Высоты не фиксированы: рельс тянется по содержимому, слоты делят
   его поровну. Заливка задана долями, поэтому переживает зум 200%
   и длинные подписи. Формула: до центра точки N это (N-1)/7 высоты. */
.shaft{display:flex;gap:30px;align-items:stretch;}
.shaft-rail{width:34px;flex-shrink:0;position:relative;min-height:420px;}
.shaft-line{position:absolute;top:calc(100% / 14);bottom:calc(100% / 14);width:3px;background:var(--border-light);border-radius:2px;left:50%;transform:translateX(-50%);}
/* transform-origin задан здесь, а не в кадре: иначе он анимировался бы
   от top к center и заливка росла бы из середины */
.shaft-line-fill{position:absolute;top:calc(100% / 14);width:3px;background:var(--green);border-radius:2px;left:50%;transform:translateX(-50%);transform-origin:top center;z-index:1;animation:grow .55s var(--ease);}
@keyframes grow{from{transform:translateX(-50%) scaleY(0);}}
.shaft-line-fill.f0{display:none;}
.shaft-line-fill.f1{height:0;}
.shaft-line-fill.f2{height:calc(100% / 7);}
.shaft-line-fill.f3{height:calc(100% * 2 / 7);}
.shaft-line-fill.f4{height:calc(100% * 3 / 7);}
.shaft-line-fill.f5{height:calc(100% * 4 / 7);}
.shaft-line-fill.f6{height:calc(100% * 5 / 7);}
.shaft-line-fill.f7{height:calc(100% * 6 / 7);}
.stop-col{display:flex;flex-direction:column;height:100%;position:relative;z-index:2;}
.stop-slot{flex:1;display:flex;align-items:center;justify-content:center;min-height:60px;}
.stop{width:20px;height:20px;border-radius:50%;background:var(--panel-raised);border:2px solid var(--border-control);transition:box-shadow .2s,background .2s;}
.stop.filled{background:var(--green);border-color:var(--green);box-shadow:0 0 0 4px rgba(79,174,124,.18);}
.stops-wrap{display:flex;flex-direction:column;flex:1;min-width:0;list-style:none;margin:0;padding:0;}
.stage-row{flex:1;display:flex;align-items:center;min-height:60px;padding:7px 0;}
.stage-name{font-family:var(--font-display);font-size:15px;font-weight:700;}
.stage-date{font-family:var(--font-mono);font-size:13px;color:var(--green-soft);margin-top:4px;font-variant-numeric:tabular-nums;}
.stage-date.empty{color:var(--text-faint);}
.stage-extra{font-size:12px;color:var(--text-dim);margin-top:4px;}
.stage-by{font-size:11px;color:var(--text-faint);margin-top:4px;}

/* ------------------------------------------------------------ заполнение */
.installer-layout{display:grid;grid-template-columns:300px 1fr;gap:22px;align-items:start;}
/* Радиус панели = радиус элемента списка + отступ (7 + 11), вложенные углы концентричны */
.side-panel{background:var(--panel);border:1px solid var(--border);border-radius:18px;padding:11px;position:sticky;top:16px;}
.new-form{display:flex;gap:6px;margin-bottom:10px;}
.new-form input{flex:1;min-width:0;background:var(--panel-raised);border:1px solid var(--border-control);color:var(--text);padding:11px 12px;border-radius:7px;font-size:13px;font-family:var(--font-mono);outline:none;transition:border-color .15s,box-shadow .15s;}
.new-form input::placeholder{color:var(--text-faint);}
.new-form input:focus{border-color:var(--amber);box-shadow:0 0 0 3px rgba(232,162,61,.14);}
.new-btn{display:inline-flex;align-items:center;gap:5px;background:var(--amber);color:#1b1306;border:none;padding:11px 15px;border-radius:7px;font-weight:700;font-size:12px;white-space:nowrap;transition:filter .15s,transform .1s;}
.new-btn:hover{filter:brightness(1.08);}
.new-btn:active{transform:scale(.96);}

.side-search{display:flex;gap:6px;margin-bottom:10px;padding-bottom:12px;border-bottom:1px solid var(--border);}
.side-search input{flex:1;min-width:0;background:var(--bg);border:1px solid var(--border-control);color:var(--text);padding:11px 12px;border-radius:7px;font-size:13px;outline:none;transition:border-color .15s,box-shadow .15s;}
.side-search input::placeholder{color:var(--text-faint);}
.side-search input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(76,159,232,.14);}
.side-search-btn{background:var(--panel-raised);border:1px solid var(--border-control);color:var(--text-dim);border-radius:7px;padding:0 13px;display:flex;align-items:center;transition:color .15s,border-color .15s,background .15s,transform .1s;}
.side-search-btn:hover{color:var(--blue);border-color:var(--blue);background:var(--panel-hover);}
.side-search-btn:active{transform:scale(.96);}
.side-filter{font-size:11px;color:var(--text-faint);padding:0 2px 10px;display:flex;justify-content:space-between;gap:8px;}
.side-filter a{color:var(--blue-soft);text-decoration:none;}
.side-filter a:hover{text-decoration:underline;}
.side-list{max-height:min(58vh,520px);overflow-y:auto;margin:0 -4px;padding:0 4px;}
.list-item{display:block;padding:11px 13px;border-radius:7px;margin-bottom:4px;text-decoration:none;color:var(--text);border:1px solid transparent;transition:background .15s,border-color .15s,transform .12s;}
.list-item:hover{background:var(--panel-hover);transform:translateX(2px);}
.list-item.active{background:var(--panel-raised);border-color:var(--border-control);}
.li-serial{font-family:var(--font-mono);font-size:13px;font-weight:700;display:block;}
.li-addr{font-size:11px;color:var(--text-faint);margin-top:3px;display:block;}
.side-empty{color:var(--text-faint);font-size:12px;padding:18px 10px;text-align:center;}

/* ------------------------------------------------------------ формы */
.edit-form{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:26px 30px;}
.edit-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;padding-bottom:20px;margin-bottom:22px;border-bottom:1px solid var(--border);}
.edit-title{display:flex;align-items:center;gap:10px;font-family:var(--font-display);font-size:23px;font-weight:800;margin:0;}
.edit-title .ico{color:var(--amber);}
.edit-sub{font-size:13px;color:var(--text-dim);margin-top:5px;}
.edit-head-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;}

.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:17px;margin-bottom:10px;}
.field{display:flex;flex-direction:column;gap:7px;min-width:0;}
.field label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-dim);font-weight:600;}
.field input,.field select{background:var(--panel-raised);border:1px solid var(--border-control);color:var(--text);padding:12px 14px;border-radius:8px;font-size:14px;outline:none;width:100%;transition:border-color .15s,box-shadow .15s;}
.field input::placeholder{color:var(--text-faint);}
.field input:focus,.field select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(76,159,232,.14);}
.field input[readonly]{color:var(--text-dim);background:var(--bg);border-color:var(--border);}
.field-full{grid-column:1/-1;}
.field-gap{margin-bottom:14px;}
.section-label{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;letter-spacing:.07em;text-transform:uppercase;color:var(--text-dim);margin:28px 0 16px;padding-top:20px;border-top:1px solid var(--border);font-weight:700;}
.section-label.first{margin-top:0;border-top:none;padding-top:0;}
.section-count{font-family:var(--font-body);font-size:11px;text-transform:none;letter-spacing:0;color:var(--text-faint);font-weight:400;}
.hint-line{font-size:12px;color:var(--text-faint);margin-top:14px;line-height:1.7;max-width:62ch;}

.stage-legend{display:grid;grid-template-columns:220px 170px 1fr 1fr;gap:12px;padding:0 2px 9px;}
.stage-legend-cell{font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-faint);font-weight:600;}
.stage-edit-row{display:grid;grid-template-columns:220px 170px 1fr;gap:12px;align-items:center;margin-bottom:11px;}
.stage-edit-row.extra{grid-template-columns:220px 170px 1fr 1fr 190px;}
.stage-edit-row .stage-label{font-size:13px;font-weight:500;}
.stage-edit-row input{width:100%;min-width:0;background:var(--panel-raised);border:1px solid var(--border-control);color:var(--text);padding:11px 12px;border-radius:7px;font-size:13px;outline:none;transition:border-color .15s,box-shadow .15s;}
.stage-edit-row input::placeholder{color:var(--text-faint);}
.stage-edit-row input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(76,159,232,.14);}

.save-bar{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-top:24px;flex-wrap:wrap;}
.save-btn{display:inline-flex;align-items:center;gap:8px;background:var(--blue);color:#0c1c2b;border:none;padding:13px 28px;border-radius:9px;font-weight:700;font-size:13px;transition:filter .15s,transform .1s,box-shadow .15s;}
.save-btn:hover{filter:brightness(1.08);box-shadow:0 6px 18px rgba(76,159,232,.22);}
.save-btn:active{transform:scale(.96);}

.danger-btn{display:inline-flex;align-items:center;gap:7px;background:transparent;border:1px solid rgba(226,96,79,.5);color:var(--red-soft);padding:9px 16px;border-radius:8px;font-size:12px;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,transform .1s;}
.danger-btn:hover{background:rgba(226,96,79,.14);border-color:var(--red);}
.danger-btn:active{transform:scale(.96);}
.doc-divider{height:1px;background:linear-gradient(90deg,rgba(226,96,79,.35),rgba(226,96,79,.04));margin:32px 0 6px;}

/* ------------------------------------------------------------ документы */
.documents{margin-top:4px;}
.doc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;}
/* Радиус карточки = радиус вложенного блока + отступ (6 + 14) */
.doc-card{background:var(--panel-raised);border:1px solid var(--border);border-radius:20px;padding:14px;display:flex;flex-direction:column;gap:13px;transition:border-color .18s,transform .18s,box-shadow .18s;}
.doc-card:hover{border-color:var(--border-light);transform:translateY(-2px);box-shadow:0 10px 26px rgba(0,0,0,.22);}
.doc-card.has-file{border-color:rgba(79,174,124,.32);}
.doc-head{display:flex;align-items:flex-start;gap:11px;}
.doc-icon{color:var(--text-faint);display:flex;flex-shrink:0;margin-top:1px;transition:color .18s;}
.doc-card.has-file .doc-icon{color:var(--green-soft);}
.doc-titles{flex:1;min-width:0;}
.doc-name{font-family:var(--font-display);font-size:15px;font-weight:700;margin:0;}
.doc-hint{font-size:11px;color:var(--text-faint);margin-top:3px;}
.doc-badge{display:inline-flex;align-items:center;gap:4px;font-size:9px;text-transform:uppercase;letter-spacing:.06em;font-weight:700;color:var(--green-soft);background:rgba(79,174,124,.12);padding:4px 9px;border-radius:10px;flex-shrink:0;}
.doc-file{background:var(--bg);border-radius:6px;padding:11px 13px;}
.doc-file-name{font-size:12px;font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.doc-file-meta{font-size:10px;color:var(--text-faint);margin-top:5px;}
.doc-missing{font-size:12px;color:var(--text-faint);padding:12px 0;text-align:center;border:1px dashed var(--border-light);border-radius:6px;}
.doc-actions{display:flex;gap:7px;flex-wrap:wrap;}
.doc-btn{display:inline-flex;align-items:center;gap:6px;background:var(--panel);border:1px solid var(--border-light);color:var(--text-dim);border-radius:8px;padding:9px 13px;font-size:12px;text-decoration:none;transition:color .15s,border-color .15s,background .15s,transform .1s;}
.doc-btn:hover{color:var(--text);border-color:var(--border-control);background:var(--panel-hover);}
.doc-btn:active{transform:scale(.96);}
.doc-btn-primary{background:rgba(76,159,232,.12);border-color:rgba(76,159,232,.4);color:var(--blue-soft);}
.doc-btn-primary:hover{background:rgba(76,159,232,.2);color:var(--blue-soft);border-color:var(--blue);}
.doc-btn-danger{color:var(--red-soft);border-color:rgba(226,96,79,.34);}
.doc-btn-danger:hover{color:var(--red-soft);background:rgba(226,96,79,.12);border-color:var(--red);}

.dropzone-form{margin-top:auto;display:flex;flex-direction:column;gap:9px;}
.dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;text-align:center;padding:22px 14px;border:1.5px dashed var(--border-control);border-radius:6px;cursor:pointer;transition:border-color .18s,background .18s,color .18s;}
.dropzone:hover{border-color:var(--blue);background:rgba(76,159,232,.06);}
.dropzone:focus-within{border-color:var(--blue);background:rgba(76,159,232,.08);outline:2px solid var(--blue);outline-offset:2px;}
/* Поле выбора файла растянуто на всю зону: перетаскивание обрабатывает
   сам браузер, обработчиков на JavaScript не требуется. */
.dropzone input[type=file]{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;}
.dropzone-icon{color:var(--text-faint);display:flex;transition:color .18s,transform .18s;}
.dropzone:hover .dropzone-icon{color:var(--blue);transform:translateY(-2px);}
.dropzone-text{font-size:12px;color:var(--text-dim);display:flex;flex-direction:column;gap:4px;}
.dropzone-sub{font-size:10px;color:var(--text-faint);}
.doc-upload-btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;background:var(--panel);border:1px solid var(--border-control);color:var(--text);border-radius:8px;padding:11px;font-size:12px;font-weight:600;transition:background .15s,border-color .15s,transform .1s;}
.doc-upload-btn:hover{background:var(--panel-hover);border-color:var(--blue);}
.doc-upload-btn:active{transform:scale(.96);}

/* ------------------------------------------------------------ модальные окна */
/* Открываются по :target. app.js добавляет клавиатуру: фокус внутрь,
   удержание, Escape, возврат на триггер. Без скрипта окна тоже работают. */
/* visibility переключается мгновенно при открытии и с задержкой при закрытии.
   Если её плавно переводить, элемент ещё скрыт в момент, когда app.js уводит
   в него фокус, — а focus() на скрытом элементе молча не срабатывает. */
.modal{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:22px;opacity:0;visibility:hidden;overscroll-behavior:contain;transition:opacity .2s var(--ease),visibility 0s linear .2s;}
.modal:target{opacity:1;visibility:visible;transition:opacity .2s var(--ease),visibility 0s;}
.modal-backdrop{position:absolute;inset:0;background:rgba(8,10,13,.76);}
.modal-box{position:relative;background:var(--panel-raised);border:1px solid var(--border-light);border-radius:18px;padding:28px;max-width:480px;width:100%;box-shadow:0 28px 74px rgba(0,0,0,.58);transform:scale(.95) translateY(10px);transition:transform .26s var(--ease);max-height:calc(100vh - 44px);overflow-y:auto;}
.modal:target .modal-box{transform:none;}
.modal-icon{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center;margin-bottom:17px;}
.modal-icon-danger{background:rgba(226,96,79,.14);color:var(--red-soft);}
.modal-title{font-family:var(--font-display);font-size:20px;margin:0 0 10px;font-weight:800;}
.modal-text{font-size:13px;color:var(--text-dim);line-height:1.7;margin:0 0 8px;max-width:52ch;}
.modal-text-warn{color:var(--amber-soft);}
.modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:24px;flex-wrap:wrap;align-items:center;}

.modal-box-viewer{max-width:1040px;padding:0;display:flex;flex-direction:column;height:min(88vh,920px);overflow:hidden;}
.modal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--border);}
.modal-head-title{font-family:var(--font-display);font-size:15px;margin:0;font-weight:700;}
.modal-close{display:flex;align-items:center;justify-content:center;width:34px;height:34px;color:var(--text-dim);text-decoration:none;border-radius:8px;transition:color .15s,background .15s;}
.modal-close:hover{color:var(--text);background:var(--panel-hover);}
.doc-frame{flex:1;width:100%;border:none;background:#2a2f36;min-height:0;}
.modal-foot{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--border);flex-wrap:wrap;}
.modal-foot-hint{font-size:11px;color:var(--text-faint);margin-right:auto;}

/* ------------------------------------------------------------ вход */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;}
.login-box{background:var(--panel);border:1px solid var(--border);border-radius:16px;padding:38px;width:100%;max-width:390px;animation:reveal .32s var(--ease);box-shadow:0 20px 60px rgba(0,0,0,.3);}
.login-box-wide{max-width:440px;}
.login-box .brand{justify-content:center;margin-bottom:20px;}
.login-box .field{margin-bottom:15px;}
.login-title{font-family:var(--font-display);font-size:18px;text-align:center;margin:0 0 6px;font-weight:800;}
.login-box button{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;background:var(--amber);color:#1b1306;border:none;padding:13px;border-radius:10px;font-weight:700;font-size:14px;margin-top:10px;transition:filter .15s,transform .1s,box-shadow .15s;}
.login-box button:hover{filter:brightness(1.08);box-shadow:0 8px 22px rgba(232,162,61,.22);}
.login-box button:active{transform:scale(.96);}
.login-hint{font-size:11px;color:var(--text-faint);text-align:center;margin-top:17px;line-height:1.8;}
.skip-form{margin-top:10px;}
.skip-btn{width:100%;background:transparent !important;border:1px solid var(--border-control) !important;
  color:var(--text-dim) !important;font-weight:600 !important;box-shadow:none !important;}
.skip-btn:hover{color:var(--text) !important;border-color:var(--text-faint) !important;filter:none !important;}
.skip-note{font-size:11px;color:var(--text-faint);text-align:center;margin-top:10px;line-height:1.7;}
.setup-panel{max-width:440px;}
.setup-panel .qr-box{max-width:230px;margin-inline:auto;}
.login-alt{text-align:center;margin-top:15px;font-size:12px;}
.login-alt a{color:var(--text-faint);transition:color .15s;}
.login-alt a:hover{color:var(--text);}

.step-line{display:flex;align-items:center;justify-content:center;gap:7px;margin-bottom:24px;font-size:11px;color:var(--text-dim);flex-wrap:wrap;}
.step{width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--font-mono);font-size:10px;font-weight:700;background:var(--panel-raised);color:var(--text-faint);border:1px solid var(--border-control);flex-shrink:0;}
.step.current{background:var(--amber);color:#1b1306;border-color:var(--amber);animation:step-pulse 2.4s ease-in-out infinite;}
.step.done{background:var(--green);color:#0c2117;border-color:var(--green);}
@keyframes step-pulse{0%,100%{box-shadow:0 0 0 0 rgba(232,162,61,.34);}50%{box-shadow:0 0 0 6px rgba(232,162,61,0);}}
.step-text{font-size:11px;}
.step-text.dim{color:var(--text-faint);}
.step-arrow{color:var(--text-faint);margin:0 2px;display:flex;}
.who{text-align:center;font-size:13px;color:var(--text-dim);margin-bottom:18px;}
.code-input{font-family:var(--font-mono);font-size:24px;letter-spacing:.4em;text-align:center;font-variant-numeric:tabular-nums;}

.setup-title{font-family:var(--font-display);font-size:17px;text-align:center;margin:0 0 6px;font-weight:800;}
.setup-steps{font-size:12px;color:var(--text-dim);line-height:1.9;padding-left:20px;margin:0 0 18px;}
.qr-box{display:flex;justify-content:center;background:#fff;border-radius:12px;padding:12px;margin-bottom:14px;}
.qr-box img{display:block;width:200px;height:200px;outline:1px solid rgba(0,0,0,.1);outline-offset:-1px;}
.secret-box{background:var(--panel-raised);border:1px solid var(--border);border-radius:9px;padding:12px 14px;margin-bottom:18px;}
.secret-label{font-size:10px;color:var(--text-faint);text-transform:uppercase;letter-spacing:.05em;margin-bottom:5px;}
.secret-value{font-family:var(--font-mono);font-size:13px;color:var(--amber-soft);word-break:break-all;}

/* ------------------------------------------------------------ таблицы и чипы */
.users-layout{display:flex;flex-direction:column;gap:22px;}
.panel-narrow{max-width:620px;margin-bottom:24px;}
.table-wrap{overflow-x:auto;}
table.users-table{width:100%;border-collapse:collapse;margin-top:14px;}
table.users-table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-faint);padding:9px 14px;border-bottom:1px solid var(--border);white-space:nowrap;font-weight:600;}
table.users-table td{padding:12px 14px;border-bottom:1px solid var(--border);font-size:13px;vertical-align:middle;}
table.users-table tbody tr{transition:background .15s;}
table.users-table tbody tr:hover{background:var(--panel-raised);}
table.users-table tr:last-child td{border-bottom:none;}
.journal-table td{font-size:12px;}
.details-cell{color:var(--text-dim);max-width:420px;}
.empty-cell{text-align:center;color:var(--text-faint);padding:34px;}
.row-actions{display:flex;gap:6px;flex-wrap:wrap;}
.inline-form{display:inline;}
.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums;}
.dim{color:var(--text-faint);}
.nowrap{white-space:nowrap;}

/* Сотрудник одной ячейкой: точка присутствия, имя, логин под ним */
.person{display:inline-flex;align-items:center;gap:10px;}
.person-text{display:flex;flex-direction:column;min-width:0;}
.person-name{font-size:13px;font-weight:600;}
.person-login{font-size:11px;color:var(--text-faint);margin-top:2px;}
.presence-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.presence-dot.is-online{background:var(--green);animation:pulse 2.2s ease-in-out infinite;}
.presence-dot.is-offline{background:var(--text-faint);opacity:.5;}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(79,174,124,.38);}50%{box-shadow:0 0 0 6px rgba(79,174,124,0);}}
.state-cell{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;}
.pill-soft{background:var(--panel-raised);color:var(--text-dim);}
.compact-table td{padding:10px 14px;}

/* Свёрнутая форма создания: список важнее, чем заведение нового */
.add-panel{border:1px solid var(--border);border-radius:10px;background:var(--panel-raised);margin-bottom:16px;}
.add-summary{display:flex;align-items:center;gap:8px;padding:12px 16px;cursor:pointer;list-style:none;font-size:13px;font-weight:600;color:var(--text-dim);border-radius:9px;transition:color .15s,background .15s;}
.add-summary::-webkit-details-marker{display:none;}
.add-summary:hover{color:var(--text);background:var(--panel-hover);}
.add-panel[open] .add-summary{color:var(--text);border-bottom:1px solid var(--border);border-radius:9px 9px 0 0;}
.add-form{padding:16px;}
.add-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:13px;align-items:end;}
.add-submit{white-space:nowrap;}

.pill{display:inline-flex;align-items:center;gap:5px;font-size:10px;padding:4px 10px;border-radius:10px;text-transform:uppercase;letter-spacing:.05em;font-weight:700;white-space:nowrap;}
.pill-admin{background:rgba(232,162,61,.12);color:var(--amber-soft);}
.pill-director{background:rgba(76,159,232,.12);color:var(--blue-soft);}
.pill-user{background:rgba(170,179,192,.12);color:var(--text-dim);}
.pill-active{background:rgba(79,174,124,.12);color:var(--green-soft);}
.pill-inactive{background:var(--panel);color:var(--text-faint);}
.pill-blocked{background:rgba(226,96,79,.12);color:var(--red-soft);}
.mini-btn{display:inline-flex;align-items:center;gap:5px;background:var(--panel-raised);border:1px solid var(--border-light);color:var(--text-dim);padding:7px 12px;border-radius:7px;font-size:11px;text-decoration:none;transition:color .15s,border-color .15s,background .15s,transform .1s;}
.mini-btn:hover{color:var(--text);border-color:var(--border-control);background:var(--panel-hover);}
.mini-btn:active{transform:scale(.96);}

/* Компактная строка фильтров: всё в один ряд, применяется сразу */
.filter-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px;}
.filter-icon{display:flex;color:var(--text-faint);}
.filter-bar select{background:var(--panel-raised);border:1px solid var(--border-control);color:var(--text);padding:8px 11px;border-radius:7px;font-size:12px;outline:none;max-width:260px;transition:border-color .15s,box-shadow .15s;}
.filter-bar select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(76,159,232,.14);}
.filter-reset{color:var(--amber-soft);border-color:rgba(232,162,61,.4);}
.filter-reset:hover{color:var(--amber-soft);border-color:var(--amber);background:rgba(232,162,61,.1);}

.pager{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:22px;}
.pager-info{font-size:12px;color:var(--text-faint);font-variant-numeric:tabular-nums;}

/* ------------------------------------------------------------ аккаунт */
.account-layout{display:grid;grid-template-columns:1fr 1fr;gap:22px;align-items:start;}
.info-list{display:grid;grid-template-columns:auto 1fr;gap:12px 20px;margin:0;font-size:13px;}
.info-list dt{color:var(--text-faint);font-size:11px;text-transform:uppercase;letter-spacing:.05em;font-weight:600;padding-top:2px;}
.info-list dd{margin:0;}

/* ------------------------------------------------------------ ошибки */
.error-page{text-align:center;padding:80px 20px;}
.error-code{font-family:var(--font-display);font-size:78px;font-weight:800;letter-spacing:-.03em;color:var(--border-light);line-height:1;}
.error-title{font-family:var(--font-display);font-size:23px;margin:10px 0 0;font-weight:800;}
.error-text{color:var(--text-dim);font-size:14px;margin:12px auto 26px;max-width:52ch;line-height:1.75;}

/* ------------------------------------------------------------ адаптив */
@media (max-width:1100px){
  .account-layout{grid-template-columns:1fr;}
  .stage-edit-row.extra{grid-template-columns:200px 160px 1fr 1fr;}
  .stage-legend{grid-template-columns:200px 160px 1fr 1fr;}
}

@media (max-width:900px){
  .installer-layout{grid-template-columns:260px 1fr;}
  .stage-edit-row{grid-template-columns:180px 150px 1fr;}
  .stage-edit-row.extra{grid-template-columns:180px 150px 1fr;}
  .stage-legend{display:none;}
}

@media (max-width:720px){
  .view{padding:16px 14px 52px;}
  .topbar{padding:12px 16px;}
  .brand-sub{display:none;}
  .nav-links{width:100%;order:3;}
  .nav-links a{flex:1;justify-content:center;padding:11px 8px;}
  .user-box{font-size:12px;}
  .installer-layout{grid-template-columns:1fr;}
  .side-panel{position:static;}
  .side-list{max-height:340px;}
  .form-grid{grid-template-columns:1fr;}
  .elevator-card,.edit-form{padding:18px 16px;}
  .doc-grid{grid-template-columns:1fr;}

  /* Строка этапа: подпись сверху, поля в столбик — иначе на телефоне
     в них невозможно попасть пальцем (требование F7) */
  .stage-edit-row,.stage-edit-row.extra{grid-template-columns:1fr;gap:7px;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid var(--border);}
  .stage-edit-row .stage-label{font-family:var(--font-display);font-size:14px;color:var(--text-dim);}

  /* 16px во всех полях ввода: ниже этого iOS Safari зумит страницу */
  .field input,.field select,
  .stage-edit-row input,
  .new-form input,
  .side-search input,
  .search-panel input[type=text]{font-size:16px;padding:13px 12px;}
  .search-panel input[type=text]{padding-left:50px;}

  .save-bar{justify-content:stretch;}
  .save-btn{flex:1;justify-content:center;padding:15px 22px;}
  .shaft{gap:18px;}
  .card-actions,.edit-head-actions{width:100%;}
  .error-code{font-size:58px;}
  .modal{padding:12px;}
  .modal-box{padding:22px;border-radius:16px;}
  .modal-box-viewer{height:92vh;}
  .filter-bar select{max-width:none;flex:1;min-width:140px;font-size:16px;padding:11px;}
  .add-grid{grid-template-columns:1fr;}
  .recent-head{padding:14px;gap:10px;}
  .recent-side{flex-direction:column;align-items:flex-end;gap:6px;}
  .recent-body{padding:4px 14px 18px;}
  .page-title{font-size:19px;}
}

/* Системная настройка «меньше движения» отключает всю анимацию */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important;}
}
