:root{
  --navy:#0a3161; --navy2:#082750; --red:#b71414; --red2:#9c1010;
  --sky:#e8f4ff; --sky2:#f0f9ff; --ink:#0f172b; --grey:#475569;
  --line:#d6e4f2; --white:#fff; --green:#00bb7f; --greend:#00996a;
  --good:#1e8e5a; --warn:#c98a08; --goodbg:#e9f7f0; --warnbg:#fdf4dd; --redbg:#fbecec;
  --sidebar:#0a3161; --sidebar-h:#0d3a73;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',Arial,sans-serif;background:#f6f9fd;color:var(--ink);font-size:15px;line-height:1.5}
a{color:var(--navy)}
.app{display:flex;min-height:100vh}
.sidebar{width:256px;flex:0 0 256px;background:var(--sidebar);color:#cfe0f5;position:sticky;top:0;height:100vh;overflow-y:auto;padding:0 0 30px}
.sb-brand{padding:20px 22px 14px;font-weight:800;font-size:21px;color:#fff;letter-spacing:-.02em;display:flex;align-items:center;gap:9px}
.sb-brand .dot{width:11px;height:11px;border-radius:50%;background:var(--red);flex:0 0 11px}
.sb-brand .tt small{display:block;font-size:10px;font-weight:600;color:#8fb2df;letter-spacing:.1em;text-transform:uppercase;margin-top:2px}
.sb-title{font-size:11px;text-transform:uppercase;letter-spacing:.09em;color:#7ea3d6;padding:16px 22px 6px;font-weight:700}
.nav-item{display:flex;align-items:center;gap:11px;padding:9px 22px;font-size:13.5px;font-weight:600;color:#cfe0f5;cursor:pointer;border-left:3px solid transparent;transition:.12s}
.nav-item:hover{background:var(--sidebar-h);color:#fff}
.nav-item.active{background:var(--sidebar-h);color:#fff;border-left-color:var(--red)}
.nav-item .ic{width:18px;text-align:center;flex:0 0 18px;opacity:.92}
.nav-item .cnt{margin-left:auto;font-size:11px;background:rgba(255,255,255,.14);padding:1px 8px;border-radius:10px;font-weight:700}
.nav-sub .nav-item{padding-left:36px;font-size:13px}
.main{flex:1;min-width:0}
.topbar{background:#fff;border-bottom:1px solid var(--line);padding:12px 30px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:20;gap:16px}
.crumb{font-weight:800;font-size:16px;color:var(--ink)}
.crumb span{color:var(--grey);font-weight:500;font-size:13px}
.topbar .meta{font-size:12px;color:var(--grey);display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.pill{font-size:11px;font-weight:700;padding:3px 10px;border-radius:20px;background:var(--sky);color:var(--navy)}
.pill.g{background:var(--goodbg);color:var(--good)}
.pill.r{background:var(--redbg);color:var(--red)}
.content{padding:26px 30px 60px;max-width:1240px}
.panel{display:none}
.panel.on{display:block;animation:fade .2s}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.wrap{max-width:100%;margin:0;padding:0}
.phead{margin-bottom:22px}
.phead h1{font-size:clamp(22px,3vw,30px);font-weight:800;letter-spacing:-.02em}
.phead h1 em{font-style:normal;color:var(--red)}
.phead p{color:var(--grey);margin-top:7px;max-width:780px;font-size:14px}
.hero{background:linear-gradient(120deg,var(--navy),#0d3a73);color:#fff;border-radius:16px;padding:28px 32px;margin-bottom:24px;display:flex;gap:34px;align-items:center;flex-wrap:wrap}
.hero h1{font-size:clamp(21px,2.8vw,30px);font-weight:800;letter-spacing:-.02em;line-height:1.15;color:#fff}
.hero h1 em{font-style:normal;color:#ffd7d7}
.hero p{margin-top:10px;color:#c9dcf5;max-width:640px;font-size:14px}
.hero-flex{display:flex;gap:34px;align-items:center;flex-wrap:wrap;width:100%}
.hero .btn{background:var(--red)}
.scorebox{flex:0 0 auto;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.18);color:#fff;border-radius:14px;padding:20px 28px;text-align:center;min-width:180px}
.scorebox .v{font-size:44px;font-weight:800;line-height:1}
.scorebox .v small{font-size:19px;font-weight:600;opacity:.7}
.scorebox .l{font-size:11px;text-transform:uppercase;letter-spacing:.08em;margin-top:8px;opacity:.85}
.btn{display:inline-block;background:var(--red);color:#fff;font-weight:700;font-size:14px;padding:12px 22px;border-radius:9px;text-decoration:none;margin-top:14px;border:none;cursor:pointer;font-family:inherit}
.btn:hover{background:var(--red2)}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--navy)}
.btn.ghost:hover{background:var(--sky)}
.btn.green{background:var(--green)}.btn.green:hover{background:var(--greend)}
.btn.sm{padding:7px 14px;font-size:12.5px;margin-top:0}
.bigstats{background:var(--sky);padding:20px 24px;border-radius:14px;margin-bottom:22px}
.bigstats .row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;text-align:center}
.bigstats .n{font-size:clamp(24px,3vw,36px);font-weight:800;color:var(--navy)}
.bigstats .n.bad{color:var(--red)}
.bigstats .n.good{color:var(--green)}
.bigstats .t{font-size:12.5px;color:var(--grey);margin-top:4px}
h2.sec{font-size:clamp(18px,2.3vw,24px);font-weight:800;color:var(--ink);margin:36px 0 6px;letter-spacing:-.01em}
h2.sec em{font-style:normal;color:var(--red)}
p.seclead{color:var(--grey);max-width:780px;margin:0 0 18px;font-size:13.5px}
.grid{display:grid;gap:18px}
.g2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
.g3{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.g4{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.card{background:var(--white);border:1px solid var(--line);border-radius:14px;padding:20px}
.card.sky{background:var(--sky);border-color:transparent}
.card h3{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:12px}
.chart{position:relative;height:230px}
.chart.tall{height:280px}
.legend-note{font-size:12px;color:var(--grey);margin-top:10px}
table{width:100%;border-collapse:collapse;font-size:13px}
th{background:var(--navy);color:#fff;text-align:left;padding:9px 12px;font-weight:600;font-size:12px}
th:first-child{border-radius:8px 0 0 0}th:last-child{border-radius:0 8px 0 0}
td{padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:top}
tr:last-child td{border-bottom:none}
tbody tr:hover{background:var(--sky2)}
.badge{display:inline-block;padding:2px 10px;border-radius:14px;font-size:11px;font-weight:700;white-space:nowrap}
.b-red{background:var(--redbg);color:var(--red)}
.b-warn{background:var(--warnbg);color:var(--warn)}
.b-good{background:var(--goodbg);color:var(--good)}
.b-navy{background:var(--sky);color:var(--navy)}
.b-green{background:#d5f7ec;color:var(--greend)}
.b-grey{background:#eef2f7;color:var(--grey)}
.hbar2{height:8px;border-radius:4px;background:#fff;border:1px solid var(--line);overflow:hidden;margin-top:6px}
.hbar2 i{display:block;height:100%}
.mrow{margin-bottom:14px}
.mrow .mt{display:flex;justify-content:space-between;font-size:13px;gap:10px}
.mrow .mt b{color:var(--navy)}
.road{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:18px;margin-top:24px}
.stage{background:var(--white);border:1px solid var(--line);border-radius:14px;padding:22px;position:relative}
.stage .num{position:absolute;top:-16px;left:22px;background:var(--red);color:#fff;font-weight:800;font-size:14px;width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center}
.stage.s2 .num{background:var(--navy)}.stage.s3 .num{background:var(--grey)}
.stage h4{font-size:15px;font-weight:800;color:var(--navy);margin:6px 0 4px}
.stage .per{font-size:12px;color:var(--red);font-weight:700;text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px}
.stage ul{list-style:none}
.stage li{font-size:13px;padding:6px 0 6px 22px;position:relative;border-bottom:1px dashed var(--line)}
.stage li:last-child{border-bottom:none}
.stage li::before{content:'\2713';position:absolute;left:0;color:var(--red);font-weight:800}
.stage.s2 li::before{color:var(--navy)}.stage.s3 li::before{color:var(--grey)}
.chip{display:inline-block;background:var(--sky);color:var(--navy);font-size:12px;font-weight:600;padding:5px 12px;border-radius:16px;margin:3px 4px 3px 0}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:var(--sky);padding:1px 6px;border-radius:5px;color:var(--navy)}
.it{display:flex;gap:10px;margin-bottom:11px;font-size:13.5px;line-height:1.5}
.it:last-child{margin-bottom:0}
.it .dot{flex:0 0 9px;height:9px;border-radius:50%;margin-top:5px}
.task{display:flex;gap:12px;padding:10px 0;border-bottom:1px dashed var(--line);font-size:13.5px;line-height:1.5;align-items:flex-start}
.task:last-child{border-bottom:none}
.task .n{flex:0 0 28px;height:28px;border-radius:50%;background:var(--sky);color:var(--navy);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px}
.x-scroll{overflow-x:auto}
.rev-card{border:1px solid var(--line);border-radius:12px;padding:16px;background:#fff}
.rev-head{font-weight:700;color:var(--navy);margin-bottom:6px;display:flex;justify-content:space-between;gap:10px}
.rev-text{font-size:13px;color:var(--grey);margin-bottom:10px}
.rev-action{font-size:12.5px}
.psep{display:flex;align-items:center;gap:12px;margin:8px 0}
.psep-n{flex:0 0 30px;height:30px;border-radius:50%;background:var(--navy);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px}
.disclaimer{background:var(--sky);border-radius:14px;padding:16px 20px;font-size:12.5px;color:var(--grey);margin:34px 0 0}
.toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:16px}
.search{flex:1;min-width:220px;display:flex;align-items:center;gap:8px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:9px 14px}
.search input{border:none;outline:none;flex:1;font-family:inherit;font-size:14px;background:transparent}
.fbtn{font-size:12.5px;font-weight:700;padding:8px 14px;border-radius:8px;border:1px solid var(--line);background:#fff;color:var(--navy);cursor:pointer;font-family:inherit}
.fbtn.on,.fbtn:hover{background:var(--navy);color:#fff;border-color:var(--navy)}
.subtabs{display:flex;gap:8px;border-bottom:2px solid var(--line);margin-bottom:20px;flex-wrap:wrap}
.subtab{padding:10px 18px;font-weight:700;font-size:13.5px;color:var(--grey);cursor:pointer;border-bottom:3px solid transparent;margin-bottom:-2px}
.subtab.on{color:var(--navy);border-bottom-color:var(--red)}
.subpanel{display:none}.subpanel.on{display:block}
.kanban{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;align-items:start}
.kcol{background:#eef4fb;border-radius:12px;padding:12px;min-height:120px}
.kcol h4{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--grey);margin-bottom:10px;display:flex;justify-content:space-between}
.ktask{background:#fff;border:1px solid var(--line);border-radius:9px;padding:11px 12px;margin-bottom:9px;cursor:pointer;font-size:13px}
.ktask:hover{border-color:var(--navy);box-shadow:0 2px 8px rgba(10,49,97,.08)}
.ktask .kt-t{font-weight:600;margin-bottom:6px;line-height:1.35}
.ktask .kt-m{font-size:11px;color:var(--grey);display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.integ{border:1px solid var(--line);border-radius:14px;padding:18px;background:#fff;display:flex;flex-direction:column;gap:10px}
.integ .ih{display:flex;align-items:center;gap:12px}
.integ .ico{width:42px;height:42px;border-radius:10px;background:var(--sky);display:flex;align-items:center;justify-content:center;font-size:20px;flex:0 0 42px}
.integ .nm{font-weight:700;color:var(--navy)}
.integ .ds{font-size:12px;color:var(--grey)}
.integ input{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:13px}
.uploadzone{border:2px dashed var(--line);border-radius:14px;padding:32px;text-align:center;color:var(--grey);background:#fff;cursor:pointer}
.uploadzone:hover{border-color:var(--navy);background:var(--sky2)}
.cron-row{display:flex;align-items:center;gap:14px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;margin-bottom:10px;background:#fff;flex-wrap:wrap}
.cron-row .clock{font-weight:800;color:var(--navy);font-variant-numeric:tabular-nums}
.mono{font-family:Consolas,Menlo,monospace}
.pager{display:flex;gap:6px;align-items:center;margin-top:14px;flex-wrap:wrap}
.pager button{border:1px solid var(--line);background:#fff;border-radius:7px;padding:6px 11px;cursor:pointer;font-family:inherit;font-size:13px}
.pager button.on{background:var(--navy);color:#fff;border-color:var(--navy)}
.menu-toggle{display:none;align-items:center;justify-content:center;width:38px;height:38px;border:1px solid var(--line);border-radius:9px;background:#fff;cursor:pointer;font-size:18px}
@media(max-width:900px){.sidebar{position:fixed;left:-260px;z-index:100;transition:.2s}.sidebar.open{left:0}.kanban{grid-template-columns:1fr 1fr}.menu-toggle{display:inline-flex}}

/* ============ auth / login ============ */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0a3161,#082750);padding:20px}
.login-card{background:#fff;border-radius:18px;padding:38px 34px;width:100%;max-width:400px;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.login-card .lb{font-weight:800;font-size:26px;color:var(--navy);letter-spacing:-.02em;display:flex;align-items:center;gap:9px;justify-content:center;margin-bottom:4px}
.login-card .lb .dot{width:12px;height:12px;border-radius:50%;background:var(--red)}
.login-card .ls{text-align:center;color:var(--grey);font-size:12px;text-transform:uppercase;letter-spacing:.12em;margin-bottom:26px}
.field{margin-bottom:16px}
.field label{display:block;font-size:12.5px;font-weight:700;color:var(--navy);margin-bottom:6px}
.field input{width:100%;padding:11px 13px;border:1px solid var(--line);border-radius:9px;font-family:inherit;font-size:14px}
.field input:focus{outline:none;border-color:var(--navy)}
.err{background:var(--redbg);color:var(--red);border-radius:9px;padding:10px 13px;font-size:13px;font-weight:600;margin-bottom:16px}
.btn.w-full{width:100%;text-align:center;margin-top:6px}
.login-hint{margin-top:18px;font-size:11.5px;color:var(--grey);text-align:center;line-height:1.5}
/* ============ role badge / topbar user ============ */
.side-user{margin-top:auto;padding:14px 22px;border-top:1px solid rgba(255,255,255,.12);display:flex;align-items:center;gap:10px}
.side-user .av{width:34px;height:34px;border-radius:50%;background:var(--red);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;flex:0 0 34px}
.side-user .nm{font-size:13px;font-weight:700;color:#fff;line-height:1.2}
.side-user .rl{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:#8fb2df}
.side-user a.logout{margin-left:auto;color:#8fb2df;text-decoration:none;font-size:12px}
.side-user a.logout:hover{color:#fff}
.sidebar{display:flex;flex-direction:column}
.topbar .ta{display:flex;gap:10px;align-items:center}
.flash{padding:11px 15px;border-radius:10px;font-size:13px;font-weight:600;margin-bottom:16px}
.flash.ok{background:var(--goodbg);color:var(--good)}
.flash.err{background:var(--redbg);color:var(--red)}
/* forms in admin */
.form-grid{display:grid;gap:14px;max-width:560px}
.form-grid label{display:block;font-size:12.5px;font-weight:700;color:var(--navy);margin-bottom:5px}
.form-grid input,.form-grid select,.form-grid textarea{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:13.5px}
.inline-form{display:inline}
.row-actions{display:flex;gap:6px}
a.tlink{color:var(--navy);text-decoration:none;font-weight:600}
a.tlink:hover{text-decoration:underline}

/* ── Зона DSH: дашборд (графики, пустые состояния) ─────────────────────── */
.dsh-charts{margin:8px 0 4px}
.dsh-chart-card{display:flex;flex-direction:column}
.dsh-chart-card canvas{max-height:240px;margin-top:6px}
.dsh-sub{font-size:12px;color:var(--grey);margin:2px 0 8px}
.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:26px 16px;min-height:180px;border:1px dashed var(--line,#d9dee7);
  border-radius:12px;background:var(--soft,#f7f9fc);color:var(--grey)}
.empty-state .empty-ico{font-size:30px;line-height:1;margin-bottom:8px;opacity:.8}
.empty-state .empty-title{font-weight:600;color:var(--ink,#1f2937);margin-bottom:4px}
.empty-state .empty-hint{font-size:12.5px;max-width:340px}
.empty-state .btn{margin-top:12px}

/* ── SEM: модальные формы семантики ───────────────────────────── */
.sem-modal{position:fixed;inset:0;background:rgba(10,49,97,.38);display:none;align-items:flex-start;justify-content:center;z-index:60;padding:60px 16px;overflow:auto}
.sem-modal.on{display:flex}
.sem-modal .box{background:#fff;border-radius:14px;border:1px solid var(--line);box-shadow:0 18px 50px rgba(8,39,80,.28);width:100%;max-width:520px;padding:22px 24px}
.sem-modal h3{font-size:16px;font-weight:800;color:var(--navy);margin-bottom:14px}
.sem-modal label{display:block;font-size:12.5px;font-weight:600;color:var(--grey);margin:10px 0 4px}
.sem-modal input,.sem-modal select,.sem-modal textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:13.5px;box-sizing:border-box}
.sem-modal .frow{display:flex;gap:10px}.sem-modal .frow>div{flex:1}
.sem-modal .acts{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}

/* ── SEM: панель массовых действий (SEM-007, стиль — SEM-014) ─────── */
.sem-bulk{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);display:none;z-index:55}
.sem-bulk.on{display:block}
.sem-bulk form{display:flex;gap:8px;align-items:center;flex-wrap:wrap;background:#fff;border:1px solid var(--line);border-radius:14px;padding:11px 16px;box-shadow:0 18px 50px rgba(8,39,80,.28)}
.sem-bulk .btn.sm{margin-top:0}
.sem-bulk .cnt{font-size:13px;color:var(--navy);font-weight:700;margin-right:4px}
.sem-bulk select{padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:12.5px}

/* ===== Зона ZAD: доска задач ===== */
/* ZAD-001: цветовые полосы колонок */
.kcol{position:relative;overflow:hidden}
.kcol::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--grey)}
.kcol[data-col="backlog"]::before{background:#94a3b8}
.kcol[data-col="progress"]::before{background:var(--navy)}
.kcol[data-col="review"]::before{background:var(--warn)}
.kcol[data-col="done"]::before{background:var(--green)}
.kcol h4 .wip{font-weight:700}
.kcol h4 .wip.over{color:var(--red)}                       /* ZAD-010 */
/* ZAD-002/023: аватар исполнителя */
.kt-av{width:22px;height:22px;border-radius:50%;color:#fff;font-size:10px;font-weight:700;
  display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}
.kt-av.sm{width:20px;height:20px}
.kt-avs{display:inline-flex}.kt-avs .kt-av{margin-left:-6px;border:2px solid #fff}
.kt-avs .kt-more{font-size:10px;color:var(--grey);margin-left:2px;align-self:center}
/* ZAD-003/126: просроченный дедлайн */
.ktask.overdue{border-color:var(--red);box-shadow:0 0 0 1px var(--red) inset}
.b-over{background:var(--redbg);color:var(--red)}
.b-soon{background:var(--warnbg);color:var(--warn)}         /* ZAD-004 */
/* ZAD-005: прогресс чек-листа */
.kt-prog{height:4px;background:#e2e8f0;border-radius:3px;margin:6px 0;overflow:hidden}
.kt-prog>i{display:block;height:100%;background:var(--green)}
.kt-prog-t{font-size:10px;color:var(--grey)}
/* ZAD-006: комментарии */
.kt-cmt{display:inline-flex;align-items:center;gap:3px;color:var(--grey);font-size:11px}
/* ZAD-013/026: бейджи повтора и блокировки */
.kt-flag{font-size:12px;line-height:1}
.b-lock{background:#eef2f7;color:var(--grey)}
/* ZAD-021: цветной чип тега — цвет задаётся из JS через --tagc */
.chip.tagc{background:var(--tagbg,var(--sky));color:var(--tagfg,var(--navy))}
/* ZAD-016: пустое состояние колонки */
.kcol .kcol-empty{color:#94a3b8;font-size:12px;text-align:center;padding:18px 0}
/* ZAD-017/018: drag */
.ktask.dragging{opacity:.6;transform:rotate(2deg)}
.kcol.drop-hint{outline:2px dashed var(--navy);outline-offset:-4px}
/* ZAD-024: строка метрик */
.zad-metrics{display:flex;gap:12px;flex-wrap:wrap;margin:0 0 14px}
.zad-metrics .m{flex:1;min-width:130px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:10px 14px}
.zad-metrics .m b{font-size:22px;color:var(--navy);display:block}
.zad-metrics .m span{font-size:11px;color:var(--grey);text-transform:uppercase;letter-spacing:.04em}
.zad-metrics .m.warn b{color:var(--red)}
/* Панель фильтров ZAD-008/009 */
.zad-filters{display:flex;gap:10px;flex-wrap:wrap;align-items:end;background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px;margin-bottom:14px}
.zad-filters label{font-size:11px;font-weight:700;color:var(--navy);display:block;margin-bottom:3px}
.zad-filters select,.zad-filters input{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:13px}
.zad-search{position:relative}.zad-search input{padding-left:30px;width:220px}
.zad-search::before{content:"⌕";position:absolute;left:10px;top:26px;color:var(--grey)}
.zad-found{font-size:12px;color:var(--grey);align-self:center}
/* ZAD-027: skeleton */
.kt-skel{height:56px;border-radius:9px;margin-bottom:9px;background:linear-gradient(90deg,#eef4fb,#e2ecf7,#eef4fb);background-size:200% 100%;animation:sk 1.2s infinite}
@keyframes sk{0%{background-position:200% 0}100%{background-position:-200% 0}}
/* Легенда приоритетов ZAD-130 */
.zad-legend{font-size:12px;color:var(--grey);margin:-6px 0 12px;display:flex;gap:14px;flex-wrap:wrap}
.zad-legend i{width:10px;height:10px;border-radius:3px;display:inline-block;margin-right:4px;vertical-align:middle}
/* Модалка ZAD-007 */
.zad-modal-bg{position:fixed;inset:0;background:rgba(10,25,50,.45);display:none;z-index:200;align-items:flex-start;justify-content:center;padding:40px 16px;overflow:auto}
.zad-modal-bg.open{display:flex}
.zad-modal{background:#fff;border-radius:14px;max-width:640px;width:100%;padding:22px 24px;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.zad-modal h3{font-size:18px;color:var(--navy);margin:0 0 4px;padding-right:30px}
.zad-modal .close{position:absolute;top:14px;right:16px;font-size:22px;color:var(--grey);cursor:pointer;background:none;border:none}
.zad-modal .row{display:flex;gap:12px;flex-wrap:wrap;margin:12px 0}
.zad-modal .fld{flex:1;min-width:180px}
.zad-modal .fld label{font-size:11px;font-weight:700;color:var(--navy);display:block;margin-bottom:3px}
.zad-modal .fld input,.zad-modal .fld select,.zad-modal .fld textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-family:inherit;font-size:13px}
.zad-modal textarea{min-height:70px;resize:vertical}
.zad-cl-item{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:13px}
.zad-cl-item.done span{text-decoration:line-through;color:var(--grey)}
.zad-cl-item .del,.zad-cmt .del{margin-left:auto;color:var(--red);cursor:pointer;background:none;border:none;font-size:13px}
.zad-cmt{border-top:1px solid var(--line);padding:8px 0;font-size:13px}
.zad-cmt .meta{font-size:11px;color:var(--grey)}
.zad-tabs{display:flex;gap:6px;margin:14px 0 6px;border-bottom:1px solid var(--line)}
.zad-tabs button{background:none;border:none;padding:7px 12px;font-family:inherit;font-size:13px;font-weight:600;color:var(--grey);cursor:pointer;border-bottom:2px solid transparent}
.zad-tabs button.on{color:var(--navy);border-bottom-color:var(--navy)}
.zad-char{font-size:11px;color:var(--grey);text-align:right}
.zad-char.warn{color:var(--red)}
.zad-ctx{position:fixed;z-index:210;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.18);padding:4px;display:none;min-width:150px}
.zad-ctx button{display:block;width:100%;text-align:left;background:none;border:none;padding:7px 12px;font-family:inherit;font-size:13px;color:var(--ink);cursor:pointer;border-radius:6px}
.zad-ctx button:hover{background:var(--sky)}
/* ZAD-028: печать */
@media print{.zad-filters,.zad-metrics,.phead-actions,.sidebar,.topbar,form,.fbtn{display:none!important}.kanban{grid-template-columns:1fr;gap:6px}.ktask{break-inside:avoid}}
/* ZAD-025: адаптив */
@media(max-width:768px){.kanban{grid-template-columns:1fr}.zad-search input{width:100%}}
.dsh-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.dsh-period{font-size:12px;padding:3px 6px;border:1px solid var(--line,#d9dee7);border-radius:7px;background:#fff;color:var(--ink,#1f2937)}
.dsh-analytics-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.dsh-global-period{font-size:13px;color:var(--grey)}
.dsh-global-period select{margin-left:6px;font-size:13px;padding:3px 6px;border:1px solid var(--line,#d9dee7);border-radius:7px;background:#fff}
.dsh-compare-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.g4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.dsh-cmp-card{padding:14px 16px}
.dsh-cmp-card .cmp-label{font-size:12.5px;color:var(--grey);margin-bottom:6px}
.dsh-cmp-card .cmp-val{font-size:26px;font-weight:700;line-height:1;color:var(--ink,#1f2937)}
.dsh-cmp-card .cmp-delta{margin-top:8px;font-size:12.5px;display:flex;align-items:center;gap:8px}
.dsh-cmp-card .cmp-delta .up{color:#16a34a;font-weight:600}
.dsh-cmp-card .cmp-delta .down{color:#dc2626;font-weight:600}
.dsh-cmp-card .cmp-delta .flat{color:var(--grey)}
.dsh-cmp-card .cmp-prev{color:var(--grey)}
.dsh-cmode{font-size:12.5px;padding:4px 10px;border:1px solid var(--line,#d9dee7);border-radius:8px;background:#fff;cursor:pointer}
.dsh-cmode.active{background:var(--brand,#2563eb);color:#fff;border-color:transparent}
.dsh-cmp-card.improved{border-left:4px solid #16a34a;background:linear-gradient(90deg,#16a34a10,transparent 40%)}
.dsh-cmp-card.worsened{border-left:4px solid #dc2626;background:linear-gradient(90deg,#dc262610,transparent 40%)}
.dsh-cmp-card.neutral{border-left:4px solid var(--line,#d9dee7)}

/* ── SEM: инлайн-селект интента (SEM-019) ───────────────────────── */
.sem-intent-sel{padding:2px 4px;border:1px solid var(--line);border-radius:6px;font-family:inherit;font-size:11.5px;color:var(--navy);background:#fff;max-width:130px}
.dsh-hero-widgets{display:flex;gap:16px;align-items:stretch;flex-wrap:wrap}
.dsh-health{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-width:150px}
.dsh-health-ring{position:relative;width:120px;height:120px}
.dsh-health-num{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
.dsh-health-num .v{font-size:30px;font-weight:800;line-height:1}
.dsh-health-num small{font-size:11px;color:var(--grey)}
.dsh-health .l{font-size:12px;color:var(--grey);text-align:center}

/* ── SEM: сводка распределения интентов (SEM-021) ───────────────── */
.sem-idist{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.sem-idist .chip{font-size:12px;padding:4px 10px;border-radius:20px;background:var(--sky);color:var(--navy);font-weight:600}
.sem-idist .chip em{font-style:normal;color:var(--grey);font-weight:500}
.sem-idist .chip.c-good{background:var(--goodbg);color:var(--good)}
.sem-idist .chip.c-warn{background:var(--warnbg);color:var(--warn)}
.sem-idist .chip.c-red{background:var(--redbg);color:var(--red)}
.dsh-health-parts{margin-top:8px;width:100%;max-width:220px;display:flex;flex-direction:column;gap:5px}
.dsh-health-parts .hp-row{display:grid;grid-template-columns:64px 1fr 40px;align-items:center;gap:6px;font-size:11px}
.dsh-health-parts .hp-name{color:var(--c,#2563eb);font-weight:600}
.dsh-health-parts .hp-bar{height:6px;background:#e5e9f0;border-radius:4px;overflow:hidden}
.dsh-health-parts .hp-bar>span{display:block;height:100%;background:var(--c,#2563eb)}
.dsh-health-parts .hp-val{text-align:right;color:var(--grey)}
/* DSH-020/067: простой тултип по data-tooltip (hover/focus). */
[data-tooltip]{position:relative}
[data-tooltip]:hover::after,[data-tooltip]:focus::after{content:attr(data-tooltip);
  position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);
  background:#1f2937;color:#fff;padding:8px 10px;border-radius:8px;font-size:11.5px;
  line-height:1.4;width:max-content;max-width:260px;white-space:normal;z-index:50;
  box-shadow:0 6px 20px rgba(0,0,0,.18)}
[data-tooltip]:hover::before,[data-tooltip]:focus::before{content:"";position:absolute;
  left:50%;bottom:calc(100% + 2px);transform:translateX(-50%);border:6px solid transparent;
  border-top-color:#1f2937;z-index:50}

/* ── SEM: подвкладка кластеров (SEM-023) ────────────────────────── */
.sem-cluster{border-bottom:1px solid var(--line)}
.sem-cluster summary{cursor:pointer;padding:10px 12px;list-style:none;display:flex;align-items:center;gap:10px}
.sem-cluster summary::-webkit-details-marker{display:none}
.sem-cluster summary:before{content:"▸";color:var(--navy);font-size:12px}
.sem-cluster[open] summary:before{content:"▾"}
.sem-cluster .cl-page{font-family:monospace;font-size:12px;color:var(--navy)}
.sem-cluster .cl-name{color:var(--ink)}
.sem-cluster .cl-meta{margin-left:auto;font-size:12px;color:var(--grey);font-weight:600}
.sem-cluster .cl-body{padding:0 12px 10px 30px}
.sem-cluster .cl-body table{width:100%}
.sem-cluster .cl-body td{padding:4px 8px;border-top:1px solid var(--sky)}

/* ── SEM: карта кластеров treemap (SEM-025) ─────────────────────── */
.sem-treemap{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 16px}
.sem-treemap .tile{flex:1 1 90px;background:linear-gradient(135deg,var(--navy),#0d3a73);color:#fff;border-radius:8px;padding:10px 12px;min-height:60px;display:flex;flex-direction:column;justify-content:space-between;overflow:hidden}
.sem-treemap .tile:nth-child(3n+2){background:linear-gradient(135deg,#0d5f8a,#1177a8)}
.sem-treemap .tile:nth-child(3n+3){background:linear-gradient(135deg,#1e8e5a,#00996a)}
.sem-treemap .tl-name{font-weight:700;font-size:12.5px;line-height:1.2;word-break:break-word}
.sem-treemap .tl-freq{font-size:11px;opacity:.85;margin-top:6px}
.dsh-lights .dsh-light{display:flex;align-items:center;gap:10px;padding:14px 16px}
.light-dot{width:16px;height:16px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 0 3px #fff, 0 0 0 4px #e5e9f0}
.light-green{background:#16a34a}.light-yellow{background:#f59e0b}.light-red{background:#dc2626}
.dsh-light .light-name{font-weight:600;color:var(--ink,#1f2937)}
.dsh-light-green{border-left:4px solid #16a34a}
.dsh-light-yellow{border-left:4px solid #f59e0b}
.dsh-light-red{border-left:4px solid #dc2626}
.dsh-light .light-body{display:flex;flex-direction:column;gap:2px}
.dsh-light .light-reason{font-size:11.5px;color:var(--grey);line-height:1.3}
.dsh-lights .dsh-light{align-items:flex-start}
a.dsh-light{text-decoration:none;cursor:pointer;transition:transform .12s,box-shadow .12s}
a.dsh-light:hover{transform:translateY(-2px);box-shadow:0 8px 22px rgba(0,0,0,.08)}

/* ── SEM: прогресс-бары покрытия (SEM-030/031) ──────────────────── */
.sem-prog{height:8px;border-radius:6px;background:var(--sky);overflow:hidden;min-width:80px}
.sem-prog>i{display:block;height:100%;border-radius:6px}
.sem-prog.ok>i{background:var(--good)}
.sem-prog.weak>i{background:var(--warn)}
.sem-prog.notdone>i{background:var(--red)}
.sem-prog-big{height:14px;border-radius:8px;background:var(--sky);overflow:hidden;max-width:520px;margin:6px 0 4px}
.sem-prog-big>i{display:block;height:100%;background:linear-gradient(90deg,var(--good),var(--green));border-radius:8px;text-align:right;color:#fff;font-size:10px;font-weight:700;line-height:14px;padding-right:6px;box-sizing:border-box}
.dsh-attention .dsh-att{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border-left:4px solid var(--line,#d9dee7)}
.dsh-att .att-ico{font-size:22px;line-height:1}
.dsh-att .att-title{font-weight:600;color:var(--ink,#1f2937)}
.dsh-att .att-reason{font-size:12.5px;color:var(--grey);margin-top:2px}
.dsh-att-task{border-left-color:#7c3aed}
.dsh-att-position{border-left-color:#2563eb}
.dsh-att-orm{border-left-color:#dc2626}
.dsh-att-budget{border-left-color:#f59e0b}
a.dsh-att{text-decoration:none;transition:transform .12s,box-shadow .12s}
a.dsh-att:hover{transform:translateY(-2px);box-shadow:0 8px 22px rgba(0,0,0,.08)}

/* ── SEM: мини stacked-bar интентов в покрытии (SEM-036) ─────────── */
.sem-istack{display:flex;height:9px;border-radius:5px;overflow:hidden;min-width:70px;background:var(--sky)}
.sem-istack>i{display:block;height:100%}
.sem-istack .c-navy{background:var(--navy)}
.sem-istack .c-good{background:var(--good)}
.sem-istack .c-warn{background:var(--warn)}
.sem-istack .c-red{background:var(--red)}
.dsh-crumb-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:#eff4ff;border:1px solid #c7d7fe;color:#1e3a8a;padding:8px 14px;border-radius:10px;
  margin-bottom:14px;font-size:13px}
.app.present-mode .content{padding:24px 32px}
.dsh-exit-present{position:fixed;top:14px;right:18px;z-index:60;background:#1f2937;color:#fff;
  padding:8px 14px;border-radius:8px;text-decoration:none;font-size:13px;box-shadow:0 6px 18px rgba(0,0,0,.2)}
.dsh-exit-present:hover{background:#111827}
/* DSH-042: крупные шрифты и отступы для показа заказчику (≥1.5×). */
.app.present-mode .bigstats .n{font-size:42px}
.app.present-mode .bigstats .t{font-size:15px}
.app.present-mode .dsh-cmp-card .cmp-val{font-size:40px}
.app.present-mode .dsh-health-num .v{font-size:46px}
.app.present-mode .hero h1{font-size:34px}
.app.present-mode .sec{font-size:22px}
.app.present-mode .dsh-chart-card canvas{max-height:340px}
.app.present-mode > .sidebar, .app.present-mode .topbar{display:none}
.dsh-hide-notes{display:none;font-size:12.5px;color:var(--grey);align-items:center;gap:6px;justify-content:flex-end;margin:-6px 0 12px}
.app.present-mode .dsh-hide-notes{display:flex}
.app.hide-notes .dsh-sensitive{visibility:hidden;position:relative}
.app.hide-notes .dsh-sensitive::after{content:"••• скрыто";visibility:visible;position:absolute;left:0;top:0;color:var(--grey);font-style:italic}
.dsh-settings-wrap{position:relative;display:flex;justify-content:flex-end;margin:-6px 0 12px}
.dsh-settings{position:absolute;right:0;top:calc(100% + 6px);z-index:45;background:#fff;border:1px solid var(--line,#d9dee7);border-radius:10px;padding:12px 14px;min-width:220px;box-shadow:0 8px 24px rgba(0,0,0,.12)}
.dsh-settings-title{font-weight:600;font-size:12.5px;margin-bottom:8px;color:var(--ink,#1f2937)}
.dsh-wtoggle{display:flex;align-items:center;gap:8px;font-size:13px;padding:4px 0;color:var(--ink,#1f2937)}
.dsh-settings .dsh-reset{margin-top:10px;width:100%}

/* ── SEM: инлайн-подсказка «?» (SEM-047) ────────────────────────── */
.sem-help{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;border-radius:50%;background:var(--sky);color:var(--navy);font-size:10px;font-weight:700;cursor:help;margin-left:3px}
.dsh-wsection{position:relative}
.dsh-wsection.dragging{opacity:.5}
.dsh-drag-handle{position:absolute;left:-2px;top:6px;cursor:grab;color:var(--grey);font-size:16px;user-select:none;opacity:0;transition:opacity .12s}
.dsh-wsection:hover .dsh-drag-handle{opacity:.7}
.dsh-png{align-self:flex-end;margin-top:8px;font-size:11px;padding:3px 8px}
.dsh-att-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.dsh-modal{position:fixed;inset:0;background:rgba(15,23,42,.45);display:flex;align-items:center;justify-content:center;z-index:70}
.dsh-modal[hidden]{display:none}
.dsh-modal-box{background:#fff;border-radius:14px;padding:22px 24px;min-width:280px;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.dsh-modal-title{font-weight:700;margin-bottom:12px}
.dsh-modal-box select{width:100%;padding:8px;border:1px solid var(--line,#d9dee7);border-radius:8px;margin-bottom:16px}
.dsh-modal-actions{display:flex;justify-content:flex-end;gap:8px}
/* DSH-067: открытие тултипа по касанию (класс tt-open). */
[data-tooltip].tt-open::after{content:attr(data-tooltip);position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:#1f2937;color:#fff;padding:8px 10px;border-radius:8px;font-size:11.5px;line-height:1.4;width:max-content;max-width:260px;white-space:normal;z-index:50;box-shadow:0 6px 20px rgba(0,0,0,.18)}
.dsh-health-now{font-size:15px;margin-bottom:6px;color:var(--ink,#1f2937)}
/* DSH-073: единый стиль карточек-заглушек пустых состояний дашборда. */
.dsh-chart-card .empty-state{min-height:200px;width:100%}
.dsh-attention .empty-state{grid-column:1/-1}
/* DSH-074: адаптивная сетка графиков 2×2 → 1 колонка на узких экранах. */
@media (max-width:768px){
  .dsh-charts{grid-template-columns:1fr}
  .dsh-charts .dsh-chart-card canvas{max-height:260px}
}
/* DSH-075: адаптивность hero-блока (скоринг и SEO-зрелость друг под другом). */
@media (max-width:768px){
  .hero-flex{flex-direction:column}
  .dsh-hero-widgets{flex-direction:column;width:100%}
  .dsh-hero-widgets .scorebox,.dsh-hero-widgets .dsh-health{width:100%}
}
/* DSH-077: единый цветовой код направлений (переменные). */
:root{--dir-positions:#2563eb;--dir-tasks:#7c3aed;--dir-budget:#f59e0b;--dir-orm-pos:#16a34a;--dir-orm-neg:#dc2626}
.dir-positions{color:var(--dir-positions)}.dir-tasks{color:var(--dir-tasks)}
.dir-budget{color:var(--dir-budget)}.dir-orm{color:var(--dir-orm-neg)}
/* DSH-076: skeleton-загрузка графика во время fetch. */
.dsh-chart-card.dsh-loading canvas{visibility:hidden}
.dsh-chart-card.dsh-loading::after{content:"";position:absolute;left:16px;right:16px;bottom:16px;height:200px;border-radius:10px;background:linear-gradient(90deg,#eef1f6 25%,#e2e7ef 37%,#eef1f6 63%);background-size:400% 100%;animation:dshShimmer 1.3s ease infinite}
.dsh-chart-card{position:relative}
@keyframes dshShimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}
.dir-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:6px;vertical-align:middle}
.dsh-engine{font-size:12px;padding:3px 6px;border:1px solid var(--line,#d9dee7);border-radius:7px;background:#fff;margin-left:6px}

/* ── SEM: подсветка строк без частоты (SEM-068) ─────────────────── */
/* Белый фон вместо сплошной жёлтой заливки (текст сливался):
   статус показываем тонкой янтарной полосой слева + ⚠️ в ячейке частоты. */
tr.sem-no-freq>td:first-child{box-shadow:inset 3px 0 0 var(--warn)}

/* ── SEM: панель фильтров и чипы (SEM-078/080) ──────────────────── */
.sem-filters{position:relative}
.sem-filters>summary{cursor:pointer;list-style:none}
.sem-filters>summary::-webkit-details-marker{display:none}
.sem-filters-body{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:8px;padding:10px;background:var(--sky2);border:1px solid var(--line);border-radius:10px;width:100%}
.sem-filters-body select{padding:6px 8px}
.sem-chips{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 12px}
.sem-chips .chip{font-size:12px;padding:3px 10px;border-radius:20px;background:var(--sky);color:var(--navy);font-weight:600}
.sem-chips .chip a{cursor:pointer;color:var(--red);font-weight:800;margin-left:4px}
/* DSH-096: KPI-карточки со спарклайнами. */
.dsh-kpi{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));margin:10px 0}
.kpi-card{padding:14px 16px}
.kpi-card .kpi-top{display:flex;align-items:center;justify-content:space-between}
.kpi-card .kpi-ico{font-size:20px}
.kpi-card .kpi-n{font-size:28px;font-weight:800;line-height:1;color:var(--ink,#1f2937)}
.kpi-card .kpi-n.bad{color:#dc2626}
.kpi-card .kpi-t{font-size:12.5px;color:var(--grey);margin-top:4px}
.kpi-card .dsh-spark{width:100%;max-height:34px;margin-top:8px}
.dsh-progress{height:8px;background:#e5e9f0;border-radius:5px;overflow:hidden;margin-top:10px}
.dsh-progress>span{display:block;height:100%;background:#2563eb;border-radius:5px}
.dsh-progress-label{font-size:11.5px;color:var(--grey);margin-top:4px}
/* DSH-104: закреплённая панель ключевых действий. */
.dsh-sticky-bar{position:sticky;top:0;z-index:35;display:flex;align-items:center;justify-content:space-between;gap:12px;background:rgba(255,255,255,.92);backdrop-filter:blur(6px);border-bottom:1px solid var(--line,#eef1f6);padding:8px 4px;margin:-6px -4px 10px}
.dsh-sticky-bar .dsh-sticky-title{font-weight:700;color:var(--ink,#1f2937)}
.dsh-sticky-actions{display:flex;gap:6px;flex-wrap:wrap}
.app.present-mode .dsh-sticky-bar{display:none}
.dsh-quick-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.dsh-quick-search{padding:6px 10px;border:1px solid var(--line,#d9dee7);border-radius:8px;font-size:13px;min-width:200px}
.dsh-ntf-badge{display:inline-block;margin-left:8px;background:#dc2626;color:#fff;font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;text-decoration:none;vertical-align:middle}
/* DSH-107: приветственный тур. */
.dsh-tour-ov{position:fixed;inset:0;background:rgba(15,23,42,.5);z-index:80;display:flex;align-items:flex-end;justify-content:center;padding-bottom:40px}
.dsh-tour-box{background:#fff;border-radius:14px;padding:18px 20px;max-width:420px;width:90%;box-shadow:0 20px 60px rgba(0,0,0,.35)}
.dsh-tour-box .tour-title{font-weight:700;font-size:16px;margin-bottom:6px}
.dsh-tour-box .tour-text{font-size:13.5px;color:var(--grey);margin-bottom:14px}
.dsh-tour-box .tour-nav{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--grey)}
.dsh-tour-hl{position:relative;z-index:81;outline:3px solid #2563eb;outline-offset:4px;border-radius:12px}
.dsh-updated{font-size:11px;color:var(--grey);margin-top:6px;text-align:right}
.dsh-rev-filter{margin:10px 0 16px;border:1px solid var(--line,#eef1f6);border-radius:10px;padding:8px 12px}
.dsh-rev-filter summary{cursor:pointer;font-weight:600;font-size:13.5px}
.dsh-demo-note{background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;font-size:11.5px;padding:6px 10px;border-radius:8px;margin-bottom:8px}
.dsh-help-panel{position:fixed;top:0;right:0;width:340px;max-width:90vw;height:100vh;background:#fff;box-shadow:-8px 0 30px rgba(0,0,0,.18);z-index:75;padding:18px 20px;overflow-y:auto}
.dsh-help-panel[hidden]{display:none}
.dsh-help-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.dsh-help-x{border:none;background:none;font-size:16px;cursor:pointer;color:var(--grey)}
.dsh-help-panel dt{font-weight:600;margin-top:10px;color:var(--ink,#1f2937)}
.dsh-help-panel dd{margin:2px 0 0;font-size:12.5px;color:var(--grey)}
.dsh-lastsnap{font-size:11px;color:var(--grey);margin-top:2px;text-align:right}
.dsh-movers .movers-list{list-style:none;margin:8px 0 0;padding:0}
.dsh-movers .movers-list li{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--line,#eef1f6);font-size:13px}
.dsh-movers .movers-list a{font-weight:600;color:var(--ink,#1f2937);text-decoration:none;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dsh-movers .mv-e{font-size:11px;color:var(--grey)}
.dsh-movers .mv-delta{font-size:12px;font-weight:600}
.dsh-movers .mv-delta.up{color:#16a34a}.dsh-movers .mv-delta.down{color:#dc2626}
.dsh-mini-empty{font-size:12.5px;color:var(--grey);margin-top:8px}
.dsh-qmetric{padding:14px 16px}
.dsh-qmetric .qm-label{font-size:12px;color:var(--grey)}
.dsh-qmetric .qm-value{font-size:20px;font-weight:700;margin-top:4px;color:var(--ink,#1f2937)}
.dsh-qmetric .qm-trend.up{color:#16a34a;font-size:13px}.dsh-qmetric .qm-trend.down{color:#dc2626;font-size:13px}
.dsh-qmetric .qm-sub{font-size:11.5px;color:var(--grey);margin-top:2px}

/* ── SEM: акцент строк «новый» и фон статусов покрытия (SEM-097/104) ── */
/* Вместо сплошных цветных заливок строк — белый фон (как на основном сайте)
   и тонкая цветная полоса-индикатор слева; сам статус читается по бейджам. */
tr.sem-src-new>td:first-child{box-shadow:inset 3px 0 0 var(--red)}
tr.sem-cov-notdone>td:first-child{box-shadow:inset 3px 0 0 var(--red)}
tr.sem-cov-weak>td:first-child{box-shadow:inset 3px 0 0 var(--warn)}
tr.sem-cov-ok>td:first-child{box-shadow:inset 3px 0 0 var(--good)}

/* SEM: таблицы данных на белой подложке, как контент нового сайта. */
.x-scroll>table{background:var(--surface,#fff)}

/* ── SEM: sticky-заголовок, плотность, бейдж вкладки, мобильные (SEM-102/105/107/101) ── */
.sem-table thead th{position:sticky;top:0;background:#fff;z-index:2;box-shadow:0 1px 0 var(--line)}
.sem-table.compact td,.sem-table.compact th{padding-top:3px;padding-bottom:3px;font-size:12px;line-height:1.25}
.subtab-badge{display:inline-block;min-width:18px;padding:0 6px;border-radius:20px;background:var(--red);color:#fff;font-size:11px;font-weight:700;text-align:center}
.sem-table td{word-break:break-word}
@media (max-width:640px){.sem-table{font-size:12px}.sem-table td,.sem-table th{padding:5px 6px}}

/* ── SEM: скелетон загрузки подвкладок (SEM-098) ────────────────── */
.sem-skel{height:34px;margin:6px 0;border-radius:8px;background:linear-gradient(90deg,#eef3f9 25%,#e2ebf5 37%,#eef3f9 63%);background-size:400% 100%;animation:semshimmer 1.2s ease-in-out infinite}
@keyframes semshimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}
.dsh-att-more{grid-column:1/-1;text-align:center;padding:8px;font-size:13px;color:#2563eb;text-decoration:none;font-weight:600}
.dsh-att-more:hover{text-decoration:underline}

/* ── SEM: тост, кнопка наверх, копирование (SEM-109/115/116) ─────── */
.sem-toast{position:fixed;bottom:24px;right:24px;background:var(--good);color:#fff;padding:10px 18px;border-radius:10px;font-weight:700;font-size:13px;box-shadow:0 10px 30px rgba(8,39,80,.25);opacity:0;transform:translateY(10px);transition:.25s;z-index:80;pointer-events:none}
.sem-toast.on{opacity:1;transform:translateY(0)}
.sem-backtop{position:fixed;bottom:24px;left:24px;display:none;width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:#fff;color:var(--navy);font-size:18px;cursor:pointer;z-index:70;box-shadow:0 6px 18px rgba(8,39,80,.18)}
.sem-copy{background:none;border:none;cursor:pointer;color:var(--grey);font-size:12px;padding:0 2px}
.sem-copy:hover{color:var(--navy)}
.dsh-counter{display:flex;gap:12px;align-items:flex-start;text-decoration:none;color:inherit;padding:14px 16px}
.dsh-counter .cnt-ico{font-size:24px}
.dsh-counter .cnt-val{font-weight:700;color:var(--ink,#1f2937)}
.dsh-counter .cnt-label{font-size:12px;color:var(--grey)}
.dsh-pin{position:absolute;right:-2px;top:6px;border:none;background:none;cursor:pointer;font-size:14px;opacity:0;transition:opacity .12s}
.dsh-wsection:hover .dsh-pin{opacity:.7}
.dsh-pin:hover{opacity:1}
.dsh-export-error{margin-top:12px;color:#dc2626;font-size:12.5px}
/* DSH-143: индикатор загрузки кнопки экспорта. */
.dsh-btn-loading{position:relative;padding-left:28px !important;opacity:.85;pointer-events:none}
.dsh-btn-loading::before{content:"";position:absolute;left:10px;top:50%;width:12px;height:12px;margin-top:-6px;border:2px solid rgba(255,255,255,.5);border-top-color:#fff;border-radius:50%;animation:dshSpin .7s linear infinite}
@keyframes dshSpin{to{transform:rotate(360deg)}}
.dsh-light-legend{display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--grey);margin:2px 0 10px}
.dsh-light-legend i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;box-shadow:none;vertical-align:middle}
.dsh-wtoggle-off{opacity:.6}
.dsh-role-note{font-size:10.5px;color:#dc2626;margin-left:4px}

/* BAS-025/026: классы вместо инлайн-стилей login.html. */
.login-forgot{text-align:center;margin-top:10px}
.login-forgot a{font-size:13px}

/* ==========================================================================
   BAS — Каркас портала: дизайн-токены, тёмная тема, компоненты
   ========================================================================== */

/* BAS-024/037: единые дизайн-токены (радиусы, отступы, тени, длительности). */
:root{
  --radius-sm:8px; --radius-md:14px; --radius-lg:18px;
  --space-sm:8px; --space-md:16px; --space-lg:24px;
  --shadow-sm:0 2px 8px rgba(10,49,97,.08);
  --shadow-md:0 6px 20px rgba(10,49,97,.14);
  --shadow-lg:0 20px 60px rgba(0,0,0,.3);
  --dur:.18s;
  /* семантические поверхности (переопределяются тёмной темой) */
  --bg:#f6f9fd; --surface:#fff; --surface-2:var(--sky2); --text:var(--ink);
  --muted:var(--grey); --border:var(--line); --topbar-bg:#fff;
}

/* BAS-018/021: тёмная тема через data-theme=dark на <html>. */
html[data-theme="dark"]{
  --navy:#7aa7e0; --navy2:#5f8fd0;
  --sky:#152438; --sky2:#0f1b2c; --ink:#e6edf6; --grey:#93a4bb;
  --line:#243449; --white:#111d2e; --goodbg:#123227; --warnbg:#33290f; --redbg:#3a1a1a;
  --good:#3fd39b; --warn:#e0b64a; --red:#e5615f; --red2:#d24a48; --green:#2fbf8c;
  --bg:#0b1420; --surface:#111d2e; --surface-2:#152438; --text:#e6edf6;
  --muted:#93a4bb; --border:#243449; --topbar-bg:#0f1b2c;
  --shadow-sm:0 2px 8px rgba(0,0,0,.4); --shadow-md:0 6px 20px rgba(0,0,0,.5);
}
html[data-theme="dark"] body{background:var(--bg);color:var(--text)}
html[data-theme="dark"] .card,html[data-theme="dark"] .stage{background:var(--surface);border-color:var(--border)}
html[data-theme="dark"] .topbar{background:var(--topbar-bg);border-color:var(--border)}
html[data-theme="dark"] tbody tr:hover{background:var(--surface-2)}
html[data-theme="dark"] .btn.ghost{color:var(--navy)}
html.modal-open{overflow:hidden}

/* BAS-032: единый компонент модального окна. */
.modal-overlay{position:fixed;inset:0;background:rgba(8,20,40,.55);backdrop-filter:blur(2px);
  display:none;align-items:flex-start;justify-content:center;z-index:1000;padding:10vh 16px 16px}
.modal-overlay.open{display:flex;animation:modalFade var(--dur) ease}
.modal-card{background:var(--surface);color:var(--text);border-radius:var(--radius-md);
  box-shadow:var(--shadow-lg);width:100%;max-width:560px;padding:22px;animation:modalPop var(--dur) ease}
.modal-card.modal-search{max-width:600px;padding:0;overflow:hidden}
.modal-card.modal-help{max-width:640px}
@keyframes modalFade{from{opacity:0}to{opacity:1}}
@keyframes modalPop{from{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:none}}

/* BAS-008/097: глобальный поиск. */
.gsearch-inp{display:flex;align-items:center;gap:10px;padding:16px 18px;border-bottom:1px solid var(--border)}
.gsearch-mag{font-size:18px;opacity:.7}
.gsearch-inp input{flex:1;border:none;outline:none;background:transparent;font:inherit;font-size:16px;color:var(--text)}
.gsearch-esc{font-size:11px;border:1px solid var(--border);border-radius:6px;padding:2px 6px;color:var(--muted)}
.gsearch-results{max-height:52vh;overflow-y:auto;padding:8px}
.gsearch-group{margin-bottom:6px}
.gsearch-gt{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:700;padding:8px 10px 4px}
.gsearch-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius-sm);
  text-decoration:none;color:var(--text);cursor:pointer}
.gsearch-item:hover,.gsearch-item.active{background:var(--sky)}
.gsearch-ic{width:20px;text-align:center;flex:0 0 20px}
.gsearch-title{font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.gsearch-sub{margin-left:auto;font-size:12px;color:var(--muted);white-space:nowrap}
.gsearch-hint{padding:26px 18px;text-align:center;color:var(--muted);font-size:14px}
.gsearch-trigger{display:inline-flex;align-items:center;gap:8px;background:var(--surface-2);
  border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--muted);
  padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}
.gsearch-trigger:hover{border-color:var(--navy)}
.gsearch-trigger kbd{font-size:11px;border:1px solid var(--border);border-radius:4px;padding:1px 5px}

/* BAS-053: справка хоткеев. */
.hk-help h3{margin-bottom:16px;font-size:18px}
.hk-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:18px}
.hk-ct{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:700;margin-bottom:8px}
.hk-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:5px 0}
.hk-label{font-size:13px;color:var(--muted)}
kbd{font-family:inherit;font-size:11px;background:var(--surface-2);border:1px solid var(--border);
  border-radius:5px;padding:2px 7px;font-weight:700;color:var(--text)}

/* BAS-034: тосты. */
.toast-host{position:fixed;right:20px;bottom:20px;z-index:1100;display:flex;flex-direction:column;gap:10px}
.toast{display:flex;align-items:center;gap:10px;min-width:220px;max-width:360px;padding:12px 16px;
  border-radius:var(--radius-sm);box-shadow:var(--shadow-md);background:var(--surface);color:var(--text);
  border-left:4px solid var(--navy);opacity:0;transform:translateX(20px);transition:all .28s ease;cursor:pointer}
.toast.show{opacity:1;transform:none}
.toast.hide{opacity:0;transform:translateX(20px)}
.toast.ok{border-left-color:var(--good)}
.toast.err{border-left-color:var(--red)}
.toast.info{border-left-color:var(--navy)}
.toast-ic{font-weight:800}.toast.ok .toast-ic{color:var(--good)}.toast.err .toast-ic{color:var(--red)}
.toast-tx{font-size:14px;font-weight:600}

/* BAS-083/084: полоса индикатора загрузки. */
.pageload-bar{position:fixed;top:0;left:0;height:3px;width:0;background:var(--red);z-index:1200;
  transition:width .3s ease;opacity:0}
.pageload-bar.run{opacity:1}
.pageload-bar.done{transition:width .2s ease,opacity .3s ease .1s;opacity:0}

/* BAS-014: хлебные крошки. */
.crumbs{display:flex;align-items:center;gap:6px;font-size:13px;flex-wrap:wrap}
.crumbs a{color:var(--muted);text-decoration:none;font-weight:600}
.crumbs a:hover{color:var(--navy)}
.crumbs .sep{color:var(--muted);opacity:.6}
.crumbs .cur{color:var(--text);font-weight:800}

/* BAS-010: кнопка поиска и переключатели в топбаре. */
.topbar-actions{display:flex;align-items:center;gap:8px}
.icon-btn{width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);
  cursor:pointer;font-size:16px;color:var(--text)}
.icon-btn:hover{border-color:var(--navy)}

/* BAS-038..041: сворачиваемый сайдбар. */
.sidebar{transition:width var(--dur) ease,flex-basis var(--dur) ease}
body.sidebar-collapsed .sidebar{width:64px;flex-basis:64px}
body.sidebar-collapsed .sidebar .tt,
body.sidebar-collapsed .sidebar .sb-title,
body.sidebar-collapsed .nav-item span:not(.ic):not(.fav-star),
body.sidebar-collapsed .side-user>div,
body.sidebar-collapsed .side-user .logout,
body.sidebar-collapsed .sb-version{display:none}
body.sidebar-collapsed .nav-item{justify-content:center;padding-left:0;position:relative}
body.sidebar-collapsed .nav-item .ic{margin:0}
/* BAS-040: всплывающая подпись в свёрнутом режиме. */
body.sidebar-collapsed .nav-item[data-label]:hover::after{content:attr(data-label);
  position:absolute;left:100%;top:50%;transform:translateY(-50%);margin-left:8px;
  background:var(--navy2);color:#fff;padding:5px 10px;border-radius:6px;font-size:12px;
  white-space:nowrap;z-index:60;box-shadow:var(--shadow-md)}
.sidebar-collapse-btn{display:none}
@media(min-width:901px){.sidebar-collapse-btn{display:inline-flex}}

/* BAS-042/045: избранное в сайдбаре. */
.sb-fav .nav-item{position:relative}
.fav-star{margin-left:auto;opacity:0;cursor:pointer;font-size:13px;color:#ffd15c;transition:opacity var(--dur)}
.nav-item:hover .fav-star{opacity:.6}
.fav-star:hover,.fav-star.on{opacity:1}

/* BAS-058/063: улучшения формы входа. */
.pw-field{position:relative}
.pw-toggle{position:absolute;right:10px;top:50%;transform:translateY(-50%);background:none;border:none;
  cursor:pointer;font-size:16px;opacity:.6;padding:4px}
.pw-toggle:hover{opacity:1}
.remember-row{display:flex;align-items:center;gap:8px;margin:12px 0;font-size:13px;color:var(--muted)}
.remember-row input{width:auto}
.btn.loading{position:relative;color:transparent;pointer-events:none}
.btn.loading::after{content:"";position:absolute;left:50%;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;
  border:2px solid rgba(255,255,255,.5);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* BAS-028: система кнопок. .btn.danger — деструктивные действия. */
.btn.danger{background:var(--red2)}.btn.danger:hover{background:#7d0d0d}
.btn.primary{background:var(--navy)}.btn.primary:hover{background:var(--navy2)}

/* BAS-029: размеры бейджей. */
.badge.sm{padding:1px 7px;font-size:10px}
.badge.md{padding:3px 12px;font-size:12px}

/* BAS-030: индикаторы сортировки в шапке таблицы. */
th.sortable{cursor:pointer;user-select:none}
th.sort-asc::after{content:" ▲";font-size:10px;opacity:.9}
th.sort-desc::after{content:" ▼";font-size:10px;opacity:.9}

/* BAS-075..077: брендированные страницы ошибок. */
.errpage{min-height:100vh;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,var(--navy),var(--navy2));padding:24px;text-align:center}
.errpage-card{background:var(--surface);color:var(--text);border-radius:var(--radius-lg);
  padding:44px 40px;max-width:460px;box-shadow:var(--shadow-lg)}
.errpage-code{font-size:64px;font-weight:800;color:var(--red);line-height:1;letter-spacing:-.03em}
.errpage-card h1{font-size:22px;margin:12px 0 8px}
.errpage-card p{color:var(--muted);font-size:14px;margin-bottom:22px}
.errpage-card .dot{width:12px;height:12px;border-radius:50%;background:var(--red);display:inline-block;margin-bottom:14px}

/* BAS-101: версия портала в подвале сайдбара. */
.sb-version{padding:14px 22px 4px;font-size:11px;color:#6f93c6}
.sb-version a{color:#8fb2df;text-decoration:none}
.sb-version a:hover{text-decoration:underline}

/* BAS-095/096/099: мобильная адаптация. */
@media(max-width:900px){
  .sidebar-overlay{position:fixed;inset:0;background:rgba(8,20,40,.5);z-index:99;display:none}
  .sidebar.open ~ .sidebar-overlay,body.nav-open .sidebar-overlay{display:block}
  .nav-item{min-height:44px}
}
@media(max-width:480px){
  .topbar .meta .pill{display:none}
  .topbar{padding:10px 16px}
  .content{padding:18px 16px 50px}
  .modal-overlay{padding:0}
  .modal-card.modal-search{max-width:100%;min-height:100vh;border-radius:0}
  .gsearch-results{max-height:calc(100vh - 70px)}
  .icon-btn{min-width:44px;min-height:44px}
}

/* BAS-086/087: печатная версия. */
@media print{
  .sidebar,.topbar,.pageload-bar,.toast-host,.modal-overlay,.export-btn,
  .icon-btn,.menu-toggle,.btn,.ntf-bell{display:none !important}
  .main,.content{margin:0;padding:0;max-width:100%}
  body{background:#fff;color:#000}
  table{font-size:11px}
  th{background:#eee !important;color:#000 !important}
  td{border-bottom:1px solid #999}
  tbody tr:hover{background:none !important}
  .card{box-shadow:none;border:1px solid #ccc;break-inside:avoid}
}

/* --- Зона TLS: индикаторы продления и адаптив таблицы инструментов --- */
.tls-dot{font-size:11px;vertical-align:middle}          /* TLS-032/050 */
.tls-green{color:var(--good)}
.tls-amber,.tls-amber-soft{color:var(--warn)}
.tls-red{color:var(--red)}
.tls-none{color:var(--grey)}
.tls-detail td{padding-top:0}
@media(max-width:640px){                                /* TLS-053: карточный вид */
  .tls-table thead{display:none}
  .tls-table,.tls-table tbody,.tls-table tr,.tls-table td{display:block;width:100%}
  .tls-table tr.tls-row{border:1px solid var(--line);border-radius:10px;margin-bottom:10px;padding:6px 10px}
  .tls-table td{border:none;text-align:left!important;padding:4px 0}
  .tls-table td[data-lbl]::before{content:attr(data-lbl) ": ";font-weight:700;color:var(--grey)}
  .tls-table td[data-lbl='']::before{content:''}
}

/* INF-026: тултип термина глоссария на других вкладках портала */
.gloss-term{border-bottom:1px dotted var(--navy);cursor:help;color:var(--navy)}
.gloss-term:hover,.gloss-term:focus{background:var(--sky)}
.dsh-stages-card .stages-list{list-style:none;margin:8px 0 0;padding:0}
.dsh-stages-card .stages-list li{padding:8px 0;border-bottom:1px solid var(--line,#eef1f6)}
.dsh-stages-card .st-row{display:flex;justify-content:space-between;align-items:center;gap:8px}
.dsh-stages-card .st-title{font-weight:600;color:var(--ink,#1f2937);font-size:13px}
.dsh-stages-card .st-pct{font-size:12px;color:var(--grey)}
.dsh-stages-card .st-meta{font-size:11px;color:var(--grey);margin-top:4px}

/* BAS-025/026: классы вместо инлайн-стилей base.html. */
.topbar-left{display:flex;align-items:center;gap:12px}
.side-user .av{text-decoration:none;color:inherit;overflow:hidden}
.side-user .av .av-img{width:100%;height:100%;object-fit:cover;border-radius:inherit}
.side-user .nm-link{text-decoration:none;color:inherit}

/* LNK-060: адаптивная карточная вёрстка таблицы ссылок для мобильных (<=480px).
   На узких экранах строки таблицы .lnk-links-table превращаются в карточки:
   каждая ячейка — блок с подписью колонки из data-label (без горизонтального скролла). */
@media (max-width: 480px) {
  .lnk-links-table thead { display: none; }
  .lnk-links-table, .lnk-links-table tbody, .lnk-links-table tr, .lnk-links-table td {
    display: block; width: 100%;
  }
  .lnk-links-table tr.lnk-row {
    border: 1px solid var(--line); border-radius: 10px; margin-bottom: 12px; padding: 10px 12px;
  }
  .lnk-links-table td {
    padding: 4px 0; border: none; text-align: left !important;
  }
  .lnk-links-table td[data-label]:not([data-label=""])::before {
    content: attr(data-label); display: block; font-size: 10.5px; font-weight: 700;
    color: var(--grey); text-transform: uppercase; letter-spacing: .02em; margin-bottom: 1px;
  }
  .lnk-table-wrap { overflow-x: visible; }
}
/* ZAD-014/015: чипы этапа и коммита на карточке */
.kt-stage{background:#eef2ff;color:#3730a3;font-size:10px;padding:2px 7px;margin:0}
.kt-commit{background:#f1f5f9;color:#334155;font-family:ui-monospace,Menlo,monospace;font-size:10px;padding:2px 7px;margin:0}
.zad-mass{display:flex;gap:6px;align-items:center;margin-left:auto}
.zad-mass select{padding:6px 8px;border:1px solid var(--line);border-radius:8px;font-size:12px}

/* ============================================================
   A11Y зона — доступность (A11Y-001..012)
   ============================================================ */
/* A11Y-001: skip-to-content ссылка, видимая только по фокусу */
.skip-link{position:absolute;left:8px;top:-48px;z-index:2000;background:var(--navy);color:#fff;
  padding:10px 16px;border-radius:0 0 8px 8px;font-weight:700;text-decoration:none;
  transition:top .15s ease;box-shadow:0 4px 14px rgba(0,0,0,.25)}
.skip-link:focus{top:0;color:#fff;outline:3px solid #ffd21e;outline-offset:2px}

/* A11Y-011/012: единый видимый фокус-стиль (focus-visible) для интерактивных элементов каркаса.
   Заменяет ранее «немые» outline:none там, где не было замены. */
a:focus-visible,button:focus-visible,
.nav-item:focus-visible,.btn:focus-visible,.fbtn:focus-visible,.subtab:focus-visible,
.pager button:focus-visible,.exp-toggle:focus-visible,.icon-btn:focus-visible,
.menu-toggle:focus-visible,.fav-star:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--navy);outline-offset:2px;border-radius:6px}
/* на тёмном сайдбаре фокус светлый */
.sidebar .nav-item:focus-visible,.sidebar a:focus-visible{outline-color:#ffd21e}
/* поля ввода: заметная рамка+кольцо вместо голого outline:none */
.field input:focus-visible,.search input:focus-visible,.gsearch-inp input:focus-visible,
input:focus-visible,textarea:focus-visible,select:focus-visible{
  outline:2px solid var(--navy);outline-offset:1px}
.search:focus-within,.gsearch-inp:focus-within{box-shadow:0 0 0 2px var(--navy)}
/* элементы получают видимый фокус даже без :focus-visible-поддержки */
a:focus,button:focus{outline-offset:2px}

/* ============================================================
   A11Y-020..026 — контраст текста по WCAG AA (>=4.5:1)
   Доступные текстовые токены; заливки (полосы/точки/градиенты) не трогаем.
   ============================================================ */
:root{
  --green-txt:#067a52;   /* зелёный текст на светлом (было #00bb7f 2.5:1) */
  --warn-txt:#8a5e05;    /* янтарный текст на светлом/warnbg (было #c98a08 2.7:1) */
  --good-txt:#0f7a45;    /* «успех» текст (было #1e8e5a 4.14:1) */
}
/* зелёный акцент-текст */
.bigstats .n.good{color:var(--green-txt)}
.b-green{color:var(--green-txt)}
.tls-green{color:var(--good-txt)}
/* «успех» бейджи/подписи на светлом фоне */
.pill.g,.b-good,.flash.ok,.sem-idist .chip.c-good{color:var(--good-txt)}
/* янтарные бейджи/подписи */
.b-warn,.b-soon,.sem-idist .chip.c-warn,.tls-amber,.tls-amber-soft{color:var(--warn-txt)}
/* зелёная кнопка: белый текст требует затемнённой заливки */
.btn.green{background:#0a7a56}.btn.green:hover{background:#00754f}

/* ============================================================
   A11Y-031..064 — Адаптив и мобильная вёрстка (кросс-срез)
   ============================================================ */

/* Универсальный карточный режим таблиц на узких экранах (A11Y-033/039/042/044/046/051/055/056/059/064).
   Разметка: <table class="rcard">, каждому <td> — data-label="Колонка". */
@media (max-width:640px){
  table.rcard thead{display:none}
  table.rcard, table.rcard>tbody, table.rcard>tbody>tr, table.rcard>tbody>tr>td{display:block;width:100%}
  table.rcard>tbody>tr{border:1px solid var(--line);border-radius:10px;margin-bottom:12px;padding:10px 12px;background:var(--white)}
  table.rcard>tbody>tr:hover{background:var(--white)}
  table.rcard>tbody>tr>td{padding:4px 0;border:none;text-align:left!important}
  table.rcard>tbody>tr>td[data-label]:not([data-label=""])::before{
    content:attr(data-label);display:block;font-size:10.5px;font-weight:700;color:var(--grey);
    text-transform:uppercase;letter-spacing:.02em;margin-bottom:2px}
  table.rcard>tbody>tr.grp{background:var(--sky);padding:8px 12px;font-weight:700}
}

/* Индикатор горизонтальной прокрутки для таблиц, ещё не переведённых в карточки (A11Y-045/053). */
.x-scroll{position:relative}
@media (max-width:900px){
  .x-scroll::after{content:"";position:sticky;float:right;top:0;right:0;width:20px;height:100%;
    margin-left:-20px;pointer-events:none;
    background:linear-gradient(90deg,rgba(255,255,255,0),rgba(10,49,97,.14))}
}

/* Дашборд: сетки в одну колонку, hero под мобильный (A11Y-031/032). */
@media (max-width:600px){
  .bigstats .row{display:grid;grid-template-columns:1fr!important;gap:10px}
  .grid.g3,.grid.g4,.grid.g2{grid-template-columns:1fr!important}
}
@media (max-width:480px){
  .hero{flex-direction:column;align-items:flex-start;padding:20px 18px;gap:16px}
  .hero .scorebox,.scorebox{margin-left:0!important;width:100%}
  .st-hero{flex-direction:column;align-items:flex-start;padding:20px 18px;gap:14px}
}

/* Kanban: горизонтальный скролл-снап колонок + тач-таргеты 44px (A11Y-034/036/038). */
@media (max-width:700px){
  .kanban{display:flex!important;grid-template-columns:none!important;overflow-x:auto;
    scroll-snap-type:x mandatory;gap:12px;-webkit-overflow-scrolling:touch;padding-bottom:10px}
  .kanban .kcol{flex:0 0 82%;min-width:82%;scroll-snap-align:start}
  .ktask{min-height:44px}
  .kanban .fbtn.sm,.ktask .fbtn,.ktask button{min-height:44px}
}
/* Подсветка колонки-цели при тач-переносе (A11Y-036). */
.kcol.kdrop-target{outline:2px dashed var(--navy);outline-offset:-4px;background:var(--sky2)}

/* Панель фильтров позиций → столбец на всю ширину (A11Y-040). */
@media (max-width:480px){
  .pz-toolbar,.pozicii-filters,.filters-bar{flex-direction:column;align-items:stretch}
  .pz-toolbar>*,.pozicii-filters>*{width:100%}
}
/* Модалка графика позиций на весь экран (A11Y-041). */
@media (max-width:480px){
  #histBox .u-a1388592{max-width:100%}
  #histBox>div,#histBox .hist-card{width:100%!important;max-width:100%!important;min-height:100vh;border-radius:0}
  #histChart{max-height:46vh}
}

/* Инструменты / интеграции: одна колонка карточек (A11Y-047/048). */
@media (max-width:480px){
  .integ{flex-direction:column;align-items:stretch}
  .integ .row{flex-direction:column;align-items:stretch}
  .integ input,.integ .field input{width:100%}
  .uploadzone{min-height:120px;padding:22px 16px}      /* A11Y-049 */
}

/* Перенос сайта: без переполнения (A11Y-050); таблица редиректов уже через .rcard (A11Y-051). */
@media (max-width:640px){
  .mig-todo,.mig-redirects{max-width:100%}
}

/* Этапы: таймлайн и сетка параллельных работ в одну колонку (A11Y-052). */
@media (max-width:640px){
  .par-grid,.tl75-grid{grid-template-columns:1fr!important}
  .tl75-bar{overflow-x:auto}
}

/* Бюджет: строки статей без горизонтального переполнения (A11Y-054). */
@media (max-width:480px){
  .mrow{flex-wrap:wrap;align-items:flex-start}
  .hbar2{width:100%;flex-basis:100%;order:3}
}

/* ORM-accent / orm-grid в одну колонку (A11Y-057). */
@media (max-width:480px){
  .orm-grid,.orm-accent .orm-grid{grid-template-columns:1fr!important}
}

/* Статьи и админ-формы: одна колонка формы (A11Y-058/063). */
@media (max-width:480px){
  .form-grid{grid-template-columns:1fr!important;display:grid}
  .admin-user-form .form-grid,.au-form{grid-template-columns:1fr!important}
}

/* Инфо: subtabs горизонтальным свайпом (A11Y-060). */
@media (max-width:480px){
  .subtabs{display:flex;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
    scroll-snap-type:x proximity;gap:6px}
  .subtabs .subtab{flex:0 0 auto;scroll-snap-align:start;white-space:nowrap}
}

/* A11Y-035/037: элементы доступного переноса карточек kanban. */
.ktask{position:relative}
.kt-move{position:absolute;top:6px;right:6px;width:28px;height:28px;border:none;background:transparent;
  color:var(--grey);font-size:18px;line-height:1;border-radius:6px;cursor:pointer;opacity:.6}
.kt-move:hover,.kt-move:focus-visible{opacity:1;background:var(--sky)}
.kt-move-menu{position:absolute;top:32px;right:6px;z-index:60;background:#fff;border:1px solid var(--line);
  border-radius:10px;box-shadow:0 10px 30px rgba(8,39,80,.18);min-width:150px;padding:6px;display:flex;flex-direction:column;gap:2px}
.kt-move-item{text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:7px;
  font:inherit;font-size:13px;color:var(--navy);cursor:pointer;min-height:40px}
.kt-move-item:hover:not([disabled]),.kt-move-item:focus-visible{background:var(--sky)}
.kt-move-item[disabled]{color:var(--grey);cursor:default}
.ktask.kt-dragging{opacity:.5;box-shadow:0 12px 30px rgba(8,39,80,.28);transform:scale(1.02)}
@media (max-width:700px){.kt-move{width:40px;height:40px;font-size:20px;opacity:.85}}

/* ── TXT-005/006: единый info-тултип метрик (реестр MetricTooltip) ─────── */
.txt-tooltip{position:relative;display:inline-flex;vertical-align:middle;margin-left:4px}
.txt-tooltip-ic{width:16px;height:16px;border-radius:50%;border:none;background:var(--sky,#eef3fb);
  color:var(--navy,#1a5296);font-size:11px;line-height:16px;padding:0;cursor:help;font-weight:700}
.txt-tooltip-ic:hover,.txt-tooltip-ic:focus-visible{background:var(--navy,#1a5296);color:#fff;outline:2px solid transparent}
.txt-tooltip-box{display:none;position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);
  background:#1f2937;color:#fff;padding:10px 12px;border-radius:8px;font-size:12px;line-height:1.45;
  width:max-content;max-width:280px;white-space:normal;z-index:60;box-shadow:0 6px 20px rgba(0,0,0,.18);
  flex-direction:column;gap:4px}
.txt-tooltip-box:after{content:"";position:absolute;left:50%;top:100%;transform:translateX(-50%);
  border:6px solid transparent;border-top-color:#1f2937}
.txt-tooltip-title{font-weight:700}
.txt-tooltip-formula{color:#cbd5e1;font-size:11px;border-top:1px solid rgba(255,255,255,.15);padding-top:4px;margin-top:2px}
.txt-tooltip:hover .txt-tooltip-box,.txt-tooltip-ic:focus-visible + .txt-tooltip-box,
.txt-tooltip.tt-open .txt-tooltip-box{display:flex}

/* ── TXT-043: подпись под графиками Chart.js ────────────────────────────── */
.txt-chart-caption{font-size:12px;color:var(--grey,#6b7684);margin:6px 0 0}

/* ── TXT-020: дата и источник данных под заголовком вкладки ─────────────── */
.txt-data-source{font-size:12px;color:var(--grey,#6b7684);margin:-6px 0 12px}

/* ── TXT-025: карточка шага онбординг-тура ──────────────────────────────── */
.txt-tour-overlay{position:fixed;inset:0;background:rgba(15,23,42,.55);z-index:200}
.txt-tour-highlight{position:absolute;z-index:201;border-radius:8px;box-shadow:0 0 0 4px rgba(37,99,235,.55),0 0 0 9999px rgba(15,23,42,.55);
  pointer-events:none;transition:all .15s ease}
.txt-tour-card{position:absolute;z-index:202;background:#fff;border-radius:12px;padding:16px 18px;
  max-width:300px;box-shadow:0 20px 50px rgba(0,0,0,.3)}
.txt-tour-step{font-size:11px;color:var(--grey,#6b7684);font-weight:600;text-transform:uppercase;letter-spacing:.03em}
.txt-tour-title{font-weight:700;font-size:15px;margin:4px 0 6px}
.txt-tour-body{font-size:13px;color:var(--ink,#1f2937);line-height:1.5;margin-bottom:12px}
.txt-tour-actions{display:flex;justify-content:space-between;align-items:center;gap:8px}
.txt-tour-skip{background:none;border:none;color:var(--grey,#6b7684);font-size:12.5px;cursor:pointer;padding:6px 4px}
.txt-tour-next{padding:7px 16px;border-radius:8px;border:none;background:var(--navy,#1a5296);color:#fff;
  font-weight:600;cursor:pointer;font-size:13px}

/* ── TXT-045/046: всплывающая легенда цветов бейджей ────────────────────── */
.txt-legend-trigger{border:none;background:var(--sky,#eef3fb);color:var(--navy,#1a5296);border-radius:7px;
  padding:4px 10px;font-size:12px;cursor:pointer;font-weight:600}
.txt-legend-box{display:none;margin-top:8px;padding:10px 14px;background:var(--soft,#f7f9fc);
  border:1px solid var(--line,#d9dee7);border-radius:10px;font-size:12.5px}
.txt-legend-box.on{display:block}
.txt-legend-box ul{margin:0;padding-left:18px}
.txt-legend-box li{margin:3px 0}

/* ── TXT-048: хинт под полем формы ──────────────────────────────────────── */
.txt-field-hint{font-size:11.5px;color:var(--grey,#6b7684);margin-top:3px}

/* ── TXT-052: индикатор непрочитанных changelog ─────────────────────────── */
.txt-changelog-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--red,#dc2626);
  margin-left:4px;vertical-align:middle}

/* ── TXT-055: панель краткой справки вкладки (topbar «?») ──────────────── */
.txt-help-panel{display:none;position:absolute;right:0;top:calc(100% + 8px);width:300px;background:#fff;
  border:1px solid var(--line,#d9dee7);border-radius:12px;box-shadow:0 12px 30px rgba(8,39,80,.18);
  padding:14px 16px;z-index:60;font-size:13px;line-height:1.5}
.txt-help-panel.on{display:block}
.txt-help-panel a{color:var(--navy,#1a5296)}

/* ── TXT-051: страница «Что нового» (changelog) ─────────────────────────── */
.u-changelog-group{margin-bottom:16px}
.u-changelog-entry{padding:12px 0;border-bottom:1px solid var(--line,#d9dee7)}
.u-changelog-entry:last-child{border-bottom:none}
.u-changelog-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.u-changelog-date{margin-left:auto;color:var(--grey,#6b7684);font-size:12px}
.u-changelog-body{margin:6px 0 0;color:var(--ink,#1f2937);font-size:13.5px;line-height:1.5}

/* ── TXT-018: пустое состояние графика истории позиции в модалке ────────── */
.u-hist-empty{margin-top:8px}

/* ── TXT-012: список метрик без подсказки в /admin/tooltips ────────────── */
.u-txt-missing-list{margin:0;padding-left:18px}
.u-txt-missing-list li{margin:4px 0;font-size:13px}
